UNPKG

homebridge-enlighten-power

Version:

Homebridge dynamic platform plugin that exposes Enphase Envoy solar production and consumption as HomeKit sensors. Supports local HTTPS access (firmware D8+, Bearer token) and the Enphase Cloud API v4 (OAuth 2.0 refresh_token). Multiple accessories share

369 lines (266 loc) ‱ 15.6 kB
<p align="center"> <a href="https://github.com/homebridge/homebridge"><img src="https://raw.githubusercontent.com/homebridge/branding/master/logos/homebridge-color-round-stylized.png" height="140"></a> </p> <span align="center"> # homebridge-enlighten-power [![npm](https://img.shields.io/npm/v/homebridge-enlighten-power.svg)](https://www.npmjs.com/package/homebridge-enlighten-power) [![npm](https://img.shields.io/npm/dt/homebridge-enlighten-power.svg)](https://www.npmjs.com/package/homebridge-enlighten-power) [![Homebridge v2 Ready](https://img.shields.io/badge/Homebridge-v2%20Ready-purple)](https://github.com/homebridge/homebridge/wiki/Updating-To-Homebridge-v2.0) </span> > 🌐 [English version](README.md) · **Français** > ⚠ **Mise Ă  niveau depuis la 2.x ?** La version 3.0.0 est un changement non rĂ©tro-compatible — le plugin est dĂ©sormais une **platform dynamique**. Voir le [guide de migration](#migration-depuis-la-2x) ci-dessous. ## Description Ce plugin Homebridge expose votre systĂšme solaire Enphase Envoy dans HomeKit sous forme d'un ou plusieurs capteurs. Chaque accessoire surveille soit la **production** (Ă©nergie gĂ©nĂ©rĂ©e), soit la **consommation** (Ă©change net avec le rĂ©seau), et bascule dans son Ă©tat dĂ©clenchĂ© quand la valeur franchit un seuil configurable — pratique comme source d'Ă©vĂ©nement pour les automatisations HomeKit. Tous les accessoires partagent une seule connexion Envoy et un seul token d'authentification. Trois mĂ©thodes de connexion sont supportĂ©es. Le dĂ©pĂŽt fournit aussi trois [scripts Python](#scripts-python-compagnons) autonomes pour piloter un relais Piface2 depuis un Raspberry Pi — **complĂštement indĂ©pendants de Homebridge**. --- ## Le plugin Homebridge ### Installation - **RecommandĂ© :** via l'interface Homebridge — onglet *Plugins* → recherche **Homebridge Enlighten Power** → *Install*. - **Manuel :** `npm install -g homebridge-enlighten-power`. ### Choisir une mĂ©thode de connexion | # | MĂ©thode | Avantages | InconvĂ©nients | | - | --- | --- | --- | | **1** | [Local + **token statique**](#mĂ©thode-1--local--token-statique) | Simple, configuration la plus rapide. | Rotation manuelle du token ~une fois par an. | | **2** | [Local + **token auto-renouvelĂ©**](#mĂ©thode-2--local--auto-refresh) | Plus jamais de rotation manuelle. | Mot de passe Enlighten stockĂ© dans `config.json`. | | **3** | [**API Cloud v4** (OAuth 2.0)](#mĂ©thode-3--api-cloud-v4) | Fonctionne sans accĂšs LAN Ă  l'Envoy. Production + consommation. | 1 000 req/mois ; intervalle 60 min recommandĂ© ; mise en place OAuth ponctuelle. | > Dans l'interface Homebridge, le menu *Connection* gĂšre la mĂ©thode 3 face aux mĂ©thodes locales, et le menu *Authentication method* gĂšre la mĂ©thode 1 face Ă  la mĂ©thode 2. Si vous Ă©ditez `config.json` Ă  la main, vous pouvez omettre `auth_method` — le plugin dĂ©duit la mĂ©thode (le `token` l'emporte si les deux groupes sont remplis). --- ### MĂ©thode 1 — Local + token statique AccĂšs HTTPS local avec un JWT longue durĂ©e que vous gĂ©nĂ©rez vous-mĂȘme, **une fois**. #### 1. GĂ©nĂ©rer le token 1. Ouvrir <https://entrez.enphaseenergy.com> et se connecter. 2. GĂ©nĂ©rer un token pour votre Envoy (l'outil demande le numĂ©ro de sĂ©rie). 3. Copier le JWT dans `config.json` (voir ci-dessous). Il expire au bout d'environ 1 an. #### 2. config.json ```json { "platforms": [ { "platform": "EnlightenPower", "name": "Enlighten Power", "connection": "bonjour", "token": "eyJraWQiOiI......biQETMEQ", "update_interval": 1, "accessories": [ { "name": "> 6000 W production", "measurement": "production", "power_threshold": 6000 } ] } ] } ``` URL personnalisĂ©e (accĂšs par IP) : ```json { "platforms": [ { "platform": "EnlightenPower", "name": "Enlighten Power", "connection": "url", "url": "https://192.168.1.x", "token": "eyJraWQiOiI......biQETMEQ", "update_interval": 1, "accessories": [ { "name": "> 6000 W production", "measurement": "production", "power_threshold": 6000 }, { "name": "Export > 4500 W", "measurement": "consumption", "power_threshold": 4500 } ] } ] } ``` > **À propos de l'API locale.** `envoy.localdomain` est le nom mDNS utilisĂ© par les firmwares D8+. L'Envoy fournit un certificat auto-signĂ© — le plugin dĂ©sactive la vĂ©rification TLS stricte uniquement pour les connexions locales. Au dĂ©marrage, le plugin appelle `/ivp/meters` pour associer le `eid` de chaque compteur Ă  son `measurementType` (`"production"` ou `"net-consumption"`). À chaque cycle, il appelle `/ivp/meters/readings` et retrouve les entrĂ©es par `eid` — pas par position dans le tableau. --- ### MĂ©thode 2 — Local + auto-refresh MĂȘme accĂšs local qu'Ă  la mĂ©thode 1, mais le plugin **obtient et renouvelle le JWT pour vous**, automatiquement. ```json { "platforms": [ { "platform": "EnlightenPower", "name": "Enlighten Power", "connection": "bonjour", "auth_method": "auto_refresh", "enlighten_user": "vous@example.com", "enlighten_pass": "MOT_DE_PASSE_ENLIGHTEN", "envoy_serial": "1234XXXXXXXX", "update_interval": 1, "accessories": [ { "name": "> 6000 W production", "measurement": "production", "power_threshold": 6000 } ] } ] } ``` Ce qui se passe Ă  l'exĂ©cution : 1. Au dĂ©marrage, le plugin se connecte Ă  `enlighten.enphaseenergy.com` avec vos identifiants. 2. Il demande Ă  `entrez.enphaseenergy.com` un JWT frais liĂ© au numĂ©ro de sĂ©rie de votre Envoy. 3. Le JWT est mis en cache en mĂ©moire et rĂ©utilisĂ© Ă  chaque poll. 4. Quand le JWT arrive Ă  moins de 7 jours d'expiration — ou aprĂšs un `401` de l'Envoy — un nouveau JWT est rĂ©cupĂ©rĂ© automatiquement. --- ### MĂ©thode 3 — API Cloud v4 AccĂšs OAuth 2.0 Ă  l'API dĂ©veloppeur Enphase. À utiliser quand Homebridge ne peut pas joindre l'Envoy sur le rĂ©seau local. Les mesures `production` et `consumption` sont disponibles via l'endpoint `latest_telemetry`. Plans : <https://developer-v4.enphase.com/plans>. Le quota du plan gratuit a Ă©tĂ© **rĂ©duit de 10 000 Ă  1 000 requĂȘtes/mois** par Enphase. RĂ©glez `update_interval` Ă  **60** (1 requĂȘte/heure = 720/mois) pour rester dans le budget. Le plugin effectue un premier poll au dĂ©marrage, puis aligne les suivants sur les limites de l'horloge — avec `update_interval: 60` les donnĂ©es sont rafraĂźchies Ă  l'heure pile (10:00, 11:00, 
). #### Étape 1 — CrĂ©er l'application Sur <https://developer-v4.enphase.com>, crĂ©ez une application. La page affiche : - **API Key** · **Client ID** · **Client Secret** - **Authorization URL** de la forme `https://api.enphaseenergy.com/oauth/authorize?response_type=code&client_id=VOTRE_CLIENT_ID` Vous avez aussi besoin de votre **System ID** (identifiant numĂ©rique du systĂšme Enlighten, anciennement *site_id*). #### Étape 2 — Obtenir un code d'autorisation > ⚠ L'Authorization URL du portail est **incomplĂšte** — il manque `redirect_uri`. Ajoutez `&redirect_uri=https://api.enphaseenergy.com/oauth/redirect_uri`, sinon vous obtenez `OAuth Error: A redirect_uri must be supplied.` URL complĂšte : ```text https://api.enphaseenergy.com/oauth/authorize?response_type=code&client_id=VOTRE_CLIENT_ID&redirect_uri=https://api.enphaseenergy.com/oauth/redirect_uri ``` Ouvrez-la, connectez-vous Ă  Enlighten, approuvez. La page de redirection affiche un code court Ă  usage unique (p. ex. `2TJk7M`), valable seulement quelques minutes. #### Étape 3 — Échanger le code contre un refresh_token ```bash curl -X POST \ -u "CLIENT_ID:CLIENT_SECRET" \ "https://api.enphaseenergy.com/oauth/token?grant_type=authorization_code&redirect_uri=https://api.enphaseenergy.com/oauth/redirect_uri&code=AUTH_CODE" ``` Ou avec [`examples/get_refresh_token.py`](examples/get_refresh_token.py) : ```bash python3 examples/get_refresh_token.py 2TJk7M ``` Copiez le `refresh_token` de la rĂ©ponse — valable ~1 mois. Le plugin renouvelle l'access token 24h automatiquement. À l'expiration du refresh token, refaites les Ă©tapes 2-3. #### Étape 4 — config.json ```json { "platforms": [ { "platform": "EnlightenPower", "name": "Enlighten Power", "connection": "api", "api_key": "API_KEY", "client_id": "CLIENT_ID", "client_secret": "CLIENT_SECRET", "system_id": "SYSTEM_ID", "refresh_token": "REFRESH_TOKEN", "update_interval": 60, "accessories": [ { "name": "> 6000 W production", "measurement": "production", "power_threshold": 6000 } ] } ] } ``` --- ### Accessoires Chaque entrĂ©e du tableau `accessories` est un capteur HomeKit indĂ©pendant. Tous partagent la connexion et l'authentification de la plateforme. | Champ | Requis | DĂ©faut | Description | | --- | --- | --- | --- | | `name` | ✅ | — | Nom affichĂ© dans HomeKit. Doit ĂȘtre unique. | | `measurement` | | `production` | `production` (Ă©nergie solaire gĂ©nĂ©rĂ©e) ou `consumption` (Ă©change net rĂ©seau). Disponible pour toutes les connexions. | | `power_threshold` | | `1000` | Seuil de dĂ©clenchement en W. Voir ci-dessous. | | `accessory_type` | | `co2sensor` | Type de capteur HomeKit — voir [Type d'accessoire HomeKit](#type-daccessoire-homekit). | **Mode production** — se dĂ©clenche quand `production ≄ seuil` ; se rĂ©initialise en dessous. **Mode consommation** — reproduit l'hystĂ©rĂ©sis des scripts Piface : - `detected → 1` quand `net ≀ −seuil` (la maison exporte plus que le seuil vers le rĂ©seau). - `detected → 0` quand `net ≄ 0` (la maison importe depuis le rĂ©seau). - Le niveau affichĂ© est la valeur absolue de l'Ă©change rĂ©seau en W. > La mesure `consumption` est disponible pour toutes les connexions, y compris l'API Cloud (via l'endpoint `latest_telemetry`). --- ### Type d'accessoire HomeKit | Valeur | Service HomeKit | Comportement | | --- | --- | --- | | `co2sensor` (dĂ©faut) | Capteur CO2 | Puissance en ppm + drapeau DĂ©tectĂ© au-dessus du seuil. | | `motion` | DĂ©tecteur de mouvement | Mouvement dĂ©tectĂ© au-dessus du seuil. | | `occupancy` | DĂ©tecteur de prĂ©sence | OccupĂ© au-dessus du seuil. | | `contact` | Capteur de contact | Ouvert au-dessus du seuil. | | `lightsensor` | Capteur de luminositĂ© | Puissance en lux (plafonnĂ©e Ă  100 000). | --- ### Test rapide depuis un shell Envoy local — lectures des compteurs : ```bash curl -sk -H "Authorization: Bearer TOKEN" "https://envoy.localdomain/ivp/meters/readings" \ | python3 -c "import sys, json; d=json.load(sys.stdin); print('prod', d[0]['activePower'], 'W net', d[1]['activePower'], 'W')" ``` --- ## Migration depuis la 2.x > ⚠ **DĂ©sinstallation propre obligatoire.** Le type du plugin ayant changĂ© d'`accessory` Ă  `platform`, Homebridge gĂ©nĂšre les UUIDs diffĂ©remment et les donnĂ©es de cache de l'ancien accessoire entrent en conflit. **Ne faites pas une simple mise Ă  jour** — suivez les Ă©tapes ci-dessous. ### Étapes de migration — via l'interface Homebridge 1. **Onglet Plugins → Homebridge Enlighten Power → DĂ©sinstaller.** Confirmer. Cela arrĂȘte le child bridge et supprime le plugin. 2. **Onglet Accessories** — si l'ancien accessoire est encore listĂ©, cliquer sur l'icĂŽne ⚙ → *Supprimer l'accessoire*. Si l'onglet est vide ou que l'accessoire a disparu, passer Ă  l'Ă©tape suivante. 3. **Settings → Config** (Ă©diteur JSON) — vĂ©rifier que le tableau `"accessories"` ne contient plus aucun bloc `"accessory": "enlighten-power"`. Sauvegarder. 4. **Settings → Homebridge Settings → RedĂ©marrer Homebridge** une fois pour vider le cache des accessoires. 5. **Onglet Plugins → rechercher "Homebridge Enlighten Power" → Installer**, ou depuis un terminal : `npm install -g homebridge-enlighten-power`. 6. **Configurer** le plugin via l'interface graphique des rĂ©glages ou en Ă©ditant `config.json` comme indiquĂ© ci-dessous. 7. **Supprimer de HomeKit** si l'accessoire apparaĂźt toujours comme non rĂ©pondant dans l'app Maison : appui long → *Supprimer l'accessoire*. ### Étapes de migration — via terminal (avancĂ©) ```bash # 1. DĂ©sinstaller npm uninstall -g homebridge-enlighten-power # 2. Supprimer le cache des accessoires rm /homebridge/accessories/cachedAccessories rm /homebridge/accessories/cachedAccessories.*.json 2>/dev/null # 3. RĂ©installer npm install -g homebridge-enlighten-power # version stable # 4. Éditer config.json, puis redĂ©marrer Homebridge ``` ### Changements de config Le plugin est dĂ©sormais une **platform** (`"platform": "EnlightenPower"`) et non plus un accessoire (`"accessory": "enlighten-power"`). La config doit ĂȘtre dĂ©placĂ©e de la section `accessories` vers la section `platforms`. **Avant** (`config.json` — v2.x) : ```json { "accessories": [ { "accessory": "enlighten-power", "name": "> 6000 W", "connection": "bonjour", "token": "...", "power_threshold": 6000, "accessory_type": "motion" } ] } ``` **AprĂšs** (`config.json` — v3.x) : ```json { "platforms": [ { "platform": "EnlightenPower", "name": "Enlighten Power", "connection": "bonjour", "token": "...", "accessories": [ { "name": "> 6000 W", "measurement": "production", "power_threshold": 6000, "accessory_type": "motion" } ] } ] } ``` --- ## Scripts Python compagnons Le dĂ©pĂŽt fournit Ă©galement trois scripts Python autonomes dans [`examples/`](examples/). Ils sont **indĂ©pendants de Homebridge** — pour les utilisateurs qui veulent piloter directement un **relais Piface2** depuis un Raspberry Pi Ă  partir des donnĂ©es de l'Envoy. ### Installer pifacedigitalio Merci Ă  @rfennel qui a [partagĂ© la procĂ©dure](https://github.com/piface/pifacedigitalio/issues/39#issuecomment-633291166) sous Buster : ```bash sudo apt-get install python3-pip sudo pip3 install pifacedigitalio pifacecommon sudo sed -i 's/#dtparam=spi=on/dtparam=spi=on/' /boot/config.txt sudo reboot ``` ### [`examples/check_power_local.py`](examples/check_power_local.py) AccĂšs local Ă  l'Envoy (HTTPS + token Bearer). Lit production et consommation depuis `/ivp/meters/readings` et pilote un ou deux relais Piface2. - `--mode production --value <W>` — relais ON quand la production ≄ valeur, OFF sinon. - `--mode consumption --value <W>` — relais ON quand la maison exporte plus que la valeur ; OFF dĂšs qu'elle importe (hystĂ©rĂ©sis). - `--relay {0,1} [{0,1} ...]` — index(es) du/des relais. DĂ©faut : `0`. `--relay 0 1` actionne les deux. ### [`examples/check_power_api.py`](examples/check_power_api.py) API Cloud v4 — autonome. GĂšre le flux OAuth complet, stocke le refresh token dans `refresh_token.txt` et renouvelle automatiquement l'access token. ### [`examples/get_refresh_token.py`](examples/get_refresh_token.py) Utilitaire autonome pour l'Ă©change OAuth. ```bash python3 examples/get_refresh_token.py <CODE_AUTORISATION> ``` ### Exemple cron ```cron # Mode production — relais 0 ON quand production ≄ 6000 W * * * * * python3 /home/pi/check_power_local.py --mode production --value 6000 # Mode consommation — relais 1 ON quand export > 4500 W vers le rĂ©seau * * * * * python3 /home/pi/check_power_local.py --mode consumption --value 4500 --relay 1 # Les deux relais en miroir sur l'export * * * * * python3 /home/pi/check_power_local.py --mode consumption --value 4500 --relay 0 1 ```