From 9a5cb13fd100450829584f98bd9dd34d9eba2105 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89li=20Hamel?= <88721578+MivraMe@users.noreply.github.com> Date: Tue, 4 Feb 2025 23:30:32 -0500 Subject: [PATCH 01/13] Restructuration readme FR --- README.md | 702 ++++++++++++++++++++++++++---------------------------- info.md | 227 ------------------ 2 files changed, 332 insertions(+), 597 deletions(-) delete mode 100644 info.md diff --git a/README.md b/README.md index fb7e4de..656463e 100644 --- a/README.md +++ b/README.md @@ -1,370 +1,332 @@ -[![Français][Françaisshield]][Français] -[![English][Englishshield]][English] - -[![hacs][hacsbadge]][hacs] -[![GitHub Release][releases-shield]][releases] -[![GitHub Activity][commits-shield]][commits] -[![Project Maintenance][maintenance-shield]][user_profile] -[![License][license-shield]][license] -[![pre-commit][pre-commit-shield]][pre-commit] -[![black][black-shield]][black] -[![calver][calver-shield]][calver] -[![discord][discord-shield]][discord] - - -**BETA** - -Ceci est une version Bêta. Il y aura probablement des bogues, irritants, etc. Merci pour votre patience et d'ouvrir des "Issues". - -# Hilo -Intégration pour Home Assistant d'[Hilo](https://www.hydroquebec.com/hilo/fr/) - -# :warning: Changement majeur à venir, merci de garder votre component à jour :warning: - -L'API sur laquelle nous comptons pour les défis Hilo sera fermée prochainement. Nous travaillons actuellement sur une -alternative utilisant Websocket/SignalR. **La mise à jour vers la version 2025.2.1 ou ultérieur est fortement recommandée**, car -les versions précédentes risquent de ne plus fonctionner en raison de la façon dont pip installe les dépendances. - -Plusieurs utilisateurs et moi-même sommes en train de migrer nos communications avec l'API Hilo vers Websocket/SignalR -plutôt que des appels d'API. Le procéssus se fera graduellement et nous ferons tout ce qu l'on peut pour éviter de -briser des installations existantes. - -Dans un premier temps, nous mettrons à jour la librairie `python-hilo` (https://github.com/dvd-dev/python-hilo), -ce changement devrait être transparent pour tous. - -Ensuite, nous migrerons le capteur de défi (`sensor.defi_hilo`) vers Websocket/SignalR. La bonne nouvelle avec ça c'est -que les "glitchs" momentanés du capteur de défi sont complètement éliminés par cette méthode. - -### Ce qui reste à faire de ce côté: -- Les attributs `allowed_kWh` et `used_kWh` sont **non-fonctionnels** actuellement, les information arrivent morcelées et tous -les cas ne sont pas traités encore. -- L'état "completed" ne fonctionne pas toujours, possiblement un race condition -- Certaines informations comme `total_devices`, `opt_out_devices` et `pre_heat_devices` ne persistent pas en mémoire. - -Plus de détails disponibles dans issue #486. - -L'API servant à la lecture initial de la liste d'appareils sur votre compte Hilo subira également le même traitement. - -Plus de détails disponibles dans issue #564. - - -## Introduction et base - -Ceci est l'intégration HACS non-officielle de Hilo sur Home Assistant. [Hilo](https://www.hiloenergie.com/fr-ca/) est une plateforme de domotique développée par une filliale d'[Hydro-Québec](https://www.hydroquebec.com/hilo/fr/). -Cette intégration n'a aucun liens direct avec Hilo ou Hydro Québec. C'est une initiative communautaire. Merci de ne pas contacter Hilo ou Hydro-Québec pour tout problème avec cette intégration Home Assistant. Vous pouvez ouvrir un "issue" dans ce "repository" github à la place. - -Si vous souhaitez aider avec le développement de cette intégration, vous pouvez toujours soumettre vos commentaires à partir du formulaire de l'app Hilo et demander à ce qu'ils ouvrent leur API publiquement et qu'ils fournissent un environnement de test pour les développeurs. - -### Version TL:DR ("too long, didn't read") - -Voir la configuration minimale recommandée [dans le wiki](https://github.com/dvd-dev/hilo/wiki/FAQ-%E2%80%90-Français#avez-vous-une-configuration-recommandée) - - -Vous pouvez également trouver des exemples en format YAML [dans la section doc/automations du projet](https://github.com/dvd-dev/hilo/tree/main/doc/automations) -Si vous préférez les blueprints, en voici quelques-uns: - - [Repo de NumerID](https://github.com/NumerID/blueprint_hilo) - - [Repo de Arim215](https://github.com/arim215/ha-hilo-blueprints) - - -### Remerciements - -Gros merci à [Francis Poisson](https://github.com/francispoisson/) qui est l'auteur de l'intégration originale. Sans le travail qu'il a fait sur cette intégration, je n'aurais probablement jamais considéré utiliser Hilo. - -Un autre gros merci à @ic-dev21 pour son implication à plusieurs niveaux. - -J'ai décidé de déplacer l'intégration ici, car la dernière mise à jour de Hilo a brisé l'original et j'ai pris le temps de complètement la récrire. Hilo pousse maintenant les lectures des appareils via websocket de SignalR. - -### Caractéristiques. -- Supporte les interrupteurs et gradateurs en tant que lumières. -- Voir la température actuelle et changer la consigne des thermostats. -- Obtenir la consommation énergétique des tous les appareils Hilo. -- Générer les "sensor" de puissance et d'énergie consommée. -- Sensor pour les Défis. -- Sensor pour la passerelle Hilo -- Configuration est maintenant faite via l'interface utilisateur -- Mise à jour des lectures plus près du temps réel. -- **NOUVEAU**: Authentification via le site de Hilo -- **NOUVEAU**: Capteur pour la météo extérieure avec icône changeante comme dans l'app Hilo - -### À faire: -- Ajouter la fonctionnalité pour d'autres appareils. -- Tests fonctionnels -- [Ajouter des "type hints" au code](https://developers.home-assistant.io/docs/development_typing/) -- Documentation des appels API à Hilo [ici](https://github.com/dvd-dev/python-hilo) -- Ajout automatique des compteurs de consommation électrique - -## Installation - -### Étape 0 : Avoir une installation compatible -L'intégration nécessite que l'installation du matériel Hilo soit complétée à votre domicile. Il ne sera pas possible de faire l'installation si ça n'est pas fait. - -Cette intégration a été testée par des utilisateurs sous HA OS (bare metal et VM), Docker avec l'image officielle (ghcr.io), Podman. Tout autre type d'installation peut mener à des problèmes de permission pour certains fichiers créés lors de l'installation initiale du custom_component. - -### Étape 1 : Télécharger les fichiers - -#### Option 1 : Via HACS - -[![Ouvrir Hilo dans Home Assistant Community Store (HACS).](https://my.home-assistant.io/badges/hacs_repository.svg)](https://my.home-assistant.io/redirect/hacs_repository/?owner=dvd-dev&repository=hilo&category=integration) - -Assurez-vous d'avoir [HACS](https://hacs.xyz/docs/setup/download/) d'installé. -Sous HACS, cliquer le bouton '+ EXPLORE & DOWNLOAD REPOSITORIES' au bas de la page, rechercher "Hilo", le choisir, et cliquer sur _download_ dans HACS. - -#### Option 2 : Manuellement - -Télécharger et copier le dossier `custom_components/hilo` de la [dernière version](https://github.com/dvd-dev/hilo/releases/latest) dans votre dossier `custom_components` de Home Assistant. - -### Étape 2 : Ajouter l'intégration à HA (<--- étape souvent oubliée) - -[![Ouvrir Home Assistant et démarrer la configuration d'une nouvelle intégration.](https://my.home-assistant.io/badges/config_flow_start.svg)](https://my.home-assistant.io/redirect/config_flow_start/?domain=hilo) - -Dans HA, aller à Paramètres > Appareils et services > Intégrations. -Dans le coin inférieur droit, cliquer sur le bouton '+ AJOUTER UNE INTÉGRATION'. - -![Ajout intégration](https://github.com/dvd-dev/hilo/assets/108159253/e0529aca-9b13-40e0-9be4-29e347b980ab) - -Si l'intégration est correctement installée, vous devriez pouvoir trouver "Hilo" dans la liste. Il est possible d'avoir besoin de vider la mémoire cache de votre navigateur pour que l'intégration s'affiche. - -![Recherche intégration](https://github.com/dvd-dev/hilo/assets/108159253/7003a402-9369-4063-ac02-709bd0294e42) - -## Configuration (initiale) - -La configuration est faite via l'interface utilisateur. Lorsque vous ajoutez l'intégration, vous êtes redirigés vers le site de connexion d'Hilo afin de vous y authentifier. - -![Auth step 1](https://github.com/dvd-dev/hilo/assets/108159253/d2e396ea-e6df-40e6-9a14-626ef3be87c8) - -![Auth Hilo](https://github.com/dvd-dev/hilo/assets/108159253/e4e98b32-78d0-4c49-a2d7-3bd0ae95e9e0) - -Vous devez ensuite accepter de lier votre compte. Pour ce faire, saisir l'adresse (URL ou IP) de votre instance Home Assistant et appuyer sur Link Account. - -![Link](https://github.com/dvd-dev/hilo/assets/108159253/5eb945f7-fa5e-458f-b0fe-ef252aaadf93) - -Après, vous devrez assigner une pièce de votre maison à chaque appareil. - -## Configuration (mise à jour depuis une version antérieure à v2024.3.1) - -Après la mise à jour, vous obtiendrez une erreur comme quoi vous devez vous réauthentifier pour que l'intégration fonctionne. - -![Reconfigurer](https://github.com/dvd-dev/hilo/assets/108159253/5b69da7f-d547-4ba7-8b64-8eb1d8f28bdb) - -![Réauthentifier](https://github.com/dvd-dev/hilo/assets/108159253/6b1bf2c3-0d7a-4eb8-815b-594401fc09ef) - -Après avoir lié votre compte comme montré à la section configuration initiale, le message suivant apparaitra. - -![Réauthentifié succès](https://github.com/dvd-dev/hilo/assets/108159253/7708b449-24c3-43c1-843b-8697ae192db1) - -### Compteurs de consommation électrique - -Les compteurs de consommation électrique sont une fonctionalité de cette intégration. Ils étaient initialement générés -par des capteurs "template" et des automatisations mais sont maintenant intégré dans l'intégration. - -#### Avertissement - -Lorsque l'on active les compteurs, il est recommandé de retirer les anciens capteurs manuels afin de ne pas avoir de -données en double. - -Si vous avez un problème et voulez collaborer, merci de mettre en marche la journalisation `debug` et de fournir -un extrait du fichier `home-assistant.log`. La méthode est expliquée [ci-bas.](https://github.com/dvd-dev/hilo?tab=readme-ov-file#contribuer). - - -#### Procédure - -Si vous souhaitez utiliser la génération automatique des capteurs de consommation électrique, suivez les étapes suivantes: - -* S'assurer que la plateforme `utility_meter` est chargée dans votre fichier `configuration.yaml` de -Home Assistant. Vous n'avez qu'à ajouter une ligne au fichier comme suit : - - ``` - utility_meter: - ``` - -* Cliquer sur `Configure` dans l'interface utilisateur de l'intégration et cocher `Générer compteurs de consommation électrique`. - -* (Optionnel) Redémarrez Home Assistant et attendez 5 minutes environ, l'entité `sensor.hilo_energy_total_low` sera créée - et contiendra des données: - * Le `status` devrait être `collecting` - * L'état `state` devrait être un nombre plus grand que 0. - -* Toutes les entités et capteurs créés seront préfixés ou suffixés de `hilo_energy_` ou `hilo_rate_`. - -* Si vous voyez l'erreur suivante dans le journal de Home Assistant, ceci est du à un bogue de Home Assistant causé par - le fait que le compteur n'a pas encore accumulé suffisamment de données pour fonctionner. Elle peut être ignorée. - - ``` - 2021-11-29 22:03:46 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved - Traceback (most recent call last): - [...] - ValueError: could not convert string to float: 'None' - ``` -Une fois créés, les compteurs devront être ajoutés manuellement au tableau de bord "Énergie". - - -### Autres options de configuration - -D'autres options sont disponibles sous le bouton "Configurer" dans Home Assistant: - -- `Générer compteurs de consommation électrique`: Case à cocher - - Générer automatiquement des compteurs de consommation électrique, voir la procédure ci-dessus pour la configuration - Nécessite la ligne suivante dans votre fichier configuration.yaml : - ``` - utility_meter: - ``` - -- `Générer seulement les compteurs totaux pour chaque appareil`: Case à cocher - - Calculez uniquement le total d'énergie sans diviser entre le cout faible et le cout élevé - -- `Enregistrer également les données de demande et les messages Websocket (nécessite un niveau de journal de débogage à la fois sur l'intégration et sur pyhilo)`: Case à cocher - - Permets un niveau de journalisation plus élevé pour les développeurs/le débogage - -- `Vérouiller les entités climate lors de défis Hilo, empêchant tout changement lorsqu'un défi est en cours.`: Case à cocher - - Empêche la modification des consignes de température lors des défis Hilo - -- `Suivre des sources de consommation inconnues dans un compteur séparé. Ceci est une approximation calculée à partir de la lecture du compteur intelligent.`: Case à cocher - - Toutes les sources d'énergie autres que le matériel Hilo sont regroupées dans un seul capteur. Utilise la lecture du compteur intelligent de la maison. - -- `Nom du tarif Hydro Québec ('rate d' ou 'flex d')`: chaine - - Définissez le nom du plan tarifaire d'Hydro-Québec. - Seules 2 valeurs sont prises en charge pour le moment: - - 'rate d' - - 'flex d' - -- `Intervalle de mise à jour (min: 60s)`: Nombre entier - - Nombre de secondes entre chaque mise à jour de l'appareil. Par défaut à 60s. Il n'est pas recommandé d'aller en dessous de 30, car cela pourrait entrainer une suspension de Hilo. Depuis [2023.11.1](https://github.com/dvd-dev/hilo/releases/tag/v2023.11.1) le minimum est passé de 15s à 60s. - -## Exemples d'intégrations Lovelace et d'automatisations - -Vous pouvez trouver de nombres exemples et idées pour votre tableau de bord, vos cartes et vos automatisations [dans le wiki du projet](https://github.com/dvd-dev/hilo/wiki/Utilisation) - -Vous pouvez également trouver des exemples en format YAML [dans la section doc/automations du projet](https://github.com/dvd-dev/hilo/tree/main/doc/automations) - -## Références - -Comme indiqué ci-dessus, il s'agit d'une intégration non officielle. Hilo ne prend pas en charge les appels API directs et peut obscurcir le service ou -nous empêcher de l'utiliser. - -Pour l'instant, voici les liens Swagger que nous avons trouvés: -* https://wapphqcdev01-automation.azurewebsites.net/swagger/index.html -* https://wapphqcdev01-notification.azurewebsites.net/swagger/index.html -* https://wapphqcdev01-clientele.azurewebsites.net/swagger/index.html - -## FAQ - -Vous pouvez trouver la FAQ dans le wiki du projet: https://github.com/dvd-dev/hilo/wiki/FAQ - -## Contribuer - -Rapporter tout problème est une bonne manière disponible à tous de contribuer au projet. - -Si vous éprouvez des problèmes ou voyez des comportements étranges, merci de soumettre une "Issue" et d'y attacher vos journaux. - -Pour mettre en fonction la journalisation de débogage, vous devez ajouter ceci dans votre fichier `configuration.yaml`: -```yaml -logger: - default: info - logs: - custom_components.hilo: debug - pyhilo: debug -``` - -Si vous avez de l'expérience python ou Home Assistant et que vous souhaitez contribuer au code, n'hésitez pas à soumettre un pull request. - -### Préparer un environnement de développement via VSCode DevContainer - -Pour faciliter le développement, un environnement de développement est disponible via DevContainer de VSCode. Pour l'utiliser, vous devez avoir [VSCode](https://code.visualstudio.com/) et [Docker](https://www.docker.com/) installés sur votre ordinateur. - -1. Ouvrir le dossier du projet dans VSCode -2. Installer l'extension [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) -3. Ouvrir la palette de commande (Ctrl+Shift+P ou Cmd+Shift+P) et chercher "Remote-Containers: Reopen in Container" -4. Attendre que l'environnement soit prêt -5. Ouvrir un terminal dans VSCode et exécuter `scripts/develop` pour installer les dépendances et lancer Home Assistant. -6. VSCode devrait vous proposer d'ouvrir un navigateur pour accéder à Home Assistant. Vous pouvez aussi ouvrir un navigateur manuellement et accéder à [http://localhost:8123](http://localhost:8123). -7. Vous allez devoir faire la configuration initiale de Home Assistant. -8. Vous allez devoir ajouter l'intégration Hilo via l'interface utilisateur. -9. Vous pouvez maintenant modifier les fichiers dans le dossier `custom_components/hilo` et voir les changements en temps réel dans Home Assistant. -10. Dans le terminal ou vous avez lancé `scripts/develop`, les logs de Home Assistant et de l'intégration HILO devraient défiler. - -### Avant de soumettre une Pull Request - -Il va sans dire qu'il est important de tester vos modifications sur une installation locale. Il est possible de modifier les fichiers .py de l'intégration directement dans votre dossier `custom_components/hilo`. - -N'oubliez pas votre copie de sauvegarde! - -Si vous devez modifier python-hilo pour vos tests, il est possible d'installer votre "fork" avec la commande suivante dans votre CLI : - -```console -$ pip install -e git+https://github.com/VOTRE_FORK_ICI/python-hilo.git#egg=python-hilo -``` - -Vous devrez ensuite redémarrer Home Assistant pour que votre installation prenne effet. Pour revenir en arrière, il suffit de faire: - -```console -$ pip install python-hilo -``` - -Et redémarrez Home Assistant - -### Soumettre une Pull Request - -- D'abord, vous devez créer un `fork` du "repository" dans votre propre espace utilisateur. -- Ensuite, vous pouvez en faire un `clone` sur votre ordinateur. -- Afin de maintenir une sorte de propreté et de standard dans le code, nous avons des linters et des validateurs qui doivent être exécutés via `pre-commit` hooks : -```console -$ pre-commit install --install-hooks -``` -- Vous pouvez maintenant procéder à votre modification au code. -- Lorsque vous avez terminé, vous pouvez `stage` les fichiers pour un `commit`: -```console -$ git add path/to/file -``` -- Et vous pouvez créer un `commit`: -```console -$ git commit -m "J'ai changé ceci parce que ..." -``` - -- Finalement, vous pouvez `push` le changement vers votre "upstream repository" : -```console -$ git push -``` - -- Ensuite, si vous visitez le [upstream repository](https://github.com/dvd-dev/hilo), Github devrait vous proposer de créer un "Pull Request" (PR). Vous n'avez qu'à suivre les instructions. - -### Collaborateurs initiaux - -* [Francis Poisson](https://github.com/francispoisson/) -* [David Vallee Delisle](https://github.com/valleedelisle/) - -### Mentions très honorables -* [Ian Couture](https://github.com/ic-dev21/): Il tient cet addon du bout de ces bras depuis un certain temps -* [Hilo](https://www.hiloenergie.com): Merci à Hilo pour son support et ses contributions. - ---- - -[integration_blueprint]: https://github.com/custom-components/integration_blueprint -[commits-shield]: https://img.shields.io/github/commit-activity/y/dvd-dev/hilo.svg?style=for-the-badge -[commits]: https://github.com/dvd-dev/hilo/commits/main -[hacs]: https://hacs.xyz -[hacsbadge]: https://img.shields.io/badge/HACS-Default-41BDF5.svg?style=for-the-badge -[license]: https://github.com/dvd-dev/hilo/blob/main/LICENSE -[license-shield]: https://img.shields.io/github/license/dvd-dev/hilo.svg?style=for-the-badge -[maintenance-shield]: https://img.shields.io/badge/maintainer-%40dvd--dev-blue.svg?style=for-the-badge -[releases-shield]: https://img.shields.io/github/release/dvd-dev/hilo.svg?style=for-the-badge -[releases]: https://github.com/dvd-dev/hilo/releases -[user_profile]: https://github.com/dvd-dev -[pre-commit-shield]: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white&style=for-the-badge -[pre-commit]: https://github.com/pre-commit/pre-commit -[calver-shield]: https://img.shields.io/badge/calver-YYYY.MM.Micro-22bfda.svg?style=for-the-badge -[calver]: http://calver.org/ -[black-shield]: https://img.shields.io/badge/code%20style-black-000000.svg?style=for-the-badge -[black]: https://github.com/psf/black -[discord-shield]: https://img.shields.io/badge/discord-Chat-green?logo=discord&style=for-the-badge -[discord]: https://discord.gg/MD5ydRJxpc -[Englishshield]: https://img.shields.io/badge/en-English-red?style=for-the-badge -[English]: https://github.com/dvd-dev/hilo/blob/main/README.en.md -[Françaisshield]: https://img.shields.io/badge/fr-Français-blue?style=for-the-badge -[Français]: https://github.com/dvd-dev/hilo/blob/main/README.md +[![Français][Françaisshield]][Français] +[![English][Englishshield]][English] + +[![hacs][hacsbadge]][hacs] +[![GitHub Release][releases-shield]][releases] +[![GitHub Activity][commits-shield]][commits] +[![Project Maintenance][maintenance-shield]][user_profile] +[![License][license-shield]][license] +[![pre-commit][pre-commit-shield]][pre-commit] +[![black][black-shield]][black] +[![calver][calver-shield]][calver] +[![discord][discord-shield]][discord] + + +**BETA** + +Ceci est une version Bêta. Il y aura probablement des bogues, irritants, etc. Merci pour votre patience et d'ouvrir des "Issues". + +# Hilo - Home Assistant +Intégration pour Home Assistant d'[Hilo](https://www.hiloenergie.com/fr-ca/) + +# ⚠️ Changement majeur à venir, merci de garder votre component à jour ⚠️ + +L'API sur laquelle nous comptons pour les défis Hilo sera fermée prochainement. Nous travaillons actuellement sur une +alternative utilisant Websocket/SignalR. **La mise à jour vers la version 2025.2.1 ou ultérieur est fortement recommandée**, car +les versions précédentes risquent de ne plus fonctionner en raison de la façon dont pip installe les dépendances. + +Plusieurs utilisateurs et moi-même sommes en train de migrer nos communications avec l'API Hilo vers Websocket/SignalR +plutôt que des appels d'API. Le procéssus se fera graduellement et nous ferons tout ce qu l'on peut pour éviter de +briser des installations existantes. + +Dans un premier temps, nous mettrons à jour la librairie `python-hilo` (https://github.com/dvd-dev/python-hilo), +ce changement devrait être transparent pour tous. + +Ensuite, nous migrerons le capteur de défi (`sensor.defi_hilo`) vers Websocket/SignalR. La bonne nouvelle avec ça c'est +que les "glitchs" momentanés du capteur de défi sont complètement éliminés par cette méthode. + +### Ce qui reste à faire de ce côté: +- Les attributs `allowed_kWh` et `used_kWh` sont **non-fonctionnels** actuellement, les information arrivent morcelées et tous +les cas ne sont pas traités encore. +- L'état "completed" ne fonctionne pas toujours, possiblement un race condition +- Certaines informations comme `total_devices`, `opt_out_devices` et `pre_heat_devices` ne persistent pas en mémoire. + +Plus de détails disponibles dans [issue #486](https://github.com/dvd-dev/hilo/issues/486). + +L'API servant à la lecture initial de la liste d'appareils sur votre compte Hilo subira également le même traitement. + +Plus de détails disponibles dans [issue #564](https://github.com/dvd-dev/hilo/issues/564). + +## 📌 Introduction +Cette intégration non-officielle HACS permet d'utiliser [Hilo](https://www.hiloenergie.com/fr-ca/) avec Home Assistant. **Elle n'est pas affiliée à Hilo ou Hydro-Québec.** + +**⚠️ Ne contactez pas Hilo ou Hydro-Québec pour les problèmes liés à cette intégration.** + +🔗 [Configuration minimale recommandée](https://github.com/dvd-dev/hilo/wiki/FAQ-%E2%80%90-Français#avez-vous-une-configuration-recommandée) +🔗 Blueprints : [NumerID](https://github.com/NumerID/blueprint_hilo) | [Arim215](https://github.com/arim215/ha-hilo-blueprints) +🔗 Exemples d'automatisations YAML : [Automatisations](https://github.com/dvd-dev/hilo/tree/main/doc/automations) +🔗 Exemples d'interfaces Lovelace : [Interfaces](https://github.com/dvd-dev/hilo/wiki/Utilisation) + +--- + +## 🔥 Fonctionnalités principales +✅ Supporte les interrupteurs et gradateurs comme lumières +✅ Contrôle des thermostats et lecture des températures +✅ Suivi de la consommation énergétique des appareils Hilo +✅ Sensor pour les défis et la passerelle Hilo +✅ Configuration via l'interface utilisateur +✅ Authentification via le site web d'Hilo +✅ Capteur météo extérieure avec icône changeante + +📌 **À faire** : Support d'autres appareils, amélioration des compteurs de consommation, documentation API + +--- + +## 📥 Installation +### 1️⃣ Vérifier la compatibilité +- L'intégration nécessite le matériel Hilo installé et fonctionnel. +- Testée sous HA OS, Docker (ghcr.io), Podman. D'autres configurations peuvent poser problème. + +### 2️⃣ Installation des fichiers +#### 🔹 Option 1 : Via HACS +[![Installer via HACS](https://my.home-assistant.io/badges/hacs_repository.svg)](https://my.home-assistant.io/redirect/hacs_repository/?owner=dvd-dev&repository=hilo&category=integration) + +1. Assurez-vous d'avoir [HACS](https://hacs.xyz/docs/setup/download/) installé. +2. Dans HACS, cliquez sur `+ EXPLORE & DOWNLOAD REPOSITORIES`, recherchez "Hilo" et téléchargez-le. +3. Redémarrer Home Assistant + +#### 🔹 Option 2 : Manuellement +1. Téléchargez la dernière version depuis [GitHub](https://github.com/dvd-dev/hilo/releases/latest). +2. Copiez `custom_components/hilo` dans le dossier `custom_components` de Home Assistant. +3. Redémarrer Home Assistant + +### 3️⃣ Ajouter l'intégration à Home Assistant +[![Ajouter l'intégration](https://my.home-assistant.io/badges/config_flow_start.svg)](https://my.home-assistant.io/redirect/config_flow_start/?domain=hilo) + +1. Allez à **Paramètres > Appareils et services > Intégrations**. +2. Cliquez sur `+ AJOUTER UNE INTÉGRATION` et recherchez "Hilo". +3. Authentifiez-vous sur le site web d'Hilo et liez votre compte. + +--- + +## 📌 Suivis de la consommation électrique +Si vous souhaitez utiliser la génération automatique des capteurs de consommation électrique, suivez ces étapes : + +1. **Ajouter la plateforme `utility_meter`** + Ajoutez la ligne suivante dans votre fichier `configuration.yaml` : + ```yaml + utility_meter: + ``` + +2. **Activer la génération automatique** + - Dans l'interface utilisateur de l'intégration, cliquez sur `Configurer`. + - Cochez **Générer compteurs de consommation électrique**. + +3. *(Optionnel)* **Redémarrer Home Assistant** + - Attendez environ 5 minutes. L'entité `sensor.hilo_energy_total_low` sera créée et contiendra des données. + - **Le `status`** devrait être `collecting`. + - **L'état `state`** devrait être un nombre supérieur à 0. + - Toutes les entités et capteurs créés seront préfixés ou suffixés par `hilo_energy_` ou `hilo_rate_`. + +4. **Erreur connue (à ignorer)** + Si vous voyez cette erreur dans le journal de Home Assistant, elle peut être ignorée : + ``` + 2021-11-29 22:03:46 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved + Traceback (most recent call last): + [...] + ValueError: could not convert string to float: 'None' + ``` + +5. **Ajout manuel au tableau de bord "Énergie"** + Une fois créés, les compteurs devront être ajoutés manuellement. + +--- + +## ⚠️ Avertissement +Lorsque l'on active les compteurs, il est recommandé de **retirer les anciens capteurs manuels** afin d'éviter des données en double. + +Si vous rencontrez un problème et souhaitez collaborer, activez la journalisation **debug** et fournissez un extrait du fichier `home-assistant.log`. La méthode est expliquée ci-dessous. + +--- + +## ⚙️ Autres options de configuration +Vous pouvez configurer des options supplémentaires en cliquant sur `Configurer` dans Home Assistant : + +### ✅ **Générer compteurs de consommation électrique** +- Génère automatiquement les compteurs de consommation électrique. +- **Nécessite** la ligne suivante dans `configuration.yaml` : + ```yaml + utility_meter: + ``` + +### ✅ **Générer seulement les compteurs totaux pour chaque appareil** +- Calcule uniquement le total d'énergie **sans division** entre coût faible et coût élevé. + +### ✅ **Enregistrer les données de demande et les messages Websocket** +- Nécessite un **niveau de journalisation `debug`** sur l'intégration et `pyhilo`. +- Permet un suivi détaillé pour le développement et le débogage. + +### ✅ **Verrouiller les entités `climate` lors des défis Hilo** +- Empêche toute modification des consignes de température **pendant un défi** Hilo. + +### ✅ **Suivre des sources de consommation inconnues dans un compteur séparé** +- Toutes les sources **non Hilo** sont regroupées dans un capteur dédié. +- Utilise la lecture du **compteur intelligent** de la maison. + +### 📌 **Nom du tarif Hydro-Québec** (`rate d` ou `flex d`) +- Définissez le **nom du plan tarifaire**. +- **Valeurs supportées** : + - `'rate d'` + - `'flex d'` + +### ⏳ **Intervalle de mise à jour (min : 60s)** +- Définit le **nombre de secondes** entre chaque mise à jour. +- **Valeur par défaut** : `60s`. +- **Ne pas descendre sous 30s** pour éviter une suspension de Hilo. +- Depuis **2023.11.1**, le minimum est passé de **15s à 60s**. + + +## 📌 FAQ et support +🔗 [FAQ complète](https://github.com/dvd-dev/hilo/wiki/FAQ) +💬 Rejoignez la communauté sur [Discord](https://discord.gg/MD5ydRJxpc) + +**Problèmes ?** Ouvrez une "Issue" avec les logs `debug` activés dans `configuration.yaml` : +```yaml +logger: + default: info + logs: + custom_components.hilo: debug + pyhilo: debug +``` + +--- + +# 🤝 Contribuer + +Rapporter tout problème est une excellente manière pour tous de contribuer au projet. + +Si vous rencontrez des problèmes ou observez des comportements étranges, veuillez soumettre une "Issue" en y joignant vos journaux. + +## 📜 Activer la journalisation de débogage +Pour activer la journalisation de débogage, ajoutez ceci dans votre fichier `configuration.yaml` : + +```yaml +logger: + default: info + logs: + custom_components.hilo: debug + pyhilo: debug +``` + +Si vous avez de l'expérience en Python ou avec Home Assistant et souhaitez contribuer au code, n'hésitez pas à soumettre une pull request. + +--- + +# 🛠️ Préparer un environnement de développement via VSCode DevContainer + +Pour faciliter le développement, un environnement est disponible via DevContainer de VSCode. Assurez-vous d'avoir **VSCode** et **Docker** installés sur votre ordinateur. + +1. Ouvrez le dossier du projet dans VSCode. +2. Installez l'extension **Remote - Containers**. +3. Ouvrez la palette de commandes (**Ctrl+Shift+P** ou **Cmd+Shift+P**) et recherchez : + ``` + Remote-Containers: Reopen in Container + ``` +4. Attendez que l'environnement soit prêt. +5. Ouvrez un terminal dans VSCode et exécutez : + ```bash + scripts/develop + ``` + pour installer les dépendances et lancer Home Assistant. +6. VSCode devrait vous proposer d'ouvrir un navigateur pour accéder à Home Assistant. Sinon, ouvrez manuellement : + ``` + http://localhost:8123 + ``` +7. Effectuez la configuration initiale de Home Assistant. +8. Ajoutez l'intégration **Hilo** via l'interface utilisateur. +9. Modifiez les fichiers dans le dossier `custom_components/hilo` et observez les changements en temps réel dans Home Assistant. + +Dans le terminal où vous avez lancé `scripts/develop`, les journaux de Home Assistant et de l'intégration Hilo devraient défiler. + +--- + +# ✅ Avant de soumettre une Pull Request + +Il est essentiel de tester vos modifications sur une installation locale. Vous pouvez modifier les fichiers `.py` de l'intégration directement dans votre dossier `custom_components/hilo`. + +⚠ **N'oubliez pas votre copie de sauvegarde!** + +Si vous devez modifier `python-hilo` pour vos tests, installez votre fork avec la commande suivante dans votre CLI : + +```bash +pip install -e git+https://github.com/VOTRE_FORK_ICI/python-hilo.git#egg=python-hilo +``` + +Redémarrez ensuite Home Assistant pour que l'installation prenne effet. Pour revenir en arrière : + +```bash +pip install python-hilo +``` + +Puis redémarrez Home Assistant. + +--- + +# 🚀 Soumettre une Pull Request + +1. **Créez un fork** du dépôt dans votre espace utilisateur. +2. **Clonez-le** sur votre ordinateur. +3. Pour maintenir une certaine standardisation du code, nous utilisons des **linters** et des **validateurs** exécutés via des hooks `pre-commit` : + + ```bash + pre-commit install --install-hooks + ``` + +4. Apportez vos modifications au code. +5. Une fois terminé, ajoutez les fichiers modifiés : + + ```bash + git add path/to/file + ``` + +6. Créez un commit : + + ```bash + git commit -m "J'ai changé ceci parce que ..." + ``` + +7. Poussez les changements vers votre dépôt distant : + + ```bash + git push + ``` + +8. Sur le dépôt d'origine, **GitHub** devrait vous proposer de créer une **Pull Request** (PR). Suivez les instructions. + +--- + +# 👥 Collaborateurs initiaux + +- **[Francis Poisson](https://github.com/francispoisson/)** +- **[David Vallee Delisle](https://github.com/valleedelisle/)** + +## 🎖️ Mentions très honorables + +- **[Ian Couture](https://github.com/ic-dev21/)** : Il maintient cet addon depuis un certain temps. +- **[Hilo](https://www.hiloenergie.com)** : Merci à Hilo pour son soutien et ses contributions. + +--- + +[integration_blueprint]: https://github.com/custom-components/integration_blueprint +[commits-shield]: https://img.shields.io/github/commit-activity/y/dvd-dev/hilo.svg?style=for-the-badge +[commits]: https://github.com/dvd-dev/hilo/commits/main +[hacs]: https://hacs.xyz +[hacsbadge]: https://img.shields.io/badge/HACS-Default-41BDF5.svg?style=for-the-badge +[license]: https://github.com/dvd-dev/hilo/blob/main/LICENSE +[license-shield]: https://img.shields.io/github/license/dvd-dev/hilo.svg?style=for-the-badge +[maintenance-shield]: https://img.shields.io/badge/maintainer-%40dvd--dev-blue.svg?style=for-the-badge +[releases-shield]: https://img.shields.io/github/release/dvd-dev/hilo.svg?style=for-the-badge +[releases]: https://github.com/dvd-dev/hilo/releases +[user_profile]: https://github.com/dvd-dev +[pre-commit-shield]: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white&style=for-the-badge +[pre-commit]: https://github.com/pre-commit/pre-commit +[calver-shield]: https://img.shields.io/badge/calver-YYYY.MM.Micro-22bfda.svg?style=for-the-badge +[calver]: http://calver.org/ +[black-shield]: https://img.shields.io/badge/code%20style-black-000000.svg?style=for-the-badge +[black]: https://github.com/psf/black +[discord-shield]: https://img.shields.io/badge/discord-Chat-green?logo=discord&style=for-the-badge +[discord]: https://discord.gg/MD5ydRJxpc +[Englishshield]: https://img.shields.io/badge/en-English-red?style=for-the-badge +[English]: https://github.com/dvd-dev/hilo/blob/main/README.en.md +[Françaisshield]: https://img.shields.io/badge/fr-Français-blue?style=for-the-badge +[Français]: https://github.com/dvd-dev/hilo/blob/main/README.md diff --git a/info.md b/info.md deleted file mode 100644 index 1a8ca86..0000000 --- a/info.md +++ /dev/null @@ -1,227 +0,0 @@ -[![hacs][hacsbadge]][hacs] -[![GitHub Release][releases-shield]][releases] -[![GitHub Activity][commits-shield]][commits] -[![Project Maintenance][maintenance-shield]][user_profile] -[![License][license-shield]][license] -[![pre-commit][pre-commit-shield]][pre-commit] -[![black][black-shield]][black] -[![calver][calver-shield]][calver] -[![lgtm-alert][lgtm-alert-shield]][lgtm-alert] -[![lgtm-grade][lgtm-grade-shield]][lgtm-grade] -[![discord][discord-shield]][discord] - - -This is the unofficial Hilo integration. [Hilo](https://www.hiloenergie.com/en-ca/) is a smart home platform developed -by an [Hydro Quebec](https://www.hydroquebec.com/hilo/en/) subsidiary. -This integration has no direct tie with Hilo or Hydro Quebec. This is a community initiative. Please don't contact -Hilo or Hydro-Quebec with issues with this Home Assistant integration, you can open an issue in the github repository -instead. - -If you want to help with the development of this integration, you can always submit a feedback form from the Hilo -application and requesting that they open their API publicly and that they provide a testing environment to the -developers. - - -**This component will set up the following platforms.** - -| Platform | Description | -| --------------- | --------------------------------------------------------------------------- | -| `light` | Control light switches and dimmers | -| `sensor` | Status of various devices, Hilo challenges, gateway and energy cost sensors | -| `climate` | Control the Hilo thermostat | -| `utility_meter` | Various meters will be created to integrate with the Energy Dashboard | -| `energy` | Energy dashboard will be automatically configured with all devices | - -{% if not installed %} - -## Installation - -1. Click install. -1. In the HA UI go to "Configuration" -> "Integrations" click "+" and search for "Hilo". - -{% endif %} - -## Configuration - -The configuration is done in the UI. When you add the integration, you will be redirected to Hilo's authentication website. -You have to accept to link your account. After this, you will be prompted with assigning a room for each one of -your devices. - -### Energy meters - -Energy meters are a new feature of this integration. We used to manually generate them with template sensors and automation, -but they now have been fully integrated into the Hilo integration. - -#### Warning - -When enabling Hilo generated energy meters, it's recommended to remove the manually generated ones to have the most accurate -statistics, otherwise we might end up with duplicated data. - -This wasn't tested with already active data and energy entities (ie: Battery, Gaz, Solar, or even other individual devices). -It's possible that enabling this will break or delete these original sensors. We can't be held responsible for any data loss -service downtime, or any kind as it's described in the license. - -If you're facing an issue and you want to collaborate, please enable `debug` log level for this integration and provide a copy -of the `home-assistant.log` file. Details on how to enable `debug` are below. - -#### Procedure - -If you want to enable the automatic generation of the energy sensors, follow these steps: - -* Make sure that the `utility_meter` platform is loaded in your `configuration.yaml` file from -home assistant. You simply need to add a line like this in your `configuration.yaml`: - - ``` - utility_meter: - ``` - -* Click `Configure` in the integration UI and check the `Generate energy meters` box. - -* Restart home assistant and wait 5 minutes until you see the `sensor.hilo_energy_total_low` entity getting created and populated - with data: - * The `status` should be in `collecting` - * The `state` should be a number higher than 0. - -* All generated entities and sensors will be prefixed with `hilo_energy_` or `hilo_rate_`. - -* If you see the following error in your logs, this is a bug in Home Assistant and it's because the power meter in question has 0 w/h - usage so far. This will disappear once usage has been calculated. There's a PR upstream [here](https://github.com/home-assistant/core/pull/60678) to address this. - - ``` - 2021-11-29 22:03:46 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved - Traceback (most recent call last): - [...] - ValueError: could not convert string to float: 'None' - ``` - -### Other configuration - -Other options are available under the `Configure` button in Home Assistant: - -- `hq_plan_name`: String - Define the Hydro Quebec rate plan name. - Only 2 values are supported at this time: - - `rate d` - - `flex d` - -- `scan_interval`: Integer - Number of seconds between each device update. Defaults to 60 and it's not recommended to go below 30 as it might - result in a suspension from Hilo. - -## Lovelace sample integration - -Here's an example on how to add the energy data to Lovelace. -
- Click to expand - -``` - - type: vertical-stack - cards: - - type: "custom:paper-buttons-row" - buttons: - - type: entity - entity: sensor.hilo_gateway - name: false - action: none - state: false - state_styles: - "on": - button: - color: green - "off": - button: - color: red - - - type: entity - entity: sensor.defi_hilo - state: false - action: none - state_styles: - "on": - button: - color: red - "scheduled": - button: - color: yellow - "pre_heat": - button: - color: red - "recovery": - button: - color: blue - "off": - button: - color: green - - type: entity - entity: sensor.smartenergymeter_power - name: false - layout: icon|state - action: none - state: "{{ states(config.entity) }}" - icon: mdi:speedometer - style: - button: - color: >- - {% if states(config.entity) | int > 1000 %} - yellow - {% elif states(config.entity) | int > 1500 %} - orange - {% elif states(config.entity) | int > 2000 %} - red - {% else%} - green - {% endif %} - - type: entity - entity: sensor.hilo_rate_current - name: false - layout: icon|state - action: none - state: "{{ states(config.entity) }}" - style: - button: - color: >- - {% if states(config.entity) | float > 0.07 %} - yellow - {% elif states(config.entity) | float > 0.1 %} - red - {% else%} - green - {% endif %} - - - type: energy-date-selection - - type: energy-sources-table - - type: energy-usage-graph - - type: energy-distribution - link_dashboard: true -``` -
- -## Credits - -Credits to [Francis Poisson](https://github.com/francispoisson/) who's the original author of this integration. - ---- - -[integration_blueprint]: https://github.com/custom-components/integration_blueprint -[commits-shield]: https://img.shields.io/github/commit-activity/y/dvd-dev/hilo.svg?style=for-the-badge -[commits]: https://github.com/dvd-dev/hilo/commits/main -[hacs]: https://hacs.xyz -[hacsbadge]: https://img.shields.io/badge/HACS-Default-41BDF5.svg?style=for-the-badge -[license]: https://github.com/dvd-dev/hilo/blob/main/LICENSE -[license-shield]: https://img.shields.io/github/license/dvd-dev/hilo.svg?style=for-the-badge -[maintenance-shield]: https://img.shields.io/badge/maintainer-%40dvd--dev-blue.svg?style=for-the-badge -[releases-shield]: https://img.shields.io/github/release/dvd-dev/hilo.svg?style=for-the-badge -[releases]: https://github.com/dvd-dev/hilo/releases -[user_profile]: https://github.com/dvd-dev -[pre-commit-shield]: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white&style=for-the-badge -[pre-commit]: https://github.com/pre-commit/pre-commit -[calver-shield]: https://img.shields.io/badge/calver-YYYY.MM.Micro-22bfda.svg?style=for-the-badge -[calver]: http://calver.org/ -[black-shield]: https://img.shields.io/badge/code%20style-black-000000.svg?style=for-the-badge -[black]: https://github.com/psf/black -[lgtm-alert]: https://lgtm.com/projects/g/dvd-dev/hilo/alerts/ -[lgtm-alert-shield]: https://img.shields.io/lgtm/alerts/g/dvd-dev/hilo.svg?logo=lgtm&style=for-the-badge -[lgtm-grade]: https://lgtm.com/projects/g/dvd-dev/hilo/context:python -[lgtm-grade-shield]: https://img.shields.io/lgtm/grade/python/g/dvd-dev/hilo.svg?logo=lgtm&style=for-the-badge -[discord-shield]: https://img.shields.io/badge/discord-Chat-green?logo=discord&style=for-the-badge -[discord]: https://discord.gg/MD5ydRJxpc From 970a52287594061e40949d039b03340d1339694c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89li=20Hamel?= <88721578+MivraMe@users.noreply.github.com> Date: Tue, 4 Feb 2025 23:38:27 -0500 Subject: [PATCH 02/13] ajouter image config + --- README.md | 2 +- image.png | Bin 0 -> 51689 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 image.png diff --git a/README.md b/README.md index 656463e..0fbdb7d 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,7 @@ Si vous rencontrez un problème et souhaitez collaborer, activez la journalisati ## ⚙️ Autres options de configuration Vous pouvez configurer des options supplémentaires en cliquant sur `Configurer` dans Home Assistant : - +![alt text](image.png) ### ✅ **Générer compteurs de consommation électrique** - Génère automatiquement les compteurs de consommation électrique. - **Nécessite** la ligne suivante dans `configuration.yaml` : diff --git a/image.png b/image.png new file mode 100644 index 0000000000000000000000000000000000000000..c239ef1faedde859bfd1d5d030224c28f0f3344c GIT binary patch literal 51689 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 literal 0 HcmV?d00001 From b2d2becd89b39763f2381c4d5174a59fbfb3f5db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89li=20Hamel?= <88721578+MivraMe@users.noreply.github.com> Date: Wed, 5 Feb 2025 10:10:25 -0500 Subject: [PATCH 03/13] move contributing section to contributing.md (FR) --- CONTRIBUTING.md | 136 +++++++++++++++++++++++++----------------------- README.md | 106 +------------------------------------ 2 files changed, 73 insertions(+), 169 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0bdc2b9..b703d77 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,95 +1,101 @@ -# Contribution guidelines +# 🤝 Contribuer -Contributing to this project should be as easy and transparent as possible, whether it's: +Rapporter tout problème est une excellente manière pour tous de contribuer au projet. -- Reporting a bug -- Discussing the current state of the code -- Submitting a fix -- Proposing new features +Si vous rencontrez des problèmes ou observez des comportements étranges, veuillez soumettre une "Issue" en y joignant vos journaux. -## GitHub is used for everything +## 📜 Activer la journalisation de débogage +Pour activer la journalisation de débogage, ajoutez ceci dans votre fichier `configuration.yaml` : -GitHub is used to host code, to track issues and feature requests, as well as accept pull requests. +```yaml +logger: + default: info + logs: + custom_components.hilo: debug + pyhilo: debug +``` -Pull requests are the best way to propose changes to the codebase. +Si vous avez de l'expérience en Python ou avec Home Assistant et souhaitez contribuer au code, n'hésitez pas à soumettre une pull request. -1. Fork the repo and create your branch from `master`. -2. If you've changed something, update the documentation. -3. Make sure your code lints (using black). -4. Test you contribution. -5. Issue that pull request! +--- -## Any contributions you make will be under the MIT Software License +# 🛠️ Préparer un environnement de développement via VSCode DevContainer -In short, when you submit code changes, your submissions are understood to be under the same [MIT License](http://choosealicense.com/licenses/mit/) that covers the project. Feel free to contact the maintainers if that's a concern. +Pour faciliter le développement, un environnement est disponible via DevContainer de VSCode. Assurez-vous d'avoir **VSCode** et **Docker** installés sur votre ordinateur. -## Report bugs using GitHub's [issues](../../issues) +1. Ouvrez le dossier du projet dans VSCode. +2. Installez l'extension **Remote - Containers**. +3. Ouvrez la palette de commandes (**Ctrl+Shift+P** ou **Cmd+Shift+P**) et recherchez : + ``` + Remote-Containers: Reopen in Container + ``` +4. Attendez que l'environnement soit prêt. +5. Ouvrez un terminal dans VSCode et exécutez : + ```bash + scripts/develop + ``` + pour installer les dépendances et lancer Home Assistant. +6. VSCode devrait vous proposer d'ouvrir un navigateur pour accéder à Home Assistant. Sinon, ouvrez manuellement : + ``` + http://localhost:8123 + ``` +7. Effectuez la configuration initiale de Home Assistant. +8. Ajoutez l'intégration **Hilo** via l'interface utilisateur. +9. Modifiez les fichiers dans le dossier `custom_components/hilo` et observez les changements en temps réel dans Home Assistant. -GitHub's issues are used to track public bugs. -Report a bug by [opening a new issue](../../issues/new/choose); it's that easy! +Dans le terminal où vous avez lancé `scripts/develop`, les journaux de Home Assistant et de l'intégration Hilo devraient défiler. -## Write bug reports with detail, background, and sample code +--- -**Great Bug Reports** tend to have: +# ✅ Avant de soumettre une Pull Request -- A quick summary and/or background -- Steps to reproduce - - Be specific! - - Give sample code if you can. -- What you expected would happen -- What actually happens -- Notes (possibly including why you think this might be happening, or stuff you tried that didn't work) -- If you need to add logs, make sure debug log level is enabled in your home-assistant `configuration.yaml`: -``` -logger: - default: info - logs: - custom_components.hilo: debug - pyhilo: debug -``` +Il est essentiel de tester vos modifications sur une installation locale. Vous pouvez modifier les fichiers `.py` de l'intégration directement dans votre dossier `custom_components/hilo`. -People _love_ thorough bug reports. I'm not even kidding. +⚠ **N'oubliez pas votre copie de sauvegarde!** -## Use a Consistent Coding Style +Si vous devez modifier `python-hilo` pour vos tests, installez votre fork avec la commande suivante dans votre CLI : -Use [black](https://github.com/ambv/black) to make sure the code follows the style. +```bash +pip install -e git+https://github.com/VOTRE_FORK_ICI/python-hilo.git#egg=python-hilo +``` -Or use the `pre-commit` settings implemented in this repository -(see dedicated section below). +Redémarrez ensuite Home Assistant pour que l'installation prenne effet. Pour revenir en arrière : -## Test your code modification +```bash +pip install python-hilo +``` -This custom component is based on [integration_blueprint template](https://github.com/custom-components/integration_blueprint). +Puis redémarrez Home Assistant. -It comes with development environment in a container, easy to launch -if you use Visual Studio Code. With this container you will have a stand alone -Home Assistant instance running and already configured with the included -[`.devcontainer/configuration.yaml`](./.devcontainer/configuration.yaml) -file. +--- -You can use the `pre-commit` settings implemented in this repository to have -linting tool checking your contributions (see dedicated section below). +# 🚀 Soumettre une Pull Request -## Pre-commit +1. **Créez un fork** du dépôt dans votre espace utilisateur. +2. **Clonez-le** sur votre ordinateur. +3. Pour maintenir une certaine standardisation du code, nous utilisons des **linters** et des **validateurs** exécutés via des hooks `pre-commit` : -You can use the [pre-commit](https://pre-commit.com/) settings included in the -repository to have code style and linting checks. + ```bash + pre-commit install --install-hooks + ``` -With `pre-commit` tool already installed, -activate the settings of the repository: +4. Apportez vos modifications au code. +5. Une fois terminé, ajoutez les fichiers modifiés : -```console -$ pre-commit install -``` + ```bash + git add path/to/file + ``` -Now the pre-commit tests will be done every time you commit. +6. Créez un commit : -You can run the tests on all repository file with the command: + ```bash + git commit -m "J'ai changé ceci parce que ..." + ``` -```console -$ pre-commit run --all-files -``` +7. Poussez les changements vers votre dépôt distant : -## License + ```bash + git push + ``` -By contributing, you agree that your contributions will be licensed under its MIT License. +8. Sur le dépôt d'origine, **GitHub** devrait vous proposer de créer une **Pull Request** (PR). Suivez les instructions. diff --git a/README.md b/README.md index 0fbdb7d..acd5090 100644 --- a/README.md +++ b/README.md @@ -189,111 +189,8 @@ logger: pyhilo: debug ``` ---- - -# 🤝 Contribuer - -Rapporter tout problème est une excellente manière pour tous de contribuer au projet. - -Si vous rencontrez des problèmes ou observez des comportements étranges, veuillez soumettre une "Issue" en y joignant vos journaux. - -## 📜 Activer la journalisation de débogage -Pour activer la journalisation de débogage, ajoutez ceci dans votre fichier `configuration.yaml` : - -```yaml -logger: - default: info - logs: - custom_components.hilo: debug - pyhilo: debug -``` - -Si vous avez de l'expérience en Python ou avec Home Assistant et souhaitez contribuer au code, n'hésitez pas à soumettre une pull request. - ---- - -# 🛠️ Préparer un environnement de développement via VSCode DevContainer - -Pour faciliter le développement, un environnement est disponible via DevContainer de VSCode. Assurez-vous d'avoir **VSCode** et **Docker** installés sur votre ordinateur. - -1. Ouvrez le dossier du projet dans VSCode. -2. Installez l'extension **Remote - Containers**. -3. Ouvrez la palette de commandes (**Ctrl+Shift+P** ou **Cmd+Shift+P**) et recherchez : - ``` - Remote-Containers: Reopen in Container - ``` -4. Attendez que l'environnement soit prêt. -5. Ouvrez un terminal dans VSCode et exécutez : - ```bash - scripts/develop - ``` - pour installer les dépendances et lancer Home Assistant. -6. VSCode devrait vous proposer d'ouvrir un navigateur pour accéder à Home Assistant. Sinon, ouvrez manuellement : - ``` - http://localhost:8123 - ``` -7. Effectuez la configuration initiale de Home Assistant. -8. Ajoutez l'intégration **Hilo** via l'interface utilisateur. -9. Modifiez les fichiers dans le dossier `custom_components/hilo` et observez les changements en temps réel dans Home Assistant. - -Dans le terminal où vous avez lancé `scripts/develop`, les journaux de Home Assistant et de l'intégration Hilo devraient défiler. - ---- - -# ✅ Avant de soumettre une Pull Request +--- -Il est essentiel de tester vos modifications sur une installation locale. Vous pouvez modifier les fichiers `.py` de l'intégration directement dans votre dossier `custom_components/hilo`. - -⚠ **N'oubliez pas votre copie de sauvegarde!** - -Si vous devez modifier `python-hilo` pour vos tests, installez votre fork avec la commande suivante dans votre CLI : - -```bash -pip install -e git+https://github.com/VOTRE_FORK_ICI/python-hilo.git#egg=python-hilo -``` - -Redémarrez ensuite Home Assistant pour que l'installation prenne effet. Pour revenir en arrière : - -```bash -pip install python-hilo -``` - -Puis redémarrez Home Assistant. - ---- - -# 🚀 Soumettre une Pull Request - -1. **Créez un fork** du dépôt dans votre espace utilisateur. -2. **Clonez-le** sur votre ordinateur. -3. Pour maintenir une certaine standardisation du code, nous utilisons des **linters** et des **validateurs** exécutés via des hooks `pre-commit` : - - ```bash - pre-commit install --install-hooks - ``` - -4. Apportez vos modifications au code. -5. Une fois terminé, ajoutez les fichiers modifiés : - - ```bash - git add path/to/file - ``` - -6. Créez un commit : - - ```bash - git commit -m "J'ai changé ceci parce que ..." - ``` - -7. Poussez les changements vers votre dépôt distant : - - ```bash - git push - ``` - -8. Sur le dépôt d'origine, **GitHub** devrait vous proposer de créer une **Pull Request** (PR). Suivez les instructions. - ---- # 👥 Collaborateurs initiaux @@ -306,6 +203,7 @@ Puis redémarrez Home Assistant. - **[Hilo](https://www.hiloenergie.com)** : Merci à Hilo pour son soutien et ses contributions. --- +💡 **Envie de contribuer ?** Consultez la [section contribution](#contribution) pour voir comment aider au projet. [integration_blueprint]: https://github.com/custom-components/integration_blueprint [commits-shield]: https://img.shields.io/github/commit-activity/y/dvd-dev/hilo.svg?style=for-the-badge From 44347d426215a18e05c649e65e47287ccc8c6d14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89li=20Hamel?= <88721578+MivraMe@users.noreply.github.com> Date: Wed, 5 Feb 2025 10:36:30 -0500 Subject: [PATCH 04/13] =?UTF-8?q?garder=20des=20=C3=A9l=C3=A9ments=20de=20?= =?UTF-8?q?l'ancien=20CONTRIBUTING.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CONTRIBUTING.md | 112 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 77 insertions(+), 35 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b703d77..d6cd14b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,11 +1,29 @@ -# 🤝 Contribuer +# 🤝 Contribuer -Rapporter tout problème est une excellente manière pour tous de contribuer au projet. +Contribuer à ce projet doit être aussi simple et transparent que possible, que ce soit pour : -Si vous rencontrez des problèmes ou observez des comportements étranges, veuillez soumettre une "Issue" en y joignant vos journaux. +- Signaler un bug +- Discuter du code existant +- Proposer des corrections +- Suggérer de nouvelles fonctionnalités -## 📜 Activer la journalisation de débogage -Pour activer la journalisation de débogage, ajoutez ceci dans votre fichier `configuration.yaml` : +## 🚀 GitHub est utilisé pour tout + +GitHub est la plateforme principale pour héberger le code, suivre les problèmes et demandes de fonctionnalités, et accepter les pull requests. + +Les pull requests sont le meilleur moyen de proposer des modifications du code : + +1. **Créez un fork** du dépôt et créez votre branche à partir de `master`. +2. Si vous avez modifié quelque chose, mettez à jour la documentation. +3. Assurez-vous que votre code suit les règles de formatage (utilisation de `black`). +4. Testez votre contribution. +5. Soumettez une pull request ! + +--- + +## 📜 Activer la journalisation de débogage + +Si vous devez signaler un problème, il est recommandé d'activer la journalisation de débogage en ajoutant ceci dans votre fichier `configuration.yaml` : ```yaml logger: @@ -15,87 +33,111 @@ logger: pyhilo: debug ``` -Si vous avez de l'expérience en Python ou avec Home Assistant et souhaitez contribuer au code, n'hésitez pas à soumettre une pull request. - --- -# 🛠️ Préparer un environnement de développement via VSCode DevContainer +## 🛠️ Préparer un environnement de développement via VSCode DevContainer -Pour faciliter le développement, un environnement est disponible via DevContainer de VSCode. Assurez-vous d'avoir **VSCode** et **Docker** installés sur votre ordinateur. +Pour faciliter le développement, un environnement est disponible via DevContainer de VSCode. Assurez-vous d'avoir **VSCode** et **Docker** installés sur votre ordinateur. -1. Ouvrez le dossier du projet dans VSCode. -2. Installez l'extension **Remote - Containers**. -3. Ouvrez la palette de commandes (**Ctrl+Shift+P** ou **Cmd+Shift+P**) et recherchez : +1. Ouvrez le dossier du projet dans VSCode. +2. Installez l'extension **Remote - Containers**. +3. Ouvrez la palette de commandes (**Ctrl+Shift+P** ou **Cmd+Shift+P**) et recherchez : ``` Remote-Containers: Reopen in Container ``` -4. Attendez que l'environnement soit prêt. -5. Ouvrez un terminal dans VSCode et exécutez : +4. Attendez que l'environnement soit prêt. +5. Ouvrez un terminal dans VSCode et exécutez : ```bash scripts/develop ``` - pour installer les dépendances et lancer Home Assistant. -6. VSCode devrait vous proposer d'ouvrir un navigateur pour accéder à Home Assistant. Sinon, ouvrez manuellement : + pour installer les dépendances et lancer Home Assistant. +6. VSCode devrait vous proposer d'ouvrir un navigateur pour accéder à Home Assistant. Sinon, ouvrez manuellement : ``` http://localhost:8123 ``` -7. Effectuez la configuration initiale de Home Assistant. -8. Ajoutez l'intégration **Hilo** via l'interface utilisateur. -9. Modifiez les fichiers dans le dossier `custom_components/hilo` et observez les changements en temps réel dans Home Assistant. +7. Effectuez la configuration initiale de Home Assistant. +8. Ajoutez l'intégration **Hilo** via l'interface utilisateur. +9. Modifiez les fichiers dans le dossier `custom_components/hilo` et observez les changements en temps réel dans Home Assistant. -Dans le terminal où vous avez lancé `scripts/develop`, les journaux de Home Assistant et de l'intégration Hilo devraient défiler. +Dans le terminal où vous avez lancé `scripts/develop`, les journaux de Home Assistant et de l'intégration Hilo devraient défiler. --- -# ✅ Avant de soumettre une Pull Request +## ✅ Avant de soumettre une Pull Request -Il est essentiel de tester vos modifications sur une installation locale. Vous pouvez modifier les fichiers `.py` de l'intégration directement dans votre dossier `custom_components/hilo`. +Il est essentiel de tester vos modifications sur une installation locale. Vous pouvez modifier les fichiers `.py` de l'intégration directement dans votre dossier `custom_components/hilo`. -⚠ **N'oubliez pas votre copie de sauvegarde!** +⚠ **N'oubliez pas votre copie de sauvegarde !** -Si vous devez modifier `python-hilo` pour vos tests, installez votre fork avec la commande suivante dans votre CLI : +Si vous devez modifier `python-hilo` pour vos tests, installez votre fork avec la commande suivante : ```bash pip install -e git+https://github.com/VOTRE_FORK_ICI/python-hilo.git#egg=python-hilo ``` -Redémarrez ensuite Home Assistant pour que l'installation prenne effet. Pour revenir en arrière : +Redémarrez ensuite Home Assistant pour que l'installation prenne effet. Pour revenir en arrière : ```bash pip install python-hilo ``` -Puis redémarrez Home Assistant. +Puis redémarrez Home Assistant. --- -# 🚀 Soumettre une Pull Request +## 🚀 Soumettre une Pull Request -1. **Créez un fork** du dépôt dans votre espace utilisateur. -2. **Clonez-le** sur votre ordinateur. -3. Pour maintenir une certaine standardisation du code, nous utilisons des **linters** et des **validateurs** exécutés via des hooks `pre-commit` : +1. **Créez un fork** du dépôt dans votre espace utilisateur. +2. **Clonez-le** sur votre ordinateur. +3. Pour maintenir une certaine standardisation du code, nous utilisons des **linters** et des **validateurs** exécutés via des hooks `pre-commit` : ```bash pre-commit install --install-hooks ``` -4. Apportez vos modifications au code. -5. Une fois terminé, ajoutez les fichiers modifiés : +4. Apportez vos modifications au code. +5. Une fois terminé, ajoutez les fichiers modifiés : ```bash git add path/to/file ``` -6. Créez un commit : +6. Créez un commit : ```bash git commit -m "J'ai changé ceci parce que ..." ``` -7. Poussez les changements vers votre dépôt distant : +7. Poussez les changements vers votre dépôt distant : ```bash git push ``` -8. Sur le dépôt d'origine, **GitHub** devrait vous proposer de créer une **Pull Request** (PR). Suivez les instructions. +8. Sur le dépôt d'origine, **GitHub** devrait vous proposer de créer une **Pull Request** (PR). Suivez les instructions. + +--- + +## 🛠️ Utiliser un style de code cohérent + +Nous utilisons [black](https://github.com/psf/black) pour garantir un formatage uniforme du code. Vous pouvez également utiliser les paramètres `pre-commit` intégrés dans ce dépôt. + +Pour activer `pre-commit` : + +```bash +pre-commit install +``` + +Maintenant, les tests `pre-commit` seront exécutés à chaque commit. + +Pour les exécuter manuellement sur tous les fichiers : + +```bash +pre-commit run --all-files +``` + +--- + +## 📜 Licence + +En contribuant, vous acceptez que vos contributions soient sous licence MIT, comme le reste du projet. Pour plus d'informations, consultez la [licence MIT](http://choosealicense.com/licenses/mit/). From 076eace0b45e8ea74ce7f6f6aa1338f96db03c18 Mon Sep 17 00:00:00 2001 From: "Ian C." <108159253+ic-dev21@users.noreply.github.com> Date: Sun, 9 Feb 2025 12:31:13 -0500 Subject: [PATCH 05/13] Linting --- README.md | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index acd5090..b3ab7a2 100644 --- a/README.md +++ b/README.md @@ -48,25 +48,25 @@ L'API servant à la lecture initial de la liste d'appareils sur votre compte Hil Plus de détails disponibles dans [issue #564](https://github.com/dvd-dev/hilo/issues/564). ## 📌 Introduction -Cette intégration non-officielle HACS permet d'utiliser [Hilo](https://www.hiloenergie.com/fr-ca/) avec Home Assistant. **Elle n'est pas affiliée à Hilo ou Hydro-Québec.** +Cette intégration non-officielle HACS permet d'utiliser [Hilo](https://www.hiloenergie.com/fr-ca/) avec Home Assistant. **Elle n'est pas affiliée à Hilo ou Hydro-Québec.** **⚠️ Ne contactez pas Hilo ou Hydro-Québec pour les problèmes liés à cette intégration.** -🔗 [Configuration minimale recommandée](https://github.com/dvd-dev/hilo/wiki/FAQ-%E2%80%90-Français#avez-vous-une-configuration-recommandée) -🔗 Blueprints : [NumerID](https://github.com/NumerID/blueprint_hilo) | [Arim215](https://github.com/arim215/ha-hilo-blueprints) -🔗 Exemples d'automatisations YAML : [Automatisations](https://github.com/dvd-dev/hilo/tree/main/doc/automations) -🔗 Exemples d'interfaces Lovelace : [Interfaces](https://github.com/dvd-dev/hilo/wiki/Utilisation) +🔗 [Configuration minimale recommandée](https://github.com/dvd-dev/hilo/wiki/FAQ-%E2%80%90-Français#avez-vous-une-configuration-recommandée) +🔗 Blueprints : [NumerID](https://github.com/NumerID/blueprint_hilo) | [Arim215](https://github.com/arim215/ha-hilo-blueprints) +🔗 Exemples d'automatisations YAML : [Automatisations](https://github.com/dvd-dev/hilo/tree/main/doc/automations) +🔗 Exemples d'interfaces Lovelace : [Interfaces](https://github.com/dvd-dev/hilo/wiki/Utilisation) --- ## 🔥 Fonctionnalités principales -✅ Supporte les interrupteurs et gradateurs comme lumières -✅ Contrôle des thermostats et lecture des températures -✅ Suivi de la consommation énergétique des appareils Hilo -✅ Sensor pour les défis et la passerelle Hilo -✅ Configuration via l'interface utilisateur -✅ Authentification via le site web d'Hilo -✅ Capteur météo extérieure avec icône changeante +✅ Supporte les interrupteurs et gradateurs comme lumières +✅ Contrôle des thermostats et lecture des températures +✅ Suivi de la consommation énergétique des appareils Hilo +✅ Sensor pour les défis et la passerelle Hilo +✅ Configuration via l'interface utilisateur +✅ Authentification via le site web d'Hilo +✅ Capteur météo extérieure avec icône changeante 📌 **À faire** : Support d'autres appareils, amélioration des compteurs de consommation, documentation API @@ -102,23 +102,23 @@ Cette intégration non-officielle HACS permet d'utiliser [Hilo](https://www.hilo ## 📌 Suivis de la consommation électrique Si vous souhaitez utiliser la génération automatique des capteurs de consommation électrique, suivez ces étapes : -1. **Ajouter la plateforme `utility_meter`** +1. **Ajouter la plateforme `utility_meter`** Ajoutez la ligne suivante dans votre fichier `configuration.yaml` : ```yaml utility_meter: ``` -2. **Activer la génération automatique** +2. **Activer la génération automatique** - Dans l'interface utilisateur de l'intégration, cliquez sur `Configurer`. - Cochez **Générer compteurs de consommation électrique**. -3. *(Optionnel)* **Redémarrer Home Assistant** +3. *(Optionnel)* **Redémarrer Home Assistant** - Attendez environ 5 minutes. L'entité `sensor.hilo_energy_total_low` sera créée et contiendra des données. - **Le `status`** devrait être `collecting`. - **L'état `state`** devrait être un nombre supérieur à 0. - Toutes les entités et capteurs créés seront préfixés ou suffixés par `hilo_energy_` ou `hilo_rate_`. -4. **Erreur connue (à ignorer)** +4. **Erreur connue (à ignorer)** Si vous voyez cette erreur dans le journal de Home Assistant, elle peut être ignorée : ``` 2021-11-29 22:03:46 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved @@ -127,7 +127,7 @@ Si vous souhaitez utiliser la génération automatique des capteurs de consommat ValueError: could not convert string to float: 'None' ``` -5. **Ajout manuel au tableau de bord "Énergie"** +5. **Ajout manuel au tableau de bord "Énergie"** Une fois créés, les compteurs devront être ajoutés manuellement. --- @@ -177,7 +177,7 @@ Vous pouvez configurer des options supplémentaires en cliquant sur `Configurer` ## 📌 FAQ et support -🔗 [FAQ complète](https://github.com/dvd-dev/hilo/wiki/FAQ) +🔗 [FAQ complète](https://github.com/dvd-dev/hilo/wiki/FAQ) 💬 Rejoignez la communauté sur [Discord](https://discord.gg/MD5ydRJxpc) **Problèmes ?** Ouvrez une "Issue" avec les logs `debug` activés dans `configuration.yaml` : @@ -189,18 +189,18 @@ logger: pyhilo: debug ``` ---- +--- -# 👥 Collaborateurs initiaux +# 👥 Collaborateurs initiaux -- **[Francis Poisson](https://github.com/francispoisson/)** -- **[David Vallee Delisle](https://github.com/valleedelisle/)** +- **[Francis Poisson](https://github.com/francispoisson/)** +- **[David Vallee Delisle](https://github.com/valleedelisle/)** -## 🎖️ Mentions très honorables +## 🎖️ Mentions très honorables -- **[Ian Couture](https://github.com/ic-dev21/)** : Il maintient cet addon depuis un certain temps. -- **[Hilo](https://www.hiloenergie.com)** : Merci à Hilo pour son soutien et ses contributions. +- **[Ian Couture](https://github.com/ic-dev21/)** : Il maintient cet addon depuis un certain temps. +- **[Hilo](https://www.hiloenergie.com)** : Merci à Hilo pour son soutien et ses contributions. --- 💡 **Envie de contribuer ?** Consultez la [section contribution](#contribution) pour voir comment aider au projet. From 6033ff303e7a94f368de44ed64a807c0e152b063 Mon Sep 17 00:00:00 2001 From: "Ian C." <108159253+ic-dev21@users.noreply.github.com> Date: Sun, 9 Feb 2025 12:34:38 -0500 Subject: [PATCH 06/13] Traduction --- README.en.md | 426 +++++++++++++++++---------------------------------- 1 file changed, 137 insertions(+), 289 deletions(-) diff --git a/README.en.md b/README.en.md index 866ea2b..0151a6e 100644 --- a/README.en.md +++ b/README.en.md @@ -11,274 +11,175 @@ [![calver][calver-shield]][calver] [![discord][discord-shield]][discord] - **BETA** -This is a beta release. There will be some bugs, issues, etc. Please bear with us and open issues in the repo. - -# Hilo -[Hilo](https://www.hydroquebec.com/hilo/en/) integration for Home Assistant - -# :warning: Breaking change to come, please keep your component updated :warning: - -The API we rely on for Hilo Challenges will be closed in the near future, we are currently working on an alternative -using Websockets/SignalR. **Updating to 2025.2.1 and later is strongly suggested** as prior versions will likely break due to the way -pip installs dependencies. - -Several users and I are in the process of migrating our communications with the Hilo API to Websocket/SignalR instead of -API calls. This transition will be gradual, and we will do everything we can to avoid breaking existing installations. - -The first step will be updating the `python-hilo` library (https://github.com/dvd-dev/python-hilo). This change should be -seamless for everyone. - -Next, we will migrate the challenge sensor (`sensor.defi_hilo`) to Websocket/SignalR. The good news is that this method completely eliminates the temporary "glitches" that occurred with the challenge sensor. - -### Remaining tasks: -- The `allowed_kWh` and `used_kWh` attributes are currently **non-functional**. The data arrives in fragments, and not all cases have been handled yet. -- The `"completed"` state does not always work, possibly due to a race condition. -- Some information, such as `total_devices`, `opt_out_devices`, and `pre_heat_devices`, does not persist in memory. - -More details are available in **issue #486**. - -The API used for the initial retrieval of the device list on your Hilo account will also undergo the same transition. - -More details are available in **issue #564**. - -## Introduction - -This is the unofficial HACS Hilo integration for Home Assistant. [Hilo](https://www.hiloenergie.com/en-ca/) is a smart home platform developed -by a [Hydro Quebec](https://www.hydroquebec.com/hilo/en/) subsidiary. -This integration has no direct tie with Hilo or Hydro Quebec. This is a community initiative. Please don't contact -Hilo or Hydro-Quebec with issues with this Home Assistant integration, you can open an issue in the GitHub repository -instead. - -If you want to help with the development of this integration, you can always submit a feedback form from the Hilo -application and requesting that they open their API publicly and that they provide a testing environment to the -developers. - -### TL:DR version: - -You can find a recommended minimal configuration [in the wiki](https://github.com/dvd-dev/hilo/wiki/FAQ#do-you-have-any-recommended-settings) - - -You can also find sample automations in YAML format [in the doc/automations directory](https://github.com/dvd-dev/hilo/tree/main/doc/automations) -If you prefer blueprints, there are some available here: - - [NumerID's repository](https://github.com/NumerID/blueprint_hilo) - - [Arim215's repository](https://github.com/arim215/ha-hilo-blueprints) - -### Shout out - -Big shout out to [Francis Poisson](https://github.com/francispoisson/) who's the original author of this integration. Without the work -he put into this integration, I would probably have never even considered Hilo. - -Another big shout out to @ic-dev21 for his implication at multiple levels. - -I decided to move the integration here because of the latest updates from Hilo broke the original one, and I took the time to completely -rewrite it. Hilo is now pushing device readings via websocket from SignalR. - -### Features -- Support for switches and dimmers as light devices -- Get current and set target temperature of thermostat -- Get energy usage of pretty much each device -- Generates energy meters and sensors -- Sensor for Hilo Events (challenges) -- Sensor for Hilo Gateway -- Now configuration is done via the UI -- Updates are now closer to realtime -- **NEW**: Authentication directly on Hilo's website -- **NEW**: Outdoor weather sensor with changing icon like in the Hilo App - -### To Do: -- Add functionalities for other devices -- unit and functional tests -- [Adding type hints to the code](https://developers.home-assistant.io/docs/development_typing/) -- API calls to Hilo documentation now available [here](https://github.com/dvd-dev/python-hilo) -- Map send energy meters automatically to energy dashboard - +This is a Beta version. There will likely be bugs, issues, etc. Thank you for your patience and for opening "Issues". -## Installation +# Hilo - Home Assistant +Home Assistant integration for [Hilo](https://www.hiloenergie.com/fr-ca/) -### Step 0: Compatible install -This custom component requires that Hilo has carried out the installation in your home. It will not be possible to set it up otherwise. +# ⚠️ Major change coming, please keep your component up to date ⚠️ -This custom component has been tested to work by various users on HA OS (as bare metal or VM), Docker with the official (ghcr.io) image and Podman. Other types of install may cause permission issues during the creation of a few files needed by the custom component. +The API we rely on for Hilo challenges will be shut down soon. We are currently working on an +alternative using Websocket/SignalR. **Updating to version 2025.2.1 or later is strongly recommended**, as +previous versions may stop working due to how pip installs dependencies. -### Step 1: Download files +Several users and I are migrating our communications with the Hilo API to Websocket/SignalR +rather than API calls. The process will be gradual and we will do everything we can to avoid +breaking existing installations. -#### Option 1: Via HACS +First, we will update the `python-hilo` library (https://github.com/dvd-dev/python-hilo), +this change should be transparent for everyone. -[![Open Hilo inside your Home Assistant Community Store (HACS).](https://my.home-assistant.io/badges/hacs_repository.svg)](https://my.home-assistant.io/redirect/hacs_repository/?owner=dvd-dev&repository=hilo&category=integration) +Then, we will migrate the challenge sensor (`sensor.defi_hilo`) to Websocket/SignalR. The good news with this is +that momentary "glitches" of the challenge sensor are completely eliminated by this method. -Make sure you have [HACS](https://hacs.xyz/docs/setup/download/) installed. -Under HACS, click the '+ EXPLORE & DOWNLOAD REPOSITORIES' button on the bottom of the page, search for "Hilo", choose it, and click _download_ in HACS. +### What remains to be done on this side: +- The `allowed_kWh` and `used_kWh` attributes are currently **non-functional**, the information arrives in fragments and all +cases are not handled yet. +- The "completed" state doesn't always work, possibly a race condition +- Some information like `total_devices`, `opt_out_devices` and `pre_heat_devices` don't persist in memory. -#### Option 2: Manual +More details available in [issue #486](https://github.com/dvd-dev/hilo/issues/486). -Download and copy the `custom_components/hilo` directory from the [latest release](https://github.com/dvd-dev/hilo/releases/latest) to your `custom_components` directory in HA. +The API used for initially reading the list of devices on your Hilo account will also undergo the same treatment. -### Step 2: Add integration to HA (<--- this is a step that a lot of people forget) +More details available in [issue #564](https://github.com/dvd-dev/hilo/issues/564). -[![Open your Home Assistant instance and start setting up a new integration.](https://my.home-assistant.io/badges/config_flow_start.svg)](https://my.home-assistant.io/redirect/config_flow_start/?domain=hilo) +## 📌 Introduction +This unofficial HACS integration allows you to use [Hilo](https://www.hiloenergie.com/fr-ca/) with Home Assistant. **It is not affiliated with Hilo or Hydro-Québec.** -In HA, go to Settings > Devices & Services > Integrations. -In the bottom right corner, click the '+ ADD INTEGRATION' button. +**⚠️ Do not contact Hilo or Hydro-Québec for issues related to this integration.** -![Add Integration](https://github.com/dvd-dev/hilo/assets/108159253/7906f2c9-9547-4478-a625-feaa68e62c5f) +🔗 [Recommended minimum configuration](https://github.com/dvd-dev/hilo/wiki/FAQ-%E2%80%90-Français#avez-vous-une-configuration-recommandée) +🔗 Blueprints: [NumerID](https://github.com/NumerID/blueprint_hilo) | [Arim215](https://github.com/arim215/ha-hilo-blueprints) +🔗 YAML automation examples: [Automations](https://github.com/dvd-dev/hilo/tree/main/doc/automations) +🔗 Lovelace interface examples: [Interfaces](https://github.com/dvd-dev/hilo/wiki/Utilisation) -If the component is properly installed, you should be able to find the 'Hilo integration' in the list. You might need to clear your browser cache for the integration to show up. - -![Search Integration](https://github.com/dvd-dev/hilo/assets/108159253/1b560a73-042b-46cf-963c-98e5326e98e8) - - -## Configuration (new install) - -The configuration is done in the UI. When you add the integration, you will be redirected to Hilo's website login page to authenticate. - -![Open Website](https://github.com/dvd-dev/hilo/assets/108159253/23b4fb34-f8c3-40b3-8e01-b3e737cc9d44) - - -![Auth Hilo](https://github.com/dvd-dev/hilo/assets/108159253/e4e98b32-78d0-4c49-a2d7-3bd0ae95e9e0) - -You must then accept to link your account. To do so, you must enter your Home Assistant instance's URL or IP address and click Link Account. - -![Link](https://github.com/dvd-dev/hilo/assets/108159253/5eb945f7-fa5e-458f-b0fe-ef252aaadf93) - -![Link URL](https://github.com/dvd-dev/hilo/assets/108159253/2c54df64-2e1c-423c-89cf-0eee8f0d4b7b) - -After this, you will be prompted to assign a room for each one of your devices. - -## Configuration (update from a version earlier than v2024.3.1) - -After update, you will get an error saying you must reauthenticate for the integration to work. - -![Reconfiguration 2](https://github.com/dvd-dev/hilo/assets/108159253/a711d011-17a9-456f-abf6-74cf099014f1) - -![Reath](https://github.com/dvd-dev/hilo/assets/108159253/70118e68-90b9-4667-b056-38ee2cd33133) - -After correctly linking your account like in the previous section, you should see a popup telling you the reauthentification was successful. - -### Energy meters - -Energy meters are a feature of this integration. We used to manually generate them with template sensors and automation, -but they now have been fully integrated into the Hilo integration. - -#### Warning +--- -When enabling Hilo generated energy meters, it's recommended to remove the manually generated ones to have the most accurate -statistics, otherwise we might end up with duplicated data. +## 🔥 Main Features +✅ Supports switches and dimmers as lights +✅ Thermostat control and temperature reading +✅ Energy consumption monitoring of Hilo devices +✅ Sensor for Hilo challenges and gateway +✅ Configuration via user interface +✅ Authentication via Hilo website +✅ Outdoor weather sensor with changing icon -If you're facing an issue, and you want to collaborate, please enable `debug` log level for this integration and provide a copy -of the `home-assistant.log` file. Details on how to enable `debug` are [below](https://github.com/dvd-dev/hilo/blob/main/README.en.md#contributing). +📌 **To do**: Support for other devices, improvement of consumption meters, API documentation -#### Procedure +--- -If you want to enable the automatic generation of the energy sensors, follow these steps: +## 📥 Installation +### 1️⃣ Check Compatibility +- The integration requires Hilo hardware installed and functional. +- Tested on HA OS, Docker (ghcr.io), Podman. Other configurations may cause issues. -* Make sure that the `utility_meter` platform is loaded in your `configuration.yaml` file from -home assistant. You simply need to add a line like this in your `configuration.yaml`: +### 2️⃣ File Installation +#### 🔹 Option 1: Via HACS +[![Install via HACS](https://my.home-assistant.io/badges/hacs_repository.svg)](https://my.home-assistant.io/redirect/hacs_repository/?owner=dvd-dev&repository=hilo&category=integration) - ``` - utility_meter: - ``` +1. Make sure you have [HACS](https://hacs.xyz/docs/setup/download/) installed. +2. In HACS, click `+ EXPLORE & DOWNLOAD REPOSITORIES`, search for "Hilo" and download it. +3. Restart Home Assistant -* Click`Configure` on the integration UI and check the `Generate energy meters` box. +#### 🔹 Option 2: Manually +1. Download the latest version from [GitHub](https://github.com/dvd-dev/hilo/releases/latest). +2. Copy `custom_components/hilo` to Home Assistant's `custom_components` folder. +3. Restart Home Assistant -* Restart home assistant and wait 5 minutes until you see the `sensor.hilo_energy_total_low` entity getting created and populated - with data: - * The `status` should be in `collecting` - * The `state` should be a number higher than 0. +### 3️⃣ Add Integration to Home Assistant +[![Add Integration](https://my.home-assistant.io/badges/config_flow_start.svg)](https://my.home-assistant.io/redirect/config_flow_start/?domain=hilo) -* All generated entities and sensors will be prefixed or suffixed with `hilo_energy_` or `hilo_rate_`. +1. Go to **Settings > Devices & Services > Integrations**. +2. Click `+ ADD INTEGRATION` and search for "Hilo". +3. Authenticate on the Hilo website and link your account. -* If you see the following error in your logs, this is a bug in Home Assistant, and it's because the power meter in question has 0 W/h - usage so far. This will disappear once usage has been calculated. +--- - ``` - 2021-11-29 22:03:46 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved - Traceback (most recent call last): - [...] - ValueError: could not convert string to float: 'None' - ``` -Once created, energy meters will then have to be added manually to the energy dashboard. +## 📌 Power Consumption Tracking +If you want to use automatic generation of power consumption sensors, follow these steps: + +1. **Add the `utility_meter` platform** + Add the following line to your `configuration.yaml`: + ```yaml + utility_meter: + ``` + +2. **Enable automatic generation** + - In the integration's user interface, click `Configure`. + - Check **Generate power consumption meters**. + +3. *(Optional)* **Restart Home Assistant** + - Wait about 5 minutes. The `sensor.hilo_energy_total_low` entity will be created and contain data. + - **The `status`** should be `collecting`. + - **The `state`** should be a number greater than 0. + - All created entities and sensors will be prefixed or suffixed with `hilo_energy_` or `hilo_rate_`. + +4. **Known error (to ignore)** + If you see this error in the Home Assistant log, it can be ignored: + ``` + 2021-11-29 22:03:46 ERROR (MainThread) [homeassistant] Error doing job: Task exception was never retrieved + Traceback (most recent call last): + [...] + ValueError: could not convert string to float: 'None' + ``` + +5. **Manual addition to "Energy" dashboard** + Once created, meters will need to be added manually. +--- -### Other configurations +## ⚠️ Warning +When activating meters, it is recommended to **remove old manual sensors** to avoid duplicate data. -Other options are available under the `Configure` button in Home Assistant: +If you encounter a problem and want to collaborate, enable **debug** logging and provide an excerpt from the `home-assistant.log` file. The method is explained below. -- `Generate energy meters`: Checkbox +--- - Automatically generate energy meters, see procedure above for proper setup - Requires this line to be added to your configuration.yaml file: - ``` +## ⚙️ Other Configuration Options +You can configure additional options by clicking `Configure` in Home Assistant: +![alt text](image.png) +### ✅ **Generate power consumption meters** +- Automatically generates power consumption meters. +- **Requires** the following line in `configuration.yaml`: + ```yaml utility_meter: ``` -- `Generate only total meters for each devices`: Checkbox - - Calculate only energy total without splitting between low cost and high cost - -- `Also log request data and websocket messages (requires debug log level on both the integration and pyhilo)`: Checkbox - - Allows higher logging level for developers/debugging - -- `Lock climate entities during Hilo challenges, preventing any changes when a challenge is in progress.` - - Prevents modifying temperature setpoints during Hilo Challenges - -- `Track unknown power sources in a separate energy sensor. This is a round approximation calculated when we get a reading from the Smart Energy Meter.`: Checkbox - - All energy sources other than Hilo hardware are lumped into a single sensor. Uses the reading from the home's smart meter. - -- `hq_plan_name`: String - - Define the Hydro Quebec rate plan name. - Only 2 values are supported at this time: - - `rate d` - - `flex d` - -- `appreciation phase`: Integer (hours) - - Add an appreciation phase of X hours before the preheat phase. +### ✅ **Generate only total meters for each device** +- Calculates only the total energy **without division** between low and high cost. -- `pre_cold phase`: Integer (hours) +### ✅ **Log request data and Websocket messages** +- Requires **debug logging level** on the integration and `pyhilo`. +- Allows detailed tracking for development and debugging. - Add a cooldown phase of X hours to reduce temperatures before the appreciation phase +### ✅ **Lock `climate` entities during Hilo challenges** +- Prevents any modification of temperature setpoints **during a challenge** Hilo. -- `Scan interval (min: 60s)`: Integer +### ✅ **Track unknown consumption sources in a separate meter** +- All **non-Hilo** sources are grouped in a dedicated sensor. +- Uses the house's **smart meter** reading. - Number of seconds between each device update. Defaults to 60 and, it's not recommended to go below 30 as it might - result in a suspension from Hilo. Since [2023.11.1](https://github.com/dvd-dev/hilo/releases/tag/v2023.11.1) the minimum has changed from 15s to 60s. +### 📌 **Hydro-Québec rate name** (`rate d` or `flex d`) +- Define the **rate plan name**. +- **Supported values**: + - `'rate d'` + - `'flex d'` -## Lovelace sample integration and automation example +### ⏳ **Update interval (min: 60s)** +- Sets the **number of seconds** between each update. +- **Default value**: `60s`. +- **Don't go below 30s** to avoid suspension from Hilo. +- Since **2023.11.1**, the minimum has increased from **15s to 60s**. -You can find multiple examples and ideas for lovelace dashboard, cards and automation here [in the wiki of the project](https://github.com/dvd-dev/hilo/wiki/Utilisation) +## 📌 FAQ and Support +🔗 [Complete FAQ](https://github.com/dvd-dev/hilo/wiki/FAQ) +💬 Join the community on [Discord](https://discord.gg/MD5ydRJxpc) -You can also find sample automations in YAML format [in the doc/automations directory](https://github.com/dvd-dev/hilo/tree/main/doc/automations) - - -## References - -As stated above, this is an unofficial integration. Hilo is not supporting direct API calls and might obfuscate the service or -prevent us from using it. - -For now, these are the swagger links we've found: -* https://wapphqcdev01-automation.azurewebsites.net/swagger/index.html -* https://wapphqcdev01-notification.azurewebsites.net/swagger/index.html -* https://wapphqcdev01-clientele.azurewebsites.net/swagger/index.html - -## FAQ - -You can find the FAQ in the wiki of the project: https://github.com/dvd-dev/hilo/wiki/FAQ - -## Contributing - -Reporting any kind of issue is a good way of contributing to the project, and it's available to anyone. - -If you face any kind of problem or weird behavior, please submit an issue and ideal, attach debug logs. - -To enable debug log level, you need to add this to your `configuration.yaml` file: -``` +**Problems?** Open an "Issue" with `debug` logs enabled in `configuration.yaml`: +```yaml logger: default: info logs: @@ -286,73 +187,20 @@ logger: pyhilo: debug ``` -If you have any kind of python/home-assistant experience and want to contribute to the code, feel free to submit a pull request. - -### Prepare a development environment via VSCode DevContainer - -To facilitate development, a development environment is available via VSCode DevContainer. To use it, you must have [VSCode](https://code.visualstudio.com/) and [Docker](https://www.docker.com/) installed on your computer. - -1. Open the project folder in VSCode -2. Install the [Remote - Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) extension -3. Open the command palette (Ctrl+Shift+P or Cmd+Shift+P) and search for "Remote-Containers: Reopen in Container" -4. Wait for the environment to be ready -5. Open a terminal in VSCode and run `scripts/develop` to install dependencies and start Home Assistant -6. At this point, VSCode should prompt you to open a browser to access Home Assistant. You can also open a browser manually and go to [http://localhost:8123](http://localhost:8123) -7. You will need to do the initial Home Assistant configuration -8. You will need to add the Hilo integration via the user interface -9. You can now modify files in the `custom_components/hilo` folder and see changes in real-time in Home Assistant -10. In the terminal where you launched `scripts/develop`, Home Assistant and HILO integration logs should be streamed - -### Before submitting a Pull Request - -It goes without saying you must test your modifications on your local install for problems. You may modify the .py files inside the following folder. Don't forget a backup! -``` -custom_components/hilo -``` - -If you need to modify python-hilo for your tests, you can pull your own fork into Home Assistant with the following on the CLI: - -``` -pip install -e git+https://github.com/YOUR_FORK_HERE/python-hilo.git#egg=python-hilo -``` - -You must then restart Home Assistant for your install to take effect. To go back to the original, simply type: - -``` -pip install python-hilo -``` -And restart Home Assistant - -### Submitting a Pull Request +--- -- First you need to `fork` the repository into your own userspace. -- And then, you can `clone` it on your computer. -- To maintain some kind of tidiness and standard in the code, we have some linters and validators that need to be executed via `pre-commit` hooks: -``` -pre-commit install --install-hooks -``` -- You can now proceed with whatever code change you want. -- Once you're done with the code change, you can `stage` the files for a `commit`: -``` -git add path/to/file -``` -- And you can create a `commit`: -``` -git commit -m "I changed this because blabla" -``` -- Finally, you can `push` the change in your upstream repository: -``` -git push -``` -- At this point, if you visit the [upstream repository](https://github.com/dvd-dev/hilo), GitHub should prompt you to create a Pull Request (aka PR). Just follow the instructions. +# 👥 Initial Contributors -### Initial collaborators +- **[Francis Poisson](https://github.com/francispoisson/)** +- **[David Vallee Delisle](https://github.com/valleedelisle/)** -* [Francis Poisson](https://github.com/francispoisson/) -* [David Vallee Delisle](https://github.com/valleedelisle/) +## 🎖️ Very Honorable Mentions +- **[Ian Couture](https://github.com/ic-dev21/)**: He has been maintaining this addon for some time. +- **[Hilo](https://www.hiloenergie.com)**: Thanks to Hilo for their support and contributions. --- +💡 **Want to contribute?** Check out the [contribution section](#contribution) to see how to help with the project. [integration_blueprint]: https://github.com/custom-components/integration_blueprint [commits-shield]: https://img.shields.io/github/commit-activity/y/dvd-dev/hilo.svg?style=for-the-badge @@ -374,6 +222,6 @@ git push [discord-shield]: https://img.shields.io/badge/discord-Chat-green?logo=discord&style=for-the-badge [discord]: https://discord.gg/MD5ydRJxpc [Englishshield]: https://img.shields.io/badge/en-English-red?style=for-the-badge -[English]: https://github.com/dvd-dev/hilo/blob/main/README.md +[English]: https://github.com/dvd-dev/hilo/blob/main/README.en.md [Françaisshield]: https://img.shields.io/badge/fr-Français-blue?style=for-the-badge -[Français]: https://github.com/dvd-dev/hilo/blob/main/README.md +[Français]: https://github.com/dvd-dev/hilo/blob/main/README.md \ No newline at end of file From 814c842b87a4b4b829ec66363c625c71b441945f Mon Sep 17 00:00:00 2001 From: "Ian C." <108159253+ic-dev21@users.noreply.github.com> Date: Sun, 9 Feb 2025 12:41:00 -0500 Subject: [PATCH 07/13] Typos --- README.en.md | 3 ++- README.md | 11 ++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/README.en.md b/README.en.md index 0151a6e..cf26c91 100644 --- a/README.en.md +++ b/README.en.md @@ -37,7 +37,7 @@ that momentary "glitches" of the challenge sensor are completely eliminated by t ### What remains to be done on this side: - The `allowed_kWh` and `used_kWh` attributes are currently **non-functional**, the information arrives in fragments and all cases are not handled yet. -- The "completed" state doesn't always work, possibly a race condition +~~- The "completed" state doesn't always work, possibly a race condition~~ - Some information like `total_devices`, `opt_out_devices` and `pre_heat_devices` don't persist in memory. More details available in [issue #486](https://github.com/dvd-dev/hilo/issues/486). @@ -75,6 +75,7 @@ This unofficial HACS integration allows you to use [Hilo](https://www.hiloenergi ### 1️⃣ Check Compatibility - The integration requires Hilo hardware installed and functional. - Tested on HA OS, Docker (ghcr.io), Podman. Other configurations may cause issues. +- Ongoing issue on Podman/Kubernetes see [issue #497](https://github.com/dvd-dev/hilo/issues/497). ### 2️⃣ File Installation #### 🔹 Option 1: Via HACS diff --git a/README.md b/README.md index b3ab7a2..89c41c2 100644 --- a/README.md +++ b/README.md @@ -32,18 +32,18 @@ briser des installations existantes. Dans un premier temps, nous mettrons à jour la librairie `python-hilo` (https://github.com/dvd-dev/python-hilo), ce changement devrait être transparent pour tous. -Ensuite, nous migrerons le capteur de défi (`sensor.defi_hilo`) vers Websocket/SignalR. La bonne nouvelle avec ça c'est +Ensuite, nous migrerons le capteur de défi (`sensor.defi_hilo`) vers Websocket/SignalR. La bonne nouvelle avec ça, c'est que les "glitchs" momentanés du capteur de défi sont complètement éliminés par cette méthode. ### Ce qui reste à faire de ce côté: -- Les attributs `allowed_kWh` et `used_kWh` sont **non-fonctionnels** actuellement, les information arrivent morcelées et tous +- Les attributs `allowed_kWh` et `used_kWh` sont **non-fonctionnels** actuellement, les informations arrivent morcelées et tous les cas ne sont pas traités encore. -- L'état "completed" ne fonctionne pas toujours, possiblement un race condition +~~- L'état "completed" ne fonctionne pas toujours, possiblement une "race condition"~~ - Certaines informations comme `total_devices`, `opt_out_devices` et `pre_heat_devices` ne persistent pas en mémoire. Plus de détails disponibles dans [issue #486](https://github.com/dvd-dev/hilo/issues/486). -L'API servant à la lecture initial de la liste d'appareils sur votre compte Hilo subira également le même traitement. +L'API servant à la lecture initiale de la liste d'appareils sur votre compte Hilo subira également le même traitement. Plus de détails disponibles dans [issue #564](https://github.com/dvd-dev/hilo/issues/564). @@ -75,7 +75,8 @@ Cette intégration non-officielle HACS permet d'utiliser [Hilo](https://www.hilo ## 📥 Installation ### 1️⃣ Vérifier la compatibilité - L'intégration nécessite le matériel Hilo installé et fonctionnel. -- Testée sous HA OS, Docker (ghcr.io), Podman. D'autres configurations peuvent poser problème. +- Testée sous HA OS, Docker (ghcr.io), Podman. D'autres configurations peuvent poser problèmes. +- Problème connu sur Podman/Kubernetes see [issue #497](https://github.com/dvd-dev/hilo/issues/497). ### 2️⃣ Installation des fichiers #### 🔹 Option 1 : Via HACS From f2196a4311abd6a66e09d4b45f06f0c6ae0fea72 Mon Sep 17 00:00:00 2001 From: "Ian C." <108159253+ic-dev21@users.noreply.github.com> Date: Sun, 9 Feb 2025 12:58:45 -0500 Subject: [PATCH 08/13] Update README.en.md --- README.en.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.en.md b/README.en.md index cf26c91..c541ebc 100644 --- a/README.en.md +++ b/README.en.md @@ -37,6 +37,7 @@ that momentary "glitches" of the challenge sensor are completely eliminated by t ### What remains to be done on this side: - The `allowed_kWh` and `used_kWh` attributes are currently **non-functional**, the information arrives in fragments and all cases are not handled yet. + ~~- The "completed" state doesn't always work, possibly a race condition~~ - Some information like `total_devices`, `opt_out_devices` and `pre_heat_devices` don't persist in memory. @@ -225,4 +226,4 @@ logger: [Englishshield]: https://img.shields.io/badge/en-English-red?style=for-the-badge [English]: https://github.com/dvd-dev/hilo/blob/main/README.en.md [Françaisshield]: https://img.shields.io/badge/fr-Français-blue?style=for-the-badge -[Français]: https://github.com/dvd-dev/hilo/blob/main/README.md \ No newline at end of file +[Français]: https://github.com/dvd-dev/hilo/blob/main/README.md From 48826ab2fa13afd7b7efc40ad0c461e6af518d23 Mon Sep 17 00:00:00 2001 From: "Ian C." <108159253+ic-dev21@users.noreply.github.com> Date: Sun, 9 Feb 2025 12:59:11 -0500 Subject: [PATCH 09/13] Update README.en.md --- README.en.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.en.md b/README.en.md index c541ebc..4abeffe 100644 --- a/README.en.md +++ b/README.en.md @@ -37,8 +37,7 @@ that momentary "glitches" of the challenge sensor are completely eliminated by t ### What remains to be done on this side: - The `allowed_kWh` and `used_kWh` attributes are currently **non-functional**, the information arrives in fragments and all cases are not handled yet. - -~~- The "completed" state doesn't always work, possibly a race condition~~ +-~~ The "completed" state doesn't always work, possibly a race condition~~ - Some information like `total_devices`, `opt_out_devices` and `pre_heat_devices` don't persist in memory. More details available in [issue #486](https://github.com/dvd-dev/hilo/issues/486). From f5feb9b817de7c48a8a64efc234c82533a9c8c67 Mon Sep 17 00:00:00 2001 From: "Ian C." <108159253+ic-dev21@users.noreply.github.com> Date: Sun, 9 Feb 2025 13:00:10 -0500 Subject: [PATCH 10/13] Update README.en.md --- README.en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.en.md b/README.en.md index 4abeffe..241466a 100644 --- a/README.en.md +++ b/README.en.md @@ -37,7 +37,7 @@ that momentary "glitches" of the challenge sensor are completely eliminated by t ### What remains to be done on this side: - The `allowed_kWh` and `used_kWh` attributes are currently **non-functional**, the information arrives in fragments and all cases are not handled yet. --~~ The "completed" state doesn't always work, possibly a race condition~~ +-~~- The "completed" state doesn't always work, possibly a race condition~~ - Some information like `total_devices`, `opt_out_devices` and `pre_heat_devices` don't persist in memory. More details available in [issue #486](https://github.com/dvd-dev/hilo/issues/486). From 27c52071dc35976261d88a080f1575ad7d1e2364 Mon Sep 17 00:00:00 2001 From: "Ian C." <108159253+ic-dev21@users.noreply.github.com> Date: Sun, 9 Feb 2025 13:00:30 -0500 Subject: [PATCH 11/13] Update README.en.md --- README.en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.en.md b/README.en.md index 241466a..140261f 100644 --- a/README.en.md +++ b/README.en.md @@ -37,7 +37,7 @@ that momentary "glitches" of the challenge sensor are completely eliminated by t ### What remains to be done on this side: - The `allowed_kWh` and `used_kWh` attributes are currently **non-functional**, the information arrives in fragments and all cases are not handled yet. --~~- The "completed" state doesn't always work, possibly a race condition~~ +- ~~- The "completed" state doesn't always work, possibly a race condition~~ - Some information like `total_devices`, `opt_out_devices` and `pre_heat_devices` don't persist in memory. More details available in [issue #486](https://github.com/dvd-dev/hilo/issues/486). From 2521c20056e377c48ce847d1ba31d9c93f38b7d8 Mon Sep 17 00:00:00 2001 From: "Ian C." <108159253+ic-dev21@users.noreply.github.com> Date: Sun, 9 Feb 2025 13:00:54 -0500 Subject: [PATCH 12/13] Update README.en.md --- README.en.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.en.md b/README.en.md index 140261f..bbe5c01 100644 --- a/README.en.md +++ b/README.en.md @@ -60,13 +60,20 @@ This unofficial HACS integration allows you to use [Hilo](https://www.hiloenergi ## 🔥 Main Features ✅ Supports switches and dimmers as lights + ✅ Thermostat control and temperature reading + ✅ Energy consumption monitoring of Hilo devices + ✅ Sensor for Hilo challenges and gateway + ✅ Configuration via user interface + ✅ Authentication via Hilo website + ✅ Outdoor weather sensor with changing icon + 📌 **To do**: Support for other devices, improvement of consumption meters, API documentation --- From 48c4119a8cb98b65bce77621ac2f8445b26552d4 Mon Sep 17 00:00:00 2001 From: "Ian C." <108159253+ic-dev21@users.noreply.github.com> Date: Sun, 9 Feb 2025 13:01:30 -0500 Subject: [PATCH 13/13] Update README.md --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 89c41c2..7251855 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ que les "glitchs" momentanés du capteur de défi sont complètement éliminés ### Ce qui reste à faire de ce côté: - Les attributs `allowed_kWh` et `used_kWh` sont **non-fonctionnels** actuellement, les informations arrivent morcelées et tous les cas ne sont pas traités encore. -~~- L'état "completed" ne fonctionne pas toujours, possiblement une "race condition"~~ +- ~~- L'état "completed" ne fonctionne pas toujours, possiblement une "race condition"~~ - Certaines informations comme `total_devices`, `opt_out_devices` et `pre_heat_devices` ne persistent pas en mémoire. Plus de détails disponibles dans [issue #486](https://github.com/dvd-dev/hilo/issues/486). @@ -61,11 +61,17 @@ Cette intégration non-officielle HACS permet d'utiliser [Hilo](https://www.hilo ## 🔥 Fonctionnalités principales ✅ Supporte les interrupteurs et gradateurs comme lumières + ✅ Contrôle des thermostats et lecture des températures + ✅ Suivi de la consommation énergétique des appareils Hilo + ✅ Sensor pour les défis et la passerelle Hilo + ✅ Configuration via l'interface utilisateur + ✅ Authentification via le site web d'Hilo + ✅ Capteur météo extérieure avec icône changeante 📌 **À faire** : Support d'autres appareils, amélioration des compteurs de consommation, documentation API