FileLog reagiert nur auf manuelles setreading

Begonnen von fhainz, 16 Februar 2014, 12:16:12

Vorheriges Thema - Nächstes Thema

fhainz

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) 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.

fhainz

Ich muss das nochmals hochschieben.

Niemand eine Idee?

Grüße

Puschel74

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
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

fhainz

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

Puschel74

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
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

fhainz

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

Puschel74

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)
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

betateilchen

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?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Puschel74

Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

fhainz

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

fhainz

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

betateilchen

readingsSingleUpdate($device, $readingsName, $readingsWert, 0);

Woher soll denn auch ein Trigger kommen, wenn Du ihn mit "0" ausdrücklich abschaltest?

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

fhainz

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

betateilchen

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 :)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

fhainz

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