jjacques68 Posté(e) le 19 mars 2020 Auteur Signaler Posté(e) le 19 mars 2020 bon ben mon principe de sémaphore ne fonctionne pas. Manque de réactivité entre le changement d'état du QA et la scène...
jjacques68 Posté(e) le 19 mars 2020 Auteur Signaler Posté(e) le 19 mars 2020 idem en passant par une VG
jjacques68 Posté(e) le 19 mars 2020 Auteur Signaler Posté(e) le 19 mars 2020 @Krikroff tu avais raison, c'est la commande "read" qui permet de détecter une déconnexion : "End of file". La reconnexion est donc quasi immédiate (1 seconde max). sauf que si une commande write est envoyée pendant ce temps, c'est la merde total. pas réussi à empêcher d'une manière propre le "write" si plus de connexion. la seule chose qui me fait qqch de stable, c'est : d'avoir créé une variable "Status" dans le QA, qui prend 1 ou 0 selon le status de la socket. Alors attention, surtout pas passer la variable à 0 dans la méthode "close". ça prend trop de temps de traitement. Il faut la mettre à 0 dès qu'on intercepte l'erreur. je teste, avant de faire le "write", le status de cette variable. si 1 j'envoie, si 0 j'envoie pas, le paquet est perdu ! j'ai essayé de mettre, juste avant la commande write: while self:getVariable("Status") == 0 do fibaro.sleep(100) end mais dans le cas où Status = 0, le QA se fige, pas de crash, pas d'erreur, rien ! Dommage ça m'aurait évité de perdre des paquets... punaise, j'utilise des sockets partout au boulo entre les automates et des PC pour récupérer des données !! jamais vu ça !! Voici le code, si qqun a une solution !! je suis preneur ! function QuickApp:onInit() self:setVariable("Status", "0") self:debug("onInit") self.ip = "192.168.2.8" self.port = tonumber("2000") self.sock = net.TCPSocket() self:connect() end function QuickApp:connect() self.sock:connect(self.ip, self.port, { success = function() self:setVariable("Status", "1") self:debug("OPEN - connected") self:waitForResponseFunction() end, error = function(err) self:setVariable("Status", "0") self.sock:close() self:debug("OPEN ERROR - "..err) fibaro.setTimeout(2000, function() self:connect() end) end, }) end function QuickApp:close() self.sock:close() end function QuickApp:waitForResponseFunction() self.sock:read({ success = function(data) self:debug("RX - "..data) self:waitForResponseFunction() end, error = function(err) self:setVariable("Status", "0") self:debug("READ ERROR - "..err) self.sock:close() fibaro.setTimeout(200, function() self:connect() end) end }) end function QuickApp:send(strToSend) if self:getVariable("Status") == "1" then self.sock:write(strToSend.."\n", { success = function() --self:debug("TX - "..strToSend) end, error = function(err) self:setVariable("Status", "0") self:debug("WRITE ERROR - "..err) self.sock:close() fibaro.setTimeout(200, function() self:connect() end) end }) end end
Krikroff Posté(e) le 19 mars 2020 Signaler Posté(e) le 19 mars 2020 La seule solution c’est de faire une file d’attente (queue) du type FIFO, rien n’existe nativement en LUA il faut coder ! J’ai cela dans mes scripts si tu peux attendre ce soir sinon tu peux le faire il y a pleins d’exemples certainement sur internet pour t’inspirer mais cela te parle déjà peut-être alors let’s go Envoyé de mon iPhone en utilisant Tapatalk
jjacques68 Posté(e) le 19 mars 2020 Auteur Signaler Posté(e) le 19 mars 2020 une VG avec les data séparées par un séparateur ? tant que la VG est <> "" on traite un par un ? La scène n'envoie pas directement sur la socket, mais rempli cette VG ? (super... en lua ... )
Krikroff Posté(e) le 19 mars 2020 Signaler Posté(e) le 19 mars 2020 Hum derrière VG c’est des accès en lecture et écriture sur la base, je n’aime pas trop et les accès concurrents seront-ils correctement pris en charge... mais tu n’auras peut-être pas le choix de faire autrement...Je serai parti sur l’option: tableau dans le QA alimenté par une méthode du QA exposée accessible par les scènes. Et si tu dois passer par une GV il est préférable de tout gérer depuis ton QA pour la maintenance de tout ça par la suite et avoir le moins de code possible dans tes scènes.Courage Envoyé de mon iPhone en utilisant Tapatalk
jjacques68 Posté(e) le 19 mars 2020 Auteur Signaler Posté(e) le 19 mars 2020 oui j'ai compris. bon ben y a plus cas. 1
jjacques68 Posté(e) le 19 mars 2020 Auteur Signaler Posté(e) le 19 mars 2020 bon c'est fait, c'était pas la mort à faire... ça à l'air ok. mais je suis sceptique sur l'appel de la méthode "send", que j'ai peut-être trop souvent inséré dans le code... si tu as 5 minutes, peux tu y jeter un oeil ? merciiii ! --------------------------------------------------------------------------------------- -- 12/03/2020 - V1 : permet d'envoyer les infos des device vers Display Soft -- 19/03/2020 - V2 : utilise un tableau pour faire du FIFO --------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------- function QuickApp:onInit() self:debug("onInit") self:setVariable("Status", "0") self:updateProperty("value", false) self.ip = self:getVariable("IP") self.port = tonumber(self:getVariable("Port")) self.sock = net.TCPSocket() self.ListElement = {} self:connect() end --------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------- function QuickApp:connect() self.sock:connect(self.ip, self.port, { success = function() self:setVariable("Status", "1") self:updateProperty("value", true) self:debug("OPEN - connected") self:waitForResponseFunction() self:send() end, error = function(err) self:setVariable("Status", "0") self.sock:close() self:debug("OPEN ERROR - "..err) fibaro.setTimeout(500, function() self:connect() end) end, }) end --------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------- function QuickApp:close() self.sock:close() self:updateProperty("value", false) end --------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------- function QuickApp:waitForResponseFunction() self.sock:read({ success = function(data) self:debug("RX - "..data) self:waitForResponseFunction() end, error = function(err) self:setVariable("Status", "0") self:debug("READ ERROR - "..err) self.sock:close() fibaro.setTimeout(200, function() self:connect() end) end }) end --------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------- function QuickApp:send() if self:getVariable("Status") == "1" then if self.ListElement[1] then self.sock:write(self.ListElement[1].."\r", { success = function() table.remove(self.ListElement,1) if #self.ListElement > 0 then self:send() end end, error = function(err) self:setVariable("Status", "0") self:debug("WRITE ERROR - "..err) self.sock:close() fibaro.setTimeout(200, function() self:connect() end) end }) end end end --------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------- function QuickApp:AddElement(element) if element ~= "" then table.insert(self.ListElement,element) self:send() end end
Krikroff Posté(e) le 19 mars 2020 Signaler Posté(e) le 19 mars 2020 Bien joué ;) Mais j'ai peur que tu rencontre des soucis à cause d'un risque de désynchronisation, par exemple si tu as un problème de socket tu va bien continuer à alimenter ton tableau mais rien ne te garanti que les items dans le tableau seront tous envoyés ... enfin je sais pas si je suis très clair, dis-moi ;)
jjacques68 Posté(e) le 19 mars 2020 Auteur Signaler Posté(e) le 19 mars 2020 (modifié) et bien j’ai fais des essais, et si la socket tombe, le tableau à l’air de garder les infos, car je les vois arriver dès que je remets le serveur en route. elles apparaissent bien en premier. et le tableau continue à stocker les données suivantes. ben écoute je pense que ça va le faire comme ça... je vais surveiller ça sur le long. là j’ai continué à migrer d’autres device. Suis loin d’avoir fini... merci pour ton aide précieuse @Krikroff Modifié le 19 mars 2020 par jjacques68
Krikroff Posté(e) le 19 mars 2020 Signaler Posté(e) le 19 mars 2020 C’est parfait Bon courage pour la suite, si je comprends bien il y a encore des choses à faire Envoyé de mon iPhone en utilisant Tapatalk
mprinfo Posté(e) le 19 mars 2020 Signaler Posté(e) le 19 mars 2020 J'espère qu'il ne fait pas cela sur son temps de télétravail Envoyé de mon BLA-L29 en utilisant Tapatalk
jjacques68 Posté(e) le 19 mars 2020 Auteur Signaler Posté(e) le 19 mars 2020 ah nan pas de télé travail !!!
Krikroff Posté(e) le 19 mars 2020 Signaler Posté(e) le 19 mars 2020 Moi oui et je n’arrête pas, la folie... vivement le retour à la normale Envoyé de mon iPhone en utilisant Tapatalk
jjacques68 Posté(e) le 19 mars 2020 Auteur Signaler Posté(e) le 19 mars 2020 ben j’aurai bien aimé moi, mais la boîte a pas voulu.
mprinfo Posté(e) le 19 mars 2020 Signaler Posté(e) le 19 mars 2020 Moi ils m'ont dit reste à la maison Sans télétravail Envoyé de mon BLA-L29 en utilisant Tapatalk
Krikroff Posté(e) le 19 mars 2020 Signaler Posté(e) le 19 mars 2020 Ah carrément !!! Enfin pas drôle tout ça...Envoyé de mon iPhone en utilisant Tapatalk
jjacques68 Posté(e) le 19 mars 2020 Auteur Signaler Posté(e) le 19 mars 2020 nan pas du tout. ça craint. ça craint sur tous les plans.
mprinfo Posté(e) le 19 mars 2020 Signaler Posté(e) le 19 mars 2020 Oui pour le moment c'est l'alsace qui prend chez nous en meurthe et moselle ça commence. Après il faut que les gens respect les consignes. Afin de ne pas saturer les hôpitaux il faut arriver à lissé la courbe des cas qui demande une hospitalisation. Après pour 80 % des cas cela ce passera très bien et une fois que plus de 50 % de la populations aura été contaminé le virus disparaîtera naturellement. J'ai espère que l'on ne sera pas obligé de faire de la médecine de guerre par manque de moyens. Et je trouve inadmissible le mamque de protection pour le personnel soignant Envoyé de mon BLA-L29 en utilisant Tapatalk 2
Krikroff Posté(e) le 19 mars 2020 Signaler Posté(e) le 19 mars 2020 Tout à fait d’accord avec toi... nous payons l’arrogance de nos chers dirigeants.Que tout ça passe très vite et avec le moins de casse possible, ensuite il sera temps d’en tirer des leçons !Oui oui je crois encore au père Noël Envoyé de mon iPhone en utilisant Tapatalk 2
jjacques68 Posté(e) le 19 mars 2020 Auteur Signaler Posté(e) le 19 mars 2020 mouai j’ai l’impression que les gens ne vont, pas tenir longtemps. je constate, par rapport au premier jour, de plus en plus de mouvements.
mprinfo Posté(e) le 19 mars 2020 Signaler Posté(e) le 19 mars 2020 Oui je pense aussi pas simple lorsque tu es en appartement avec des enfants. Perso je suis à la campagne donc pour moi je peux tenir 2 ou 3 mois sans soucis la j'ai reçu mes connecteurs lcs2 et de 100m de câbles réseau ça va m'occuper quelques jours. J'aurais 400m de câbles d installé. J'ai encore un peu de peinture à faire et je doit terminer ma montée de grenier depuis plus de 15 ans que je dois le faire.J'aimerai bien terminer mon bois surtout que se suis seul en pleine forêt mais 139 euros ça calme Envoyé de mon BLA-L29 en utilisant Tapatalk 1
jjacques68 Posté(e) le 19 mars 2020 Auteur Signaler Posté(e) le 19 mars 2020 oui moi j’ai la chance d’être dans une maison avec jardin, donc je peux tenir aussi. j’ai la HC3 qui va beaucoup m’occuper après ce sera ménage jardinage... mais après...
Krikroff Posté(e) le 19 mars 2020 Signaler Posté(e) le 19 mars 2020 Je bosse de la maison et la chance d’être également à la campagne, je pleins vraiment les personnes enfermées en appartement, ça me fait relativiser Envoyé de mon iPhone en utilisant Tapatalk 1
Messages recommandés