Tagesverbrauch errechnen (Mit Reading-werten rechnen ?)

Begonnen von TottiToad, 25 Januar 2018, 10:39:04

Vorheriges Thema - Nächstes Thema

TottiToad

Hallo zusammen,

irgendwie stehe ich aufm Schlauch und weiß auch nicht genau wonach ich suchen soll, bzw. finde nur wesentlich komplexere Vorgehen als ich benötige.

Es geht mir um folgendes:

Ich erhalte über meine Heizkostenverteiler einmal täglich eine kumulierten Wert wieviel die Heizung bisher verbraucht hat (Die ist der aktuelle Jahresverbrauch)
Der Wert steigt also kontinuierlich.

Aktueller Reading Wert:
current_period   100

um 0:00 Uhr wird der neue Wert ausgelesene, dieser wird dann z.B.
current_period   150

- Wie kann ich jetzt in einem Userreading oder wie auch immer die Differenz des alten Wertes mit dem neuen Wert errechnen lassen ?

- Ich möchte mir letztendlich in einem Plot den Tages-, Wochen- und Monatsverbrauch anzeigen lassen. Hierfür benötige ich ja Werte

- Wie kann ich mit diesen Werten in FHEM rechnen


Ich hoffe ihr versteht wie und was ich damit meine ?!

Ich hoffe ihr könnt mir weiterhelfen

Bin über jegliche Hilfe dankbar
Grüße & Danke
Totti


EDIT: Falls es für Beispiele etc wichtig sein sollte, der Device Name ist HKV_Buro

Frank_Huber

#1
Würde es mit einem Notify auf das sich ändernde Reading lösen.

Aktion in etwa so:
{
my $wert1=ReadingsVal("HKV_Buro","current_period","--");
my $wert2=ReadingsVal("HKV_Buro","previous_period","--");
my $wert3=$wert2-$wert1;
fhem("setreading HKV_Buro Tagesverbrauch $wert3");
fhem("setreading HKV_Buro previous_period $wert1")
}


für Wöchentlich machst dann z.B. ein zweites Notify und machst
{
if ($wday == 1) {

davor und benennst previos in Montag um z.B.

Das selbe kannst dann mit §mday ==1 für Monatlich machen.

Hier hatte ich mal meine Lösung gepostet uznd beschrieben: https://forum.fhem.de/index.php/topic,77330.msg692755.html#msg692755

nils_

viele Wege in FHEM es gibt!

TottiToad

Hi,

danke schon mal ... werde mir die Lösungen mal genauer ansehen.
Muss nur sehen wie praktisch es ist mit 14 Heizkostenzählern.

Bin für weitere Ideen und Lösungen offen ;)

Grüße & Danke
Totti

Frank_Huber

Zitat von: TottiToad am 25 Januar 2018, 13:06:09
Muss nur sehen wie praktisch es ist mit 14 Heizkostenzählern.

14?

Dann würde ich das ganze in die myUtils auslagern und nur nach Mitternacht einmal aufrufen.


TottiToad

Zitat von: Frank_Huber am 25 Januar 2018, 13:11:34
14?

Dann würde ich das ganze in die myUtils auslagern und nur nach Mitternacht einmal aufrufen.

Ja "leider" 14 Heizkörper im Haus verteilt.

Muss mal sehen wie ich das ganze in myUtils auslagern kann und evtl eine Berechnung für alle mache.
Mal sehen.

Vielleicht gibt es ja welche die sowas schon umgesetzt haben ?

Danke
Totti

Frank_Huber

im Prinzip machst das hier dann 14 mal in der myUtils.
{
my $wert1=ReadingsVal("HKV_Buro","current_period","--");
my $wert2=ReadingsVal("HKV_Buro","previous_period","--");
my $wert3=$wert2-$wert1;
fhem("setreading HKV_Buro Tagesverbrauch $wert3");
fhem("setreading HKV_Buro previous_period $wert1")
}

Die Auslagerung dahin macht das aufrufende at / notify / DOIF übersichtlicher.

nils_

viele Wege in FHEM es gibt!

TottiToad

Hi,

ich Versuchs jetzt erstmal über 99_myUtils.pm


sub tagesverbrauch(){
{
my $wert1=ReadingsVal("HKV_Buro","current_period","--");
my $wert2=ReadingsVal("HKV_Buro","previous_period","--");
my $wert3=$wert2-$wert1;
fhem("setreading HKV_Buro Tagesverbrauch $wert3");
fhem("setreading HKV_Buro previous_period $wert1")
}
{
my $wert4=ReadingsVal("HKV_Wohn_li","current_period","--");
my $wert5=ReadingsVal("HKV_Wohn_li","vortag","--");
my $wert6=$wert5-$wert4;
fhem("setreading HKV_Buro Tagesverbrauch2 $wert6");
fhem("setreading HKV_Buro vortag $wert4")
}
{
my $wert7=ReadingsVal("HKV_Wohn_re","current_period","--");
my $wert8=ReadingsVal("HKV_Wohn_re","vortag","--");
my $wert9=$wert8-$wert7;
fhem("setreading HKV_Buro Tagesverbrauch2 $wert9");
fhem("setreading HKV_Buro vortag $wert7")
}
{
my $wert10=ReadingsVal("HKV_Wohn_mi","current_period","--");
my $wert11=ReadingsVal("HKV_Wohn_mi","vortag","--");
my $wert12=$wert11-$wert10;
fhem("setreading HKV_Buro Tagesverbrauch2 $wert12");
fhem("setreading HKV_Buro vortag $wert10")
}
}


Hab da jetzt einfach mal nen paar HKVs eingetragen um es auszuprobieren.

Der Code sollte ja jetzt für den täglichen Verbrauch sein.

Bzgl. Wochen- und Monats Eintrag werde ich später dann schauen wenns klappen sollte, auch bzgl. Filter etc.
Erst mal überhaupt zum laufen bekommen und Werte erhalten ;)


Jetzt stehe ich noch vor der Frage wie ich den sub einmal täglich um 0:05 aufrufe ?


Grüße & Danke
Torsten

nils_

viele Wege in FHEM es gibt!

TottiToad

#10
Zitat von: nils_ am 26 Januar 2018, 08:21:20
https://fhem.de/commandref_DE.html#at

Manchmal ist es so einfach :) ;)

define HKV_berechnen at *00:05:00 {tagesverbrauch()}

klappt.

Um Sachen zu verstehen muss ich meist erst mal Beispiele haben.



Die Nacht wurde jedenfalls der Wert vom Vortag gespeichert, ob es dann wirklich klappt wird sich diese Nacht zeigen.

Bin gespannt.

Ich habe auch gleichzeitig noch nen Versuch mit Dummys gemacht, denke aber das es über UserReadings übersichtlicher ist bei so vielen Zählern.

Muss jetzt mal sehen, wie ich mit Filtern arbeiten kann, bzw. wie ich den Code soweit ändern kann, das ich nicht für 14 Verteiler jeweils einen 4 Zeilen schrieben muss.

Grüße & Danke
Torsten

EDIT:
@ Frank_Huber

Bezüglich der wöchentlichen und monatlichen Werte habe ich was noch nicht ganz verstanden.

Muss ich dann den gesamten code nochmals in 99_myUtils.pm eintragen mit dem Beginn
if ($mday == 1) { ???

und dann nochmals den gesamten Code mit:
if ($wday == 1) {

Also alles dann 3 mal eintragen ?

Frank_Huber

Zitat von: TottiToad am 26 Januar 2018, 10:46:43
@ Frank_Huber
Bezüglich der wöchentlichen und monatlichen Werte habe ich was noch nicht ganz verstanden.

Muss ich dann den gesamten code nochmals in 99_myUtils.pm eintragen mit dem Beginn
if ($mday == 1) { ???

und dann nochmals den gesamten Code mit:
if ($wday == 1) {

Also alles dann 3 mal eintragen ?

So mach ich es momentan.

Aber mit jeweils anderem "vorherigem Wert"
ich hab "ZaehlerVortag", "ZaehlerMontag" und "Zaehler1ter" als separate Readings.
Tag, Woche und Monat in separate at. (jewils zu bischen anderen Zeiten. 00:00:01, 00:00:30 und 00:01:00.

Bei mir habe ich noch den Code im at. Will das aber auch in die myutils auslagern.
defmod Verbrauch_Monat at *00:01:00 {\
if ($mday == 1) {\
\
use Math::Round qw/round/;;\
\
my $wert1=ReadingsVal("ETA_Vorrat_1_Silo","Silo_Vorrat","--");;\
my $wert2=ReadingsVal("ETA_Vorrat_2_Kessel","Vorrat_2_Kessel","--");;\
my $wert4=$wert1+$wert2;;\
my $wert3=ReadingsVal("Verbrauch","Pelletslager1ter","--");;\
my $wert5=$wert3-$wert4;;\
fhem("setreading Verbrauch Pelletslager1ter $wert4");;\
fhem("setreading Verbrauch PelletsverbrauchMonat $wert5");;\
\
my $wert6=ReadingsVal("Stromzaehler","total_consumption","--");;\
my $wert7=$wert6/1000;;\
my $wert8=ReadingsVal("Verbrauch","Stromzaehler1ter","--");;\
my $wert9=$wert7-$wert8;;\
$wert9 = Math::Round::nearest('0.1',$wert9);;\
fhem("setreading Verbrauch Stromzaehler1ter $wert7");;\
fhem("setreading Verbrauch StromverbrauchMonat $wert9");;\
\
\
my $wert10=ReadingsVal("HM_Powermeter_1_Pwr","energyCalc","--");;\
my $wert11=$wert10/1000;;\
my $wert12=ReadingsVal("Verbrauch","HM_Powermeter_1_1ter","--");;\
my $wert13=$wert11-$wert12;;\
$wert13 = Math::Round::nearest('0.1',$wert13);;\
fhem("setreading Verbrauch HM_Powermeter_1_1ter $wert11");;\
fhem("setreading Verbrauch HM_Powermeter_1_VerbrauchMonat $wert13");;\
\
my $wert14=ReadingsVal("HM_Powermeter_2_Pwr","energyCalc","--");;\
my $wert15=$wert14/1000;;\
my $wert16=ReadingsVal("Verbrauch","HM_Powermeter_2_1ter","--");;\
my $wert17=$wert15-$wert16;;\
$wert17 = Math::Round::nearest('0.1',$wert17);;\
fhem("setreading Verbrauch HM_Powermeter_2_1ter $wert15");;\
fhem("setreading Verbrauch HM_Powermeter_2_VerbrauchMonat $wert17");;\
\
my $wert18=ReadingsVal("HM_Powermeter_3_Pwr","energyCalc","--");;\
my $wert19=$wert18/1000;;\
my $wert20=ReadingsVal("Verbrauch","HM_Powermeter_3_1ter","--");;\
my $wert21=$wert19-$wert20;;\
$wert21 = Math::Round::nearest('0.1',$wert21);;\
fhem("setreading Verbrauch HM_Powermeter_3_1ter $wert19");;\
fhem("setreading Verbrauch HM_Powermeter_3_VerbrauchMonat $wert21");;\
\
\
WriteStatefile()\
}}


WriteStatefile am Ende damit das State file nach der Bewechnung geschrieben wird.
Sonst kann es Fehlberechnungen geben wenn FHEM mal abstürzt.

TottiToad

Hi,

ich habe mal so probiert, bekomme aber leider eine Fehler Meldung

sub wochenverbrauch(){
my $wday = localtime(time);
if ($wday == 5)
{
my $wert1=ReadingsVal("HKV_Buro","current_period","--");
my $wert2=ReadingsVal("HKV_Buro","Stand_vorherige_Woche","--");
my $wert3=$wert2-$wert1;
fhem("setreading HKV_Buro Wochenverbrauch $wert3");
fhem("setreading HKV_Buro Stand_vorherige_Woche $wert1")
}
}


Fehler:
PERL WARNING: Argument "Fri Jan 26 11:49:00 2018" isn't numeric in numeric eq (==) at ./FHEM/99_myUtils

Wo liegt mein Denkfehler ?

Grüße & Danke
Torsten

nils_

my $wday = localtime(time);
if ($wday == 5)


da liegt der fehler.....
guck dir mal den rückgabewert von localtime() an.


das beispielt wird in einem at aufgerufen....
viele Wege in FHEM es gibt!

TottiToad

Danke für die Hinweise und Tipps !

Nutze jetzt für die Woche und Monat jeweils ein at

Der Code funktioniert soweit auch, jedoch werden die Werte als Negativwerte in den Readings angezeigt.
z.B. HKV_Buro Tagesverbrauch -14

Woran kann es liegen das die Werte negativ sind ?

Hier nochmals ein Ausschnitt aus dem Code:


sub tagesverbrauch(){
{
my $wert1=ReadingsVal("HKV_Buro","current_period","--");
my $wert2=ReadingsVal("HKV_Buro","vortag","--");
my $wert3=$wert2-$wert1;
fhem("setreading HKV_Buro Tagesverbrauch $wert3");
fhem("setreading HKV_Buro vortag $wert1")
}
}


Und noch ne Frage

- Wie kann ich einen "Startwert in den Userreadings übergeben ?


Grüße & Danke
Torsten