Readings von anderen Geräten in einem neuen Gerät sammeln

Begonnen von Dr. Boris Neubert, 14 März 2026, 21:35:11

Vorheriges Thema - Nächstes Thema

Dr. Boris Neubert

Hallo,

für ein Dashboard zu einer PV-Anlage möchte ich originale und berechnete Werte aus mindestens vier Geräten an einem neuen Gerät mit sprechenden Namen sammeln. Die berechneten Werte sind Summen und Differenzen von Werten von teils demselben, teil verschiedenen Geräten.

Das möchte ich tun, um die mindestens acht berechneten Werte nicht über die vier Geräte verstreut zu haben, wo die Readings auch noch zum Teil nicht selbsterklärende Namen haben. Auf die Readings möchte ich dann 1:1 aus RSS zugreifen können.

dummy mit userReadings scheidet aus, weil userReadings nur aktualisiert werden, wenn Readings am Gerät aktualisiert werden, was bei Dummys nicht der Fall ist.
readingsGroup dient nur der Darstellung, hat selber keine Readings.
readingsProxy kann nur ein Reading proxifizieren.
dummy mit notify befüllen macht es nur noch komplexer, als es eh schon ist.

Welchen Tipp könnt ihr mir geben?

Ansonsten scheint es mir so, dass readingsProxy schon gedanklich darauf vorbereitet sei, auch mehrere Readings zu proxifizieren. Man müsste das Modul "nur" aufbohren.
FHEM-Developer seit 2007, Mitgründer und Förder-Mitglied des FHEM e.V.
Bitte keine unaufgeforderten privaten Nachrichten!

PatrickR

Ich nehme in solchen Fällen immer ein leeres DOIF (Def nur ##) und event_readings.

Patrick
lepresenced - Tracking von Bluetooth-LE-Tags (Gigaset G-Tag) mittels PRESENCE

"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning." - Rich Cook

Beta-User

Zitat von: Dr. Boris Neubert am 14 März 2026, 21:35:11Ansonsten scheint es mir so, dass readingsProxy schon gedanklich darauf vorbereitet sei, auch mehrere Readings zu proxifizieren. Man müsste das Modul "nur" aufbohren.
Vielleicht ein erster Ansatz in diese Richtung: https://forum.fhem.de/index.php?msg=1342809

Nachteil: Das ist weiter darauf ausgelegt, genau ein Master-Device zu "proxifizieren" (nettes Wort). Würgaround mit userReadings würde vermutlich funktionieren, allerdings muss man da wieder aufpassen, dass man keine veralteten Werte zieht...

Du darfst auch gerne den oben verlinkten Modulansatz ggf. weiter aufbohren!
Server: HP-elitedesk@Debian 13, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Damian

Zitat von: PatrickR am 14 März 2026, 22:15:02Ich nehme in solchen Fällen immer ein leeres DOIF (Def nur ##) und event_readings.

Patrick

Damit kann man nicht nur eigene Readings mit Berechnung definieren, sondern auch Aggregationsfunktionen nutzen, die z. B. andere Readings aufsummieren oder sonstige Berechnungen anstellen. Diese kann man auch im gleichen Device visualisieren oder in anderen Devices nutzen.

 
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

PatrickR

Zitat von: Damian am 15 März 2026, 13:05:50
Zitat von: PatrickR am 14 März 2026, 22:15:02Ich nehme in solchen Fällen immer ein leeres DOIF (Def nur ##) und event_readings.

Patrick

Damit kann man nicht nur eigene Readings mit Berechnung definieren, sondern auch Aggregationsfunktionen nutzen, die z. B. andere Readings aufsummieren oder sonstige Berechnungen anstellen. Diese kann man auch im gleichen Device visualisieren oder in anderen Devices nutzen.


Da es so schön zu Boris' Anwendungsfall passt hier mal mein "Photovoltaik"-Device:
defmod D_R_Photovoltaik DOIF ##
attr D_R_Photovoltaik DbLogInclude totalpvpower,totalacenergy,totaldcenergy,totalpvenergy,totalbatenergy,availablepower,surpluspower,multiplusmaxpower
attr D_R_Photovoltaik alias Photovoltaik
attr D_R_Photovoltaik event-on-change-reading totalpvenergy:0.25,.*
attr D_R_Photovoltaik event_Readings totalpvpower:(([XX.XX.Cerbo:system_dcpvpower]>=0 ? [XX.XX.Cerbo:system_dcpvpower] : 0)+[XX.XX.FroniusModbus:acpower]),\
totaldcenergy:([XX.XX.MPPT1:energy_system]+[XX.XX.MPPT2:energy_system]+[XX.XX.MPPTRS:energy_system]),\
totalacenergy:([XX.XX.FroniusModbus:energytotal]/1000),\
totalpvenergy:([$SELF:totaldcenergy]+[$SELF:totalacenergy:d1]),\
totalbatenergy:([XX.XX.Multiplus:energy_invertertoacin1_fhem:d1]+[XX.XX.Multiplus:energy_invertertoacout_fhem:d1]),\
gridpower:[UG.KE.Energiezaehler:power_consumption_total:d0]+[AU.GR.Energiezaehler:power_consumption_total:d0]-[AU.GR.Energiezaehler:power_production_total:d0],\
multiplusmaxpower:(\
    [AU.GR.Temperatursensoren:temp_garage:d] >= 40 ? 3000 :\
    [AU.GR.Temperatursensoren:temp_garage:d] >= 25 ? 3700 :\
    4000\
),\
surpluspower:(\
    [XX.XX.Cerbo:ess_state] == 10\
        ? ::minNum(\
            [$SELF:availablepower],\
            ([XX.XX.Pylontech:power:d0] - ([$SELF:gridpower:d0]-[XX.XX.Cerbo:ess_gridsetpoint])\
        ))\
        : 0\
),\
availablepower:(\
    [XX.XX.Cerbo:ess_state] == 10\
        ? ([$SELF:multiplusmaxpower]+[XX.XX.Multiplus:activein_power:d0]) - ([$SELF:gridpower:d0]-[XX.XX.Cerbo:ess_gridsetpoint])\
        : 0\
),\
radtoday:(\
    (\
        [DWD_PV:fc0_0_Rad1h]+[DWD_PV:fc0_0_Rad1h]+[DWD_PV:fc0_2_Rad1h]+[DWD_PV:fc0_3_Rad1h]+[DWD_PV:fc0_4_Rad1h]+\
        [DWD_PV:fc0_5_Rad1h]+[DWD_PV:fc0_6_Rad1h]+[DWD_PV:fc0_7_Rad1h]+[DWD_PV:fc0_8_Rad1h]+[DWD_PV:fc0_9_Rad1h]+\
        [DWD_PV:fc0_10_Rad1h]+[DWD_PV:fc0_11_Rad1h]+[DWD_PV:fc0_12_Rad1h]+[DWD_PV:fc0_13_Rad1h]+[DWD_PV:fc0_14_Rad1h]+\
        [DWD_PV:fc0_15_Rad1h]+[DWD_PV:fc0_16_Rad1h]+[DWD_PV:fc0_17_Rad1h]+[DWD_PV:fc0_18_Rad1h]+[DWD_PV:fc0_19_Rad1h]+\
        [DWD_PV:fc0_20_Rad1h]+[DWD_PV:fc0_21_Rad1h]+[DWD_PV:fc0_22_Rad1h]+[DWD_PV:fc0_23_Rad1h]\
    )/1000\
),\
radtomorrow:(\
    (\
        [DWD_PV:fc1_0_Rad1h]+[DWD_PV:fc1_0_Rad1h]+[DWD_PV:fc1_2_Rad1h]+[DWD_PV:fc1_3_Rad1h]+[DWD_PV:fc1_4_Rad1h]+\
        [DWD_PV:fc1_5_Rad1h]+[DWD_PV:fc1_6_Rad1h]+[DWD_PV:fc1_7_Rad1h]+[DWD_PV:fc1_8_Rad1h]+[DWD_PV:fc1_9_Rad1h]+\
        [DWD_PV:fc1_10_Rad1h]+[DWD_PV:fc1_11_Rad1h]+[DWD_PV:fc1_12_Rad1h]+[DWD_PV:fc1_13_Rad1h]+[DWD_PV:fc1_14_Rad1h]+\
        [DWD_PV:fc1_15_Rad1h]+[DWD_PV:fc1_16_Rad1h]+[DWD_PV:fc1_17_Rad1h]+[DWD_PV:fc1_18_Rad1h]+[DWD_PV:fc1_19_Rad1h]+\
        [DWD_PV:fc1_20_Rad1h]+[DWD_PV:fc1_21_Rad1h]+[DWD_PV:fc1_22_Rad1h]+[DWD_PV:fc1_23_Rad1h]\
    )/1000\
),\
forecasttoday:(sprintf('%.1f', [$SELF:radtoday]*2.9)),\
forecasttomorrow:(sprintf('%.1f', [$SELF:radtomorrow]*2.9)),\
forecasttodaymin:(sprintf('%.1f', [$SELF:radtoday]*1.3)),\
forecasttomorrowmin:(sprintf('%.1f', [$SELF:radtomorrow]*1.3)),\
forecasttodaymax:(sprintf('%.1f', [$SELF:radtoday]*4.2)),\
forecasttomorrowmax:(sprintf('%.1f', [$SELF:radtomorrow]*4.2))\

attr D_R_Photovoltaik group Verbrauch
attr D_R_Photovoltaik icon measure_photovoltaic_inst
attr D_R_Photovoltaik room Energiemanagement,Start
attr D_R_Photovoltaik sortby 10
attr D_R_Photovoltaik stateFormat {sprintf(\
    'Gesamtleistung: %.0fW, Verfügbare Leistung: %.0fW, Überschussleistung: %.0fW, Gesamtenergie: %.0fkWh (AC: %.0fkWh, DC: %.0fkWh), Prognose heute/morgen: %.0f kWh/%.0f kWh',\
    ReadingsVal($name, 'totalpvpower', ''),\
    ReadingsVal($name, 'availablepower', ''),\
    ReadingsVal($name, 'surpluspower', ''),\
    ReadingsVal($name, 'totalpvenergy', ''),\
    ReadingsVal($name, 'totalacenergy', ''),\
    ReadingsVal($name, 'totaldcenergy', ''),\
    ReadingsVal($name, 'forecasttoday', ''),\
    ReadingsVal($name, 'forecasttomorrow', '')\
    \
)}
Das dient nicht nur der Anzeige aller relevanten Daten an einer Stelle sondern aggregiert sie auch stufenweise, um z. B. die Prognose zu berechnen. Diese und auch die Berechnung des aktuellen Überschusses benutze ich dann in anderen Devices, um z. B. die Wallboxeinspeisung zu steuern.
lepresenced - Tracking von Bluetooth-LE-Tags (Gigaset G-Tag) mittels PRESENCE

"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning." - Rich Cook