bokub / ha-linky

📊 Home Assistant add-on for Linky smart meters
MIT License
145 stars 8 forks source link

Installation sur non-HAOS #17

Closed julienc23 closed 6 months ago

julienc23 commented 6 months ago

Bonjour et merci pour ce travail!

Nous sommes nombreux à utiliser Home Assistant sur des installations "custom" donc en dehors de HAOS ou Home Assistant Supervised donc il est impossible d'utiliser les add-ons.

Est-il possible de documenter l'installation sur ce type de déploiement ?

Merci

bokub commented 6 months ago

Salut,

Malheureusement il n'y a pas d'alternative au système d'add-ons pour installer HA Linky

Bonne journée

julienc23 commented 6 months ago

En général l'alternative c'est une méthode d'installation "manuelle", ça existe pour pas mal d'add-on.

bokub commented 6 months ago

T'as des exemples ?

julienc23 commented 6 months ago

Pour MQTT par exemple : https://www.youtube.com/watch?v=7bJnzKhEZbA

bokub commented 6 months ago

Oui effectivement, ça pourrait être un conteneur Docker qui tourne à côté de Home Assistant et qui communique avec l'API websocket de Home Assistant, mais ça nécessiterait un peu de travail car il faudrait gérer:

julienc23 commented 6 months ago

En effet, je ne connais pas bien cette interaction configuration et authentification et j'imagine que c'est le gros avantage de l'add-on. Mais ça serait vraiment bien de pouvoir offrir ce mode d'installation pour tous les gens qui ont HA installé sur autre chose que la version packagée. Si je peux aider en quoi que ce soit, n'hésite pas.

bokub commented 6 months ago

Si tu veux, tu peux déjà essayer de lancer l'image Docker en mode standalone à partir du Dockerfile existant et voir ce qui se passe !

Je ne sais pas si le run.sh va se lancer à cause de la première ligne, mais dans le cas contraire tu devrais pouvoir override la commande par défaut (le CMD du Dockerfile) avec un docker run

julienc23 commented 6 months ago

j'ai tenté mais j'ai une erreur au build :

Step 10/14 : RUN npm ci --ignore-scripts
 ---> Running in 1e0ab0ed68d2
npm ERR! Cannot read property 'chalk' of undefined

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2023-12-20T09_05_55_748Z-debug.log
The command '/bin/sh -c npm ci --ignore-scripts' returned a non-zero code: 1
bokub commented 6 months ago

C'est peut-être la version de npm qui est trop vieille, tu peux rajouter ça dans le Dockerfile juste avant le npm run ci ?

node --version
npm --version
julienc23 commented 6 months ago

v12.22.12 6.14.16

bokub commented 6 months ago

Oula c'est incroyablement vieux ! Il faudrait idéalement node 18 (et npm 9 qui logiquement sera installé avec)

Selon l'image Docker de base que tu as choisi les instructions vont varier donc je ne peux pas te donner de commande magique

bokub commented 6 months ago

Si ça peut t'aider, voilà les commandes de build en mode "add-on": https://developers.home-assistant.io/docs/add-ons/testing/

julienc23 commented 6 months ago

My bad, j'ai fait ça sur une vieille machine sans update les images... ça passe mieux avec la dernière Alpine.

julienc23 commented 6 months ago

Effectivement j'ai dû remplacer la 1ère ligne du path du shell, et ça se lance. Par contre, j'ai une erreur liée à configuration, j'imagine que c'est "normal".

HA Linky is starting
Error: Cannot read user configuration: Error: ENOENT: no such file or directory, open '/data/options.json'
bokub commented 6 months ago

Effectivement, ce fichier est fourni par Home Assistant. C'est censé être une représentation JSON de la config définie ici: https://github.com/bokub/ha-linky/blob/master/config.yaml

En gros ça devrait être un fichier dans ce genre pour une récupération de la consommation:

{
  "consumption PRM": "123456789",
  "consumption token": "xxx.yyy.zzz",
  "consumption name": "Linky consumption",
  "consumption action": "sync",
  "production PRM": "",
  "production token": "",
  "production name": "Linky production",
  "production action": "sync"
}

Tu devrais pouvoir lui donner le ficher avec un volume, non ?

julienc23 commented 6 months ago

J'y suis arrivé mais maintenant il demande à se connecter à HA j'imagine et il n'a pas la configuration. Je ne sais pas du tout comment ça fonctionne, c'est HA qui poll régulièrement via la connexion web-socket ? ou c'est le docker qui push ?

bokub commented 6 months ago

Trop bonne nouvelle !

Alors HA met à disposition une API websocket, et mon add-on s'y connecte quand il a besoin d'une info (ou pousser des données), puis ferme la connexion.

La l’authentification est codée ici: https://github.com/bokub/ha-linky/blob/master/src/ha.ts#L33-L69

Et ça suit ces étapes (Server states): https://developers.home-assistant.io/docs/api/websocket/

En gros:

bokub commented 6 months ago

Tu pourrais essayer de modifier WS_URL ligne 7 voir déjà si tu arrives à établir une connexion (il parait que le path c'est /api/websocket), et ensuite mettre un token dans la variable d'env SUPERVISOR_TOKEN pour que Home Assistant te laisse passer

julienc23 commented 6 months ago

J'ai tenté, je pense que j'arrive à me connecter mais j'ai maintenant une 400 :

HA Linky is starting
Connection with Home Assistant failed : Error: Server responded with a non-101 status: 400 Bad Request
bokub commented 6 months ago

C'est bizarre... Je me demande si on pourrait avoir plus de détails sur l'erreur.

Tu peux essayer de rajouter des logs comme ceci (entre les lignes 37 et 39 )?

      client.addListener('connectFailed', function (error) {
        console.log(error);
        console.log(Object.keys(error));
        console.log(JSON.stringify(error));
        reject('Connection with Home Assistant failed : ' + error.toString());
      });

Et d'ailleurs ta WS_URL ressemble à quoi ?

julienc23 commented 6 months ago

Alors j'avais indiqué mon URL "publique" qui passe par un nginx et visiblement c'était en partie le problème

: HA Linky is starting Error: Server responded with a non-101 status: 400 Bad Request Response Headers Follow: server: nginx date: Fri, 22 Dec 2023 17:16:31 GMT content-type: text/html content-length: 248 connection: close

at WebSocketClient.failHandshake (/linky/node_modules/websocket/lib/WebSocketClient.js:339:32)
at ClientRequest.<anonymous> (/linky/node_modules/websocket/lib/WebSocketClient.js:278:18)
at ClientRequest.emit (node:events:514:28)
at HTTPParser.parserOnIncomingClient [as onIncoming] (node:_http_client:693:27)
at HTTPParser.parserOnHeadersComplete (node:_http_common:119:17)
at Socket.socketOnData (node:_http_client:535:22)
at Socket.emit (node:events:514:28)
at addChunk (node:internal/streams/readable:545:12)
at readableAddChunkPushByteMode (node:internal/streams/readable:495:3)
at Readable.push (node:internal/streams/readable:375:5)

[] {} Connection with Home Assistant failed : Error: Server responded with a non-101 status: 400 Bad Request Response Headers Follow: server: nginx date: Fri, 22 Dec 2023 17:16:31 GMT content-type: text/html content-length: 248 connection: close `

En modifiant la WS_URL et en mettant directement l'IP:PORT du HA sans passer par nginx en front, ça fonctionne parfaitement :

HA Linky is starting Connection with Home Assistant established PRM *** found in configuration for consumption [22/12 17:33] New PRM detected, importing as much historical consumption data as possible Successfully retrieved consumption load curve from 2023-12-15 to 2023-12-22 Successfully retrieved daily consumption data from 2023-07-18 to 2023-12-15 Successfully retrieved daily consumption data from 2023-02-18 to 2023-07-18 Successfully retrieved daily consumption data from 2022-09-21 to 2023-02-18 Successfully retrieved daily consumption data from 2022-04-24 to 2022-09-21 Successfully retrieved daily consumption data from 2021-11-25 to 2022-04-24 Successfully retrieved daily consumption data from 2021-06-28 to 2021-11-25 Successfully retrieved daily consumption data from 2021-01-29 to 2021-06-28 Cannot fetch daily consumption data from 2020-09-01 to 2021-01-29, here is the error: Conso API a répondu avec une erreur Code: 400 Réponse : { "status": 400, "message": "The Enedis API returned an error", "error": { "error": "ADAM-ERR0125", "error_description": "The start date must be greater than the history deadline." } } Data import returned 1218 data points from 29/01/2021 to 21/12/2023 Data synchronization planned every day at 06:50:07 and 09:50:07 Connection with Home Assistant closed

Je vais voir si j'ai des données dans HA mais c'est encourageant !!

julienc23 commented 6 months ago

Je ne vois pas de nouvelles entités dans HA, je dois déclarer quelque-chose ?

bokub commented 6 months ago

Non ça devrait être bon ! Félicitations 🎊

Tu peux suivre le README pour ajouter les statistiques au tableau de bord Énergie

julienc23 commented 6 months ago

En effet, je n'avais pas vu le "Linky consumption" , ça fonctionne du coup! Merci pour l'aide, je vais réfléchir comment on pourrait packager/documenter ça!

bokub commented 6 months ago

Si tu veux me partager comment tu as fait je peux commencer une pull request que tu pourras review ensuite

Si tu le sens tu peux aussi commencer la pull request !

julienc23 commented 6 months ago

Je vais détailler les étapes car c'est un peu délicat pour une PR, il faudrait rajouter des variables, là j'ai modifié en dur deux choses :

$ git diff
diff --git a/run.sh b/run.sh
index 559dbd0..03152ec 100644
--- a/run.sh
+++ b/run.sh
@@ -1,3 +1,3 @@
-#!/usr/bin/with-contenv bashio
+#!/bin/sh

 node --experimental-modules dist/index.js
diff --git a/src/ha.ts b/src/ha.ts
index aa913f7..8bdc571 100644
--- a/src/ha.ts
+++ b/src/ha.ts
@@ -4,7 +4,7 @@ import { auth } from 'home-assistant-js-websocket/dist/messages.js';
 import { debug, warn } from './log.js';
 import dayjs from 'dayjs';

-const WS_URL = 'ws://supervisor/core/websocket';
+const WS_URL = 'ws://<IP HA>/api/websocket';

 export type SuccessMessage = {
   id: string;

Ensuite j'ai build de la manière suivante :

docker build . --build-arg="BUILD_FROM=alpine:latest"

J'ai créé le fichier options.json :

{
  "consumption PRM": "<ID PRM>",
  "consumption token": "<MON TOKEN>",
  "consumption name": "Linky consumption",
  "consumption action": "sync",
  "production PRM": "",
  "production token": "",
  "production name": "Linky production",
  "production action": "sync"
}

Et j'ai monté le volume dans le docker, par exemple avec compose et j'ai passé le token HA :

  ha-linky:
     image: d0dc6ce885ab
     container_name: ha-linky
     environment:
       - SUPERVISOR_TOKEN=<MON TOKEN HA>
     volumes:
       - <MON PATH>/ha-linky/data:/data
     restart: unless-stopped

Et ça roule :+1:

bokub commented 6 months ago

Hello ! J'ai commencé à rajouter une étape de build / deploy pour une image docker "standalone".

De plus, j'ai fait en sorte que l'URL de l'API websocket puisse être définie en variable d'env.

Est-ce que tu pourrais essayer de lancer ton docker-compose comme ça et me confirmer que ça fonctionne ?

  ha-linky:
     image: ghcr.io/bokub/ha-linky
     environment:
       - SUPERVISOR_TOKEN=<ton token HA>
       - WS_URL=ws://<ton IP HA>/api/websocket
     volumes:
       - <ton dossier>/ha-linky/data:/data
     restart: unless-stopped

Merci !

julienc23 commented 6 months ago

no matching manifest for linux/arm64/v8 in the manifest list entries

iciantoine commented 6 months ago

Hello à vous deux, je viens de suivre votre discussion pour activer moi aussi ha-linky sur mon install docker (sur rpi 5).

J'ai voulu mettre à jour mon fichier compose mais j'ai pas accès à l'image ghcr.io/bokub/ha-linky il semblerait ou alors elle n'existe plus (?). Du coup j'ai essayé avec ghcr.io/bokub/ha-linky-aarch64 mais vu la date de build il semble qu'elle ait pas été rebuildée depuis l'ajout dans le code des variables d'env WS_URL.

Ça serait possible de me donner accès à l'image standalone également ou alors mettre à jour l'image existante ?

Merci beaucoup pour le boulot !

bokub commented 6 months ago

Hello ! Je suis en train d'écrire un README, j'essaie de te donner des instructions demain comme ça tu pourras me confirmer que tout fonctionne bien !

bokub commented 6 months ago

@iciantoine En fait pas besoin d'attendre demain, tu peux builder l'image ha-linky avec la commande suivante. Pour le reste tu devrais t'en sortir avec les messages précédents, et une documentation plus détaillée arrive bientôt

docker build https://github.com/bokub/ha-linky.git -f standalone.Dockerfile -t ha-linky 

Fais moi signe si ça ne fonctionne pas !

bokub commented 6 months ago

Hello @julienc23 , je viens d'ajouter un peu de documentation à la fin du README.

N'hésite pas à me faire signe si tu la trouves incomplète ou pas assez précise, ou si j'ai fait une erreur

Bonne soirée !

julienc23 commented 6 months ago

Salut @bokub, la doc me semble OK. Par contre tu as abandonné l'idée de l'image Docker ? Ca aurait été bien pratique!

bokub commented 6 months ago

Oui, trop galère de builder une image pour chaque architecture de processeur, et ça ne couvrera jamais 100% des utilisateurs

Et finalement, c'est pas très long pour les utilisateurs finaux de construire leur propre image, surtout que ça peut être fait en une seule ligne sans même passer par un git clone, et que ces utilisateurs ont déjà docker d'installé

julienc23 commented 6 months ago

Ok je comprends. Si tu fais arm pour Raspberry, tu couvriras pas mal d'utilisateurs mais normalement les gens qui ont une install non-HAOS devraient s'en sortir avec la doc! Merci en tout cas.

GilDev commented 4 months ago

Merci, c’est parfait ! 😃

floriaaan commented 4 months ago

Merci beaucoup à vous, c'est parfait !

Est-ce qu'il y a des plans concernant l'import de données (via le CSV d'Enedis) en utilisant le container ha-linky ? Du genre, dans le même volume que options.json, chercher un fichier <linky_import>.csv ?

bokub commented 4 months ago

Yes, tu mets ton fichier CSV dans un dossier sur ta machine, puis tu fais un volume vers un dossier /config dans le conteneur

Par exemple: -v ~/mon-dossier:/config