Mittelwertbildung im DOIF zeigt seltsames Verhalten

Begonnen von bmwfan, 07 Juli 2025, 11:49:33

Vorheriges Thema - Nächstes Thema

bmwfan

Hallo,

ich möchte aus den Temperaturen mehrerer Homematic-Thermostate einen Mittelwert bilden und habe dazu folgenden Code gefunden (Vorschlag von Damian in einem früheren Thread):

defmod di_Thermostate_Average DOIF init {set_State([#average:"^(HmIP_BWTH_000C9A4999F2BC_9|HmIP_BWTH_000C9A49A7E499_9|HmIP_BWTH_000C9BE99C66F8_9|HmIP_BWTH_000C9BE98E7AB8_9)":"^1.ACTUAL_TEMPERATURE"])}
attr di_Thermostate_Average room Test
attr di_Thermostate_Average userReadings Mittelwert {round(ReadingsNum("$name","state",""),1)}

setstate di_Thermostate_Average 10.925
setstate di_Thermostate_Average 2025-07-07 11:43:36 Device HmIP_BWTH_000C9BE99C66F8_9
setstate di_Thermostate_Average 2025-07-07 11:43:36 Mittelwert 10.9
setstate di_Thermostate_Average 2025-07-07 11:43:36 block_init executed
setstate di_Thermostate_Average 2025-07-07 11:29:06 mode enabled
setstate di_Thermostate_Average 2025-07-07 11:43:36 state 10.925

Funktioniert soweit auch bei mir, allerdings ist der angezeigt Mittelwert immer genau die Hälfte des rechnerischen Mittelwertes, egal ob ich 2 oder mehr Device eingetragen habe.  Das kann ich mir wiederum nicht erklären. Dachte erst, ich nehme bei 2 Device den Mittelwert *2, bei 4 Device *4, aber das funktioniert nicht.

Ich löse das Problem jetzt damit, dass ich einfach den errechneten Wert verdoppele, würde aber doch gerne die Ursache des Fehlers kennen. Hat jemand eine Idee, woran das liegt?

Grüße Jürgen
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

Damian

Zitat von: bmwfan am 07 Juli 2025, 11:49:33Hallo,

ich möchte aus den Temperaturen mehrerer Homematic-Thermostate einen Mittelwert bilden und habe dazu folgenden Code gefunden (Vorschlag von Damian in einem früheren Thread):

defmod di_Thermostate_Average DOIF init {set_State([#average:"^(HmIP_BWTH_000C9A4999F2BC_9|HmIP_BWTH_000C9A49A7E499_9|HmIP_BWTH_000C9BE99C66F8_9|HmIP_BWTH_000C9BE98E7AB8_9)":"^1.ACTUAL_TEMPERATURE"])}
attr di_Thermostate_Average room Test
attr di_Thermostate_Average userReadings Mittelwert {round(ReadingsNum("$name","state",""),1)}

setstate di_Thermostate_Average 10.925
setstate di_Thermostate_Average 2025-07-07 11:43:36 Device HmIP_BWTH_000C9BE99C66F8_9
setstate di_Thermostate_Average 2025-07-07 11:43:36 Mittelwert 10.9
setstate di_Thermostate_Average 2025-07-07 11:43:36 block_init executed
setstate di_Thermostate_Average 2025-07-07 11:29:06 mode enabled
setstate di_Thermostate_Average 2025-07-07 11:43:36 state 10.925

Funktioniert soweit auch bei mir, allerdings ist der angezeigt Mittelwert immer genau die Hälfte des rechnerischen Mittelwertes, egal ob ich 2 oder mehr Device eingetragen habe.  Das kann ich mir wiederum nicht erklären. Dachte erst, ich nehme bei 2 Device den Mittelwert *2, bei 4 Device *4, aber das funktioniert nicht.

Ich löse das Problem jetzt damit, dass ich einfach den errechneten Wert verdoppele, würde aber doch gerne die Ursache des Fehlers kennen. Hat jemand eine Idee, woran das liegt?

Grüße Jürgen

Um das Problem einzukreisen, kannst du zusätzlich statt #average mit # die Anzahl der Werte und mit @ die Liste der Devices festhalten. Dann kann man schauen, wie die Durchschnittswerte zustande kommen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

bmwfan

Hallo mDamina,

Danke für die schnelle Antwort. Das übersteigt aber meine Kenntnisse, und ich weis auch nicht, wie ich so etwas spezielles suchen kann.

Grüße Jürgen
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

bmwfan

Hab es doch hinbekommen.

Mittelwertbildung:
defmod di_Thermostate_Average DOIF init {set_State([#average:"^(HmIP_BWTH_000C9A4999F2BC_9|HmIP_BWTH_000C9A49A7E499_9|HmIP_BWTH_000C9BE99C66F8_9|HmIP_BWTH_000C9BE98E7AB8_9)":"^1.ACTUAL_TEMPERATURE"])}
attr di_Thermostate_Average event-min-interval Mittelwert:300
attr di_Thermostate_Average event-on-change-reading Mittelwert
attr di_Thermostate_Average room 3.4_Technik,9.8.1_DOIF
attr di_Thermostate_Average userReadings Mittelwert {(round(ReadingsNum("$name","state",""),1)*2)}

setstate di_Thermostate_Average 11.125
setstate di_Thermostate_Average 2025-07-07 20:27:17 Device HmIP_BWTH_000C9A4999F2BC_9
setstate di_Thermostate_Average 2025-07-07 20:27:17 Mittelwert 22.2
setstate di_Thermostate_Average 2025-07-07 20:27:17 block_init executed
setstate di_Thermostate_Average 2025-07-07 11:29:06 mode enabled
setstate di_Thermostate_Average 2025-07-07 20:27:17 state 11.125

Anzahl beteiligte Thermostate werden allerdings mit 8 angezeigt, obwohl nur 4 in der Def der Abfrage eingetragen sind. Also doppelt gezählt.
defmod di_Thermostate_Anzahl DOIF init {set_State([#:"^(HmIP_BWTH_000C9A4999F2BC_9|HmIP_BWTH_000C9A49A7E499_9|HmIP_BWTH_000C9BE99C66F8_9|HmIP_BWTH_000C9BE98E7AB8_9)":"^1.ACTUAL_TEMPERATURE"])}
attr di_Thermostate_Anzahl room Test
attr di_Thermostate_Anzahl stateFormat {sprintf("Anzahl Thermostate: %.0f",\
ReadingsVal($name,"state",0))}

setstate di_Thermostate_Anzahl Anzahl Thermostate: 8
setstate di_Thermostate_Anzahl 2025-07-07 20:22:43 Device HmIP_BWTH_000C9BE99C66F8_9
setstate di_Thermostate_Anzahl 2025-07-07 20:22:43 block_init executed
setstate di_Thermostate_Anzahl 2025-07-07 20:16:37 mode enabled
setstate di_Thermostate_Anzahl 2025-07-07 20:22:43 state 8

Welche Geräte? Auch diese werden doppelt gezählt, womit dann aber der Mittelwert ja wieder stimmen müsste, auch wenn es nicht korrekt ist.
defmod di_Thermostate_Namen DOIF init {set_State([@:"^(HmIP_BWTH_000C9A4999F2BC_9|HmIP_BWTH_000C9A49A7E499_9|HmIP_BWTH_000C9BE99C66F8_9|HmIP_BWTH_000C9BE98E7AB8_9)":"^1.ACTUAL_TEMPERATURE"])}
attr di_Thermostate_Namen room Test

setstate di_Thermostate_Namen HmIP_BWTH_000C9A4999F2BC_9,HmIP_BWTH_000C9A4999F2BC_9,HmIP_BWTH_000C9A49A7E499_9,HmIP_BWTH_000C9A49A7E499_9,HmIP_BWTH_000C9BE98E7AB8_9,HmIP_BWTH_000C9BE98E7AB8_9,HmIP_BWTH_000C9BE99C66F8_9,HmIP_BWTH_000C9BE99C66F8_9
setstate di_Thermostate_Namen 2025-07-07 20:22:43 Device HmIP_BWTH_000C9BE99C66F8_9
setstate di_Thermostate_Namen 2025-07-07 20:22:43 block_init executed
setstate di_Thermostate_Namen 2025-07-07 20:17:11 mode enabled
setstate di_Thermostate_Namen 2025-07-07 20:22:43 state HmIP_BWTH_000C9A4999F2BC_9,HmIP_BWTH_000C9A4999F2BC_9,HmIP_BWTH_000C9A49A7E499_9,HmIP_BWTH_000C9A49A7E499_9,HmIP_BWTH_000C9BE98E7AB8_9,HmIP_BWTH_000C9BE98E7AB8_9,HmIP_BWTH_000C9BE99C66F8_9,HmIP_BWTH_000C9BE99C66F8_9

Ich hoffe die Informationen reichen aus, um den Fehler zu finden.

Grüße Jürgen
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd

Damian

Dann gibt es offenbar jeweils zwei Readings pro Device, die mit "1.ACTUAL_TEMPERATURE" anfangen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

bmwfan

#5
Guten Morgen,

es gibt tatsächlich 2 Readings, die im String diesen Namen tragen. Allerdings ist das 2.te reading noch ergänzt um _STATUS. Dann wird es daran liegen, dass nicht der ganze Namen als Vergleich genommen wird sondern nur, ob ein Teil des Namens im String ist.

setstate HmIP_BWTH_000C9A4999F2BC_9 T: 20.3°C H: 60% D: 15.0°C
setstate HmIP_BWTH_000C9A4999F2BC_9 2025-07-08 08:09:24 1.ACTIVE_PROFILE 1
setstate HmIP_BWTH_000C9A4999F2BC_9 2025-07-08 08:09:24 1.ACTUAL_TEMPERATURE 20.3
setstate HmIP_BWTH_000C9A4999F2BC_9 2025-07-08 08:09:24 1.ACTUAL_TEMPERATURE_STATUS NORMAL
setstate HmIP_BWTH_000C9A4999F2BC_9 2025-07-08 08:09:24 1.BOOST_MODE off
setstate HmIP_BWTH_000C9A4999F2BC_9 2025-07-08 08:09:24 1.BOOST_TIME 0

Hab jetzt auf "measured-temp" umgestellt, das nur 1 mal als reading auftaucht, und schon geht es. Wieder einmal meine mangelnden PERL-Kenntnisse.

Besten Dank und Grüße Jürgen

P.S.: Wie kann ich denn [Gelöst] in die Betreffzeile schreiben? Ich kann sie nicht mehr editieren.
Synology DS720+ mit Docker-Container und Haupt-FHEM, HM-LAN, Jalousienaktoren HmWired, Shelly-Devices; Raspi 3B+ mit piVCCU ohne FHEM-Instanz, CUL, JeeLink; Raspi 3B+ mit FHEM und HMUARTUSB,  Raspi 3B+ mit HMUARTGPIO, 1-wire, ebusd