Alternative Methode zum Auslesen von Zählern (Wasseruhr, Gaszähler etc)

Begonnen von eki, 02 November 2020, 17:25:39

Vorheriges Thema - Nächstes Thema

Papaloewe

Hier ist alles beschrieben.:
https://github.com/jomjol/AI-on-the-edge-device/wiki

Ich habe auch die Sachen bestellt und bin mal echt gespannt.
Es ist schon erstaunlich, was man mit den ESP-Dinger mitlerweile anstellen kann.

eki

Zitat von: pink99panther am 14 November 2020, 15:38:35

@eki
Habe versucht Dein MQTT2_Device zu benutzen,
komme aber mit den einstellungen für des Statistics-Modul nicht zurecht.
Wäre schön, wenn Du mir mal helfen könntest.
Auch habe ich keine Idee, wo das Reading "dtime" her kommt.
Ist das händisch gesetzt?

LG
p99p

Das Reading dtime ist ein userreading (habe gerade noch mal das Listing im ersten Beitrag aktualisiert, das hat da irgendwie gefehlt).
Für die Statistiken musst Du, falls Du das noch nicht für andere Dinge hast, ein "statistics" Device anlegen und in die Definition <devname>.* eintragen (<devname> natürlich entsprechend ersetzen). Zusätzlich noch "value" im Attribut deltaReadings und "value,flow,volume" beim Attribut minAvgMaxReadings setzen.

Falls Du schon ein statistics Device nutzt, musst Du eben die entsprechenden Dinge ergänzen.

Unten habe ich mal Plots angehängt, wie das dann bei inklusive der Statistik aussieht.

Wolle02

Zitat von: rcmcronny am 09 November 2020, 11:44:05

Aktuell sehe ich gerade bei heise,das es eine neue Version mit  USB-C Anschluss wohl gibt. (von M5stack)
https://www.heise.de/news/ESP32CAM-mit-USB-C-Anschluss-4951429.html

@jomjol und rcmcronny

Ist denn dieses Modul für das Projekt überhaupt nutzbar? Ich kann auf den Bilder von diesem Board keinen SD-Slot erkennen. Wenn ich jomjol richtig verstanden habe, ist eine SD-Karte aber zwingende Voraussetzung!?

rcmcronny

Stimmt, da ist kein SDCard Slot drauf wie es aussieht, dann geht es auch nicht mit dem Projekt logischerweise. Ich hatte mich drauf verlassen, das es "nur" ein USB-C zusätzlich hat :/

Ronny

pink99panther

@eki
Danke für die aktualisierung vom Listing und die Infos zu Statistics.
Leieder bekomme ich es damit auch nicht wirklich zum laufen.
Der auffälligste Fehler ist, dass im stateFomat bei Zählerstand 000. und nur die Nachkommastellen richtig angezeigt werden.

@jomjol
hab heute OTA-Update gemacht.
Hat einwandfrei funktioniert.

LG
p99p

eki


eki

Schick mal ein ,,List" Deines Devices und vom statistics Device.

pink99panther

Hat ein Weilchen gedauert, hatte schon alles umgebaut auf WaterCalCulator.

Hier nun die 2 Listings.
Internals:
   CFGFN     
   CID        wasser
   DEF        wasser
   DEVICETOPIC MQTT2_wasser
   FUUID      5fb41ab4-f33f-f73e-3dff-eac4d4986615e0ed
   IODev      MyBroker
   LASTInputDev MyBroker
   MSGCNT     7
   MyBroker_MSGCNT 7
   MyBroker_TIME 2020-11-17 20:33:16
   NAME       MQTT2_wasser
   NR         372
   STATE      <b>Zählerstand:</b> 0.5850 m<sup>3</sup><br><b>Verbrauch heute:</b> 0.00 Liter<br><b>Durchfluss:</b> 0.00 Liter/min
   TYPE       MQTT2_DEVICE
   READINGS:
     2020-11-17 20:33:16   dtime           350
     2020-11-17 20:33:16   flow            0
     2020-11-17 20:33:16   readout         182.5850
     2020-11-17 20:33:16   statFlowDay     Min: 0 Avg: 0 Max: 0 (since: 2020-11-17_20:27:26 )
     2020-11-17 20:33:16   statFlowHour    Min: 0 Avg: 0 Max: 0 (since: 2020-11-17_20:27:26 )
     2020-11-17 20:33:16   statFlowMonth   Min: 0 Avg: 0 Max: 0 (since: 2020-11-17_20:27:26 )
     2020-11-17 20:33:16   statFlowYear    Min: 0 Avg: 0 Max: 0 (since: 2020-11-17_20:27:26 )
     2020-11-17 20:33:16   statValueDay    Min: 0.5829 Avg: 0.5829 Max: 0.5850 (since: 2020-11-17_20:27:26 )
     2020-11-17 20:33:16   statValueHour   Min: 0.5829 Avg: 0.5829 Max: 0.5850 (since: 2020-11-17_20:27:26 )
     2020-11-17 20:33:16   statValueMonth  Min: 0.5829 Avg: 0.5829 Max: 0.5850 (since: 2020-11-17_20:27:26 )
     2020-11-17 20:33:16   statValueYear   Min: 0.5829 Avg: 0.5829 Max: 0.5850 (since: 2020-11-17_20:27:26 )
     2020-11-17 20:33:16   statVolumeDay   Min: 0 Avg: 0 Max: 0 (since: 2020-11-17_20:27:26 )
     2020-11-17 20:33:16   statVolumeHour  Min: 0 Avg: 0 Max: 0 (since: 2020-11-17_20:27:26 )
     2020-11-17 20:33:16   statVolumeMonth Min: 0 Avg: 0 Max: 0 (since: 2020-11-17_20:27:26 )
     2020-11-17 20:33:16   statVolumeYear  Min: 0 Avg: 0 Max: 0 (since: 2020-11-17_20:27:26 )
     2020-11-17 20:33:16   value           0.5850
     2020-11-17 20:33:16   valueDay        0
     2020-11-17 20:33:16   valueHour       0
     2020-11-17 20:33:16   volume          2.10000000000002
   helper:
     _98_statistics Wasserstatistik
Attributes:
   IODev      MyBroker
   alias      Haus_Wasserverbrauch
   event-on-change-reading .*(flow|volume|value|stat).*
   event-on-update-reading .*readout|statFlowHourLast.*
   icon       sani_water_tap
   readingList wasser:watermeter/readout:.* readout
   room       MQTT2_DEVICE
   stateFormat {
  my @dayval = split(" ",ReadingsVal($name,"statValue","Hour: 0 Day: 0 Month: 0"));;
  sprintf("<b>Zählerstand:</b> %.4f m<sup>3</sup><br>".
          "<b>Verbrauch heute:</b> %0.2f Liter<br>".
          "<b>Durchfluss:</b> %0.2f Liter/min",
          ReadingsVal($name,"value",0),
          $dayval[3]*1000,
          ReadingsVal($name,"flow",0)
         );;
}
   userReadings flow:readout.* {
  my $td = ReadingsVal($name,"dtime",1);;
  my $oldval = ReadingsVal($name,"flow",0);;
  ($td lt 20) ? $oldval : ReadingsVal($name,"volume",0)/$td*60;;
},
valueHour:readout.* {
  my ($d,$value) = split(" ",ReadingsVal($name,"statValue","Hour: 0 Day: 0 Year: 0"));;
  $value*1000;;
},
valueDay:readout.* {
  my ($d1,$d2,$d3,$value) = split(" ",ReadingsVal($name,"statValue","Hour: 0 Day: 0 Year: 0"));;
  $value*1000;;
},
volume:readout.* difference {ReadingsVal($name,"value",0)*1000;;},
dtime:readout.* difference {time_str2num(ReadingsTimestamp($name,"value",0));;},
value:readout.* {
  my ($inint,$inrest) = split(/\./,ReadingsVal($name,"readout",0));;
  my ($valint,$valrest) = split(/\./,ReadingsVal($name,"value",0));;
  my $oldval = ($valint.".".$valrest);;
  $valint = $inint if ($inint !~ m/.*N.*/);;
  $valrest = $inrest if ($inrest !~ m/.*N.*/);;
  $valint++ if (($valrest-$inrest) > 8000);; # wahrscheinlich Nulldurchgang
  $valint = int($oldval) if (($valint - int($oldval)) gt 1);; # wahrscheinlich Fehlerkennung
  my $result = ($valint.".".$valrest);;
  return ($result ge $oldval)?$result:$oldval;; # sichere monotones Steigen
}


Internals:
   CFGFN     
   DEF        MQTT2_wasser
   DEV_REGEXP MQTT2_wasser
   FUUID      5fb422ca-f33f-f73e-767e-e2a7bf1f5c7101c4
   NAME       Wasserstatistik
   NOTIFYDEV  global,MQTT2_wasser
   NR         436
   NTFY_ORDER 10-Wasserstatistik
   PREFIX     stat
   STATE      Updated stats for: MQTT2_wasser
   TYPE       statistics
   READINGS:
     2020-11-17 20:27:26   monitoredDevicesMQTT2_DEVICE MQTT2_wasser
     2020-11-17 20:21:57   monitoredDevicesUnsupported MQTT2_wasser#MQTT2_DEVICE
     2020-11-17 20:21:57   nextPeriodChangeCalc 2020-11-17 20:59:55
     2020-11-17 20:41:31   state           Updated stats for: MQTT2_wasser
   fhem:
     modulVersion $Date: 2019-12-24 00:07:57 +0100 (Tue, 24 Dec 2019) $
     nextPeriodChangeTime 1605643195
Attributes:
   deltaReadings value
   minAvgMaxReadings value,flow,volume
   room       zz_Verbrauch


Danke schon mal für Deine Mühe.

eki

Kannst Du mal die folgende Zeile in den userreadings:


$valint = int($oldval) if (($valint - int($oldval)) gt 1);; # wahrscheinlich Fehlerkennung


durch


$valint = int($oldval) if (($valint - int($oldval)) > 1);; # wahrscheinlich Fehlerkennung

pink99panther


Christoph Morrison

Zitat von: pink99panther am 17 November 2020, 20:45:45

  my @dayval = split(" ",ReadingsVal($name,"statValue","Hour: 0 Day: 0 Month: 0"));;
  sprintf("<b>Zählerstand:</b> %.4f m<sup>3</sup><br>".
          "<b>Verbrauch heute:</b> %0.2f Liter<br>".
          "<b>Durchfluss:</b> %0.2f Liter/min",
          ReadingsVal($name,"value",0),
          $dayval[3]*1000,
          ReadingsVal($name,"flow",0)
         );;
}


Schau dir mal das Attribut singularReadings im statistics-Modul an.

Zitat von: pink99panther am 17 November 2020, 20:45:45

valueHour:readout.* {
  my ($d,$value) = split(" ",ReadingsVal($name,"statValue","Hour: 0 Day: 0 Year: 0"));;
  $value*1000;;
},
valueDay:readout.* {
  my ($d1,$d2,$d3,$value) = split(" ",ReadingsVal($name,"statValue","Hour: 0 Day: 0 Year: 0"));;
  $value*1000;;
},


Dito.

Den Rest schaue ich mir mal an, wenn mein Device läuft.

eki

Zitat von: pink99panther am 17 November 2020, 22:44:10
Hat leider nicht geholfen.
Die m³ fehlen immer noch.

Oh man, manchmal ist man echt blind. Das Problem ist schon die Zeile, die ich genannt habe. Das Problem ist, dass bei der Prüfung von einer Art eingeschwungenem Zustand ausgegangen wird (ich hatte den Fall, dass durch Falscherkennung ein Kubikmeter zu viel gemeldet wurde), da bei Dir aber der readout Wert und der value Wert sich um mehr als 1 unterscheiden, schlägt das immer zu.
Entweder du löscht diese Zeile ganz (mit den richtigen Einstellungen beim esp32-cam sollte dieser Fehler eigentlich laut jomjol nicht passieren) oder Du setzt einmal künstlich den value Wert mit set reading auf letzten readout Wert (in etwa so: "setreading MQTT2_wasser value 182.585" in der Fhem Kommandozeile eingeben).

Warum bei Dir das deltaReading nicht klappt, verstehe ich gerade auch nicht, da sollte dann ein Reading statValue mit einem Inhalt "Hour: xxx Day: xxx Month: xxx Year: xxx" entstehen.

eki

Zitat von: Christoph Morrison am 18 November 2020, 00:23:51
Schau dir mal das Attribut singularReadings im statistics-Modul an.

Dito.

Den Rest schaue ich mir mal an, wenn mein Device läuft.

Bei mir hat singularReadings in Zusammenhang mit deltaReadings nicht funktioniert.

Frank_Huber

Hi Ho! :-)

Kurze Frage, wo finde ich denn Infos zum MQTT client der integriert sein soll?
Ich habe heute nach https://github.com/jomjol/AI-on-the-edge-device/wiki/Installation die Installation vollzogen, finde aber die Optionen für MQTT nicht.
Bin ich nur blind?

Grüße
Frank

rcmcronny

Kannst Du doch im Webfrontend einstellen beim Setup :) Ist im Standard auskommentiert (in der .ini Datei :)