Domotique : Partie 5 – Implémenter un thermostat simple

Cet article fait partie de la série Domotique (18 articles au total)

Après les dernières aventures matérielles pour piloter nos chauffages électriques, je vous propose un épisode où l’on gardera les mains propres :) Aujourd’hui, on va implémenter un thermostat logiciel qui va permettre de maintenir une pièce à une température donnée. Pour cet épisode, vous n’aurez même besoin d’aucun matériel supplémentaire !

Cet article est le 6ème d’une série dédiée à la domotique dont vous pourrez trouver le sommaire au bas de cet article.

Le principe du thermostat de chauffage

Dans chacune de mes pièces, j’ai une sonde de température (cf Episode 2), ainsi qu’un chauffage électrique (cf Episode 4). L’objet de l’exercice du jour sera donc d’asservir le chauffage à cette sonde : on va donc l’allumer ou l’éteindre en fonction de la température mesurée dans la pièce ! Pour éviter que le chauffage passe son temps à s’allumer et à s’éteindre, on va ajouter une « marge d’erreur » (on appelle cette marge l’hystérésis). Concrètement, si l’on souhaite maintenir une pièce à une température de consigne de 20°C et que l’on choisit une hystérésis de 0.5°C, on va allumer le chauffage quand la température va passer en dessous de 19.5°C et l’éteindre au delà de 20.5°C.

L'évolution de la température d'une pièce avec une régulation par hystérésis. Ici on cible une température de 20°C avec une marge d'erreur de 1°C
L’évolution de la température d’une pièce avec une régulation par hystérésis. Ici on cible une température de 20°C avec une marge d’erreur de 1°C. (Crédits : domotique-store.fr)

Mon cahier des charges

J’ai choisi de commencer avec quelque chose de simple.

  • Un interrupteur virtuel pour chacune de mes pièces dans Domoticz.
  • Le thermostat de la pièce en question sera actif quand l’interrupteur virtuel sera en position ON.
  • La température de consigne n’est pas modifiable directement depuis l’interface de Domoticz
  • La techno utilisée ne supportant pas le retour d’état, je cherche un moyen de fiabiliser le système

La mise en oeuvre

Etape 1 : Créer l’interrupteur virtuel

Si vous ne l’avez pas déjà fait, dans la partie Configuration/Matériel de Domoticz, ajouter un périphérique de type « Dummy ». Tous nos interrupteurs virtuels y seront rattachés.

Périphérique virtuel auquel seront rattachés nos interrupteurs virtuels
Périphérique virtuel auquel seront rattachés nos interrupteurs virtuels

Dans l’onglet « Interrupteurs », cliquez sur « Ajout manuel » et ajoutez un interrupteur ON/OFF du type qui vous plaira (seul impératif : le rattacher au périphérique « Dummy » créé précédemment).

Création d'un interrupteur virtuel. Les valeurs sélectionnées (Type, Code...) n'ont pas d'importance.
Création d’un interrupteur virtuel. Les valeurs sélectionnées (Switch Type, Unit Code…) n’ont pas d’importance.

A partir de ce moment, vous avez un bel interrupteur, en l’occurrence « Thermostat salon », que vous pouvez allumer et éteindre à loisir ! Rajoutons un peu de magie derrière tout cela ;)

Interrupteur virtuel finalisé. Il ne reste plus qu'à animer tout cela !
Interrupteur virtuel finalisé. Il ne reste plus qu’à animer tout cela !

Etape 2 : Création du script

Domoticz permet d’écrire des scripts LUA pour exécuter de petits scénarios. Aujourd’hui on va justement s’en servir pour implémenter cette logique de thermostat ! Chaque script est à placer dans le répertoire scripts/lua de domoticz. Pour cet exemple, j’ai donc créé un fichier script_device_thermostat-salon.lua dans ce dossier (le nom du fichier doit impérativement commencer par « script_device_ » comme expliqué dans le wiki de domoticz).

Le contenu du fichier

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

--------------------------------
------ Variables à éditer ------
--------------------------------
local consigne = 20  --Température de consigne
local hysteresis = 0.5 --Valeur seuil pour éviter que le relai ne cesse de commuter dans les 2 sens
local sonde = 'Salon' --Nom de la sonde de température
local thermostat = 'Thermostat salon' --Nom de l'interrupteur virtuel du thermostat
local radiateur = 'Radiateur salon' --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
	local temperature = devicechanged[string.format('%s_Temperature', sonde)] --Temperature relevée dans le salon
    --On n'agit que si le "Thermostat" est actif
    if (otherdevices[thermostat]=='On') then
        print('-- Gestion du thermostat pour le salon --')

    	if (temperature < (consigne - hysteresis) ) then
            print('Allumage du chauffage dans le salon')
            commandArray[radiateur]='Off'

	    elseif (temperature > (consigne + hysteresis)) then
	        print('Extinction du chauffage dans le salon')
            commandArray[radiateur]='On'

	    end
    end
end
return commandArray

Pour adapter ce script à votre installation, il suffit de modifier les quelques variables entre les lignes surlignées en jaune (8 à 12).

Comment le script fonctionne ?

Chaque fois qu’une nouvelle valeur est reçue de la part de la sonde du salon (et si l’interrupteur virtuel du thermostat est actif), on compare la température actuelle de la pièce à la température de consigne (+ ou – l’hystérésis). Si nécessaire on allume le radiateur (en coupant le signal sur le fil pilote) ou on lui demande de s’éteindre (en envoyant un signal sur le fil pilote).

Le fait que le script soit rattaché à un interrupteur est super pratique. Déjà cela permet de lancer le thermostat en 1 clic, mais surtout cela permet d’y associer des plannings, pour faire en sorte par exemple que le chauffage se coupe la nuit, qu’il se mette en route 1h avant votre retour du travail etc…

Quelles améliorations ?

Ce système a le mérite de fonctionner, je l’ai mis en œuvre tout cet hiver mais il existe plusieurs améliorations possibles :

  • utiliser un algorithme de régulation plus performant (thermostat à base de régulateur PID par exemple)
  • prendre en compte la gestion de plusieurs sondes/radiateurs par pièce (pour les grandes pièces)
  • fournir à l’utilisateur la possibilité de spécifier sa température souhaitée dans l’interface de Domoticz, plutôt que dans le script

Voilà, j’espère que cet article vous aura plu et vous donnera envie d’aller encore plus loin dans la domotique ! N’hésitez pas à partager vos pensées et questions dans les commentaires.

Tous les articles de la série Domotique

Domotique : Partie 5 – Implémenter un thermostat simple

49 réflexions au sujet de « Domotique : Partie 5 – Implémenter un thermostat simple »

  1. Merci pour ton tuto ! Je penche de plus en plus à remplacer ma vera par une solution à base de domoticz et seul la régulation du chauffage me laisse encore perplexe pour basculer.

    A voir ton article cela le rassure et je suis assez friand de tes conclusions sur les améliorations possibles.

    Ayant 6 zones actuellement en service est ce que tu penses que le rpi est suffisamment puissant pour les gérer ou faut il passer sur du plus costaud ?

    :)

  2. Bonjour

    Je réponds a Alex, je suis dans ton cas, j’ai acheté une veralite il y a environ 1,5 mois, puis j’ai decouvert domoticz il y a maintenant 1 mois…. Ouah ! je vais revendre ma veralite c’est sur. je joue toujours sur mon PI avec un XFRCOM en USB et une carte intégré Razberry. Pour gerer 6 zones a mon avis il n’y a aucun soucis, j’ai deja environ une 15ene de devices physiques et virtuel sous le PI et cela ne prends que 12% de CPU.

    Donc oui, domoticz est pratique, bien fait, beaucoup d’option que je decouvre tous les jours, et incroyablement plus ergonomique et plus puissant coté soft que la vera.

    Bon amusement :-)

  3. J’ai un petit raspberry depuis decembre, j’ai testé plusieurs solutions en zwave, et oui domoticz sur rasp c’est top.

    Pour le moment, je n’ai que 6 commandes de volet type dimmer, mais ca répond très bien. La gestion de heures de lever et coucher fonctionne super bien avec la possibilité de déclencher avant ou après avec un temps choisi.

    Je vais bientôt mettre des commandes de clim pour faire l’asservissement.

    Pour la puissance, je fais tourner xbmc dessus avec l’overclock au max et des dissipateurs thermiques.

  4. Bonjour, vous dites que le script s’exécute toutes les 40 secondes, es possible de changer ce délai ?
    Merci

  5. ah, mince je me rends compte que c’est déjà le cas dans ton script…

    seulement j’ai une erreur.. :/

    Fri Aug 29 18:22:21 2014 (rfx) Temperature + Humidity (home)
    Fri Aug 29 18:22:30 2014 Hardware Monitor: Fetching data (System sensors)
    Fri Aug 29 18:23:00 2014 Hardware Monitor: Fetching data (System sensors)
    Fri Aug 29 18:23:14 2014 LUA: — Gestion du thermostat pour le salon —
    Fri Aug 29 18:23:14 2014 Error: …vil1driver/domoticz/scripts/lua/script_device_thermo.lua:25: attempt to compare nil with number
    Fri Aug 29 18:23:14 2014 (rfx) Temperature + Humidity (salon)

  6. petit changement pour résoudre

    local temperature = string.sub(otherdevices_svalues[sonde],1,4) — Temperature relevée dans le salon

  7. ce qui nous remonte tout de même une erreur

    Error: …vil1driver/domoticz/scripts/lua/script_device_thermo.lua:26: attempt to compare string with number

  8. et pour finir ce qui fonctionne ici:


    -- Ce script permet de maintenir la température de salon entre 19°C et 21°C quand l'interrupteur
    -- virtuel 'Thermostat salon' est activé.

    --------------------------------
    ------ Variables à éditer ------
    --------------------------------
    consigne = 20 -- Température de consigne
    hysteresis = 1 -- Valeur seuil pour éviter que le relai ne cesse de commuter dans les 2 sens
    sonde = 'home' -- Nom de la sonde de température
    thermostat = 'thermostat' -- Nom de l'interrupteur virtuel du thermostat
    radiateur = 'radiateur salon' -- 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
    temperature = string.sub(otherdevices_svalues[sonde],1,4) -- Temperature relevée dans le salon

    -- On n'agit que si le "Thermostat" est actif
    if (otherdevices[thermostat]=='On') then
    print('-- Gestion du thermostat pour le salon -- ' .. temperature .. 'C')

    if (temperature string.format(consigne + hysteresis)) then
    print('Extinction du chauffage dans le salon')
    commandArray[radiateur]='On'

    end
    end
    end
    return commandArray

  9. Bonjour,
    et merci pour ces tutos.

    Tu suggères une régulation PID, mais ce n’est pas juste une amélioration du script: il te faudrait une sortie analogique vers un gradateur qui fait varier la puissance du radiateur.
    Même en application industrielle, on se contente souvent du très efficace on/off avec hysteresis comme tu fais.

  10. @Manuel, un gradateur n’est basé que sur du On/Off, il est aisé de reproduire un fonctionnement PID avec juste un module On/Off…

    tu devrais lire un peu plus sur le sujet je pense….

    ce script fonctionne mais n’est vraiment pas optimal avec des radiateurs à forte inertie.

    je suis en train de plancher sur un script type PID voir juste PI…

    dès que cela sera possible je vous ferai un retour.

  11. Bonsoir,

    Ok Oliv, tu veux dire n’envoyer toute la puissance que pendant une certaine proportion du temps je suppose?
    Quelle est la période à laquelle tu envisages les switch? Tu utiliserais le même type de module Chacon?

  12. Bonjour, oui les thermostats prgrammables du marché sont presque tous en PID ou PI, et il y a un cycle de quelques minutes, et en faisant varier le rapport cyclique, cela fait varier la puissance du radiateur. Ca marche sur de l’elec et aussi du gaz (pas de cycle pros petit qd meme). Mais helas pas sur le bois.
    Question, peut on commander les volet IO homecontrol (genre velux somfy ??). J’ai justement (par hasart un raspPI chez moi). J’aimerai en fait faire un thermostat multizone pour commander une chaudiere; la mettre en route en fonction de la t° de toutes les pieces, genre declenchement sur un minumum et ou une t° moyenne pondérée… et en + gerer les volets elec.

  13. Bonsoir,

    J’ai repris le script dans l’article et modifié quelques variables, jusqu’ici tout va bien. Mais à l’utilisation j’ai l’erreur suivante :

    Sun Nov 16 01:48:18 2014 Error: …omoticz/scripts/lua/script_variable_TemperatureSalon.lua:19: attempt to index global ‘devicechanged’ (a nil value)

    A savoir que mon script se lance via une variable utilisateur :

    — Alexandre DUBOIS – 2014
    — Ce script permet de maintenir la tempéture de salon entre 19°C et 21°C quand l’interrupteur
    — virtuel ‘Thermostat salon’ est activé
    ——————————–
    —— Variables àditer ——
    ——————————–
    local consigne = uservariables[« temperature »] –Tempéture de consigne
    local hysteresis = 0.5 –Valeur seuil pour éter que le relai ne cesse de commuter dans les 2 sens
    local sonde = ‘SALON’ –Nom de la sonde de tempéture
    local thermostat = ‘Thermostat_salon’ –Nom de l’interrupteur virtuel du thermostat
    local radiateur = ‘chauffage_salon’ –Nom du radiateur àllumer/éindre
    ——————————–
    — Fin des variables àditer —
    ——————————–

    commandArray = {}
    –La sonde Oregon ‘Salon’ emet toutes les 40 secondes. Ce sera approximativement la fréence
    — d’exétion de ce script.
    if (devicechanged[sonde]) then
    local temperature = devicechanged[string.format(‘%s_Temperature’, sonde)] –Temperature relevédans le salon
    –On n’agit que si le « Thermostat » est actif
    if (otherdevices[thermostat]==’On’) then
    print(‘– Gestion du thermostat pour le salon –‘)

    if (temperature (consigne + hysteresis)) then
    print(‘Extinction du chauffage dans le salon’)
    commandArray[radiateur]=’On’

    end
    end
    end
    return commandArray

  14. Bonsoir Dany,

    Je pense que ton problème vient du fait que le nom de ton script ne commence pas par « script_device » ce qui fait que le contexte d’exécution est différent (changement d’une variable utilisateur plutôt que changement d’état d’un périphérique) et donc la variable devicechanged n’existe pas dans ce cas là… Ton utilisation est cependant intéressante, en permettant de faire varier la température de consigne sans modifier le script. Si j’ai un peu de temps j’essaierai de réfléchir à comment combiner les deux :)

    Alexandre

  15. Bonjour,
    Merci pour votre blog qui est pour moi une véritable source d’inspiration.
    Je serais très intéressé par la partie saisie de la consigne depuis l’interface que vous citez en amélioration mais malgré mes recherches sur les différents forums, je n’ai pas trouvé de piste pour créer une zone de saisie.
    L’idéal serait un widget saisie qui écrit une variable mais je ne sais pas si c’est faisable.
    Merci pour votre retour.

  16. Bonjour Christophe,
    Je rêve moi aussi d’un moyen simple de pouvoir définir cette consigne depuis l’interface de Domoticz… Dès que je trouve quelque chose, soit sûr que je posterai à ce sujet :)
    Alexandre

  17. Bonjour Alex,

    Merci pour ta réponse, je te confirme que c’est bien le nom du script donc l’environnement qui n’était pas le bon.

    En ce qui concerne la température de consigne, j’essaie de mettre en place une consigne dynamique via une interface homme/machine simple. Le but étant que tout le monde puisse simplement piloter et programmer la température.

    Malheureusement domoticz ne permet pas de saisir via l’interface une température (via un interrupteur par exemple ou plus tot un slider ).

    Donc ma solution… roulement de tambour…

    J’ai installé « openremote » qui permet de générer des interfaces pour les devices –> MOBILE/WEB.

    Je suis en période de test sur cette solution, sur mon raspberry.

    Plate-forme : Raspberry Type A / RFXcom / domoticz / openremote

    Ma question du jour.

    Alex, quelle est la valeur du thermostat que tu positionnes sur tes radiateurs?

  18. Bonjour,

    depuis quelques jours/semaines, il existe la possibilité de créer dans Domoticz une consigne de température virtuelle (SetPoint temperature), depuis l’interface Matériel/Create Virtual Sensor, sur un matériel virtuel « Dummy » créé au préalable.

    Il se retrouve alors dans la partie Dispositifs, et on peut alors le rajouter grâce à la flèche verte habituelle, pour voir apparaître cette consigne dans la partie « Mesures ». L’intérêt est qu’il est possible de définir un planning pour cette consigne, et d’éditer sa valeur. J’espère que bientôt celà se transformera en slider

    Je songe de mon côté à modifier mes scripts pour tenir compte de cette nouvelle fonctionnalité. Jusqu’à présent j’avais placé mes consignes dans les UserVariables (une consigne confort à 20°, une consigne eco à 18° et une consigne vacances à 13°).

    David

  19. J’utilise une sonde db18b20. La température s’affiche bien dans domoticz mais le script ne fonctionne pas. Est ce que quelqu’un pourrai m’éclairer?
    Merci.

    Nom de script : script_device_Tp- Salon.lua

    __________________________________________________________________

    — Alexandre DUBOIS – 2014
    — Ce script permet de maintenir la température de salon entre 19°C et 21°C quand l’interrupteur
    — virtuel ‘Thermostat salon’ est activé.

    ——————————–
    —— Variables à éditer ——
    ——————————–
    local consigne = 20 –Température de consigne
    local hysteresis = 0.5 –Valeur seuil pour éviter que le relai ne cesse de commuter dans les 2 sens
    local sonde = ‘Tp Salon’ –Nom de la sonde de température
    local thermostat = ‘Chauffage auto’ –Nom de l’interrupteur virtuel du thermostat
    local radiateur = ‘Chaudiere’ –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
    local temperature = devicechanged[string.format(‘%s_Temperature’, sonde)] –Temperature relevée dans le salon
    –On n’agit que si le « Thermostat » est actif
    if (otherdevices[thermostat]==’On’) then
    print(‘– Gestion du thermostat pour le salon –‘)

    if (temperature (consigne + hysteresis)) then
    print(‘Extinction du chauffage dans le salon’)
    commandArray[radiateur]=’On’

    end
    end
    end
    return commandArray

  20. Pour régler facilement la température du thermostat depuis l’interface, j’ai ajouté deux virtual switch (bouton plus et bouton moins), j’ai mis un virtual temperature sensor et des scripts pour tout faire coller. Le bouton plus augmente le thermostat de 0.5°C. Ensuite j’ai changer les icônes pour que le bouton plus soit une flèche rouge vers le haut, et le bouton moins une flèche bleu vers le bas.

  21. Bonjour, quelqu’un a réussi à se servir du virtual sensor thermostat, j’ai réussi à l’installer mais je n’arrive pas a l’exploiter dans un script, si quelqu’un a un exemple de fonctionnement je suis preneur.

    Merci

  22. Bonjour, question bete comment faite vous pour editer de facon aisée les fichiers scriot. en ssh avec nano c’est vite fatiguant; et j’arrive pas a demarrer l’interface graphique (itou en connection a distance VNC). Merci

  23. bonjour,
    pour ce servir du virtual sensor thermostat :

    local consigne = tonumber(otherdevices_svalues[‘consignevirtuel’]) –Température de consigne virtuelle dans onglet meusures, Virtual Sensor, sur un matériel virtuel “Dummy”

    utilisation de otherdevices_svalues[‘xxxxxxxxx’] et tonumber pour convertir.

  24. Bonsoir,

    C’est quoi finalement le bon script svp ?

    Comment marche virtual sensor thermostat ? Comment le mettre en Place ?

    Merci

  25. Bonjour ALex,
    Encore merci pour ton partage d’information.
    J’ai personnelement utiliser le même principe pour fermer un volet lorsque la TV est alumée pour empecher le soleil d’éblouir l’écran.
    Dans un article, tu parles des detecteur NEST.
    Aurais-tu une idée comment utiliser les API-key.
    J’ai créé un compte chez nest pour disposer d’une clef mais je ne comprend pas comment utiliser les API.
    As-tu déjà essayé?

    Merci

  26. Bonjour,

    Je viens enfin de monter tous le dispositif et je tiens particulierement a remercier alexandre pour tous son tuto qui m’a été d’une grande utilité !

    Maintenant je coince aux niveaux du script Lua, je ne connais point ce language de programmation. Je cherche tous simplement a faire qu’en sorte entre telle et telle heure il y’ai minimum 19°C , ou 21°c.

    J’ai lu tout a l’heure d’un membre : « Je songe de mon côté à modifier mes scripts pour tenir compte de cette nouvelle fonctionnalité. Jusqu’à présent j’avais placé mes consignes dans les UserVariables (une consigne confort à 20°, une consigne eco à 18° et une consigne vacances à 13°). »

    J’aimerais en savoir d’avantage sur ce mode la ? comment le mettre en place ? Est ce un script ou autre ?

    MErci de vos lumiere !

  27. J’utilise le même genre de script sous Domoticz :), vraiment sympa.
    Vous me conseillez quoi comme hystérésis pour des bains d’huiles de 2000 watts ? Ils sont réglés sur la moitié, vu leur inertie je sais pas trop quel réglage est le plus économique.

    Pour l’instant ils s’éteignent au dessus de 19°C, et s’allument en dessous de 18,5. (chaque radiateur est réglé sur la moitié).

    merci beaucoup pour vos suggestions :)

  28. Bonjour,
    Ci-joint une version avec un thermostat (device créé depuis un Dummy hardware) :

    local hysteresis = 0.5
    local sonde = ‘Ambient Temp’
    local thermostat = ‘Thermostat’
    local pac = ‘PAC’
    local OFF =’Off’
    local ON = ‘On’
    commandArray = {}
    if (devicechanged[sonde] or devicechanged[thermostat]) then
    local temperature = devicechanged[string.format(‘%s_Temperature’, sonde)]
    if (temperature (otherdevices_svalues[thermostat] + hysteresis) and otherdevices[pac]==ON) then
    print(‘PAC Off’)
    commandArray[pac]=OFF
    end
    end
    return commandArray

  29. local hysteresis = 0.5
    local sonde = ‘Ambient Temp’
    local thermostat = ‘Thermostat’
    local pac = ‘PAC’
    local OFF =’Off’
    local ON = ‘On’
    commandArray = {}
    if (devicechanged[sonde] or devicechanged[thermostat]) then
    local temperature = devicechanged[string.format(‘%s_Temperature’, sonde)]
    if (temperature (otherdevices_svalues[thermostat] + hysteresis) and otherdevices[pac]==ON) then
    print(‘PAC Off’)
    commandArray[pac]=OFF
    end
    end
    return commandArray

  30. e-l-s-e-i-f (temperature > (otherdevices_svalues[thermostat] + hysteresis) and otherdevices[pac]==ON) then
    print(‘PAC Off’)
    commandArray[pac]=OFF

  31. Suite a la lecture de cette page et des commentaire.
    Je remercie tout le monde car cela m’a aider a faire un thermostat jour et nuit.
    En me basant sur le programme initial et en ajoutant 2 consignes virtuel, une pour le jour et une pour la nuit.
    Pour la mise en fonction il suffit de copier les lignes ci dessous dans nodepad++ et de l’enregistrer sous « script_device_thermostat-salon.lua »
    Belle journée.
    Frédéric

    — Alexandre DUBOIS – 2014 modifier par Lira Frédéric 2015
    — Ce script permet de maintenir la température par consigne virtuel quand l’interrupteur
    — virtuel ‘Thermostat salon’ est activé.
    — Une consigne de nuit a été ajouté.

    ——————————–
    —— Variables à éditer ——
    ——————————–
    local consigne = string.match(otherdevices_svalues[‘consigne_chauf_jour’], « (%d+%.*%d*) ») –Température de consigne jour
    local econuit = string.match(otherdevices_svalues[‘consigne_chauf_nuit’], « (%d+%.*%d*) ») –Température de nuit
    local hysteresis = 0.5 –Valeur seuil pour éviter que le relai ne cesse de commuter dans les 2 sens
    local sonde = ‘Ambiante’ –Nom de la sonde de température
    local thermostat = ‘Calendrier_chauffage’ –Nom de l’interrupteur virtuel du thermostat
    local radiateur = ‘chauf_test’ –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
    local temperature = devicechanged[string.format(‘%s_Temperature’, sonde)] –Temperature relevée dans le salon
    –On n’agit que si le « Thermostat » est actif
    if (otherdevices[thermostat]==’On’) then
    print(‘– Gestion du thermostat pour le salon –‘)

    if (temperature (consigne + hysteresis)) then
    print(‘Extinction du chauffage dans le salon’)
    commandArray[radiateur]=’Off’

    end
    end
    — On n’agit que si le « Thermostat » est inactif
    if (otherdevices[thermostat]==’Off’) then
    print(‘– Gestion du thermostat pour le salon –‘)

    if (temperature (econuit + hysteresis)) then
    print(‘Extinction du chauffage dans le salon’)
    commandArray[radiateur]=’Off’

    end
    end

    end
    return commandArray

  32. Bonjour,

    tout d’abord merci pour ce tuto.

    Etant novice en domotique, j’ai mis le script en place, comme décrit dans le tuto d’Alex, mais je me suis rendu compte que ma sonde relevait température et humidité (sonde everspring ST814), donc je l’ai remplacé par celui d’Oliv. J’ai tester le script sur http://www.lua.org/cgi-bin/demo, ca me donne cet erreur:input: 11: ‘)’ expected near ‘string’ et la je suis perdu…

  33. Bonjour,
    je traine souvent par ici, parce que je pompe toutes les idées et les réal pour mon propre chauffage, c’est à dire que j’aime bien ce site !
    En ce qui concerne les « thermostat PID », je crois que c’est pas possible avec des radiateurs électriques : ces radiateurs ne sont pas capables de faire du proportionnel (le P de PID) : ils chauffent ou ils chauffent pas (Tout ou Rien), mais ils ne savent pas « chauffer plus fort » ou « chauffer moins fort » (Proportionnel). Et donc, sauf super méga radiateurs électriques qui savent tout faire, pas de PID ! Au passage, ça veut dire que le script avec hystérésis, c’est le mieux qu’on puisse faire (et POMPER ! Merci !).
    Evidemment, avec un chauffage central (à eau), ça serait pas pareil, moi je parle de radiateurs électriques.
    Quelqu’un confirme ? éclair de compréhension ou de c… ?

  34. Bon, ben, après plusieurs mois (3 mois environ…), je crois qu’il est possible de créer une régulation PID avec des radiateurs électriques : la variation proportionnelle est prise sur le temps de chauffe : on fait varier la durée de chauffe pour créer la proportion ! trop fort. Evidemment, j’ai trouvé l’idée sur Internet.
    J’attend l’hiver prochain pour m’y coller sérieusement. Je reviendrais poster un lien ici.
    A bientôt
    GD

  35. Le principe du PID pour radiateur électrique, c’est celui qu’utilise apparemment ma plaque de cuisson à induction : pour les positions 1 à 10, elle fait varier le TEMPS de fonctionnement par cycle (d’une durée d’environ 1 seconde) de 10 à 100 %.

  36. Bonjour,

    Je me permet une petite remarque, si on éteins le thermostat lorsque cela ne chauffe pas le radiateur ne chauffera plus c’est ce que l’on veut, mais si on éteins le thermostat alors que cela chauffe…. le radiateur ne s’éteindra pas …. ouille ouille il va faire chaud.

    j’ai légèrement modifié ton script, en ajoutant un Dummy température de consigne pour l’afficher a l’écran et la modifier depuis le dashboard (je ne sais pas encore pourquoi mais cela ne fonctionne pas en plan)
    Je l’ai aussi rendu un peut moins personnel parce que je régule une salle de bain d’un coté et un bureau

    à coté j’ai un autre script qui par un appui sur un bouton (télécommande) force la consigne à 24°C pour une durée d’une heure.
    il est aussi possible également de modifier la consigne sur horloge pour avoir un éco/confort

    — Ce script permet de maintenir la ‘température’ d’une pièce mesurée par sonde à la température de ‘consigne’ quand
    — l’ ‘interrupteur’ virtuel est activé. Par action directe sur le ‘radiateur’ un module
    — ou prise télécommandée
    — destiné à être exécuté en Device

    — on n’a pas de retour de marche il va être difficile de vérifier que les ordres sont entrendus
    — Réflechir à comment observer les variations de températures pour relancer une commande au besoin
    — Sinon passer en temporisation et relances tant qu’on est en demande

    ——————————–
    —— Variables à éditer ——
    ——————————–
    local dummyconsigne = ‘Tcons-sdd’ –Température de consigne donnée par un dummy ‘température de consigne’
    local hysteresis = 0.5 –Valeur seuil pour éviter que le relai ne cesse de commuter dans les 2 sens
    local devicetemperature = ‘Dummy-Temp’ –Sonde de température
    local thermostat = ‘Commande-chauffage-sdd’ –Interrupteur virtuel permettant le fonctionnement
    local radiateur = ‘Chauffage-sdd’ –Nom du radiateur à allumer/éteindre
    ——————————–
    — Fin des variables à éditer —
    ——————————–

    commandArray = {}

    if (devicechanged[thermostat] or devicechanged[dummyconsigne] or devicechanged[devicetemperature]) then
    consigne=tonumber(otherdevices_svalues[dummyconsigne])
    temperature=otherdevices_temperature[devicetemperature]

    if (otherdevices[thermostat]==’On’) then

    if (temperature (consigne + hysteresis) and otherdevices[radiateur]==’On’) then
    print(‘Extinction du chauffage dans la salle de douche’)
    commandArray[radiateur]=’Off’ — Comme on n’a pas de retour de marche
    commandArray[0]={[radiateur]=’Off’} — on en envoie le signal 3 fois
    commandArray[1]={[radiateur]=’Off’}
    end
    end
    if (otherdevices[thermostat]==’Off’ and otherdevices[radiateur]==’On’) then
    print(‘Arret manuel du chauffage dans la salle de douche’)
    commandArray[radiateur]=’Off’ — Comme on n’a pas de retour de marche
    commandArray[0]={[radiateur]=’Off’} — on en envoie le signal 3 fois
    commandArray[1]={[radiateur]=’Off’}
    end
    end

    return commandArray

  37. Bonjour,
    En voulant m’inspirer de cet exemple j’ai une erreur tout de suite dans les logs.
    Du coup j’ai réduit au minimum, et j’ai toujours l’erreur : attempt to index a nil value (global ‘devicechanged’)

    je n’ai que ca dans le script :
    commandArray = {}

    if (devicechanged[‘Sonde extérieure’]) then
    local temperature2, hygro2= otherdevices_svalues[‘Sonde extérieure’]:match(« ([^;]+);([^;]+) »)
    print(« valeur 2 »)
    print(hygro2)

    end
    return commandArray

    Ce doit être sous mes yeux, mais je ne comprends pas ce qui bloque.
    En effet la sonde renvoi bien toutes les 15 minutes les 2 valeurs.

    Merci par avance.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *