FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: TottiToad am 25 Januar 2018, 10:39:04

Titel: Tagesverbrauch errechnen (Mit Reading-werten rechnen ?)
Beitrag von: TottiToad am 25 Januar 2018, 10:39:04
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
Titel: Antw:Tagesverbrauch errechnen (Mit Reading-werten rechnen ?)
Beitrag von: Frank_Huber am 25 Januar 2018, 10:47:49
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
Titel: Antw:Tagesverbrauch errechnen (Mit Reading-werten rechnen ?)
Beitrag von: nils_ am 25 Januar 2018, 11:16:19
vielleicht ist ja auch das hier was für dich:
https://fhem.de/commandref_DE.html#userReadings
Titel: Antw:Tagesverbrauch errechnen (Mit Reading-werten rechnen ?)
Beitrag von: TottiToad am 25 Januar 2018, 13:06:09
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
Titel: Antw:Tagesverbrauch errechnen (Mit Reading-werten rechnen ?)
Beitrag von: Frank_Huber am 25 Januar 2018, 13:11:34
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.

Titel: Antw:Tagesverbrauch errechnen (Mit Reading-werten rechnen ?)
Beitrag von: TottiToad am 25 Januar 2018, 13:21:26
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
Titel: Antw:Tagesverbrauch errechnen (Mit Reading-werten rechnen ?)
Beitrag von: Frank_Huber am 25 Januar 2018, 13:23:00
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.
Titel: Antw:Tagesverbrauch errechnen (Mit Reading-werten rechnen ?)
Beitrag von: nils_ am 25 Januar 2018, 13:28:13
dann wird es vielleicht doch was für
https://fhem.de/commandref_DE.html#devspec mit FILTER
Titel: Antw:Tagesverbrauch errechnen (Mit Reading-werten rechnen ?)
Beitrag von: TottiToad am 25 Januar 2018, 17:24:01
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
Titel: Antw:Tagesverbrauch errechnen (Mit Reading-werten rechnen ?)
Beitrag von: nils_ am 26 Januar 2018, 08:21:20
Zitat von: TottiToad am 25 Januar 2018, 17:24:01
Jetzt stehe ich noch vor der Frage wie ich den sub einmal täglich um 0:05 aufrufe ?

https://fhem.de/commandref_DE.html#at
Titel: Antw:Tagesverbrauch errechnen (Mit Reading-werten rechnen ?)
Beitrag von: TottiToad am 26 Januar 2018, 10:46:43
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 ?
Titel: Antw:Tagesverbrauch errechnen (Mit Reading-werten rechnen ?)
Beitrag von: Frank_Huber am 26 Januar 2018, 11:00:19
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.
Titel: Antw:Tagesverbrauch errechnen (Mit Reading-werten rechnen ?)
Beitrag von: TottiToad am 26 Januar 2018, 11:52:47
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
Titel: Antw:Tagesverbrauch errechnen (Mit Reading-werten rechnen ?)
Beitrag von: nils_ am 26 Januar 2018, 12:14:45
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....
Titel: Antw:Tagesverbrauch errechnen (Mit Reading-werten rechnen ?)
Beitrag von: TottiToad am 28 Januar 2018, 00:36:09
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
Titel: Antw:Tagesverbrauch errechnen (Mit Reading-werten rechnen ?)
Beitrag von: Frank_Huber am 28 Januar 2018, 09:47:08
Zitat von: TottiToad am 28 Januar 2018, 00:36:09
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

Hi, Dein Wert steigt, damit ist die Berechnung "alt minus neu" falschrum.
Das hatte ich übersehen. mach Wert1- Wert2, dann passt es.

Startwerte mit "setreading HKV_Buro Tagesverbrauch 999"
Aber ich denke Du meinst für den Plot, Da musst Du dein Logfile/DBLog händisch anpassen.
So kannst auch die negativen Werte korrigieren.
Titel: Antw:Tagesverbrauch errechnen (Mit Reading-werten rechnen ?)
Beitrag von: TottiToad am 28 Januar 2018, 11:14:57
Danke !!!

Da hätte ich selbst auch mal drauf kommen können, eigentlich sogar müssen  ;D ;)

Nennt sich Mathe  ::) ???