Eedomus Scripts

Le thermostat intelligent pour eedomus

tlearne
Avec l’arrivée des thermostats intelligents tels que celui de Nest notamment, je me suis demandé comment intégrer cette intelligence dans l’eedomus, sans être obligé d’en acheter un pour chacune des zones de chauffage de l’habitat.

Alors, j’ai réfléchi à une méthode de calcul des phases de présence, d’absence, et à un calcul des consignes de température associées le plus adapté. De là est né un ensemble de règles eedomus et de scripts en php/mysql, nommé thermoLearn.

Logo thermoLearn

Le thermoLearn, dans sa version béta actuelle, doit permettre de gérer l’apprentissage de trois zones de chauffage et de restituer automatiquement les consignes de température les plus adaptées aux habitudes du foyer, en fonction des jours de la semaine, et des saisons.

Il est sans doute très perfectible et toutes les suggestions d’optimisation et d’amélioration sont les bienvenues. En voici les principes :

  • Le système a pour objectif final de fixer des consignes de température de manière autonome, de 1 à 3 consignes maximum.
  • Les parties « puissance/commutation » des chauffages ne sont pas gérées via le système d’apprentissage. Celui-ci ne fournit que les consignes de température au système « puissance », qui peut donc être hystérésis ou PID, ou DIY.
  • Le thermostat intelligent doit apprendre en continue en fonction des consignes fixées, soit manuellement, soit par règles existantes ou soit par lui-même.
  • Il a besoin d’un détecteur de présence par zone définie.
  • Il apprend en continue, même si ce n’est pas lui qui est utilisé pour fixer la consigne au final.

Il faut déterminer un mode de gestion : Manuel / Programmation / Intelligent.
[highlight bgcolor= »#dea52c » txtcolor= »#ffffff »]1 Manuel : les consignes sont fixées exclusivement par l’utilisateur, manuellement (Portail ou Mobile).

[highlight bgcolor= »#dea52c » txtcolor= »#ffffff »]2 Programmation : les consignes sont fixées par vos propres programmations (ou par autre thermostat intelligent type Nest/Netatmo).

[highlight bgcolor= »#dea52c » txtcolor= »#ffffff »]3 Intelligent : c’est le thermoLearn qui fixe les consignes toutes les heures.

  • En mode Intelligent, il est bien entendu possible de fixer la consigne manuellement en cas de besoin. Dans ce cas le mode passe automatiquement en mode Manuel pendant 3h, pour revenir ensuite automatiquement en mode Intelligent.
  • En cas de longue absence pour chacune des zones respectives, la consigne passe en éco au bout de 18h d’absence, et en mode hors-gel au bout de 36h d’absence.

Schéma ThermolLearn

 

[highlight bgcolor= »#2c97de » txtcolor= »#ffffff »]Mise en place

Prérequis :

  • Une box Eedomus
  • Une base de données Mysql (testé sur NAS Synology et QNAP)
  • Un serveur php (testé sur NAS Synology et QNAP)
  • Les sources téléchargeables
  • Un détecteur de présence par zone de chauffage pilotée

Les sources

 

Installation de la base de données :

  • Se connecter à l’interface de la base de données avec phpMyAdmin par exemple
  • Créer une base de données avec l’encodage « utf8_genral_ci ». Dans mon cas je l’ai appelée « thermoLearn »
  • Création des tables à l’aide du fichier « ddl.sql » présent dans les sources précédemment téléchargées
  • Vous aurez alors 7 tables créées, dont la table « zone » pré-alimentée de 3 lignes.

 

Installation de l’application sur un serveur PHP :

  • Placer les sources sur votre serveur PHP et noter le chemin d’accès. Dans mon cas ce sera : http://XXX.XXX.X.XXX/thermoLearn/
  • Ensuite ouvrez le fichier « parametres.php » qui se trouve dans le répertoire « sources » puis renseigner vos paramètres.
  • Notez y vos codes API, obligatoire pour les interactions avec l’eedomus.
  • Notez la température de consigne par défaut (ex : 19.00). Cette consigne par défaut est restituée lorsque le système est en mode intelligent, mais avec un apprentissage considéré encore comme insuffisant.
  • Notez la température de consigne économique, positionnée après 18h d’absence.
  • Notez la température hors-gel, positionnée après 36h d’absence, sans le zéro de tête (ex : 9.00).
  • Laissez le paramètre $Representativité à 1, il indique au système de restituer une consigne automatique dès le premier apprentissage réalisé.
  • Pour le paramètre $api_param, il s’agit d’indiquer le code API du nouvel état virtuel qu’il faut créer de la manière suivante dans l’outil de configuration eedomus :

Logo Param

Etat Paramètres

Cet état virtuel eedomus permet de paramétrer les états de consignes et détecteurs de présence utilisés par l’application. Il doit être invisible de l’interface, le type de données est « Liste de valeurs ». Indiquez le code API de l’état (ici caché en rouge) pour la donnée $api_param du fichier parametres.php. Nous verrons pour les valeurs de l’état virtuel eedomus plus tard.

 

[highlight bgcolor= »#2c97de » txtcolor= »#ffffff »]Installation eedomus

Mode de gestion

  • Créer un état virtuel avec trois valeurs : 0 – Manuel, 1 – Programmation, 99 – Intelligent, et une macro invisible « Manuel 3h ».

Icones Mode

Etat Mode

Valeur Mode

Macro Mode

Si vous avez déjà mis en place votre propre système de programmation de thermostat sous eedomus, utilisez cet état « Mode de gestion » en tant que critères de vos règles existantes pour n’autoriser la fixation de consigne que lorsque le mode est « Programmation ». Utilisez également vos propres règles existantes pour fixer la ou les consignes thermoLearn correspondantes dont le format est expliqué ci-après.

 

Consignes thermoLearn

  • Créez un état virtuel de la façon suivante, et notez bien le code API. Faites autant d’état que de consignes réelles à piloter (zones de chauffages), 3 au maximum sur cette version du système. Une saisie complète est longue et laborieuse, alors commencer par la première consigne pour dupliquer ensuite pour les autres zones.

Logo Zone

Etat Zone

Pour les valeurs, il faut absolument respecter le formalisme suivant :

  • La valeur 0, de description « 0 °C » est obligatoire, mais à masquer. Il y a un espace obligatoire entre 0 et °C.

Logo valeur 1

  • Les consignes saisissables manuellement par l’utilisateur,  ou fixées par vos règles existantes de programmation, doivent être visibles et paramétrées de la façon suivante : valeur = température sans unité, description = valeur °C
  • Pour les valeurs manuelles, il est aussi possible de saisir une décimale comme ceci : valeur = 20.5, description = 20.5 °C
  • Etant donné qu’il s’agit de sélection manuelle de consigne, il n’est pas nécessaire d’en multiplier le nombre inutilement.

Liste Valeur 1

 

 

Logo Valeurs 2

  • Les consignes définissables automatiquement par le système sont numérotées à partir de 100 de la manière suivante : exemple, valeur = 119, description = 19
  • Il ne faut pas indiquer d’unité. Les valeurs sont à masquer (car ne doivent pas être sélectionnables manuellement).
  • Il faut définir toutes les valeurs du minimum possible (9 dans notre cas) à 16, de un en un, puis de 16.5 au maximum possible (25 dans notre cas), de 0.5 en 0.5. En effet, le système fixe la consigne à 0.5 près. En dessous de 16, il arrondit à l’unité par simplification.

Liste valeurs 2

 

 

Logo valeur 3

  • Les consignes définissables automatiquement, avec connaissance de la consigne future sont numérotées à partir de 200 de manière incrémentale libre. En revanche la description doit être égale à la consigne actuelle et la consigne future séparées par un trait d’union : exemple, valeur = 210, description = 20-22
  • Il ne faut pas indiquer d’unité. Les valeurs sont à masquer (car ne doivent pas être sélectionnables manuellement).
  • Vous définissez les valeurs que vous souhaitez. Si la valeur n’a pas été créée, le système affichera la consigne unique (de valeur entre 100 et 200, voir plus haut).
  • Dans le système, les consignes sont définies par phase d’au moins 3h. Cet affichage permet de donner la consigne actuelle, ainsi que l’éventuelle consigne de la phase suivante.

Liste valeurs 3

 

 

Règles de changement de mode de gestion

Les nouvelles règles suivantes vont gérer la gestion du mode lors d’une modification manuelle de la consigne :

Regle Mode 1

Rajoutez les éventuelles autres consignes #2 et #3 dans les clauses « OU » de tête, sur le même modèle. On précise la source « Portail » ou « Portail Mobile », car on ne veut pas que le mode de gestion change lorsque c’est le système thermoLearn qui modifie lui-même la valeur (la source est API pour thermoLearn).

 

La règle suivante permet de relancer la macro si une nouvelle consigne est définie par l’utilisateur :

Regle Mode 2

Une fois le délai terminé, le système repart en mode intelligent et fixera alors les futures consignes.

 

 

Consignes de température en °C

Pour faire fonctionner votre système de chauffage (PID ou Hysteresis), il faut au final fixer de réelles consignes de température en degré. Si vous en avez des déjà existantes pour votre système, alors notez simplement leur code API respectif.

Si vous utilisez la programmation PID « Zone de Chauffage » d’eedomus, il vous faut récupérer le code API de la consigne en passant obligatoirement par l’interface, en cliquant sur le titre/lien « Consigne de Zone de Chauffage ». En effet, en passant par l’écran de configuration, vous ne pourrez pas accéder à ce paramètre.

 

Consigne temp 1

[highlight bgcolor= »#de2c2c » txtcolor= »#ffffff »]Attention, il faut autant de valeurs de consigne de « Zone de Chauffage » que de valeurs de consignes thermoLearn automatiques possibles (celles de valeur 100 à 199). Rajoutez les valeurs manquantes via l’onglet valeur de votre programmation « Zone de Chauffage », ou directement depuis l’affichage ci-dessus de la consigne. Les valeurs décimales doivent être saisies avec un « . », exemple :  20.5

Une fois les valeurs manquantes ajoutées et après avoir vérifié que le système fonctionne bien, vous pourrez rendre cette consigne invisible dans la mesure où la consigne thermoLearn fait déjà le job d’affichage et de contrôle.

Consigne Temp 2

Si vous n’avez encore de consignes réelles et si vous n’utilisez pas la programmation « Zone de Chauffage », créez-les de la manière suivante :

Etat Consigne Temp

Cet état sera invisible car il s’agit en définitive de la répercussion de la valeur définie par l’état Consigne thermoLearn créé précédemment. Vous pourrez alors utiliser ces consignes de température pour gérer ensuite vos propres règles de commutation de vos radiateurs ou chaudière.

Dupliquez cet état pour chacune de vos zones (3 maximum). On a donc autant de consignes thermoLearn avec liste de valeurs, que de consignes de température en °C.

 

Règle de synchronisation des consignes thermoLearn / consignes en °C

Il nous faut au préalable un « actionneur http » eedomus pour exécuter les différents scripts de thermoLearn (entre autres, dans le cas où vous avez déjà plusieurs scripts appelables dans votre système). Mon actionneur s’appelle « Scripts PHP » de la pièce « Technique », j’y retrouve tous mes appels de scripts php, comme son nom l’indique :

actionneur

Respectez bien les noms et majuscules des scripts php, afin d’éviter les erreurs à l’exécution (http 404).

Dans cet actionneur, créez maintenant une macro permettant d’exécuter à la suite l’import, l’apprentissage et la mise à jour de la consigne intelligente :

Macro thermolearn

 

Quelque soit votre type de consigne réelle (existante, nouvelle, ou zone de chauffage), la nouvelle règle suivante va automatiquement synchroniser les consignes thermoLearn avec des consignes de températures réelles grâce à un script php. On exécute la synchronisation des états avec « Set Consigne Eedomus » de notre actionneur de scripts.

setConsigne

Règles d’import, d’apprentissage et de définition de consignes 

L’exportation des données des états de présence et de consigne est réalisée trois fois par jour via la règle suivante et le script « Export données ThermoLearn ». Il faut les trois remontées quotidiennes pour éviter la perte d’historique (en fonction de votre abonnement eedomus), et pour éviter d’être considéré en longue absence à tort (consigne économique) :

tml-rgl-import

L’apprentissage est réalisé une fois par jour, à 1h du matin, via le script « Apprentissage thermoLearn » :

Apprentissage

Les consignes sont définies toutes les heures et 2mn, via le script « Consigne thermoLearn », seulement si le mode de gestion est « Intelligent » bien évidemment :

Consignes

 

Après un un mode manuel temporaire (ajustement de la consigne automatique), il faut, avant retour au mode intelligent, que la consigne manuelle soit instantanément importée et apprise avant que le système ne refixe la consigne automatiquement. On ajoute donc la règle suivante :

 

Règle thermolearn

 

Paramètres finaux

On revient sur votre état virtuel « Paramètres thermoLearn », pour y saisir les valeurs. Respectez bien le format des valeurs et des descriptions pour que les paramètres soient bien lus par le système.

L’ordre est le suivant :

  • 0 – Mode de gestion : Mettre le code API de l’état « Mode de gestion thermoLearn ». Il faut un espace obligatoire entre le code API et le trait d’union qui suit. Ensuite le libellé est libre, il est juste proposé ici pour vous rappeler à quoi correspond le code API.
  • 1 : Saisir le libellé libre de votre première zone de chauffage.
  • 2 : Mettre le code API du détecteur de présence de la zone 1 (idem espace obligatoire ensuite)
  • 3 : Mettre le code API de la consigne thermoLearn de la zone 1 (idem espace obligatoire ensuite)
  • 4 : Mettre le code API de la consigne de température de la zone 1 (idem espace obligatoire ensuite)
  • Vous pouvez répéter 1-2-3-4 en 5-6-7-8 pour une deuxième zone, puis 9-10-11-12 pour une troisième zone.
  • Vous pourrez éventuellement changer le détecteur utilisé même si l’apprentissage est déjà commencé.

liste param

 

Usage conseillé :

L’installation est maintenant terminée. Voici comment utiliser le système.

[highlight bgcolor= »#dea52c » txtcolor= »#ffffff »]Si aucune programmation propre de consignes n’existe

  • Sélectionnez le Mode de Gestion Manuel
  • Sélectionnez manuellement les consignes thermoLearn souhaitées à l’instant t dans chaque zone : au moment où vous vous levez, au moment où vous partez, au moment où vous allez vous coucher, etc.
  • Au bout de deux semaines, passez le Mode de Gestion à Intelligent.
  • Ajustez manuellement les consignes thermoLearn tant que les prédictions ne vous satisfont pas suffisamment.

 

[highlight bgcolor= »#dea52c » txtcolor= »#ffffff »]Si une programmation propre existe

  • Sélectionnez le Mode de Gestion Programmation (NB : Votre programmation personnelle doit prévoir de fixer elle-même les valeurs de consignes thermoLearn pour que l’apprentissage se fasse).
  • Au bout de deux semaines, passez le Mode de Gestion à Intelligent tout en conservant la mise à jour de consignes thermoLearn par votre programmation. Ajustez manuellement la consigne thermoLearn tant que les prédictions ne vous satisfont pas suffisamment.
  • Si vous le souhaitez, interrompez la mise à jour des consignes par votre programmation en ajoutant le critère de Mode de Gestion Programmation comme déclencheur des règles.

Au fil des jours d’apprentissage et d’ajustements manuels, les températures s’affineront et vous aurez de moins en moins besoin de modifier manuellement les consignes.

 

Si vous n’avez pas encore confiance au système (je peux vous comprendre), n’associez pas encore vos réelles consignes de température (celles utilisées réellement pour la gestion de votre chauffage) aux consignes thermoLearn. Préférez dans un premier temps créer de nouveaux états de consignes de température, et précisez leur API respective dans l’état « Paramètres ». La synchronisation « setConsigneEedomus » fonctionnera alors, sans impacter vos réelles consignes de chauffage.

 

A noter

  • Je vous conseille de vérifier vos paramètres en exécutant le script thermoLearn/sources/control.php, et dès lendemain, vérifiez le bon fonctionnement de l’import en vous assurant que vos tables « presence » et « consigne » ne sont pas vides.
  • Dans le dossier sources/icons, il y a des icônes prêtes pour les valeurs de consigne thermoLearn, vous avez pu en apercevoir la forme dans l’article. L’idée étant de n’afficher que l’icône en mode plan, à l’instar d’un Nest. Le fichier PSD est également mis à disposition pour ceux qui souhaitent enrichir ou personnaliser leurs icônes.
  • Non spécialiste en programmation, le code n’est pas du tout optimisé, donc désolé d’avance. S’il y a des motivés pour optimiser, c’est libre. Merci à Pacific_boy, auquel j’ai emprunté le squelette initial des sources.
  • Il se peut qu’il y ait des bugs ou des erreurs de conception, donc n’hésitez pas à partager sur une revue du système d’apprentissage.
  • S’il y a des motivés en capacité de fournir des graphes bootstrap, n’hésitez pas. Il serait intéressant d’afficher le résultat des consignes calculées par l’apprentissage, par phase, par jour, et par saison.
  • Volontairement, l’apprentissage est continue sans s’arrêter lors par exemple des longues absences (grandes vacances, activation alarme plusieurs jours…). Fonctionnant par moyenne de présence et moyenne de consigne, ça ne devrait pas être impactant, surtout l’été où on ne chauffe pas trop.
  • Je n’assure pas que vous ferez des économies et que vous améliorerez le confort, c’est un premier test du système, une version beta. L’objectif étant justement de trouver et optimiser l’équilibre entre confort et consommation d’énergie. Il faudra des retours d’expériences pour identifier sa réelle efficacité.
  • Deux scripts php supplémentaires, dans le dossier sources, permettent de purger l’historique de plus de deux ans des présences et consignes importées dans la base (purgeHisto.php), ou de remettre à zéro l’apprentissage déjà réalisé (resetLearn.php). Pour ce dernier, l’apprentissage reprend donc à zéro, en attente de nouvelles données de présence et de consignes.
  • Assurez vous bien que toutes les valeurs de consignes existent bien dans votre état : de 9 à 16°C (de 1 en 1), et de 16.5 à 25, tous les 0.5°C. Lorsque la valeur n’existe pas, la consigne intelligente calculée n’est pas prise en compte. Idem du côté des valeurs de zones de chauffage.

Interface

J’espère que ce petit système, à défaut d’être optimal, vous apportera un petit côté ludique et une plus grande autonomie dans la gestion de vos zones de chauffages. L’objectif étant bien de ne plus se soucier de rien.

Bon courage à ceux qui se lancent dans l’installation du système, n’hésitez pas à partager dans les commentaires.

 

A propos de cet auteur

Influman

Influman

Élevé à la cassette VHS, à l'Amstrad et au Walkman qui ne savait pas rembobiner, je regarde avec fascination les évolutions technologiques des dernières années. J'essaye autant que possible d'en profiter au quotidien et pourquoi pas d'en apporter mes contributions en aidant ou bidouillant, ici ou là, avec un peu d'obstination et beaucoup de plaisir.

  • Pingback: Le thermostat intelligent pour eedomus | Blog Domotiks()

  • Damien

    Salut,

    Merci beaucoup pour ce partage.
    Apparemment tu t’ai inspiré de mon script pour « importEedomus.php » mais tu n’as pas pris la dernière version qui corrige des bugs. Je te conseil donc de le mettre à jour car certaine personnes ont rencontrées des soucis notamment quand on a pas l’abonnement premium.

    Cette partie entre autre fonctionnait mal :

    // Positionnement sur le dernier import
    if($dateFinDernierImport == «  » || ($premiereOccurenceTrouve == « false » && $dateFinDernierImport <= $historique[1])) {
    $premiereOccurenceTrouve = "true";
    }
    // Un fois en position, recuperation de la valeur
    if($premiereOccurenceTrouve == "true") {

    Bonne journée !

  • Influman

    Oui, très inspiré pour l’import c’est sûr.
    Ok thx. Je corrige le package en fonction.

  • sli

    Bonjour.
    Peux tu mettre un peu de détails sur l’algorithme d’apprentissage et celui de la restitution automatique de la consigne de température en fonction des jours de la semaine, et des saisons

  • Influman

    Bonjour,

    Je peux tenter d’expliquer grossièrement.

    Pour l’apprentissage d’une zone définie :
    – Le système récupère les horaires de présence en fonction des mouvements détectés par le capteur associée à la zone
    – Ces horaires sont arrondis à l’heure.
    – S’il y a moins de 2h d’absence entre deux présences, alors les phases sont rejointes et l’absence non prise en compte.
    – Au final, on obtient des phases de présences et d’absences moyennes par jour et par saison, sachant qu’une saison est juste un cumul de trois mois.
    – A chaque remontée d’informations de présence, les phases s’ajustent avec un recalcul par moyenne.
    – Pour recalculer cette moyenne de début et de fin de phase, on s’appuie sur des phases de début de présence pré-définies, toutes les 3h dans la journée, et toutes les 2h la nuit.
    – Ensuite, les remontées de consigne sont toutes conservées, quelque soit leur source (manuel, programmation, auto), et, pour chaque phase donnée de présence/absence, on calcule la moyenne des consignes dans cette phase.
    – On obtient à la fin une grille de phases et de consignes moyennes par jour et par saison, avec une représentativité, c’est à dire un poids de pertinence pour la donnée, calculé en fonction du nombre de consignes apprises ayant déterminé cette moyenne.
    – La nuit, la dernière moyenne de consigne fixée en présence est conservée pour les absences qui suivent. En effet, quand on dort, on ne bouge pas, ce qui peut faire croire à une nouvelle phase d’absence pour laquelle il n’y aurait pas de consigne connue.

    Au moment de la fixation de consigne automatique :
    – le système regarde s’il trouve une valeur de consigne dans la grille (horaire/jour/saison) avec le représentativité souhaitée (paramètre fixé à 1 par défaut, donc toujours représentatif) et fixe la consigne alors pour le chauffage géré dans l’eedomus
    – s’il ne trouve pas de consigne, il cherche une consigne dans la grille (horaire/jour/total). Total étant la moyenne de consigne de cette phase, quelque soit la saison.
    – s’il ne trouve toujours pas, il fixe la consigne par défaut (paramètre initial à 19°C)

    Voilà, j’espère que c’est clair.

  • sli

    Clair, très intéressant et très bien pensé ton algo. Merci pour les détails.