FHEM Forum

FHEM => Frontends => SVG / Plots / logProxy => Thema gestartet von: chiborg am 17 Januar 2014, 14:19:56

Titel: Plot der Intervall-Länge von on/off Schaltern
Beitrag von: chiborg am 17 Januar 2014, 14:19:56
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?
Titel: Antw:Plot der Intervall-Länge von on/off Schaltern
Beitrag von: UliM am 17 Januar 2014, 14:31:01
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-)
Titel: Antw:Plot der Intervall-Länge von on/off Schaltern
Beitrag von: justme1968 am 17 Januar 2014, 15:21:41
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 (http://www.fhemwiki.de/wiki/HourCounter)) verwenden.

gruss
  andre
Titel: Antw:Plot der Intervall-Länge von on/off Schaltern
Beitrag von: chiborg am 17 Januar 2014, 18:10:11
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?
Titel: Antw:Plot der Intervall-Länge von on/off Schaltern
Beitrag von: rudolfkoenig am 17 Januar 2014, 18:12:22
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.
Titel: Antw:Plot der Intervall-Länge von on/off Schaltern
Beitrag 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.

gruss
  andre
Titel: Antw:Plot der Intervall-Länge von on/off Schaltern
Beitrag von: chiborg am 17 Januar 2014, 20:15:47
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.