J'utilise le serveur WES de Cartelectronic depuis plusieurs années maintenant: c'est un petit boitier qui vient s'intégrer dans le tableau électrique, et qui est capable de suivre toute la consommation d'énergie du foyer, qu'il s'agisse de l'électricité via la téléinfo ou des pinces ampère métriques, l'eau, le gaz, et bien d'autres choses. Un serveur extrêmement complet, qui se suffit à lui seul. Mais Home Assistant proposant un tableau d'énergie très bien fait, je voulais pouvoir intégrer le serveur WES sur ce système domotique. Ce guide vous aidera à faire la même chose.
Pré requis
Il faudra bien sûr disposer d'un serveur WES fonctionnel et connecté au réseau, ainsi que d'une installation Home Assistant fonctionnelle.
Avant toute chose, pour que mon fichier de configuration Home Assistant ne soit pas surchargé, j'ai découpé celui ci en plusieurs fichiers, chose prévue nativement par les développeurs. Nous aurons ici notamment deux fichiers:
- sensors.yaml , qui accueillera la configuration de tous les capteurs du WES
- customize.yaml , qui permettra de customiser ces capteurs pour qu'ils soient correctement reconnus par le tableau Energie de Home Assistant
Pour cela il suffit d'ajouter ces lignes dans le fichiers configuration.yaml si vous ne les avez pas déjà:
sensor: !include sensors.yaml
#Customisation de Home Assistant
homeassistant:
customize: !include customize.yaml
Création des capteurs du serveur WES dans Home Assistant
Le serveur WES ne propose malheureusement pas de connexion MQTT, bien que celle ci soit annoncée depuis plusieurs années déjà. Dommage, car cela nous aurait bien facilité la vie. Le WES met toutefois à disposition plusieurs fichiers permettant de lire les informations qu'il recueille. Le fichier le plus complet est sans doute le data.cgx, disponible à l'adresse http://IP_DU_WES/data.cgx . C'est celui que nous utiliserons pour éviter de jongler entre plusieurs fichiers.
Il regroupe toutes les informations utiles sous cette forme:
Il nous faut simplement déclarer les différentes informations voulues dans Home Assistant.
Pour cela, dans le fichiers sensors.yaml (à créer dans votre répertoire homeassistant si vous ne l'avez pas déjà), il nous faut déclarer la connexion au serveur WES:
- platform: rest
name: wesdata
#Remplacer par IP de votre WES
resource: http://IP_DU_WES/data.cgx
scan_interval: 60
method: GET
authentication: basic
#Remplacer par le nom utilisateur et mot de passe de votre systeme
username: admin
password: wes
json_attributes_path: "$.data"
json_attributes:
- "tic1"
- "tic2"
- "tic3"
- "impulsion"
- "pince"
- "temp"
- "relais"
- "entree"
- "analogique"
- "switch_virtuel"
- "variables"
value_template: 'OK'
Il faudra remplacer les champs en rouge, pour indiquer l'adresse IP du serveur WES, ainsi que le nom d'utilisateur et le mot de passe si vous n'utilisez pas ceux mis par défaut. Vous pouvez également modifier le “scan_interval” pour interroger le fichier plus ou moins souvent. Ici il est réglé pour l'interroger toutes les minutes, ce qui convient bien à la plupart des usages. Inutile de surcharger le serveur avec des appels répétés.
Viennent ensuite la déclaration des différents capteurs. Pour lire les informations du compteur électrique via la téléinfo, si vous êtes par exemple en abonnement heures pleines / heures creuses:
westic1hp :
friendly_name: "Index Heures Pleines"
unique_id: westic1hp
device_class : energy
unit_of_measurement: 'Wh'
value_template: >-
{{ states.sensor.wesdata.attributes["tic1"]["H_PLEINE"]| float }}
westic1hc :
friendly_name: "Index Heures Creuses"
unique_id: westic1hc
device_class : energy
unit_of_measurement: 'Wh'
value_template: >-
{{ states.sensor.wesdata.attributes["tic1"]["H_CREUSE"]| float }}
Vous pouvez personnaliser les champs “friendly_name” si vous le souhaitez: ce sont les noms qui apparaitront dans Home Assistant. Le reste ne doit pas être modifié.
Si vous êtes comme moi en abonnement Tempo, il y aura un peu plus de capteurs à créer:
#Si abonnement Tempo
westic1bleuhp :
friendly_name: "Index Heures Pleines Bleu"
unique_id: westic1bleuhp
device_class : energy
unit_of_measurement: 'Wh'
value_template: >-
{{ states.sensor.wesdata.attributes["tic1"]["BBRHPJB"] | float }}
westic1bleuhc :
friendly_name: "Index Heures Creuses Bleu"
unique_id: westic1bleuhc
device_class : energy
unit_of_measurement: 'Wh'
value_template: >-
{{ states.sensor.wesdata.attributes["tic1"]["BBRHCJB"]| float }}
westic1blanchp :
friendly_name: "Index Heures Pleines Blanc"
unique_id: westic1blanchp
device_class : energy
unit_of_measurement: 'Wh'
value_template: >-
{{ states.sensor.wesdata.attributes["tic1"]["BBRHPJW"] | float }}
westic1blanchc :
friendly_name: "Index Heures Creuses Blanc"
unique_id: westic1blanchc
device_class : energy
unit_of_measurement: 'Wh'
value_template: >-
{{ states.sensor.wesdata.attributes["tic1"]["BBRHCJW"]| float }}
westic1rougehp :
friendly_name: "Index Heures Pleines Rouge"
unique_id: westic1rougehp
device_class : energy
unit_of_measurement: 'Wh'
value_template: >-
{{ states.sensor.wesdata.attributes["tic1"]["BBRHPJR"] | float }}
westic1rougehc :
friendly_name: "Index Heures Creuses Rouge"
unique_id: westic1rougehc
device_class : energy
unit_of_measurement: 'Wh'
value_template: >-
{{ states.sensor.wesdata.attributes["tic1"]["BBRHCJR"]| float }}
On peut également récupérer les informations relatives à l'injection (si vous avez un contrat production d'énergie), la consommation instantanée, ou encore la tension:
westic1inj :
friendly_name: "Index Injection"
unique_id: westic1inj
device_class : energy
unit_of_measurement: 'Wh'
value_template: >-
{{ states.sensor.wesdata.attributes["tic1"]["INJECTION"]| float }}
westic1pap :
friendly_name: "Consommation Instantanée"
unique_id: westic1pap
device_class : apparent_power
unit_of_measurement: 'VA'
value_template: >-
{{ states.sensor.wesdata.attributes["tic1"]["PAP"]| float }}
westic1tension :
friendly_name: "Tension Consommation"
unique_id: westic1tension
device_class : power
unit_of_measurement: 'V'
value_template: >-
{{ states.sensor.wesdata.attributes["tic1"]["TENSION1"]| float }}
Chez moi je dispose d'un second compteur Linky, pour la revente de ma production solaire (contrat 100% revente). Le serveur WES étant également relié à ce compteur, je peux y récupérer les informations de ma production:
#Second compteur TIC utilisé ici pour la production photovoltaique
westic2prod :
friendly_name: "Index Production"
unique_id: westic2prod
device_class : energy
unit_of_measurement: 'Wh'
value_template: >-
{{ states.sensor.wesdata.attributes["tic2"]["PRODUCTEUR"]| float }}
westic2pap :
friendly_name: "Consommation Instantanée"
unique_id: westic2pap
device_class : apparent_power
unit_of_measurement: 'VA'
value_template: >-
{{ states.sensor.wesdata.attributes["tic2"]["PAP"]| float }}
westic2tension :
friendly_name: "Tension Production"
unique_id: westic2tension
device_class : power
unit_of_measurement: 'V'
value_template: >-
{{ states.sensor.wesdata.attributes["tic2"]["TENSION1"]| float }}
J'ai ajouté un autre capteur qui me permet d'avoir l'état des heures creuses: si westic1tarif = 1, alors nous sommes en heures creuses. C'est une donnée très utile dans les scénarios par exemple, pour déclencher certaines machines uniquement quand nous sommes au tarif économique :)
# Capteur pour déterminer si on est en heures creuses
westic1tarif :
friendly_name: "Tarif en cours"
unique_id: westic1tarif
value_template: >-
{{ states.sensor.wesdata.attributes["tic1"]["PTEC"] }}
wesheurecreuse :
friendly_name: "Heures Creuses"
unique_id: wesheurecreuse
value_template: >-
{% if "creuse" in states.sensor.wesdata.attributes["tic1"]["PTEC"].lower() %}
1
{% else %}
0
{% endif %}
En plus de la lecture Tic (téléinfo), le WES est également capable de suivre la consommation de 4 lignes électriques distinctes, grâce à des pinces ampère métriques. On peut par exemple suivre la consommation de son chauffe eau, de la borne de recharge de son véhicule électrique, du chauffage, etc. Il faudra utiliser ce code:
#Pinces ampere metriques pour suivre certains postes spécifiques
wespince1inst :
friendly_name: "Chauffe Eau Instantané"
unique_id: wespince1inst
device_class : current
unit_of_measurement: 'A'
value_template: >-
{{ states.sensor.wesdata.attributes["pince"]["I1"]| float }}
wespince1total :
friendly_name: "Chauffe Eau Total"
unique_id: wespince1total
device_class : energy
unit_of_measurement: 'kWh'
value_template: >-
{{ states.sensor.wesdata.attributes["pince"]["INDEX1"]| float }}
wespince1watt:
friendly_name: "Consommation Chauffe Eau"
unique_id: wespince1watt
device_class : power
unit_of_measurement: 'W'
value_template: >-
{{ (states.sensor.wesdata.attributes["tic1"]["TENSION1"] | float) * (states.sensor.wesdata.attributes["pince"]["I1"] | float) }}
Par défaut le WES ne remonte que la consommation instantanée en ampères, et l'index de consommation. Comme je voulais également avoir la consommation instantanée en watts, j'ai ajouté un petit calcul pour obtenir “wespince1watt”. Vous pouvez modifier les “friendly_name” pour utiliser un nom correspondant à votre usage. Si vous utilisez les 4 pinces possibles, il suffit de dupliquer ce code (je vous le fourni complet dans le fichier à télécharger plus loin).
Le serveur WES dispose aussi de compteurs à impulsions, qui peuvent être utilisés pour différentes choses, comme le suivi de consommation d'eau ou de gaz par exemple. Chez moi le premier capteur est utilisé pour suivre mon compteur d'eau:
#Capteurs impulsion, utilisés par exemple pour eau ou gaz
wesimpulsion1 :
friendly_name: "Compteur Eau"
unique_id: wesimpulsion1
device_class : water
unit_of_measurement: 'L'
value_template: >-
{{ states.sensor.wesdata.attributes["impulsion"]["INDEX1"]| float }}
Selon votre usage, il faudra personnaliser le nom, mais également le “device_class” et le “unit_of_measurement”. Vous trouverez une définition des différentes valeurs possibles ici.
D'autres informations peuvent être récupérées, selon ce qu'on a connecté au WES. Il existe notamment le relevé de température (jusqu'à 30 sondes !) via ce code:
#Sondes de température, possible jusqu'à 30
wessonde1 :
friendly_name: "Salon"
unique_id: wessonde1
device_class : temperature
unit_of_measurement: '°C'
value_template: >-
{{ states.sensor.wesdata.attributes["temp"]["SONDE1"]| float }}
Ou encore l'état des relais:
#Relais
wesrelai1 :
friendly_name: "Relai 1"
unique_id: wesrelai1
value_template: >-
{{ states.sensor.wesdata.attributes["relais"]["RELAIS1"]| float }}
wesrelai2 :
friendly_name: "Relai 2"
unique_id: wesrelai2
value_template: >-
{{ states.sensor.wesdata.attributes["relais"]["RELAIS2"]| float }}
Nous avons également des entrées analogiques, des switchs virtuels, ou encore des variables.
Vous trouverez le code complet dans ce fichier, avec la bonne indentation, et des commentaires pour vous y retrouver.
A ajuster en fonction de vos besoins, bien sûr. Pour ma part je n'utilise que les deux compteurs TIC, les 4 pinces ampère métriques, et un compteur à impulsion.
Une fois votre configuration enregistrée, il faudra se rendre dans “Outils de Développement”, puis cliquer sur “Vérifier la configuration” pour s'assurer qu'il n'y a pas de problème dans la syntaxe des fichiers.
Si tout est bon, il ne reste plus qu'à cliquer sur redémarrer.
Une fois Home Assistant redémarré, si vous allez dans Paramètres / Appareils et Services / Entités, en tapant “wes” dans la barre de recherche, vous devriez trouver tous les capteurs créés pour le WES:
A partir de là vous pouvez les utiliser pour déclencher des scénarios, créer des tableaux de bord de suivi de consommation, etc.
MAIS pas encore les utiliser dans le tableau de bord Energie de Home Assistant.
Intégrer le WES au tableau Energie de Home Assistant
Le tableau de bord Energie de Home Assistant est vraiment très bien fait. Mais il n'accepte que les index ou les compteurs de consommation totaux. On pourrait se dire que c'est bon pour le WES, puisque nous avons bien créé des capteurs pour les index. A ceci près que pour apparaitre dans la liste des périphériques compatibles du tableau de bord Energie, ces capteurs doivent posséder un argument de type “state_class : total”. Si cet argument peut être mis directement dans la configuration de capteurs MQTT, ce n'est pas le cas des capteurs créés ici pour le WES, puisque nous sommes dans le cadre d'appels REST et non MQTT.
Heureusement on peut modifier la déclaration des capteurs dans un fichier customize.yaml, en ajoutant ce type de code pour chaque capteur représentant une consommation totale:
sensor.westic1bleuhp:
state_class : total
device:
identifiers: "Serveur WES"
name: "Serveur WES"
model: "WES"
manufacturer: "Cartelectronic"
Je vous laisse mon fichier complet ici:
Il suffit de le placer dans le répertoire homeassistant, puis de redémarrer une nouvelle fois Home Assistant (après avoir vérifié que le code est ok).
On peut alors enfin ajouter nos différents index sur le tableau de bord Energie, que ce soit pour la téléinfo, la conso, la production, la consommation d'eau, etc.
Après quelques temps nous avons notre suivi de consommation, avec ici le détail heures creuses et heures pleines (en bleu plus clair). J'ai également le suivi de ma production photovoltaïque en jaune:
De la même manière je retrouve le suivi de consommation de mon chauffe eau, parmi les autres appareils individuels:
Et voilà !
Conclusion
Migrant peu à peu mon système domotique sur Home Assistant, j'ai cherché pas mal de temps comment intégrer mon serveur WES, car contrairement à Jeedom, il ne dispose pas de plugin prêt à l'emploi sur Home Assistant. Différents sujets en traitent, notamment:
- un post sur le forum du fabricant du WES, Cartelectronic
- un post sur le forum HACF
La documentation Home Assistant permet également de mieux comprendre le fonctionnement des capteurs REST.
Une compatibilité native MQTT aurait beaucoup facilité les choses, mais finalement nous arrivons à récupérer toutes les données du WES, parfaitement exploitables dans Home Assistant, c'est le principal. L'intégration fonctionne chez moi depuis un peu plus d'un mois maintenant, et aucun problème à signaler. J'arrive à exploiter mon WES, ce qui m'évite de devoir multiplier les capteurs, puisqu'il gère énormément de choses nativement. Si ce guide peut en aider certains qui comme moi cherchaient comment faire !
Bonjour,
Merci beaucoup pour ce tuto très pratique :-)
Bonjour. Content que ca ait servi !
Un grand merci Cédric pour cet excellent travail qui m’a permis de remonter toutes les infos de mon WES sur Home Assistant ( sur lequel je débute ). En personnalisant vos fichiers customize et sensor, j’ai tout récupéré à l’exception de l’état des relais ( je suppose que ce n’est que la visu de leur état ?) pour lesquels HA m’indique “indisponible” J’ai du louper quelque-chose vu que je ne maitrise pas bien HA. Je m’interroge également sur la manière de piloter ces relais avec HA avec les commandes ( par ex: http://admin:wes@wes/RL.cgi?rl1=OFF&rl2=OFF).
Cordialement, Thierry
Salut et merci aussi pour le tuto bien complet qui m’a permis de facilement récupérer les info aux quelques erreur d’indentations pres dans les yaml.
Pour répondre à Thierry: il se peut que vos sensor relais affichent indisponible car dans l’exemple fournis, on s’attends à trouver une valeur 0 ou 1 dans le lu data.cgx hors (je ne sais si cela a changé entre l’exemple et les évolution du firmware du wes) désormais l’état des relais est plutot une string ON ou OFF.
De manière analogue à trouvé dans l’exemple, j’ai adapté pour retourner 0 ou 1 en fonction de la string ON ou OFF du xml:
wesrelais1:
friendly_name: “Relais HC”
unique_id: wesrelais1
value_template: >-
{% if “on” in states.sensor.wesdata.attributes[“relais”][“RELAIS1”].lower() %}
1
{% else %}
0
{% endif %}
En espérant que ca serve.