Récupérer les données d'un serveur web

Bonjour et bonne année à tous,

Mon problème

Cela fait maintenant 3 ans que j’ai migré de Eedomus à Home Assistant.
Aujourd’hui, je butte sur un problème que je n’arrive pas à résoudre.
Après avoir fait installer des panneaux photovoltaïques, j’ai installé un ELS 5k et une batterie de APSystem.
Je voudrai récupérer les données du serveur web de l’ELS disponibles à l’adresse http://192.168.120.22/index.php/display/apsrecord/Data/ pour les intégrer dans Home Assistant.
L’ELS effectue un nouvel enregistrement (item) de ses données (record) toutes les 5 minutes.
Voici la page web correspondante


et le code source de la partie concernant les données à extraire.

J’ai essayé de récupérer les données avec multiscrape mais je n’ai rien obtenu.
Peut-être construire un json avec les données mais je ne sais pas le faire.
Merci d’avance pour votre aide.

Ma configuration


version core-2025.12.5
installation_type Home Assistant OS
dev false
hassio true
docker true
container_arch aarch64
user root
virtualenv false
python_version 3.13.9
os_name Linux
os_version 6.12.51-haos
arch aarch64
timezone Europe/Paris
config_dir /config
Home Assistant Community Store
GitHub API ok
GitHub Content ok
GitHub Web ok
HACS Data ok
GitHub API Calls Remaining 4999
Installed Version 2.0.5
Stage running
Available Repositories 2527
Downloaded Repositories 33
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 16.3
update_channel stable
supervisor_version supervisor-2025.12.3
agent_version 1.7.2
docker_version 28.3.3
disk_total 114.1 GB
disk_used 63.9 GB
nameservers 1.1.1.1
healthy true
supported true
host_connectivity true
supervisor_connectivity true
ntp_synchronized true
virtualization
board odroid-n2
supervisor_api ok
version_api ok
installed_addons Samba share (12.5.4), Terminal & SSH (9.21.0), Mosquitto broker (6.5.2), Zigbee2MQTT (2.7.2-1), Studio Code Server (6.0.1), Z-Wave JS (0.27.0), ESPHome Device Builder (2025.12.4), go2rtc (1.9.13), File editor (5.8.0), SomfyProtect2MQTT (2025.12.3), Silicon Labs Flasher (0.4.0), MQTT Explorer (browser-1.0.1)
Dashboards
dashboards 6
resources 28
views 14
mode storage
Network Configuration
adapters lo (disabled), end0 (enabled, default, auto), docker0 (disabled), hassio (disabled), vethe2a1be6 (disabled), veth1f90937 (disabled), vethd08a28a (disabled), veth820f868 (disabled), veth77c0abb (disabled), veth5ffd68e (disabled), veth1503676 (disabled), veth4fb881b (disabled), veth0a48964 (disabled), vethff9764a (disabled), veth786fd0d (disabled), veth1032d8b (disabled), veth29a4200 (disabled), veth9450c4e (disabled)
ipv4_addresses lo (127.0.0.1/8), end0 (192.168.120.240/24), docker0 (172.30.232.1/23), hassio (172.30.32.1/23), vethe2a1be6 (), veth1f90937 (), vethd08a28a (), veth820f868 (), veth77c0abb (), veth5ffd68e (), veth1503676 (), veth4fb881b (), veth0a48964 (), vethff9764a (), veth786fd0d (), veth1032d8b (), veth29a4200 (), veth9450c4e ()
ipv6_addresses lo (::1/128), end0 (fe80::3834:67e0:2456:8f7a/64), docker0 (fe80::f074:3cff:fed0:99b8/64), hassio (fe80::9801:5aff:fe7f:291f/64), vethe2a1be6 (fe80::c4d6:d4ff:fe96:c883/64), veth1f90937 (fe80::7073:25ff:fe5e:81f5/64), vethd08a28a (fe80::188c:ecff:fe65:b1be/64), veth820f868 (fe80::e444:81ff:fe3e:6efb/64), veth77c0abb (fe80::14ee:5cff:feb1:ba4a/64), veth5ffd68e (fe80::205f:6bff:fead:d0b8/64), veth1503676 (fe80::a47f:f2ff:fe6b:714e/64), veth4fb881b (fe80::74f3:97ff:feed:5f1b/64), veth0a48964 (fe80::a499:7dff:fe90:22e4/64), vethff9764a (fe80::f462:22ff:fea9:2f13/64), veth786fd0d (fe80::ccf2:caff:feb3:ae23/64), veth1032d8b (fe80::e04e:a3ff:fe81:f21e/64), veth29a4200 (fe80::94ff:44ff:fe3a:fd70/64), veth9450c4e (fe80::885d:e6ff:fe93:5f2c/64)
announce_addresses 192.168.120.240, fe80::3834:67e0:2456:8f7a
Recorder
oldest_recorder_run 26 décembre 2025 à 18:20
current_recorder_run 5 janvier 2026 à 17:37
estimated_db_size 779.65 MiB
database_engine sqlite
database_version 3.49.2

Salut

As-tu essayé l’intégration APsytems ?

Bonjour,
Merci pour la réponse, mais cette intégration concerne les MO des panneaux photovoltaïques. J’utilise APsystems ECU Reader pour récupérer ces données
Ce que je veux faire, c’est récupérer les données de la batterie qui sont dans l’ELS.

As-tu essayé cette intégration ? :rofl:

1 « J'aime »

Oui, comme dit dans ma réponse précédente, je l’utilise pour récupérer les données des panneaux mais elle ne fonctionne pas avec l’ecu qui est dans l’ELS 5k car il n’a pas le même firmware. C’est d’ailleurs signalé sur le github de l’intégration.

Bonjour,

Pour une intégration à HA, il va falloir choisir les données pertinentes à afficher. En effet l’état d’un sensor est limité à 255 caractères pour les données, il faut traiter directement.

De mon point de vue un scrape et plusieurs sensors qui ciblent chaque valeur.
J’avoue que je n’avais jamais vu un json imbriqué dans un html !

J’ai demandé à ChatGPT pour le json car je n’y arrivais pas (Il m’a dit que SSOC était la charge)
Ca fonctionne sur un fichier test. Il faut redémarrer HA.

scrape:
  - resource: "http://192.168.120.22/index.php/display/apsrecord/Data/"
    scan_interval: 61
    sensor:
      - name: "ESS SSOC"
        select: "div.table-responsive table tbody tr:first-child td:nth-child(2)"
        unit_of_measurement: "%"
        value_template: >-
          {% set raw = value
            | replace('<br>', '')
            | replace('\n', '')
            | replace('\r', '')
            | trim
          %}
          {{ (raw | from_json).ESS.SSOC | float }}

Bonjour @armavi,
J’ai utilisé ton code avec multisrape et ça marche du tonnerre : je récupère bien le pourcentage de charge de la batterie ! Merci beaucoup !!

Pourrais-tu expliquer le rôle des lignes de ton code à partir de value_template car cela dépasse mes compétences et je voudrais récupérer d’autres informations.

Pour la 1e partie : ça nettoie la partie html en enlevant les sauts de lignes \n\r et les sauts de lignes html \<br>. Le but est d’obtenir un fichier au format json
Tu n’a pas à toucher cette partie

          {% set raw = value
            | replace('<br>', '')
            | replace('\n', '')
            | replace('\r', '')
            | trim
          %}

(raw | from_json) lit le fichier au format json est en extrait la partie qui intéresse.

Et pour les clés json comme je t’ai dit j’ai demandé à chatgpt
Le prompt
J'obtiens ce code html. On voit que si on enlève les <br> et les sauts de lignes on obtient un json. Je suis sur Homeassistant. raw est le json. (raw|from_json).ESS.SSOC me donne une bonne valeur qui est 63. Les données proviennent d'un ELS5k Je veux que tu me fasses un tableau qui ressemble à ça |code|valeur|Interprétation possible| |(raw|from_json).ESS.SSOC|63.000|...|

Le résultat

Voici un tableau basé sur le JSON visible sur ta capture (ELS5K). Les interprétations sont des hypothèses (les libellés exacts peuvent varier selon le protocole/firmware).

code valeur Interprétation possible
(raw|from_json).F 0 Flag / type de trame (à confirmer)
(raw|from_json).EST 20260106153000 Horodatage YYYYMMDDHHMMSS
(raw|from_json).VER S0001 Version protocole / format
(raw|from_json).ESS.EID 215200802305 Identifiant équipement / numéro série
(raw|from_json).ESS.MOD 3 Mode de fonctionnement (code)
(raw|from_json).ESS.STA 1 Statut global (code)
(raw|from_json).ESS.PCS_STA 0 Statut PCS (onduleur/convertisseur) (code)
(raw|from_json).ESS.BS 30 Battery status (code)
(raw|from_json).ESS.SSOC 63.000 SOC batterie (%)
(raw|from_json).ESS.RT 0.000 Remaining time / autonomie estimée (à confirmer)
(raw|from_json).ESS.EPS 1 Mode EPS/Backup actif (1=oui ?)

ESS.SD (liste de canaux / “string data” – valeurs cohérentes avec P=U×I)

code valeur Interprétation possible
(raw|from_json).ESS.SD[0].FL 0 Index/canal
(raw|from_json).ESS.SD[0].SV 227.800 Tension (V)
(raw|from_json).ESS.SD[0].SI 0.000 Courant (A)
(raw|from_json).ESS.SD[0].SP 0.000 Puissance (W)
(raw|from_json).ESS.SD[0].DE 4.147 Énergie “du jour” / compteur (kWh ?) (à confirmer)
(raw|from_json).ESS.SD[1].FL 1 Index/canal
(raw|from_json).ESS.SD[1].SV 227.800 Tension (V)
(raw|from_json).ESS.SD[1].SI 21.890 Courant (A)
(raw|from_json).ESS.SD[1].SP 4983.000 Puissance (W)
(raw|from_json).ESS.SD[1].CE 0.415 Compteur énergie (kWh ?) (à confirmer)
(raw|from_json).ESS.SD[1].CEB 0.419 Compteur énergie “B” (backup?) (à confirmer)
(raw|from_json).ESS.SD[1].DE 8.209 Énergie (kWh ?) (à confirmer)
(raw|from_json).ESS.SD[2].SV 226.624 Tension (V)
(raw|from_json).ESS.SD[2].SI 5.627 Courant (A)
(raw|from_json).ESS.SD[2].SP 1285.000 Puissance (W)
(raw|from_json).ESS.SD[2].DE 5.561 Énergie (kWh ?) (à confirmer)
(raw|from_json).ESS.SD[3].SV 226.621 Tension (V)
(raw|from_json).ESS.SD[3].SI 13.555 Courant (A)
(raw|from_json).ESS.SD[3].SP 3748.000 Puissance (W)
(raw|from_json).ESS.SD[3].DE 46.890 Énergie (kWh ?) (à confirmer)
(raw|from_json).ESS.SD[4].SV 226.621 Tension (V)
(raw|from_json).ESS.SD[4].SI 0.000 Courant (A)
(raw|from_json).ESS.SD[4].SP 0.000 Puissance (W)
(raw|from_json).ESS.SD[4].DE 0.084 Énergie (kWh ?) (à confirmer)
(raw|from_json).ESS.SD[5].SV 226.621 Tension (V)
(raw|from_json).ESS.SD[5].SI 29.856 Courant (A)
(raw|from_json).ESS.SD[5].SP 7446.000 Puissance (W)
(raw|from_json).ESS.SD[5].CE 0.620 Compteur énergie (kWh ?) (à confirmer)
(raw|from_json).ESS.SD[5].DE 45.462 Énergie (kWh ?) (à confirmer)

ESS.ABD (liste – données “AC/DC + batterie”)

code valeur Interprétation possible
(raw|from_json).ESS.ABD[0].ABID B0200004635 ID pack/batterie/BMS
(raw|from_json).ESS.ABD[0].GS 0 Grid status (code)
(raw|from_json).ESS.ABD[0].AP -5004 Active Power (W) (signe = sens import/export ou charge/décharge)
(raw|from_json).ESS.ABD[0].RP -7 Reactive Power (var) (probable)
(raw|from_json).ESS.ABD[0].CPM -5000.000 Puissance mesurée/consigne (à confirmer)
(raw|from_json).ESS.ABD[0].DPM 4709.000 Puissance côté DC (W) (à confirmer)
(raw|from_json).ESS.ABD[0].AV 227.800 Tension AC (V)
(raw|from_json).ESS.ABD[0].AC 21.890 Courant AC (A)
(raw|from_json).ESS.ABD[0].DV 55.000 Tension batterie/DC (V)
(raw|from_json).ESS.ABD[0].DC 81.600 Courant batterie/DC (A)
(raw|from_json).ESS.ABD[0].GF 49.980 Fréquence réseau (Hz)
(raw|from_json).ESS.ABD[0].AI 27.000 Limite/mesure courant AC (A) (à confirmer)
(raw|from_json).ESS.ABD[0].CT 1805158 Compteur (temps/cycles) (à confirmer)
(raw|from_json).ESS.ABD[0].ACE 118.9 Énergie charge cumulée (kWh ?) (à confirmer)
(raw|from_json).ESS.ABD[0].ADE 57.4 Énergie décharge cumulée (kWh ?) (à confirmer)
(raw|from_json).ESS.ABD[0].SC 63.0 SOC (%) (redondant avec SSOC)
(raw|from_json).ESS.ABD[0].SH 100 SOH (%) ? ou seuil haut (à confirmer)
(raw|from_json).ESS.ABD[0].CA 6.50 Capacité / paramètre batterie (à confirmer)
(raw|from_json).ESS.ABD[0].BTH 24.8 Température batterie haute (°C) (probable)
(raw|from_json).ESS.ABD[0].BTL 24.8 Température batterie basse (°C) (probable)
(raw|from_json).ESS.ABD[0].ACEB 0.0 Énergie charge “backup” (?)
(raw|from_json).ESS.ABD[0].ADEB 0.1 Énergie décharge “backup” (?)
(raw|from_json).ESS.ABD[0].CMS 7 Paramètre BMS (nb modules/cellules) (à confirmer)
(raw|from_json).ESS.ABD[0].BFC 7 Paramètre BMS (à confirmer)
(raw|from_json).ESS.ABD[0].BMC 1 Paramètre BMS (à confirmer)
(raw|from_json).ESS.ABD[0].BM 0 Balancing / mode BMS (à confirmer)
(raw|from_json).ESS.ABD[0].IMS 0 Inverter mode/status (à confirmer)
(raw|from_json).ESS.ABD[0].DBV 55.700 DC bus voltage (V) (à confirmer)
(raw|from_json).ESS.ABD[0].DGV 230 Tension réseau (V) (à confirmer)
(raw|from_json).ESS.ABD[0].DGF 49.970 Fréquence réseau (Hz) (à confirmer)
(raw|from_json).ESS.ABD[0].DIGV 230 Tension réseau (V) (autre mesure) (à confirmer)
(raw|from_json).ESS.ABD[0].DVV 427 Tension (PV/DC link ?) (à confirmer)
(raw|from_json).ESS.ABD[0].SM 20 State machine / état interne (code)
(raw|from_json).ESS.SGS 0 Flag statut (à confirmer)
(raw|from_json).ESS.SPS 0 Flag statut (à confirmer)
(raw|from_json).ESS.SNS 0 Flag statut (à confirmer)
(raw|from_json).ESS.SDS 0 Flag statut (à confirmer)

Wahou, tu vas au delà de mes espérances ! En fait, tu me donnes toutes les clés pour récupérer les données que je veux. Merci beaucoup pour le temps consacré à la résolution de mon problème. :+1:
Je vais potasser tout ça pour sortir les données qui m’intéressent.

Hello @armavi,
J’ai réussi à récupérer les données que je voulais, en particulier celles à
incorporer au dashbord énergie de Home assistant.


Encore merci pour ton aide.

1 « J'aime »

Ce sujet a été automatiquement fermé après 2 jours. Aucune réponse n’est permise dorénavant.