Zeitdifferenzen berechnen

Begonnen von jostmario, 21 Oktober 2015, 10:13:06

Vorheriges Thema - Nächstes Thema

jostmario

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
Raspberry Pi  ---  HM-LAN ---  8X HM_HM_CC_RT_DN --- OWL+USB Strommesser    UVR1611

rapster

Ich werf einfach mal paar Stichwörter rein welche helfen sollten...

time_str2num()
ReadingsTimestamp()
attr userReading

jostmario

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
Raspberry Pi  ---  HM-LAN ---  8X HM_HM_CC_RT_DN --- OWL+USB Strommesser    UVR1611

marvin78

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.

jostmario

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
Raspberry Pi  ---  HM-LAN ---  8X HM_HM_CC_RT_DN --- OWL+USB Strommesser    UVR1611

rapster

userReadings, nicht userReading

marvin78

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

jostmario

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
Raspberry Pi  ---  HM-LAN ---  8X HM_HM_CC_RT_DN --- OWL+USB Strommesser    UVR1611

rapster


jostmario

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
Raspberry Pi  ---  HM-LAN ---  8X HM_HM_CC_RT_DN --- OWL+USB Strommesser    UVR1611

Ralph

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
FHEM auf RaspberryPi3 mit Geekworm USV und SignalDUINO 433MHz und HM-MOD-RPI-PCB mit 3 HM-Sec-SD-2, 5 FHT, 2 RM 100-2 Uni S, 2 HMS100, 6 CUL_WS, 6 CUL_FHTTK, 11 FS20 und 7 FS20V Spannungsüberwachungen

jostmario

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
Raspberry Pi  ---  HM-LAN ---  8X HM_HM_CC_RT_DN --- OWL+USB Strommesser    UVR1611