[gelöst] addLog bei Dummy ohne "state" im Logfile

Begonnen von r00t2, 30 Juli 2018, 18:34:21

Vorheriges Thema - Nächstes Thema

r00t2

Hallo zusammen,

ich habe einen Dummy, der den aktuellen Dieselpreis hält:
defmod tra_Fuel_Diesel dummy
attr tra_Fuel_Diesel event-on-change-reading state
attr tra_Fuel_Diesel group Benzinpreise
attr tra_Fuel_Diesel icon sani_return_temp
attr tra_Fuel_Diesel room Verkehr



Da sich der Preis nur selten ändert lasse ich das ganze per addLog "at" um kurz vor und kurz nach Mitternacht zusätzlich loggen. Das notify dazu schaut so aus:
defmod addLog notify addLog {\
addLog("sw_Stehlampe","state");;\
...
addLog("tra_Fuel_Diesel","state");;\
}
attr addLog group FHEM Services
attr addLog room System

setstate addLog 2018-07-30 00:01:00
setstate addLog 2018-07-24 19:10:36 state active



Das addLog wird auch wie gewünscht getriggert, jedoch schreibt es nicht den String "state" mit ins Logfile, sodass meine grafische Auswertung die Einträge des Logfiles nicht berücksichtigt:
2018-07-28_07:25:02 tra_Fuel_Diesel state: 1.30
2018-07-28_11:45:03 tra_Fuel_Diesel state: 1.29
2018-07-28_13:15:03 tra_Fuel_Diesel state: 1.27
2018-07-28_23:59:00 tra_Fuel_Diesel 1.27   << addLog
2018-07-29_00:01:00 tra_Fuel_Diesel 1.27   << addLog
2018-07-29_08:25:03 tra_Fuel_Diesel state: 1.29
2018-07-29_17:25:03 tra_Fuel_Diesel state: 1.27
2018-07-29_23:59:01 tra_Fuel_Diesel 1.27   << addLog
2018-07-30_00:01:00 tra_Fuel_Diesel 1.27   << addLog
2018-07-30_06:45:03 tra_Fuel_Diesel state: 1.30
2018-07-30_15:20:02 tra_Fuel_Diesel state: 1.29



Was muss ich tun, damit das "state" von addLog mit ins Logfile geschrieben wird?

Danke für eure Unterstützung.
FHEM 6.0 (Raspberry Pi 2 B | Raspberry Pi OS Lite | Perl 5.28.1 | UZB Z-WAVE.Me | Hue Bridge V1 | SIGNALDuino 433 MHz | FritzBox | Kodi | Pioneer AVR | MQTT | Node-RED | Diverse Google Dienste)

betateilchen

Zitat von: r00t2 am 30 Juli 2018, 18:34:21
Was muss ich tun, damit das "state" von addLog mit ins Logfile geschrieben wird?

Da fallen mir spontan mindestens drei Lösungsansätze ein...


  • Die von Dir irgendwo abgelegte Funktion addLog() so umschreiben, dass der angegebene readingName mit ins Log geschrieben wird.
  • Oder anstatt mit einem selbstdefiniert addLog() mit dem FHEM-eigenen Befehl "trigger" arbeiten.
  • Oder mit DbLog anstatt mit FileLog arbeiten und das dort enthaltene Kommando "set ... addLog device:reading" verwenden.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

r00t2

#2
Danke für Deine Antwort.

Ich habe die Implementierung aus dem Wiki übernommen: https://wiki.fhem.de/wiki/Plot-Abriss_vermeiden

sub
addLog($$) {
  my ($logdevice, $reading) = @_; # device and reading to be used
  my $logentry = ReadingsVal($logdevice,$reading,"addLog: invalid reading");
  if ($reading =~ m,state,i) {
    fhem "trigger $logdevice $logentry   << addLog";
  } else {
    fhem "trigger $logdevice $reading: $logentry   << addLog";
  }
}



Ich bin kein Perl Spezi (eher C), vermute aber, dass diese Stelle ausschlaggebend ist:
  if ($reading =~ m,state,i) {
    fhem "trigger $logdevice $logentry   << addLog";


Kann mir bitte mal jemand die if-Abfrage erklären? Ich vermute ja, dass es sich um das Erkennen des Substrings "state" handelt und wenn dieser erkannt wurde, wird das Logfile ohne den String "state" getriggert. Jedoch weiß ich nicht wo 'm' und 'i' herkommen. Pattern 'm'atching, case'i'nsensitive?


Ich hätte diese Zeilen jetzt - analog zum else-Zweig so abgeändert:
  if ($reading =~ m,state,i) {
    fhem "trigger $logdevice $reading: $logentry   << addLog";



Alternativ hätte ich die Abfrage auch komplett rausgenommen, sodass die komplette Funktion wie folgt aussieht:

sub
addLog($$) {
  my ($logdevice, $reading) = @_; # device and reading to be used
  my $logentry = ReadingsVal($logdevice,$reading,"addLog: invalid reading");
  fhem "trigger $logdevice $reading: $logentry   << addLog";
}



Handle ich mir damit ggf. Seiteneffekte ein, wenn andere Devices die Funktion verwenden (bei denen ich etwas anderes als "state" triggern möchte)?
FHEM 6.0 (Raspberry Pi 2 B | Raspberry Pi OS Lite | Perl 5.28.1 | UZB Z-WAVE.Me | Hue Bridge V1 | SIGNALDuino 433 MHz | FritzBox | Kodi | Pioneer AVR | MQTT | Node-RED | Diverse Google Dienste)

r00t2

#3
Da eine Anpassung der original "addLog" Funktion doch einige Seiteneffekte gebracht hätte (z. B. hätte ich alle Plots für Devices ändern müssen, bei denen ich "state" plotte ohne es im Log stehen zu haben - z. B. Steckdosen), habe ich einen anderen Ansatz gewählt.

Um zukünftig alle Devices, bei denen ich ein "state" mit im Log haben möchte, über nur eine Funktion analog zu addLog laufen lassen zu können, habe ich "addLogState" wie folgt implementiert:
sub
addLogState($$) {
  my ($logdevice, $reading) = @_; # device and reading to be used
  my $logentry = ReadingsVal($logdevice,$reading,"addLogState: invalid reading");
  fhem "trigger $logdevice $reading: $logentry   << addLogState";
}


Die Funktion kann genauso wie addLog per notify (getriggert von einem "at") mit verschiedenen Devices angestoßen werden.

Das schöne daran ist, wenn man schon "addLog" verwendet, kann man die bereits vorhandenen "at" einfach erweitern.
"at" für vor Mitternacht _ohne_ "addLogState":
define a_midnight1 at *23:59 trigger addLog

"at" für vor Mitternacht _mit_ "addLogState":
define a_midnight1 at *23:59 trigger addLog,addLogState

Nach Mitternacht funktioniert analog dazu.

Bei mir läuft das Konstrukt noch in der Testphase, scheint aber das gewünschte Ergebnis zu bringen. Vielleicht hilft es ja jemand, der eine ähnliche Aufgabenstellung hat.
FHEM 6.0 (Raspberry Pi 2 B | Raspberry Pi OS Lite | Perl 5.28.1 | UZB Z-WAVE.Me | Hue Bridge V1 | SIGNALDuino 433 MHz | FritzBox | Kodi | Pioneer AVR | MQTT | Node-RED | Diverse Google Dienste)