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
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);
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)
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";;}\
}\
}
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)