Hauptmenü

Readings Zusammenrechnen

Begonnen von netpirat, 25 September 2022, 15:13:12

Vorheriges Thema - Nächstes Thema

netpirat

Hallo,

hat jemand ne einfache Art diese Readings zusammenzurechnen?

Ich bekomme das mit einem at einfach nicht hin.Habe immer 0 dort raus?
   

+*01:00:00 {fhem('setreading SUM_EG_KU_AktuellerStundenStromverbrauch
([STK_EG_KU_Arbeitsecke_links_KWH:statRechenwertHour]+
[STK_EG_KU_Arbeitsecke_mitte_KWH:statRechenwertHour]+   
[STK_EG_KU_Arbeitsecke_rechts_KWH:statRechenwertHour]+   
[STK_EG_KU_Backofen_KWH:statRechenwertHour]+
[STK_EG_KU_Bistrotisch_links_KWH:statRechenwertHour]+   
[STK_EG_KU_Bistrotisch_mitte_KWH:statRechenwertHour]+   
[STK_EG_KU_Bistrotisch_rechts_KWH:statRechenwertHour]+
[STK_EG_KU_Dunstabzug_KWH:statRechenwertHour]+
[STK_EG_KU_Dunstabzug_links_KWH:statRechenwertHour]+
[STK_EG_KU_Dunstabzug_rechts_KWH:statRechenwertHour]+
[STK_EG_KU_Highboard_links_KWH:statRechenwertHour]+
[STK_EG_KU_Highboard_rechts_KWH:statRechenwertHour]+
[STK_EG_KU_Kuehlschrank_KWH:statRechenwertHour]+
[STK_EG_KU_Mikrowelle_KWH:statRechenwertHour]+   
[STK_EG_KU_Spuehlmaschine_KWH:statRechenwertHour])')}



Am liebsten wäre mir wenn ich alle Devices mit STK_EG_KU.*_KWH und dem Reading statRechenwertHour jede Stunde zusammenrechnen kann.


Gruß
      


betateilchen

Abgesehen davon, dass Dein setreading Befehl schon syntaktisch falsch ist (entweder fehlt der Name des devices oder der Name des gewünschten readings) bin ich mir nicht sicher, ob Dein Mischmasch zwischen perl, FHEM-Befehl und setmagic alleine theoretisch so überhaupt funktioniern kann. Da müsste doch eigentlich sogar eine Fehlermeldung im Log stehen?

Das Zusammenrechnen würde ich in einer Funktion in der 99_myUtils erledigen und diese Funktion in dem at aufrufen. Das ist auf jeden Fall übersichtlicher und einfache nachvollziehbar.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Otto123

#2
Hi,

ich sehe spontan eine Vereinfachung und zwei Fehler:
* {fhem('')} ist unnötig.
* setreading device reading Wert . Device oder Reading fehlt bei Dir.
* beim Rechnen kannst Du eine Mischung set magic machen (Auszug aus deinem Code, so in der Art getestet  ;) )
setreading device reading {( [STK_EG_KU_Mikrowelle_KWH:statRechenwertHour] + [STK_EG_KU_Spuehlmaschine_KWH:statRechenwertHour] )}

Wobei ich immer die Schreibweise ReadingsVal() bzw. ReadingsNum() innerhalb der Perl Klammer {} verwenden würde.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

betateilchen

Zitat von: netpirat am 25 September 2022, 15:13:12
hat jemand ne einfache Art diese Readings zusammenzurechnen?
...
Am liebsten wäre mir wenn ich alle Devices mit STK_EG_KU.*_KWH und dem Reading statRechenwertHour jede Stunde zusammenrechnen kann.

kann man das nicht sinnvollerweise mit einem statistics-device lösen?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

netpirat

Hallo, das mache ich mit den Statistics Modul. Aber ich will den Gesamtwert pro Raum, pro Etage und fürs ganze Haus berechnen. Damit nicht bei jedem Reading wieder neu berechnet wird möchte ich das nur einmal pro Stunde berechnen. Also FHEM Ressourcen sparen.

Ich muss mal schauen wie ich das lösen kann ... Hab  einfach keine Idee wie ich alle Werte des Raumes mit einer Summe zusammenzählen kann ohne das addieren von allen Werten. Werde mich damit weiter beschäftigen aber bin über jeden Tipp dankbar.

TomLee

#5
ZitatIch muss mal schauen wie ich das lösen kann ... Hab  einfach keine Idee wie ich alle Werte des Raumes mit einer Summe zusammenzählen kann ohne das addieren von allen Werten. Werde mich damit weiter beschäftigen aber bin über jeden Tipp dankbar.

Wenn ich es richtig verstanden habe (das bei mir immer so ne Sache  ;D), hätte ich folgenden Vorschlag:

{ my $sum;;my @ar= devspec2array('.*:FILTER=room=deinraumname');;for my $i (@ar){ $sum += ReadingsNum($i,'statRechenwertHour',0)};;return fhem("setreading SUM_EG_KU_AktuellerStundenStromverbrauch value $sum");;}

netpirat

Hallo TomLee,

vielen Dank. Genau das habe ich gesuch. Du hast mich genau richtig verstanden. Hab noch schnell den Room angepasst. Das geht wirklich einfach aber auf diese Lösung wäre ich so nicht gekommen. Werde das jetzt mit all meinen Räumen probieren und in den nächsten Tagen die Werte validieren. Werde Dir Berichten. Vielen Dank nochmal.

TomLee

#7
Zitat von: netpirat am 25 September 2022, 21:38:18
Werde das jetzt mit all meinen Räumen probieren und in den nächsten Tagen die Werte validieren.

Wenn ich es richtig verstehe was du jetzt vorhast, dann würde ich es mit einem at versuchen umzusetzen, wie das Betateilchen schon in #1 vorgeschlagen hat.

Zitat von: betateilchen am 25 September 2022, 15:23:42
Das Zusammenrechnen würde ich in einer Funktion in der 99_myUtils erledigen und diese Funktion in dem at aufrufen. Das ist auf jeden Fall übersichtlicher und einfache nachvollziehbar.

TomLee

Zwei Optimierungsmöglichkeiten hätt ich noch, einmal kann man sich die Array-Variablendeklaration sparen in dem man die devspec2array-Funktion direkt in der for -Schleife angibt ( das war mir gestern schon klar) und dann auch noch die Variablendeklaration $i indem man einfach die Umlaufvariable der for-Schleife verwendet (das kam mir erst bewusst nach den Äuglein aufmachen heute Morgen):

{ my $sum;;for (devspec2array('.*:FILTER=room=deinraumname')){ $sum += ReadingsNum($_,'statRechenwertHour',0)};;return fhem("setreading SUM_EG_KU_AktuellerStundenStromverbrauch value $sum");;}

netpirat

Hallo TomLee,

danke nochmal für deine Antworten und dafür das Du dich so sehr mit meinem Fall identifizierst. Ich denke ich gebe Dir mal einen Kaffe aus, sofern das für Dich Ok ist.

Tatsächlich habe ich Fhem so aufgebaut das,

Ich die Etagen KG / EG / OG / AU (Aussen)

und dann die Räume KU=Küche/WZ=Wohnzimmer, etc... aufgeteilt.

Zudem sind immer alle Devices Gruppiert. Egal ob Meldungen, Steckdosen oder oder oder

Ziel ist es aktuell  nun einen Report (Stromverbrauch) pro Raum aufzubauen, diesen dann pro Etage zusammen zufassen und danach einen Gesamtverbrauch nach Statistikreadings (Day,DayLast,Month,Year and Hour) via Telegramm abzufragen.

Da bin ich immer für Tipps und Vereinfachungen offen.

Telegramm funktioniert super, Dummy anlegen geht auch :-), Einfaches Rechnen habe ich hier und dort auch bislang schon hinbekommen. Aber die Formeln vereinfachen, sodass man nicht alle Stromverbraucher (Ich hab über 200) immer manuell eingeben und und wenn sich mal was ändert das automatisch mit erfasst wird habe ich jetzt dank deiner Formel auch hinbekommen. Aber im Urlaub will ich mir dann doch mal Perl genauer ansehen. Erst wenn ich das richtig verstehe kann ich auch mal soetwas basteln.

Das Auslagern nach 99_myUtils wird ja immer wieder angeraten. Bislang habe ich mich davor gescheut das zu tun, da ich nicht genau weiß wie das funktionieren kann. Klar auslagern, aber muss das angestossen werden (über notify /at?) läuft das automatisch, oder gar beides (weil Einstellungssache). Und für mich war der 100% nutzen auch noch nicht ganz klar. Da muss ich mich tatsächlich sehr reinlesen und erst wenn ich das Verstanden habe kann ich das meist richtig gut umsetzen.

Im Moment ist es wieder stressig und mir fehlt etwas Zeit aber ich werde mir das ansehen und schauen wie ich die verschiedenen Räume dann möglichst in ein at oder eben 99_myUtils einbauen kann. Das ist mir aktuell noch nicht ganz klar.

Ich werde Dir berichten und ggf. auch nochmal mit doofen Fragen fragen.

Ich danke allen im Forum hier schonmal für die Hilfsbereitschaft und hoffe eines Tages so gut zu sein hier selber helfen zu können, denn Fhem ist "Geil", offen für alle und immer gut von Euch unterstützt. Für mich das Programm zu Homeautomation.


TomLee

#10
Zitat... Du dich so sehr mit meinem Fall identifizierst.

Falsch gedeutet, ich hab nur mitgelesen, verstanden und einen Vorschlag gemacht, mehr nicht, ich nutz das bei mir in keiner Art und Weise, aber ich geb zu das ich etwas abgekupfert habe, bei einem Vorschlag den ich hier irgendwo gemacht, aber auch nicht nutze  :P

Zum Perl lernen hab ich drei Tipps: lesen , noch mehr lesen und noch viel mehr lesen.
Mir, geb ich ganz offen zu, hätte/würde da ein Urlaub (mglw. noch mit Anhang) bei weitem nicht gereicht/reichen, Jahre hatts gedauert und mehrere Rohrstockhiebe auf den Handrücken (von meinem Spatz  ;D), bis es zumindest ansatzweise bei mir Klick gemacht.
Hier im Forum wirst du kein Perl lernen, aber Tipps zum Verständnis erhält man meist, meine Erfahrung zumindest.

Es macht auch erst Sinn Code auszulagern wenn man mit Perl etwas warm geworden ist.
Zum Einstieg in das auslagern gibts das Wiki und was mein weniges Wissen dazu betrifft hab ich hier das meiste mitgenommen.

Damian

Zitat von: netpirat am 25 September 2022, 15:13:12

Am liebsten wäre mir wenn ich alle Devices mit STK_EG_KU.*_KWH und dem Reading statRechenwertHour jede Stunde zusammenrechnen kann.


Dafür lassen sich Aggregationsfunktionen gut nutzen, siehe: https://fhem.de/commandref_DE.html#DOIF_aggregation

für dich dann:


defmod di_sum DOIF {[:00];;\
set_Reading("SUM_EG_KU",[?#sum:"^STK_EG_KU_":statRechenwertHour])\
## set_Reading("SUM_...\
}


Das kannst du um weitere Räume ergänzen und über alles summieren.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

netpirat

#12
Hallo Damian,

klappt. Kann man damit auch Monatswerte und Jahreswerte Zusammenrechnen? Ich habe dazu nichts gefunden

Und kann man auh mehrere Werte Zusammenfassen?

Zum Beispiel
STK_EG_KU_
LIC_EG_KU_
DIM_EG_KU_

SO geht es leider nicht. Mit , auch nicht.
?#sum:"^STK_EG_KU_|^LIC_EG_KU_|^DIM_EG_KU_":statRechenwertDay

Gruß


Damian

Zitat von: netpirat am 28 September 2022, 22:23:26
Hallo Damian,

klappt. Kann man damit auch Monatswerte und Jahreswerte Zusammenrechnen? Ich habe dazu nichts gefunden

Und kann man auh mehrere Werte Zusammenfassen?

Zum Beispiel
STK_EG_KU_
LIC_EG_KU_
DIM_EG_KU_

SO geht es leider nicht. Mit , auch nicht.
?#sum:"^STK_EG_KU_|^LIC_EG_KU_|^DIM_EG_KU_":statRechenwertDay

Gruß



[?#sum:"^(STK_EG_KU_|LIC_EG_KU_|DIM_EG_KU_)":statRechenwertDay]

evtl. geht bei dir auch (wenn es eindeutig ist):

[?#sum:"_EG_KU_":statRechenwertDay]
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

netpirat

#14
Hallo Damian,
super klappt!

Nun muss ich nur noch die Monatswerte einmal im Monat und die Jahreswerte einmal im Jahr aktualisieren. Aber das scheint mit DOIF nicht zu funktionieren. (Ist wohl in Entwicklung)

[00:00];; Jeden Tag um 00:00 Uhr
[:00];; Jede Stunde

{
[00:00];;
set_Reading("SUM_KG_VK_AktuellerTagesStromverbrauch",[?#sum:"^(STK_KG_VK_|LIC_KG_VK_|DIM_KG_VK_|TRH_KG_VK_)":statRechenwertDay]);;
set_Reading("SUM_KG_DK_AktuellerTagesStromverbrauch",[?#sum:"^(STK_KG_DK_|LIC_KG_DK_|DIM_KG_DK_|TRH_KG_DK_)":statRechenwertDay]);;
...
}


Gruss