FHEM Forum

FHEM => Automatisierung => Thema gestartet von: Arek am 08 Mai 2021, 09:54:10

Titel: DBLog bei Bedingung
Beitrag von: Arek am 08 Mai 2021, 09:54:10
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
Titel: Antw:DBLog bei Bedingung
Beitrag von: DS_Starter am 08 Mai 2021, 10:21:43
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
Titel: Antw:DBLog bei Bedingung
Beitrag von: Arek am 08 Mai 2021, 11:45:17
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
Titel: Antw:DBLog bei Bedingung
Beitrag von: DS_Starter am 08 Mai 2021, 12:47:25
Das Attr dblogValueFN musst du im Device "testdummy" setzen. Hast du das so gemacht ?
Titel: Antw:DBLog bei Bedingung
Beitrag von: Arek am 08 Mai 2021, 13:12:45
Wenn ich es im testdummy anlege woher weiß dann das loggende Device wann es die logs nicht speichern soll?
Titel: Antw:DBLog bei Bedingung
Beitrag von: DS_Starter am 08 Mai 2021, 19:33:59
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
Titel: Antw:DBLog bei Bedingung
Beitrag von: Arek am 08 Mai 2021, 23:11:56
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
Titel: Antw:DBLog bei Bedingung
Beitrag von: DS_Starter am 08 Mai 2021, 23:25:29
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.
Titel: Antw:DBLog bei Bedingung
Beitrag von: Arek am 09 Mai 2021, 10:07:05
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
Titel: Antw:DBLog bei Bedingung
Beitrag von: Frank_Huber am 09 Mai 2021, 11:00:17
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.