Page 2 sur 3

Re: Utilisation des capteurs virtuels en LUA

Publié : 07 oct. 2015, 17:17
par jackslayter
oudini a écrit :Sauf erreur, tu nomme ton thermostat virtuel "Thermostat_confort" et tu appelle "Thermostat_Confort" dans le script.
bien vu essaye avec la même orthographe

Re: Utilisation des capteurs virtuels en LUA

Publié : 07 oct. 2015, 18:15
par vil1driver
Oh.. Oui bien vu.

Comme quoi, plus il y a d'yeux...

Re: Utilisation des capteurs virtuels en LUA

Publié : 07 oct. 2015, 20:45
par Morassien
Effectivement, merci Oudini.

Depuis le dernier essai de modif. de script, plus moyen de les exécuter !

j'en ai 3 différents, je les modifie sur mon PC et je les transfert via WinSCP, rien ne se passe, même après un reboot du Raspberry.

????

Re: Utilisation des capteurs virtuels en LUA

Publié : 08 oct. 2015, 22:14
par Morassien
Je suis complètement bloqué :(

depuis hier, sans rien faire de particulier a part modifier pour la Xième fois mon script, Domoticz c'est mis à ne plus l'exécuter....

J'avais pour habitude de le modifier sous Notepad+ via WinSCP, puis de le transférer dans le Raspberry, j'ai essayé de supprimer le fichier script et de le recréer via putty et nano en me disant que ça pouvait venir de là, mais rien de mieux !!

Je ne sais plus quoi tenter d'autre.

HELP please

Re: Utilisation des capteurs virtuels en LUA

Publié : 09 oct. 2015, 07:11
par vil1driver
Juste pour info,

Depuis winscp, juste double clic sur le fichier,
Il s'ouvre dans notepad++
Je fais les changements,
Puis CTRL+S (enregistrer)
Et hop,

Plus simple/rapide que de jouer avec les transferts..

Idem pour la création,
Clic droit,
Créer nouveau fichier, je le nomme, il s'ouvre dans notepad++
Je pense à le passer aussitôt en UTF8
Je colle ou tape mon code,
Puis CTRL+S

..

Re: Utilisation des capteurs virtuels en LUA

Publié : 11 oct. 2015, 21:50
par Morassien
Effectivement je ne le faisais pas comme ça, merci du conseil ;)

mais j'ai beau faire ce que tu me dis, toujours pareil pas moyen d’exécuter le moindre script-device :?
Pour les scrip-time ça fonctionne.

je désespère !

D'autres idées ?

Re: Utilisation des capteurs virtuels en LUA

Publié : 12 oct. 2015, 23:50
par Morassien
vil1driver a écrit :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.
Vu que je ne m'en sort pas avec l’exécution des script-device, et qu'il apparait effectivement plus logique d'utiliser les script-time pour ce genre de gestion, je cherche à modifier mon script en conséquence.

@Vil1driver : Tu pourrait m'en dire plus sur la suppression du test 'devicechanged'

J'ai essayé la modif ci dessous sans succès :

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'
local temperature = devicechanged[string.format('%s_Temperature', sonde)]

commandArray = {}

       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
Erreur reçu :
Error: EventSystem: ...pi/domoticz/scripts/lua/script_time_gestion_temp_SdB.lua:11: attempt to index global 'devicechanged' (a nil value)
En cherchant un peu j'apprends dans le Wiki 'Event' sur le site de domoticz que les scripts-time ne recoivent pas la table devicechanged, d'ou certainement la raison de l'erreur, je modifie donc mon script comme ceci :

Code : Tout sélectionner

  local temperature = otherdevices_svalues[string.format('%s_Temperature', sonde)]
Puis comme ça :

Code : Tout sélectionner

  local temperature = string.sub(otherdevices_svalues[sonde],1,4)
Puis comme ça :

Code : Tout sélectionner

  local temperature = tonumber(string.sub(otherdevices_svalues[sonde],1,4))
Dans ces 3 derniers cas, plus d'erreur dans le log, mais pas plus de retour des print :(
Il ne se passe rien......

Nouvel essai, et la une nouvelle errreur :

Code : Tout sélectionner

local temperature = tonumber(string.sub(otherdevices_svalues['sonde'],1,4))
Erreur reçu
Error: EventSystem: ...pi/domoticz/scripts/lua/script_time_gestion_temp_SdB.lua:10: bad argument #1 to 'sub' (string expected, got nil)
Le diable est dans le détail et je lui trouverai la queue :evil:
Mais peut être pas tout seul....... si une bonne âme passais par là...

Re: Utilisation des capteurs virtuels en LUA

Publié : 13 oct. 2015, 10:03
par Neutrino
Pour chopper les températures, j'utiliserais plutôt :

Code : Tout sélectionner

 local temperature = otherdevices_temperature[sonde]

Re: Utilisation des capteurs virtuels en LUA

Publié : 13 oct. 2015, 10:38
par vil1driver
cette commande remonte une valeur étrange.

ici pour 18.9°C ça me remonte 18.89999961853

je préfère l'autre méthode..

t'as juste à supprimer ce qui est en rouge pour passer du script device au script time
en vert la récupe des valeurs de thermostat et température
-- 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 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 = tonumber(string.sub(otherdevices_svalues[sonde],1,4)) --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

Re: Utilisation des capteurs virtuels en LUA

Publié : 13 oct. 2015, 12:53
par Morassien
Merci de vos réponse,

Ci dessous mon script complet :

Code : Tout sélectionner

local consigne_j = tonumber(otherdevices_svalues['Thermostat_confort']) 
local consigne_n = tonumber(otherdevices_svalues['Thermostat_nuit']) 
local hysteresis = 0.3
local sonde = 'Salle de bain'
local thermostat_j = 'Thermostat jour'
local radiateur = 'Radiateur Salle de bain'

commandArray = {}

--local temperature = tonumber(string.sub(otherdevices_svalues['sonde'],1,4))
local temperature = otherdevices_temperature[sonde]
if (otherdevices[thermostat_j]=='On') then
        print('-- Gestion du thermostat confort pour la salle de bain --')

    if (temperature < (con[code]
signe_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
return commandArray[sonde][/code]

J'ai essayé les 2 commandes de récupération de température que vous me proposez :

Avec celle ci, il ne se passe rien.... plus d'erreur mais pas de retour de changement d'état non plus (print)

Code : Tout sélectionner

local temperature = otherdevices_temperature[sonde]
Avec celle ci

Code : Tout sélectionner

--local temperature = tonumber(string.sub(otherdevices_svalues['sonde'],1,4))
je récupère l'erreur suivante
Error: EventSystem: ...pi/domoticz/scripts/lua/script_time_gestion_temp_SdB.lua:10: bad argument #1 to 'sub' (string expected, got nil)
Pour info ma sonde de température de Salle de bain est une DS18b20, possédant une sonde Oregon j'ai fait l'essai de la remplacer dans le script pour récupérer sa consigne, le résultat est le même.