Hallo,
einem meiner Heizkreise übermittele ich die Raumtemperatur gemittelt aus mehreren Räumen. Das ist jedoch nicht optimal.
Nun möchte ich die Temperatur aus allen Räumen mitteln in denen das Ventil des Reglers größer 0 ist. Dazu benötige ich die Temperature der Räume und die Gesamtanzahl der Räume. Die Gesamtanzahl habe ich in HK2AnzahlVentile:heizkoerper ermittelt.
Wie bekomme ich nun an die Namen der Regelventile der Heizkörper und wie bekomme ich diese in die benötigte Formel ?
Ich habe im Moment kein Plan wie ich das angehe :-(
Mit diesem DOIF übergebe ich im Moment die Isttemperatur an die Heizung:
defmod HK2TempAverage DOIF ([SELF:state])(set BROETJETEMP Raumtemperatur_HK2 [$SELF:state])
attr HK2TempAverage do always
attr HK2TempAverage room x_Test,Heizung
attr HK2TempAverage state {(sprintf("%.1f",([KZ_Thermostat_Weather:temperature]+[KZ_Heizung_Weather:measured-temp]+[SP_Heizung_Weather:measured-temp]+[BA_Heizung_Weather:measured-temp]+[BU_Thermostat_Weather:temperature])/5))}
Die Anzahl der Heizkörper, die aktuell geöffnet sind ermittele ich mit folgendem DOIF:
defmod HK2AnzahlVentile DOIF ([#"_Clima$":ValvePosition:$_ > 0] > 0)\
(\
set $SELF heizkoerper [#"_Clima$":ValvePosition:$_ > 0],\
set $SELF heizbedarf on\
)\
DOELSE\
(\
set $SELF heizkoerper 0,\
set $SELF heizbedarf off\
)\
attr HK2AnzahlVentile DbLogExclude .*
attr HK2AnzahlVentile do always
attr HK2AnzahlVentile readingList heizkoerper heizbedarf
attr HK2AnzahlVentile room Heizung
attr HK2AnzahlVentile stateFormat Heizbedarf heizbedarf (heizkoerper)
Man könnte es evtl. mit Aggregationsfunktion average lösen: https://fhem.de/commandref_DE.html#DOIF_aggregation
So, nun in ich endlich dazugekommen hier weiterzumachen. Habe nun ein DOIF_Readings angelegt: valve:([@::"_Clima$":ValvePosition:$_ > 10]) mit diesem bekommen ich die Namen der Regelventile in dem reading valve.
Wie kann ich das nun aber so zerlegen oder auswerten dass ich diese nun in die Formel bekomme ?
z.B.:
{(sprintf("%.1f",([KZ_Thermostat_Weather:temperature]+[KZ_Heizung_Weather:measured-temp]+[SP_Heizung_Weather:measured-temp]+[BA_Heizung_Weather:measured-temp]+[BU_Thermostat_Weather:temperature])/5))}
List vom Device
Internals:
DEF ([#"_Clima$":ValvePosition:$_ > 10] > 0)
(
set $SELF heizkoerper [#"_Clima$":ValvePosition:$_ > 10],
set $SELF heizbedarf on
)
DOELSE
(
set $SELF heizkoerper 0,
set $SELF heizbedarf off
)
DOIFDEV ^global$|_Clima$
FUUID 5feb9125-f33f-9f49-d97b-a2a9a659f7023778
MODEL FHEM
NAME HK2AnzahlVentile
NR 726
NTFY_ORDER 50-HK2AnzahlVentile
STATE Heizbedarf on (3)
TYPE DOIF
VERSION 22913 2020-10-04 21:46:02
DOIF_Readings:
valve (::AggregateDoIf($hash,'@::','_Clima$','ValvePosition','$_ > 10'))
OLDREADINGS:
READINGS:
2021-01-03 18:18:34 Device BA_Heizung_Clima
2021-01-03 18:18:34 cmd 1
2021-01-03 18:18:34 cmd_event BA_Heizung_Clima
2021-01-03 18:18:34 cmd_nr 1
2021-01-03 18:18:34 heizbedarf on
2021-01-03 18:18:34 heizkoerper 3
2021-01-03 01:20:23 mode enabled
2021-01-03 18:18:34 state cmd_1
2021-01-03 18:03:34 valve BA_Heizung_Clima,BU_Heizung_Clima,DU_Heizung_Clima
Regex:
DOIF_Readings:
:
valve:
"_Clima$" _Clima$
HK2AnzahlVentile:
accu:
cond:
:
0:
"_Clima$" _Clima$
attr:
cmdState:
wait:
waitdel:
condition:
0 ::AggregateDoIf($hash,'#','_Clima$','ValvePosition','$_ > 10') > 0
do:
0:
0 set HK2AnzahlVentile heizkoerper [#"_Clima$":ValvePosition:$_ > 10], set HK2AnzahlVentile heizbedarf on
1:
0 set HK2AnzahlVentile heizkoerper 0, set HK2AnzahlVentile heizbedarf off
helper:
DEVFILTER ^global$|_Clima$
NOTIFYDEV global|.*_Clima
event ValvePosition: 43,boostTime: -,controlMode: auto,desired-temp: 22.0,measured-temp: 22.8,partyEnd: -,partyStart: -,partyTemp: -,T: 22.8 desired: 22.0 valve: 43
globalinit 1
last_timer 0
sleeptimer -1
timerdev BA_Heizung_Clima
timerevent ValvePosition: 43,boostTime: -,controlMode: auto,desired-temp: 22.0,measured-temp: 22.8,partyEnd: -,partyStart: -,partyTemp: -,T: 22.8 desired: 22.0 valve: 43
triggerDev BA_Heizung_Clima
DOIF_eventa:
cmd_nr: 1
cmd: 1
cmd_event: BA_Heizung_Clima
cmd_1
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: BA_Heizung_Clima
state: cmd_1
timerevents:
ValvePosition: 43
boostTime: -
controlMode: auto
desired-temp: 22.0
measured-temp: 22.8
partyEnd: -
partyStart: -
partyTemp: -
T: 22.8 desired: 22.0 valve: 43
timereventsState:
ValvePosition: 43
boostTime: -
controlMode: auto
desired-temp: 22.0
measured-temp: 22.8
partyEnd: -
partyStart: -
partyTemp: -
state: T: 22.8 desired: 22.0 valve: 43
triggerEvents:
ValvePosition: 43
boostTime: -
controlMode: auto
desired-temp: 22.0
measured-temp: 22.8
partyEnd: -
partyStart: -
partyTemp: -
T: 22.8 desired: 22.0 valve: 43
triggerEventsState:
ValvePosition: 43
boostTime: -
controlMode: auto
desired-temp: 22.0
measured-temp: 22.8
partyEnd: -
partyStart: -
partyTemp: -
state: T: 22.8 desired: 22.0 valve: 43
internals:
readings:
trigger:
uiState:
uiTable:
Attributes:
DOIF_Readings valve:([@::"_Clima$":ValvePosition:$_ > 10])
DbLogExclude .*
do always
readingList heizkoerper heizbedarf
room Heizung
stateFormat Heizbedarf heizbedarf (heizkoerper)
statt:
{(sprintf("%.1f",([KZ_Thermostat_Weather:temperature]+[KZ_Heizung_Weather:measured-temp]+[SP_Heizung_Weather:measured-temp]+[BA_Heizung_Weather:measured-temp]+[BU_Thermostat_Weather:temperature])/5))}
{(sprintf("%.1f",[#average:"_Clima$":ValvePosition:$_ > 10])}
Hallo Damian,
damit bekomme ich den Mittelwert der Regelventile. Ich benötige jedoch die Mitteltemperatur der offenen Ventile (>10).
Ich habe dann das daraus gemacht:
([#average:"_Clima$":ValvePosition:$_ > 10]) (set HK2Temp4 {(sprintf("%.1f",[#average:"_Clima$":measured-temp]))})
Das funktioniert jedoch so nicht, da der Mittelwert der Temperaturen von alle Regelvenmtilen ist
Dann habe ich es so probiert,
([#average:"_Clima$":ValvePosition:$_ > 10]) (set HK2Temp4 {(sprintf("%.1f",[#sum:"_Clima$":measured-temp] / [HK2AnzahlVentile:heizkoerper]))})
Da sollte nun "nur" noch die richtigen Werte der measured-temp genommen werden.
Ich schaffe es nicht, die geöffneten Ventile und die Temperaturen dazu zu veschachteln.
Gruß, Jens
Dann eben:
set HK2Temp4 {(sprintf("%.1f",[#average:"_Clima$":measured-temp:ReadingsVal($name,"ValvePosition",0) > 10]))}