Hallo zusammen,
ich habe verschiedene Geräte wie z.B. Shellys. Diese sind ohne an der eigenen Cloud angebunden zu sein, in der Lage mir eine aktuelle Leistung zu nennen. Wie kann ich diese Werte nun am besten in Tages Werte/Wochen Werte usw. berechnen?
Wie macht ihr das und was macht am meisten Sinn?
Anbei mal ein Beispiel List:
Internals:
CHANGED
CID shellyplug_s_7ADE50
DEF shellyplug_s_7ADE50
DEVICETOPIC MQTT2_shellyplug_s_7ADE50
FUUID 5d4b163d-f33f-fcb4-3a19-8023f759eb23acfa
IODev MQTT2_FHEM_Server
LASTInputDev MQTT2_FHEM_Server
MQTT2_FHEM_Server_MSGCNT 1400
MQTT2_FHEM_Server_TIME 2019-08-08 07:23:39
MSGCNT 1400
NAME MQTT2_shellyplug_s_7ADE50
NR 385
STATE on
TYPE MQTT2_DEVICE
READINGS:
2019-08-08 06:38:39 fw_ver 20190711-084501/v1.5.0-hotfix4@3b4f7414
2019-08-08 06:38:39 id shellyplug-s-7ADE50
2019-08-08 06:38:39 ip 192.168.xx.xx
2019-08-08 06:38:39 mac B4E62D7ADE50
2019-08-08 06:38:39 new_fw false
2019-08-08 06:38:39 online true
2019-08-08 07:23:39 overtemperature 0
2019-08-07 20:27:41 relay0 off
2019-08-08 07:23:39 relay_0 on
2019-08-08 07:23:39 relay_0_energy 15926
2019-08-08 07:23:39 relay_0_power 186.68
2019-08-08 07:23:39 state on
2019-08-08 07:23:39 temperature 40.76
Man sieht hier gut, ich habe nur den Wert aus relay_0_power (aktueller Verbrauch) und relay_0_energy (gesamt Verbrauch bisher). Immer wenn ein Shelly an ist, sendet er mir auch die Info zu diesem Wert (gut, macht ja auch Sinn).
Hi,
Ich mache das mit at's welche täglich bzw wöchentlich/monatlich loslaufen.
darin schreibe ich die Verbrauchswerte in einen Dummy.
defmod Verbrauch_Tag at *00:00:01 {\
\
# TAGESVERBRAUCH PELLETS\
my $wert1=ReadingsVal("ETA_Vorrat_1_Silo","Silo_Vorrat","--");; # einlesen Silo-Vorrat\
my $wert2=ReadingsVal("ETA_Vorrat_2_Kessel","Vorrat_2_Kessel","--");; # einlesen Kessel-Vorrat\
my $wert3=ReadingsVal("Verbrauch","Pelletslager","--");; # einlesen Bestand Vortag\
my $wert4=ReadingsVal("Energiekosten","Pelletspreis","--");; # einlesen Pelletpreis\
my $wert5=$wert1+$wert2;; # berechnen Gesamt-Vorrat \
my $wert6=$wert3-$wert5;; # berechnen Tagesverbrauch (Bestand Vortag minus Gesamt-Vorrat)\
my $wert7=($wert4/1000)*$wert6;; # berechnen Tageskosten (Verbrauch mal Kilo-Preis)\
my $wert8=round($wert7,2);; # runden der Tagskosten auf cent\
fhem("setreading Verbrauch Pelletslager $wert5");; # setzen neuer Bestand\
fhem("setreading Verbrauch Pelletsverbrauch $wert6");; # setzen Tagesverbrauch\
fhem("setreading Energiekosten PelletsKostenTag $wert8");; # setzen Tageskosten\
\
# TAGESVERBRAUCH STROM GESAMT\
my $wert9=ReadingsVal("Stromzaehler","total_consumption","--");; # einlesen Zählerstand\
my $wert10=$wert9/1000;; # umrechnen Zählerstand Wh zu KWh\
my $wert11=ReadingsVal("Verbrauch","Stromzaehler","--");; # einlesen Zählerstand Vortag\
my $wert12=ReadingsVal("Energiekosten","Strompreis","--");; # einlesen Strompreis\
my $wert13=$wert10-$wert11;; # berechnen Tagesverbrauch\
my $wert14=round($wert13,1);; # runden Tagesverbrauch auf eine Stelle nach Komma\
my $wert15=$wert13*$wert12;; # berechnen Tageskosten\
my $wert16=round($wert15,2);; # runden Tageskosten auf cent\
fhem("setreading Verbrauch Stromzaehler $wert10");; # setzen KWh Zählerstand\
fhem("setreading Verbrauch Stromverbrauch $wert14");; # setzen Tagesverbrauch gerundet\
fhem("setreading Energiekosten StromKostenTag $wert16");; # setzen Tageskosten gerundet\
\
# TAGESVERBRAUCH POWERMETER 1 - HEIZUNG\
my $wert17=ReadingsVal("HM_Powermeter_1_Pwr","energyCalc","--");; # einlesen Zählerstand\
my $wert18=$wert17/1000;; # umrechnen Zählerstand Wh zu KWh\
my $wert19=ReadingsVal("Verbrauch","HM_Powermeter_1","--");; # einlesen Zählerstand Vortag\
my $wert20=$wert18-$wert19;; # berechnen Tagesverbrauch\
my $wert21=round($wert20,1);; # runden Tagesverbrauch auf eine Stelle nach Komma\
my $wert22=$wert20*$wert12;; # berechnen Tageskosten\
my $wert23=round($wert22,2);; # runden Tageskosten auf cent\
fhem("setreading Verbrauch HM_Powermeter_1 $wert18");; # setzen Zählerstand\
fhem("setreading Verbrauch HM_Powermeter_1_VerbrauchTag $wert21");; # setzen Tagesverbrauch gerundet\
fhem("setreading Energiekosten HM_Powermeter_1_KostenTag $wert23");; # setzen Tageskosten gerundet\
\
# TAGESVERBRAUCH POWERMETER 2 - EDV\
my $wert24=ReadingsVal("HM_Powermeter_2_Pwr","energyCalc","--");; # einlesen Zählerstand\
my $wert25=$wert24/1000;; # umrechnen Zählerstand Wh zu KWh\
my $wert26=ReadingsVal("Verbrauch","HM_Powermeter_2","--");; # einlesen Zählerstand Vortag\
my $wert27=$wert25-$wert26;; # berechnen Tagesverbrauch\
my $wert28=round($wert27,1);; # runden Tagesverbrauch auf eine Stelle nach Komma\
my $wert29=$wert27*$wert12;; # berechnen Tageskosten\
my $wert30=round($wert29,2);; # runden Tageskosten auf cent\
fhem("setreading Verbrauch HM_Powermeter_2 $wert25");; # setzen Zählerstand\
fhem("setreading Verbrauch HM_Powermeter_2_VerbrauchTag $wert28");; # setzen Tagesverbrauch gerundet\
fhem("setreading Energiekosten HM_Powermeter_2_KostenTag $wert30");; # setzen Tageskosten gerundet\
\
# TAGESVERBRAUCH POWERMETER 3 - WASSERBETT\
my $wert31=ReadingsVal("HM_Powermeter_3_Pwr","energyCalc","--");; # einlesen Zählerstand\
my $wert32=$wert31/1000;; # umrechnen Zählerstand Wh zu KWh\
my $wert33=ReadingsVal("Verbrauch","HM_Powermeter_3","--");; # einlesen Zählerstand Vortag\
my $wert34=$wert32-$wert33;; # berechnen Tagesverbrauch\
my $wert35=round($wert34,1);; # runden Tagesverbrauch auf eine Stelle nach Komma\
my $wert36=$wert34*$wert12;; # berechnen Tageskosten\
my $wert37=round($wert36,2);; # runden Tageskosten auf cent\
fhem("setreading Verbrauch HM_Powermeter_3 $wert32");; # setzen Zählerstand\
fhem("setreading Verbrauch HM_Powermeter_3_VerbrauchTag $wert35");; # setzen Tagesverbrauch gerundet\
fhem("setreading Energiekosten HM_Powermeter_3_KostenTag $wert37");; # setzen Tageskosten gerundet\
\
# TAGESKOSTEN HEIZUNG GESAMT\
my $wert38=$wert7+$wert22;; # summieren Tagesgesamtkosten der Heizung\
my $wert39=round($wert38,2);; # runden Tagesgesamtkosten der Heizung\
fhem("setreading Energiekosten HeizkostenGesamtTag $wert39");; # setzen Tagesgesamtkosten der Heizung gerundet\
\
\
WriteStatefile()\
}
attr Verbrauch_Tag DbLogExclude .*
attr Verbrauch_Tag group Energieberechnung
attr Verbrauch_Tag room _HSA
ähnliche dann für Woche und Monat.
sollte durch die Kommentare selbsterklärend sein.
Man kann es auch der Übersicht im at halber in die myutils packen und dann im at nur aufrufen.
Guten Morgen Frank,
danke für deinen Code.
Ich hatte mir sowas wie Userreadings im jeweiligem Gerät vorgestellt.
Ich weiß zum einen aber nicht wie ich von W / Verbrauch aktuell auf Tag komme und ich weiß auch nicht wann der Zähler in "2019-08-08 07:23:39 relay_0_energy 15926" zurück gesetzt wird. Zudem finde ich die Zahl sehr hoch für kWh. Ich habe das Ding gestern erst angeschlossen. Demnach können es keine 15kWh sein. Da ist eine Pumpe hinter. Die zieht ca. 130W. Sollte 15926 ein Gesamt-Wert sein. Und dieser umgewandelt 1,5926 kWh ergeben, dann wäre es passend (denke ich). Dann könnte ich diesen Wert auch zum rechnen nehmen oder?
Sowas wie:
Gesamtwert vom 1 eines Monats zum letzten und dann die Differenz. Dann hätte ich einen Monatswert z.B. und das ganze dann für Tage usw. Würde das gerne bei allen Shellys mit Messung machen und das wirklich als Reading.
Hatte sowas mal für seperate Trocknungen beim Trockner gebastelt....
total_temp:running.*on.* { ReadingsVal("s_trockner","total",0) },trocknungsgang:running.*off.* { ReadingsVal("s_trockner","total",0) - ReadingsVal("s_trockner","total_temp",0) }
Habe hier nur aktuell keine Idee wie ich es am besten mache und was mir da genau von "energy" ausgegeben wird.
Den Code kannst Dir ja entsprechend umbauen.
Aber wie der Shelly die Energy angibt weis ich nicht.
normalerweise würde ich von Wh ausgehen. also Wert/1000=KWh.
Hat der Shelly evtl schon was auf den Zähler gehabt?
Vielleicht mal resetten und beobachten?
Ne die haben alle relativ schnell solche Werte. Weswegen ich davon ausgehe, das es einfach mehr Nachkommastellen sein sollten und dementsprechend teile ich erstmal durch 10.000.
Der war jungfräulich zu Beginn. Die API von denen ist leider auch sehr schlecht erklärt. Dieser Punkt zum Beispiel gar nicht.
Ich könnte sicherlich vieles umbauen. Kann mir nur kaum vorstellen das es nicht schon was fertiges gibt. Hab mir die Finger wund gegooglet.
Es gibt ja doch einige Geräte die einen Verbrauch melden aber ggf. kein Tages oder Montas usw.....
Ich danke dir auf jeden Fall, wie immer, für deine schnelle Hilfe. Bin aber noch gespannt was ggf. noch kommt.
Dann wären es Wh mit einer Nachkommastelle. kann auch sein.
Einfach beobachten und kontrollieren.
Wenn ein 100W Gerät eine Stunde an ist müssen am Ende 0,1 KWh auf dem Zähler sein. :)
Es gibt das statistics Modul, das müsste dann evtl etwas für dich sein.
Das war mir aber zu umfangreich, daher hab ich die Version mit Dummy und eigener Berechnung zusammengebaut.
Ich habe auch ein paar Geräte von denen ich Tages, Wochen & Monats Verbrauch haben will und die Werte in eigenen Dateien logge.
Meine Umsetzung :
Ein at das jede Nacht um kurz vor Mitternacht läuft , z.b. 23:59:30 . In dem at werden alle betroffenen Geräte abgefragt auf ihr aktuelles energy Reading
(Verbrauch). Dieser Wert wird am Ende in ein neues Reading kopiert , z.b energy_midnight. Zuvor wird aber die Differenz berechnet aus energy-energy_midnight und kommt ins Reading energy_day. So kannst du schon mal den Tagesverbrauch in einer Log Datei sammeln. Entweder einzeln für jedes oder alle Geräte zusammen. Wenn du das auch noch auf Wochen oder Monatsebene haben willst kommen noch mehr neue Readings dazu und du schaust in deinem at ob der nächste Tag ein Montag ist (Wochenwert) und/oder der erste Tag eines neuen Monats. Den energy_midnight Wert muß man sich dann natürlich noch in anderen Readings retten wie z.B. energy_midnight_week oder energy_midnight_month, um die jeweilige Differenz bilden zu können.
Edit : das statistics Modul mag ich ebenso wenig wie Dummys :)
Zitat von: Wzut am 08 August 2019, 09:59:13
Ich habe auch ein paar Geräte von denen ich Tages, Wochen & Monats Verbrauch haben will und die Werte in eigenen Dateien logge.
Meine Umsetzung :
Ein at das jede Nacht um kurz vor Mitternacht läuft , z.b. 23:59:30 . In dem at werden alle betroffenen Geräte abgefragt auf ihr aktuelles energy Reading
(Verbrauch). Dieser Wert wird am Ende in ein neues Reading kopiert , z.b energy_midnight. Zuvor wird aber die Differenz berechnet aus energy-energy_midnight und kommt ins Reading energy_day. So kannst du schon mal den Tagesverbrauch in einer Log Datei sammeln. Entweder einzeln für jedes oder alle Geräte zusammen. Wenn du das auch noch auf Wochen oder Monatsebene haben willst kommen noch mehr neue Readings dazu und du schaust in deinem at ob der nächste Tag ein Montag ist (Wochenwert) und/oder der erste Tag eines neuen Monats. Den energy_midnight Wert muß man sich dann natürlich noch in anderen Readings retten wie z.B. energy_midnight_week oder energy_midnight_month, um die jeweilige Differenz bilden zu können.
Edit : das statistics Modul mag ich ebenso wenig wie Dummys :)
Das ist genau das was mein at macht. :-) nur samle ich alle Verbrauchswerte in einem dummy, find ich übersichtlicher. Aber ja, Userreading geht auch.
Teste gerade mit statistics ein wenig. Das scheint auch genau das zu machen was man so braucht.
Gibt es einen Grund, dass du es selber "erfunden" hast?
Zitat von: Frank_Huber am 08 August 2019, 09:41:36
Es gibt das statistics Modul, das müsste dann evtl etwas für dich sein.
Das war mir aber zu umfangreich, daher hab ich die Version mit Dummy und eigener Berechnung zusammengebaut.
Das statistics macht permanent irgebndwelche Berechnungen und belastet damit das System.
Ich berechne die Werte selbst genau dann wann ich es möchte. einmal am Tag/Woche/Monat