jjacques68 Posté(e) le 18 avril 2020 Signaler Posté(e) le 18 avril 2020 (modifié) Hello ! Je me rends compte que de temps en temps, j'ai une scène qui génère une erreur... Sans aucunes indications !! Dans le debug, j'ai juste le type "error", le tag "scene65" , mais rien dans le message !! Donc pas moyen de savoir ce qu'il se passe... La scène permet de gérer l'allumage quand on passe devant un PIR... Elle fonctionne à 99.999999 % Mais cette semaine j'ai eut ces 3 erreurs sans indications... et je sais pas pourquoi. ça fais des heures que je m'arrache les cheveux et je tourne en rond... alors j'ai réussi à reproduire ce type d'affichage d'erreur dans le debug en créant une scène avec : (rien à voir avec ma scène...) print("start") fibaro.sleep(10000) print("end") Il apparait clairement qu'il y a un lien avec la gestion du "multi-instance" (si on peut encore appeler ça comme ça...) En lançant 2 fois la scène dans les 10 secondes. Visiblement, lors de l'exécution de la deuxième instance de scène, ça plante et le message "error" apparaît. Normalement, si une 2ème instance est lancée, elle annule la précédente !!!! Je précise que l'option dans "Allow to restart a running scene: "est par défaut sur "YES". Si le mets sur "NO", il n'y a plus d'erreur, mais la deuxième instance de scène n'est pas prise en compte (logique...) Pour info si on remplace le "sleep" par un setTimeout(), il n'y a plus ce soucis... Pour en revenir à ma scène, elle ne possède pas de sleep ou de setTimeout !!! Mais d'après ce que j'observe dans le debug, cette erreur apparaît quand je passe d'une pièce à l'autre et que donc potentiellement, 2 instances (ou plus) de la scène peuvent être démarrées. alors bug utilisateur ou bug système ??? voici son code : (désolé, ce sera peut être pas évident...) Elle permet d'allumer/éteindre les lumières d'une pièce quand un PIR trigge la scène. J'ai cette scène unique pour toute la maison. Donc dans les conditions, tous les PIR sont présent avec comme valeur de déclenchement : "anyValue". Les lumières de la pièces restent allumer tant que le PIR ne repasse pas à FALSE. Donc... le temps d'allumage est géré par les paramètres des capteurs PIR. Je tiens compte également du niveau de LUX (pour les PIR qui me fournissant cette option) Pour chaque pièce ou un PIR est présent pour l'allumage, j'ai un QA qui me permet de choisir si je veux que l'éclairage soit en mode auto ou manu. Il est nommé avec l'ID de la pièce pour plus de facilité de programmation. Il existe quelques subtilités (VMC salle de bain (avec leur "delay" sur le OFF) et éclairage extérieur (suivant des conditions horaires)) local NameScene = "Lights on PIR" local IDPirZoneEntree = 169 local IDPirZoneGarage = 459 local ListeDelay = {} --récupère l'ID du trigger (PIR) local TriggerID = sourceTrigger.id --Trouve la pièce liée au PIR local RoomID = api.get("/devices/"..TriggerID).roomID --Trouve l'ID du QA qui gére la marche forcée de la pièce local PIRAutoID = api.get("/devices/?name=PIR_Room_"..RoomID)[1].id --si QA en mode auto if fibaro.getValue(PIRAutoID, "value") == true then --Trouve le capteur de LUX de la pièce local LuxID = api.get("/rooms/"..RoomID).defaultSensors["light"] --Trouve le niveu jour/Nuit du capteur si existant et si la propriété existe (donc en gros que pour les FGMS) local LuxLevel = 0 if LuxID ~= 0 and api.get("/devices/"..LuxID).properties.parameters[7].value then LuxLevel = api.get("/devices/"..LuxID).properties.parameters[7].value end --liste les lumières de la pièce local ListeLightsInRoom = api.get("/devices/?roomID="..RoomID.."&property=[isLight,true]") --pour tout les lumières de la pièces for k,v in pairs(ListeLightsInRoom) do ---------------------------------------------- --si PIR = true ---------------------------------------------- if fibaro.getValue(TriggerID, "value") == true then ---------------------------------------------- --pour les VMC : supprime les éventuelles delay OFF if v.id == 69 or v.id == 226 then --recupère la liste de la VG ListeDelay = fibaro.getGlobalVariable("DelayVmc") ListeDelay = json.decode(ListeDelay) --parcours tous les delay OFF existant (max 2) for index,value in pairs(ListeDelay) do --si trouve l'ID du trigger correspondant if value.VMC == v.id then --on le surppime dans l'API (passe par un QA) fibaro.call(490, "Delete", value.API.timestamp,value.API.id) --on le supprime de la liste table.remove(ListeDelay, index) end end --mémorise la VG ListeDelay = json.encode(ListeDelay) fibaro.setGlobalVariable("DelayVmc", ListeDelay) end --END VMC--------------------------------------------- --si on a un capteur Lux et un seuil jour/nuit if LuxID ~= 0 and LuxLevel ~= 0 then --si Lux < LuxLevel if fibaro.getValue(LuxID, "value") <= LuxLevel then fibaro.call(v.id, "turnOn") end --si pas de capteurs de LUX else fibaro.call(v.id, "turnOn") end ---------------------------------------------- --si PIR = false ---------------------------------------------- else -->> PIR = FALSE ---------------------------------------------- --pour les VMC : retarde le OFF avec le delay if v.id == 69 or v.id == 226 then res = api.post("/devices/"..v.id.."/action/turnOff", {delay = 60}) --enregistre dans une VG, le timestamp et l'id de l'API ainsi que l'ID du PIR trigger ListeDelay = fibaro.getGlobalVariable("DelayVmc") ListeDelay = json.decode(ListeDelay) table.insert(ListeDelay, {VMC = v.id, API = res}) ListeDelay = json.encode(ListeDelay) fibaro.setGlobalVariable("DelayVmc", ListeDelay) --END VMC -------------------------------------------- else fibaro.call(v.id, "turnOff") end end -->>PIR = TRUE/FALSE end -->> boucle pour chaque lumière end -->> QA en mode auto -------------------------------------------------------------------------------------------------------- --[[ CAS PENDANT LA NUIT : QUE si c'est le PIR de la porte d'entrée ou de garage remarque : dans le cas où l'extérieur s'allume juste qqu secondes avant sunriseHour, cette scène n'éteindra pas. Ce sera la scène Sun Set/Rise - Lights qui s'en occupera ]] -------------------------------------------------------------------------------------------------------- if TriggerID == IDPirZoneEntree or TriggerID == IDPirZoneGarage then -- si on est après 01:05 et avant 14 minute avant SunRise on allume tout le jardin if os.date("%H:%M",os.time()) > "01:05" and os.date("%H:%M",os.time()+14*60) < api.get('/settings/info').sunriseHour and os.date("%H:%M",os.time()) < api.get('/settings/info').sunriseHour --à cause des 14 min avant 00:00 then fibaro.trace(NameScene,os.date("%H:%M",os.time()), os.date("%H:%M",os.time()+14*60), api.get('/settings/info').sunriseHour) --si PIR = true if fibaro.getValue(TriggerID, "value") == true then fibaro.call({166,278,279,280}, "turnOn") --PIR = false else fibaro.call({166,278,279,280}, "turnOff") end end end Voilà, si vous avez un peu de temps et encore des cheveux !!!! c'est avec plaisir que je prends vos idées ! Modifié le 18 avril 2020 par jjacques68
Messages recommandés