Utilisation des capteurs virtuels en LUA

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 <\>.
Morassien
Messages : 14
Inscription : 07 oct. 2015, 10:25

Utilisation des capteurs virtuels en LUA

Message par Morassien »

Je tente d'adapter un script de gestion de chauffage trouvé ici même, afin d'insérer des valeur de consigne modifiable depuis Domoticz, je m'explique :

J'utilise actuellement le script suivant qui fonctionne parfaitement

Code : Tout sélectionner

-- Ce script permet de maintenir la température de la salle de bain entre 17°C et 18°C quand l'interrupteur
-- virtuel 'Thermostat jour' est activé et entre 18.5°C et 19.5°C quand l'interrupteur
-- virtuel 'Thermostat jour' est éteint.
--------------------------------
------ Variables à éditer ------
--------------------------------
local consigne_j = 19  --Température de consigne jour
local consigne_n = 17.5  --Température de consigne nuit
local hysteresis = 0.5 --Valeur seuil pour éviter que le relai ne cesse de commuter dans les 2 sens
local sonde = 'Salle de bain' --Nom de la sonde de température
local thermostat_j = 'Thermostat jour' --Nom de l'interrupteur virtuel du thermostat pour le jour
--local thermostat_n = 'Thermostat nuit' --Nom de l'interrupteur virtuel du thermostat pour la nuit
local radiateur = 'Radiateur Salle de bain' --Nom du radiateur à allumer/éteindre
local pas = 0.5 --increment de la temperaure du thermostat
local remote = 'telecommande temp'
-- Capteur Temperature thermostat virtuel - nom et id
--local tempthermo = 'Temp Thermostat'
--local idx = 45
--------------------------------
-- Fin des variables à éditer --
--------------------------------

commandArray = {}
--if (devicechanged[remote]) then
--   nowtemp = tonumber(otherdevices_svalues[tempthermo])
--   if (devicechanged[remote]=='On') then
--       commandArray['UpdateDevice'] = idx .. '|0|' .. tostring(nowtemp+pas)
--   elseif (devicechanged[remote]=='Off') then
--       commandArray['UpdateDevice'] = idx .. '|0|' .. (tostring(nowtemp-pas))
--   end
--end

--La sonde Oregon 'Salon' emet toutes les 40 secondes. Ce sera approximativement la fréquence 
-- d'exécution de ce script.
if (devicechanged[sonde]) then
--        nowtemp = tonumber(otherdevices_svalues[tempthermo])
	local temperature = devicechanged[string.format('%s_Temperature', sonde)] --Temperature relevée dans la salle de bain
    --Action si le "Thermostat" est actif en mode confort
    if (otherdevices[thermostat_j]=='On') then
        print('-- Gestion du thermostat confort pour la salle de bain --')

    	if (temperature < (consigne_j - hysteresis) ) then
            print('Allumage du chauffage dans la salle de bain')
            commandArray[radiateur]='Off'

	    elseif (temperature > (consigne_j + hysteresis)) then
	        print('Extinction du chauffage dans la salle de bain')
            commandArray[radiateur]='On'

	end
    end

    --Action si le "Thermostat" est actif en mode absent
    if (otherdevices[thermostat_j]=='Off') then
        print('-- Gestion du thermostat absent pour la salle de bain --')

    	if (temperature < (consigne_n - hysteresis) ) then
            print('Allumage du chauffage dans la salle de bain')
            commandArray[radiateur]='Off'

	    elseif (temperature > (consigne_n + hysteresis)) then
	        print('Extinction du chauffage dans la salle de bain')
            commandArray[radiateur]='On'

	end
    end

end
return commandArray
Et je souhaiterais simplement ajouter des variables, ceci afin de définir dynamiquement mes valeurs de consignes "consigne_j" et "consigne_n" sans avoir a éditer mon script pour les modifier.

J'ai déclaré pour ça 2 capteurs virtuels :

Image

Image

modifier mon script comme ceci :

Code : Tout sélectionner

local consigne_j = tonumber(otherdevices_svalues['Thermostat_Confort'])  --Température de consigne jour
local consigne_n = tonumber(otherdevices_svalues['Thermostat_Nuit'])  --Température de consigne nuit
et voila ce que j'obtiens dans les logs :
Error: EventSystem: .../domoticz/scripts/lua/script_device_thermostat-SdB_2.lua:57: attempt to perform arithmetic on local 'consigne_n' (a nil value)
N'y connaissant pas grand chose, je sollicite votre aide pour comprendre ce qui ne va pas

D'avance merci !!
Raspberry 3 - DOMOTICZ - RFXCOM RFXtrx433
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Utilisation des capteurs virtuels en LUA

Message par vil1driver »

Salut,

Le nom du script..

Changes device par time..
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
Morassien
Messages : 14
Inscription : 07 oct. 2015, 10:25

Re: Utilisation des capteurs virtuels en LUA

Message par Morassien »

Merci de ta réponse !

Maintenant j'obtiens cette erreur, qui d'après moi est logique du fait du changement de la nature du script..... mais comment faire ?
Error: EventSystem: ...pi/domoticz/scripts/lua/script_time_thermostat-SdB_2.lua:22: attempt to index global 'devicechanged' (a nil value)
Raspberry 3 - DOMOTICZ - RFXCOM RFXtrx433
jackslayter
Messages : 1040
Inscription : 30 sept. 2014, 14:40
Localisation : Isère (38)

Re: Utilisation des capteurs virtuels en LUA

Message par jackslayter »

remet toi en device et change ça :

Code : Tout sélectionner

local consigne_n = string.match(otherdevices_svalues['Thermostat_Nuit'], "(%d+%.*%d*)")
Raspberry Pi + RFLink + Domoticz Beta
Oregon - 3x Thgr122Nx / Chacon - micromodule 200w, télécommande 3b et 16b, 2x module 1000w, détecteur de fumée, contact de porte, 2x prise 3500w / OWL - CM180 / TRC02 v2 RGB 3M / Cheap - PIR, contact de porte
Morassien
Messages : 14
Inscription : 07 oct. 2015, 10:25

Re: Utilisation des capteurs virtuels en LUA

Message par Morassien »

Modification effectuée :

Script renommé en "script_device_thermostat-SdB_2.lua"

Consignes changées

Code : Tout sélectionner

local consigne_j = string.match(otherdevices_svalues['Thermostat_Confort'], "(%d+%.*%d*)")
local consigne_n = string.match(otherdevices_svalues['Thermostat_Nuit'], "(%d+%.*%d*)")
Nouveau code erreur, par paquet de 5
2015-10-07 14:21:36.049 Error: EventSystem: .../domoticz/scripts/lua/script_device_thermostat-SdB_2.lua:8: bad argument #1 to 'match' (string expected, got nil)
2015-10-07 14:21:36.116 Error: EventSystem: .../domoticz/scripts/lua/script_device_thermostat-SdB_2.lua:8: bad argument #1 to 'match' (string expected, got nil)
2015-10-07 14:21:36.202 Error: EventSystem: .../domoticz/scripts/lua/script_device_thermostat-SdB_2.lua:8: bad argument #1 to 'match' (string expected, got nil)
2015-10-07 14:21:36.256 Error: EventSystem: .../domoticz/scripts/lua/script_device_thermostat-SdB_2.lua:8: bad argument #1 to 'match' (string expected, got nil)
2015-10-07 14:21:36.349 Error: EventSystem: .../domoticz/scripts/lua/script_device_thermostat-SdB_2.lua:8: bad argument #1 to 'match' (string expected, got nil)
Raspberry 3 - DOMOTICZ - RFXCOM RFXtrx433
jackslayter
Messages : 1040
Inscription : 30 sept. 2014, 14:40
Localisation : Isère (38)

Re: Utilisation des capteurs virtuels en LUA

Message par jackslayter »

tu peux remettre ton script complet actuel. (je connais bien ce script , c'est le mien)
merci
Raspberry Pi + RFLink + Domoticz Beta
Oregon - 3x Thgr122Nx / Chacon - micromodule 200w, télécommande 3b et 16b, 2x module 1000w, détecteur de fumée, contact de porte, 2x prise 3500w / OWL - CM180 / TRC02 v2 RGB 3M / Cheap - PIR, contact de porte
Morassien
Messages : 14
Inscription : 07 oct. 2015, 10:25

Re: Utilisation des capteurs virtuels en LUA

Message par Morassien »

Merci de ton support !
Et pour ton script !

Le voila :

Code : Tout sélectionner

-- Ce script permet de maintenir la température de la salle de bain entre 17°C et 18°C quand l'interrupteur
-- virtuel 'Thermostat jour' est activé et entre 18.5°C et 19.5°C quand l'interrupteur
-- virtuel 'Thermostat jour' est éteint.
--------------------------------
------ Variables à éditer ------
--------------------------------
--local consigne_j = tonumber(otherdevices_svalues['Thermostat_Confort'])  --Température de consigne jour
--local consigne_n = tonumber(otherdevices_svalues['Thermostat_Nuit'])  --Température de consigne nuit
local consigne_j = string.match(otherdevices_svalues['Thermostat_Confort'], "(%d+%.*%d*)")
local consigne_n = string.match(otherdevices_svalues['Thermostat_Nuit'], "(%d+%.*%d*)")
local hysteresis = 0.5 --Valeur seuil pour éviter que le relai ne cesse de commuter dans les 2 sens
local sonde = 'Salle de bain' --Nom de la sonde de température
local thermostat_j = 'Thermostat jour' --Nom de l'interrupteur virtuel du thermostat pour le jour
local radiateur = 'Radiateur Salle de bain' --Nom du radiateur à allumer/éteindre

--------------------------------
-- Fin des variables à éditer --
--------------------------------

commandArray = {}

--La sonde Oregon 'Salon' emet toutes les 40 secondes. Ce sera approximativement la fréquence 
-- d'exécution de ce script.
if (devicechanged[sonde]) then
--        nowtemp = tonumber(otherdevices_svalues[tempthermo])
	local temperature = devicechanged[string.format('%s_Temperature', sonde)] --Temperature relevée dans la salle de bain
    --Action si le "Thermostat" est actif en mode confort
    if (otherdevices[thermostat_j]=='On') then
        print('-- Gestion du thermostat confort pour la salle de bain --')

    	if (temperature < (consigne_j - hysteresis) ) then
            print('Allumage du chauffage dans la salle de bain')
            commandArray[radiateur]='Off'

	    elseif (temperature > (consigne_j + hysteresis)) then
	        print('Extinction du chauffage dans la salle de bain')
            commandArray[radiateur]='On'

	end
    end

    --Action si le "Thermostat" est actif en mode absent
    if (otherdevices[thermostat_j]=='Off') then
        print('-- Gestion du thermostat absent pour la salle de bain --')

    	if (temperature < (consigne_n - hysteresis) ) then
            print('Allumage du chauffage dans la salle de bain')
            commandArray[radiateur]='Off'

	    elseif (temperature > (consigne_n + hysteresis)) then
	        print('Extinction du chauffage dans la salle de bain')
            commandArray[radiateur]='On'

	end
    end

end
return commandArray
Raspberry 3 - DOMOTICZ - RFXCOM RFXtrx433
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Utilisation des capteurs virtuels en LUA

Message par vil1driver »

Ta première commande était bonne,
Je l'utilise..

Pour du chauffage on a pas besoin d'être aussi réactif, pas besoinde lancer le script toutes les x secondes...
1 fois par minute (script_time..) est bien suffisant.

Avec l'erreur 'devicechanged'. Tu avais juste à supprimer ce teste (y compris le end de cloture) et ça devrait aller.
Dernière modification par vil1driver le 07 oct. 2015, 18:44, modifié 1 fois.
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
jackslayter
Messages : 1040
Inscription : 30 sept. 2014, 14:40
Localisation : Isère (38)

Re: Utilisation des capteurs virtuels en LUA

Message par jackslayter »

essaye ça

Code : Tout sélectionner

local consigne_j = string.match(otherdevices_svalues['Thermostat_Confort'], "(%d+%.*%d*)")
local consigne_n = string.match(otherdevices_svalues['Thermostat_Nuit'], "(%d+%.*%d*)")
local hysteresis = 0.5
local sonde = 'Salle de bain'
local thermostat_j = 'Thermostat jour'
local radiateur = 'Radiateur Salle de bain'

commandArray = {}

if (devicechanged[sonde]) then
   local temperature = devicechanged[string.format('%s_Temperature', sonde)]
    if (otherdevices[thermostat_j]=='On') then
        print('-- Gestion du thermostat confort pour la salle de bain --')

       if (temperature < (consigne_j - hysteresis) ) then
            print('Allumage du chauffage dans la salle de bain')
            commandArray[radiateur]='Off'
       elseif (temperature > (consigne_j + hysteresis)) then
           print('Extinction du chauffage dans la salle de bain')
            commandArray[radiateur]='On'
	   end
 
    elseif (otherdevices[thermostat_j]=='Off') then
        print('-- Gestion du thermostat absent pour la salle de bain --')

       if (temperature < (consigne_n - hysteresis) ) then
            print('Allumage du chauffage dans la salle de bain')
            commandArray[radiateur]='Off'
       elseif (temperature > (consigne_n + hysteresis)) then
           print('Extinction du chauffage dans la salle de bain')
            commandArray[radiateur]='On'
      end
	end
end
return commandArray
Raspberry Pi + RFLink + Domoticz Beta
Oregon - 3x Thgr122Nx / Chacon - micromodule 200w, télécommande 3b et 16b, 2x module 1000w, détecteur de fumée, contact de porte, 2x prise 3500w / OWL - CM180 / TRC02 v2 RGB 3M / Cheap - PIR, contact de porte
oudini
Messages : 12
Inscription : 30 avr. 2015, 15:09

Re: Utilisation des capteurs virtuels en LUA

Message par oudini »

Sauf erreur, tu nomme ton thermostat virtuel "Thermostat_confort" et tu appelle "Thermostat_Confort" dans le script. Pareil pour "Thermostat_Nuit"

Dans Lua les noms de variable sont sensibles à la casse.
Dernière modification par oudini le 07 oct. 2015, 17:20, modifié 1 fois.
Répondre