Plot der Intervall-Länge von on/off Schaltern

Begonnen von chiborg, 17 Januar 2014, 14:19:56

Vorheriges Thema - Nächstes Thema

chiborg

Ich habe in meiner Web-Oberfläche einen on/off Schalter, dessen Status ich plotte. Jetzt möchte ich gerne die Länge der on-Phasen plotten (ggf. zusätzlich das Delta zur letzten Phase). Das Log-File sieht so aus:

2014-01-17_11:11:38 te.Test_Button on
2014-01-17_11:13:47 te.Test_Button off
2014-01-17_11:14:03 te.Test_Button on
2014-01-17_11:37:47 te.Test_Button off
2014-01-17_12:31:47 te.Test_Button on
2014-01-17_13:08:19 te.Test_Button off


Die Intervall-Länge kann ich mit folgendem Perl-Programm ausgeben:

Code (perl) Auswählen
($year,$mon,$day,$h,$m,$s) = split(/[-_:]+/,$F[0]);
$ts = timelocal($s,$m,$h,$day,$mon-1,$year);
if($F[2] =~ "on") {
    $start = $ts;
}
else {
    $end = $ts;
    $interval = $end-$start;
    print "$F[0] $interval\n";
}


Nun meine Frage: Wie baue ich den Perl-Befehl (z.B. als one-Liner) in die gplot-Datei ein? Oder muss ich den Code woanders unterbringen (z.B. als sub in 99_Utils.pm) und in der gplot-datei irgendwie referenzieren?

UliM

Hi,
Du müsstest die Werte des Schalters (mit dem Befehl trigger) und die berechneten Werte aus Deiner Routine in ein neues, gemeinsames logfile schreiben und dann dessen Inhalt plotten.
=8-)
RPi4/Raspbian, CUL V3 (ca. 30 HomeMatic-devices), LAN (HarmonyHub, alexa etc.).  Fördermitglied des FHEM e.V.

justme1968

das geht nicht direkt beim plotten.

am einfachsten ist es neue readings direkt im device zu erzeugen und mit ins gleiche log file logen zu lassen. das geht entweder per user reading oder deiner routine und setreading oder trigger mit HourCounter (http://www.fhemwiki.de/wiki/HourCounter) verwenden.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

chiborg

Zitat von: UliM am 17 Januar 2014, 14:31:01
Du müsstest die Werte des Schalters (mit dem Befehl trigger) und die berechneten Werte aus Deiner Routine in ein neues, gemeinsames logfile schreiben und dann dessen Inhalt plotten.

Danke für den Tip, ich habe das mal wie folgt umgesetzt:

define te.Test_Button dummy
attr te.Test_Button alias Test Button
attr te.Test_Button setList on off

define FileLog_te.Test_Button FileLog log/te.Test_button-%Y-%m.log te.Test_Button.*
define SVG_FileLog_te.Test_Button_1 SVG FileLog_te.Test_Button:SVG_FileLog_te.Test_Button_1:CURRENT

define te.Test_Button_Interval_Value dummy
define te.Test_Button_Interval_Begin dummy

define te.Test_Button_Trigger1 notify te.Test_Button:on { my $start=time_str2num("");; fhem("set  te.Test_Button_Interval_Begin $start") }
define te.Test_Button_Trigger2 notify te.Test_Button:off { my $end=time_str2num("");; my $start=Value("te.Test_Button_Interval_Begin");; my $interval=$end-$start;; fhem("trigger te.Test_Button_Interval_Value $interval") }


Das Logfile enthält nun die benötigten Daten und ich kann sie erolgreich plotten.

Ich habe lange Zeit versucht, ohne te.Test_Button_Interval_Value auszukommen und statt dessen nur ein "trigger te.Test_Button $interval" auzuführen. Das hat aber nichts in das FileLog geschrieben und im Haupt-Logfile erschien dann immer die Meldungen, die beim Start von FHEM auftauchen(Including fhem.cfg, etc). Das sieht für mich so aus, als würde der trigger-Befehl den FHEM "abschießen". Den gleichen Befehl in der Web-Oberfläche einzugeben hat einwandfrei funktioniert. Kann es sein, dass man innerhalb von notify nicht für das selbe device triggern darf?

rudolfkoenig

ZitatKann es sein, dass man innerhalb von notify nicht für das selbe device triggern darf?

Ja, um Rekusion zu vermeiden. Sollte aber stillschweigend ignoriert werden.

justme1968

vielleicht magst du dir das mit den user readings ja doch noch mal anschauen. das spart zwei dummys und du kannst das gleiche log file weiter verwenden.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

chiborg

Zitat von: justme1968 am 17 Januar 2014, 18:14:38
vielleicht magst du dir das mit den user readings ja doch noch mal anschauen. das spart zwei dummys und du kannst das gleiche log file weiter verwenden.

Waahnsinn, großartig!
Habe die notifies und dummies gelöscht und folgende Zeile hinzugefügt:
attr te.Test_Button userReadings interval_start:on { time_str2num("") } , interval_length:off { my $end =time_str2num("") ;; my $start=ReadingsVal("te.Test_Button", "interval_start", 0);; $end-$start }

Einziger Wermutstropfen: Die Plotdefinition kann ich nicht mehr im Webinterface bearbeiten, weil ich für das Plotting des Zustands die Regex "Test_Button.(on|off)" brauche, die Weboberfläche sie mir aber mit "Test_Button.*" überschreibt. Ist aber zu verschmerzen.