Hallo Leute!
Ich hab hier ein seltsames Problem.
Mit diesem notify rechne ich meinen aktuellen Stromverbrauch aus. Via S0 kommen die Intervalle zum Arduino und fhem wertet das ganze aus. Das berechnete power reading sollte anschließend im fileLog gespeichert werden.
Das funktioniert, der wert wird berechnet, ins reading geschrieben aber nicht geloggt.
Leider loggt der filelog das power reading nur wenn der wert manuell (zB setreading arduino_pin_10 power 300.94) via command Zeile gesetzt wird. Wenn das script das power reading schreibt reagiert der FileLog nicht.
Hier das notify: (Das reading lastPower hat den sinn falsche Messwerte + Peaks die den Plot zerstören nicht mitzuloggen.)
define n_stromverbrauchAllgemeinBerechnen notify arduino_pin_10:reading:.off {\
use Time::HiRes qw(time);;\
\
my $power = 3600 / ( time() - OldValue("arduino_pin_10") );;\
my $lastPower = ReadingsVal("arduino_pin_10","power",0);; \
my $readingLastPower = ReadingsVal("arduino_pin_10","lastPower",0);;\
\
$power = int(100 * $power + 0.5) / 100;;\
\
if( $power > ( $lastPower + 300 ) ){ \
if( $readingLastPower eq "0" ){\
setReading("arduino_pin_10","lastPower",$power);;\
}\
else{ \
fhem("setreading arduino_pin_10 power $power");; \
setReading("arduino_pin_10","lastPower",0);; \
} \
}\
else{ \
fhem("setreading arduino_pin_10 power $power");; \
if( $readingLastPower > 0 ) {\
setReading("arduino_pin_10","lastPower",0);; \
} \
} \
}
Hier die FileLog definition:
define FileLog_arduino_pin_10 FileLog ./log/arduino_pin_10-%Y.log arduino_pin_10:power:.*
Ich habs auch mit
define FileLog_arduino_pin_10 FileLog ./log/arduino_pin_10-%Y.log arduino_pin_10
versucht. Es wurde alles bis auf das power reading geloggt.
2014-02-16_13:48:33 arduino_pin_10 reading: off
2014-02-16_13:48:33 arduino_pin_10 time: 1392554913.70064
2014-02-16_13:48:33 arduino_pin_10 reading: on
2014-02-16_13:48:44 arduino_pin_10 reading: off
2014-02-16_13:48:44 arduino_pin_10 time: 1392554924.99389
2014-02-16_13:48:45 arduino_pin_10 reading: on
2014-02-16_13:48:56 arduino_pin_10 reading: off
2014-02-16_13:48:56 arduino_pin_10 time: 1392554936.37478
2014-02-16_13:48:56 arduino_pin_10 reading: on
2014-02-16_13:49:07 arduino_pin_10 reading: off
2014-02-16_13:49:07 arduino_pin_10 time: 1392554947.81432
2014-02-16_13:49:07 arduino_pin_10 reading: on
arduino_pin_10 list:
Internals:
CFGFN ./FHEM/arduino.cfg
DEF 10
IODev FIRMATA
NAME arduino_pin_10
NR 68
PIN 10
STATE 1392561936.50696
TYPE FRM_IN
Readings:
2014-02-16 15:03:19 lastPower 0
2014-02-16 15:45:36 power 285.57
2014-02-16 15:42:02 power_avg_day 137.4
2014-02-16 15:42:02 power_avg_month 28.3
2014-02-16 15:42:02 power_cum_day 7766462.88
2014-02-16 15:42:02 power_cum_month 40737643.0799999
2014-02-16 10:03:10 power_max_day 2700.8
2014-02-15 13:49:30 power_max_month 2287109.1
2014-02-16 08:14:33 power_min_day 0.1
2014-02-15 13:15:15 power_min_month 0.00
2014-02-16 15:45:36 reading on
2014-02-16 14:40:13 state Initialized
2014-02-16 15:45:36 time 1392561936.50696
Attributes:
alias Stromzähler Allgemein
internal-pullup on
room Arduino
stateFormat time
userReadings time:reading:.off { use Time::HiRes qw(time); time(); }
Ich hatte das Script bisher als userReading in Verwendung. (Stammt von hier (http://forum.fhem.de/index.php/topic,13155.msg85677.html#msg85677)) Nachdem das alles in einer Zeile sehr unübersichtlich wurde hab ich das in einem notify verarbeitet.
Kann mir leider überhaupt nicht erklären warum nur geloggt wird wenn der Wert per hand gesetzt wird.
Hat jemand einen Tipp?
Grüße
Edit:
Post umgebaut. Vielleicht ist mein Problem jetzt ein bisschen besser verständlich.
Ich muss das nochmals hochschieben.
Niemand eine Idee?
Grüße
Hallo,
ZitatNiemand eine Idee?
Nein aber ...
Erster Beitrag heute um 12:16 - Änderungen darin um 15:57 und Nachfrage um 19:59
Nur mal so als Hinweis - ALLE! Helfer in FHEM machen das freiwillig.
Da hilft auch ein
ZitatIch muss das nochmals hochschieben.
knapp 8 Stunden nach dem ersten Beitrag nichts!
Vielleicht ist derjenige mit der zündenen Idee für genau DEIN Problem mit seiner Familie unterwegs (nur als Tipp: Heute ist Sonntag).
Vielleicht hat derjenige aber auch Urlaub?
Willst du nun jeden Tag deinen Beitrag wieder "hochschieben"?
Hilfreicher wäre evtl. wenn du mal posten würdest was du i nder Zeit schon alles versucht hast.
Welche regexp hast du ausprobiert mit welchem Ergebniss.
Vielleicht stimmt ja der Code nicht?
Streu mal ein paar Log-Einträge ein und schau wie weit dein Code das macht was du willst (oder besser vermutest).
Grüße
Sorry fürs hochschieben, ich werde das nächste mal 1-2 tage warten. Ich sitze seit stunden an dem problem und komm einfach nicht weiter. Sry für meine Ungeduld.
Zitat von: Puschel74 am 16 Februar 2014, 20:09:30
Welche regexp hast du ausprobiert mit welchem Ergebnis.
Ich habs erstmal wie oben erwähnt mit
define FileLog_arduino_pin_10 FileLog ./log/arduino_pin_10-%Y.log arduino_pin_10
versucht. Da sollte meiner Meinung nach alles geloggt werden. Wird es auch, bis auf das power reading
2014-02-16_20:20:36 arduino_pin_10 reading: off
2014-02-16_20:20:36 arduino_pin_10 time: 1392578436.54976
2014-02-16_20:20:36 arduino_pin_10 reading: on
2014-02-16_20:20:45 arduino_pin_10 reading: off
2014-02-16_20:20:45 arduino_pin_10 time: 1392578445.12973
2014-02-16_20:20:45 arduino_pin_10 reading: on
Anschließend hab ich dann diverse verschiedene regexps versucht. Aber an der regexp kann ja irgendwie nicht liegen. Wenn ich "per hand" den wert setzt wird ja geloggt.
Ich hab auch schon versucht meine setReading Funktion mit fhem("setreading ..."); zu ersetzten. Hat nichts gebracht.
Zitat von: Puschel74 am 16 Februar 2014, 20:09:30
Vielleicht stimmt ja der Code nicht?
Streu mal ein paar Log-Einträge ein und schau wie weit dein Code das macht was du willst (oder besser vermutest).
Mein code stimmt. Wenn ich in der command Zeile zB. setreading arduino_pin_10 power 304.99 eingebe wird es auch geloggt. Wenn mein notify aber den power wert setzt wird dieser nicht geloggt. Das power reading wird aber jedes mal gesetzt.
2014-02-16 20:26:34.162 FRM_IN arduino_pin_10 reading: off
2014-02-16 20:26:34.162 FRM_IN arduino_pin_10 time: 1392578794.15218
2014-02-16 20:26:34.162 FRM_IN arduino_pin_10 power: 414.97
2014-02-16 20:26:34.162 FRM_IN arduino_pin_10 time: 1392578794.16143
2014-02-16 20:26:34.186 FRM_IN arduino_pin_10 reading: on
Hand -> log
notify -> kein log obwohl sich reading ändert
Das ist ja das was mich verzweifeln lässt. Wenn kein Reading gesetzt wird, wüsste ich wenigsten wo suchen, aber da bin ich überfragt.
Grüße
Hallo,
und wenn du mal versuchsweise
define FileLog_arduino_pin_10 FileLog ./log/arduino_pin_10-%Y.log arduino_pin_10:.*
verwendest als regexp.
Was tut sich dann?
Grüße
Hatte ich auch schon mal versucht. Leider nichts.
Log:
2014-02-16_20:44:05 arduino_pin_10 reading: off
2014-02-16_20:44:05 arduino_pin_10 time: 1392579845.73532
2014-02-16_20:44:05 arduino_pin_10 reading: on
Event monitor:
2014-02-16 20:44:05.744 FRM_IN arduino_pin_10 reading: off
2014-02-16 20:44:05.744 FRM_IN arduino_pin_10 time: 1392579845.73532
2014-02-16 20:44:05.744 FRM_IN arduino_pin_10 power: 331.95
2014-02-16 20:44:05.744 FRM_IN arduino_pin_10 time: 1392579845.74418
2014-02-16 20:44:05.770 FRM_IN arduino_pin_10 reading: on
Grüße
Hallo,
ok, der Eintrag erscheint im Event Monitor aber er wandert nicht ins Logfile.
Regexp wurden so gut wie alle Möglichkeiten durchprobiert.
Ok, evtl. ist es ein Problem von FileLog - ist aber nur eine Vermutung.
Ich verschieb mal nach <Automatisierung> - da liest der betreffende Modulautor lt. Maintainer.txt eher mit als hier.
Sorry das ich hier leider nicht weiter helfen kann - ich logge alles in meine sqlite3-DB.
Grüße
P.S.: Wenn ich hier falsch bin dann bitte den Rüffel an mich 8)
setreading() innerhalb eines (durch einen Trigger ausgelösten) notify löst keinen weiteren Trigger aus, anhand dessen FileLog getriggert werden könnte.
Bau das Ganze in eine Funktion in die 99_myUtils und arbeite mit readingsSingleUpdate anstatt mit setreading.
Und quengel hier nicht rum zum Sonntag. Wo darf ich die Rechnung hinschicken?
Hab den Rüffel verstanden :P
Ok alles klar. Danke Puschel!
@betateilchen
Meine setReadings() funktions liegt in der 99_myUtils.pm und macht das ganze mich readingsBulkUpdate. Hatte das (glaub ich) so mal im Wiki gefunden. Ich bau das mal auf readingsSingleUpdate um!
sub setReading($$$)
{
my $device = shift;
my $readingsName = shift;
my $readingsWert = shift;
readingsBeginUpdate( $main::defs{$device} );
readingsBulkUpdate( $main::defs{$device}, $readingsName, $readingsWert );
readingsEndUpdate( $main::defs{$device}, 1 );
}
Grüße
OK hab die Funktion auf readingsSingleUpdate umgebaut. Bringt leider auch nichts.
sub setReading($$$)
{
my $device = shift;
my $readingsName = shift;
my $readingsWert = shift;
readingsSingleUpdate($device, $readingsName, $readingsWert, 0);
}
Im Event monitor:
2014-02-16 21:04:55.330 FRM_IN arduino_pin_10 reading: off
2014-02-16 21:04:55.330 FRM_IN arduino_pin_10 time: 1392581095.32127
2014-02-16 21:04:55.330 FRM_IN arduino_pin_10 power: 327.79
2014-02-16 21:04:55.330 FRM_IN arduino_pin_10 time: 1392581095.3299
2014-02-16 21:04:55.356 FRM_IN arduino_pin_10 reading: on
Im Log:
2014-02-16_21:04:55 arduino_pin_10 reading: off
2014-02-16_21:04:55 arduino_pin_10 time: 1392581095.32127
2014-02-16_21:04:55 arduino_pin_10 reading: on
Grüße
readingsSingleUpdate($device, $readingsName, $readingsWert, 0);
Woher soll denn auch ein Trigger kommen, wenn Du ihn mit "0" ausdrücklich abschaltest?
Sry ich wusste nicht wie ich die Funktion richtig anwende. In der command ref hab ich nichts gefunden und das wiki hat auf die schnelle nur ein Beispiel mit einer 0 ausgespuckt.
Ich habs auf 1 geändert, aber der power wert wird immer noch nicht geloggt. :-\
Grüße
Zitat von: Puschel74 am 16 Februar 2014, 20:56:00Hab den Rüffel verstanden :P
glaub ich nicht, ich hatte nicht Dich nach einer Rechnungsadresse gefragt :)
Zitat von: betateilchen am 16 Februar 2014, 20:52:36
setreading() innerhalb eines (durch einen Trigger ausgelösten) notify löst keinen weiteren Trigger aus, anhand dessen FileLog getriggert werden könnte.
Das war der Tipp! Ich speichere jetzt den power wert in einem dummy und hol ihn mir per userReading. Ist zwar nicht die beste Variante, aber für 2 Stromzähler wird das schon funktionieren, hoffe ich.
Danke für die Hilfe!
Grüße
Ok, ich dachte mit dem readingsSingleUpdate könnte man den Mechnismus vielleicht austricksen.
Übrigens: Wenn Du mal (wie in diesem Beispiel) nicht weißt, wie Du eine Funktion aus fhem einsetzen sollst, kann ein Blick in die fhem.pl oft helfen, das Verständnis zu fördern.
Sollte dieses Verhalten nicht in der Commandref erwähnt werden? Wenn ja, wer ist dafür zuständig?
Ich bin über dasselbe Problem gestolpert und habe schon an mir gezweifelt;-)
Gruß,
Gero
Hallo fhainz,
bin am Überlegen, ob ich das FRM_IN Modul zusammen mit meinem statistics Modul nutzen könnte. Mit dem userReading power ist das sicherlich kein Problem. Wenn ich mir die commandref durchlese, gibt es aber auch ein "get count". In deinem "list" konnte ich es aber nicht entdecken. Ist es möglicherweise ein verstecktes Reading?
Ich nutz die count funktion auch nicht. Nach jedem neustart war der wert weg wenn ich mich richtig erinnere.. Ich hab mir selbst zähl u auswerte funktionen geschrieben.