Aller au contenu

jjacques68

Membres confirmés
  • Compteur de contenus

    4 358
  • Inscription

  • Dernière visite

  • Jours gagnés

    39

Tout ce qui a été posté par jjacques68

  1. jjacques68

    Volet Roulant

    peut être faire un recalibrage du module !
  2. euh pour la classe on va y aller doucement au fait, encore merci pour votre aide et patience !! donc voilà la version 3, un code un peu moins crade : local deviceIP = { {name = "NetgearCave", ip = "192.168.xxx.xxx"}, {name = "NetgearRdc", ip = "192.168.xxx.yyy"}, --{name = "NetgearEtage", ip = "192.168.xxx.zzz"} } local devicePort = 23 local SendCommand = { {name="login", command="admin".."\n", txtmatch="Password:"}, {name="pass", command="xxxxxxx".."\n"}, {name="config", command="configure terminal".."\n", txtmatch="config"}, {name="wifiOff", command="radio 2.4 disable".."\n", txtmatch="disable"}, {name="retourMenu", command="exit".."\n"}, {name="save", command="save-and-activate".."\n", txtmatch="Activating"} } function Disconnect() for _,device in ipairs(deviceIP) do --pour chaque device du tableau deviceIP --ouvre la connexion tcpSocket = Net.FTcpSocket(device.ip, devicePort) tcpSocket:setReadTimeout(2000) --affiche le login local result = "" while string.find(result, "login:") == nil do result = tcpSocket:read() end --on lit la réponse jusqu'à avoir le mot clé "login" fibaro:debug(device.name.." - "..result) --envoi des commandes for _,com in ipairs(SendCommand) do --pour chaque commande du tableau SendCommand result="" bytes, errorCode = tcpSocket:write(com.command) if errorCode == 0 then if com.txtmatch then --un peu nul, mais si pas de txtmatch dans le tableau SendCommand, on prend le nom du device txt = com.txtmatch -- prend le mot clé définit dans le tableau SendCommand else txt = device.name.."#" --prend le nom du device pour le prompt car différent d'un device à l'autre (+ le #) end while string.find(result, txt) == nil do result = tcpSocket:read() end --on lit la reponse jusqu'à avoir le mot clé définit dans txtmatch (ou le nom du device) fibaro:debug(device.name.." - "..result) else fibaro:debug("Error dans "..com.name) --en cas d'erreur, mais je vois pas trop laquelle en fait !?? end end --deconnect la session telnet fibaro:debug(device.name.." - disconnect") tcpSocket:disconnect() end end --appel de la fonction pincipale Disconnect() Et voila le debug : [DEBUG] 07:22:50: NetgearCave - login: [DEBUG] 07:22:50: NetgearCave - Password: [DEBUG] 07:22:50: NetgearCave - NetgearCave# [DEBUG] 07:22:50: NetgearCave - onfigure terminal NetgearCave(config)# [DEBUG] 07:22:50: NetgearCave - adio 2.4 disable NetgearCave(config)# [DEBUG] 07:22:50: NetgearCave - xit NetgearCave# [DEBUG] 07:22:51: NetgearCave - % Activating config... [DEBUG] 07:22:51: NetgearCave - disconnect [DEBUG] 07:22:51: NetgearRdc - login: [DEBUG] 07:22:51: NetgearRdc - Password: [DEBUG] 07:22:51: NetgearRdc - NetgearRdc# [DEBUG] 07:22:51: NetgearRdc - onfigure terminal NetgearRdc(config)# [DEBUG] 07:22:51: NetgearRdc - adio 2.4 disable NetgearRdc(config)# [DEBUG] 07:22:51: NetgearRdc - xit NetgearRdc# [DEBUG] 07:22:53: NetgearRdc - % Activating config... [DEBUG] 07:22:53: NetgearRdc - disconnect ça marche très bien, pareil pour activer le wifi. Le code est moins crade... Mais pas encore très satisfait, car en cas d'erreur (ex demande d'activer alors qu'il est déjà activé), le script s'arrête et ne déconnecte donc jamais la session. et puis le debug est par porpre ! ça commence bien (login:, password, prompt) et puis après ça part en cou... et comme vu avec @Lazer, je pense que ma détection du mot clé dans la réponse n'est pas bonne. Mais les fonction string() avec les pattern, c'est une prise de tête moooooonumentale ! ce qui aurait été top aussi, c'est de pouvoir dans le tableau SendCommand pour la valeur "txtmatch", insérer le nom du device comme ci-dessous (pour la commande pass et retourMenu), mais ça marche pas : local deviceIP = { {name = "NetgearCave", ip = "192.168.xxx.xxx"}, {name = "NetgearRdc", ip = "192.168.xxx.xxx"} } local SendCommand = { {name="login", command="admin".."\n", txtmatch="Password:"}, {name="pass", command="xxxxxxx".."\n", txtmatch=deviceIP.name.."#"}, {name="config", command="configure terminal".."\n", txtmatch="config"}, {name="wifiOff", command="radio 2.4 disable".."\n", txtmatch="disable"}, {name="retourMenu", command="exit".."\n", txtmatch=deviceIP.name.."#"}, {name="save", command="save-and-activate".."\n", txtmatch="Activating"} } d'où ce bout de code un peu nul dans la fonction : if com.txtmatch then --un peu nul, mais si pas de txtmatch dans le tableau SendCommand, on prend le nom du device txt = com.txtmatch -- prend le mot clé définit dans le tableau SendCommand else txt = device.name.."#" --prend le nom du device pour le prompt car différent d'un device à l'autre (+ le #) end
  3. oula !! bon ok. alors c'était ça la fonction string.match() ?? parce que j'ai absolument rien trouver de compréhensible sur cette fonction sur les sites qui parlent de lua (quand ils en parlent de cette fonction...) il y a string.gmatch(), j'ai trouvé la string.find() et encore je l'utilise pas correctement...
  4. je continue doucement... par contre je bug depuis un petit moment la-dessus : je viens d'ajouter la commande me permettant d'aller dans le menu config : bytes, errorCode = tcpSocket:write("configure terminal".."\n") --menu configuration if errorCode == 0 then --boucle jsuqu'à l'arrivé du menu config while string.find(result, "config") == nil do result = tcpSocket:read() end fibaro:debug(result) else fibaro:debug("Error dans le menu config") end et voici le debug : [DEBUG] 20:23:01: login: [DEBUG] 20:23:01: Password: [DEBUG] 20:23:02: NetgearRdc# [DEBUG] 20:23:02: onfigure terminal NetgearRdc(config)# c'est pas logique, je devrais avoir que "NetgearRdc(config)# " ?? !! et puis il est passé où le "c" de configue ?
  5. alors j'ai essayer avec string.match() mais aucun resultat ???? J'ai contourné avec un string:find() voilà un bout du code qui m'emmène jusqu'au prompt : --ouvre la connexion tcpSocket = Net.FTcpSocket(deviceIp, devicePort) --set the read timeout tcpSocket:setReadTimeout(2000) local result = "" --affiche le login while string.find(result, "login:") == nil do result = tcpSocket:read() end fibaro:debug(result) --transmet le login bytes, errorCode = tcpSocket:write("admin".."\n") --login if errorCode == 0 then --boucle jusqu'à la demande du mot de pass while string.find(result, "Password:") == nil do result = tcpSocket:read() end fibaro:debug(result) else fibaro:debug("Error dans le login") end --trasmet le mot de pass bytes, errorCode = tcpSocket:write("xxxx".."\n") --pass if errorCode == 0 then --boucle jusqu'à l'arrivé du prompt while string.find(result, "NetgearRdc#") == nil do result = tcpSocket:read() end fibaro:debug(result) else fibaro:debug("Error dans le mdp") end --deconnect la session telnet tcpSocket:disconnect() fibaro:abort() et voilà le debug : [DEBUG] 18:39:44: login: [DEBUG] 18:39:44: Password: [DEBUG] 18:39:44: NetgearRdc# ça semble un peu plus propre sans les sleep() , mais par contre je traite plus le errorCode du coup ! c'est instantané l'enchainement des commandes... Modification faites, j'ai rajouter les errorCode... il faudra aussi que je regroupe dans une fonction les lignes de code, car elles sont répétitives. Et je mettrait les commandes telnet dans une variable tableau, un peu comme le watchdog avec le mot clé à rechercher !
  6. ok bon je m'y remets ce soir je posterai le nouvelle version merci !
  7. string.match() permet de faire une recherche de chaine dans une chaine ? c'est bien ça ? et le prompt c'est le nom du périphérique (en Telnet) suivi de ":", si je me trompe pas ! donc si je comprends bien, - je fais un read() dans une variable, - je fais un string.match(variable, prompt:) - si je trouve, c'est que la commande est terminée - je peux donc passer à la suivante. mais si la commande se passe mal, ou mauvaise valeur saisie, j'ai quand même le prompt qui revient. et les autres commandes ne passeront pas. Il faudrait alors analyser chaque réponse en détail, pas que attendre le prompt ! Et les réponses sont jamais identiques d'une commande à l'autre !
  8. dans la deuxième version j'ai fait des read() et afficher le resultat dans le debug, mais alors du coup ça veut dire que je peux enlever mes sleep() ? peux pas tester pour le moment...
  9. merci, mais je me suis inspirer de quelque tuto bien sur... fermer la connexion TCP me créait une erreur... mais je pense qu'il faut que je mette un sleep avant pour pas fermer trop tôt. c'est pas très clair ces histoires de sleep et de setReadTimeOut. Si j'enchaine trop vite les commandes, j'ai l'impression qu'elles passent pas. doit certainement y avoir une logique, un truc du genre attendre la réponse précédente pour envoyer une nouvelle commande... ??? !!!
  10. OOOHHHHHH PUNAISE !!!! siiiiii !!!!! ça marche !!!!!! (je m’étais trompé dans la commande d'activation/desactivation du wifi ) et j'ai un aperçu dans le debug !! local deviceIp = "192.168.xxx.xxx" local devicePort = 23 --ouvre la connexion tcpSocket = Net.FTcpSocket(deviceIp, devicePort) --set the read timeout tcpSocket:setReadTimeout(2000) bytes, errorCode = tcpSocket:write("admin".."\n") --login fibaro:sleep(1000) if errorCode == 0 then local result = tcpSocket:read() fibaro:debug(result) else fibaro:debug("error1") end bytes, errorCode = tcpSocket:write("xxxxxxx".."\n") --pass fibaro:sleep(1000) if errorCode == 0 then result = tcpSocket:read() fibaro:debug(result) else fibaro:debug("error2") end bytes, errorCode = tcpSocket:write("configure terminal".."\n") --menu configuration fibaro:sleep(1000) if errorCode == 0 then result = tcpSocket:read() fibaro:debug(result) else fibaro:debug("error3") end bytes, errorCode = tcpSocket:write("radio 2.4 disable".."\n") --coupe le wifi fibaro:sleep(1000) if errorCode == 0 then result = tcpSocket:read() fibaro:debug(result) else fibaro:debug("error4") end bytes, errorCode = tcpSocket:write("exit".."\n") --retour menu fibaro:sleep(1000) if errorCode == 0 then result = tcpSocket:read() fibaro:debug(result) else fibaro:debug("error5") end bytes, errorCode = tcpSocket:write("save-and-activate".."\n") --save modif fibaro:sleep(3000) --doit être plus long ????????? if errorCode == 0 then result = tcpSocket:read() fibaro:debug(result) else fibaro:debug("error6") end --tcpSocket:disconnect() --si je laisse ça marche pas !!! j'ai du mal avec cette ligne : --set the read timeout tcpSocket:setReadTimeout(2000) combien de temps faut-il laisser entre chaque envoi de commande ? merci pour votre aide !
  11. bon je viens de rentrer, et première essai qui bien sur ne marche pas et j'ai aucune erreur retournée... : local deviceIp = "192.168.xxx.xxx" local devicePort = 23 --ouvre la connexion tcpSocket = Net.FTcpSocket(deviceIp, devicePort) --set the read timeout tcpSocket:setReadTimeout(2000) bytes, errorCode = tcpSocket:write("admin".."\n") --login fibaro:sleep(1000) if errorCode == 0 then fibaro:debug("ok1") else fibaro:debug("error1") end bytes, errorCode = tcpSocket:write("xxxxxx".."\n") --pass fibaro:sleep(1000) if errorCode == 0 then fibaro:debug("ok2") else fibaro:debug("error2") end bytes, errorCode = tcpSocket:write("configure terminal".."\n") --menu configure fibaro:sleep(1000) if errorCode == 0 then fibaro:debug("ok3") else fibaro:debug("error3") end bytes, errorCode = tcpSocket:write("radio 2.4 off".."\n") --coupe le wifi fibaro:sleep(1000) if errorCode == 0 then fibaro:debug("ok4") else fibaro:debug("error4") end bytes, errorCode = tcpSocket:write("exit".."\n") --retour en arrière dans le menu fibaro:sleep(1000) if errorCode == 0 then fibaro:debug("ok5") else fibaro:debug("error5") end bytes, errorCode = tcpSocket:write("save-and-activate".."\n") --enregistre les modifs fibaro:sleep(1000) if errorCode == 0 then fibaro:debug("ok6") else fibaro:debug("error6") end le debug affiche tous les ok de 1 à 6... bon en même temps ça aurait été trop simple... mais fallait que j'essaye mais j'ai aucun moyen de savoir si la connexion se passe bien et si les commandes sont bien envoyées !! le log de l'access point reste vierge (même si je fait un telnet depuis windows d’ailleurs...)
  12. alors je viens de tester sans le setTimeout : --demande de l'adresse IP function RequestIP() local IP = net.HTTPClient() IP:request("http://bot.whatismyipaddress.com/", { success = function(response) CheckIp(response.data) end, Error = function(err) print("Err : "..err) --setTimeout(RequestIP, 5000) end }) end --analyse l'adresse IP function CheckIp(IP) local i=1 local detail={} --inscrit les 4 parties de l'adresse dans le tableau detail for Num in string.gmatch(IP, "%d+") do detail[i] = Num i=i+1 end --vérifié la 1ère partie : 176 = ADSL et 80 = GSM if tonumber(detail[1]) == 176 then print("ADSL - "..IP) elseif tonumber(detail[1]) == 80 then print("GSM - "..IP) else print("Déconnecté - "..IP) end --bouclage --setTimeout(RequestIP, 5000) end while true do RequestIP() fibaro:sleep(5*60*1000) end Mais rien ne se passe... même pas une première réponse... je devrais avoir au moins ADSL - xxx.xxx.xxx.xxx une fois ! nan ? A moins que j'ai mal placé le while true do ? J'ai remis le setTimeout et c'est redevenu normal. Au moins on est fixé. Bon j'ai contourneé le problème avec le watchdog qui relance la scène si elle plante, mais elle ne devrait pas planter logiquement ! Pour une fois que je traite le cas "error" !!!
  13. Oui c'est comme des menus, j'ai galèré àcomprendre comment ça marchait... Mais je pense avoir de bonnes pistes de départ. Y a cette histoire de réponse qui le derange encore mais je vai voir... Pas ce soir car par chez moi... Je tiens au jus sur l'avancement... Merci tous !
  14. Oui j'ai vu ces tutos, Le soucis est que je ne peux pas l'activer/désactiver en une seule commande. Il faut dans l'ordre que je connais : Se connecter avec Login et pass Entrer dans la "section" configuration Activer/désactiver le wifi Revenir dans la section précédente Exécuter une commande pour enregistrer (save-and-activate) Fermer la session Il faudrait enchaîner ces opérations plus les tiennes... Read et prompt... Que je découvre...
  15. Mais si marche, tout ce que je croyais comprendre s'effondrera
  16. Exactement
  17. J'utilise souvent le setTimeout et j'ai pas d'instance en plus. Par contre Net.httpclient est aussi asynchrone... Mais je vais essayer de faire ce que tu me dis dès que je suis devant le pc, Te tiens au jus... Merci
  18. Ben le while true do est remplacé par le setTimeout ! Je pense qu'il y a un problème de timeout dans la requête. Je ne reçoit pas de réponse àtemps et relance une requête avant que la précédente ne soit terminée. J'ai passé de 5 secondes à5 minutes le setTimeout et depuis pas de problème... Mais je n'arrive pas àrécupérer le code retour, je reçois toujours 200 (ok) alors que en cas de problème de connexion au site je devrais avoir 404 ou 504 !
  19. alors si en fait ça marche très bien ! j'ai trouver toutes les commandes Telnet. Par contre faudrait trouver un moyen de les envoyer depuis HC2...
  20. hum je crois qu'avec toute la liste de commande Telnet de mes access point, AUCUNE ne permet de désactiver le wifi !!! je peux presque tout faire sauf ça !!!!!!!!!!!
  21. j'ai fait quelques recherches de mon côté sur le net, sur les vos propositions, et ... ... suis largué total.
  22. Mouai ok... Euuuh Ok 😭 En français ça donne quoi ? 😬 Ben la il le faut des pistes de travail alors. Parce que tout c'est totalement inconnu pour moi. Mais ca m'intéresse avec plaisir !
  23. Ils sont sur un switch POE. De chez netgear aussi.
  24. Hello ! Est ce quelqu'un s'est déjàamusé àécrire un script pour activer/désactiver le wifi sur des points d'accès ? J'ai 3 access point de chez netgear WN203 POE. Je souhaiterai éteindre le wifi par programmation. J'ai fouillé partout sur les forum netgear mais rien. Dans la notice, y a la liste des commande CLI, mais je ne sais absolument pas quoi en faire, surtout que visiblement elles doivent être passées par une console telnet. J'imaginais trouver des commandes du style http://admin:pass@ip:port/command... Mais non. Si quelqu'un a une piste ??!! Ce serait super !
  25. en fait SI la scène s'arrête. 0 instance si plus de connexion. Comment peut on y remédier ...
×
×
  • Créer...