DBLog bei Bedingung

Begonnen von Arek, 08 Mai 2021, 09:54:10

Vorheriges Thema - Nächstes Thema

Arek

Hallo zusammen,

ich suche eine Möglichkeit Daten ins DBLog zu schreiben  nur unter einer bestimmten Bedingung für ein Device. Ziel ist es Temperaturen zu loggen nur wenn die Pumpe läuft, am besten erst nachdem die Pumpe 5min gelaufen ist.
Wie kann ich sowas realisieren?

Schöne Grüße
Arek

DS_Starter

Hallo Arek,

das ist sehr einfach möglich mit Anweisungen/Auswertungen im DbLog Attr valueFn.
Man muß nur etwas Perl dazu können.

Grüße,
Heiko
ESXi@NUC+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

Arek

Hallo Heiko,

danke für deine Antwort. Ich habe mich nun über valueFN gelesen und erste Versuche gestartet. Leider habe ich es nicht zum Laufen bekommen.
Ich habe ein dummy erstellt, der die Pumpe simuliert und im loggenden Device folgendes gesetzt:

dblogValueFN
{
  if ($DEVICE eq "testdummy" && $READING eq "state" && $VALUE eq "off"){
    $IGNORE=1;
  }
}

Was mache ich falsch?

Schöne Grüße

DS_Starter

Das Attr dblogValueFN musst du im Device "testdummy" setzen. Hast du das so gemacht ?
ESXi@NUC+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

Arek

Wenn ich es im testdummy anlege woher weiß dann das loggende Device wann es die logs nicht speichern soll?

DS_Starter

#5
Also ich meinte damit dass man dblogValueFn immer in dem Quelldevice anlegen muss, dessen Werte geloggt werden sollen und nicht im DbLog.
Im DbLog benutzt man das Attr valueFn als zentrale Funktion.

Wenn ich mir deinen use case anschaue, müsstest du besser valueFn im DbLog nutzen und die Funktion noch etwas ausbauen.
Du musst schauen, wenn eine Temperatur des Devices X geloggt werden soll, ob die Bedingung "Pumpe an" auch erfüllt ist. Nun weiß ich nicht ob die Temperatur auch von dem Pumpendevice kommt oder nicht.

Sinngemäß wäre die Funktion im DbLog zu setzen, z.B. so:


valueFn
{
  if ($DEVICE eq "<Temperatur-Device>" && $READING eq "<Temperatur-Reading>") {
    $IGNORE=1 if(ReadingsVal("<Pumpe>", "<Pumpen-Reading>", "on") ne "on");
  }
}


Bedeutet also wenn die Pumpe nicht "on" ist, wird das Loggen des Temp-Device mit dem Temp-Reading nicht ausgeführt.
Das kann man natürlich noch ausbauen und verfeinern. Kommt mir nur darauf an dass du das Prinzip verstanden hast.

Ähnlich kann man dblogValueFn  verwenden, wobei dieses Attr immer im Quellendevice zu setzen ist, also bei dir in dem Quellendevice für die Temperatur.

Grüße,
Heiko
ESXi@NUC+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

Arek

Perfekt Danke! Jetzt geht es. Sowohl ValueFN im dblog als auch DbLogValueFN im device.
Aber wie bekomme ich es hin, dass erst 5min Pumpenlaufzeit geloggt wird? Mein Ansatz wäre ein notify zu erstellen, der nach Pumpenstart um 5min verzögert (mit sleep oder at) einen dummy schaltet. Geht es auch besser?
Schöne Grüße

DS_Starter

#7
Naja, du brauchst irgendwein Reading welches die Laufzeit seit Start der Pumpe enthält. Das wäre dann ebenfalls leicht in die Funktion integrierbar.
Hättest du eines ?

Wenn nicht, könntest du durchaus deine notify-Idee mit at verwenden. Ich würde aber ein Reading im Pumpendevice setzen, z.B. "runningtimeReached = 1". Dann hast du die Info gleich im Pumpendevice.
Beim Start der Pumpe müsstest du das Reading immer direkt auf "0" setzen, was ebenfalls gleich in dem notify erledigt werden könnte.

Die Funktion könnte man dann so ergänzen:


valueFn
{
  if ($DEVICE eq "<Temperatur-Device>" && $READING eq "<Temperatur-Reading>") {
    $IGNORE=1 if(ReadingsVal("<Pumpe>", "<Pumpen-Reading>", "on") ne "on" || !ReadingsVal("<Pumpe>", "runningtimeReached ", 0));
  }
}


Wenn ich es richtig sehe, reicht es auch aus, nur !ReadingsVal("<Pumpe>", "runningtimeReached ", 0) auszuwerten in dem Fall. Denn solange "0" wird nicht geloggt.
ESXi@NUC+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

Arek

notify Pumpe
{
         if(ReadingsVal("Pumpe","state","") eq "on" ) {
                     fhem("sleep 150 ; setreading Temperatur logging on" )

         } elsif(ReadingsVal("Pumpe","state","") eq "off" ) {
                     fhem("setreading Temperatur logging off")
        }
}


DbLogValueFn
{
  if ($DEVICE eq "Temperatur" && $READING eq "temperature") {
    $IGNORE=1 if(ReadingsVal("Temperatur", "logging", "off") eq "off");
  }
}


Funktioniert. Danke!

Schöne Grüße
Arek

Frank_Huber

Moin,
Ein anderer Ansatz könnte auch sein z. B. mit DOIF und dem addlog Befehl zu arbeiten.
Erst wenn die Bedingungen erfüllt sind wird geloggt und das dann wiederholt bis die Bedingung nicht mehr erfüllt ist.