FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Mark am 10 Juni 2013, 15:04:44

Titel: Stromverbrauch über die Laufzeit ermitteln?
Beitrag von: Mark am 10 Juni 2013, 15:04:44
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
Titel: Aw: Stromverbrauch über die Laufzeit ermitteln?
Beitrag von: fritz am 12 Juni 2013, 03:07:02
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>
Titel: Aw: Stromverbrauch über die Laufzeit ermitteln?
Beitrag von: Mark am 14 Juni 2013, 14:51:36
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
Titel: Aw: Stromverbrauch über die Laufzeit ermitteln?
Beitrag von: fhainz am 15 Juni 2013, 08:27:14
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
Titel: Aw: Stromverbrauch über die Laufzeit ermitteln?
Beitrag von: MisterEltako am 16 Juni 2013, 21:41:03
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
Titel: Aw: Stromverbrauch über die Laufzeit ermitteln?
Beitrag von: fhainz am 16 Juni 2013, 21:43:33
Genau sowas hatte ich gesucht. Diese Variante würde jetzt aber nur für einen Aktor funktionieren oder?
Titel: Aw: Stromverbrauch über die Laufzeit ermitteln?
Beitrag von: MisterEltako am 16 Juni 2013, 21:49:52
Das kann man anpassen wie man möchte. Was genau meinst hast du in deinem Fall vor?

MfG, MisterEltako
Titel: Aw: Stromverbrauch über die Laufzeit ermitteln?
Beitrag von: fhainz am 16 Juni 2013, 21:55:54
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 ;)
Titel: Aw: Stromverbrauch über die Laufzeit ermitteln?
Beitrag von: Puschel74 am 17 Juni 2013, 00:00:11
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 ;-)
Titel: Aw: Stromverbrauch über die Laufzeit ermitteln?
Beitrag von: Markus am 17 Juni 2013, 08:25:28
Aber wenn ich den verbrauch kenne kann fhem genauer schätzen als ich und zeigt mir auch noch ein Diagramm :-)

Gruß Markus
Titel: Aw: Stromverbrauch über die Laufzeit ermitteln?
Beitrag von: fhainz am 17 Juni 2013, 08:31:40
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.  
Titel: Aw: Stromverbrauch über die Laufzeit ermitteln?
Beitrag von: MisterEltako am 17 Juni 2013, 13:01:07
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.
Titel: Aw: Stromverbrauch über die Laufzeit ermitteln?
Beitrag von: fhainz am 17 Juni 2013, 17:36:40
Wow das sieht wirklich super aus!!
Gibts noch eine Möglichkeit jedem Aktor eine eigene Leistung zuzuweisen?
Titel: Aw: Stromverbrauch über die Laufzeit ermitteln?
Beitrag von: MisterEltako am 18 Juni 2013, 00:14:09
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
Titel: Aw: Stromverbrauch über die Laufzeit ermitteln?
Beitrag von: fhainz am 19 Juni 2013, 18:00:08
Ok das wäre super. Danke!
Titel: Aw: Stromverbrauch über die Laufzeit ermitteln?
Beitrag von: MisterEltako am 20 Juni 2013, 07:29:15
#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
Titel: Aw: Stromverbrauch über die Laufzeit ermitteln?
Beitrag von: Markus am 20 Juni 2013, 14:07:27
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
Titel: Aw: Stromverbrauch über die Laufzeit ermitteln?
Beitrag von: Puschel74 am 20 Juni 2013, 14:14:07
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
Titel: Aw: Stromverbrauch über die Laufzeit ermitteln?
Beitrag von: fhainz am 20 Juni 2013, 17:19:21
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!!
Titel: Aw: Stromverbrauch über die Laufzeit ermitteln?
Beitrag von: Mark am 21 Juni 2013, 13:58:09
Von mir auch ein dickes Danke.