Ich habe eine sub in der 99_myutils die einen Mittelwert aus logs berechnet.
Der Aufruf als Kommando Zeile in Fhem funktioniert einwandfrei.
{myAverage("86400"*30, "FileLog_AktuellerVerbrauch_cumDay" , "4:::")}
Das Ergebnisse ist korrekt.
Aber wie bekomme ich das Resultat bzw. Wie lautet der Syntax
Wenn ich das Ergebnis dieser Funktion in einer reading Gruppe oder eines dummy anzeigen möchte..?
Der Mittelwert steht in der sub in einer Variable, dann kannst du mit fhem "set <name des dummy> $var" das Ergebnis in ein dummy schreiben.
P.S. oder poste mal die sub
VG
Frank
Ja die variable habe ich gefunden.
$avg
Kannst du mir mal kurz den den Syntax schreiben.
Also Definition des dummy Aufruf der sup innerhalb des Dummy und Zuweisung bzw. Anzeige des Ergebnisses.
Bekomme es nicht hin.
Ist doch ganz einfach, lege ein dummy an:
define <name> dummy
und dann, in der sub
fhem "set <name> $avg";
mehr ist das nicht ;)
VG
Frank
Das muss in die sub?? fhem "set <name> $avg";
Nicht in die fhem.cfg
Und wie erfolgt dann der Aufruf der sub in der fhem.cfg bzw. Dummy
Grundlagen lesen!!
Die sub über notify oder ein at triggern, die fhem.cfg nicht editieren, lässt sich alles im Webif machen! In die sub gehöhrt nur die Zeile mit der Variablen.
Und die nächste Frage kenne ich jetzt auch schon, "wie rufe ich die sub auf?", mit {name der sub}
https://fhem.de/Heimautomatisierung-mit-fhem.pdf
VG
Frank
Also so?
sub
myAverage($$$)
{
my ($offset,$logfile,$cspec) = @_;
my $period_s = strftime "%Y-%m-%d\x5f%H:%M:%S", localtime(time-$offset);
my $period_e = strftime "%Y-%m-%d\x5f%H:%M:%S", localtime;
my $oll = $attr{global}{verbose};
$attr{global}{verbose} = 0;
my @logdata = split("\n", fhem("get $logfile - - $period_s $period_e $cspec"));
$attr{global}{verbose} = $oll;
my ($cnt, $cum, $avg) = (0)x3;
foreach (@logdata){
my @line = split(" ", $_);
if(defined $line[1] && "$line[1]" ne ""){
$cnt += 1;
$cum += $line[1];
}
}
if("$cnt" > 0){$avg = sprintf("%0.1f", $cum/$cnt)};
Log 4, ("myAverage: File: $logfile, Field: $cspec, Period: $period_s bis $period_e, Count: $cnt, Cum: $cum, Average: $avg");
return $avg;
fhem "set test $avg";
}
##########################################################
Gute Grundlagen zum Lesen hast du einen Tipp.?
ZitatGute Grundlagen zum Lesen hast du einen Tipp.?
oben im Link.
Was passiert denn wenn du jetzt in der Komandozeile von fhem {myAverage} eingibst?
Das Ergebniss wird unterhalb der Kommandozeile angezeigt. So wie vorher.
Jetzt muss ich das mit der Definition des dummy in der cfg noch irgendwie hinbekommen.
Du weist aber das es average auch als "fertigen" fhem Befehl/Hilfs- Erweiterungsmodul gibt?
https://fhem.de/commandref.html#average
Zitat von: Wolfi am 27 August 2017, 17:00:27
Das Ergebniss wird unterhalb der Kommandozeile angezeigt. So wie vorher.
Jetzt muss ich das mit der Definition des dummy in der cfg noch irgendwie hinbekommen.
Lass doch mal bitte die Finger von der cfg. Was willst du da?
define dummyName dummy
In der Kommandozeile des FHEMWEB eingeben und das Teil ist angelegt. Speichern nicht vergessen. Links oben rotes Fragezeichen.
ZitatDas Ergebniss wird unterhalb der Kommandozeile angezeigt. So wie vorher.
Jetzt muss ich das mit der Definition des dummy in der cfg noch irgendwie hinbekommen.
Das dummy device must du natürlich
vorher anlegen oder wo soll der fhem "set ...." sonst hin schreiben??
@CoolTux
ZitatLass doch mal bitte die Finger von der cfg. Was willst du da?
Ja, ja, hatte ich ihm oben auch schon geschrieben... :o
VG
Frank
Zitat von: Wolfi am 27 August 2017, 16:43:06
Also so?
sub
myAverage($$$)
{
my ($offset,$logfile,$cspec) = @_;
my $period_s = strftime "%Y-%m-%d\x5f%H:%M:%S", localtime(time-$offset);
my $period_e = strftime "%Y-%m-%d\x5f%H:%M:%S", localtime;
my $oll = $attr{global}{verbose};
$attr{global}{verbose} = 0;
my @logdata = split("\n", fhem("get $logfile - - $period_s $period_e $cspec"));
$attr{global}{verbose} = $oll;
my ($cnt, $cum, $avg) = (0)x3;
foreach (@logdata){
my @line = split(" ", $_);
if(defined $line[1] && "$line[1]" ne ""){
$cnt += 1;
$cum += $line[1];
}
}
if("$cnt" > 0){$avg = sprintf("%0.1f", $cum/$cnt)};
Log 4, ("myAverage: File: $logfile, Field: $cspec, Period: $period_s bis $period_e, Count: $cnt, Cum: $cum, Average: $avg");
return $avg;
fhem "set test $avg";
}
##########################################################
Gute Grundlagen zum Lesen hast du einen Tipp.?
Ist der Code von Dir? Sieht mir nach ziemlich alten Code aus. Denke mal so vor 2015.
Einige FHEM Sachen werden so nicht mehr gehandhabt. Zum Beispiel ist es nicht mehr erwischt die Hash's direkt zu manipulieren. Dafür möge man bitte Routinen aus der fhem.pl verwenden.
Zitat von: franky08 am 27 August 2017, 17:35:10
Das dummy device must du natürlich vorher anlegen oder wo soll der fhem "set ...." sonst hin schreiben??
Habe ich doch so gemacht via Kommandozeile aber der Dummy bleibt leer bzw. ???
Nach Ausführung der sub
Oh man wo fängt man da an.
Heißt Dein Dummy auch Test? Nimm das Return raus. Nach einem return ist eine Sub zu Ende. Dein set Dummy steht nach dem return
Sorry ihr müsst Geduld haben mit mir.
Ich möchte lernen.
Ich glaube CoolTux du hat recht...Vielleicht sogar 2013
https://forum.fhem.de/index.php/topic,11622.0/wap2.html
@Wolfi.
Wie stehts denn mit Perl Grundlagen?
Das ist von 2013, war eine meiner ersten subs die ich damals in die utils gebaut hatte. Das das fhem set... Nach dem return steht, hatte ich völlig übersehen, mittlerweile gibt es das ja als Hilfsmodul.
VG
Frank
O man das Return.
Das weis ich eigentlich.
Total übersehen.
Wenn man vor lauter Bäumen den.........
Danke an alle.
Die nächten Fragen kommen bestimmt.
Zitat von: franky08 am 27 August 2017, 18:09:11
Das ist von 2013, war eine meiner ersten subs die ich damals in die utils gebaut hatte. Das das fhem set... Nach dem return steht, hatte ich völlig übersehen, mittlerweile gibt es das ja als Hilfsmodul.
VG
Frank
Ja aber das Modul funktioniert.
Und für mich Grundlage zum lernen.
Danke
P.S. die sub ist aber nicht von mir, ich habe die damals auch nur irgendwo gefunden :) ;)
VG
Frank
Ich schlage vor wir machen mal folgendes. Damit sie wenigstens ein bisschen den neuen Kreterien von FHEM entspricht, schreibe ein zwei Zeilen anders und klebe den Code dann hier an.
Zitat von: CoolTux am 27 August 2017, 18:25:53
Ich schlage vor wir machen mal folgendes. Damit sie wenigstens ein bisschen den neuen Kreterien von FHEM entspricht, schreibe ein zwei Zeilen anders und klebe den Code dann hier an.
https://wiki.fhem.de/wiki/Gleitende_Mittelwerte_berechnen_und_loggen#Gleitender_Mittelwert_f.C3.BCr_beliebige_Readings
So und schon die Nächte Frage.
Mein Dummy gibt den richtigen Wert aus nun möchte ich die Einheit kWh anhängen.
Das müsste über den stateFormat attr gehen.
Finde allerdings keine vernünftige Beschreibung des Syntax?
Du kannst ja im set Befehl das kWh mit anhängen.
stateFormat formatiert Dir nur das Internal STATE
Habe ich gemacht Danke.
Aber der stateFormat Syntax würde mich trotzdem interessieren. (verstehen und lernen)
Commandref gibt nicht wirklich was.
READINGNAME kWh
Das sollte reichen. Erscheint aber wie gesagt nur als STATE