Summe/Mittelwert über gleiche Readings verschiedener Devices bilden

Begonnen von CQuadrat, 07 Mai 2014, 13:53:29

Vorheriges Thema - Nächstes Thema

CQuadrat

Hallo Zusammen,

ich habe mehrere Heizkörperstellantriebe im Einsatz. Ich würde nun gerne in einem Dummy-Device folgende Werte darstellen:

  • Maximalwert der Ventilstellung von allen Heizkörperventilen
  • Mittelwert aller Ventilstellungen
  • mit der Heizkörpergröße gewichteter Mittelwert der Ventilstellungen

Sinn der Aktion ist, dass ich auf einem Blick erkennen kann, wie hoch der aktuelle Heizbedarf ist (zumindest indikativ).

Kennt hier jemand eine einfache Lösung? Lässt sich da etwas, z.B. mit structure oder readingsGroup, basteln?

Eine Lösung über eine Routine in myUtils (z.B. mit ReadingsVal) bekomme ich hin :) Wäre nur schön, wenn so etwas auch mit Bordmitteln realisierbar wäre.

Ideen?


Viele Grüße

Christoph
FHEM auf Mini-ITX-Server mit Intel Quad-Core J1900:
+ HM: HM-LAN, HM-USB, HM-MOD-UART mit div. HM-Komponenten
+ RFXtrx: Funkwetterstation Bresser mit ext. Thermometer, Regenmesser und Windmesser
+ TUL (KNX-Anbindung), MQTT, SONOS (div. Gimmicks), OneWire, Hue

igami

Hallo Christoph,

hast du schon eine Lösung gefunden? Ich interessiere mich auch dafür. Mein Ansatz:
- alle Devices in eine Structure packen
- ein notify für das gewünschte Reading schreiben und via setreading in die structure schreiben

define CUL_HM_HM_CC_RT_DN structure HM_CC_RT_DN CUL_HM_HM_CC_RT_DN_22C119_Clima CUL_HM_HM_CC_RT_DN_2563A2_Clima
attr CUL_HM_HM_CC_RT_DN stateFormat measured-temp

define ntfy_CUL_HM_HM_CC_RT_DN notify (CUL_HM_HM_CC_RT_DN_22C119|CUL_HM_HM_CC_RT_DN_2563A2):measured-temp.* {my $measuredTemp=((ReadingsVal("CUL_HM_HM_CC_RT_DN_22C119","measured-temp","21.0")+ReadingsVal("CUL_HM_HM_CC_RT_DN_2563A2","measured-temp","21.0"))/2);;;;fhem("setreading CUL_HM_HM_CC_RT_DN measured-temp $measuredTemp")}


Vielleicht gibt es noch eine elegantere Methode, aber es funktioniert.

Grüße
Igami
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Damian

Zitat von: igami am 07 September 2014, 17:50:49
Hallo Christoph,

hast du schon eine Lösung gefunden? Ich interessiere mich auch dafür. Mein Ansatz:
- alle Devices in eine Structure packen
- ein notify für das gewünschte Reading schreiben und via setreading in die structure schreiben

define CUL_HM_HM_CC_RT_DN structure HM_CC_RT_DN CUL_HM_HM_CC_RT_DN_22C119_Clima CUL_HM_HM_CC_RT_DN_2563A2_Clima
attr CUL_HM_HM_CC_RT_DN stateFormat measured-temp

define ntfy_CUL_HM_HM_CC_RT_DN notify (CUL_HM_HM_CC_RT_DN_22C119|CUL_HM_HM_CC_RT_DN_2563A2):measured-temp.* {my $measuredTemp=((ReadingsVal("CUL_HM_HM_CC_RT_DN_22C119","measured-temp","21.0")+ReadingsVal("CUL_HM_HM_CC_RT_DN_2563A2","measured-temp","21.0"))/2);;;;fhem("setreading CUL_HM_HM_CC_RT_DN measured-temp $measuredTemp")}


Vielleicht gibt es noch eine elegantere Methode, aber es funktioniert.

Grüße
Igami

Oder etwas kürzer:

define di_average DOIF
attr di_average state {([CUL_HM_HM_CC_RT_DN_22C119:measured-temp]+[CUL_HM_HM_CC_RT_DN_2563A2:measured-temp])/2}


Das Längste hier sind deine Device-Namen :)

Genaueres siehe: http://fhem.de/commandref_DE.html#DOIF

Gruß

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

igami

Danke Damian,

mit dem DOIF Modul muss ich mich noch näher befassen, habe die Commandref bisher erst einmal überflogen.

Gruß
Igami
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Damian

Zitat von: igami am 07 September 2014, 19:33:57
Danke Damian,

mit dem DOIF Modul muss ich mich noch näher befassen, habe die Commandref bisher erst einmal überflogen.

Gruß
Igami

ja, du kannst auch genauso einen Reading in deiner Structure setzen:

define di_average DOIF ([CUL_HM_HM_CC_RT_DN_22C119] or [CUL_HM_HM_CC_RT_DN_2563A2]) (set setreading CUL_HM_HM_CC_RT_DN measured-temp  {([CUL_HM_HM_CC_RT_DN_22C119:measured-temp]+[CUL_HM_HM_CC_RT_DN_2563A2:measured-temp])/2})

Gruß

Damian


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

justme1968

eine structure zu verwenden ist in deinem fall aber eigentlich nicht angebracht. du verwendest keines der features die die structure bietet.

nimm einfach einen dummy um deinen wert zu speichern.  egal ob notify oder DOIF. das spart den ganzen internen overhaded.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

igami

Hallo andre,

die structure nehme ich um auch desired-temp wieder zu setzten.

Gruß
Igami
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

justme1968

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968


igami

Hallo Olaf,

vielen Dank für den Hinweis, ich denke aber ich werde nun bei DOIF bleiben, da ich da mit einem define actuator, measured-temp und desired-temp in meine structure schreiben kann.

define CUL_HM_HM_CC_RT_DN structure HM_CC_RT_DN CUL_HM_HM_CC_RT_DN_22C119_Clima CUL_HM_HM_CC_RT_DN_2563A2_Clima
attr CUL_HM_HM_CC_RT_DN stateFormat T: measured-temp desired: desired-temp valve: actuator

define di_average DOIF ([CUL_HM_HM_CC_RT_DN_22C119] or [CUL_HM_HM_CC_RT_DN_2563A2]) \
(\
  setreading CUL_HM_HM_CC_RT_DN measured-temp  \
   {([CUL_HM_HM_CC_RT_DN_22C119:measured-temp]+[CUL_HM_HM_CC_RT_DN_2563A2:measured-temp])/2},\
  setreading CUL_HM_HM_CC_RT_DN desired-temp  \
   {([CUL_HM_HM_CC_RT_DN_22C119:desired-temp]+[CUL_HM_HM_CC_RT_DN_2563A2:desired-temp])/2},\
  setreading CUL_HM_HM_CC_RT_DN actuator  \
   {([CUL_HM_HM_CC_RT_DN_22C119:actuator]+[CUL_HM_HM_CC_RT_DN_2563A2:actuator])/2}\
)
attr di_average do always


Nun würde ich das ganze noch gerne auf eine Nachkommastelle runden, jedoch steht in dem Befehl dann ein Komma und ich bekomme die Fehlermeldung 'no right brackets'. Wie kann ich das denn umgehen?

Gruß
Igami
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

Damian

Zitat von: igami am 08 September 2014, 05:52:29
Hallo Olaf,

vielen Dank für den Hinweis, ich denke aber ich werde nun bei DOIF bleiben, da ich da mit einem define actuator, measured-temp und desired-temp in meine structure schreiben kann.

define CUL_HM_HM_CC_RT_DN structure HM_CC_RT_DN CUL_HM_HM_CC_RT_DN_22C119_Clima CUL_HM_HM_CC_RT_DN_2563A2_Clima
attr CUL_HM_HM_CC_RT_DN stateFormat T: measured-temp desired: desired-temp valve: actuator

define di_average DOIF ([CUL_HM_HM_CC_RT_DN_22C119] or [CUL_HM_HM_CC_RT_DN_2563A2]) \
(\
  setreading CUL_HM_HM_CC_RT_DN measured-temp  \
   {([CUL_HM_HM_CC_RT_DN_22C119:measured-temp]+[CUL_HM_HM_CC_RT_DN_2563A2:measured-temp])/2},\
  setreading CUL_HM_HM_CC_RT_DN desired-temp  \
   {([CUL_HM_HM_CC_RT_DN_22C119:desired-temp]+[CUL_HM_HM_CC_RT_DN_2563A2:desired-temp])/2},\
  setreading CUL_HM_HM_CC_RT_DN actuator  \
   {([CUL_HM_HM_CC_RT_DN_22C119:actuator]+[CUL_HM_HM_CC_RT_DN_2563A2:actuator])/2}\
)
attr di_average do always


Nun würde ich das ganze noch gerne auf eine Nachkommastelle runden, jedoch steht in dem Befehl dann ein Komma und ich bekomme die Fehlermeldung 'no right brackets'. Wie kann ich das denn umgehen?

Gruß
Igami
Dann musst du um den FHEM-Ausdruck jeweils runde Klammern setzen, damit das Komma (von sprintf) nicht als Trennnzeichen zwischen den FHEM-Befehlen erkannt wird, also

((set ...),(set ...), ...)

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

igami

Danke Damian,

nun also so wie ich es haben wollte.
Die Werte desired-temp, measured-temp und actuator von mehreren Heizkörpern werden als Mittelwert via setreading in eine structure der Devices geschrieben und mit stateFormat angezeit, sodass es aussieht wie ein HM-CC-RT-DN_Clima und sich auch die desired-temp setzten lässt.

define di_average DOIF ([CUL_HM_HM_CC_RT_DN_22C119] or [CUL_HM_HM_CC_RT_DN_2563A2]) \
(\
  (setreading CUL_HM_HM_CC_RT_DN measured-temp  \
   {(sprintf("%.1f",([CUL_HM_HM_CC_RT_DN_22C119:measured-temp]+[CUL_HM_HM_CC_RT_DN_2563A2:measured-temp])/2))}),\
  (setreading CUL_HM_HM_CC_RT_DN desired-temp  \
   {(sprintf("%.1f",([CUL_HM_HM_CC_RT_DN_22C119:desired-temp]+[CUL_HM_HM_CC_RT_DN_2563A2:desired-temp])/2))}),\
  (setreading CUL_HM_HM_CC_RT_DN actuator  \
   {(sprintf("%.1f",([CUL_HM_HM_CC_RT_DN_22C119:actuator]+[CUL_HM_HM_CC_RT_DN_2563A2:actuator])/2))})\
)
attr di_average do always

define CUL_HM_HM_CC_RT_DN structure HM_CC_RT_DN CUL_HM_HM_CC_RT_DN_22C119_Clima CUL_HM_HM_CC_RT_DN_2563A2_Clima
attr CUL_HM_HM_CC_RT_DN stateFormat T: measured-temp desired: desired-temp valve: actuator


Vielleicht kann Christoph ja noch ein gelöst vor den Titel schreiben?

Gruß
Igami
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

igami

Habe das ganze nun auf userReadings umgestellt. Die Readings passen sich nun der Menge der Devices an. Aber Achtung, beim ersten mal setzten des Attributes wird es auf alle Devices der Structure mit geschrieben.


define struct_65_12210 Thermostate HM_CC_RT_DN_KEQ0515242_Clima HM_CC_RT_DN_KQE0517439_Clima
attr struct_65_12210 stateFormat T: measured-temp desired: desired-temp valve: ValvePosition
attr struct_65_12210 userReadings

measured-temp {
  my @devices = split(' ', InternalVal($name,'DEF',1));
    splice(@devices,0,1);
  my $measuredTemp = 0;
 
  foreach my $device (@devices){
    $measuredTemp += ReadingsVal($device, 'measured-temp', 0);
  }
 
  return sprintf("%.1f",($measuredTemp/@devices));
},
desired-temp {
  my @devices = split(' ', InternalVal($name,'DEF',1));
    splice(@devices,0,1);
  my $desiredTemp = 0;
 
  foreach my $device (@devices){
    $desiredTemp += ReadingsVal($device, 'desired-temp', 0);
  }
 
  return sprintf("%.1f",($desiredTemp/@devices));
},
ValvePosition {
  my @devices = split(' ', InternalVal($name,'DEF',1));
    splice(@devices,0,1);
  my $ValvePosition = 0;
 
  foreach my $device (@devices){
    $ValvePosition += ReadingsVal($device, 'ValvePosition', 0);
  }
 
  return sprintf("%.1f",($ValvePosition/@devices));
}


Grüße
Igami
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED