====== 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 falls libmbus nicht zu finden ist können sie diese auch manuell bauen siehe[[software:controller:vzlogger:installation_cpp-version|vzlogger Installation]] Punkt **Building OMS** * 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 falls der Zähler die Daten siehe Testabfrage in Wh ausgibt sollte der Kanal mit einer Auflösung von 1000 erstellt werden, bei Leistung zb mW ist eine Auflösung von 10 notwendig 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" Bitte Com-Port und UUID an deine Gegebenheiten anpassen. 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 .