Täglich 1x den Wert loggen

Begonnen von Knallfrosch, 27 August 2015, 10:08:31

Vorheriges Thema - Nächstes Thema

Knallfrosch

Hallo,

ich möchte meine täglichen Verbrauchswerte um 23:59Uhr in ein Logfile schreiben.
Um 0:00Uhr wird der Zähler wieder auf 0 gesetzt.

Mein Gedanke war so:

Ich lege ein Logfile an:

define FileLog_GasverbrauchTag FileLog ./log/GasverbrauchTag-%Y-%m.log TagesverbrauchGas
attr FileLog_GasverbrauchTag logtype text



Dann habe ich ein at angelegt:

define TagesverbrauchGas at +*00:00:05 { my $d= ReadingsVal("GasverbrauchGesamt","countsPerDay",0) fhem("set Tagesverbrauch $d")}

(jetzt im 5sec Takt um zu testen, später soll das at um 23:59Uhr reagieren)


Soweit meine Idee zur Umsetzung.
Jedoch funktioniert es nicht wie gewünscht, im Logfile steht
2015-08-27_10:01:18 TagesverbrauchGas Next: 10:01:22
2015-08-27_10:01:23 TagesverbrauchGas Next: 10:01:27
2015-08-27_10:01:28 TagesverbrauchGas Next: 10:01:32
2015-08-27_10:01:33 TagesverbrauchGas Next: 10:01:37
2015-08-27_10:01:38 TagesverbrauchGas Next: 10:01:42
2015-08-27_10:01:43 TagesverbrauchGas Next: 10:01:47


Und nicht der Wert countsperDay! (aktuell 27)

Kann mir bitte jemand helfen den Fehler zu finden?


Desweiteren wäre es toll wenn im Log dann nicht nur die 27 stehen würde sondern 27/100= 0,27 m³

Das bekomme ich ja als aktueller Wert im GasverbrauchTag-Dummy so angezeigt mit

stateFormat  {sprintf("%.2f",ReadingsVal("GasverbrauchGesamt","countsPerDay",0)/100)." m³"}


Müsste ich also im at nicht countsPerDay abfragen sondern state?


Vielen Dank.


Grüße

Doggiebert

ich würde mal sagen, da fehlt ein Semikolon zwischen den beiden Perl Anweisungen (also vor dem fhem-set-Befehl).
define TagesverbrauchGas at +*00:00:05 { fhem("set Tagesverbrauch ".ReadingsVal("GasverbrauchGesamt","countsPerDay",0)}
Sollte man aber auch alles drei in eine einzelne Perl-Anweisung kombinieren können, wenn Du willst (oder halt einen separaten formatted dummy anlegen und den loggen).
define TagesverbrauchGas at +*00:00:05 { fhem("set Tagesverbrauch_formatted ".sprintf("%.2f",ReadingsVal("GasverbrauchGesamt","countsPerDay",0)/100)." m³"}
SW: FHEM 5.5, Raspian, XBMC, Testinstallation auf Win7
HW: Raspi B, 32GB SD, enocean Pi, RFXTRX433E, BSC - MwC-32, Onkyo TX-NR709, Samsung UE55F8090, Jung LS-Eno, permundo SmartPlug, KDG-FB 6490cable (ohne FHEM)

Knallfrosch

#2
Hallo Doggiebert,

danke schonmal für deine Hilfe, aber leider kommen auch bei beiden Vorschlägen von dir nur folgende Logeinträge

2015-08-27_15:52:14 TagesverbrauchGas Next: 15:52:19
2015-08-27_15:52:19 TagesverbrauchGas Next: 15:52:24
2015-08-27_15:52:24 TagesverbrauchGas Next: 15:52:29
2015-08-27_15:52:33 TagesverbrauchGas Next: 15:52:38
2015-08-27_15:52:38 TagesverbrauchGas Next: 15:52:43
2015-08-27_15:52:43 TagesverbrauchGas Next: 15:52:48



im Logfile steht

2015.08.27 15:55:38 3: TagesverbrauchGas: syntax error at (eval 5731) line 1, at EOF
2015.08.27 15:55:43 3: TagesverbrauchGas: syntax error at (eval 5736) line 1, at EOF
2015.08.27 15:55:48 3: TagesverbrauchGas: syntax error at (eval 5738) line 1, at EOF



Bei meiner Variante stand im Log:

2015.08.27 15:31:57 1: PERL WARNING: Bareword found where operator expected at (eval 5362) line 1, near ") fhem"
2015.08.27 15:31:57 3: eval: { my $d= ReadingsVal("GasverbrauchGesamt","countsPerDay",0) fhem("set Tagesverbrauch $d")}
2015.08.27 15:31:57 3: TagesverbrauchGas: syntax error at (eval 5362) line 1, near ") fhem"

2015.08.27 15:32:02 1: PERL WARNING: Bareword found where operator expected at (eval 5363) line 1, near ") fhem"
2015.08.27 15:32:03 3: eval: { my $d= ReadingsVal("GasverbrauchGesamt","countsPerDay",0) fhem("set Tagesverbrauch $d")}
2015.08.27 15:32:03 3: TagesverbrauchGas: syntax error at (eval 5363) line 1, near ") fhem"

2015.08.27 15:32:07 1: PERL WARNING: Bareword found where operator expected at (eval 5364) line 1, near ") fhem"
2015.08.27 15:32:07 3: eval: { my $d= ReadingsVal("GasverbrauchGesamt","countsPerDay",0) fhem("set Tagesverbrauch $d")}
2015.08.27 15:32:08 3: TagesverbrauchGas: syntax error at (eval 5364) line 1, near ") fhem"


Ich komme einfach nicht weiter.


Grüße

Hans Franz

Hallo,
mit
define FileLog_GasverbrauchTag FileLog ./log/GasverbrauchTag-%Y-%m.log TagesverbrauchGas
logst du dein at-Device. Du möchtest aber wohl deinen Tagesverbrauch-Dummy loggen.

define FileLog_GasverbrauchTag FileLog ./log/GasverbrauchTag-%Y-%m.log Tagesverbrauch

Gruß
Hans
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

Knallfrosch

#4
Hallo,

ich habe jetzt einen Weg gefunden.

Folgendes habe ich mir zusammen gebastelt.

Ich habe mir einen Dummy angelegt:

define TagesverbrauchGas dummy

dazu ein at

define TagesvebrauchGas_at at +*00:00:05 {my $T=(ReadingsVal("GasverbrauchGesamt","countsPerDay",0)/100)." m³";; fhem "set TagesverbrauchGas $T"}

und ein Logfile


define TagesvebrauchGas_at at +*00:00:05 {my $T=(ReadingsVal("GasverbrauchGesamt","countsPerDay",0)/100)." m³";; fhem "set TagesverbrauchGas $T"}


Nun steht dann im Log

2015-08-27_17:08:58 TagesverbrauchGas 0.45 m³
2015-08-27_17:09:03 TagesverbrauchGas 0.45 m³
2015-08-27_17:09:08 TagesverbrauchGas 0.45 m³


Prinzipiell ist es nun so, wie ich es wollte......bis auf den Zyklus, denn eigtl. soll ja nur um 23:59Uhr ( at  *23:59:00)in den Dummy bzw. in das Logfile geschrieben werden.


ABER.....muss der Umweg über den Dummy wirklich sein?
Kann ich nicht irgendwie anders direkt mit dem at in das Logfile schreiben?


sowas ähnliches wie: define TagesvebrauchGas_at at +*00:00:05 {my $T=(ReadingsVal("GasverbrauchGesamt","countsPerDay",0)/100)." m³";; fhem "set LOGFILE $T"}
Ich habe keine "direkte" Lösung gefunden.


Grüße

Knallfrosch

Guten Abend die Herren (und Damen?),

hat niemand einen Rat für mich?

Ist meine Lösung schon "gut" oder gibt es etwas besseres/einfacheres?


Vielen Dank für eure Hilfe.


Grüße

Puschel74

#6
Den Dummy brauchst du nicht.
Du kannst mit setreading deine eigenen Werte in ein Device schreiben.
Oder was gefällt dir an deiner Lösung nicht?
Der Dumy macht das Kraut nicht fett und die Berechnung wird FHEM resp. deine Hardware nicht wirklich "anhalten" aber, wie gesagt, es geht auch ohne Dummy.
Bei FHEM (resp. Perl) ist das schöne das "viele Wege nach Rom führen" - und ob du etwas früher dort bist oder nicht ...  8)

Edith: Das deine Hardware nicht wirklich "anhalten" relativiert sich natürlich da du Bitte unbedingt vor Eurem ersten Post hier lesen. zwar gesehen aber nicht angeklickt und gelesen hast.
Sonst hättest du eine Signatur die Nachfragen zur Hardware erübrigen würden  ;)

Edith1: Ich relativiere - Du kannst mit setreading deine eigenen Werte in ein Device schreiben.
Du kannst beliebige Werte in eigene Readings in ein Device schreiben (lassen).
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.

Knallfrosch

Hi Puschel,

was mir eigentlich nicht gefällt ist eben dieser Dummy!

Denn ich habe ja schon einen Dummy, der mir den aktuellen Tagesvebrauch aus dem HourCounter holt und darstellt.
Jetzt habe ich eben einen Dummy, der einmal vor Tagesende geschrieben wird nur um den Wert in einem Logfile zu verewigen.

Daher ja meine Frage ob ich mit dem "at" statt in den Dummy, direkt in ein Logfile schreiben kann.
Oder welchen Ansatz es gibt ohne zusätzlichen Dummy auszukommen.

so richtig genau erschließt sich mit der Unterschied zwischen set und setzreading nicht.  :o


zu deinem "Vorwurf":
ich habe zwar keine Signatur angelegt, erwähne aber schon meine Hardware wenn Sie von Belang ist.
Ich möchte behaupten das es bei diesem "Problem" keine Rolle spielt.
Falls es der weiteren Lösung andere Wege eröffnet trage ich natürlich gerne nach das mein FHEM auf einem Rasp B+ läuft.
Ich bemühe mich prinzipiell also sehr wohl dem Helfenden alle möglichen und nützlichen Infos zu geben. :-)

Ich lasse mir aber auch gerne erklären welchen Einfluss hierbei die Hardware hat oder haben kann.....ich lerne ja gerne dazu!

Grüße

Omega

Hi,
schau dir doch mal die HourCounter Erweiterung im Wiki an
http://www.fhemwiki.de/wiki/HourCounter
Da hast du mehrere Beispiele für u.a. tägliches Logging. Da hast du pro Tag zwar mehr als einen Wert, hast aber gleichzeitig eine Aufsummierung auf Wochen- und Monatsbasis. Ist also eine gute Voraussetzung für schöne Plots. Und du benötigst keinen weiteren Dummy.

Meine Lösung sieht z.B. so aus (Vorausgesetzt: HourCounter ist bereits installiert – scheinst du ja auch schon gemacht zu haben):

# HourCounter Erweiterung aktivieren
define Gasverbrauch.EVENT notify Gasverbrauch:tick.* { appHCNotify("%NAME","%EVTPART0","%EVTPART1");;}
# Archiv für Tages-/Wochen-/Monats-/Jahreswerte anlegen
define Gasverbrauch.FileDay FileLog ./log/Gasverbrauch-Day-%Y.log Gasverbrauch:app\w+(Utilization|PerHour|PerDay|PerWeek|PerMonth|PerYear)(?!Temp).*

# Damit nicht zu viele Ereignisse in den Log-Dateien landen, kann man diese sinnvoll einschränken, so daß nur Änderungen das Feuern von Events auslösen
attr Gasverbrauch event-on-change-reading .*
# Wenn sich nun jedoch über Stunden und Tage nichts ändert, sieht man in den Charts keine Daten mehr. Mit dieser Anweisung wird erreicht, daß alle Readings nach Aktualisierung spätesten nach 1 Stunden
# einen Event feuern, auch wenn sich der Wert nicht ändert. Eine Ausnahme hiervon sollen machen die tick*-Readings, deren Events sollen immer sofort gefeuert werden, wenn sie aktualisiert werden.
attr Gasverbrauch event-min-interval tick.*:0,.*:3600


Viele Grüße
Holger
NUC6i3SYH (FHEM 5.8 in VM)
Homematic: HMLAN, HMUSB, HM-Sec-SD, HM-CC-RT-DN, HM-TC-IT, ... + diverse weitere
LaCrosseGateway, ESPEasy
ZWave

Knallfrosch

Moin Holger,

vielen Dank für deine Nachricht!

Das mit dem Logfile zum HourCounter-Modul habe ich gestern auch gesehen, als ich weiter nach einer ansprechenden Lösung gesucht habe.

Ich habe aber noch ein paar Probleme mit den "Zählwerten" der appXXXX-readings. Die sind für mich nicht plausibel zu den ursprünglichen Zählwerten.

Ähmmm.....jetzt wo ich es schreibe ist mir aufgefallen das appCountsPerDay den Tageswert von dem gestrigen countsPerDay angenommen hat......ich glaube nun hat es klick gemacht!

Ich schau mir das mal noch mit dem im Wiki vorgeschlagenen Logfile an.


Grüße
Thorsten