Vraag


  • Gameboy
  • Registratie: April 2000
  • Laatst online: 19:08
Mijn vraag:
...
Ik wil graag de instantane data uit mijn Eastron SDM230 MBus kWh meter uitlezen. Dat lukt nu nog niet, ik krijg alleen de Energy-data, dus enkele getallen van het gemeten energieverbruik. Voor het opvragen van de Power-data lijkt een ander commando van de master te moeten komen, maar dat heb ik nog niet voor elkaar kunnen krijgen.

Iemand ervaring met onderstaande setup?

Relevante software en hardware die ik gebruik
...
Ik heb HomeAssistant als docker container draaien op mijn Synology NAS.
Voor het uitlezen van de MBus data heb ik een El Cheapo MBus master gekocht via Amazon ( https://www.amazon.nl/Con...warmtemeter/dp/B0BXPRZ43H ).
De MBus data lees ik uit via een mbus-httpd docker container ( https://hub.docker.com/r/packom/mbus-release ).

Deze mbus-httpd container faciliteert dat ik via een eenvoudig HTTP POST request data kan uitlezen, wat achter de schermen in die container via libmbus' "mbus-serial-request-data" commando gaat. Dit wordt via een REST API beschikbaar gemaakt, en daar kan HomeAssistant prima mee omgaan.

Wat ik al gevonden of geprobeerd heb
...
Volgens de MBus documentatie van de Eastron SDM230 kWh meter, dient een andere code te worden toegezonden door de master om de "Instantaneous Electrical Data" te verkrijgen. Geen idee waarom dat niet samen met de Energy data in hetzelfde telegram meekomt, maar goed:

https://www.jwsmartmeters...30-Mbus-protocol-V1.0.pdf

Energy Data uitlezen:
code:
1
2
3
4
5
6
Step3 Read the Energy information

Master to slave :10 7b fd 78 16
Slave to master:
DIF=====Coding of t e Data Information Field
VIF=====Codes for Value Information Field


Power Data uitlezen:
code:
1
2
3
4
5
6
7
6. Read out of instantaneous electrical information
The instantaneous electrical information includes:
V,I,P ,Q,S,PF , Hz ect. MD
6.1 How to read instantaneous electrical information by using primary address:

Master to slave : 68 03 03 68 53 XX b1 05 16 (XX = MBus adres)
Slave to master: Variable data structure (instantaneous electrical information)


Ik heb werkelijk geen idee hoe ik de MBus master zo ver kan krijgen om dat andere telegram ("68 03 03 68 53 XX .. .. ..") te sturen.

Is er hier iemand die heel toevallig ook een Eastron MBus meter gebruikt, en deze Power Data wel kan uitlezen?

Weheat BB P60 | 6x 405 Wp Oost, 6x 405 Wp West | Zonneplan Day-Ahead | 1x Sessy 5 kWh

Alle reacties


  • Gameboy
  • Registratie: April 2000
  • Laatst online: 19:08
Na veel frustratie en zoekwerk heb ik mezelf echt even boos gemaakt op dit issue. Inmiddels is me een heel aantal zaken duidelijk geworden, al is er nog 1 raadsel overgebleven, maar daarover later meer.

TL;DR het is gelukt! Met veel frustraties en gespendeerde tijd...

Disclaimer: ik ben geen programmeur, maar code lezen en begrijpen wat het doet gaat redelijk, al zeg ik het zelf. ;)
Korte recap:
De Eastron SDM kWh meters met MBus lijken via het reguliere SND_UD2 datagram van de MBus master alleen te reageren met een datagram met enkele Energie-waardes, en laten de instantane waardes voor vermogen etc. achterwege. Dit lijkt een firmware-issue te zijn van deze meters zelf.

Om deze power-waardes wel te lezen, moet er een ander datagram worden verstuurd door de master, en dat lijkt met de libmbus code niet standaard mogelijk. Dat was het punt waarop ik vastliep.
Meer achtergrond:
Ik heb HomeAssistant draaien als Docker container op een Synology NAS. Om eenvoudig MBus uit te lezen, heb ik de packom/mbus-release container daarnaast draaien: https://github.com/packom/mbus-httpd

Die container exposed enkele veelgebruikte MBus commando's via een REST API, waarmee de RESTful integratie in HomeAssistant prima MBus kan uitlezen. So far so good, voor de reguliere datagrammen vanuit mijn Eastrom SDM230 MBus. Maar ik wilde meer data.
De speurtocht:
Zoeken naar termen met (lib)MBus, Eastron, HomeAssistant etc. leidde mij onder anderen naar deze github issue:

https://github.com/rscada/libmbus/issues/203

Dit is ook de versie van libmbus die door packom in de mbus-http container wordt gebruikt. En daar heeft iemand voor de Eastron SDM630 kWh meter een tweetal patches gepost:

https://github.com/rscada...3#issuecomment-1543772851

Dat, gecombineerd met de Docker build-instructies in de mbus-http repo, deed mij vermoeden dat er mogelijk iets te combineren was. De gedachte die rees was:

"Kan ik eventueel zelf een versie van deze container builden met de voorgestelde patches uit het comment hierboven?"

Dat was eerder gezegd dan gedaan, want uiteraard had ik me nog niet bedacht dat docker builds ook op de Synology konden (d'oh!). Dus ik heb heel veel tijd verkloot met het maken van een Ubuntu 22 distro in mijn WSL op m'n Windows10 PC, en zorgen dat ik daarmee via Docker Desktop images kon builden. Mja, live and learn...

Enfin, dat is uiteindelijk gelukt, en met het bouwen van de mbus-http container met de SDM630 patches was een image gebuild. Die kon ik naar mijn Synology krijgen, en ook nog via een docker-compose starten. Voor dat laatste is wel nodig dat je bij de "image:" property het ID van de verkregen image opgeeft, en geen naam/tag/label wat lijkt op een naam die een Docker hub repo zou kunnen zijn. Anders gaat de composer proberen deze image te downloaden, en kan dat natuurlijk nergens online vinden.

Een tweede struikelblok was het adresseren van de SDM MBus meter via het secundaire MBUs adres, wat ook nodig is om de gepatchte code te triggeren. Daarvan is niet veel documentatie te vinden, maar uiteindelijk is ook dat gelukt.

En wat blijkt? In tegenstelling tot wat de code in de patches doet vermoeden, is het niet nodig om de prefix "SDM630" mee te geven bij het uitlezen van de MBus op het secundaire adres, en dat is iets wat ik nog niet snap. But hey, wie klaagt? Het werkt nu ;)
Moraal van het verhaal:
Het is gelukt! Maar met heel veel (onnodig) verspilde tijd.
Magie?
Voor naslagwerk, en eventueel voor anderen die tegen hetzelfde aangelopen zijn, hieronder het een en ander aan configs en commando's die tot dit resultaat hebben geleid...
Op de Synology met Docker:
Het builden van Docker containers kan ook gewoon op de Syno zelf, zonder gekloot met Windows en WSL 2 ;)

code:
1
2
git clone https://github.com/packom/mbus-httpd.git
cd mbus-httpd


De Dockerfile heb ik ge-edit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
--- Dockerfile  2024-03-23 20:18:30.758370888 +0100
+++ ../Dockerfile       2024-03-23 19:55:39.619234324 +0100
@@ -24,6 +24,10 @@
     cd builds/ && \
     git clone https://github.com/rscada/libmbus && \
     cd libmbus && \
+    wget https://github.com/rscada/libmbus/files/11451201/p1.patch && \
+    patch -p3 < p1.patch && \
+    wget https://github.com/rscada/libmbus/files/11451203/p2.patch && \
+    patch -p3 < p2.patch && \
     mkdir -p output && \
     $COMPILE mbus/mbus-protocol.c -o output/mbus-protocol.o && \
     $COMPILE mbus/mbus-protocol-aux.c -o output/mbus-protocol-aux.o && \


Dit haalt de patch-files op vanuit het comment in de libmbus github repo, en past deze toe tijdens de Docker build. Daarmee worden de mbus commando's die de daadwerkelijke datagrammen verzenden en uitlezen voorzien van deze wijzigingen.

code:
1
docker build . -t mbus-httpd-sdm:$(date '+%Y%m%d')


Dat levert een docker image op die kan worden gestart met een docker run of docker-compose. Ik heb daarvoor onderstaande docker-compose-file gebruikt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
version: "3"
services:  
  mbus-httpd-sdm:
    container_name: mbus-httpd-sdm
    devices:
      - /dev/ttyUSB0:/dev/ttyUSB0
    environment:
      - RUST_LOG=INFO
    image: <image ID van de docker build>
    ports:
      - 8085:8080
    restart: unless-stopped


Dan kan de MBus API worden aangeroepen zoals beschreven in de mbus-httpd readme. Dit is wat ik in de RESTful integratie van HA heb opgenomen:

code:
1
2
3
4
rest:
  - scan_interval: 5
    resource: http://localhost:8085/mbus/get/ttyUSB0/9600/10010000FFFFFFFF
    method: POST


He secundaire MBus adres moet worden opgegeven als een hexadecimaal getal van precies 16 tekens lang. Het adres van mijn meter had ik ingesteld op 00001001 (standaard is het 00000001). Maar de MBus adressering werkt anders dan intuitief is. Stel dat je adres 12345678 is, dan moet je dat ombouwen tot de vorm 87654321, dus de volgorde van de bytes omdraaien.

00001001 wordt dan 10010000. Aangezien ik geen MBus commando "mbus-serial-scan-secondary" ter beschikking had, kon ik niet het daadwerkelijke, volledige secundaire adres van de meter vinden, maar met de "FFFFFFFF" wildcard ofwel masker, werkt het toch.

Dit secundaire adres uitlezen met de gepatchte container levert meteen 23 data-velden op met de instantane data uit de SDM kWh meter. Helaas alleen dat, en niet ook inclusief de energie-data, dus ik moet nu 2 separate RESTful URLs aanroepen voor alle data. Een keer op het primaire adres voor de energie-data, en een keer op het secundaire adres voor de instantane data.

Weheat BB P60 | 6x 405 Wp Oost, 6x 405 Wp West | Zonneplan Day-Ahead | 1x Sessy 5 kWh