Dummy switch et problème de trigger

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
Skwi
Messages : 53
Inscription : 20 nov. 2018, 13:09

Dummy switch et problème de trigger

Message par Skwi »

Bonjour,

J'ai un script dzvent assez simple qui pilote un shelly en http via un switch "dummy".
Le script fonctionne correctement, mais parfois mon dummy ne trigger plus rien.
j'ai rajouté en début de script l'affichage du nom du device qui trigger, il ne se passe rien quand j'allume/éteint mon dummy.
j'ai créé un nouveau dummy, rajouté dans la liste des devices du script et là pas de soucis ce dernier active bien le script.
la première fois j'avais donc remplacé mon dummy "ko" par le nouveau et ça a bien fonctionné quelques temps.
Cependant c'est ré-arrivé hier, le dummy ne trigger plus rien alors qu'un nouveau est OK
Je suis allé comparer les deux dummy en BD quand ça ne marchait pas, je n'ai relevé aucune différence
J'ai reboot domoticz et celui qui ne marchait plus refonctionne correctement.

Auriez-vous une idée de ce qui pose problème?

Le dommy pilote le shelly via http://ipshelly/relay/0?turn=on ou off
et côté shelly j'ai ceci pour mettre à jour si c'est activé via autre chose
http://ipdomoticz/json.htm?type=command ... gger=false (et nvalue=0)
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Dummy switch et problème de trigger

Message par Keros »

Tu peux nous préciser ta version de Domoticz ?

Dans les logs du dummy, tu vois passer une info ou pas du tout ? Tu pourrais avoir un retour d'info du shelly qui annule ta commande.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Skwi
Messages : 53
Inscription : 20 nov. 2018, 13:09

Re: Dummy switch et problème de trigger

Message par Skwi »

Voici la version utilisée, sous docker :
Version: 2021.1
Build Hash: 8547c5b7e
Compile Date: 2021-04-17 17:29:11
dzVents Version: 3.1.7
Python Version: 3.8.5 (default, Jan 27 2021, 15:41:15) [GCC 9.3.0]

Côté logs du device je vois bien l'activation de mon équipement (qui change bien d'état on/off), et je le vois également dans les logs domoticz de ce type :
2021-12-06 14:56:20.340 Shelly: Light/Switch (Shelly_1_88)
2021-12-06 14:56:20.336 Status: User: Skwimotic (IP: 192.168.x.x) initiated a switch command (368/Shelly_1_88/On)

Par quel mécanisme le shelly pourrait annuler la commande?
en activant le dummy domoticz envoie l'ordre en http et trigger en même temps le script (je pense).
le shelly lui renvoie un changement - pour le même état - sans trigger (pour pas que ça boucle)
et ce qui est étrange c'est qu'après un reboot ça fonctionne de nouveau
j'imagine qu'il y a une variable de domoticz que je ne connais pas qui me pose problème, et qui serait réinitialisée à son reboot

Sur un autre sujet : j'avais un peu galéré sur ma variable utilisateur car je me suis rendu compte que son état n'était pas mis à jour en temps réel
Si je fais ça alors que la variable était à Off, ça m'affiche Off, d'où ma variable locale. Je ne sais pas si ça peut avoir un lien avec mon soucis
domoticz.variables('bypass_lumi_garage').set('On')
domoticz.log('variable bypass_lumi_garage :'..domoticz.variables('bypass_lumi_garage').value)

Le code en question :

Code : Tout sélectionner

return
{
	active = true, 
    on =
    {
        devices = {'Buanderie Xiaomi Motion 1','Garage Xiaomi Motion 2','Atelier Xiaomi Motion 3','Atelier Xiaomi Motion 5',
		'Buanderie-Couloir Xiaomi Sensor 1','Buanderie-Atelier Xiaomi Sensor 2','Garage-Electrique Xiaomi Sensor 3',
		'Shelly_1_88','Shelly_1_89','Shelly_1_88_switch','Shelly_1_89_switch'} --,'shelly_test'
	},

    logging =
    {
        level = domoticz.log_info,
        marker = "buanderie_light"
    },

    execute = function(domoticz, device)
		--declaration des lumières
        local gateway_light = domoticz.devices('Xiaomi RGB Gateway')
		local atelier_light = domoticz.devices('YeeLight atelier')
		local buanderie_light = domoticz.devices('Shelly_1_89')
		local garage_light = domoticz.devices('Shelly_1_88')
		
		--timer
		local duree = 2
		
		--declaration des capteur lux
		local gateway_lux = domoticz.devices('Xiaomi Gateway Lux').lux
		local xia3_lux = domoticz.devices('Atelier Xiaomi Lux 3').lux
		
		--recupération si une des lumières est déjà allumée ou non
		local etat_global = 'Off'
		if (buanderie_light.state == 'On' or atelier_light.state == 'On' or garage_light.state == 'On')then
			etat_global = 'On'
		end
		
		domoticz.log('etat_global :'..etat_global)
		domoticz.log('device.name :'..device.name)
		
		--si allumage explicite via voix ou bouton, manuel à true
		local bypass_lumi_garage = domoticz.variables('bypass_lumi_garage').value
		if (device.active and (string.find(device.name,'Shelly_1_') ~= nil)) then
			domoticz.log('Shelly active')
			--domoticz.log('avant set '..domoticz.variables('bypass_lumi_garage').value)
			--si switch 88/89 et shelly 88/89 "éteint" (=='on' car via inter ça turn on avant d'arriver à domoticz), alors on bypass
			if ((device.name == 'Shelly_1_88_switch' and garage_light.state == 'On') or (device.name == 'Shelly_1_89_switch' and buanderie_light.state == 'On')) then --= vient d'être allumé via switch
				domoticz.log('switch turned on')
				domoticz.variables('bypass_lumi_garage').set('On')
				bypass_lumi_garage = 'On'
				gateway_light.setRGB(0,0,255)
			--si switch 88/89 et shelly 88/89 "allumé", alors on désactive le bypass
			elseif ((device.name == 'Shelly_1_88_switch' and garage_light.state == 'Off') or (device.name == 'Shelly_1_89_switch' and buanderie_light.state == 'Off')) then --= vient d'être éteint via switch
				domoticz.log('switch turned off')
				domoticz.variables('bypass_lumi_garage').set('Off')
				bypass_lumi_garage = 'Off'
				gateway_light.switchOff().checkFirst().silent()
				etat_global = 'Off' --pour pas que ça rallume via inter
			--si allumé via la voix, on active le bypass
			elseif (device.name == 'Shelly_1_88' or device.name == 'Shelly_1_89') then
				domoticz.log('light turned on')
				domoticz.variables('bypass_lumi_garage').set('On')
				bypass_lumi_garage = 'On'
				gateway_light.setRGB(0,0,255)
			end
		--si éteint via la voix, on désactive le bypass
		elseif (device.inActive and (device.name == 'Shelly_1_88' or device.name == 'Shelly_1_89')) then
			domoticz.log('Shelly inActive')
			domoticz.variables('bypass_lumi_garage').set('Off')
			bypass_lumi_garage = 'Off'
			gateway_light.switchOff().checkFirst().silent()
			etat_global = 'Off' --pour pas que ça rallume via inter
		end
		
		domoticz.log('variable lumi garage :'..domoticz.variables('bypass_lumi_garage').value)
		domoticz.log('local lumi garage :'..bypass_lumi_garage)
		--Si ça a été déclenché manuellement, on ne fait rien
		if (device.active and bypass_lumi_garage == 'On') then
			--do nothing
			domoticz.log('Bypass activé')
		--si c'est le jour, on se base sur la luminosité de la pièce
		elseif (device.active and domoticz.time.isDayTime) then
			--buanderie
			if (gateway_lux < 1000) then
				domoticz.log('Buanderie sombre : '..gateway_lux)
				buanderie_light.switchOff().checkFirst().afterMin(duree).silent()
				buanderie_light.switchOn().checkFirst().forMin(duree).silent()
			end
			
			--atelier + garage
			if ((xia3_lux < 10)) then
				domoticz.log('Atelier sombre : '..xia3_lux)
				atelier_light.switchOff().checkFirst().afterMin(duree).silent()
				atelier_light.switchOn().checkFirst().forMin(duree).silent()
								
				garage_light.switchOff().checkFirst().afterMin(duree).silent()
				garage_light.switchOn().checkFirst().forMin(duree).silent()
			end
		--si c'est la nuit, ça dépend du type de capteur.
		elseif (device.active and domoticz.time.isNightTime) then
			--si c'est un capteur de porte ou si déjà allumé on rallume pour x minutes
			if ((string.find(device.name,'Sensor') ~= nil) or (etat_global == 'On')) then
				buanderie_light.switchOff().checkFirst().afterMin(duree).silent()
				buanderie_light.switchOn().checkFirst().forMin(duree).silent()
				
				atelier_light.switchOff().checkFirst().afterMin(duree).silent()
				atelier_light.switchOn().checkFirst().forMin(duree).silent()
								
				garage_light.switchOff().checkFirst().afterMin(duree).silent()
				garage_light.switchOn().checkFirst().forMin(duree).silent()
			end
		end
		
		-- if (device.active and domoticz.time.isNightTime) then
			-- gateway_light.switchOff().checkFirst().afterMin(duree)
			-- gateway_light.switchOn().checkFirst().forMin(duree)
			-- --atelier_light.switchOff().checkFirst().afterMin(duree)
			-- --atelier_light.switchOn().checkFirst().forMin(duree)
		-- end
		
		-- if (device.active and domoticz.time.hour <= 22 and domoticz.time.hour >= 6) then

		-- end
	end
}
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Dummy switch et problème de trigger

Message par Keros »

Il y aurait un souci de "cache" :roll:

Concernant les mises à jour de user variables, elles ne sont misent à jour qu'en fin d'exécution du script. Tu ne peux pas avoir la valeur mise à jour si tu viens de la changer juste avant dans le script.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Skwi
Messages : 53
Inscription : 20 nov. 2018, 13:09

Re: Dummy switch et problème de trigger

Message par Skwi »

Sais-tu s'il y aurait possibilité de refresh le cache ? Je chercherai plus tard sinon

Et OK pour la variable, je me suis douté que c'était ça
Merci
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: Dummy switch et problème de trigger

Message par Keros »

Il y a un cache dans les navigateurs qui posent de temps en temps des soucis d'affichage, mais il n'y en a normalement pas au niveau de DomoticZ.

Il y aurait une solution : redémarrer DomoticZ régulièrement. Il n'en n'a normalement pas besoin, mais peut-être que si tu faisais un redémarrage journalier, cela éviterai que ton souci apparaisse.

Une question peut-être : as-tu essayé de mettre directement les liens http de commandes des shelly directement dans les paramètres du dummy (Action ON et Action Off) ?
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Skwi
Messages : 53
Inscription : 20 nov. 2018, 13:09

Re: Dummy switch et problème de trigger

Message par Skwi »

Oui c'est déjà le cas. Pour moi le pb ne vient pas du navigateur car si j'actionne avec Alexa j'ai le même comportement : dans les logs on voit bien le dummy passer à on/off mais le script n'est pas activé.
Jai testé aussi en supprimant la requête http côté shelly et dummy juste pour faire du on/off, script pas activé
Skwi
Messages : 53
Inscription : 20 nov. 2018, 13:09

Re: Dummy switch et problème de trigger

Message par Skwi »

J'ai tenté de trigger via lua et pas DzVents sans succès. j'ai comparé avec mon dummy de test avec ça aussi : http://ipdomoticz/json.htm?type=devices&rid=368 j'ai réajusté le svalue :
http://ipdomoticz/json.htm?type=command ... igger=true
j'ai désactivé toutes les modif de ma variable globale (car sur un vieux post de 2017 ça indiquait : quote: Note that setting a variable through an event does not trigger the event logic again since this can create a nasty loop.)

j'ai activé/désactivé les lua/dzvents, passé à active=false mon script. renommé le script et il semblerait que suite à cette dernière manip un de mes deux shelly soit redevenu "triggerable"...

j'ai tenté les mêmes actions sur le second shelly, toujours KO >.<

Edit: je ne sais pas si c'est une action de ma part ou si "fallait juste attendre" mais j'ai renommé mon dummy: on/off, remis l'ancien nom, et maintenant il trigger de nouveau...

J'ai remplacé dans mon script la variable par un autre dummy, on verra ce que ça donne...
Skwi
Messages : 53
Inscription : 20 nov. 2018, 13:09

Re: Dummy switch et problème de trigger

Message par Skwi »

Bon ben le problème est toujours présent, mon dummy ne trigger plus rien de nouveau.

je me demande s'il n'y a pas une incompatibilité car d'un côté mon device fait partie des 'devices" qui trigger le scénario, et je le déclare aussi en local : garage_light = domoticz.devices('Shelly_1_88')
Il y a peut-être un cas de figure que domoticz n'aime pas ou une sécurité pour empecher que ce device puisse trigger (et rentrer dans une boucle?)
Sebby
Messages : 23
Inscription : 16 mai 2016, 18:29

Re: Dummy switch et problème de trigger

Message par Sebby »

Bonjour,

Je rencontre un problème similaire avec un shelly.
J'ai 2 domoticz qui communiquent via RemoteServer Port 6144 : (2021.1 (build 14104) et (2021.1 (build 13949)
Sur un domoticz, j'ai un broker MQTT avec des Shelly. J'ai testé les deux plugin shelly (Shelly_MQTT et ShellyCloudPlugin). Dans les deux cas, les actionneurs ont bien été créés correctement et fonctionnent très bien. Cependant, l'info ne remonte pas sur le second Domoticz je ne vois pas apparaitre le nouvel actionneur dans la liste des devices inutilisés via remoteServer. Cela semble être un problème similaire
Quand je crée un actionneur manuellement dans le premier Domoticz, celui-ci apparait bien dans le second.
En vous remerciant par avance pour votre aide
Répondre