FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Tuppertasse am 06 September 2013, 11:18:12

Titel: Zwei Zeitstempel subtrahieren
Beitrag von: Tuppertasse am 06 September 2013, 11:18:12
Hallo,

ich möchte mir für bestimmte Komponenten, die ich mit Aktoren durch verschiedene Bedingungen schalte, mir die Laufzeit errechnen und daraus einen Verbrauch in kwH errechnen.
Die Ein- und Ausschaltzeit habe ich bereits bekommen, nur wird dies ja leider in eine Zahl umgewandelt, so daß der Delta auch einer Zahl entspricht; ich möchte aber die Zahl in Stunden und Minuten evtl dann auch in Jahren und Monaten angezeiogt bekommen damit ich den Verbrauch auch ausrechnen kann.
Momentan hab ich es:

Log_Zeit_1 = 1378457593.09869

Log_Zeit_2 = 1378456659.59764

Log_Zeit_Delta = 15.558350833257
Titel: Aw: Zwei Zeitstempel subtrahieren
Beitrag von: betateilchen am 06 September 2013, 16:31:16
sub dhms
{
my $s = shift;

my $d = int($s/86400);
$s -= $d*86400;
my $h = int($s/3600);
$s -= $h*3600;
my $m = int($s/60);
$s -= $m*60;

return ($d,$h,$m,$s);
}

printf "%d %02d:%02d:%02d\n",dhms(129600);
Titel: Aw: Zwei Zeitstempel subtrahieren
Beitrag von: jody am 07 September 2013, 11:03:43
Hallo Tuppertasse,

ich kann dir zwar nicht mit deinem Problem zur Subtraktion zweier Zeitstempel helfen, jedoch kann ich dir beim ermitteln der Leistungsaufnahme von Geräten helfen.

Ich habe mir selbst einen kleinen Stromzähler gebastelt.

Hier der Code:

define PcNotify notify Pc {\
  if("%" eq "present") {\
   $data{einschaltzeit} = time();;\
  } elsif("%" eq "absent") {\
   my $device = "Pc";;\
   my $watt = 57;;\
   \
   my $gesamtkosten = ReadingsVal("$device","Gesamtkosten[€]","on");;\
   my $gesamtverbrauch = ReadingsVal("$device","Gesamtverbrauch[kWh]","on");;\
   $data{dauer} = time()-$data{einschaltzeit};;\
   $data{letzte_Kosten} = sprintf ("%%.2f", (time()-$data{einschaltzeit})/3600*$watt/1000*0.24);;\
   $data{letzter_Verbrauch} = sprintf ("%%.2f", (time()-$data{einschaltzeit})/3600*$watt/1000);;\
   $data{Gesamtkosten} = $gesamtkosten + $data{letzte_Kosten};;\
   $data{Gesamtverbrauch} = $gesamtverbrauch + $data{letzter_Verbrauch};;\
   \
   readingsBeginUpdate($main::defs{$device});;\
   readingsBulkUpdate($main::defs{$device},"letzte_Kosten[€]","$data{letzte_Kosten}");;\
   readingsBulkUpdate($main::defs{$device},"Gesamtkosten[€]","$data{Gesamtkosten}");;\
   readingsBulkUpdate($main::defs{$device},"letzter_Verbrauch[kWh]","$data{letzter_Verbrauch}");;\
   readingsBulkUpdate($main::defs{$device},"Gesamtverbrauch[kWh]","$data{Gesamtverbrauch}");;\
   readingsEndUpdate($main::defs{$device},1);;\
  }\
 }
 
define Pc_log FileLog ./log/Pc-%Y-%m.log Pc


Wenn du hilfe brauchst wie mein Stromzähler zu verwenden ist, melde dich einfach nochmal.


(siehe Anhang / see attachement)


Titel: Aw: Zwei Zeitstempel subtrahieren
Beitrag von: Tuppertasse am 07 September 2013, 11:10:14
Guten Morgen,

vielen dank für den Tip.
Zusammen mit einem Kollegen haben wir nun was ähnliches aufgebaut, wie du es gemacht hast.
Nach langem suchen sind wir über die Funktion time_str2num gestolpert und haben diese mitgenutzt; insgesamt sieht es nun so aus und funktioniert soweit auch gut - ich bin dabei über den notify on/off des Aktors gegangen:

# Ventilator_Switch Notify.on
define Ventilator_Switch_On notify Ventilator_Switch:on.* {\
  {fhem "set Ventilator_Switch_State on";;}\
  my $Zeit1 = (ReadingsTimestamp("Ventilator_Switch","state",""));;\
  {fhem "set Log_Zeit_1 $Zeit1";;}\
}

# Ventilator_Switch Notify.off
define Ventilator_Switch_Off notify Ventilator_Switch:off.* {\
  if ((Value("Ventilator_Switch_State") eq "on")){\
    {fhem "set Ventilator_Switch_State off";;}\
    my $delta = 0;;\
    my $Zeit1 = (ReadingsVal("Log_Zeit_1","state",""));;\
    my $Zeit2 = (ReadingsTimestamp("Ventilator_Switch","state",""));;\
    {fhem "set Log_Zeit_2 $Zeit2";;}\
    my $delta = (time_str2num($Zeit2)-time_str2num($Zeit1));;\
    {fhem "set Log_Zeit_Delta $delta";;}\  
    my $total = (ReadingsVal("Log_Zeit_Total","state","")) + $delta;;\
    {fhem "set Log_Zeit_Total $total";;}\  
    my $money = (ReadingsVal("Log_Zeit_Total","state","")) / 3600 * 0.2 * 0.05;;\
    {fhem "set Log_Zeit_Betrag $money";;}\  
  }\
}
Titel: Aw: Zwei Zeitstempel subtrahieren
Beitrag von: bugster_de am 10 September 2013, 23:44:20
Hi,

hatte ein ähnliches Thema und deshalb sind bei mir in diesem Zusammenhang einige Funktionen entstanden.

siehe hier: Link (http://forum.fhem.de/index.php?topic=14449.0)