Metainformationen zur Seite

M-BUS to MQTT

Funktion

Mit dem "Plugin" ist es möglich Daten von einem M-Bus Gerät (Gaszähler, Stromzähler, Wärmezähler, Wasserzähler, …) auszulesen und die Informationen per MQTT zu veröffentlichen. Mit dem MQTT Plugin / Loxberry 3.0 ist es anschliessend möglich diese Informationen auf den Miniserver zu bringen.

Weitere Infos unter: https://de.wikipedia.org/wiki/M-Bus_(Feldbus)

Das ganze basiert auf der tollen Arbeit von themole https://the78mole.de/taking-your-m-bus-online-with-mqtt/

Voraussetzungen

Download

→ Das "Plugin" ist noch nicht wirklich ein Plugin. Und ich weiss auch nicht, ob es zeitnahe zu einem Plugin wird. Dennoch möchte ich die Infos euch hier nicht vorenthalten. Falls jemand den Drang verspührt dies in ein sauberes Plugin umzuwandeln, darf er gerne übernehmen.

Installation

Da es kein einfaches Plugin ist, musst du dich per SSH auf den Loxberry verbinden.

M-Bus Reader Software (libmbus)

Tool installieren

Zum compilieren brauchst du libtool und dies holst du dir mit root Rechten

sudo apt-get install libtool

Gehe ins Pluginverzeichnis und hol dir libmbus:

cd /opt/loxberry/bin/plugins/mbus

git clone https://github.com/rscada/libmbus.git

Anschliessend gehst du in den libmbus ordner und führst nacheinander folgende Befehle aus

cd libmbus

./build.sh

./configure

make -j4

sudo make install

sudo ldconfig

Verbindungs Test

Anschliessend kannst du den ersten Test mit dem loxberry user machen. Hier im Beispiel wird mit dem per USB angeschlossenen M-Bus Master mit 2400 baude gescannt. Falls nichts gefunden wird. Versucht es mit 300 oder 9600 nochmals.

loxberry@loxberry:~ $ mbus-serial-scan -b 2400 /dev/ttyUSB0

Found a M-Bus device at address 3

Wenn du mehr als ein Gerät am MBUS hast kann es sein, dass die Primäreadresse Konflikte hat. Es lohnt sich daher nacher die Sekundäre Adresse zu verwenden. Diese kannst du wie folgt ermitteln:

loxberry@loxberry:~ $ mbus-serial-scan-secondary -b 2400 /dev/ttyUSB0

Found a device on secondary address 21013154E22E3103 [using address mask 2FFFFFFFFFFFFFFF]

Daten auslesen

Anschliessend kannst du die Daten von deinem Meter auslesen. Modifizier den Befehl mbus-serial-request-data mit deiner Bauderate und deiner Sekundäradresse:

loxberry@loxberry:~ $ mbus-serial-request-data -b 2400 /dev/ttyUSB0 21013154E22E3103

<?xml version="1.0" encoding="ISO-8859-1"?>

<MBusData>

  <SlaveInformation>
      <Id>21013195</Id>
      <Manufacturer>GWF</Manufacturer>
      <Version>54</Version>
      <ProductName></ProductName>
      <Medium>Gas</Medium>
      <AccessNumber>230</AccessNumber>
      <Status>00</Status>
      <Signature>0000</Signature>
  </SlaveInformation>
  <DataRecord id="0">
      <Function>Instantaneous value</Function>
      <StorageNumber>0</StorageNumber>
      <Unit>Fabrication number</Unit>
      <Value>21013195</Value>
      <Timestamp>2023-03-25T16:51:43Z</Timestamp>
  </DataRecord>
  <DataRecord id="1">
      <Function>Instantaneous value</Function>
      <StorageNumber>0</StorageNumber>
      <Unit>Volume (1e-2  m^3)</Unit>
      <Value>3146588</Value>
      <Timestamp>2023-03-25T16:51:43Z</Timestamp>
  </DataRecord>

</MBusData>

loxberry@loxberry:~ $

XML Daten in JSON umwandeln und veröffentliche

Dazu solltest du den MQTT client mosquitto-client, den JSON Prozessor ./jq und den python installer pip installieren.

sudo apt install mosquitto-clients jq python3-pip

Anschliessend kann der YAML/XML Prozessor yq installiert werden.

sudo pip3 install yq

Dann kannst mit dem pipe command | und xq das ganze von einem XML in ein JSON umwandeln:

loxberry@loxberry:~/bin/plugins/mbus/bin $ mbus-serial-request-data -b 2400 /dev/ttyUSB0 21013154E22E3103 | xq .

{

"MBusData": {
  "SlaveInformation": {
    "Id": "21013154",
    "Manufacturer": "GWF",
    "Version": "54",
    "ProductName": null,
    "Medium": "Gas",
    "AccessNumber": "11",
    "Status": "00",
    "Signature": "0000"
  },
  "DataRecord": [
    {
      "@id": "0",
      "Function": "Instantaneous value",
      "StorageNumber": "0",
      "Unit": "Fabrication number",
      "Value": "21013154",
      "Timestamp": "2023-03-25T19:35:15Z"
    },
    {
      "@id": "1",
      "Function": "Instantaneous value",
      "StorageNumber": "0",
      "Unit": "Volume (1e-2  m^3)",
      "Value": "3146777",
      "Timestamp": "2023-03-25T19:35:15Z"
    }
  ]
}

}

loxberry@loxberry:~/bin/plugins/mbus/bin $

Auslese Script erstellen

Jetzt bist du schon fast durch und es wird Zeit das ganze in eine ausführbare Datei zu packen "read_send_meters_mqtt.sh". Geh dazu in den mbus pfad, erstelle eine leere Datei namens read_send_meters_mqtt.sh und gib der datei die ausführungs rechte:

cd /opt/loxberry/bin/plugins/mbus

touch read_send_meters_mqtt.sh

chmod u+x read_send_meters_mqtt.sh

Anschliessend kannst du die Datei mit dem Texteditor nano öffnen und den Inhalt aus dieser Datei kopieren: read_send_meters_mqtt.zip

nano read_send_meters_mqtt.sh

Anschliessend sollst du den Text natürlich noch deinem System anpassen. Editiere dazu mindestens BAUDRATE, MQTT_HOST und MQTT_PASS. Nach dem Speichern der Datei kannst du diese kurz testet:

loxberry@loxberry:~/bin/plugins/mbus/bin $ ./read_send_meters_mqtt.sh

Sat Mar 25 20:01:17 GMT 2023 Sending data to host 192.168.1.10 as user 'loxberry' using topic 'mbusmeters/'. Getting data from 21013154E22E3103… 725 bytes sent {

"id": "21013154",
"manufacturer": "GWF",
"medium": "Gas",
"records": 2

}

loxberry@loxberry:~/bin/plugins/mbus/bin $

Am besten vorher noch kurz den MQTT Explorer starten, damit ihr seht, ob da was daher kommt:

Die Daten kann man wie üblich mit dem Loxberry MQTT Plugin und einem virtualen TCP oder UDP eingang nochher ins loxone übernehmen.

Das Script "read_send_meters_mqtt.sh" sucht beim ersten Start den Bus ab und fügt die gefundenen Geräte der Datei "~/config/plugins/mbus/addresses.txt" hinzu. Wenn das Script startet und diese Datei bereits existiert, wird nicht erneut gescannt und lediglich die Adressen in der Datei abgefragt. Wenn ihr also weitere Geräte abfragen möchtet, dann müsst ihr die Datei einfach vor dem nächsten ausführen löschen:

rm ~/config/plugins/mbus/addresses.txt

Automatisierte Abfrage erstellen

So wenn alles funktioniert und man mit dem ganzen zufrieden ist, wird es an der Zeit diesen Script automatisch zu starten. Dies kann man mit einem crontab machen:

crontab -e

Und dann dort folgendes anfügen:

PATH=$PATH:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib */5 * * * * cd /opt/loxberry/bin/plugins/mbus && ./read_send_meters_mqtt.sh » /opt/loxberry/log/mbus_mqtt.log

Dann wird ins verzeichnis gewechselt und alle 5min das script ausgeführt. Der Autput wird ins /opt/loxberry/log/mbus_mqtt.log geschrieben.