Optimisation de script

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 <\>.
Cissou
Messages : 98
Inscription : 25 févr. 2015, 13:10

Optimisation de script

Message par Cissou »

Salut,

Voila j'aimerai l'avis des spécialistes en scripts lua pour optimiser mes scripts de chauffage dont voici un exemple :

Code : Tout sélectionner

-- Alexandre DUBOIS - 2014
-- Ce script permet de maintenir la température de la chambre de maxime entre 17°C et 19°C quand l'interrupteur
-- virtuel 'Thermostat Ch Maxime' est activé.

--------------------------------
------ Variables à éditer ------
--------------------------------
-- local consigne = 19  --Température de consigne
local consigne = tonumber(otherdevices_svalues['Consigne Ch Maxime'])
local hysteresis1 = 0.5 --Valeur seuil superieure
local hysteresis2 = 1 --Valeur seuil inferieure
local sonde = 'Ch. Maxime' --Nom de la sonde de température
local thermostat = 'Thermostat Ch Maxime' --Nom de l'interrupteur virtuel du thermostat
local radiateur = 'Radiateur Ch Maxime' --Nom du radiateur à allumer/éteindre
local absent = 'Mode ABSENT' -- mode longue absence
local papa = 'Mode MAXIME PAPA' -- quand le petit est chez son pere
local consigneabsent = tonumber(otherdevices_svalues['Consigne ABSENT'])
--------------------------------
-- Fin des variables à éditer --
--------------------------------

commandArray = {}
--La sonde Oregon 'Temperature Ch Maxime' emet toutes les 40 secondes. Ce sera approximativement la fréquence
-- d'exécution de ce script.

if (devicechanged[sonde]) then

local temperature = devicechanged[string.format('%s_Temperature', sonde)] --Temperature relevée dans la chambre de maxime
-- pas de mode ABSENT ou MAXIME PAPA sur on
        if (otherdevices[absent]=='Off') or (otherdevices[papa]=='Off') then
            --On n'agit que si le "Thermostat" est actif
                if (otherdevices[thermostat]=='On') then
                        print('-- Gestion du thermostat pour la chambre de maxime --')

                        if (temperature < (consigne - hysteresis2) ) then
                                print('Allumage du chauffage dans la chambre de maxime')
                                commandArray[radiateur]='On'

                        elseif (temperature > (consigne + hysteresis1)) then
                                print('Extinction du chauffage dans la chambre de maxime')
                                commandArray[radiateur]='Off'

                        end
        --      elseif (otherdevices[thermostat]=='Off') then
        --              print('Fin de la régulation')
        --              commandArray[radiateur]='Off'

                end
        else
        -- si mode ABSENT ou MAXIME PAPA sur on
                --On n'agit que si le "Thermostat" est actif
                if (otherdevices[thermostat]=='On') then
                        print('-- Gestion du thermostat pour la chambre de maxime --')

                        if (temperature < (consigneabsent - hysteresis2) ) then
                                print('Allumage du chauffage dans la chambre de maxime')
                                commandArray[radiateur]='On'

                        elseif (temperature > (consigneabsent + hysteresis1)) then
                                print('Extinction du chauffage dans la chambre de maxime')
                                commandArray[radiateur]='Off'

                        end
                end
        end
end
return commandArray
Description du contexte :
deux consigne de thermostat :
- un pour la pièce: permet de choisir la température
- un pour les absences longues: un mode éco pour les absences

deux interrupteurs virtuel
- Mode ABSENT: permet de switcher sur des température basse lors d'absence prolongées
- Mode MAXIME PAPA : quand le grand est chez son père, on chauffe comme dans le cas d'absence longue

deux variables pour l’hystérésis : pour tenir compte de l'inertie des radiateur

y a-t-il possibilité de simplifier le code qui fonctionne très bien ?

un soucis toutes fois : si le thermostat est sur on et qu'il passe sur off et que le chauffage était sur on, le chauffage reste sur on
j'ai testé plusieurs trucs mais rien de fonctionnel et qui permette de piloter le chauffage manuellement.
Dernière modification par Cissou le 24 nov. 2015, 17:18, modifié 1 fois.
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Optimmisation de script

Message par vil1driver »

Salut,

Perso je préfère les script_time..
J'aime bien ajouter une sécue sur les sondes au cas où elles se mettent à déconner..
l'hystérésis c'est surtout pour des radiateurs sans inertie.

Ajoutes une condition, du genre
Si le thermostat vient de passer à off -> couper le chauffage
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
Cissou
Messages : 98
Inscription : 25 févr. 2015, 13:10

Re: Optimmisation de script

Message par Cissou »

Bon ben comme tu le dis si la sonde déconne, t'es dans la merde,

ce matin, température de la salle de bain : 15.4°C plus de pile dans la sonde a 2h29 donc rien s'est déclenche, je passe en script_time
on va voir si j'arrive a faire la transition

J'ai bien un script_time qui vérifie l'age de la dernière mesure de la sonde, mais il change pas les piles donc ça c'est bon quand ça tombe en panne dans la journée.
Cissou
Messages : 98
Inscription : 25 févr. 2015, 13:10

Re: Optimisation de script

Message par Cissou »

bon c'est pas gagné :

Code : Tout sélectionner

2015-11-24 17:30:00.539 Error: EventSystem: ...domoticz/scripts/lua/script_time_ThermostatSalleBain.lua:69: expected near 'end'

Code : Tout sélectionner

-- Alexandre DUBOIS - 2014
-- Ce script permet de maintenir la température de la salle de bain entre 17°C et 19°C quand l'interrupteur
-- virtuel 'Thermostat salon' est activé.

--------------------------------
------ Variables à éditer ------
--------------------------------
-- local consigne = 19  --Température de consigne
local consigne = tonumber(otherdevices_svalues['Consigne SdB'])
local hysteresis1 = 0.5 --Valeur seuil superieure
local hysteresis2 = 1 --Valeur seuil inferieure
local sonde = 'Salle de Bain' --Nom de la sonde de température
local thermostat = 'Thermostat Salle de Bain' --Nom de l'interrupteur virtuel du thermostat
local radiateur = 'Radiateur Salle de Bain' --Nom du radiateur à allumer/éteindre
local radiateur2 = 'Soufflant Salle de Bain'
local absent = 'Mode ABSENT'
local consigneabsent = tonumber(otherdevices_svalues['Consigne ABSENT'])
--------------------------------
-- Fin des variables à éditer --
--------------------------------

commandArray = {}

local temperature = otherdevices[string.format('%s_Temperature', sonde)] --Temperature relevée dans la salle de bain
        if (otherdevices[absent]=='Off') then
            --On n'agit que si le "Thermostat" est actif
                if (otherdevices[thermostat]=='On') then
                        print('-- Gestion du thermostat pour la Salle de Bain --')
 
                        if (temperature < (consigne - hysteresis2) ) then
                                print('Allumage du chauffage dans la Salle de Bain')
                                commandArray[radiateur]='On'
                                commandArray[radiateur2]='On'
                        elseif (temperature > (consigne + hysteresis1)) then
                                print('Extinction du chauffage dans la Salle de Bain')
                                commandArray[radiateur]='Off'
                                commandArray[radiateur2]='Off'
                        end
                elseif (otherdevices[thermostat]=='Off') then
                        print('Fin de la régulation')
                        commandArray[radiateur]='Off'
                        commandArray[radiateur2]='Off'
                end
        else
                --On n'agit que si le "Thermostat" est actif
                if (otherdevices[thermostat]=='On') then
                        print('-- Gestion du thermostat pour la Salle de Bain --')
                        if (temperature < (consigneabsent - hysteresis2) ) then
                                print('Allumage du chauffage dans la Salle de Bain')
                                commandArray[radiateur]='On'
                                commandArray[radiateur2]='On'

                        elseif (temperature > (consigneabsent + hysteresis1)) then
                                print('Extinction du chauffage dans la Salle de Bain')
                                commandArray[radiateur]='Off'
                                commandArray[radiateur2]='Off'
                        end
                elseif (otherdevices[thermostat]=='Off') then
                        print('Fin de la régulation')
                         commandArray[radiateur]='Off'
                        commandArray[radiateur2]='Off'
                end
        end
        if (devicechanged[thermostat]=='Off') and (otherdevices[radiateur]=='On') and (otherdevices[radiateur2]=='On') then
                commandArray[radiateur]='Off'
                commandArray[radiateur2]='Off'
        end
end

return commandArray

un lien pour reperer le numero de ligne: http://pastebin.com/b6pC4kVP
rimram31
Messages : 659
Inscription : 04 oct. 2015, 11:22
Localisation : Toulouse

Re: Optimisation de script

Message par rimram31 »

Pas de certitude (pas mon pi "sous la main" :-)) mais je dirais qu'il me manque des () sur ton if a la fin => if ( (...) and (...) and (...) ) then ...

Après mais c'est sans rapport avec l'erreur, je ne vois aucune différence dans tes tests hysteresis consigne ou consigne absent. Si c'est le cas, tu aurais pu simplifier en calculant une fois pour toute ta température de consigne:

Code : Tout sélectionner

if (otherdevices[absent]=='Off') then
  consigne = consigneabsent 
end
...
Et une seule fois le if then else d'hysteresis.

Après, les coups et les douleurs ... :D
Raspberry Pi 2 + carte RF pi "maison" + Domoticz
Sonde Oregon + Aliexpress - Prises Chacon (3500W) - 1wire DS18B20
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Optimisation de script

Message par vil1driver »

Salut,

Le tout dernier end est de trop ;)
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
Cissou
Messages : 98
Inscription : 25 févr. 2015, 13:10

Re: Optimisation de script

Message par Cissou »

Pourtant j'ai verifié les end, mais avec nano en cli j'avais pas tout sur un ecran.....

Bon sinon est-ce qu'il y a un endroit ou est documenté correctement (sur le wiki de domoticz je trouve pas) ce qu'on retourne avec les otherdevices et devicechanged ?
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Optimisation de script

Message par vil1driver »

utilises winscp & notepad++ ;) depuis windows

Tu peux commencer par lire les articles lua du blog.

Otherdevices['lampe'] == 'On' est vrai si ta lampe est à On
Devicechanged['lampe'] est vrai si ta lampe vient d'obtenir une mise à jour de son état.
Devicechanged['lampe'] == 'On' est vrai si ta lampe vient de (re)passer à On
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
Cissou
Messages : 98
Inscription : 25 févr. 2015, 13:10

Re: Optimisation de script

Message par Cissou »

bon j'ai reussi à presque tout faire, sauf, ce que tu disais à la fin vil1driver

c-à-d d'arreter les chauffage si le thermostat vient de passer en Off
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Optimisation de script

Message par vil1driver »

Normal, tu ne peux pas utiliser devicechanged dans un script_time

Changes cette ligne

Code : Tout sélectionner

if (devicechanged[thermostat]=='Off') and (otherdevices[radiateur]=='On') and (otherdevices[radiateur2]=='On') then
              
Par celle ci

Code : Tout sélectionner

if (otherdevices[thermostat]=='Off') then
Vas lire les articles du blog c'est pas optionnel si tu veux comprendre.. Et moins galérer.
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
Répondre