Forum: Haus & Smart Home Wärmezähler über optische M-Bus-Schnittstelle auslesen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Daniel (Gast)


Lesenswert?

@matthew_f Hab mir Deine Infos bei Github durchgelesen, weicht die 
verlinkte mbus-test Variante immer noch vom Original ab? D.h. "init-size 
536" ist im Original ein anderer?

Bei Dir funktioniert es mit dem SensoStar E, dann muss es eigentlich 
auch mit meinem SensoStar U gehen.

Läuft der run.sh Skript auch mit einem USB-IR Lesekopf?

VG Daniel

von Matthew F. (matthew_f)


Lesenswert?

Hallo Daniel,

irgendwie habe ich dein Post vorher nicht richtig gelesen, und sehe erst 
jetzt, dass du Einträge für Energy und Volume hast aber sie sitzen auf 
0. Ich hatte am Anfang das gleiche Problem 
(Beitrag "Re: Wärmezähler über optische M-Bus-Schnittstelle auslesen") und die 
Lösung war einfach zurück in der Ausgabe zu schauen, weil mehrere 
Ausgaben/MBus Dekodierungen stattgefunden haben. Das Eintragen-finden 
macht bei mir das Python Skript automatisch.

Ansonsten, wenn das immer noch nicht funktioniert könntest du mein 
Version von damals as-is ausprobieren. Das habe ich scheinbar angefangen 
aber nicht zu Ende gemacht 
(https://github.com/mattfullerton/mbus-test-fork/) - aber ich kann das 
ergänzen und dann könntest du das run.sh usw. ausprobieren. Aber 
eigentlich wenn du schon Daten rausbekommst, denke ich nicht, dass du 
irgendetwas an mbus-test ändern müsstest. Eigentlich sollte ich eher 
schauen, dass mein Setup noch mit der aktuellster Version läuft. Aber... 
"never touch a running system", und keine Zeit, usw.

Ich bin auch der Meinung, dass es funktionieren musste, solang bei dir 
im Display die Daten in MW/kW ausgegeben werden (und auch wenn nicht, 
habe ich keine Ahnung, ob die Daten nicht dann doch noch vollständig 
über MBus zu erwarten wären). Ich bin zuversichtlich... weil wie gesagt, 
das gleiche Problem hatte ich auch am Anfang.

VG,
Matt

: Bearbeitet durch User
von Daniel (Gast)


Lesenswert?

Wenn ich den SenoStar mit "verbose level 2" und "COMMANDS 2" abfrage, 
erhalte ich tatsächlich u.a. die erzeugte Wärmemenge angezeigt:

DIF 04
VIF 06
        function_field: 00
        data_length:    4
        data_field:     04
        unit:           06
        data bytes: 3C 11 00 00
        Instantaneous value
        Energy (kWh)
        mbus_parse_data_field: DIF 0x04 was decoded using 4 byte integer
        result: 4412    factor 1.000000 n: 3    neg 0

In diesem Fall sind es tatsächlich 4412 kWh.

Weiter unten erscheint es dann 4x hintereinander mit Null Werten:

DIF 84
DIFE 20
VIF 06
        function_field: 00
        data_length:    4
        data_field:     04
        unit:           06
        data bytes: 00 00 00 00
        Instantaneous value
        Energy (kWh)
        mbus_parse_data_field: DIF 0x84 was decoded using 4 byte integer
        result: 0       factor 1.000000 n: 3    neg 0



Wie komme ich jetzt an den ersten Output mit der tatsächlichen 
Wärmemenge?

von Matthew F. (matthew_f)


Lesenswert?

Super, das freut mich!

Das aussuchen der Werte mache ich mit Python. Das sind die Zeile hier:
https://github.com/mattfullerton/volkszaehler_scripts/blob/main/readHeat/readHeat.py#L10-L28

Das Output von `mbus-test` wird in eine Datei geschickt (redirected 
von stdout). `run.sh` schaut, dass es genüg Zeit gibt für die Ausgabe 
gibt. Python geht die Datei durch. Nach einem Zeil mit Energy gefunden 
wird, wird geprüft ob die Wert > 0 ist. Ich habe da auch Werte für Power 
genommen, inzwischen habe ich aber festgestellt, dass die Werte nicht so 
nützlich sind (was gerade passiert nur einmal alle 4 Stunden ist 
uninteressant). Volkszähler ermittelt den Durchschnittsverbrauch aus den 
Gesamtverbrauchswerte.

von Daniel (Gast)


Lesenswert?

Danke Dir Matt!

Kannst Du mir bitte noch verraten, was ich eingeben muss, damit es auf 
meinem Raspberry mit mbus-test funktioniert? Bin froh, dass ich 
mbus-test zum laufen bekommen habe, bin leider kein Experte. Von Python 
hab ich null Ahnung.
Gibt es eine Möglichkeit die Daten per MQTT weiterzugeben?

VG Daniel

von Daniel (Gast)


Lesenswert?

Matt und @all, ich benötige bitte Eure Unterstützung.

Meinen SensoStar U konnte ich optisch (USB IR Lesekopf von Hichi) mit 
LORUSFREE direkt und fehlerfrei auslesen. Sämtliche Daten werden richtig 
angezeigt.

Für mich als Laien stellt sich jetzt die Frage, wie ich diese Infos 
nutzen kann, um meinen WMZ 4x am Tag ohne Programmierkenntnisse 
auszulesen.

Ich nutze iobroker und habe hier mehrere Raspberry´s.

Gibt es einen Adapter für iobroker, der im Grunde wie Lorusfree ohne 
besondere Einstellungen funktioniert?

Danke Euch!

von Matthew F. (matthew_f)


Lesenswert?

Ich kann dir gerne helfen, die Daten automatisch 4x am Tag auszulesen. 
Steht eigentlich alles hier: 
https://github.com/mattfullerton/volkszaehler_scripts/blob/main/readHeat/README.md
Aber wir können gern über Zoom oder so reden.
Nur ich schicke meine Daten an Volkszähler, was sehr einfach ist (ein 
URL mit der Wert drin). Mit ioBroker würde ich mich schlau lesen müssen.

von Matthias (Gast)


Lesenswert?

Hey ho,

erstmal vielen Dank für diesen Thread - das ist super hilfreich. Ich 
habe auch einen Engelmann Sensor hier - konkret eigentlich einen Metrona 
Heat C - allerdings scheinbar (?) baugleich zum Engelmann.

Mit der Firmware von naseweis bekomme ich auch eine wunderbare Antwort. 
Nur jetzt habe ich das gleiche Problem, das Thomas auch hatte - wie 
komme ich von der Binär-Antwort zur Tasmota Definition?
1
sml(1 1 "105BFE5916")
2
3
>M 1
4
+1,3,rE1,0,2400,Waerme,1

liefert mir den Binär-Blob.

Als Definition habe ich aktuell folgendes eingetragen (alles geklaut):
1
1,68b3b368x23uuUUUUUU@1,Energie total,,total,0 ; Total Wärmemenge
2
1,68b3b368x47uuUUUUUU@60,Flow F_akt,,F_akt,0 ; aktueller Flow in m^3
3
1,68b3b368x35uuUUUU@1,Power P_akt,,P_akt,0 ; aktuelle Wärme-Leistung
4
1,68b3b368x59uuUU@1,Temp Vorlauf,,Vorlauf,0 ; aktuelle Vorlauftemperatur
5
1,68b3b368x63uuUU@1,Temp Rückl,,Rückl,0 ; aktuelle Rücklauftemperatur
6
1,68b3b368x67uuUU@1,Temp Diff,,Diff,0 ; aktuelle Differenz Vorlauf/Rücklauftemperatur

Damit tut Tasmota leider überhaupt nichts, es werden keine Werte 
ausgewertet. Mit sensor53 d1 sehe ich aber eine Antwort:
1
10:01:21.893 : 68 04 04 68 53 fe 50 00 a1 16 10 5b 3e 04 20 05 00 68 08 00 72
2
10:01:21.937 : 37 41 25 10 c5 14 00 04 a0 00
3
10:01:21.979 : 00 00 04 78 39 77 9c 00 04
4
10:01:22.021 : 6d 01 2a e4 22 04 13 25 0d 08
5
10:01:22.066 : 00 44 13 25 e7 06 00 84 01
6
10:01:22.107 : 13 bf ef 07 00 04 06 d8 0e
7
10:01:22.149 : 00 00 44 06 a3 0c 00 00 84 01
8
10:01:22.195 : 06 9d 0e 00 00 84 10 06 00 00
9
10:01:22.240 : 00 00 c4 10 06 00 00 00 00
10
10:01:22.281 : 84 11 06 00 00 00 00 42 6c
11
10:01:22.324 : df 2c 02 6c ff 2c 84 20 06 00
12
10:01:22.367 : 00 00 00 84 30 06 00 00 00
13
10:01:22.408 : 00 04 3b 00 00 00 00 14 3b
14
10:01:22.451 : 9e 03 00 00 04 2b 00 00 00 00
15
10:01:22.495 : 14 2b a8 39 00 00 02 5b 1b
16
10:01:22.537 : 00 02 5f 1b 00 04 61 0d 00
17
10:01:22.578 : 00 00 02 23 f4 02 01 fd 17
18
10:01:22.620 : 10 04 90 28 18 00 00 00 f1
19
10:01:22.662 : 16

Nur was mache ich jetzt mit der Antwort? Ich habe schon versucht im 
Hex-Editor die aktuellen Zähler-Werte zu finden - nur diese Zahlen finde 
ich nirgends.

Hat jemand eine Idee?

Vielen Dank
Matthias

von Dodi (herr_grabowski)


Lesenswert?

Hi Matthias,

Bei deinem dump kommen die Daten d8 0e 00 00 nach dem Register 04 06.

Dann müsste dein Zählerstand 3800 kWh zeigen.

Falls ja, solltest du

1,0406uuUUuuUu@1,

Ausprobieren. Mit dem tasmota Decoder bin ich aber nicht so vertraut.

LGD

von Matthias (Gast)


Lesenswert?

Hi,

erstmal vielen Dank!

Ich habe die Definition einfach mal ausprobiert - damit bekomme ich aber 
leider auch nur eine 0 zurück :-(

Wie bist du denn auf die 3800 gekommen? Der Wert würde exakt stimmen.

Wenn ich in der Doku lese, dann bedeutet uuUUuuUu ein unsigned long 
word. Ich hätte jetzt little-endian vermutet, aber irgendwie sehe ich 
nur fürs Ende "uu" oder "UU", nie den Mix aus "Uu".

d8 0e 00 00 würden 4 Byte entsprechen, also 32 Bit. Im Hex Editor 
bekomme ich für 32 Bit an dieser Stelle aber 807417956 (big endian 
1681399856) angezeigt - das passt auch nicht.

Und zur 0 in Tasmota passt es auch nicht.

Ich bin verwirrt, irgendwo habe ich einen Denkfehler -.-

Ich habe es jetzt auch ein paar Minuten laufen lassen, es hat sich nicht 
eingefangen, irgendwie bleibt die 0 -.-

Viele Grüße
Matthias

von Dodi (herr_grabowski)


Lesenswert?

Hi,

Hex 0e d8 = dec 3800

06 04 low high low high

LGD

von Urs P. (naseweiss)


Lesenswert?

Matthias schrieb:
> 10:01:21.893 : "68 04 04 68" 53 fe 50 00 a1 16 10 5b 3e 04 20 05 00 68 08
> 00 72
> 10:01:21.937 : 37 41 25 10 c5 14 00 04 a0 00
> 10:01:21.979 : 00 00 04 78 39 77 9c 00 04


Hallo wenn Du Dir mal die ersten 4 Bytes anschaust, wirst du sehen, daß 
die anders sind als bei dem in meinem Skript verwendeten Sensostar U.

Schau Dir mal dieses Dokument an, darin ist - wenn auch für einen 
anderen Zähler - die Struktur der Daten erklärt.

https://docs.google.com/viewer?url=http%3A%2F%2Fwww.mikrocontroller.net%2Fattachment%2F577509%2FCF_Serie.pdf

Nimm mal
1,68040468x23uuUUUUUU@1,Energy total,,total,0 ; Total Wärmemenge

Das mit den abgezählten Bytes usw. musst du u.U. anpassen.

Cheerio

: Bearbeitet durch User
von Urs P. (naseweiss)


Angehängte Dateien:

Lesenswert?

Man sieht die Startsequenz (gelb) und danach die 23 zu überspringenden 
Bytes (blau). Dann kommen die relevanten Daten (rot)

Das muss dann mit dem eigenen Dump in Übereinstimmung gebracht werden.

: Bearbeitet durch User
von Matthias (Gast)


Lesenswert?

Vielen Dank für die vielen Infos :-). Dann probiere ich mal weiter!

Matthias

von Willy L. (sabberlotte)


Lesenswert?

Marcus schrieb:

>
> Mittlerweile denke ich, ist die Batterie am WMZ (3,25 Jahre alt) zu
> schwach (?) und die optische Schnittstelle lässt sich nicht mehr
> aktivieren.
>
> Kann man das testen? Wenn ich die Taste am WMZ drücke kann ich über das
> Handy keine IR Aktivität erkennen, aber ich denke da müsste auch erst
> die Aufweck-Sequenz ankommen, bevor der WMZ sich meldet?
>
> Hat noch jemand andere Ideen an was es liegen könnte?

Ich habe einen Allmess Integral-MK UltraMaXX mit dem ich mich wochenlang 
beschäftigt habe (leider lange ohne Erfolg).
Der Volkszähler- ähnliche Lesekopf (UART-Ausgang) hat auf Anhieb an 
einem Stromzähler funktioniert. Am WMZ leider keine Antwort.

Die batteriebetriebenen WMZ müssen mit Energie sparsam umgehen.
Das brachte mich auf die Idee die Sendeleistung des Lesekopfes zu 
reduzieren und den Empfang empfindlicher zu machen.
Also den Serienwiderstand der Sendediode von 180 auf 680 Ohm verändert,
den Serienwiderstand des Fototransistors von 12k auf 39k.

Und nun kann ich mich endlich mit der Antwort beschäftigen...

LG

von Tony L. (tonyl)


Lesenswert?

Marcus schrieb:
> Der Sensus reagiert leider überhaupt nicht...

Hallo in die Runde.

Selbes Problem hier. Ich habe einen PolluCom E mit Hichi TTL Kopf an 
einem NodeMCU mit Nicks tasmota_v3 und dem PolluCom Script von 
Christoph. Auch andere hier gepostete Scripts habe ich getestet - keine 
Chance.

Eventuell habe ich es überlesen: Kann jemand sagen, welche Linse am 
PolluCom E RX und welche TX ist? Ich habe es natürlich in beide 
Richtungen versucht, es wäre aber hilfreich hier schonmal Sicherheit zu 
haben. Anschluss am NodeMCU passt, der Handy-Test funktioniert.

Vielen dank für die super Arbeit, die hier bisher geleistet wurde!

: Bearbeitet durch User
von Tony L. (tonyl)


Lesenswert?

Hmm,

ganz schön fix:
1
08:20:51.435 read meter
2
08:20:51.437 wakeup start
3
08:20:51.467 wakeup end
4
08:20:51.469 wait for the meter
5
08:20:51.821 request data

Das bisher erwähnte Auskommentieren von SND_UD 0 (Carsten)
1
sml(1 1 "6804046853FE5000A116")
hat hier keine Besserung gebracht.

: Bearbeitet durch User
von Carsten (carsten12)


Lesenswert?

Ich denke, die Wakeup Seequenz wird nicht gesendet. Das siehst Du am 
Timecode. Probier mal meine Firmware. GrC

von Tony L. (tonyl)


Lesenswert?

Mit deiner Firmware vom 09.01. sehe ich keine Aktivität des Kopfes mehr 
in der Kamera des Handys. Das Script läuft weiterhin zu flott:
1
09:17:33.394 wakeup start
2
09:17:33.430 wakeup end

VG
-T

von Christoph (pidelta)


Angehängte Dateien:

Lesenswert?

Wegen der Nachfragen zu den PolluCom Zählern hier eine kurze 
Zusammenfassung meiner Erfahrungen.
Auch wenn das nichts neues ist, aber die optische Schnittstelle ist bei 
den Geräten fürs dauerhafte Auslesen ungeeignet. Der Zähler, mit dem ich 
viel getestet habe, antwortet beim zyklischen Abfragen nur noch 1-4x 
dann fällt er wieder in den Tiefschlaf, er lässt sich dann auch nicht 
mehr mit der MiniCom Software oder Python script auslesen. Nach ca. 24h 
kann er durch Drücken der Taste wieder für weitere 1-4 Auslesungen 
aktiviert werden. Ein anderer Zähler dessen Batterie noch „frischer“ ist 
lässt sich nach wie vor ohne Probleme zyklisch abfragen. (Ist nur die 
Frage wie lange noch)
Es ist nicht unwahrscheinlich, dass wegen geringer Spannung der Batterie 
das Auslesen irgendwann überhaupt nicht mehr geht.
Ein Servomotor oder ähnliches der immer wieder die Taste drückt könnte 
zumindest beim Auslesen 1x pro Tag helfen den Zähler immer wieder zu 
aktivieren. Damit würde man bei funktionieren Zählern die Anzahl der 
Auslesungen geringhalten.
Das in der Zwischenzeit etwas abgewandelte scrip für den Sensus Pollucom 
F, welches bei Zählern mit voller Batterie sehr gut funktioniert habe 
ich nochmal angehangen.

von Tony L. (tonyl)


Lesenswert?

Vielen Dank dafür. Auch mit diesem Script ist die Wake Up Sequence, so 
sie denn gesendet wird, enorm kurz.
1
10:49:02.753 ===== ctr: 10.00 wakeup start ===== 
2
10:49:02.793 ===== wakeup end, wait for the meter =====
Ich beobachte das hier mal weiter, vielleicht hat ja doch noch jemand 
eine Idee.

von Christoph (pidelta)


Lesenswert?

Sie mag kurz sein aber sie funktioniert hier bei mir, wenn ich den Teil 
aus dem Script lösche geht nix mehr.

von Tony L. (tonyl)


Lesenswert?

Kopf und PolluCom funktionieren, hiermit konnte ich dem Zähler gerade 
Daten entlocken: 
https://forum-raspberrypi.de/forum/thread/57389-sensus-pollucom-e-ueber-pymeterbus-auslesen/?postID=543096#post543096

RX am PolluCom E ist die linke Linse, falls sich das nach mir nochmal 
jemand fragt.

von Tony L. (tonyl)


Lesenswert?

Ich habe jetzt eine Lösung, die für mich funktioniert.

Im Heizkreisverteiler hängt ein NodeMCU mit esp-link. Auf einem Linux, 
das anderswo ohnehin ganztägig läuft, baue ich mit socat eine virtuelle 
serielle Schnittstelle mit esp-link als Gegenseite. Oben genanntes 
Python-Script nutzt dann den virtuellen Port um über esp-link mit dem 
PolluCom E zu kommunizieren. Die Weitergabe der Daten erfolgt dann per 
MQTT.

: Bearbeitet durch User
von Toptobias (toptobias)


Lesenswert?

Hallo zusammen, ich finde den Forom echt toll und habe viel gelernt 
daraus.
Ich kann nun mein WMZ Ultramess C3 von Molline die Verbrauchte 
Märmemenge mit dem Script abfragen.

Doch was überhaupt nicht klappt ist die Auslesung nach einer Periode.
Ich habe das Script angepasst das er den WMZ aller drei Stunden mal 
abfragen soll, doch es passiert einfach nichts. Ich erhalte nur noch im 
der Console diese Zeichenketten:

16:49:41.548 MQT: tele/tasmota_E3757E/STATE = 
{"Time":"2023-04-03T16:49:41","Uptime":"0T18:20:25","UptimeSec":66025,"H 
eap":19,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":1,"POW 
ER":"OFF","Wifi":{"AP":1,"SSId":"FRITZ!Box  6490 
2-4","BSSId":"3C:37:12:C7:8A:77","Channel":6,"Mode":"11n","RSSI":56,"Sig 
nal":-72,"LinkCount":1,"Downtime":"0T00:00:05"}}
16:49:41.554 MQT: tele/tasmota_E3757E/SENSOR = 
{"Time":"2023-04-03T16:49:41","WAERME":{"w_total":4711}}

Nun meine Frage wie kann ich das Script so einstellen das es, sagen wir 
mal aller 4 Stunden den Zähler ausliesst? Es muss auch nicht ab 
Mitternacht passieren. In der Scriptsprache bin ich nicht so vertrraut.

Vielen Dank

aktuelles Script:

>D
;start, define variables
wkup=1
period=180
;read meter every n minutes after midnight (60 --> 01:00, 02:00...)
blk=0


>B
;setup sensor
->sensor53 r

>S
if time%period==0
and blk==0
;minutes since midnight divided by period have a remainder of "0"
then
=#readmeter
blk=1
;set a flag to execute the readout only once every period
endif

if time%period-1==0
and blk==1
;one minute after we entered the first loop
then
blk=0
; reset the flag
endif


#readmeter

print wakeup start
;set serial protocol
ret=sml(-1 1 "2400:8N1")

;send 0x55 for 3 seconds with 8N1 (72x), 2400 baud (wakeup sequence)
for wkup 1 72 1
sml(1 1 "55555555555555555555")
next
print wakeup end
wkup=1

print wait for the meter
;wait for the meter to wake up
delay(350)

;switch serial protocol
sml(-1 1 "2400:8E1")
print request data
;set string to send to "105BFE5916" (request data)
;sml(1 1 "6804046853FE5000A116"
sml(1 1 "105BFE5916")

>M 1
+1,3,rE1,0,2400,WAERME,1
1,0406uuUUUUUU@1,Total energy,kWh,w_total,0

#

von Leo (leo89)


Lesenswert?

Hi,

ich versuche auch gerade einen Techem Ultra S3 (sollte auch ein Sharky 
775 sein) auszulesen - jedoch ohne Erfolg.

1. Hab direkt mit Tasmota gestartet, der Lesekopf funktioniert an einem 
Stromzähler.
2. Hab die V3 von Nick installiert -> 
Beitrag "Re: Wärmezähler über optische M-Bus-Schnittstelle auslesen"
3. Und es direkt mit dem Script von Carsten probiert. 
Beitrag "Re: Wärmezähler über optische M-Bus-Schnittstelle auslesen"

Wird mir nichts angezeigt in Tasmota ;-(

Hat noch jemand einen Tipp für mich? Wird doch nicht etwa bei dem Techem 
Zähler anders sein?

von Leo (leo89)


Angehängte Dateien:

Lesenswert?

Kann meinen Post leider nicht mehr bearbeiten - nutzt der Sharky 775 
einen kombinierte IR Diode für Send / Receive? Die Leseköpfe (die ich 
habe) haben zwei getrennte Dioden - da wird das alignment schon 
schwierig?

von Carsten (carsten12)


Lesenswert?

Ich verwende den Kopf von Hichi, der hat zwei getrennte Dioden. Das 
Gehäuse positioniere ich mit dem Kabel nach unten und dann muss ich es 
bündig an die beiden Erhebungen drücken damit es funktioniert. Dann 
liegen die beiden Dioden des Lesekopfes links und rechts neben der einen 
im Zähler.

Weil es mir und anderen passiert ist: schaue im Log ob die 
Aufwachsequenz wirklich so lang ist, wie sie sein sollte (je nach Script 
im Bereich einiger Sekunden).

GrC

von Leo (leo89)


Lesenswert?

Hi Carsten und danke für die Tipps!

Ist in der Tat ein Problem mit der Positionierung des Lesekopfes!

Habe jetzt eine Position leicht versetzt zu einer Seite gefunden, die 
funktioniert. (Lesekopf ist ein ein Bausatz gewesen, 2 getrennte Dioden, 
Gehäuse selbst gedruckt, ähnlich wie Hichi)
Habe auch nur mal das Plastikgehäuse des Lesekopfes aufgesetzt um mir 
durch die Löcher der LEDs eine gute Position auszuloten. Gar nicht so 
einfach! :-/

: Bearbeitet durch User
von Rubinho S. (che_guevara)


Lesenswert?

Frank schrieb:
> Ich habe einen Allmess Echo II WMZ und einen Hitchi IR wifi.
> Nutze die tasmota_V3 und das Script von Nick. Im Script musste ich
> die Zeile für Total energy wesentlich ändern. Vielleicht ist der Hinweis
> ja für den ein oder anderen Allmess-Besitzer von Interesse. Script im
> Anhang.

Hallo Zusammen, ich habe mir als Vorbereitung für einen 
Wärmepumpeneinbau einen Wärmezähler (gebrauchter Allmess Integral-V 
Ultralite) zugelegt.
Momentan liegt er noch auf meinem Schreibtisch zum testen. Ich möchte 
zukünftig die Daten mittels Optischer Schnittstelle und einem Hichi Wifi 
Lesekopf an HomeAssistant senden.

Wenn ich das Script von Frank (vielen Dank dafür) benutze, bekomme ich 
nach dem Speichern einmal Werte geschickt, allerdings passiert dann nix 
mehr. Ich sehe kein Weakeup oder sonstiges mehr. Lediglich die 
Statuslogs, die alle 5min gesendet werden.

Sollte ich nicht alle x Minuten (abhängig von der Periodenzahl) 
normalerweise ein Wakeup im Konsolelog sehen?

Viele Grüße
Che

von Rubinho S. (che_guevara)


Lesenswert?

Ok, ich war wohl zu ungeduldig.
Das Teil fing erst ab Mitternacht an loszulegen.

Danke an die Community für die tolle Arbeit, auch wenn es in diesem 
Thread recht unübersichtlich wurde. Was der Anzahl an Posts geschuldet 
ist.
Ein Wiki wäre kein Luxus :)

Viele Grüße
Che

von Thomas C. (thomas_c31)


Lesenswert?

Hallo,
ich habe auch einen Sensus PolluCom E/S und wollte die Wärme-Menge 
optisch auslesen. Jetzt lese ich hier aber öfter, dass es bei zu 
schwachen Batterien oder bei längerer Laufzeit zu Problemen kommt. Wie 
sind eure Lnagzeit-Erfahrungen?

von Tony L. (tonyl)


Lesenswert?

Ich habe mein Konstrukt aus ESP-Link und Docker Container mit Python 
Script jetzt seit März laufen, Abfrage alle 55 Minuten. Bisher keine 
Probleme. So richtig langzeit ist das aber natürlich noch nicht.

von Thomas C. (thomas_c31)


Lesenswert?

D.h.
- WMZ: PolluCom E (batteriebetrieben)
- IR-Lesekopf mit TTL (Wie befestigt?)
- NodeMCU (ESP-Link)
- Python-Script zur Kommunikation 
(https://forum-raspberrypi.de/forum/thread/57389-sensus-pollucom-e-ueber-pymeterbus-auslesen/?postID=543096#post543096)
- Wakeup-Time 55 Minuten

von Christoph (pidelta)


Lesenswert?

Bei mir war nach ca. einem Jahr Ende, kein zyklischen auslesen mehr. 
(konnte ich bei 2 Zählern feststellen) Vermutlich habe ich am Anfang 
beim Testen auch wirklich sehr oft ausgelesen.
Liegt auch nicht am ESP, gleiches ist auch per USB-IR-Kopf und Python 
Script festzustellen.
Ungefähr 1x am Tag geht es nach vorherigen drücken der Taste noch. Ich 
habe schon von anderen gehört, dass sie das dann per SwitchBot/FingerBot 
machen, auch von einem Servo am ESP habe ich schon gelesen, war mir aber 
bisher zu aufwändig. Die tatsächlichen Zeiten können sich natürlich 
unterscheiden aber eine wirkliche dauerhafte Lösung scheint mir das 
Auslesen per IR-Schnittstelle bei diesen Zählern nicht zu sein.

von Thomas C. (thomas_c31)


Lesenswert?

Vielen Dank, da der Austausch des WMZ bei leerer Batterie auch ein 
Kostenfaktor ist, werde ich mich mal nach Alternativen erkundigen und 
dann vielleicht gleich mit M-BUS on Board.

von Tony L. (tonyl)


Lesenswert?

Thomas C. schrieb:
> D.h.
> - WMZ: PolluCom E (batteriebetrieben)
> - IR-Lesekopf mit TTL (Wie befestigt?)
> - NodeMCU (ESP-Link)
> - Python-Script zur Kommunikation
> 
(https://forum-raspberrypi.de/forum/thread/57389-sensus-pollucom-e-ueber-pymeterbus-auslesen/?postID=543096#post543096)
> - Wakeup-Time 55 Minuten

Was das Script angeht: https://github.com/ostpol/PolluComE, dort stehen 
die Anpassungen bzgl. Kommunikation zwischen Python und ESP-Link drin. 
Docker Container ist auch fertig. Disclaimer: Ich bin kein besonders 
guter Programmierer und auch zu Docker kenne ich nur Basics. Aber 
irgendwo muss man ja mal anfangen. ;)

Befestigung sieht so aus: 
https://twitter.com/ostpol/status/1634896280202907648?s=12&t=xc7l-nC4po-ngRWAnWqoPw

von Klaus R. (klara)


Lesenswert?

Thomas C. schrieb:
> Vielen Dank, da der Austausch des WMZ bei leerer Batterie auch ein
> Kostenfaktor ist, werde ich mich mal nach Alternativen erkundigen und
> dann vielleicht gleich mit M-BUS on Board.

Hallo,
ein PolluCom E war mein erster Wärmemengenzähler. Er lief über M-Bus und 
wurde von mir zunächst zu oft abgefragt. Ich erfuhr das die 
Auslesehäufigkeit begrenzt wird, so dass die Mindestlaufzeit erreicht 
werden kann.

Seit über 10 Jahren habe ich zwei Sontex Supercal 539 im Einsatz. Er 
wird von mir über M-Bus gespeist und somit wird die interne Batterie 
nicht belastet. Beim Kauf mußte ich extra angeben, das ich über M-Bus 
speisen möchte.

Den 539 gibt es wohl nicht mehr. Heute ist es wohl der Sontex Supercal 
739.
mfg Klaus

von Toptobias (toptobias)


Lesenswert?

Hallo nochmal zusammen. Kann mir jemand bitte helfen zwecks der 
Dateninterpretation. Ich habe ein WMZ vom Typ Ultramess C3 von Molline.
Ich bekomme folgende Daten heraus.

12:59:25.030 : 00 00 00 04 78 3c 9e 36 01 04 06
12:59:25.075 : 85 14 00 00 04 13 1c d6 24
12:59:25.118 : 00 04 2b 00 00 00 00 14 2b 18
12:59:25.161 : 3e 00 00 04 3b 00 00 00 00
12:59:25.203 : 14 3b 39 f3 f6 cf 02 5b 19
12:59:25.246 : 00 02 5f 19 00 02 61 fe ff 02
12:59:25.290 : 23 1f 02 04 6d 2d 2a f3 27
12:59:25.332 : 44 06 e5 07 00 00 44 13 0f 82
12:59:25.378 : 0d 00 42 6c df 2c 01 fd 17
12:59:25.420 : 40 03 fd 0c 05 00 00 84 20 06
12:59:25.463 : 00 00 00 00 c4 20 06 00 00
12:59:25.505 : 00 00 84 30 06 00 00 00 00
12:59:25.553 : c4 30 06 00 00 00 00 7d 16

Leider kann ich nur nur Total energy auslesen mit "04 06".
Wie kann ich die anderen Werte wie m³, power, flow und Temp auslesen.

Ich habe diese Werte probiert, aber da kommt nichts raus :-(

1,0C14bcd8@100,Total volume,m³,v_total,2
1,0B2Dbcd6@0.01,Current power,W,p_act,0
1,0B3Bbcd6@1000,Current flow,m³/h,F_akt,3
1,0A5Abcd4@10,Flow temp,°C,t_flow,1
1,0A5Ebcd4@10,Return temp,°C,t_return,1
1,0B61bcd6@100,Temp diff,°C,t_diff,2


Vielen Dank
toptobias

von Toptobias (toptobias)


Angehängte Dateien:

Lesenswert?

Hallo zusammen, so nach längerem Probieren habe ich es nun rausgefunden 
um die Daten aus einem Molline Ultramess C3 auszulesen.

Hier die Konfiguration:

1,0406uuUUUUUU@1,Total energy,kWh,w_total,0
1,0413bcd8@100,Total volume,m³,v_total,2
1,042Bbcd6@1,Current power,W,p_act,0
1,043Bbcd6@1000,Current flow,l/h,F_akt,3
1,025BuuUU@1,Flow temp,°C,t_flow,2
1,025FuuUU@1,Return temp,°C,t_return,2
1,0261bcd4@10,Temp diff,°K,t_diff,2

1,142Bbcd6@1,Maximum power,W,p_max,0
1,143Bbcd6@1000,Maximum flow,l/h,F_max,3

1,0478bcd8@1,Seriennummer,,serialnum,0
1,0223uuUU@1,Meter days,d,OpDays,0
1,03FD0Cuu@1,Firmware Version,,FW_Version,0

von Martin (klostopfer)


Lesenswert?

Hallo zusammen in diesem wunderbar motivierenden Thread. Ich habe mich 
so n bisschen drangehängt und das ganze mit einem Sensonic II von ISTA 
probiert und es hat eigentlich auch ganz gut geklappt.

Ich habe das Script von Corny (https://github.com/corny/mbus-esp32) auf 
einen ESP32 (+Volkszähler-IR-Interface) gespielt, etwas angepasst 
(hauptsächlich musste die Länge des Antworttelegrams angepasst werden) 
und die Antwort als JSON per MQTT an Iobroker übermittelt und da mit 
einem entsprechenden Skript aufgearbeitet. Hat auch alles sehr gut 
funktioniert, konnte alle 15-16 Minuten auslesen, bei kürzeren Intervall 
kam einfach keine Antwort.

Hatte mir zum Testen eine originalverpackte Sensonic II mbus gekauft, 
weil ich zu faul war zum Testen immer vor meinem FBH-Verteiler zu sitzen 
und hab eine mit mbus-Anschluss genommen umd das auch direkt mal zu 
testen - und auch das hat genauso gut und mit dem gleichen Script 
funktioniert, lediglich die Aufwecksequenz braucht man nicht senden, auf 
(Kabel)-Mbus lauscht der Wärmemengenzähler wohl dauerhaft mit.

Weiterhin war es extrem wichtig, die Dioden gut vor dem optischen 
Interface zu platzieren. Davorhalten hat nichts gebracht, da war die 
Fehlerquote sehr hoch. Mit einem gedruckten Tool hat das dann aber ganz 
gut funktioniert und hat auch noch gleichzeitig die beiden Dioden 
gegeneinander abgeschirmt.

Das Ganze hat hervorragend funktioniert... SO LANGE ich an meinem 
Schreibtisch saß. Als ich das Projekt dann an den Zähler meiner 
Fußbodenheizung anschließend wollte, musste ich leider feststellen, dass 
scheinbar das optische Interface von meinem Zähler deaktiviert ist. Bei 
ISTa habe ich aber leider keinen Support ans Telefon bekommen, der davon 
Ahnung hatte. Angeblich ist der Port bei Mietgeräten immer deaktiviert, 
wenn man die Fernauslesung von ISTA nicht dazu kauft.

Und jetzt die große Frage: Hat irgendjemand eine Idee, wie ich meinen 
Wärmemengenzähler zum reden bekomme? Die optische Schnittstelle kann ja 
nichts verstellen, ist ja wirklich nur zum Auslesen und auch genau dafür 
vorgesehen. Hat jemand zufällig zugriff auf die Montagehandbücher von 
dem Ding, so dass man mal nachsehen kann, wie die Monteure die optische 
Schnittstelle freischalten? Hat jemand zufällig shcon mal zugesehen, wie 
die dinger programmiert werden? Oder kennt jemanden, der sachdienlich 
weiterhelfen kann?

Wäre klasse, wenn der Aufwand jetzt nicht umsonst war. Würde 
grundsätzlich ja auch das Fernauslesesystem der ISTA kaufen, aber man 
kann es halt nirgends einbinden und somit ist es nutzlos für mich.

Viele Grüße
Martin

von Sven K. (satirebird)


Lesenswert?

Hallo Martin,

ich habe auch ein sensonic II und konnte die erfolgreich auslesen. Auf 
der optischen Schnittstelle der sensonic II eine spezielle 
Aufwachsequenz. Ich habe das damals mit Messung der Batteriespannung 
herausgefunden. Siehe hier:
Beitrag "Re: Wärmezähler über optische M-Bus-Schnittstelle auslesen"

von Walter (wavoigt)


Lesenswert?

@carsten12
Hallo,
Ich hab letzte Woche den Fernwärmeanschluss bekommen mit dem Sharky 775.
Jetzt hab ich versucht, den auszulesen mit dem Hichi Wlan Lesekopf.
Das Script ist von Carsten waermezaehler.txt (896 Bytes) vom 23.12.2022.
Ich bekomme zwar eine Antwort vom WMZ, aber die ist viel zu kurz, und 
ergibt auch keine Messwerte.
Das Drehen des Kopfes brachte nix.
Ich habs mit 2 verschiedenen Firmwares versucht, mit folgendem Ergebnis:
1
tasmota_V3.bin.gz:  von Nick v. 18.12.22
2
--------------------
3
19:38:53.640 wakeup start
4
19:38:56.935 wakeup end
5
19:38:56.937 wait for the meter
6
19:38:57.291 request data
7
19:38:57.406 : 10 5b fe 59 16
8
9
tasmota.bin.gz von Carsten v. 09.01.23
10
------------------------
11
19:51:04.585 wakeup start
12
19:51:07.879 wakeup end
13
19:51:07.880 wait for the meter
14
19:51:08.234 request data
15
19:51:08.441 : 68 16 16 68 08 01 72 01 30 
16
19:51:08.482 : 01 76 a5 11 40 04 b7 00 00 
17
19:51:08.527 : 00 0f 04 03 c1 04 fe df 8c 16

Ich wäre dankbar, wenn jemand eine Idee dazu hätte.

von Walter (wavoigt)


Angehängte Dateien:

Lesenswert?

Also, ich habs geschafft, hier eine kurze Zusammenfassung:
(Ich hab noch die offizielle Kommunikationsbeschreibung des Sharky 775 
angehängt)

Firmware: tasmota.bin.gz von Carsten v. 09.01.23
          (= tasmota12.3.1.bin.gz  mit w_delta)
          (tasmota_V3.bin.gz von Nick 18.12.22 geht bei mir nicht)

Script: waermezaehler.txt (889 Bytes) vom 23.12.22
        (liest alle 1 bzw 5 min ab und sendet MQTT)
oder:   das "Mitternachtsscript" von Carsten v. 09.01.2023
        (liest nach Mitternacht ab und berechnet Delta zum Vortag = 
w_delta)

Bei 1. Inbetriebnahme muss vermutlich im Script "waermezaehler.txt":
sml(1 1 "6804046853FE5000A116"
aktiviert werden, um die Datenübertragung zu initieren
-> Zähler sendet E5 (Ack)
Dann nur noch sml(1 1 "105BFE5916")

Befehlszeile:
mit "sensor53 d1" kommt folgende Response:
danach "sensor53 d0"
1
10:07:45.752 : 68 95 95 68 08 01 72 01 30 01 76 a5 11 40 
2
10:07:45.794 : 04 29 00 00 00 0c 06 83 00 
3
10:07:45.836 : 00 00 8c 10 06 00 00 00 00 
4
10:07:45.880 : 8c 20 13 03 01 00 00 0c 13 79 
5
10:07:45.923 : 75 00 00 0c 2b 00 00 00 00 
6
10:07:45.964 : 0b 3b 00 00 00 0a 5a 37 05 
7
10:07:45.006 : 0a 5e 89 03 0a 62 47 01 0b 26 
8
10:07:46.044 : 71 01 00 04 6d 11 0a f8 28 
9
10:07:46.086 : 4c 06 00 00 00 00 4c 13 00 00 
10
10:07:46.131 : 00 00 cc 10 06 00 00 00 00 
11
10:07:46.174 : cc 20 13 00 00 00 00 42 6c ff 
12
10:07:46.218 : 25 42 ec 7e 1f 35 fc 01 06 
13
10:07:46.260 : 00 00 00 00 fc 01 13 00 00 00 
14
10:07:46.305 : 00 fc 11 06 00 00 00 00 fc 
15
10:07:46.347 : 21 06 00 00 00 00 f2 01 6c 00 
16
10:07:46.391 : 00 c2 01 ec 7e ff 2c c5 16

von Phill (philip_mario)


Lesenswert?

Sehr lehrreiche Beiträge. Als interresierter Laie will ich einfach nur 
danke sagen !!

Kann ebenfalls berichten, Sharky 775 kann man mittels HichiTTL und 
tasmota auslesen.

Ein Aspekt den ich trotzdem gerne fokussieren würde, da mich das etwas 
Zeit gekostet hat ..
Die initiale Sequenz welche den Sharky Daten entlockt wird getriggert 
durch ein  sml(1 1 "6804046853FE5000A116") .
Dieses muss wohl einmalig nach der Inbetriebnahme passieren ..

Bei mir hat das aber nicht auf anhieb funktioniert.

Nach vielen hin-und-her und etlichen Fehlversuchen habe ich die Anregung 
von Thomas probiert und ins waermezaehler.txt -Script von Carsten ein 
Delay(100) eingehekelt.

..
1
;reset application code
2
sml(1 1 "6804046853FE5000A116")
3
delay(100)
4
;set string to send to "105BFE5916" (REQ_UD2)
5
sml(1 1 "105BFE5916")
..

Anschließend wurde Sharky ziemlich gesprächig... ha .. ein Glücksmoment 
nach vielen Stunden :-) !!
Offensichtlich wollte er es etwas gemächlicher angehen und hat eine 
Pause gebraucht.
Die initiale Sequenz kann dann wieder auskommentiert werden.

Verwende ein Hichi TTL (Kabel nach unten) mit Wemos D1 mini .. TX-TX 
RX-RX, firmware tasmota.bin.gz von Carsten v. 09.01.23.

von Thorsten N. (thorsten_n)


Lesenswert?

Hallo ich habe den CF Echo 2 von Itron und durch die tolle Anleitung 
hier im Forum habe  ich es geschafft und kann den WMZ auslesen und die 
Daten im HomeAssisstent anzeigen lassen. Nur leider werden ab und zu 
falsche Daten gesendet, dann werden auf einmal z.B. 50.000 mWh Total 
Energy gesendet. Hat hier jemand eine Idee woran es liegen könnte bzw 
ich das Problem beheben kann ?

Ich weiß nicht wie ich das Script ändern kann das unschlüssige Werte gar 
nicht gesendet werden.

Ich nutze das Script Waermemengenzaehler_Allmess.txt und habe Tasmota_V3 
geflasht.

von Wro (wro77)


Lesenswert?

Hallo allerseits,

ich versuche vergeblich einen allmess Integral-V Ultralite Ha mit einem 
Hichi Lesekopf auszulesen. Ich nutze das Skript von Frank 
(Script_Waermemengenzaehler_Allmess.txt), welches bei Rubinho S. 
erfolgreich bei dem fast baugleichen WMZ (lediglich ohne HA) läuft.

Ich habe mich mit Rubinho auch bereits direkt ausgetauscht und wertvolle 
Tipps sowie seine funktionierende Tasmota Version zugesendet bekommen.

Ich kriege aber absolut keine Daten rein.
Der Lesekopf wurde schon in allen erdenklichen, sinnvollen Positionen 
gedreht. Ich habe auch schon mal etwas Klebeband zwischen Lesekopf und 
den Dioden platziert, um den Abstand zu vergrößern.
Der Lesekopf ist in Ordnung. Das Testskript mit Spiegel empfängt die 
eigenen Daten.

Ich habe inzwischen die Befürchtung, dass die Dioden bei dem WMZ nicht 
in Ordnung sind, die Batterie zu schwach ist oder die optische 
Schnittstelle evt. sogar gar nicht aktiviert ist (wenn das überhaupt vom 
Hersteller vorgesehen ist).

Vielleicht hat das Schwarmwissen hier aber auch noch einen 
entscheidenden Tipp in petto.

Hier noch ein paar Zeilen Code aus der Tasmota Konsole nach dem 
Aufwecken.

22:00:00.315 wakeup start
22:00:03.328 wakeup end
22:00:03.330 wait for the meter
22:00:03.632 request data
22:02:30.849 RSL: STATE = 
{"Time":"2023-11-30T22:02:30","Uptime":"0T09:10:29","UptimeSec":33029,"H 
eap":22,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":0,"POW 
ER":"ON","Wifi":{"AP":1,"SSId":"xxx","BSSId":"xxx","Channel":6,"Mode":"1 
1n","RSSI":72,"Signal":-64,"LinkCount":1,"Downtime":"0T00:00:03"}}
22:02:30.855 RSL: SENSOR = 
{"Time":"2023-11-30T22:02:30","WP_WMZ":{"Energie_total":0.000,"Durchflus 
s_total":0.00,"Leistung_akt":0.00,"Durchfluss_akt":0.000,"temp_Vorlauf": 
0.0,"temp_Ruecklauf":0.0,"temp_diff":0.00,"Betriebstage":0}}

von Willy L. (sabberlotte)


Lesenswert?


von Wro (wro77)


Lesenswert?

Danke für den Tipp.
Habe ich bisher noch nicht gemacht und ich bin mir auch nicht sicher, ob 
das meine elektrotechnischen Kompetenzen hergeben, da ich mal stark 
davon ausgehe, dass ich das löten muss?

Hast du das bei einem Hichi Lesekopf gemacht oder ist dein Lesekopf ein 
Eigenbau?

von Willy L. (sabberlotte)


Lesenswert?

Sicher musst du löten (oder jemand der das kann).

Wro schrieb:
> Hast du das bei einem Hichi Lesekopf gemacht oder ist dein Lesekopf ein
> Eigenbau?

Kein Eigenbau.
Hichi kompatibel würde ich sagen.
Bei meiner Anwendung war ausschlaggebend die IR Sendeleistung zu 
reduzieren und den Empfänger empfindlicher zu machen.

LG

von Walter (wavoigt)


Lesenswert?

@thorsten_n
Hi, ich hab das gleiche Problem, dass sporadisch unplausible Werte 
kommen, im Extremfall "0" oder irgendein Zufallswert.
Das liegt vermutlich an dem optischen Interface, bei dem ab und zu 
Lesefehler auftreten.
Wie ich das im Tasmota script beheben kann, hab ich noch nicht 
herausgefunden, aber ich hab "Hilfssensoren" ins configuration.yaml 
eingefügt, und mache die Plausibilitätsprüfung dort.
1
# Test des Eingangswertes auf Grenzen relativ zum vorigen Wert, 
2
# falls der Sprung zu gross ist, wird der vorige Wert übernommen 
3
template:
4
  - sensor:
5
      name: "Tasmota 3 Waerme W Total Korr"
6
      unique_id: "tasmota_3_waerme_w_total_korr"
7
      icon: mdi:chart-bar
8
      state: >-
9
        {% if (is_number(states("sensor.tasmota_3_waerme_w_total")) and is_number(states("sensor.tasmota_3_waerme_w_last"))) %}
10
          {% set W = states("sensor.tasmota_3_waerme_w_total")| float %}
11
          {% set L = states("sensor.tasmota_3_waerme_w_last") | float %}
12
          {% if ((W - L) > 400) %} {{ L }}
13
          {% elif ((W - L) < 10) %} {{ L }}
14
          {% else %} {{ W }}
15
          {% endif %} 
16
        {% else %} {{ states("sensor.tasmota_3_waerme_w_total") }}
17
        {% endif %} 
18
19
# Speichern des letzten (hoffentlich guten) Eingangswertes
20
  - sensor:
21
      name: "Tasmota 3 Waerme W last"
22
      unique_id: "tasmota_3_waerme_w_last"
23
      state: >-
24
        {% if is_number(states("sensor.tasmota_3_waerme_w_total_korr")) %}
25
          {{ states("sensor.tasmota_3_waerme_w_total_korr") }}
26
        {% else %} {{ states("sensor.tasmota_3_waerme_w_total") }}
27
        {% endif %}

Ist vielleicht nicht besonders elegant programmiert, aber bei mir 
funktioniert es bisher.
Für feedback bin ich dankbar :-)

von Thorsten N. (thorsten_n)



Lesenswert?

Hallo irgendwie funktioniert es bei mir noch nicht,

Habe deinen Code auf meine Namen geändert, weiß nicht ob ich noch was 
falsch gemacht habe. Aber die Werte von den korrigierten sind gleich dem 
nicht korrigierten Werten.
1
template:
2
  - sensor:
3
      - name: "WärmeMengenZähler"
4
        unique_id: "WMZ"
5
        unit_of_measurement: 'kWh'
6
        device_class: "Gas"
7
        state_class: "total_increasing"
8
        state: >
9
          {{ float(states('sensor.tasmota_wp_wmz_energie_total')) | round(3) }}
10
  - sensor:
11
      name: "WärmeMengenZähler Korr"
12
      unique_id: "WärmeMengenZähler Korr"
13
      icon: mdi:chart-bar
14
      unit_of_measurement: 'kWh'
15
      device_class: "Gas"
16
      state_class: "total_increasing"
17
      state: >-
18
        {% if (is_number(states("sensor.tasmota_wp_wmz_energie_total")) and is_number(states("sensor.tasmota_3_waerme_w_last"))) %}
19
          {% set W = states("sensor.tasmota_wp_wmz_energie_total")| float %}
20
          {% set L = states("sensor.tasmota_3_waerme_w_last") | float %}
21
          {% if ((W - L) > 400) %} {{ L }}
22
          {% elif ((W - L) < 10) %} {{ L }}
23
          {% else %} {{ W }}
24
          {% endif %} 
25
        {% else %} {{ states("sensor.tasmota_wp_wmz_energie_total") }}
26
        {% endif %} 
27
# Speichern des letzten (hoffentlich guten) Eingangswertes
28
  - sensor:
29
      name: "Tasmota 3 Waerme W last"
30
      unique_id: "tasmota_3_waerme_w_last"
31
      state: >-
32
        {% if is_number(states("sensor.tasmota_3_waerme_w_total_korr")) %}
33
          {{ states("sensor.tasmota_3_waerme_w_total_korr") }}
34
        {% else %} {{ states("sensor.tasmota_wp_wmz_energie_total") }}
35
        {% endif %}

: Bearbeitet durch User
von Walter (wavoigt)


Angehängte Dateien:

Lesenswert?

Hi, ich hab das ganze nochmal simuliert, bei mir funktioniert es:
anstatt "sensor.tasmota_wp_wmz_energie_total" hab ich ein Numerisches 
Eingabefeld zum Testen "input_number.nummer".
Der Code:
1
template:
2
3
# Test des Eingangswertes auf Grenzen relativ zum vorigen Wert 
4
# falls der Sprung zu gross ist, wird der vorige Wert übernommen 
5
  - sensor:
6
      name: "Tasmota 3 Waerme W Total korr_test"
7
      unique_id: "tasmota_3_waerme_w_total_korr_test"
8
      device_class: energy
9
      # state_class: "total_increasing"      
10
      icon: mdi:chart-bar
11
      state: >-
12
        {% if (is_number(states("input_number.nummer")) and is_number(states("sensor.tasmota_3_waerme_w_last_test"))) %}
13
          {% set W = states("input_number.nummer")| int %}
14
          {% set L = states("sensor.tasmota_3_waerme_w_last_test") | int %}
15
          {% if ((W - L) > 400) %} {{ L }}
16
          {% elif ((W - L) < 10) %} {{ L }}
17
          {% else %} {{ W }}
18
          {% endif %} 
19
        {% else %} {{ states("input_number.nummer") }}
20
        {% endif %} 
21
22
# Speichern des letzten Eingangswertes
23
  - sensor:
24
      name: "Tasmota 3 Waerme W last_test"
25
      unique_id: "tasmota_3_waerme_w_last_test"
26
      device_class: energy
27
      # state_class: "total_increasing"      
28
      state: >-
29
        {% if is_number(states("sensor.tasmota_3_waerme_w_total_korr_test")) %}
30
          {{ states("sensor.tasmota_3_waerme_w_total_korr_test") }}
31
        {% else %} {{ states("input_number.nummer") }}
32
        {% endif %}

von Walter (wavoigt)


Lesenswert?

Ich hab die Plausibilitätsprüfung jetzt auch im Tasmota script 
realisiert:
(Ausschnitt)
(die Grenze 400 muss eventuell angepasst werden, da Tasmota nach einem 
Reset eventuell 0 liefert und erst nach der nächsten Ablesung den 
richtigen Wert, was zu einem grösseren Sprung führen kann)
1
>D
2
w_new=0
3
w_corr=0
4
w_delta=0
5
p:w_last=0
6
>B
7
;setup sensor
8
->sensor53 r
9
>T
10
w_new=WAERME#w_total
11
12
; Wert auslesen...
13
14
w_delta=w_new-w_last
15
w_corr=w_new
16
; Plausibilitaetstest
17
if w_delta>400 
18
or w_delta<10 
19
then
20
if w_last>10
21
then 
22
w_corr=w_last
23
endif
24
w_delta=0
25
endif
26
w_last=w_corr
27
svars
28
print w_new %0w_new%
29
print w_delta %0w_delta%
30
print w_corr %0w_corr%
31
32
>J  
33
,"w_delta":%w_delta%,"w_corr":%w_corr%

: Bearbeitet durch User
von Thorsten N. (thorsten_n)


Lesenswert?

Oh super das wäre natürlich super wenn ich es direkt im Tasmota Script 
änder könnte. Allerdings vestehe ich noch nicht genau wo ich dies genau 
in meinem Script einfügen muss.

Hier mein Script
1
>D
2
3
;start, define variables
4
5
wkup=1
6
7
period=60
8
9
;read meter every n minutes after midnight (60--> 01:00, 02:00...)
10
11
blk=0
12
13
>B
14
15
;setup sensor
16
17
->sensor53 r
18
19
>S
20
21
if time%period==0 
22
23
and blk==0
24
25
;minutes since midnight divided by period have a remainder of "0"
26
27
then
28
29
=#readmeter
30
31
blk=1
32
33
;set a flag to execute the readout only once every period
34
35
endif
36
37
if time%period-1==0 
38
39
and blk==1
40
41
;one minute after we entered the first loop
42
43
then
44
45
blk=0
46
47
; reset the flag
48
49
endif
50
51
#readmeter
52
53
print wakeup start
54
55
;set serial protocol
56
57
sml(-1 1 "2400:8N1")
58
59
;send 0x55 for 2,2 seconds with 8N1 (73x), 2400 baud (wakeup sequence)
60
61
for wkup 1 73 1
62
63
sml(1 1 "55555555555555555555")
64
65
next
66
67
print wakeup end
68
69
wkup=1
70
71
print wait for the meter
72
73
;wait for the meter to wake up
74
75
delay(350)
76
77
;switch serial protocol
78
79
sml(-1 1 "2400:8E1")
80
81
print request data
82
83
;set string to send to "105B005B16" (request data)
84
85
sml(1 1 "105BFE5916")
86
87
>M 1
88
89
+1,3,rE1,0,2400,WP_WMZ,1
90
91
1,0406uuUUuuUUs@1000,Total energy,MWh,Energie_total,3
92
93
1,0C14bcd8@100,Total volume,m³,Durchfluss_total,2
94
95
1,0B2Dbcd6@10,Current power,KW,Leistung_akt,2
96
97
1,0B3Bbcd6@1000,Current flow,m³/h,Durchfluss_akt,3
98
99
1,0A5Abcd4@10,Flow temp,°C,temp_Vorlauf,1
100
101
1,0A5Ebcd4@10,Return temp,°C,temp_Ruecklauf,1
102
103
1,0B61bcd6@100,Temp diff,°C,temp_diff,2
104
105
1,0227uuUU@1,Meter days,d,Betriebstage,0
106
107
;1,046Dxxuu@1-1,Hour,h,time_h,0
108
109
;1,046Duu@1,Minute,min,time_m,0
110
111
;1,046Dxxxxuu@1,Day,dd,time_d,0
112
113
;1,046Dxxxxxxuu@1,Month,mm,time_m,0
114
115
#

Könntest du mir hier eventuell helfen ?

Beitrag #7573266 wurde vom Autor gelöscht.
von Felix H. (flas)


Lesenswert?

Hallo zusammen,

ich möchte einen Zenner Zelsius C5 Wärmemengenzähler (mit optischer 
Schnitstelle IRDA/ZVEI) auslesen. Ich nutze einen Wifi 
Volkszähler/IR-Lesekopf. Ich habe die Firmware tasmota_V3.bin.gz von 
Nick v. 18.12.22 und das folgende script von carsten vom 23.12.2022.
Ich habe alles mögliche versucht (Lesekopf gedreht, Taste am Zähler 
gedrückt, Lesekopf verschoben). Ich habe nichts selbst kompiliert, 
lediglich die o.g.Firmware und das skript unverändert genutzt. Hier das 
script:
1
>D
2
;start, define variables
3
wkup=1
4
5
6
>B
7
;setup sensor
8
->sensor53 r
9
10
11
>S
12
if upsecs%60==0 {
13
print read meter
14
=#readmeter
15
}
16
#
17
18
#readmeter
19
20
print wakeup start
21
;set serial protocol
22
ret=sml(-1 1 "2400:8N1")
23
24
;send 0x55 for 3 seconds with 8N1 (72x), 2400 baud (wakeup sequence)
25
for wkup 1 72 1
26
sml(1 1 "55555555555555555555")
27
next
28
print wakeup end
29
wkup=1
30
31
print wait for the meter
32
;wait for the meter to wake up
33
delay(350)
34
35
;switch serial protocol
36
sml(-1 1 "2400:8E1")
37
print request data
38
;set string to send to "105BFE5916" (request data)
39
;sml(1 1 "6804046853FE5000A116"
40
sml(1 1 "105BFE5916")
41
42
>M 1
43
+1,3,rE1,0,2400,WAERME,1
44
1,0C06bcd8@1,Total Energy,kWh,w_total,0
45
1,0C13bcd8@1000,Total volume,m³,v_total,2
46
1,0C2Bbcd8@1,Current power,W,p_act,0
47
1,0B3Bbcd6@1000,Current flow,m³/h,F_akt,3
48
1,0A5Abcd4@10,Flow temp,°C,t_flow,1
49
1,0A5Ebcd4@10,Return temp,°C,t_return,1
50
1,0A62bcd4@10,Temp diff,°C,t_diff,2
51
#
Ich bekomme keine Daten. In der console sehe ich folgendes:
13:28:54.152 read meter
13:28:54.153 wakeup start
13:28:57.448 wakeup end
13:28:57.449 wait for the meter
13:28:57.802 request data
13:29:57.046 read meter
13:29:57.047 wakeup start
13:30:00.341 wakeup end
13:30:00.342 wait for the meter
13:30:00.695 request data

Was mache ich falsch? Igendein Tipp?
Danke schonmal.

: Bearbeitet durch User
von Thorsten N. (thorsten_n)


Lesenswert?

Felix H. schrieb:
> Was mache ich falsch? Igendein Tipp?
> Danke schonmal.

Hast du einfach mal einen Tag gewarte ? EWs kann manchmal etwas dauern 
bis Daten gesendet werden.

von Thorsten N. (thorsten_n)


Angehängte Dateien:

Lesenswert?

Walter schrieb:
> Ich hab die Plausibilitätsprüfung jetzt auch im Tasmota script
> realisiert:
> (Ausschnitt)
> (die Grenze 400 muss eventuell angepasst werden, da Tasmota nach einem
> Reset eventuell 0 liefert und erst nach der nächsten Ablesung den
> richtigen Wert, was zu einem grösseren Sprung führen kann)

Habe es doch zum größten Teil hin bekommen und es werden die Werte in 
der Console angezeigt allerdings jede Sekunde ist dies so gewollt ?

Jetzt bekomme ich die Daten nur nicht an HomeAssistent gesendet. Kann es 
sein das hierfür noch  die user_config_override.h verändert werden muss 
? Siehe angehängtes PDF Seite 34

von Walter (wavoigt)


Lesenswert?

Bin grade im Urlaub, melde mich an Wochenende.

von Morris (morris12)


Angehängte Dateien:

Lesenswert?

Hallo zusammen
Aufgrund dieses Beitrages und der zur Verfügung gestellten Infos zum 
Auslesen der optischen m-bus Schnittstelle habe ich mir einen Allmess 
Integral-V UltraLite PRO Wärmemengenzähler (aktuell noch im 
Batteriebetrieb (neue Batterie)) sowie den Lesekopf von Hichi gekauft.

An dieser Stelle, vielen Dank für die ganze Vorarbeit und das Teilen der 
Arbeit.

Ich habe darauf die tasmota_V3.bin.gz Firmware aufgespielt und das 
angehängte Skript aufgespielt und Sensor53 d1 ausgeführt.
Leider erhalte ich kaum eine Ausgabe und hoffe, dass jemand eventuell 
eine Idee hat, woran dies liegen könnte. Die Ausgaben im Anhang habe ich 
sehr unterschiedlich erhalten, ich erkenne da kein Muster.

Für die Unterstützung danke ich im Voraus.
Beste Grüsse
Morris

von Walter (wavoigt)



Lesenswert?

@thorsten_n
Thorsten N. schrieb:
> Habe es doch zum größten Teil hin bekommen und es werden die Werte in
> der Console angezeigt allerdings jede Sekunde ist dies so gewollt ?
>
Im Anhang mein aktuelles Script.
Es handelt sich um das modifizierte "Mitternachtsscript" von Carsten v. 
09.01.2023 (liest nach Mitternacht ab und berechnet Delta zum Vortag =
w_delta)

Als Firmware verwende ich tasmota.bin.gz von Carsten v. 09.01.23
Das Sendeintervall stellst du ein bei Tasmota Main Menu - Configuration 
- Configure Logging - Telemetry Period (in Sekunden)

Ich hab dir noch meine Testdatei angehängt (in C), dann kannst du die 
Korrektur mit einem Online C Compiler Testen.

Beitrag #7576073 wurde vom Autor gelöscht.
von Felix H. (flas)


Lesenswert?

Thorsten N. schrieb:
> Felix H. schrieb:
>> Was mache ich falsch? Igendein Tipp?
>> Danke schonmal.
>
> Hast du einfach mal einen Tag gewarte ? EWs kann manchmal etwas dauern
> bis Daten gesendet werden.

Also ich habe jetzt 2 Tage gewartet. Aber noch keine Rückmeldung vom 
Wärmemengenzaehler. Ich bin ratlos.

von Walter (wavoigt)


Lesenswert?

@morris12
Hast du denn schon die Datenübertragung initialisiert mit sml(1 1 
"6804046853FE5000A116" ?
Die tasmota_V3.bin.gz von Nick hat bei mir auch nicht funktioniert.
siehe:
Beitrag "Re: Wärmezähler über optische M-Bus-Schnittstelle auslesen"
und:
Beitrag "Re: Wärmezähler über optische M-Bus-Schnittstelle auslesen"

: Bearbeitet durch User
von Thorsten N. (thorsten_n)


Angehängte Dateien:

Lesenswert?

Noch einmal eine grunsätzliche Frage, weiß jemand wie der Lesekopf 
optimal platziert werden sollte ?Es gibt ja eine helle und dunkle Diode.

Beim Wärmemengenzähler scheinen die Dioden übereinander zu liegen. Dann 
ist ja eigentlich nur die Frageob das Kabel nach rechts gucken sollte 
oder anders herum.

von Frank (xmp1)


Angehängte Dateien:

Lesenswert?

Beim Echo muss das Kabel bei Verwendung des Hichi nach links zeigen.

von Thorsten N. (thorsten_n)


Lesenswert?

Danke super, und hält der bei euch gut ? Bei mir ist dieser sehr locker, 
scheint nicht sher magnetisch zu sein.

Beim Stromzähler habe ich einen Hichi USB und dieser ist viel fester, 
wird richtig an den Stromzähler heran gezogen und man muss schon feste 
ziehen damit dieser wieder ab geht.

Frage weil ich mir vorstellen kann das ich deshalb immer mal wieder 
merkwürdige Werte ausgelesen bekommen.

von Morris (morris12)


Lesenswert?

@Walter

Danke für die Hinweise, habe ich mittlerweile auch probiert, jedoch 
erhalte ich dann keine Rückmeldung vom Zähler:

11:39:16.940 read meter
11:39:16.941 wakeup start
11:39:20.232 wakeup end
11:39:20.233 wait for the meter
11:39:20.585 request data

Habe dies mit verschiedenen Versionen von Nick und Carsten probiert, 
auch mit und ohne dem delay(100).

Mit der Version von Nick und seinem skript habe ich wenigstens ein paar 
wenige Ausgaben vom Zähler (gemäss meinem letzten Post) erhalten, 
zumindest denke ich, dass dies Ausgaben von Zähler sind. Aber auch bei 
seiner Version/Skript hat sml(1 1 "6804046853FE5000A116" (mit delay(100) 
nicht gewirkt...

Beste Grüsse
Morris

von Walter (wavoigt)


Lesenswert?

Also ich hatte mit der Firmware von Nick zuerst auch einen Einzeiler als 
Antwort:
Beitrag "Re: Wärmezähler über optische M-Bus-Schnittstelle auslesen"
Dann bin ich folgendermassen vorgegangen:
Firmware tasmota.bin.gz von Carsten v. 09.01.23,
Script waermezaehler.txt (889 Bytes) vom 23.12.22
Die Initialisierungssequenz sml(1 1 "6804046853FE5000A116") aktiviert 
und erst mal die den Readoutbefehl sml(1 1 "105BFE5916") auskommentiert
-> Zähler sendet E5 (Ack)
Die Initialisierungssequenz sml(1 1 "6804046853FE5000A116") 
auskommentiert und den Readoutbefehl sml(1 1 "105BFE5916") aktiviert
Danach hat es funktioniert.
Ich hab den Sharky 775, der ist angeblich Baugleich mit deinem UltraLite 
PRO,
vielleicht gibt es da doch Unterschiede ?

von Phill (philip_mario)


Lesenswert?

@Morris

So wie ich die Ausgaben oben interpretiere, fragt das Script jede Minute 
beim Zähler ein Readout an -> sml(1 1 "105BFE5916").
Es kommt auch was zurück.
Vermutung .. Die Antwort vom Zähler ist unvollständig, deswegen kann es 
auch nicht korrekt ausgewertet werden.
Weiter oben war die Rede von schwächelnder Batterie. Auch nicht ganz 
abwägig, die Positionierung des Lesekopfes.

Ich würde meinen, die Sequenz sml(1 1 "6804046853FE5000A116") hat den 
Zähler grundsätzlich initialisiert und kann deswegen auskommentiert 
werden.

.. weitere Erfahrungen ..
Bei meinem Sharky gehe ich ähnlich vor, Readout zyklisch alle 5 min, 
allerdings antwortet der Zähler viel seltener.
Nach einem erfolgreichem Auslesen (Werte plausibel) dauert es eben ca. 
110 Min. bis das nächste mal ein erfolgreicher Readout stattfindet. 
Dazwischen kommt einfach nix.
Hier legt sich wohl die optische Schnittstelle definiert schlafen (ggf. 
wg. Batterieverbrauch).
Das erschwert die Fehlersuche am Anfang. Vielleicht Optokopf 
verschieben, Änderung notieren, dann 3-4 Stunden warten usw. bis
ein plausibler wert kommt ..
Durchhalten!!

von Willy L. (sabberlotte)


Lesenswert?


: Bearbeitet durch User
von Thomas C. (thomas_c31)


Lesenswert?

Hallo,
nun habe ich es auch endlich geschafft meinen Pollucom E/S auszulesen. 
Ich habe dafür folgendes Setup:
- Hichi TTL Lesekopf mit Druckgehäuse und etwas Heisskleber am WMZ 
befestigt
- Rasperry Pi Zero mit aktivierter serieller Schnittstelle und WLAN 
(https://howtoraspberrypi.com/enable-port-serial-raspberry-pi/) an 
GPIO14 und 15
1
enable_uart=1
2
dtoverlay=miniuart-bt
-> /dev/serial0 ( Test mit minicom und weisser Oberfläche ist hilfreich)
- Python-Script 
https://forum-raspberrypi.de/forum/thread/57389-sensus-pollucom-e-ueber-pymeterbus-auslesen/?postID=543096#post543096
- Python Script sendet die Json-Daten dann an meinen MQTT-Server (habe 
ich um diese Funktion erweitert)
- Python-Script läuft alle 55 Minuten per cronJob
- Einbettung in Homeassistant über Sensoren:
1
mqtt:    
2
 sensor:
3
    - unique_id: WMZ_Pollucom_ENERGY_WH
4
      name: "WMZ Pollucom ENERGY_WH"
5
      state_topic: "wmz"
6
      unit_of_measurement: "Wh"
7
      value_template: "{{ value_json.body.records[0].value}}"

: Bearbeitet durch User
von Christoph J. (christoph_j462)


Lesenswert?

Hallo zusammen,

habe hier auch einen Sensus Pollucom E den ich gerne auslesen würde.
Habe schon mehrfach versucht mit dem Script von 
"https://forum-raspberrypi.de/forum/thread/57389-sensus-pollucom-e-ueber-pymeterbus-auslesen/?postID=543096#post543096"; 
diesen auszulesen.
Leider klappt dies nicht.

An der Positionierung kann es nicht liegen, da ich über Minicom 3 meinen 
Zähler einwandfrei auslesen kann.

Ich verwende momentan einen Raspberry Pi3 an diesem UNIProg: 
https://github.com/PricelessToolkit/UNIProg_Programmer

Habe mit eben diesem genauso wie er auch am Raspi hängt mit Minicom 3 an 
meinem Windows Laptop den Zähler auslesen können.

Mir ist nun aufgefallen das es in Minicom 3 einmal den Sensus Pollucom 
E/C gibt und dann auch noch den Sensus Pollucom E/C (Neue Version)

Ich kann bei mir nur die Neue Version auslesen.
Könnte es sein das dieses Skript für die "ältere Version" ist?

Und könnte mir jemand helfen das Skript an die neue Version anzupassen?

von Uwe (mymikro)


Lesenswert?

Toptobias schrieb:
> Hallo zusammen, so nach längerem Probieren habe ich es nun rausgefunden
> um die Daten aus einem Molline Ultramess C3 auszulesen

Hallo Tobias,

ich versuche meinen Molline Ultramess C3 auszulesen. Ich sehe zwar, das 
er manchmal Daten liefert. Alles in allem aber nicht reproduzierbar. 
Könntest du bitte einmal dein Skript für den Zähler komplett posten. 
Welche Firmware verwendest du ? V3 von Nick oder die von Carsten ?

Danke dir,
Uwe

von Toptobias (toptobias)


Lesenswert?

Hallo Uwe

Ich habe den Hichi Wifi Lesekopf von ebay gekauft, und habe keine neue 
Firmware installiert. Mir mir läuft die Tasmota 12.3.1 
(https://github.com/arendst/Tasmota) das script was bei mir läuft ist 
dieses. Es ist nicht perfekt aber ich bekomme ein paar richtige Daten 
aus dem WMZ.


>D
;start, define variables
wkup=1
period=60
;read meter every n minutes after midnight (60 --> 01:00, 02:00...)
blk=0


>B
;setup sensor
->sensor53 r

>S
if time%period==0
and blk==0
;minutes since midnight divided by period have a remainder of "0"
then
=#readmeter
blk=1
;set a flag to execute the readout only once every period
endif

if time%period-1==0
and blk==1
;one minute after we entered the first loop
then
blk=0
; reset the flag
endif


#readmeter

print wakeup start
;set serial protocol
ret=sml(-1 1 "2400:8N1")

;send 0x55 for 3 seconds with 8N1 (72x), 2400 baud (wakeup sequence)
for wkup 1 72 1
sml(1 1 "55555555555555555555")
next
print wakeup end
wkup=1

print wait for the meter
;wait for the meter to wake up
delay(350)

;switch serial protocol
sml(-1 1 "2400:8E1")
print request data
;set string to send to "105BFE5916" (request data)
;sml(1 1 "6804046853FE5000A116"
sml(1 1 "105BFE5916")

>M 1
+1,3,rE1,0,2400,WAERME,1
1,0406uuUUUUUU@1,Total energy,kWh,w_total,0
1,0413bcd8@100,Total volume,m³,v_total,2
1,042BuuUUUU@1,Current power,W,p_act,0
1,043BuuUU@1,Current flow,l/h,F_akt,3
1,025BuuUU@1,Flow temp,°C,t_flow,0
1,025FuuUU@1,Return temp,°C,t_return,0
1,0261uuUU@0.01,Temp diff,°K,t_diff,2

1,142BuuUUUU@1,Maximum power,W,p_max,0
1,143Bbcd6@1000,Maximum flow,l/h,F_max,3

1,01FD17uu@1,Fehlerbyte,,Error_State,0
1,0223uuUU@1,Meter days,d,OpDays,0
1,03FD0Cuu@1,Firmware Version,,FW_Version,0

#


Wasnicht so richtig funktioniert, aber ich denke das liegt an der 
Berechung innerhalb von Tasmota, ist Temp diff und auch Error. Aber naja 
Hauptsache Total energy stimmt.

Gruß
Tobias

von Uwe (mymikro)


Angehängte Dateien:

Lesenswert?

Hallo Thomas,

danke dir für deine Rückmeldung. Ich habe das mal als Startpunkt 
genommen. Etliche Stunden später gelingt es mir nun "manchmal" den 
Wärmezähler auszulesen. Und wenn es klappt werden auch sinnvolle Werte 
angezeigt. Mal abgesehen von der Firmware Version. Die stimmt noch nicht 
mit der überein die im Display des Zählers angezeigt wird. Auf meinem 
Zähler wird die Firmware "1.03 0.14" im Menü 2-09 angezeigt. Um die 
anderen Werte korrekt (In Übereinstimmung mit den im Displaye 
angezeigten Werten) darzustellen habe ich einige der Metrics Decoder 
angepasst. Ich habe lange mit der Hichi (Habe ich auch bei eBay gekauft) 
Firmware 12.3.1 gearbeitet bis die Werte die gelesen und angezeigt 
wurden, wenn sie denn gelesen wurden plausibel waren. Dann habe ich mich 
mal dran gemacht die aktuelle Version der Tasmota Firmware (13.4) für 
den SmartMeter zu bauen um zu versuchen ob ich damit den Zähler 
reproduzierbarer auslesen kann.

Die angehängte Version habe ich jetzt bei mir mit folgendem Script im 
Einsatz:
1
>D
2
;start, define variables
3
wkup=1
4
period=60
5
;read meter every n minutes after midnight (60 --> 01:00, 02:00...)
6
blk=0
7
8
9
>B
10
;setup sensor
11
->sensor53 r
12
13
>S
14
if time%period==0
15
and blk==0
16
;minutes since midnight divided by period have a remainder of "0"
17
then
18
=#readmeter
19
blk=1
20
;set a flag to execute the readout only once every period
21
endif
22
23
if time%period-1==0
24
and blk==1
25
;one minute after we entered the first loop
26
then
27
blk=0
28
; reset the flag
29
endif
30
31
32
#readmeter
33
34
print wakeup start
35
;set serial protocol
36
ret=sml(-1 1 "2400:8N1")
37
print do it
38
;send 0x55 for 3 seconds with 8N1 (72x), 2400 baud (wakeup sequence)
39
for wkup 1 72 1
40
sml(1 1 "55555555555555555555")
41
next
42
print wakeup end
43
wkup=1
44
45
print wait for the meter to wake up
46
delay(350)
47
48
print switch serial protocol
49
sml(-1 1 "2400:8E1")
50
51
print initialize
52
sml(1 1 "1040004016")
53
delay(100)
54
55
print set data frame mode "Standard"
56
sml(1 1 "6804046853FE5000A116")
57
delay(100)
58
59
print request data
60
sml(1 1 "105BFE5916")
61
62
>M 1
63
+1,3,rE1,0,2400,WAERME,1
64
1,0406uuUUuuUUs@1000,Total energy,MWh,w_total,3
65
1,0413bcd8@100,Total volume,m³,v_total,2
66
1,042BuuUUuuUUs@1,Current power,W,p_act,0
67
1,043BuuUUuuUUs@1,Current flow,l/h,F_akt,0
68
1,025BuuUU@1,Flow temp,°C,t_flow,0
69
1,025FuuUU@1,Return temp,°C,t_return,0
70
1,0261uuUU@100,Temp diff,°C,t_diff,2
71
72
1,142BuuUUuuUUs@1000,Maximum power,kW,p_max,3
73
1,143BuuUUuuUUs@1,Maximum flow,l/h,F_max,0
74
75
1,0478uuUUuuUUs@1,Seriennummer,,serialnum,0
76
1,0223uuUU@1,Meter days,d,OpDays,0
77
1,03FD0Cuu@1,Firmware Version,,FW_Version,0
78
#

Ein Datensatz sieht damit bei mir so aus:
1
22:38:00.772 wakeup start
2
22:38:00.774 do it
3
22:38:04.072 wakeup end
4
22:38:04.074 wait for the meter to wake up
5
22:38:04.427 switch serial protocol
6
22:38:04.430 initialize
7
22:38:04.537 set data frame mode "Standard"
8
22:38:04.645 request data
9
22:38:04.974 : 10 40 00 40 16 e5 68 04 04 68 53 fe 50 00 a1 16 e5 10 5b fe 59 16 68 85 85 68 08 00 72 28 55 15 
10
22:38:04.979 : 85 c5 14 00 04 e3 00 00 00 04 78 c8 5e 13 05 04 06 5a 1b 01 00 04 13 d7 d7 28 00 04 2b 00 00 00 
11
22:38:05.023 : 00 14 2b 90 7a 00 00 04 3b 00 00 00 00 14 3b 75 03 00 00 02 5b 2f 00 02 5f 1e 00 02 61 a1 06 02 
12
22:38:05.169 : 23 60 07 04 6d 25 36 05 33 44 06 41 0b 01 00 44 13 cc 88 26 00 42 6c ff 2c 01 fd 17 00 03 fd 0c 
13
22:38:05.316 : 05 00 00 84 20 06 00 00 00 00 c4 20 06 00 00 00 00 84 30 06 00 00 00 00 c4 30 06 00 00 00 00 4a 
14
22:38:05.360 : 16
Die gesendeten Befehle werden mit dem ACK sauber quittiert und dann der 
Datensatz gesendet.

Mein Problem ist aber weiterhin, unabhängig davon ob ich die Tasmota 
12.3.1 verwende oder die 13.4, das ich den Zähler nur sporadisch mal 
auslesen kann. Im Fehlerfall, wenn keine Daten gelesen werden scheint es 
so zu sein das es nicht gelingt den Zähler aufzuwecken. Die CMDs an den 
Zähler gehen raus. Es kommt aber kein ACK.
1
22:40:00.373 wakeup start
2
22:40:00.375 do it
3
22:40:03.672 wakeup end
4
22:40:03.674 wait for the meter to wake up
5
22:40:04.026 switch serial protocol
6
22:40:04.030 initialize
7
22:40:04.138 set data frame mode "Standard"
8
22:40:04.246 request data
9
22:40:04.614 : 10 40 00 40 16 68 04 04 68 53 fe 50 00 a1 16 10 5b fe 59 16

Ich habe es bereits damit versucht delays einzubauen, die WakeUp Sequenz 
länger oder kürzer zu machen und auch mit oder ohne "Initialize" und 
"set data frame mode standard" CMDs.

Wenn jemand noch eine Idee hat was ich bzgl des aufwecken des Zählers 
noch probieren könnte, gerne.

Grüße,
Uwe

: Bearbeitet durch User
von Toptobias (toptobias)


Lesenswert?

Hallo Uwe

Das mit den sporadisch auslesen habe ich auch. Ich habe sogar ein nicht 
Original Netzteil eingebaut, aber dieses hat auch nicht viel gebracht.
Bei werden je nach Lust und Laune des WMZ am Tag 3 bis 7 Messungen 
auslesen.
Hallt aber sehr willkürlich nicht zur selben Zeit.
Wie du im script gesehen hast habe ich den Ausleseintervall auf eine 
Stunde gesetzt. Ich hatte ihn auch mal aller 8 Stunden auslesen lassen. 
Dann hast du 3-mal am Tag eine Ablesung.

Wenn du eine genaue Auslesung des WMZ haben willst kommst du um ein BUS 
Modul nicht drum herum. Da kannst du sofort auf die Daten zugreifen.

Beste grüße
Tobias

von Uwe (mymikro)


Lesenswert?

Hallo Tobias,

dann belasse ich es jetzt mal dabei und schaue mal wie ich bei mir das 
Intervall einstelle damit ich mindestens 1 mal am Tag eine 
Aktualisierung bekomme. Zu oft mag ich auch nicht auslesen damit mir die 
Batterie nicht vorzeitig aussteigt.

Nur der Vollständigkeit halber falls das hier noch jemand liest und auch 
diesen Zähler hat. Bei mir muss das "Total Volumen" auch als Hex 
decodiert werden und nicht als BCD8.

Uwe schrieb:
> 1,0413bcd8@100,Total volume,m³,v_total,2

Muss bei meinem Zähler damit auch ersetzt werden durch
1
1,0413uuUUuuUUs@1000,Total volume,m³,v_total,3
um mit dem auf dem Display angezeigten Wert überein zu stimmen.
Damit sind in meinem Datensatz alle Werte Hex codiert.

Viele Grüße,
Uwe

von Toptobias (toptobias)



Lesenswert?

Hallo Uwe

Vielen Dank für die Konvertierung. Diese habe ich nun auch übernommen, 
und nun stimmen die Werte. Zur Vollständigkeit lade ich dir mal die Docu 
über den M-Bus hoch. Vielleicht hillft es dir weiter.

Beste Grüße
Tobias

von Toptobias (toptobias)


Lesenswert?

Hallo Uwe

Vielleicht hast du ein Tip was das ist:
Mit deiner Kodierung kann ich nun die Werte richtig darstellen.
Nur ein Wert macht mir Probleme und ich weiss nicht warum.
Es geht um 1,143BuuUUuuUUs@1,Maximum flow,l/h,F_max,0
da bekomme ich ein risigen Wert von 3489067833 l/h angezeigt, am WMZ 
lese ich aber 890067,67- m³/h ab.
Hast du eine Idee warum die Kodierung nicht stimmen kann?

Vielen Dank
Tobias

von Uwe (mymikro)


Lesenswert?

Hallo Tobias,

danke zunächst mal für die Protokollbeschreibung. Und dann.....

Hut ab vor deinem Wärmezähler. Der Zeigt ernsthaft 890067,67- m³/h für 
das Register 4-02-1 als maximalen Durchfluss an ? Der mittlere 
Wasserbedarf der Stadt München sind 300-350.000 m³ pro Tag. Über den 
Daumen also 12.500 m³/h. Da hoffe ich mal, du musstest die Wärme nicht 
zahlen die das Wasser transportiert hat das dein WMZ als Durchfluss im 
Peak denkt gemessen zu haben scheint.

Aber nun mal zu den 3489067833 l/h die Tasmota anzeigt. Das wäre in Hex 
0xCFF6F339 bzw. im Byte Strom 0x39 0xF3 0xF6 0xCF. Gemäß 
Protokollbeschreibung ist der Wert wie die meisten anderen die der 
Zähler liefert vorzeichenbehaftet. Der Dekoder ist aber aktuell auf 
unsigned eingestellt. Als signed wird aus dem Hex Wert im 2er Komplement 
eine -805899463. Entsprechend -805899,463 m³/h. Der Wert ist schon mal 
näher dran an dem im Display. Und der hat ja an der dritten 
Nachkommastelle auch ein Minus :-)

Ich würde mir noch ansehen ob die Daten korrekt empfangen werden und 
wenn ja, dann is es so das der Zähler den Wert ausgibt. Dafür brauchst 
du von der Konsole mal einen kompletten Datentransfer. Nur für die Doku. 
Aktivieren mit "sensor53 d1" warten bis ein kompletter Datensatz 
empfangen wurde und dann mit "sensor53 d0" wieder abstellen.

Bei mir wäre das:
1
22:38:04.645 request data
2
22:38:04.974:10 40 00 40 16 e5 68 04 04 68 53 fe 50 00 a1 16 e5 10 5b fe 59 16 68 85 85 68 08 00 72 28 55 15 
3
22:38:04.979:85 c5 14 00 04 e3 00 00 00 04 78 c8 5e 13 05 04 06 5a 1b 01 00 04 13 d7 d7 28 00 04 2b 00 00 00 
4
22:38:05.023:00 14 2b 90 7a 00 00 04 3b 00 00 00 00 14 3b 75 03 00 00 02 5b 2f 00 02 5f 1e 00 02 61 a1 06 02 
5
22:38:05.169:23 60 07 04 6d 25 36 05 33 44 06 41 0b 01 00 44 13 cc 88 26 00 42 6c ff 2c 01 fd 17 00 03 fd 0c 
6
22:38:05.316:05 00 00 84 20 06 00 00 00 00 c4 20 06 00 00 00 00 84 30 06 00 00 00 00 c4 30 06 00 00 00 00 4a 
7
22:38:05.360:16

Da suchst du in der ersten Zeile mal nach dem 68xxxx68. Die beiden xx 
Bytes zwischen der 68 geben die Länge des Datenblocks an. Bei mir 0x85 
== 133 Bytes. Los geht es mit dem ersten Byte nach dem 68xxxx68 Header. 
Bei mir die 0x08. Nicht Bestandteil des Datenblocks ist der CRC (Bei mir 
im Beispiel 0x4a) und das Stoppbyte 0x16.

Also:
1
08 00 72 28 55 15 
2
85 c5 14 00 04 e3 00 00 00 04 78 c8 5e 13 05 04 06 5a 1b 01 00 04 13 d7 d7 28 00 04 2b 00 00 00 
3
00 14 2b 90 7a 00 00 04 3b 00 00 00 00 14 3b 75 03 00 00 02 5b 2f 00 02 5f 1e 00 02 61 a1 06 02 
4
23 60 07 04 6d 25 36 05 33 44 06 41 0b 01 00 44 13 cc 88 26 00 42 6c ff 2c 01 fd 17 00 03 fd 0c 
5
05 00 00 84 20 06 00 00 00 00 c4 20 06 00 00 00 00 84 30 06 00 00 00 00 c4 30 06 00 00 00 00

Die Checksumme gemäß Protokollbeschreibung ist das niederwertige Byte 
der Summe aller einzelnen Bytes. Du kannst diesen Datenblock in eines 
der Online Checksum tools kippen. Ich habe verwendet:
https://www.scadacore.com/tools/programming-calculators/online-checksum-calculator/
Die benötigte Checksum ist die "CheckSum8 Modulo 256". Bei mir wird 
korrekt die 0x4a berechnet und damit ist mein Datenblock schon mal 
fehlerfrei empfangen worden.

Dann suchst du dir das entsprechende Datenpacket für den "Durchfluss 
(Höchstwert)". Also 0x14 0x3b gefolgt von 4 Byte Nutzdaten. Bei mit die 
0x75 0x03 0x00 0x00. In die richtige Reihenfolge gebracht 0x00000375 was 
den 885 l/h entspricht die bei mir angezeigt werden. Wobei du bei dieser 
Online Seite:
https://www.rapidtables.com/convert/number/hex-to-decimal.html
dir sowohl das Ergebnis ohne Vorzeichen als auch das 2er Komplement 
entsprechend mit Vorzeichen anzeigen lassen kannst.

Entsprechend der Protokollbeschreibung habe ich bei mir das Decode 
vorzeichenrichtige Werte umgeschrieben. Ändert zwar bei mir nix da ich 
nur positive habe. Aber die Minus Zahl bei dir wäre mal ein Test.
1
1,0406ssSSssSSs@1000,Wärmenergie gesamt,MWh,W_total,3
2
1,0413ssSSssSSs@1000,Volumen gesamt,m³,V_total,3
3
1,042BssSSssSSs@1000,Strom aktuell,kW,P_curr,3
4
1,043BssSSssSSs@1,Durchfluss aktuell,l/h,F_curr,0
5
1,025BssSS@1,Temperatur Vorlauf,°C,T_flow,0
6
1,025FssSS@1,Temperatur Rücklauf,°C,T_return,0
7
1,0261ssSS@100,Temperatur Differenz,°C,T_diff,2
8
9
1,142BssSSssSSs@1000,Strom Maximum,kW,P_max,3
10
1,143BssSSssSSs@1,Durchfluss Maximum,l/h,F_max,0
11
12
1,4406ssSSssSSs@1000,Wärmenergie Stichtag,MWh,W_total,3
13
1,4413ssSSssSSs@1000,Volumen Stichtag,m³,V_total,3
14
1,426CuuUU@1,Stichtag,Coded,Time_EOP,0
15
16
1,0478uuUUuuUUs@1,Seriennummer,,SN,0
17
1,0223uuUU@1,Tage in Betrieb,d,Op_Days,0
18
1,01FD17uu@1,Fehlercode,Coded,Err_Code,0 
19
1,03FD0CuuUUuus@1,FW Version,,FW_Version,0
20
1,046DuuUUuuUUs@1,Datum und Zeit,Coded,Time_curr,0
Aber Achtung, ich habe bei mir auch die Variablen umbenannt falls du die 
nutzt.

Die als "Coded" ausgegebenen Werte habe ich überprüft aber noch nicht 
dekodiert. Prinzipiell stimmen sie aber.

Grüße,
Uwe

von Toptobias (toptobias)


Angehängte Dateien:

Lesenswert?

Hallo Uwe

Du bist Klasse, nun stimmen bei mir die Werte im Tasmota mit denen im 
WMZ überein. Vielen vielen Dank dafür.

Ja mit dem negativen Wert beim Durchfluss Maximum verstehe ich auch 
nicht so richtig, da war wohl der Zähler sich sehr verzählt oder er hat 
einfach gesponnen. Interessant ist aber das ich nun negative Werte 
anzeigen lassen kann. Ich habe dieses bei mir im Sommer bei der 
Temperatur Differenz.
Da ist der Rückfluss des Wassers wärmer als der Zufluss. Da hatte ich 
immer eine kuriose Anzeige in Tasmota.

Ich will demnächst noch mal genau verstehen wie man auf diese Werte 
kommt. Dank deiner super Anleitung werde ich mich da mal reinlesen und 
testen.

Beste Grüße
Tobias

von Kirill K. (kirill45)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,


ich versuche nun seit Tagen meinem Wärmezähler die daten mittels python 
Skript zu entlocken, leider bisher ohne erfolg.

wmz-skript.py

Es handelt sich um die Pollucom E (neuere version).

Ich verwende den Hichi Lesekopf mit einem ftdi Adapter, das auslesen mit 
der MiniCom3 Software klappt bei beiden Zähler problemlos, daher kann 
ich die Batterie, Serielle kommunikation, Lesekopf positionierung etc. 
ausschließen.

Ich bekomme nach dem senden des SND_NKE befehl, einfach kein E5 zurück.


Hier ein Mittschnitt der seriellen Kommunikation, zuerst mit der 
MiniCom3

minicom3.txt

darauf plaudert der zähler los.


Hier das von dem python Skript.

python_skript.txt



Hatte vielleicht jemand ähnliche Problemme, ich weiß einfach nich in 
welche richtung ich graben soll.

von Thomas C. (thomas_c31)


Lesenswert?

Probier doch erstmal mal, mit minicom oder einem anderen Terminal 
Programm an Port Com8? dich zu verbinden. Wenn da etwas kommt, ist 
vielleicht das Programm nicht ganz richtig.

von Kirill K. (kirill45)


Lesenswert?

Problem gelöst!

ser.dsrDtr = True

musste ersetzt werden durch

ser.setDTR(True)

von Toptobias (toptobias)


Lesenswert?

Hallo Uwe

Ich wollte mal nachfragen ob du rausbekommen hast wie man das Datum im 
Tasmota richtig codiert und eine Anzeige außer als "0" rausbringt.
Habe zwar auch ein wenig gespielt, aber es hat nicht funktioniert.

Gruß
Tobias

von Uwe (mymikro)


Angehängte Dateien:

Lesenswert?

Hallo Tobias,

ja. Dekodieren der Zeiten habe ich eingebaut. Wird im Tasmota Web 
Interface angezeigt. Jeweils auf einer eigenen Zeile am Ende der 
Readings.


Was ich noch nicht gelöst habe ist (i) die Zeiten Inline zu dekodieren 
und anzuzeigen. Also nicht auf einer eigenen Zeile sondern an der stelle 
an der die Kodierte Zahl steht. (ii) die beiden dekodierten Zeiten 
anstelle der kodierten im MQTT record zu übertragen.

Das hier ist mein aktueller Stand.
1
>D
2
;start, define variables
3
wkup=1
4
period=180
5
;read meter every n minutes after midnight (60 --> 01:00, 02:00...)
6
blk=0
7
myDate_EOP=0
8
sDate_EOP="yyyy-mm-dd"
9
myDate_Read=0
10
sDate_Read="yyyy-mm-ddThh:mm"
11
12
>B
13
;setup sensor
14
->sensor53 r
15
16
>T
17
myDate_EOP=MoUlC3#Date_EOP
18
myDate_Read=MoUlC3#Date_Read
19
20
>S
21
if time%period==0
22
and blk==0
23
;minutes since midnight divided by period have a remainder of "0"
24
then
25
=#readmeter
26
blk=1
27
;set a flag to execute the readout only once every period
28
endif
29
30
if time%period-1==0
31
and blk==1
32
;one minute after we entered the first loop
33
then
34
blk=0
35
; reset the flag
36
sDate_EOP=s(4.0(2000+((myDate_EOP>>9&0x0078)|(myDate_EOP>>5&0x0007))))+"-"+s(2.0(myDate_EOP>>8&0x000f))+"-"+s(2.0(myDate_EOP&0x001f))
37
print Abrechnungsdatum %sDate_EOP%
38
sDate_Read=s(4.0(2000+((myDate_Read>>25&0x78)|(myDate_Read>>21&0x07))))+"-"+s(2.0(myDate_Read>>24&0x0f))+"-"+s(2.0(myDate_Read>>16&0x1f))+"T"+s(2.0(myDate_Read>>8&0x1f))+":"+s(2.0(myDate_Read&0x3f))
39
print Datensatz %0myDate_Read% vom %sDate_Read%
40
; convert coded dates
41
endif
42
43
#readmeter
44
45
print wakeup start
46
;set serial protocol
47
ret=sml(-1 1 "2400:8N1")
48
print do it
49
;send 0x55 for 504 times with 8N1, 2400 baud (wakeup sequence)
50
for wkup 1 50 1
51
sml(1 1 "55555555555555555555")
52
next
53
sml(1 1 "55555555")
54
print wakeup end
55
wkup=1
56
57
print wait for the meter to wake up
58
delay(350)
59
60
print switch serial protocol
61
sml(-1 1 "2400:8E1")
62
63
print initialize
64
sml(1 1 "1040004016")
65
delay(100)
66
67
print set data frame mode "Standard"
68
sml(1 1 "6804046853FE5000A116")
69
delay(100)
70
71
print request data
72
sml(1 1 "105BFE5916")
73
74
>W
75
Datensatz vom:       {m} %sDate_Read%
76
Abrechnungsdatum:    {m} %sDate_EOP%
77
78
>M 1
79
+1,3,rE1,0,2400,MoUlC3,1
80
1,0406ssSSssSSs@1000,Wärmenergie gesamt,MWh,W_total,3
81
1,0413ssSSssSSs@1000,Volumen gesamt,m³,V_total,3
82
1,042BssSSssSSs@1000,Strom aktuell,kW,P_curr,3
83
1,043BssSSssSSs@1000,Durchfluss aktuell,m³/h,F_curr,3
84
1,025BssSS@1,Temperatur Vorlauf,°C,T_flow,0
85
1,025FssSS@1,Temperatur Rücklauf,°C,T_return,0
86
1,0261ssSS@100,Temperatur Differenz,K,T_diff,2
87
88
1,142BssSSssSSs@1000,Strom Maximum,kW,P_max,3
89
1,143BssSSssSSs@1000,Durchfluss Maximum,m³/h,F_max,3
90
91
1,426CuuUU@1,Abrechnungsdatum,Coded,Date_EOP,0
92
1,4406ssSSssSSs@1000,Wärmenergie,MWh,W_due,3
93
1,4413ssSSssSSs@1000,Volumen,m³,V_due,3
94
95
1,0478uuUUuuUUs@1,Seriennummer,,SN,0
96
1,0223uuUU@1,Tage in Betrieb,d,Op_Days,0
97
1,01FD17uu@1,Fehlercode,Coded,Err_Code,0 
98
1,03FD0CuuUU@1,Gerätetyp,,Dev_Version,0
99
1,046DuuUUuuUUs@1,Date and Time,Coded,Date_Read,0
100
#

Grüße,
Uwe

von Toptobias (toptobias)


Angehängte Dateien:

Lesenswert?

Hallo Uwe

Vielen Dank für das Skript, ich habe das bei mir auch mal probiert.
Daten sehen nun viel besser aus. :-)
Gibt es noch eine besondere Einstellung wegen der letzten beiden Zeilen 
mit der Umwandlung des Datums? Bei mir werden diese trotz des Skriptes 
nicht angezeigt.
Also wie ich dich verstanden habe werden die letzten beiden Zeilen also 
nicht via MQTT übertragen.
Ist es möglich im Homeassistant das codierte Datum dort umzuwandeln?


Beste Grüße
Tobias

von Uwe (mymikro)


Lesenswert?

Hallo Tobias,

hast du diesen Block übernommen ?
1
>W
2
Datensatz vom:       {m} %sDate_Read%
3
Abrechnungsdatum:    {m} %sDate_EOP%

Wenn dann im WebGui die Zeilen nicht angezeigt werden ist deine Firmware 
nicht mit:
1
USE_SCRIPT_WEB_DISPLAY
Ich hatte hier Beitrag "Re: Wärmezähler über optische M-Bus-Schnittstelle auslesen" die 
config mit der ich meine Firmware übersetzt habe und auch das binary 
angehängt. Die Beschreibung der verwendeten defines findest du hier: 
https://tasmota.github.io/docs/Scripting-Language/


In HomeAssistant kannst du die Konvertierung auch machen. Ich bin nur 
noch nicht dazu gekommen. Wenn ich es habe, poste ich es.

Grüße,
Uwe

von Ralf (rl_rl)


Angehängte Dateien:

Lesenswert?

Hallo zusammen.
Dieser Thread war für mich mehrmals sehr aufschlussreich.
Meine ersten Erfahrungen mit Optolesern lagen schon 14 Jahre zurück,
da musste man die noch selber bauen und viel ausprobieren.

Mein WMZ : Itron allmess UltraMaXX
Es gab jetzt für einen meiner Wärmemengenzähler diverse Hürden zu 
nehmen.

Magnet hält hier nicht, also hab ich mir was selbst gedruckt.

Es gab aber keine Daten, nicht mit Tasmota, nicht mit Python, nicht mit 
LorusFree, nicht mit M-tool
oder anderen Experimenten mit mehreren Optoplatinen.

Irgendwann war ich genervt und besann mich auf diesen
Beitrag "Re: Wärmezähler über optische M-Bus-Schnittstelle auslesen"


Dank an Willy L. (sabberlotte) vom 14.02.2023 17:36

Alle Platinen die ich habe (5 Varianten,einschließlich Tasmota-Lesekopf) 
basieren auf dem
Beispiel:

https://wiki.volkszaehler.org/hardware/controllers/ir-schreib-lesekopf-ttl-ausgang

Hier gibts im Empfangszweig den Widerstand R1 13k.
Den habe ich letztendlich auf 68k geändert.
Und siehe da, es ging sofort.

Am Sendezweig hab ich nichts geändert, das führt aber eventuell zum 
Übersprechen.
Der Empfänger liest dann die Daten die man selbst ausgibt.
Dieser Effekt liegt auch am Gehäuse, was natürlich beim experimentieren 
oft fehlt.
Ich verhinderte das Übersprechen erfolgreich mit schwarzen
Schrumpfschlauchstummeln um Sender und Empfänger.
Weiße Gehäuse (Selbstdruck) sind diesbezüglich schlechter als schwarze 
Gehäuse.
Ein trennender Steg zwischen Sender und Empfänger ist hilfreich.

Weitere Erkenntnisse:

Der WMZ liefert seine Daten nach jeder Anforderung ab,
er stellt die Mitarbeit also nicht ein,
wie irgendwo weiter oben vermutet wurde.

Die Positionierung muss natürlich stimmen bezüglich der Ausrichtung 
Sender/Empfänger,
ist aber ansonsten ziemlich unkritisch.

Wenn man eine TTL-Optoplatine an eine 8266-Platine anschliesst, wird 
diese dort mit 3,3V betrieben, möglicherweise noch abzüglich einer 
Schutzdiode.
Aus einem FTDI-USB-Kabel (TTL-232R-3V3) kommen zwar 3,3V Signalleitungen 
aber die Versorgung liefert 5V!
Abweichende Ergebnisse sind so absehbar :-)
Die genannten 68k funktionieren bei mir mit beiden Konstellationen.

Mein Zähler liefert einen ein Byte Zähler,
der im Tasmota-Script im >M Bereich

1,92261704uu@1,cnt, ,readcnt,0

ausgewertet werden kann, so hat man schnell ein Überblick ob das 
Auslesen
so abläuft wie zeitlich gewünscht, bei meinen Experimenten alle zehn 
Sekunden.

Mein LorusFree sendet gar keine Aufwecksequenz,
was mit einer Kamera mit Blick auf die Sendediode sofort auffällt.

M-tool lässt sich vom Übersprechen gelegentlich verwirren,
hat mir aber ansonsten geholfen.

Nach dem alles lief war auch der Zweifel weg,
ob die selbstkompilierte Version von Tasmota alles Nötige beinhaltete.

: Bearbeitet durch User
von Toptobias (toptobias)


Lesenswert?

Hallo Uwe

Ja, ich dachte es mir das es an der Firmware liegt, ich habe aktuell 
nicht die neuste installiert. Aber irgendwie traue ich mich nicht deine 
Firmware aufzuspielen, da ich ja den Tasmota erst mal mit eine mini 
Firmware bespielen muss und dann mit deiner hinterher.
Kann da was schiefgehen?

Gruß
Tobias

von Uwe (mymikro)


Lesenswert?

Hallo Tobias,

ich kann nur sagen das bei mir der Update der Firmware bisher immer ohne 
Probleme funktioniert hat. Ich lade auch erst die minimal Version und 
dann die neue. Da die Programmierung incl. Wifi erhalten bleibt ist das 
ganze in 2-3 Minuten erledigt. Und für den Notfall habe ich einen 
Programmieradapter in der Schublade.

Grüße,
Uwe

von Jo G. (lcnjo)


Lesenswert?

Hallo Zusammen,
spannender Tread. Hat jemand das von euch ggf. schon mal mit node Red 
probiert umzusetzten?
Also in Node red gibt es diverse Serielle Nodes für z.B. Stromzähler. 
Auch einige die Mbus sprechen. Aber leider habe ich bisher keine Node 
gefunden, welche die Parität wechselt und die 0x55 sendet.

Wer hat da einen Tip? Danke!

Gruß
Jo

: Bearbeitet durch User
von Toptobias (toptobias)


Lesenswert?

Hallo Uwe

Ich bins nochmal, ich habe gestern die Firmware
tasmota_13.4_V1.bin.gz auf den Kopf hochgeladen, dieses hat auch 
funktioniert, ich konnte ihn wieder erreichen per WLAN.
Doch was nicht mehr geht ist die Auslesung.
Habe nun 18 Stunden gewartet aber er zeigt nur noch 0 Werte an.
Nun meine Frage muß ich was mit der "user_config_override.h" irgendwas 
machen?

Vielen Dank
Tobias

von Toptobias (toptobias)


Lesenswert?

Toptobias schrieb:
> Hallo Uwe
>
> Ich bins nochmal, ich habe gestern die Firmware
> tasmota_13.4_V1.bin.gz auf den Kopf hochgeladen, dieses hat auch
> funktioniert, ich konnte ihn wieder erreichen per WLAN.
> Doch was nicht mehr geht ist die Auslesung.
> Habe nun 18 Stunden gewartet aber er zeigt nur noch 0 Werte an.
> Nun meine Frage muß ich was mit der "user_config_override.h" irgendwas
> machen?
>
> Vielen Dank
> Tobias

Sorry geht wieder, Der Kopf hat sich um 3 mm verdreht.

von Uwe (mymikro)


Lesenswert?

Hallo Tobias,

schön das die Lösung so einfach war. Die Datei "user_config_override.h" 
benötigst du auch nur wenn du dir das Binary selbst compilierst.

Ich habe mir gestern mal das Thema dekodieren des ausgelesenen Datums 
angesehen. Du kannst dazu mal folgenden Code in Homeassistant in den 
Template Editor eingeben:
1
{% set dt = int(states('sensor.warmezahler_moulc3_date_read')) %}
2
{% set DatasetDate= as_datetime(
3
               (2000 + int(dt/2**25) | bitwise_and(0x78) | bitwise_or(int(dt/2**21) | bitwise_and(0x07)))~"-"~
4
               (int(dt/2**24) | bitwise_and(0x0f))~"-"~
5
               (int(dt/2**16) | bitwise_and(0x1f))~"T"~
6
               (int(dt/2**8) | bitwise_and(0x1f))~":"~
7
               (int(dt/2**0) | bitwise_and(0x3f))
8
               ) %}
9
{{ DatasetDate }}
10
11
{% set dt = int(states('sensor.warmezahler_moulc3_date_eop')) %}
12
{% set SettlementDate= as_datetime(
13
               (2000 + int(dt/2**9) | bitwise_and(0x78) | bitwise_or(int(dt/2**5) | bitwise_and(0x07)))~"-"~
14
               (int(dt/2**8) | bitwise_and(0x0f))~"-"~
15
               (int(dt/2**0) | bitwise_and(0x1f))
16
               ) %}
17
{{ SettlementDate }}


Und dir auf dieser Basis jeweils einen Template Sensor anlegen. Den 
Namen des jeweiligen Sensors musst du durch deinen ersetzen.

Nach allem was ich bisher gefunden/gelesen habe scheint es aber keine 
Möglichkeit zu geben das Datum selbst als Zeitstempel zu verwenden mit 
dem Homeassistant die Readings in die Datenbank schreibt. Da wird wohl 
immer der Zeitstempel verwendet an dem HA die Sensor Daten empfängt.

Wenn dazu jemand eine Lösung hat, sehr gerne-

Grüße,
Uwe

von Jonas (jonas_g644)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe einige Zeit mitgelesen und auch für meinen WMZ das Skript 
angepasst zum Auslesen. Ich habe einen VoluMess VI Komfort, das scheint 
ein gebrand-labelter Engelmann zu sein der auch ein wenig andere 
Register hat. Es ist noch nicht perfekt, möchte es aber dennoch mal hier 
anhängen für die welchen es so genügt.

Mein Problem ist aber ein anderes, nämlich dass die Auslesung sehr 
unzuverlässig ist. Im Debuglog sieht man, dass oftmals anfängliche Teile 
des Telegrams fehlen und daher die dekodierung in ca 40% der Fälle nicht 
funktioniert.

Ein mitternächtliches Auslesen funktioniert daher für mich nicht, wenn 
ich zuverlässig 1x am Tag werte haben möchte. Aktuell habe ich das so 
umgangen, dass ich um 0, 1, 2 und 3 Uhr auslese. Meistens ist dann ein 
erfolgreicher Auslesevorgang dabei.

Ist es möglich anstelle dieser festen stündlichen Auslesezeitpunkte in 
der >S Sektion, dass Auslesen auf Befehl, z.B. per MQTT anzustoßen? Dann 
würde ich es in einer Home Assistant Automatisierung so oft anstoßen, 
bis es einmal geklappt hat.

Viele Grüße,
Jonas

von Ralf (rl_rl)


Lesenswert?

Hallo,

[[https://github.com/arendst/Tasmota/discussions/20029]]

hier ist etwas ähnliches beschrieben.

rl

von Uwe (mymikro)


Angehängte Dateien:

Lesenswert?

Hallo Tobias,

ich hab das gerade bei mir ins HomeAssistant eingebaut. Hier die beiden 
Templates.
1
- sensor:
2
  - name: Wärmezähler MoUlC3 Auslesedatum
3
    unique_id: "HeatMeterDatasetReadDate"
4
    state: >- 
5
      {% set dt = int(states('sensor.warmezahler_moulc3_date_read')) %}
6
      {% set DatasetDate= (
7
        (2000 + int(dt/2**25) | bitwise_and(0x78) | bitwise_or(int(dt/2**21) | bitwise_and(0x07)))~"-"~
8
        (int(dt/2**24) | bitwise_and(0x0f))~"-"~
9
        (int(dt/2**16) | bitwise_and(0x1f))~"T"~
10
        (int(dt/2**8) | bitwise_and(0x1f))~":"~
11
        (int(dt/2**0) | bitwise_and(0x3f))
12
        ) | as_timestamp | int %}
13
      {{ DatasetDate | timestamp_custom("%d.%m.%Y %H:%M") }}
14
      
15
- sensor:
16
  - name: Wärmezähler MoUlC3 Abrechnungsdatum
17
    unique_id: "HeatMeterSettlementDate"
18
    state: >- 
19
      {% set dt = int(states('sensor.warmezahler_moulc3_date_eop')) %}
20
      {% set SettlementDate= (
21
        (2000 + int(dt/2**9) | bitwise_and(0x78) | bitwise_or(int(dt/2**5) | bitwise_and(0x07)))~"-"~
22
        (int(dt/2**8) | bitwise_and(0x0f))~"-"~
23
        (int(dt/2**0) | bitwise_and(0x1f))
24
        ) | as_timestamp | int %}
25
      {{ SettlementDate | timestamp_custom("%d.%m.%Y") }}

Und die aktuelle Version meines Tasmota Templates.
1
>D 30
2
;start, define variables
3
wkup=1
4
period=180
5
;read meter every n minutes after midnight
6
blk=0
7
myDate_EOP=0
8
sDate_EOP="yyyy-mm-dd"
9
myDate_Read=0
10
myTime_Read=0
11
sDate_Read="yyyy-mm-ddThh:mm"
12
13
>B
14
;setup sensor
15
->sensor53 r
16
17
>T
18
myDate_EOP=MoUlC3#Date_EOP
19
myDate_Read=MoUlC3#Date_Read
20
myTime_Read=MoUlC3#Time_Read
21
22
>S
23
if time%period==0
24
and blk==0
25
;minutes since midnight divided by period have a remainder of "0"
26
then
27
=#readmeter
28
blk=1
29
;set a flag to execute the readout only once every period
30
endif
31
32
if time%period-1==0
33
and blk==1
34
;one minute after we entered the first loop
35
then
36
blk=0
37
; reset the flag
38
sDate_EOP=s(4.0(2000+((myDate_EOP>>9&0x0078)|(myDate_EOP>>5&0x0007))))+"-"+s(2.0(myDate_EOP>>8&0x000f))+"-"+s(2.0(myDate_EOP&0x001f))
39
print Abrechnungsdatum %sDate_EOP%
40
sDate_Read=s(4.0(2000+((myDate_Read>>25&0x78)|(myDate_Read>>21&0x07))))+"-"+s(2.0(myDate_Read>>24&0x0f))+"-"+s(2.0(myDate_Read>>16&0x1f))+"T"+s(2.0(myTime_Read>>8&0x1f))+":"+s(2.0(myTime_Read&0x3f))
41
print Datensatz vom %sDate_Read%
42
; convert coded dates
43
endif
44
45
#readmeter
46
47
print wakeup start
48
;set serial protocol
49
ret=sml(-1 1 "2400:8N1")
50
print do it
51
;send 0x55 for 504 times with 8N1, 2400 baud (wakeup sequence)
52
for wkup 1 50 1
53
sml(1 1 "55555555555555555555")
54
next
55
sml(1 1 "55555555")
56
print wakeup end
57
wkup=1
58
59
print wait for the meter to wake up
60
delay(350)
61
62
print switch serial protocol
63
sml(-1 1 "2400:8E1")
64
65
print initialize
66
sml(1 1 "1040004016")
67
delay(100)
68
69
print set data frame mode "Standard"
70
sml(1 1 "6804046853FE5000A116")
71
delay(100)
72
73
print request data
74
sml(1 1 "105BFE5916")
75
76
>W
77
Datensatz vom:       {m} %sDate_Read%
78
Abrechnungsdatum:    {m} %sDate_EOP%
79
80
>J
81
;,"sDate_EOP":"%sDate_EOP%"
82
;,"sDate_Read":"%sDate_Read%"
83
84
>M 1
85
+1,3,rE1,0,2400,MoUlC3,1
86
1,=so3,165
87
1,0406ssSSssSSs@1000,Wärmenergie gesamt,MWh,W_total,3
88
1,0413ssSSssSSs@1000,Volumen gesamt,m³,V_total,3
89
1,042BssSSssSSs@1000,Strom aktuell,kW,P_curr,3
90
1,043BssSSssSSs@1000,Durchfluss aktuell,m³/h,F_curr,3
91
1,025BssSS@1,Temperatur Vorlauf,°C,T_flow,0
92
1,025FssSS@1,Temperatur Rücklauf,°C,T_return,0
93
1,0261ssSS@100,Temperatur Differenz,K,T_diff,2
94
1,142BssSSssSSs@1000,Strom Maximum,kW,P_max,3
95
1,143BssSSssSSs@1000,Durchfluss Maximum,m³/h,F_max,3
96
1,426CuuUU@1,*,Coded,Date_EOP,0
97
1,4406ssSSssSSs@1000,Abger. Wärmenergie,MWh,W_due,3
98
1,4413ssSSssSSs@1000,Abger. Volumen,m³,V_due,3
99
1,0478uuUUuuUUs@1,Seriennummer,,SN,0
100
1,0223uuUU@1,Tage in Betrieb,d,Op_Days,0
101
1,01FD17uu@1,Fehlercode,Coded,Err_Code,0
102
1,03FD0CuuUU@1,Gerätetyp,,Dev_Version,0
103
1,046DuuUUuuUUs@1,*,Coded,Date_Read,0
104
1,046DuuUU@1,*,Coded,Time_Read,0
105
#

(i) Ich zeige im Web jetzt nur noch das dekodierte Datum an. (Label im 
Dekoder auf "*" setzen.) (ii) Variablen in Tasmota sind "float". Bei 
großen Zahlen wie der Zeit als unsigned double geht das aber zu lasten 
der Minuten. Will sagen bei der Berechnung des Datum Strings habe ich 
mich am Anfang darüber gewundert warum wenn ich alle paar Minuten 
auslese die Minuten immer als "00" angezeigt werden. Das habe ich gelöst 
indem ich mit der letzten Decoder Zeile die Minuten noch mal als 
unsigned word lese und damit rechne. (iii) Die Puffergröße setze ich 
jetzt über die zweite Decoder Zeile.

Viele Grüße,
Uwe

von Toptobias (toptobias)


Angehängte Dateien:

Lesenswert?

Hallo Uwe

Vielen Dank für die Infos und die konfiguration.
Ich konnte diese in meiner Konfiguration anpassen, nun sehe ich die 
Daten, werde nun sehen wie lange die Aktualisierung benötigt.

Ja bei dem WMZ ist das leider echt ein Problem mit dem periodischen 
Auslesen bei einem Infrarot Kopf. Da gibt es wohl wirklich noch keine 
gute Lösung. Bei mir wird etwa 5 mal am Tag ausgelesen, obwohl dieser 
jede Stunde versucht.

Ich bin nun auf diese Seite gestoßen 
(https://github.com/Zeppelin500/MBusino), da wird der WMZ mittels MBUS 
ausgelsen, ja leider wird wieder neue Hardware benötigt, aber naja was 
zum Basteln.
Da Konzept ist ganz gut, da wird der WMZ via Modbus ausgelesen und via 
WIFI an Homeassistant per MQTT die Daten übermittelt.
Mal sehen ob das Funktioniert.

Beste Grüße
Tobias

von Toptobias (toptobias)


Lesenswert?

Hallo Uwe

Mir ist bei meinem WMZ aufgefallen das die Uhrzeit nicht korrekt ist.
Kann man mit deinem Script in Tasmota und/oder Homeassistant die Uhrzeit 
korriegieren?
Oder noch besser gibt es ein Möglichkeit in dem WMZ die Urzeit zu 
ändern?

Beste Grüße
Tobias

von Uwe (mymikro)


Lesenswert?

Hallo Tobias,

stimmt. Ist bei meinem WMZ auch so. Sind bei mir ein paar Minuten. Habe 
ich bisher ignoriert.

In HomeAssistant kannst du das am einfachsten machen. Die Variable 
"DatasetDate" aus meinem Template ist eine Unix Timestamp (Sekunden seit 
01.01.1970) die in der letzten Zeile in einen String umgewandelt wird. 
Schau dir an wie viele Sekunden dein WMZ daneben liegt und addiere oder 
subtrahiere das als offset.

Wenn die Uhr am Beispiel 5 Minuten nach geht ersetze:
1
{{ DatasetDate | timestamp_custom("%d.%m.%Y %H:%M") }}
durch
1
{{ (DatasetDate + 300) | timestamp_custom("%d.%m.%Y %H:%M") }}


Zu einem einfachen Fix im Tasmota Script habe ich keine Idee. Man müsste 
ja den Übertrag auf die Stunden,Tage,...berücksichtigen. Mein erster 
Ansatz damals war die ausgelesene Zeit erst in ein Unix Timestamp zu 
konvertieren. Dazu habe ich aber in Tasmota nicht die passenden 
Funktionen gefunden und das manuell zu machen habe ich aufgrund der 
unterschiedlichen Anzahl von Tagen im Monat und der Schaltjahre als 
Lösung wieder verworfen.

Viele Grüße,
Uwe

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.