Ein bestimmtes Reading soll täglich nur 1mal geloggt werden => DbLogValueFn ?

Begonnen von ulobo60, 23 November 2021, 20:20:17

Vorheriges Thema - Nächstes Thema

ulobo60

Gut's Nächtle allerseits,

habe seit ein paar Wochen eine neue Viessmann-Heizung.
Deren Mobile-App ist für meine Zwecke zum 'kleinen Einstellen zwischendurch' suppi zu gebrauchen.
Aber: ich möchte gerne in mein FTUI eine Grafik einbauen, die langfristig den zeitlichen Verlauf der Aussentemperatur und den jeweils gestrigen Gesamt-Tages-Verbrauch in Kilowatt darstellt.

Dazu habe ich im installierten Modul "Vitoconnect" folgende Attribute eingebaut:

DbLoginclude .*(Aussentemperatur|Gasverbrauch_gestern)
userReadings Gasverbrauch_gestern:Gasverbrauch_Total/Tag.* { (split /,/, ReadingsVal("vitoconnect","Gasverbrauch_Total/Tag",0))[1] }

Mein Abfrage-Intervall der Daten beträgt 3600 Sekunden.

Mein Problem ist, dass auf diese Art meiner Abfrage 24mal am Tag der Wert für den gestrigen Gasverbrauch ins Log geschrieben wird. Ist 1. unnütz und 2. schlecht für die grafische Darstellung :)

Nun bin ich auf das userReading 'DbLogValueFn' gestoßen.
Ich hänge jetzt leider fest mit folgender Annahme:

Wenn...
READING 'Gasverbrauch_gestern' mit 'DATE_von_heute' schon im Log vorhanden ist,
Dann...
IGNORE=1


Ich selber kann dies leider programmtechnisch nicht umsetzen.
Ich bitte um Eure Hilfe mit Dank im Voraus.
3x raspi + cam-Modul mit mmal-motion - 2x raspi mit KODI - 1x raspi mit FHEM + FTUI

DS_Starter

Eine Möglichkeit wäre im Quellendevice ein Userreading als Statusreading erstellst. Also z.B. ein Reading "alreadyLogged" zusätzlich zu deinem "Gasverbrauch_gestern" mit der gleichen Bedingung. "alreadyLogged". Du setzt es dabei einfach auf "1".
Dann könntest du das Reading nur in  'DbLogValueFn'  (oder valueFn) auf Vorhandensein bzw. den Wert "1" testen:


{
  if ($READING eq "Gasverbrauch_gestern" && ReadingsVal("vitoconnect", "alreadyLogged", 0) {
  $IGNORE=1;
}


Wenn das Reading "alreadyLogged" mit einem Wert ungleich 0 existiert wird ein Loggen von  'Gasverbrauch_gestern' verhindert.
Jetzt musst du nur noch das Reading "alreadyLogged" mit einem geeigneten Verfahren (ein simples at) täglich zu einer dir genehmen Zeit wieder auf 0 setzen um das Logging freizuschalten.

Grüße,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Beta-User

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

ulobo60

Wow - rasend schnelle Antworten. Vielen Dank !

@Beta-User: no, ich nutze nicht gplot sondern generell das FTUI Chart Widget zwecks Darstellung aller FHEM-Anzeigen auf Tablets/Monitoren

@DS-Starter
hi Heiko,
ich bin nicht sicher, ob ich Dich richtig verstanden habe.

Hintergrund (ich muss es auch mal für mich noch mal runterschreiben):
o Da ich mein Abruf-Intervall auf 3600 gesetzt habe, bekomme ich täglich 24 Werte zur Temperatur und zum Vortags-Gasverbrauch.
o Viessmann scheint den "Gasverbrauch_gestern" zwischen 00:00 Uhr und 01:00 Uhr zu aktualisieren. Ab dann bekomme ich derzeit dieses Reading stündlich, also noch 23mal mit dem gestrigen Verbrauchswert geliefert.

Das bedeutet: um 00:00 Uhr muss "alreadyLogged" auf "0" gesetzt werden, ab 01:00 Uhr muss "alreadyLogged" auf "1" gesetzt werden.

Du hattest geschrieben "...nur noch das Reading "alreadyLogged" mit einem geeigneten Verfahren (ein simples at) täglich zu einer dir genehmen Zeit wieder auf 0 setzen..." ähem, ich habe keinen blassen Schimmer, wie :( . Wäre ein Vorgabe Deinerseits möglich???

Noch ne Kleinigkeit: in Deinem Code steht in der 2. Zeile hinten "{". Ist das korrekt oder ein Tippfehler?
Wenn's um's Codieren geht, bin ich doch noch sehr unsicher.

Nochmals vielen Dank für Deine Mühen.
lg
Ulf

3x raspi + cam-Modul mit mmal-motion - 2x raspi mit KODI - 1x raspi mit FHEM + FTUI

DS_Starter

Hallo Ulf,

gestern war es doch schon etwas spät um nochmal drüber nachzudenken und (Tipp)Fehler zu bereinigen und
habe es mir jetzt nochmal durch den Kopf gehen lassen.
Du erstellst das Attr 'DbLogValueFn' in dieser Form:


{
  if ($READING eq "Gasverbrauch_gestern" {
      if (ReadingsVal("vitoconnect", "alreadyLogged", 0)) {
           $IGNORE=1;
      }
      else {
           fhem("setreading vitoconnect alreadyLogged 1");
      }
  }
}


Was passiert ? Wird der Event "Gasverbrauch_gestern" erzeugt/verarbeitet und ist das Reading  "alreadyLogged" mit einem Wert ungleich 0 vorhanden, wird kein Logging ausgeführt. Im anderen Fall wird der Event in die DB geschrieben und "alreadyLogged"  mit dem Wert "1" gesetzt.
Danach auftrende Events "Gasverbrauch_gestern" werden nicht mehr geloggt.

Nun brauchst du noch das at um das Reading täglich auf "0" zu setzen.
Ein solches at wäre z.B.:


define enable_Gasverbrauch_logging at *00:00:30 setreading vitoconnect alreadyLogged 0


Jeden Tag 30 Sekunden nach Mitternacht wird das Reading auf 0 gesetzt. Genau um 00:00:00 würde ich so etwas nicht tun.
Das wäre ein einfacher Vorschlag um dein Szenario zu realisieren.
Jetzt musst du es natürlich erstmal ausprobieren. Ich hoffe keinen Syntaxfehler eingebaut zu haben.  ;)

Grüße,
Heiko
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Beta-User

Evtl. noch ein etwas anderer Ansatz:
userReadings Gasverbrauch_gestern:Gasverbrauch_Total/Tag.* { (split /,/, ReadingsVal($name,'Gasverbrauch_Total/Tag',0))[1] if (localtime)[2] < 1 }(Unterstellt, das Ausgangsreading gehört auch zu "vitoconnect").
Damit wird das Reading nur in der Zeit zwischen 00:00 Uhr und 01:00 Uhr aktualisiert.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

ulobo60

Klasse, danke! Beide Vorschläge sehen sehr gut aus.
Und vielen Dank an DS-Starter für die Ablauf-Erklärungen. Genau das Richtige für einen "so gut wie gar nicht"-Programmierer wie mich :)

@ Beta-User: wow - ein nettes Shorty!  8)
Und JA, das Ausgangsreading gehört auch zu "vitoconnect".

Werde jetzt beide Versionen testweise für je 3 Tage/Nächte verwenden.
Meine bisherige Erkenntnis, dass 'Gasverbrauch_Total/Tag' immer zwischen 00 und 01 Uhr durch Viessmann aktualisiert wird, möchte ich auch noch absichern.
In ca. 1 Woche füge ich dann für die Nachwelt einen Screenshot der FTUI-Grafik hier ein und werde das Thema als GELÖST abschließen.

Nochmals ein großes Dankeschön an Euch Beide.
lg
Ulf
3x raspi + cam-Modul mit mmal-motion - 2x raspi mit KODI - 1x raspi mit FHEM + FTUI

Beta-User

 :) Gerne.

Vielleicht noch eine Ergänzung: Falls - warum auch immer - die Aktualisierung ausfällt, könntest du zusätzlich noch "oder"-prüfen, ob ReadingsAge() auf das Reading > DAYSECONDS ist (evtl. etwas weniger). Dann passiert das mit deutlich erhöhter Wahrscheinlichkeit wenigstens einmal am Tag...
(Bitte melden, wenn du das nicht in Code umgesetzt bekommst).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

ulobo60

@Beta-User
Klasse Variante + 10.000mal besser als eine optische Kontrolle (wozu gibt's denn die EDV?!) ...
Ich muss aber leider Dein Angebot annehmen und Dir melden, dass ich den Code nicht hinbekomme  :( .
Hab' zwar jetzt einiges in der FHEM-Referenz gelesen zum Thema 'ReadingsAge' sowie im WIKI zu 'Verfahren zum Rechnen mit Zeitangaben, die als Zeichenkette vorliegen' ... aber ich scheitere an der Umsetzung, dies alles in passenden und korrekten Code umzusetzen.
Please help  :-[
lg
Ulf
3x raspi + cam-Modul mit mmal-motion - 2x raspi mit KODI - 1x raspi mit FHEM + FTUI

Beta-User

Ungetestet:
userReadings Gasverbrauch_gestern:Gasverbrauch_Total/Tag.* { (split /,/, ReadingsVal($name,'Gasverbrauch_Total/Tag',0))[1] if (localtime)[2] < 1 || ReadingsAge($name,'Gasverbrauch_gestern', DAYSECONDS) > DAYSECONDS - 1800 }
Erläuterungen zur Ergänzung:
"||" ist (u.a. in Perl) "oder"
ReadingsAge fragt das Alter eines Readings ab, Rückgabe ist ein Sekundenwert. Gibt es kein Reading, greift das ins Leere, hier wird dann eben die Länge eines Tages in Sekunden zurückgegeben (das ist eine in FHEM (im main-Kontext) verfügbare Konstante).
Ist das dann "zu alt" (also knapp einen Tag alt), darf aktualisiert werden...

Falls es übrigens nur ums Loggen geht, gäbe es eine weitere Variante: einfach via "addLog" einen Wert ins Log-File bzw. die Datenbank schreiben (kann u.a. ein "at" machen)...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

ulobo60

@Beta-User
Danke.
Hatte Dein userReading von 11:19 Uhr gegen 13:00 Uhr "eingebaut" (per STRG+C/STRG+P)   ;). Funzt suppi.
Seither gibt es in der DB keine Werte mehr, die die Grafik verhunzen.
Okay, Einträge in der DB erfolgen noch, die sind aber ohne Werte.
Einen Screenshot davon habe ich angehängt.
Da ich jährlich meine DB säubere, werden die dann auch verschwinden.
Bin mal auf morgen früh gespannt, ob und wann der Eintrag zum gestrigen Gasverbrauch erscheint.
Werde mich morgen früh noch mal melden und übers Ergebnis berichten.

Ja, es geht mir nur ums Logging.
Aber ich würde gern bei Deiner aktuellen Version bleiben. Es sei denn, der Experte rät mir zur neuen Version (...mit "at" machen...).

Bis hierhin erst mal tsd. Dank
lg
Ulf
3x raspi + cam-Modul mit mmal-motion - 2x raspi mit KODI - 1x raspi mit FHEM + FTUI

Beta-User

Zitat von: ulobo60 am 24 November 2021, 17:00:05
Es sei denn, der Experte rät mir zur neuen Version (...mit "at" machen...).
Weiß nicht, ob ich damit gemeint gewesen war, aber:
- die "at"/addLog-Sache hat den Vorteil, dass man ggf. "ein at für alle solche Fälle" basteln kann und die Event-Verarbeitung nicht mit weiteren Verarbeitungslogiken belastet;
- dafür "kauft" man sich den Nachteil, dass ggf. komplett veraltete Daten in die DB geschrieben werden (es sei denn, das at würde das Alter des Ausgangsreadings prüfen).

Kurz-Summary: Da hier zum einen ein sauberer Trigger exisitiert und zum anderen das update-Intervall für die Ausgangsdaten eher als "mäßig" bezeichnet werden kann, halte ich _hier_ den userReadings-Weg für vorzugswürdig (falls man nicht doch z.B. LogProxy auch für FTUI-Zwecke einsetzen kann und damit einfach den Zeitstempel der Ausgangsdaten passend umbiegen kann... Daten, die man bei Bedarf errechnen kann, sind m.E. vorzugswürdig gg. denen, die man für's Darstellen erst erzeugen und mit loggen muss ;) ).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

DS_Starter

Ich denke auch es ist eine Frage der persönlichen Vorliebe. Das in DbLog eingebaute addlog hat noch den Charme dass du in diesem Fall die leeren Datensätze in der DB vermeidest. In dem Fall kann das Userreading auch komplett ohne Event arbeiten.
addLog braucht es nicht.
Andererseits lässt sich eine DB auch leicht bereinigen. Einfach regelmäßige Läufe mit DbRep eingeplant wirft alles raus was man nicht mehr braucht (richtig eingestellt natürlich).
Jetzt hast du wirklich einige Varianten verfügbar   :)
Proxmox+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

ulobo60

Liebe beiden Helper,
bin beeindruckt ob Eurer Kompetenz.
Was würden wir 'normale' FHEM-Anwender ohne Euch machen?
Für mich gültige Antwort: nur Stückwerk.

Ich belasse es auf jeden Fall erst mal bei der bisher eingebauten Programmierung und liefere morgen Vormittag meinen Bericht ab.

lg
Ulf
3x raspi + cam-Modul mit mmal-motion - 2x raspi mit KODI - 1x raspi mit FHEM + FTUI

ulobo60

@Beta-User und DS_Starter:
Alles ist gut.
Es wird nur 1 Wert täglich für das reading 'Gasverbrauch_gestern' in der Datenbank gespeichert (siehe Screenshot 'vitoconnect_mysql.jpg').
Habe mal ermittelt, dass die Einträge ohne Wert jährlich gerade mal 0,8 MB in der DB belegen werden.
Trotzdem werde ich sie natürlich beim jährlichen Bereinigungsdurchgang löschen.
Die aktuelle Ansicht meines FTUI-Charts siehe unten ('vitoconnect_chart.jpg').

Eigentlich müßte ich die Werte für 'Gasverbrauch_gestern' um 1 Tag nach vorn verschieben. Aber 1. weiß ich wieder mal nicht, wie man das anstellt. Und 2. macht das Chart für mich erst dann richtig Sinn, wenn hier Vergangenheitsdaten von 1 bis 2 Jahren vorliegen. Dann aber ist der 1-Tages-Versatz unerheblich.

Euch Beiden danke ich recht herzlich für die tollen und kompetenten Programmier-Tipps und Erklärungen.
Wenn Ihr nichts dagegen habt, werde ich heute Nachmittag das Thema als "Gelöst" kennzeichnen.
Beste Grüße
Ulf
3x raspi + cam-Modul mit mmal-motion - 2x raspi mit KODI - 1x raspi mit FHEM + FTUI