M-Bus Controller ohne Perl
Auf dieser Seite finden sie eine Möglichkeit ohne perl einen MBus Zähler abzufragen
Vorraussetzung
Zähler ist über einen Serial Anschluß angeschlossen ( der Script kann auch auf TCP MBus gändert werden oder für einen virtuellen Seriellen Anschluß über SOCAT beispielweise)
Der Com-Port sollte auf 2400Baud 8E1 gestellt werden alternativ 300 Baud bzw 9600 Baud
sudo stty /dev/ttyUSB0 2400 cs8 -parodd -cstopb
libmbus libxml2-utils
- nötigen Dateien installieren
sudo apt update && apt install libmbus libxml2-utils
- nun eine Zähler auflisten lassen
bitte den Port anpassen
mbus-serial-scan /dev/ttyUSB0 #alternativ IP und Port mbus-tcp-scan 192.168.x.x 10001
Bitte die Addresse merken oder von Zähler ablesen
- nun kann eine Testabfrage der Daten gemacht werden
001 ist die Addresse des Zählers
mbus-serial-request-data /dev/ttyUSB0 001 #alternativ IP Port addresse mbus_request_data 192.168.x.x 10001 1
- Im Fontend einen Kanal erstellen (bsp Zählerstand) und die UUID dann in den Nachfolgenden Schritten eintrag
Bitte die hier schauen welche Daten der Zähler zur Verfügung stelle Der nachfolgende Script nutz „ DataRecord id=„0“ “ für Zählerstand
- Als nächstes Abfragedatei erstellen
- Manuelle erstellen
sudo nano read_meter.sh
- alternativ git clone
sudo git clone https://github.com/RaptorSDS/VZ-Mbus_script.git
- Abfragedatei bearbeiten
sudo nano read_meter.sh
- darin folgenden Inhalt hinzufügen/editieren
#!/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # set -e Stop script when something went wrong set -e #follow libary need libxml2-utils and libmbus # Set the serial port for the M-bus adapter SERIAL_PORT="/dev/ttyUSB0" #SERIAL_BAUD="2400" #alternativ ip address and port #IP="192.xxx.xxx.xxx" #PORT="10001" # Set the meter primary address and medium type PRIMARY_ADDRESS="0" # Set the medium type # Medium Type 2 is for electricity meters # Medium Type 3 is for gas meters # Medium Type 6 is for heat meters #MEDIUM_TYPE="2" #Set Data for Database UUID1="7680efc0-xxx-xxxx-xxxx-xxxxxxx" #UUID2="" #Set address for Database host_db="192.xxx.xxx.xxx" # Set the output file path OUTPUT_FILE="\var\tmp\meter_data.xml" #OUTPUT_FILE="meter_data.xml" # Read meter data using libmbus mbus-serial-request-data "$SERIAL_PORT" "$PRIMARY_ADDRESS" > "$OUTPUT_FILE" # alternativ IP Port # mbus_request_data "$IP" "$PORT" "$PRIMARY_ADDRESS" > "$OUTPUT_FILE" # Extract the energy value from the XML file using xmllint ENERGY_VALUE=$(xmllint --xpath 'string(//DataRecord[@id="0"]/Value/text())' "$OUTPUT_FILE") # Extract the power value from the XML file using xmllint #POWER_VALUE=$(xmllint --xpath 'string(//DataRecord[@id="1"]/Value/text())' "$OUTPUT_FILE") #Send data to Database wget -O - -q "http://"$host_db"/middleware/data/"$UUID1".json?operation=add&value="$ENERGY_VALUE"" #wget -O - -q "http://"$host_db"/middleware/data/"$UUID2".json?operation=add&value="$POWER_VALUE"" # Print the energy and power values for debug #echo "Energy Value: $ENERGY_VALUE" #echo "Power Value: $POWER_VALUE"
Dieses Script sendet nur die aktuellen Zählerstand an die Middleware, bereits vorbereitet ist alternativ/zusätzlich die Leistung.
Zeilen mit „#“ sind auskommentiert und können bei Bedarf genutzt werden für Debug oder um einen zweiten Kanal hinzuzufügen.
- Datei Speichern und ausführbar machen
chmod +x read-meter.sh
- Datei zu CRON hinzufügen (hier als Beispiel Raspberry Pi mit 3 minuten Intervall)
*/3 * * * * /bin/bash /home/pi/read_meter.sh
Der Mbus ist ggf nicht der schnellste eine Auslesung sollte minimal im Minuten Bereich durchgeführt werden .