Hallo
Ich habe von meinem Holzvergaser 6 Notify die mir den Status des Holzvergasers mit Uhrzeit ausgeben.
ich würde jetzt gerne die Differenz zwichen HVA_Start und HVD_Ausbrand berechnen und in einem Log Speichern
im Prinzip wenn das Notify HVD_Ausbrand auslößt soll die Brenndauer geloggt werden um sie später als Diagramm zu Plotten.
wie kann ich das angehen? ist das möglich ?
Gruß Josty
Ich werf einfach mal paar Stichwörter rein welche helfen sollten...
time_str2num()
ReadingsTimestamp()
attr userReading
Hallo,
ja das Hilft einem blutigen Anfänger natürlich nicht weiter.
Wenn ich die Suchfunktion bemühe finde ich unter "time_str2num" und "ReadingsTimestamp" genau einen beitrag und zwar "deinen"
Hat evtl. noch jemand einen Lösungsansatz.
Gruß Josty
Dann hast du die Suche falsch benutzt. Wenn du aus einer Kategorie heraus suchst, findest du nur Beiträge in der Kategorie. Gehe zum Suchen in die Foren-Übersicht und du findest alle Beiträge.
time_str2num() - ist eine sub in der 99_utils. Diese macht aus einem Zeitstring wie "2015-10-21 11:52:00" einen Timestamp mit dem man rechnen kann.
ReadingsTimestamp() - eine Perl-Funktion mit dem man an die Zeit von einem Reading kommt und das sich dann mit time_str2num in einen Linux Timestamp verwandeln lässt.
userReading - hier mit lässt sich ein eigenes Reading im Device nach vorgaben erzeugen.
Ich verweise zu userReading auch noch auf die Commandref. Für ein wenig Perl (was nie schaden kann), verweise ich auf die einschlägigen Seiten, die sich über google ganz leicht finden lassen. Und so wird aus einem blutigen Anfänger sehr schnell ein fortgeschrittener Anfänger.
Hallo,
wenn ich es so aufbaue
attr Heizkessel userReading letzteLaufzeit { time_str2num(OldTimestamp("HVB_ANHEIZEN") - time_str2num(OldTimestamp("HVD_AUSBRAND") }
dann sagt fhem Heizkessel: unknown attribute userReading. Type 'attr Heizkessel ?' for a detailed list.
Gruß Josty
userReadings, nicht userReading
Jau. Das zeigt, dass er sich nicht einmal die Mühe gemacht hat, die commandref zu konsultieren. Aber es ist natürlich mein Fehler, ich habe das "falsche" Stichwort gegeben....
Hallo
ja stimmt war ein rechtschreibfehler.
so geht es aber auch nicht....
attr Heizkessel userReadings letzteLaufzeit { time_str2num(OldTimestamp("HVA_START") - time_str2num(OldTimestamp("HVD_AUSBRAND") }
da kommt beim reading dann
ZitatletzteLaufzeit
Error evaluating Heizkessel userReading letzteLaufzeit: syntax error at (eval 10474575) line 1, at EOF
2015-10-21 12:59:04
Gruß Josty
zähl mal deine Klammern
Hallo
Ja Danke
attr Heizkessel userReadings letzteLaufzeit { time_str2num(OldTimestamp("HVC_START")) - time_str2num(OldTimestamp("HVA_HEIZEN")) }
so kommt zumindestens mal eine 0 als reading
Gruß Josty
Anbei eine ( wo geklaute ) Zeitvergleichsroutiene aus meine 99UtilRalph.pm
# Devices in room Check checken
# define Chk at +00:00:05 {dev2chk}
sub dev2chk {
Log 3, "\n";
foreach my $dev (devspec2array("room=Check")) {
my $tlast = ReadingsTimestamp($dev, "state", "-");
if ($tlast eq "-") {
$tlast = ReadingsTimestamp($dev, "Window", "1970-01-01 01:00:01");
}
my $slast = time_str2num($tlast);
my $sbatt = ReadingsVal($dev, "Battery", "-");
if ($sbatt eq "-") {
$sbatt = ReadingsVal($dev, "battery", "ok");
}
Log 3, $dev . " B:" . $sbatt . " " . $tlast . " " . $slast . " " . time();
if ((time() - $slast > 3600) || ($sbatt ne "ok")) {
Log 3, "^ " . $dev . " B:" . $sbatt . " letzte Meldung am " . $tlast;
if ( Value("A_AlarmMail") ne "AUS") { FB_mail('DeineMailAdresse',"^ " . $dev . " unklar","Letzte Meldung am " . $tlast . "\nBattery: " . $sbatt); }
if ( Value("A_AlarmGong") ne "AUS") { fhem "set GONGen toggle"; }
}
}
Log 3, "\n";
fhem "setstate CheckAlive off";
}
Aufruf mit:
# TasterSchalter fuer dev2chk, den gibts nicht als wirkliches Geraet
define CheckAlive FS20 0003 00
# Ueberwachung der alarmauslösenden Schalter
# In der Subroutine dev2chk steckt die eigentliche Arbeit
# dies wird alle 8 Stunden automatich wiederholt oder unten mit Schalter gestartet
define atChk1 at *10:00:00 {dev2chk}
define atChk3 at *18:00:00 {dev2chk}
# manueller Start mit Schalter um 5 Sek. verzögert um aufs EventLog umzuschalten
define nChk notify CheckAlive:on define tChk at +00:00:05 {dev2chk}
Möge sie Dir weiterhelfen
Hallo Ralph,
puuu das aber kompliziert,
hätte jetzt noch einen anderen ansatz weil ja eigentlich die Laufzeit per reading vorhanden ist aber weiterläuft wenn der Ofen bereits aus ist.
demnach hab ich ein notify was auslößt wenn der Ofen abschaltet.
Heizkessel:status.*000 "/usr/bin/mpg123 /opt/fhem/mp3/feuerwehr.mp3" ; setreading Heizkessel letzteLaufzeit {fhem(ReadingsVal(Heizkessel,"Laufzeit",""))
jedoch schreibt er so in das Reading letzteLaufzeit nicht die laufzeit sondern den Text "{fhem(ReadingsTimestamp(Heizkessel,"Laufzeit",""))" hinein,
kann ich bei setreading nicht das Reading der Laufzeit übergeben ?
Hoffe man versteht was ich vor habe!
Gruß Josty