Aller au contenu

Erreur dans une scène, sans précisions...


jjacques68

Messages recommandés

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é par jjacques68
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...