D0 Zähler SML auslesen mit Tasmota

  • Hallo, ich versuche mich jetzt gerade an meinem 2. Tasmota Projekt und möchte meinen ZPA GH302 D-S1 auslesen.

    Mit der Taschenlampe bin ich durch die Einstellungen gegangen.

    PIN Abfrage habe ich auf 'off' gestellt

    Erweiterte informationen auf 'on'

    Habe jetzt mit 2 verschiedenen HICHI's versucht die optische Schnittstelle auszulesen. Verwende das Skript von Tasmota https://tasmota.github.io/docs/Smart-Met…/#zpa-gh302-sml

    Leider kein Erfolg. Auch ein sensor53 d1 bringe keine Werte.

    Es wird immer nur folgendes angezeigt:

    16:37:20.821 MQT: tele/tasmota_D09664/STATE = {"Time":"2023-11-26T16:37:20","Uptime":"0T04:10:11","UptimeSec":15011,"Heap":19,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":1,"POWER":"OFF","Wifi":{"AP":1,"SSId":"xxxx","BSSId":"xxxxxx","Channel":11,"Mode":"11n","RSSI":100,"Signal":-43,"LinkCount":1,"Downtime":"0T00:00:04"}}

    16:37:20.828 MQT: tele/tasmota_D09664/SENSOR = {"Time":"2023-11-26T16:37:20","Strom":{"Total_in":0,"Total_out":0}}

    Kann es ein, das der optisch Sensor nicht reagiert?

    Tasmota ver. 13.0.0


    Danke.

  • Hi, ich habe mich nun durch viele Seiten geklickt und nach "Gas" gesucht, doch so richtig werde ich nicht schlau draus.

    Folgendes: Ich versuche per hall-sensor (49e) unseren Gaszähler auszulesen. Zuerst hatte ich einen reed-Kontakt genutzt, doch der blieb nach einer Weile immer hängen, daher habe ich auf den hall-sensor umgerüstet. Hierbei gehe ich an der Digital-Pin des Hall-Sensors und nutze ihn im Prinzip wie den reed-Kontakt vorher (zwischen VCC und dem pin habe ich den 4,7k Ohm Pullup gelassen). Der hall-sensor löst jetzt sehr zuverlässig aus, doch nun prellt es teilweise ziemlich stark. Ich habe inzwischen gelernt, dass das daran liegt, wenn der Zähler in ungünstigen Lagen stehen bleibt und das per debounce zu lösen ist.

    Dann habe ich den Fork von gemu2015 kompiliert und nach und nach das debouncing von -500ms bis nun -6000ms erhöht. Das führt auch zu weniger "prellen", doch alle paar Stunden wird wieder zu viel gezählt.

    Code
    2,1-0:1.8.0*255(@10,Gesamt,m3,Gesamt,1)
    +2,14,c,0,-6000,Gas

    Ich habe nun viel gegoogelt und unter anderem die Lösung (von Simon42) gefunden, bei der mit esp-home der analog-pin ausgelesen wird. Diesen habe ich auf pin9 (Esp32-S2) angeschlossen und erhalte hier Werte von 2083-1850. Doch wie kann ich das in "Tasmota Scripting Language" umsetzten? Also dass der counter nur bei < 1860 einen hochzählt? Oder gibt es eine andere Lösung, von der ich noch nichts weiß?

  • Hallo PPP

    so sieht das bei mir aus für Zwei Zähler (Wasser und Gas):

    erstmal muss bei dir Zeile 2 als Zeile 1

    Dann ist keine Klammer ) zu !

    >M 2

    +1,5,c,0,-42,H2O

    +2,4,c,0,-28,GAS

    ;

    1,1-0:1.8.0*255(@1000,Zählerstand,m³,Total_In,3

    2,1-0:1.8.0*255(@100,Zählerstand,m³,Total_In,2

  • Hallo meierchen006,

    das mit der Klammer werde ich direkt einmal versuchen. Die Reihenfolge ist bei mir im Script richtig und hier durch einen wilden Kampf mit der Quellcode-Funktion verrutscht.

    Ich habe gestern noch einen Ansatz gebaut, der den Analog Pin nutzt, doch so ist es evt. einfacher.

    Momentan sieht der Teil bei mir so aus:

    Code
    >M 2
    +1,4,s,0,9600,SML
    1,77070100010800ff@1000,Verbraucht,KWh,Total_in,4
    1,77070100020800ff@1000,Eingespeist,KWh,Total_out,4
    1,77070100100700ff@1,Power,W,Power_curr,1
    2,=h====================
    +2,39,c,1,-25,Gas
    2,1-0:1.8.0*255(@10,Gesamt,m3,Gesamt,1)
  • Ich kann es leider nicht mehr testen, da der digital pin verrückt spielt, seit der analog pin auch angeschlossen ist (er zählt kontinuierlich hoch)

    Das verstehe ich nicht wirklich, habe aber gerade wenig Lust, es noch einmal zu ändern. Daher bleibe ich nun erst einmal bei meiner analogen Lösung und hoffe, dass sie nun stabiler läuft (bisher sieht es gut aus).

    Das sieht derzeit so aus (nur der relevante Teil in >T):

  • Hi, ich habe nun doch noch ein paar Fragen.

    Ich versuche unseren Gaszähler mit einem Hall-Sensor (49e) zu erfassen. Das funktioniert schon deutlich besser als mit meinem reed-Kontakt (der blieb nach einer Weile immer hängen), doch ich habe das Problem, dass immer wieder ein paar Durchläufe nicht erfasst werden - immer wenn hier im Haus ordentlich gefeuert wird, dann ist eine Änderung max. 3s lang.

    Ich habe nun viel experimentiert und mein Script einige Mal geändert.

    Doch egal was ich mache, mein Problem ist, dass die Übernahme des Analog-Wertes in der teleperiod recht träge ist. Ich habe mir testweise den Wert in die console printen lassen und teilweise dauert es >5s bis der Wert dem entspricht, der auf der Startseite für analog1 ausgegeben wird. Laut der Doku wird der >T Bereich min. alle 100ms durchlaufen, doch das sehe ich einfach nicht.

    Ich bin mit der Logik nun in den >S Teil gegangen und habe das Gefühl, dass es etwas besser läuft. Trotzdem rutscht immer wieder ein Messpunkt durch.

    Wie kann ich das Script optimieren, dass die Änderungen zügiger erfasst werden?

    Hier ist mein komplettes Script. Den Zähler für Gas nutze ich im Prinzip nur virtuell. Ich erhöhe ihn, wenn eine analoge Änderung wahrgenommen wurde. Der ist auf einen ungenutzten GPIO konfiguriert.
    Als Board ist ein esp32-s2 mini im Einsatz.

  • Ich hatte den Teil zwischenzeitlich auch einmal in >F , dann ganz ohne Rechnung und ohne Ausgaben (bis auf >W).
    Doch mein Gefühl war, dass die Prüfung zwar wesentlich schneller ist, die Daten in >T aber nicht schneller aktualisiert werden.

    Ich hatte auch den kompletten Logik-Teil einmal in >F, das hat aber dazu geführt, dass der esp nach einer Weile (10-30 Minuten) nicht mehr erreichbar war,

  • nur mal den Teil

    if an1>2080
    and do==0
    then
    do=1
    endif

    in >F

    F- darf nicht überlastet werden

    T- ist nur so gut wie noch freie Rechenzeit da ist (und Teleperioden zeitabhängig)

    - bei Überlastung/Erwärmung trottelt das System ab

    eine Einstellung von Sleep-Time 0 bis 250 ist noch möglich (Vordergrund/Hintergrundprozesse)

    2 Mal editiert, zuletzt von karoCB (18. Dezember 2023 um 18:11)

  • >F

    an1=ANALOG#A1

    if an1>2080

    and do==0

    then

    do=1

    endif

    Zitat

    Laut der Doku wird der >T Bereich min. alle 100ms durchlaufen, doch das sehe ich einfach nicht.

    >T für Analogrückstellung zu langsam da wir Teleperiode eingestellt oder wenn CPU-Zeit vorhanden etwas kürzer.

    >F ist 100 ms möglich wenn CPU-Zeit vorhanden !

  • Ich habe das nun getestet, allerdings noch mit einem Zähler den ich hochzähle. Ansonsten habe ich ja nichts zum Rechnen.

    Doch scheinbar bleibt die Datenübernahme zu träge und schnelle Wechsel gehen teilweise verloren (nicht alle).

    Das Problem bei >F ist, dass dort der Wert von ANALOG#A1 nicht bekannt ist: "var not found: ANALOG#A1

  • Hi, erst einmal Danke für die Hilfe!

    Ich experimentiere nun noch einmal mit dem digitalen Zähler. Ich habe einen 10k Pull-up zwischen data/3,3V, data ist an GPIO23

    Der funktioniert im einfachen Fall (normaler Durchlauf) auch gut. Doch sobald der Magnet in der Nähe stehen bleibt, zählt der Counter immer weiter, so als würde gar kein debouncing stattfinden.

    In einem weiteren Test habe ich GPIO23 nun als switch mit einem SwitchDebounce von 500 angelegt. Und siehe da: On/off funktioniert genau wie gewünscht. Es bleibt dauerhaft On oder Off, auch wenn der Magnet in der Nähe stehen bleibt. Wenn ich mir den pin[23] dann in >F ausgeben lasse, dann sehe ich, dass dort kurze Schwankungen vorkommen: 0000100000010001000000 (so in etwa). Doch dank des SwitchDebounce bleibt der switch auf Off.

    Irgendetwas muss ich falsch machen!

    Mein Script habe ich nun auf das Minimum reduziert:

    Code
    >D
    >B
    =>sensor53 r
    >M 1
    +1,23,c,1,-500,Gas
    1,1-0:1.8.0*255(@10,Gesamt,m3,Gesamt,1


    Hier noch der Teil aus meiner user_config_override.h

  • Ich habe nun weiter experimentiert und bin auf 2 verschiedene Lösungsansätze gekommen:

    per adc(1 36) kann ich den GPIO36 auf meinem Test ESP32 unter >F auslesen. Das ist im Prinzip genau das, was ich möchte. Das klappt leider auf dem ESP32-S2 (der ist im Keller) leider gar nicht. Da erhalte ich nur 0 als Wert von adc(1 9). Dort bin ich an pin9, da dieser ein Analog Pin auf dem kleinen S2-Mini ist.

    Der 2. Ansatz ist eher ein Workaround. Hier habe ich den digital-pin als switch mit relay konfiguriert und als SwitchDebounce 600ms gesetzt.
    Unter >E gehe ich dann auf den power Status ein und zähle den höher. Das scheint zu funktionieren und bisher habe ich kein prellen erzeugen können.

  • Also der Gaszähler kostet mich Lebenszeit und min. 3 neue graue Haare!
    Mit dem neuen Ansatz lief es zuerst schlechter als je zuvor. Das lag daran, dass der Hall-Sensor am anlogen Eingang sehr wohl prellt (und wie!).

    Nach mehreren weiteren Tests habe ich nun eine Variante gefunden, die seit gestern zum ersten Mal richtig zählt.

    Ich nutze jetzt einen Median in >F. Falls irgendwer auch einmal einen Hall-Sensor analog mit Tasmota nutzen möchte, hänge ich mein aktuelles Script an.
    Wenn das in den kommenden Tagen doch wieder auseinanderlaufen sollte, dann gebe ich auf und werde doch ein weiteren "ai on edge" nutzen.

    Und falls noch jemand auf die (nur mittelprächtige) Idee kommen sollte einen ESP32-S2 mini nutzen zu wollen:
    Das Ding ist ein ESP8266/ESP32 Zwitter. Bei diesem Modell funktioniert adc() nur an GPIO1 (ADC1_0). Die anderen Anlog-Pins kann man zwar nutzen, aber ich habe keinen Weg gefunden, sie per Script auszulesen.

  • Hallo Zusammen,

    hat jemand von Euch zufällig einen Arduino Code um Testdaten für einen SML Zähler zu erzeugen um nicht ständig zum
    Zähler rennen zu müssen?

    Ich probiere schon die ganze Zeit aber es kommt irgendwie nur Grütze raus.

    Danke
    Gruß Jens

  • Hallo Zusammen,

    Falls jemand einen für einen Arduino Mega einen Code benötigt, mit dem man Testdaten simuliert.
    Leider habe ich es nicht hinbekommen per IR-LED, man muss dann den TX2 Pin Mega mit Spannungsteiler 5V>3.3V und GND
    an den ESP Pin verkabeln....
    Simuliert dann einen Logarex LK13BE (SML) (LK13BE904639), ist im Moment bei der EWE hier im Rennen als Austausch.

  • Ich habe auch einen ED300L Zähler und mir den Hichi Wifi besorgt um den Zähler auszulesen.

    Leider erhalte ich nur einen Wert für den Zählerstand und den aktuellen Verbrauch.

    Ich würde aber auch gerne die Daten für 1 Tag, 7 Tage, 30 Tage und 365 Tage auslesen.

    Mit den obigen Zeilen funktioniert es bei mir auch nicht, daher möchte ich den Beitrag nochmal hoch holen.

    Hat jemand eine Lösung?

    VG