ArduCounter Support und neue Versionen (war: Stromzähler mit S0 Schnitt...)

Begonnen von StefanStrobel, 26 Januar 2014, 12:08:13

Vorheriges Thema - Nächstes Thema

no_Legend

Zitat von: Otto123 am 18 Januar 2019, 17:58:48
Hallo Robert,

ich zitiere mal meine Aufzeichnung, so hatte ich das mal verstandenIch nehme das nur für Strom nicht für Gas (ich heize mit Holz)  :D

Wenn ich richtig drüber nachdenke: ist power für Dich sinnvoll?
Der Stromzähler liefert ja Impulse pro Leistung (kWh) du zählst ja Liter. Ein Liter Gas hat auch irgendeinen Wert in kWh, Du könntest also auch die momentane Heizleistung damit anzeigen.

Du müsstest nur den Gas 1 Liter = x kWh (Heizwert) Wert wissen. Steht eventuell  in deinem Gasvertrag.

Gruß Otto

Wenn ich den GasCalculator benutze, ist eigentlich eher ein Aktueller Zählerstand wichtig.
Mit dem Firmata den ich mal laufen hatte, habe ich einfach einen Hourcounter mit on und off gefüttert.
Hier wurde dann der Zählerstand gebildet, welcher dann der GasCalculator weiterverarbeitet hat.

Ottos deinen Blog habe ich gelesen.
Hättest du aber nicht mit dem Befehl monotonic arbeiten können?

Das mit dem Dummy hab ich auch nicht ganz verstanden gehabt.
Gibt aber wohl keine einfache Möglichkeit den Zählerstand in ein Userreading einzutragen.
IntelNUC mit Ubuntu mit FHEM immer aktuell,2x HMLAN, CUL443, CUL868 -homekit/siri -tablet ui -homebridge
Device, diverse:
HM-SEC-KEY,HM-LC-BL1-FM,HM-SEC-SD,HM-Sen-DB-PCB,HM-Sec-RHS,HM-Sec-SC-2,HM-WDS10-TH-O,Harmony,Netamo, 433MHz Steckdosen uvm.

Otto123

Du hast aber nach Faktor gefragt.  ::)
Zitatfactor
Define a multiplicator for calculating the power from the impulse count and the time between the first and the last impulse
Für den Zählerstand nehme ich sowas attr AC userReadings ZaehlerHzg monotonic {sprintf("%.2f",ReadingsVal("AC","pin4",0)/400)}
Dann gehe ich einmal her und mache sein setreading AC ZahlerHzg xxxxxund trage dort einfach den aktuellen Stand ein.

Mein Artikel ist da leider nicht auf dem Stand der Zeit, deswegen gibt es da die rote Zeile  ;)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

no_Legend

Zitat von: Otto123 am 18 Januar 2019, 21:01:01
Du hast aber nach Faktor gefragt.  ::)Für den Zählerstand nehme ich sowas attr AC userReadings ZaehlerHzg monotonic {sprintf("%.2f",ReadingsVal("AC","pin4",0)/400)}
Dann gehe ich einmal her und mache sein setreading AC ZahlerHzg xxxxxund trage dort einfach den aktuellen Stand ein.

Mein Artikel ist da leider nicht auf dem Stand der Zeit, deswegen gibt es da die rote Zeile  ;)

Gruß Otto

Hallo Otto,

das war genau der Schubs in die Richtige Richtung.

Habe es nun mit dem Readings auf die gleiche weiße gelöst.
GasZaehlerstand monotonic {sprintf("%.2f",ReadingsVal("Gaszaehler","pin2",0)/100)}

Mal schauen wie es nun mit dem GasCalculator weiter geht.

Danke und Gruß Robert
IntelNUC mit Ubuntu mit FHEM immer aktuell,2x HMLAN, CUL443, CUL868 -homekit/siri -tablet ui -homebridge
Device, diverse:
HM-SEC-KEY,HM-LC-BL1-FM,HM-SEC-SD,HM-Sen-DB-PCB,HM-Sec-RHS,HM-Sec-SC-2,HM-WDS10-TH-O,Harmony,Netamo, 433MHz Steckdosen uvm.

no_Legend

Also seit Funktioniert alles ganz gut.

Irgendwie scheinen ein paar Impulse nicht gezählt zu werden.
Woran es allerdings genau liegt kann ich nicht sagen.

Dazu hab ich dann ein paar fragen:
1. Wie sieht es eigentlicht mit dem Entprellen aus?
2. Ich hab den Pin nun wie folgt definiert: pinD2 falling pullup 5
Die Zeit für den minimal Impuls (hier 5ms), wenn man den weg lässt, gibt es einen Default wert?
Also wenn ich nichts definiere, was pinD2 falling pullup, was wird dann genommen?
3. Wird eigentlich immer das pinHistory reading angelegt?
Bei mir ist es nicht zu finden.


Edit:
3. Frage hinzu gefügt

Danke und Gruß Robert
IntelNUC mit Ubuntu mit FHEM immer aktuell,2x HMLAN, CUL443, CUL868 -homekit/siri -tablet ui -homebridge
Device, diverse:
HM-SEC-KEY,HM-LC-BL1-FM,HM-SEC-SD,HM-Sen-DB-PCB,HM-Sec-RHS,HM-Sec-SC-2,HM-WDS10-TH-O,Harmony,Netamo, 433MHz Steckdosen uvm.

StefanStrobel

Hallo Robert,

als minimale Impulslänge würde ich 30ms angeben. Das ist auch die Mindestlänge eines Impulses über eine S0-Schnittstelle. Ein Prellen würde damit auch ganz gut entfernt.
Wenn Du nichts angibst, wird 2ms angenommen.

Die pulseHistory wird von der Firmware nur übertragen wenn devVerbose >=5 ist.
Das Fhem-Modul erzeugt selbst bei übertragener History nur Readings dafür wenn verboseReadings gesetzt ist.

In der neuen Version habe ich die Anleitung übrigens etwas ausführlicher geschrieben. Ich poste demnächst noch eine neue Version, die dann auch wieder für einen ESP compilieren sollte.
Gerade bin ich am Testen, ob das mit dem Auslesen per Reflexlichtschranke auch mit einem ESP klappt...

Gruss
   Stefan

no_Legend

Zitat von: StefanStrobel am 21 Januar 2019, 20:04:47
Hallo Robert,

als minimale Impulslänge würde ich 30ms angeben. Das ist auch die Mindestlänge eines Impulses über eine S0-Schnittstelle. Ein Prellen würde damit auch ganz gut entfernt.
Wenn Du nichts angibst, wird 2ms angenommen.

Die pulseHistory wird von der Firmware nur übertragen wenn devVerbose >=5 ist.
Das Fhem-Modul erzeugt selbst bei übertragener History nur Readings dafür wenn verboseReadings gesetzt ist.

In der neuen Version habe ich die Anleitung übrigens etwas ausführlicher geschrieben. Ich poste demnächst noch eine neue Version, die dann auch wieder für einen ESP compilieren sollte.
Gerade bin ich am Testen, ob das mit dem Auslesen per Reflexlichtschranke auch mit einem ESP klappt...

Gruss
   Stefan


Hallo Stefan,

Super Danke.
Echt spitze dein Support.
Momentan scheint er mit 5ms richtig zu zählen.
Ich werde es noch mal mit 30ms testen.
Bin mir halt nicht sicher wie die Impulslänge sein soll.
Hab auch keine Oszi zur hand, leider.

Damit Reflexlichtschranken sollte gehen.
Bei ESPEasy gibt es dafür support.
Vll kannst du ja was von den Jungs adaptieren.
https://www.letscontrolit.com/wiki/index.php?title=Devices


Die Wasseruhr will ich ja auch schon ewig lange erfassen.
Nur die Uhr ist nicht sehr einfach Abzufragen.
Weder mit Lichtschranke noch mit Induktionssensor oder so.
Hat leider kein Rad wo man etwas reflektiert bekommt.
Manche nehmen dafür einen Laser nur der Aufwand, davor kraust es mir schon jetzt.
Hab noch zu viele andere Baustellen.

Danke und Gruß Robert
IntelNUC mit Ubuntu mit FHEM immer aktuell,2x HMLAN, CUL443, CUL868 -homekit/siri -tablet ui -homebridge
Device, diverse:
HM-SEC-KEY,HM-LC-BL1-FM,HM-SEC-SD,HM-Sen-DB-PCB,HM-Sec-RHS,HM-Sec-SC-2,HM-WDS10-TH-O,Harmony,Netamo, 433MHz Steckdosen uvm.

no_Legend

@StefanStrobel

Mal ne Frage ist der Aufwand groß den Sketch auch ESP32 anzupassen?
Ich bin da auf ein Intresante Lolin Modul gestoßen.
https://www.exp-tech.de/plattformen/esp32/9077/d32-v1.0.0

Der hat gleich die Ladeelektronik mit drauf, die ich beim Wemos D1 mini als Shield dran habe.

Danke und Gruß Robert
IntelNUC mit Ubuntu mit FHEM immer aktuell,2x HMLAN, CUL443, CUL868 -homekit/siri -tablet ui -homebridge
Device, diverse:
HM-SEC-KEY,HM-LC-BL1-FM,HM-SEC-SD,HM-Sen-DB-PCB,HM-Sec-RHS,HM-Sec-SC-2,HM-WDS10-TH-O,Harmony,Netamo, 433MHz Steckdosen uvm.

StefanStrobel

Hallo Robert,

eine Anpassung an den ESP32 sollte eigentlich nicht so schwer sein. Ich hatte leider noch keine Zeit mich damit zu beschäftigen.

Anbei nun auch eine aktuelle Version, die bei mir auch auf dem ESP8266 läuft, auch mit der Refelxlichtschranke an A0.

Das Thema mit dem Faktor hat sich übrigens auch erledigt. Dafür gibt es das einfachere Attribut pulsesPerKWh

Gruss
   Stefan

EDIT 9.7.19: neue Version ist eingecheckt (Firmware Quellcode unter contrib/arduino, Hex-File für den Arduino Nano unter FHEM/firmware)

StefanStrobel

kleine Ergänzung falls jemand die Reflexlichtschranke an einem ESP8266 nachbauen möchte:
Ich musste den pull down Widerstand am Phototransistor ganz weglassen und den Vorwiderstand an der IR-LED mit 330 Ohm etwas höher bemessen als beim Arduino.

Gruss
   Stefan

no_Legend

Zitat von: StefanStrobel am 22 Januar 2019, 21:26:02
Hallo Robert,

eine Anpassung an den ESP32 sollte eigentlich nicht so schwer sein. Ich hatte leider noch keine Zeit mich damit zu beschäftigen.

Anbei nun auch eine aktuelle Version, die bei mir auch auf dem ESP8266 läuft, auch mit der Refelxlichtschranke an A0.

Das Thema mit dem Faktor hat sich übrigens auch erledigt. Dafür gibt es das einfachere Attribut pulsesPerKWh

Gruss
   Stefan

Danke Stefan, für deine Arbeit.
Echt spitze das Modul.

Das mit dem ESP32 ist noch nicht fix.
Ich bin mir nicht sicher, wie ich es genau machen will.
Auf der einen Seite ist es recht einfach ESPs mit BAckup Batterie zu versorgen.
Ich hab allerdings auch keine Lust, so viel müll im WLAN zu haben.
Dazu ist der NUC mit Fhem keine 2 m Weg von der Gas und Wasseruhr
Naja wer die Wahl hat, hat die Qual.

Noch eine allgemein Frage, Frägt das Modul zyklisch beim Counter nach den werten oder sendet der Counter im eingestellten Intervall die Daten?
Mir geht es darum ob bei einem Neustart werte verloren gehen können?

Danke und Gruß Robert
IntelNUC mit Ubuntu mit FHEM immer aktuell,2x HMLAN, CUL443, CUL868 -homekit/siri -tablet ui -homebridge
Device, diverse:
HM-SEC-KEY,HM-LC-BL1-FM,HM-SEC-SD,HM-Sen-DB-PCB,HM-Sec-RHS,HM-Sec-SC-2,HM-WDS10-TH-O,Harmony,Netamo, 433MHz Steckdosen uvm.

StefanStrobel

Hallo Robert,

das Arduino / ESP-Board sendet seine Zähl-Ergebnisse von sich aus an Fhem.
Entweder seriell oder über eine TCP-Verbindung, die von Fhem aus zum Board aufgebaut wird.
Falls die TCP-Verbindung unterbrochen ist, wenn das Board gerade seine Zählerstände berichten möchte, wird das Berichten nachgeholt, sobald die Verbindung wieder steht.
Wenn das Board neu startet gehen die noch nicht an Fhem weitergeleiteten Pulse zunächst verloren (zumal Impulse während dem Neustart des Boards sowieso nicht gezählt werden können).
Fhem versucht dann aber nach dem ersten Bereicht nach einem Neustart des Boards aus dem Mittelwert der Impulse je Zeit vor dem Neustart und nach dem Neustart zu interpolieren,
wie viele Impulse vermutlich verpasst wurden. Das kommt dann zusätzlich zum normalen Zähler in den Interpolated counter in Fhem.

Deshalb zeigt das Fhem-Modul so viele verschiedene Zähler an:

Beispiel (Readings meines ArduCounters am Ferraris-Zähler):

state opened
seqA7 5
pinA7 2976
rejectA7 0
countDiffA7 2
timeDiffA7 49810
powerA7 1.927
longA7 2976
interpolatedLongA7 2976
calcCounterA7 39.6799999999992
calcCounterA7_i 0


state opened
Das bedeutet dass die serielle Schnittstelle, an der das Board hängt, geöffnet ist.

seqA7 5
Jeder Bericht für einen Pin wird vom Board fortlaufend durchnummeriert. So kann Fhem erkennen, wenn es einen Bericht verpasst hat, weil die Verbindung unterbrochen war.

pinA7 2976
Das ist der interne Zählerstand für Pin A7 im Board. Bei einem Neustart des Boards beginnt dieser Zähler wieder bei 0

rejectA7 0
Das ist der interne Reject-Zählerstand für Pin A7 im Board. Hier werden die Impulse gezählt, die zu kurz waren (evt. Prellen). Bei einem Neustart des Boards beginnt dieser Zähler wieder bei 0

countDiffA7 2
Das ist die Anzahl der Impulse seit dem letzten Bericht des Boards. Aus dieser Zahl und timeDiffA7 wird der aktuelle Verbrauch (z.B. als kW) berechnet.

timeDiffA7 49810
Das ist die Zeit zwischen dem letzten Impuls des vorherigen Berichts und dem letzten Impuls des aktuellen Berichts-Intervalls.

powerA7 1.927
Das ist der aktuelle Verbrauch als Impulse / Zeit unter Berücksichtigung der Impulse je Einheit (Attribut pulsesPerKwh)

longA7 2976
Das ist ein Zähler in Fhem, der die berichteten Impulse vom Board aufaddiert und damit weiterzählt, auch wenn das Board neu gestartet wurde oder wenn Fhem neu gestartet wurde.

interpolatedLongA7 2976
Das ist ein Zähler, der ähnlich wie logA7 weiter zählt, zusätzlich aber noch verlorene Impulse (während Neustarts) interpoliert.

calcCounterA7 39.6799999999992
Dieser Zähler arbeitet ähnlich wie interpolatedLongA7, berücksichtigt aber pulsesPerKwh und zählt damit nicht Impulse sondern Kilowattstunden oder Liter o.ä. Voraussetzung ist dass das Attribut pulsesPerKwh existiert, sonst wird dieses Reading auch nicht erzeugt.

calcCounterA7_i 0
Dieser Zähler ergänzt calcCounterA7 und zählt nur die eventuell interpolierten Einheiten. Damit kann man sehen, was echt ist und was geraten ist.

zusätzliche User-Readings oder Dummies sollte man somit nicht mehr benötigen.

Die Länge des Intervalls, in dem das Board seine Zählerstände an Fhem berichtet, ist dynamisch und wird über das interval-Attribut beeinflusst. Das ist in der Anleitung ausführlich beschrieben. Der entscheidende Punkt dabei ist dass man bei geringem Stromverbrauch und somit wenigen Impulsen länger warten sollte um den Stromverbrauch sinnvoll berechnen zu können.

Gruss
   Stefan

no_Legend

Zitat von: StefanStrobel am 23 Januar 2019, 18:16:17
Hallo Robert,

das Arduino / ESP-Board sendet seine Zähl-Ergebnisse von sich aus an Fhem.
Entweder seriell oder über eine TCP-Verbindung, die von Fhem aus zum Board aufgebaut wird.
Falls die TCP-Verbindung unterbrochen ist, wenn das Board gerade seine Zählerstände berichten möchte, wird das Berichten nachgeholt, sobald die Verbindung wieder steht.
Wenn das Board neu startet gehen die noch nicht an Fhem weitergeleiteten Pulse zunächst verloren (zumal Impulse während dem Neustart des Boards sowieso nicht gezählt werden können).
Fhem versucht dann aber nach dem ersten Bereicht nach einem Neustart des Boards aus dem Mittelwert der Impulse je Zeit vor dem Neustart und nach dem Neustart zu interpolieren,
wie viele Impulse vermutlich verpasst wurden. Das kommt dann zusätzlich zum normalen Zähler in den Interpolated counter in Fhem.

Gruss
   Stefan

Dank dir für die Erklärung.

Gruß Robert
IntelNUC mit Ubuntu mit FHEM immer aktuell,2x HMLAN, CUL443, CUL868 -homekit/siri -tablet ui -homebridge
Device, diverse:
HM-SEC-KEY,HM-LC-BL1-FM,HM-SEC-SD,HM-Sen-DB-PCB,HM-Sec-RHS,HM-Sec-SC-2,HM-WDS10-TH-O,Harmony,Netamo, 433MHz Steckdosen uvm.

StefanStrobel

Hallo,

ich habe die neue Version eingecheckt und hoffe dass sie keine neuen Fehöer / Probleme mit sich bringt.

Gruss
   Stefan

Kornelius777

Hallo zusammen,
hallo Stefan,

heute habe ich mir aus irgend einem Grund meinen ArduCounter "zerschossen", der seit einem guten Jahr vollkommen klaglos seinen Dienst verrichtet hat.
Grund muss (aus meiner Sicht) ein Update sein, das ich gemacht habe. Und davon gab es heute "einige":

Am Raspberry habe ich

apt-get update
apt-get dist-upgrade


durchgeführt. Und anschließend in fhem ein
update

Den Arduino Nano habe ich nschließend neu geflasht.

Mein (physikalischer) Aufbau ist wie folgt:

Gaszähler --> HallSensor --> Arduino1 (eigenes Script) --> Arduino2 (ArduCounter) --> Raspberry USB-Port

Pro 0,01 qm Gasverbrauch (eine Umdrehung der letzten Zählerwalze) legt Arduino1 an Port D7 von Arduino2 das Signal einmal auf 3,3V und anschließend wieder auf 0 zurück.
Leider geht seit dem heutigen Update gar nix mehr.  Ich bekomme einfach keine Daten mehr in Port D7 rein.
Arduino1 läuft allerdings munter weiter (die Signal-LED zeigt mir den jeweiligen Zustand des Ausgangs an).

Wie kann ich das Ganze debuggen? Welche Messreihen kann ich liefern, damit Ihr mir helfen könnt?

Mein Device sieht so aus:
Internals:
   Board      NANO
   BoardDet   
   DEF        /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_AH06NIQN-if00-port0@38400
   DeviceName /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_AH06NIQN-if00-port0@38400
   FD         4
   FUUID      5c5c4798-f33f-f563-c529-cb1480ffee8a50cb
   Initialized 1
   LASTOPEN   1550153626.47919
   NAME       HAR.ArduCounter
   NOTIFYDEV  global
   NR         24
   NTFY_ORDER 50-HAR.ArduCounter
   PARTIAL   
   STATE      1479.89 qm
   SketchCompile Jan  6 2019 17:11:47
   TYPE       ArduCounter
   VersionFirmware 3.10
   VersionModule 6.07 - 27.1.2019
   allowedPins 3,4,5,6,7,8,9,10,11,13,14,A0,15,A1,16,A2,17,A3,18,A4,19,A5,20,A6,21,A7
   buffer     
   deviceBooted 1550153628.49667
   devioLoglevel 3
   nextOpenDelay 60
   Helper:
     DBLOG:
       GasZaehler:
         DBLogging:
           TIME       1550155304.07053
           VALUE      1479.89
       GasZaehlerArdu:
         DBLogging:
           TIME       1550155304.07053
           VALUE      147989
       GasZaehlerTicks:
         DBLogging:
           TIME       1550155304.07053
           VALUE      0
   READINGS:
     2019-02-14 15:41:44   GasZaehler      1479.89
     2019-02-14 15:41:44   GasZaehlerArdu  147989
     2019-02-14 15:41:44   GasZaehlerTicks 0
     2019-02-14 09:08:17   countDiff7      1
     2019-02-14 15:41:44   countDiffD7     0
     2019-02-14 09:08:17   interpolatedLong7 106610
     2019-02-14 15:41:44   interpolatedLongD7 0
     2019-02-14 09:08:17   pin7            187
     2019-02-14 15:41:44   pinD7           0
     2019-02-14 09:08:17   power7          0.000
     2019-02-14 15:41:44   powerD7         0.000
     2019-02-14 09:08:17   reject7         0
     2019-02-14 15:41:44   rejectD7        0
     2019-02-14 09:08:17   seq7            181
     2019-02-14 15:41:44   seqD7           5
     2018-04-02 12:24:58   statStateDay    opened: 12:25:03 opened_Count: 1
     2018-04-01 23:59:55   statStateDayLast opened: 24:00:00 opened_Count: 1
     2018-04-02 12:24:58   statStateMonth  opened: 1d 12:25:03 opened_Count: 1
     2018-03-31 23:59:55   statStateMonthLast opened: 30d 22:59:59 opened_Count: 1
     2018-04-02 12:24:58   statStateYear   opened: 73d 20:15:57 opened_Count: 1 (since: 2018-01-18_15:09:01)
     2019-02-14 15:13:46   state           opened
     2019-02-14 09:08:17   timeDiff7       92909
     2019-02-14 15:41:44   timeDiffD7      300000
   runningCfg:
     I          30 60 2 2
     T          100 110
Attributes:
   DbLogInclude GasZaehler,GasZaehlerArdu,GasZaehlerTicks
   devVerbose 20
   event-on-update-reading .*
   factor     1
   flashCommand avrdude -b 57600 -p atmega328P -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]
   interval   60 300
   pinD7      rising 60
   readingNameLongCount7 GasZaehlerArdu
   room       HAR
   stateFormat GasZaehler qm
   userReadings GasZaehler {ReadingsVal("HAR.ArduCounter","GasZaehlerArdu",0)/100}, GasZaehlerTicks difference {ReadingsVal("HAR.ArduCounter","GasZaehlerArdu",0)}
   userattr   pinD7 readingNameLongCount7


Hoffentlich kann mir jemand helfen...

Dankeschön!

Viele Grüße!

Kornelius

Kornelius777

Nach einigem Grübeln mal eine kurze Frage:
Muss ich evtl "readingNameLongCount7" durch "readingNameLongCountD7" ersetzen?
Oder wird diese Änderung durch das Modul abgefedert?

Grüße!

Kornelius