Page 1 sur 3

Optimisation de script

Publié : 21 oct. 2015, 19:45
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.

Re: Optimmisation de script

Publié : 21 oct. 2015, 20:07
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

Re: Optimmisation de script

Publié : 24 nov. 2015, 17:17
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.

Re: Optimisation de script

Publié : 24 nov. 2015, 17:35
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

Re: Optimisation de script

Publié : 24 nov. 2015, 17:59
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

Re: Optimisation de script

Publié : 24 nov. 2015, 18:32
par vil1driver
Salut,

Le tout dernier end est de trop ;)

Re: Optimisation de script

Publié : 25 nov. 2015, 17:58
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 ?

Re: Optimisation de script

Publié : 25 nov. 2015, 18:18
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

Re: Optimisation de script

Publié : 25 nov. 2015, 18:31
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

Re: Optimisation de script

Publié : 25 nov. 2015, 18:36
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.