Neues Modul zur Abfragen eines MBus Netzwerks

Begonnen von daubsi, 05 Dezember 2015, 21:57:44

Vorheriges Thema - Nächstes Thema

Spiff

Hi daubsi,

nur um sicher zu gehen: die libmbus muss installiert und lauffähig sein, d.h. es muss auf einem Linux-basierten System laufen, richtig?
Mein FHEM läuft auf Windows :-X und ich frage mich, ob ich das hier überhaupt zum Laufen bekommen würde.
Bei mir steht ein Wasserzählerwechsel an und ich könnte einen mit mBus und Impuls-Schnittstelle bekommen.

Es gäbe ja aber noch das wmBus-Modul, das über einen CUL laufen würde - den habe ich bei mir schon integriert.

Danke & Gruß
Spiff.

daubsi

Hi,

klar die Libs brauchts weil ich ja dann mit "mbus-fetch-serial" etc. die eigentlichen Werte auslese.
Wenn Du es schaffst die Lib unter Windows zu kompilieren (sollte grundsätzlich denkbar sein), würde es vermutlich auch unter Windows laufen!
Ist halt leider schon uralt die Lib, daher fürchte ich wird die nicht mehr weiter entwickelt...

VG
Markus

Spiff


brezel

Hallo zusammen,

ich wollte die Daten von meinem WMZ über MBus auslesen um sie den in FHEM 8) darzustellen und verarbeiten. Auf der Suche nach einen kostengünstigen Pegelwandler bin ich irgendwann auf diesen MBus Master mit USB-Schnittstelle aufmerksam geworden.

https://de.aliexpress.com/item/Industrielle-USB-zu-MBUS-host-USB-MBUS-meter-lesen-kommunikation-USB-versorgung-10-lasten/32897415863.html

Nach tagelangem Warten ist das gute Stück irgendwann aus China angekommen und konnte in Betrieb genommen werden. Das Teil mach was es soll und funktioniert auch mit der Originalsoftware Software meines WMZ zusammen. Durch das von daubsi veröffentliche Modul ( ;) Vielen Dank!) und kleinen Anpassungen für meinem WMZ war die Integration in FHEM sehr leicht.  ;D

VG
Martin

maseb

Hallo,

ich habe bisher einen Wasserzähler  von Sensus installiert,  eine HRI B4 .

Das hat mit dem MBus super funktioniert.

Nun hat unser Wasserversorger eine neue Wasseruhr , Diehl Hydrus 171A/B installiert.  Auch mit MBus.
Nun funktioniert aber mein bisheriges Skript nicht mehr.

Hat vielleicht jemand schon ein funktionierendes Skript für diese Wasseruhr erstellt?

LG Rudi
CUL mit EM 1000 S/IR und EM 1000 HSM

maseb

Hallo hier noch das Ergebnis vom Aufruf

/usr/local/bin/mbus-serial-request-data -b 2400 /dev/ttyUSB0 1


  <SlaveInformation>
        <Id>65369736</Id>
        <Manufacturer>HYD</Manufacturer>
        <Version>149</Version>
        <ProductName></ProductName>
        <Medium>Water</Medium>
        <AccessNumber>232</AccessNumber>
        <Status>00</Status>
        <Signature>3727</Signature>
    </SlaveInformation>

    <DataRecord id="0">
        <Function>Instantaneous value</Function>
        <Unit>Volume (m m^3)</Unit>
        <Value>264</Value>
        <Timestamp>2019-11-14T17:48:31</Timestamp>
    </DataRecord>

    <DataRecord id="1">
        <Function>Instantaneous value</Function>
        <Unit>Volume (m m^3)</Unit>
        <Value>257</Value>
        <Timestamp>2019-11-14T17:48:31</Timestamp>
    </DataRecord>

    <DataRecord id="2">
        <Function>Instantaneous value</Function>
        <Unit>Volume ( m^3)</Unit>
        <Value>0</Value>
        <Timestamp>2019-11-14T17:48:31</Timestamp>
    </DataRecord>

    <DataRecord id="3">
        <Function>Instantaneous value</Function>
        <Unit>Volume ( m^3)</Unit>
        <Value>257</Value>
        <Timestamp>2019-11-14T17:48:31</Timestamp>
    </DataRecord>

    <DataRecord id="4">
        <Function>Instantaneous value</Function>
        <Unit>Unknown (VIF=0x79)</Unit>
        <Value>546381567657134183</Value>
        <Timestamp>2019-11-14T17:48:31</Timestamp>
    </DataRecord>

</MBusData>


Lg Rudi
CUL mit EM 1000 S/IR und EM 1000 HSM

Spartacus

Hallo,
ganz blöde Frage von mir:
Habe seit ein paar Tagen nen Sensus Modul auf meinem Wasserzähler. Scheint mbus zu sein. Wie bindet man das Gerät elektrisch in fhem ein. Mein fhem läuft auf einem pi4. Gibt es einfache USB Adapter, oder was braucht man minimal für die elektrische Koppliung?

Danke
Spartacus.
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

rani22

Du brauchst ein MBUS Master z.B. KH-TTL-M5.
Entweder dieses am UART des Raspi anschliessen oder ein USB TTL Kabel
Zusätzlich brauchst du noch ein 24V Netzteil für den MBUS Master


Spartacus

Hi,
Besten Dank für die Antwort. Dan werde ich mir das mal beschaffen.

Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Geisha2021

#54
Hallo daubsi,

in deinem Eröffnungsbeitrag schreibst du dass du den Code für die Integration in FHEM angehängt hast. Er fehlt jedoch.

ich habe das Problem, dass ich nicht weiß wie ich die ausgelesenen Daten (mit "mbus-serial-request-data -b 2400 /dev/ttyUSB0 0") in FHEM integrieren kann.

Kannst du den Code bitte nochmals veröffentlichen?

Danke
Gruß Uli

Geisha2021

Habe jedoch jetzt das zip-File gefunden. Werde mich mal damit beschäftigen.


Geisha2021

#56
Folgendes Problem:
Ich habe jetzt nach der Anleitung von daubsi die MBus Abfrage in FHEM integriert jedoch erhalte ich keine Werte sondern nur Datum und Uhrzeit.
Wenn ich mit Putty direkt den MBus Abfrage (mbus-serial-request-data -b 2400 /dev/ttyUSB1 1) erhalte ich alle Werte.

Anbei die "RAW Definition"

defmod LandisGyr MBus ttyUSB0 0 /usr/local/bin/GetLandisGyr.sh

setstate LandisGyr ENERGY: POWER: RETURN: FORWARD: FLOWPERHOUR: VOLUME:
setstate LandisGyr 2021-11-14 20:34:18 ENERGY
setstate LandisGyr 2021-11-14 20:34:18 FLOWPERHOUR
setstate LandisGyr 2021-11-14 20:34:18 FORWARD
setstate LandisGyr 2021-11-14 20:34:18 POWER
setstate LandisGyr 2021-11-14 20:34:18 RAW SERIAL:,VENDOR:,PRODUCT/V:,REQUESTS:,POWER:/V,FLOWPERHOUR:/V,VOLUME:/V,ENERGY:/V,FORWARD:/V,RETURN:/V,DIFF:
setstate LandisGyr 2021-11-14 20:34:18 RETURN
setstate LandisGyr 2021-11-14 20:34:18 VOLUME

Was kann die Ursache sein?

Wohin werden denn die Daten geschrieben? Muss da vielleicht eine Datei oder Verzeichnis angelegt werden?


daubsi

Hallo,

was für ein Gerät willst Du denn integrieren?
Versuch erstmal mit
/usr/local/bin/mbus-serial-request-data -b 300 <ttydevice> <mbusid>
überhaupt Daten zurück zu bekommen. Die MBusID ist entweder fest vergeben oder wurde Dir bei der Einrichtung gesagt - hoffe ich.

Dann musst Du aus dem XML die für Dich interessanten Felder rausparsen und als Key-Value Paare zurückgeben an FHEM:
Siehe mein Beispiel für das Auslesen des Wasserzählers:

/usr/local/bin/ReadHRIDataUnit.sh:
#!/bin/bash
DEVICE=`/home/pi/listUSB.sh | grep Prolific | cut -d " " -f 1 | head -1`
#DEVICE=/dev/ttyUSB2

#mbus-serial-request-data -b 300 $DEVICE 10 > /tmp/hridataunit

python3 /home/pi/ReadHRIDataUnitMBus.py -b 300 ${DEVICE} 10 > /tmp/hridataunit

if [ $? -ne 0 ]; then
        sleep 10
        python3 /home/pi/ReadHRIDataUnitMBus.py -b 300 ${DEVICE} 10 > /tmp/hridataunit
        #/usr/local/bin/mbus-serial-request-data -b 300 $DEVICE 10 > /tmp/hridataunit
fi

serial=$(xmllint --xpath '//DataRecord[@id=0]/Value/text()' /tmp/hridataunit)
water=$(xmllint --xpath '//DataRecord[@id=1]/Value/text()' /tmp/hridataunit)
vendor=$(xmllint --xpath '//SlaveInformation/Manufacturer/text()' /tmp/hridataunit)
requests=$(xmllint --xpath '//SlaveInformation/AccessNumber/text()' /tmp/hridataunit)
echo VENDOR:$vendor,SERIAL:$serial,REQUESTS:$requests,LITERS:$water/V
rm /tmp/hridataunit



Wie Du siehst habe ich das inzwischen in ein Python Script ausgelagert, weil ich es gleich via MQTT als JSON Dokument auch weiterschicke und gar nicht mehr nur primär in FHEM importiere.


/home/pi/ReadHRIDataUnitMBus.py:

#!/usr/bin/env python3

import sys
import json
import paho.mqtt.client as mqtt

import xml.etree.ElementTree as ET

from mbus.MBus import MBus

address = sys.argv[4]
usbdevice = sys.argv[3] # "/dev/ttyUSB1"

mbus = MBus(device=usbdevice)

mbus.connect()
mbus.send_request_frame(int(address))

reply = None

try:
        reply = mbus.recv_frame()
except:
        sys.exit(1)

reply_data = mbus.frame_data_parse(reply)

xml = mbus.frame_data_xml(reply_data).strip()

print(xml)

mbus.frame_data_free(reply_data)
mbus.disconnect()

# MQTT it
#
tree = ET.ElementTree(ET.fromstring(xml))

timestamp = tree.findall(".//DataRecord[@id='1']/Timestamp")[0].text
water = int(tree.findall(".//DataRecord[@id='1']/Value")[0].text)
serialnumber = int(tree.findall(".//SlaveInformation/Id")[0].text)
manufacturer = tree.findall(".//SlaveInformation/Manufacturer")[0].text
accessnumber = int(tree.findall(".//SlaveInformation/AccessNumber")[0].text)

json_msg = { "manufacturer": manufacturer, "serial": serialnumber, "timestamp": timestamp, "value": water, "access": accessnumber }
msg = json.dumps(json_msg)

client = mqtt.Client()
client.connect("192.168.0.1", 1883, 60)

client.publish("mbus/hridataunit/state", msg)
client.disconnect()


Das FHEM Modul war mein erster Versuch sowas zu machen und ich gebe zu, ich habe keine Ahnung von PERL, daher habe ich es nur "irgendwie" reingekriegt, aber "schön ist anders".
FHEM führt das /usr/local/bin/ReadHRIDataUnit.sh aus, bekommt auf stdout die Key-Value-Paare und setzt dann die internen Variablen basierend da drauf.

Geisha2021

Hallo Markus,
vielen Dank für deine Antwort.
Die Daten von meinem Engelmann Wärme-Zähler werden alle 60 s ausgelesen und im File landisgyr gespeichert


<MBusData>

    <SlaveInformation>
        <Id>4171317</Id>
        <Manufacturer>EFE</Manufacturer>
        <Version>0</Version>
        <ProductName>Engelmann SensoStar 2</ProductName>
        <Medium>Heat: Outlet</Medium>
        <AccessNumber>179</AccessNumber>
        <Status>00</Status>
        <Signature>0000</Signature>
    </SlaveInformation>

    <DataRecord id="0">
        <Function>Instantaneous value</Function>
        <Unit>Fabrication number</Unit>
        <Value>4171317</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="1">
        <Function>Instantaneous value</Function>
        <Unit>Energy (kWh)</Unit>
        <Value>2443</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="2">
        <Function>Instantaneous value</Function>
        <Unit>Volume (m m^3)</Unit>
        <Value>702175</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="3">
        <Function>Instantaneous value</Function>
        <Unit>Power (W)</Unit>
        <Value>2970</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="4">
        <Function>Maximum value</Function>
        <Unit>Power (W)</Unit>
        <Value>44381</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="5">
        <Function>Instantaneous value</Function>
        <Unit>Volume flow (m m^3/h)</Unit>
        <Value>955</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="6">
        <Function>Maximum value</Function>
        <Unit>Volume flow (m m^3/h)</Unit>
        <Value>3311</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="7">
        <Function>Instantaneous value</Function>
        <Unit>Flow temperature (deg C)</Unit>
        <Value>35</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="8">
        <Function>Instantaneous value</Function>
        <Unit>Return temperature (deg C)</Unit>
        <Value>32</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="9">
        <Function>Instantaneous value</Function>
        <Unit>Temperature Difference (1e-2  deg C)</Unit>
        <Value>269</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="10">
        <Function>Instantaneous value</Function>
        <Unit>On time (days)</Unit>
        <Value>399</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="11">
        <Function>Instantaneous value</Function>
        <Unit>Time Point (time &amp; date)</Unit>
        <Value>2021-11-15T16:24:00</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="12">
        <Function>Instantaneous value</Function>
        <Unit>Energy (kWh)</Unit>
        <Value>0</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="13">
        <Function>Instantaneous value</Function>
        <Unit>Volume (m m^3)</Unit>
        <Value>0</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="14">
        <Function>Instantaneous value</Function>
        <Unit>Time Point (date)</Unit>
        <Value>2020-12-31</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="15">
        <Function>Instantaneous value</Function>
        <Unit>Error flags</Unit>
        <Value>0</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="16">
        <Function>Instantaneous value</Function>
        <Unit>Model / Version</Unit>
        <Value>5</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="17">
        <Function>Instantaneous value</Function>
        <Unit>Energy (kWh)</Unit>
        <Value>0</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="18">
        <Function>Instantaneous value</Function>
        <Unit>Energy (kWh)</Unit>
        <Value>0</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="19">
        <Function>Instantaneous value</Function>
        <Unit>Energy (kWh)</Unit>
        <Value>0</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="20">
        <Function>Instantaneous value</Function>
        <Unit>Energy (kWh)</Unit>
        <Value>0</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="21">
        <Function>Instantaneous value</Function>
        <Unit>Volume (m m^3)</Unit>
        <Value>0</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="22">
        <Function>Instantaneous value</Function>
        <Unit>Volume (m m^3)</Unit>
        <Value>0</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="23">
        <Function>Instantaneous value</Function>
        <Unit>Volume (m m^3)</Unit>
        <Value>0</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="24">
        <Function>Instantaneous value</Function>
        <Unit>Volume (m m^3)</Unit>
        <Value>0</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="25">
        <Function>Instantaneous value</Function>
        <Unit>Volume (m m^3)</Unit>
        <Value>0</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

    <DataRecord id="26">
        <Function>Instantaneous value</Function>
        <Unit>Volume (m m^3)</Unit>
        <Value>0</Value>
        <Timestamp>2021-11-15T15:25:23</Timestamp>
    </DataRecord>

</MBusData>





Mein Problem ist  dass ich die Daten nicht in mein FHEM nach deiner alten Anleitung hineinbekomme. Mein System läuft auf einem Raspi 3 und ich logge Temperaturen und Stromzähler (MQTT) seit ca 1 Jahr.
Geloggt wird auf einer MariaDB.
Meine Kenntnisse von Perl und Python sind sehr begrenzt und ich hoffe ich kann mit deiner Unterstützung das Problem lösen.

Gruß Uli

Geisha2021

ZitatDann musst Du aus dem XML die für Dich interessanten Felder rausparsen und als Key-Value Paare zurückgeben an FHEM:
Siehe mein Beispiel für das Auslesen des Wasserzählers:

Hallo Markus,
ich glaube da liegt das Problem. Das rausparsen funktioniert nicht. Aber warum?

Ich bin mit deiner alten Lösung ganz zufrieden wenn das noch klappen würde.