Hallo zusammen,
bei den Geräten, für die mir der Verbrauch bekannt ist (z.B. Lampen,
Umwälzpumpe, TV, etc.), würde ich gerne den täglichen Stromverbrauch
über die Laufzeit ermitteln und in eine Logdatei schreiben.
Hat hierzu schon jemand eine Lösung oder eine Idee wie man
dies umsetzen kann?
Danke
Gruß Mark
Idee ja:
Basislösung: UserAttribut "leistung_in_watt" definieren, on-Zeiten ermitteln, ausrechnen.
Komfortlösung: "leistung" irgendwie als Reading reinbekommen, so dass man den Verbrauch auch zeitabhängig einstellen kann, ... und dann auch wieder rechnen :-)
Lösung (Implementierung): nein - aber irgendwann geplant, weil elektrische Heizkörper ja ganz schön schlucken können :-)
Viele Grüße
<F>
Hi,
müsste so ähnlich sein wie bei average (98_average.pm).
Vielleicht findet sich ja bei Gelegenheit ein Speziallist,
der es auch gut findet und einen Ansatz hat.
Gruß Mark
Hallo!
Ich hatte vorher eine XS1 und hatte mir selbst die Stromverbräuche aller Aktoren über PHP ausgerechnet. Leider bin ich bin PERL nicht so gut bewandert und schließ mich Mark's letzten Post direkt an ;)
Grüße
Ich würde folgendes voschlagen:
In Fhem.cfg:
define Verbrauch dummy
define Schalter_fuer_Pumpe dummy
attr Schalter_fuer_Pumpe webCmd on:off
define n_Pumpe notify Schalter_fuer_Pumpe {\
Log 3, "Schalter ".Value("Schalter_fuer_Pumpe");;\
if (Value("Schalter_fuer_Pumpe") eq "on" ) {\
my $Startzeit = time();;\
my $Endzeit = 0;;\
Eintrag($Startzeit, $Endzeit);;\
} elsif ( Value("Schalter_fuer_Pumpe") eq "off" ) {\
my $Startzeit = ReadingsVal("Verbrauch", "Startzeit", "n.a.");;\
my $Endzeit = time();;\
Log 3, "$Endzeit minus $Startzeit";;\
Eintrag($Startzeit, $Endzeit);;\
my $Differenz = Zeitdifferenz($Startzeit, $Endzeit);;\
Log 3, "Differenz: $Differenz";;\
my $Ergebnis = Verbrauch($Differenz);;\
Log 3, "Verbrauch: $Ergebnis";;\
}\
}
In 99_Utils.pm:
sub Zeitdifferenz($$){
my $time1 = shift;
my $time2 = shift;
my $difference = $time2 - $time1;
my $difference_in_hours = sprintf "%.2f",(($difference / 60) /60);
print "Laufzeit in Stunden: $difference_in_hours\n";
}
#================================================================
sub Eintrag($$)
{
my $Startzeit = shift;
my $Endzeit = shift;
readingsBeginUpdate($main::defs{Verbrauch});
readingsBulkUpdate($main::defs{Verbrauch}, 'Startzeit', $Startzeit);
readingsBulkUpdate($main::defs{Verbrauch}, 'Endzeit', $Endzeit);
readingsEndUpdate($main::defs{Verbrauch}, 1);
}
#================================================================
sub Verbrauch($) {
#in h/Tag
my $Dauer = shift;
$Dauer = $Dauer / 12;
# in kw/h
my $Watt = 0.5;
# in EUR/kWh
my $PreisproStunde = 0.21;
if ($Dauer eq "") {return "Error - keine Laufzeit eingegeben"};
my $Verbrauch = ($Watt * $Dauer * 365 * $PreisproStunde);
readingsBeginUpdate($main::defs{Verbrauch});
readingsBulkUpdate($main::defs{Verbrauch}, 'Verbrauch im Jahr', $Verbrauch);
readingsEndUpdate($main::defs{Verbrauch}, 1);
fhem("set Verbrauch $Verbrauch");
return "$Verbrauch";
}
#==========================================================================
MfG, MisterEltako
Genau sowas hatte ich gesucht. Diese Variante würde jetzt aber nur für einen Aktor funktionieren oder?
Das kann man anpassen wie man möchte. Was genau meinst hast du in deinem Fall vor?
MfG, MisterEltako
Ich würde gerne den Stromverbrauch von gewisse Aktoren mitloggen zB. Fernseher, Licht, usw. Am besten wäre natürlich wenn man direkt den Verbrauch als attribut angibt und einen FileLog erstellt. Daraus würd ich mir dann gerne den Verbrauch als Plot darstellen.
Das wäre das was mir im Kopf rumschwirrt ;)
Hallo,
ZitatFernseher, Licht, usw.
bedingt aber das jeder dieser Aktoren den Stromverbrauch auch loggt und an FHEM übermittelt.
Grüße
Edith: Alles anders ist nur schätzen - und das kann ich auch ;-)
Aber wenn ich den verbrauch kenne kann fhem genauer schätzen als ich und zeigt mir auch noch ein Diagramm :-)
Gruß Markus
Zitat von: Puschel74 schrieb am Mo, 17 Juni 2013 00:00Hallo,
ZitatFernseher, Licht, usw.
bedingt aber das jeder dieser Aktoren den Stromverbrauch auch loggt und an FHEM übermittelt.
Grüße
Edith: Alles anders ist nur schätzen - und das kann ich auch ;-)
Ich will nicht das mir der aktor alles mitloggt. Das wäre mir zu teuer. Deshalb über die laufzeit.
Dieser Code wäre meine Idee zum Einsatz mit verschiedenen Schalter/Aktoren.
Aufruf über Verbrauch(<Device>);
Eintrag des Verbrauches in den neuen Readings des <Device>, kann dann über ReadingsVal beliebig ausgelesen werden.
Achtung! Das ist zunächst der ungetestete Entwurf. Syntaxfehler sind noch möglich. Kann ich aber erst heute Abend prüfen!!!!!!
#In Fhem.cfg:
define Schalter_fuer_Pumpe dummy
attr Schalter_fuer_Pumpe webCmd on:off
define n_Pumpe notify Schalter_fuer_Pumpe {\
Log 3, "Schalter ".Value("Schalter_fuer_Pumpe");;\
Verbrauch($NAME);;\
}
#In 99_Utils.pm:
#==========================================================================
sub Verbrauch($)
{
my $Device = shift;
if (Value($Device) eq "on") {
my $Startzeit = time();
my $Endzeit = 0;
my $LaufzeitStunden = 0;
my $Verbrauch = 0;
}
elsif (Value($Device) eq "off") {
my $Startzeit = ReadingsVal($Device, "Startzeit", "n.a.");
my $Endzeit = time();
my $LaufzeitStunden = Zeitdifferenz($Startzeit, $Endzeit);
my $Verbrauch = Verbrauchberechnen($LaufzeitStunden);
}else {return "Fehler - keine Start-Endzeit ermittelt";}
Eintrag($Device, "Startzeit",$Startzeit);
Eintrag($Device, "Endzeit",$Endzeit);
Eintrag($Device, "Laufzeit in Stunden", $LaufzeitStunden);
Eintrag($Device, "Verbrauch", $Verbrauch);
}
#==========================================================================
sub Zeitdifferenz($$){
my $time1 = shift;
my $time2 = shift;
my $difference = $time2 - $time1;
my $difference_in_hours = sprintf "%.2f",(($difference / 60) /60);
print "Laufzeit in Stunden: $difference_in_hours\n";
}
#==========================================================================
sub Verbrauchberechnen($) {
#Stundenverbrauch (KWatt) x Nutzungstunden pro Tag x 365,25 x KWh-Preis
# 500Watt x Laufzeit/Tag x 365,25 x 0,21
#in h/Tag
my $Laufzeit = shift;
$Laufzeit = $Dauer / 12;
# in kw/h
my $Watt = 0.5;
# in EUR/kWh
my $PreisproStunde = 0.21;
if ($Dauer eq "") {return "Error - keine Laufzeit ermittelt"};
my $Verbrauch = ($Watt * $Dauer * 365,25 * $PreisproStunde);
return "$Verbrauch";
}
#==========================================================================
sub Eintrag($$$)
{
my $Device = shift;
my $ReadingsName = shift;
my $ReadingsWert = shift;
readingsBeginUpdate($main::defs{$Device});
readingsBulkUpdate($main::defs{$Device}, $ReadingsName, $ReadingsWert);
readingsBulkUpdate($main::defs{$Device}, $ReadingsName, $ReadingsWert);
readingsEndUpdate($main::defs{$Device}, 1);
}
#=========================================================================
MfG, MisterEltako.
Wow das sieht wirklich super aus!!
Gibts noch eine Möglichkeit jedem Aktor eine eigene Leistung zuzuweisen?
Ok, das kann ich noch ändern. Im o.g. Code sind noch Fehler drin. Die habe ich heute beim ausprobieren korrigiert. Ich poste morgen den korrigierten und um Watt-Wahl ergänzten Code.
Heute ist es schon zu spät...
MfG, MisterEltako
Ok das wäre super. Danke!
#in Fhem.cfg
#Verbrauch(<Einschaltdevice>,<KWatt des Verbrauchers>)
#Verbrauch in EUR/Jahr wird in den Readings des <Einschaltdevice> angezeigt!!!!
#========================================
define Schalter_fuer_Pumpe dummy
attr Schalter_fuer_Pumpe webCmd on:off
define n_Pumpe notify Schalter_fuer_Pumpe {\
Log 3, "Schalter ".Value("Schalter_fuer_Pumpe");;\
Verbrauch($NAME, 0.5);;\
}
#========================================
#in 99_Utils.pm
#==========================================================================
sub Verbrauch($$)
{
my $Device = shift;
my $kWatt = shift;
my $Startzeit = "";
my $Endzeit = 0;
my $LaufzeitStunden = 0;
my $Verbrauch = 0;
if (Value($Device) eq "on") {
$Startzeit = time();
}
elsif (Value($Device) eq "off") {
$Startzeit = ReadingsVal($Device, "Startzeit", "n.a.");
$Endzeit = time();
$LaufzeitStunden = Zeitdifferenz($Startzeit, $Endzeit);
Log 3, "Laufzeit: $LaufzeitStunden";
$Verbrauch = sprintf "%.2f", (Verbrauchberechnen($LaufzeitStunden, $kWatt));
}else {return "Fehler - keine Start-Endzeit ermittelt";}
Eintrag($Device, "Startzeit", $Startzeit);
Eintrag($Device, "Endzeit", $Endzeit);
Eintrag($Device, "Laufzeit_in_Stunden", $LaufzeitStunden);
Eintrag($Device, "Verbrauch_in_EUR_pro_Jahr", $Verbrauch);
}
#==========================================================================
sub Zeitdifferenz($$){
my $time1 = shift;
my $time2 = shift;
my $difference = $time2 - $time1;
my $difference_in_hours = sprintf "%.2f",(($difference / 60) /60);
Log 3, "Laufzeit in Stunden: $difference_in_hours";
return $difference_in_hours;
}
#==========================================================================
sub Verbrauchberechnen($$)
{
#Stundenverbrauch (KWatt) x Nutzungstunden pro Tag x 365,25 x KWh-Preis
# 500Watt x Laufzeit/Tag x 365.25 x 0,21
#in h/Tag
my $Dauer = shift;
my $kWatt = shift;
my $Laufzeit = sprintf "%.2f",($Dauer / 12);
# in EUR/kWh
my $PreisproStunde = 0.21;
my $Verbrauch = ($kWatt * $Laufzeit * 365.25 * $PreisproStunde);
Log 3, "$kWatt mal $Laufzeit mal 365,25 mal $PreisproStunde ist $Verbrauch";
return "$Verbrauch";
}
#==========================================================================
sub Eintrag($$$)
{
my $Device = shift;
my $ReadingsName = shift;
my $ReadingsWert = shift;
readingsBeginUpdate($main::defs{$Device});
readingsBulkUpdate($main::defs{$Device}, $ReadingsName, $ReadingsWert);
readingsBulkUpdate($main::defs{$Device}, $ReadingsName, $ReadingsWert);
readingsEndUpdate($main::defs{$Device}, 1);
}
#=========================================================================
MfG, MisterEltako
Schaut gut aus und dein Beispiel Funktioniert!
aber wie baue ich es jetzt am besten in meine Aktoren ein?
Ich kann ja nicht für alles einen dummy anlegen :-(
Gruß Markus
Hallo,
dann bau dir doch das
Zitatdefine Schalter_fuer_Pumpe dummy
attr Schalter_fuer_Pumpe webCmd on:off
define n_Pumpe notify Schalter_fuer_Pumpe {\
Log 3, "Schalter ".Value("Schalter_fuer_Pumpe");;\
Verbrauch($NAME, 0.5);;\
}
für deine Aktoren um.
Grüße
Danke Danke!!!! Genau das brauch ich für mein Grundgerüst. Ich werde versuchen es noch zu erweitern und meinen Bedürfnissen anzupassen. Dann poste ich das fertige Script nochmal hier!
Nochmal vielen Dank für deine mühe!!
Von mir auch ein dickes Danke.