gemittelte Raumtemperaturen an Device übertragen

Begonnen von Jewe, 08 Januar 2020, 22:15:22

Vorheriges Thema - Nächstes Thema

Jewe

Hallo,

ich übertrage 4 Raumtemperaturen (gemittelt) an ein Device. Mit meiner Lösung bin ich aber nicht sehr zufrieden, da es regelmässig passiert, dass der Wert anstelle von z.B. 19,4 plötzlich 0 überträgt. Das stört dann meine Heizung für die das die Raumtemperatur ist. Ich denke meine Lösung ist nicht wirklich geschickt, bzw. es sicherlich auch direkt, ohne das Doif und den at.


gemittelte Raumtemperatur:
defmod HK2TempAverage DOIF ##
attr HK2TempAverage room 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])/4))}

alle 2 minuten den Wert an das Device BROETJETEMP übertragen:
defmod At.Heizung_HK2_Raumtemperatur at +*00:02:00 { fhem("set BROETJETEMP Raumtemperatur_HK2 [HK2TempAverage:state]") }
attr At.Heizung_HK2_Raumtemperatur DbLogExclude .*
attr At.Heizung_HK2_Raumtemperatur room Heizung

Dieses Device überträgt die Temp an die Heizung:
defmod BROETJETEMP HTTPMOD http://192.xxx.xxx.xxx/pass/8700 180
attr BROETJETEMP userattr reading0Name reading0Regex set0Name set0URL
attr BROETJETEMP enableControlSet 1
attr BROETJETEMP event-on-change-reading .*
attr BROETJETEMP reading0Name Aussentemperatur
attr BROETJETEMP reading0Regex 8700 .*:[ \t]+([-]?[\d\.]+)
attr BROETJETEMP room Heizung
attr BROETJETEMP set0Name Raumtemperatur_HK2
attr BROETJETEMP set0URL http://192..xxx.xxx.xxx/pass/I10001=$val
attr BROETJETEMP stateFormat {sprintf("Aussentemperatur: %.1f °C | HK2 Raumtemperatur: %.1f °C", ReadingsVal($name,"Aussentemperatur",1), \
InternalVal("BROETJETEMP","value", 21))}
attr BROETJETEMP timeout 5
attr BROETJETEMP verbose 0


Es müste doch möglich sein, die Berechnung der Temeratur ohne das Doif direkt im at zu erledigen. Ich habe versucht, das

{(sprintf("%.1f",([KZ_Thermostat_Weather:temperature]+[KZ_Heizung_Weather:measured-temp]+[SP_Heizung_Weather:measured-temp]+[BA_Heizung_Weather:measured-temp])/4))}

hier einzufügen

at +*00:02:00 { fhem("set BROETJETEMP Raumtemperatur_HK2 [HK2TempAverage:state]") }

, allerdings hat es nichtfunktioniert :-(.

Kann mir bitte jemand helfen, Dankschön.
Jens

Beta-User

Das eine Thema ist, dass du auch Perl verwenden solltest, wenn du auf die Perl-Ebene wechselst. Das bedeutet: ReadingsVal()/ReadingsNum() verwenden statt [device:reading] (genaue Syntax siehe commandref).

Das andere Thema ist etwas schwieriger, denn die "0" kommt evtl. daher, dass keine Werte vorhanden sind usw.. Du könntest beides umgehen, wenn du "richtig" nach Perl wechselst:
Suche nach "average" und Perl liefert bei mir als erstes http://www.fiz-ix.com/2012/12/calculating-the-average-of-an-array-in-perl/. Da wird "eine sub" vorgeschlagen, also ein kleines Perl-Programm. Das kopierst du in "deine myUtils" (siehe Wiki: 99_myUtils erstellen), und rufst es dann mit den 4 ReadingsNum-Abfrageelementen auf, wobei du als default "undef" (ohne Quotes) eingeben solltest und mal testen, ob die sub dein FHEM abschießt, wenn einer der Werte leer ist.
Damit ist die Reise leider nicht zu Ende: Du mußt absichern, dass kein ungültiger Wert zurückgeliefert wird, also mind. einer der Werte da ist...

Ansonsten ist die Neuberechnung alle 2 Minuten vermutlich ok, wobei unklar ist, ob das Sinn macht, das immer an die Heizung zu schicken oder ggf. nur bei "gewisser" Änderung zum letzten Wert.

[Etwas OT]
Es gibt in Contrib "VALVES"; das liefert zwar keine gemittelte Temperatur, aber den (gewichteten) Heizbedarf der erfaßten HK-Thermostate als "Ventilöffnung". Ist evtl. eine Idee, den in eine "virtuelle Raumtempperatur" umzuwandeln...
Server: HP-elitedesk@Debian 12, 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