Nutzung Aggregationsfunktion für wiederkehrenden SET auf alle Heizkörper

Begonnen von Sinus, 09 Mai 2017, 22:33:14

Vorheriges Thema - Nächstes Thema

Sinus

Hallo,

erstmal ein RIESIGES Danke an Damian. Das ist echt der Hammer was Du mit dem DOIF alles möglich machst!
Ich wollte mal die neuen Funktionen ausprobieren welche mein sehr rudimentäres Doif "DI_Temp_set_all" etwas aufpeppen sollen.
Aktuell schauts so aus: ([:25])
(IF ([HT_Schlafzimmer:mode] eq "auto") (set HT_Schlafzimmer desiredTemperature auto {([HT_Schlafzimmer:desiredTemperature])-0.5}))
(IF ([HT_Schlafzimmer:mode] eq "manual") (set HT_Schlafzimmer desiredTemperature manual {([HT_Schlafzimmer:desiredTemperature])-0.5}))

(IF ([HT_Buero:mode] eq "auto") (set HT_Buero desiredTemperature auto {([HT_Buero:desiredTemperature])-0.5}))
(IF ([HT_Buero:mode] eq "manual") (set HT_Buero desiredTemperature manual {([HT_Buero:desiredTemperature])-0.5}))

(IF ([HT_Bad:mode] eq "auto") (set HT_Bad desiredTemperature auto {([HT_Bad:desiredTemperature])-0.5}))
(IF ([HT_Bad:mode] eq "manual") (set HT_Bad desiredTemperature manual {([HT_Bad:desiredTemperature])-0.5}))

(IF ([HT_Wohnzimmer:mode] eq "auto") (set HT_Wohnzimmer desiredTemperature auto {([HT_Wohnzimmer:desiredTemperature])-0.5}))
(IF ([HT_Wohnzimmer:mode] eq "manual") (set HT_Wohnzimmer desiredTemperature manual {([HT_Wohnzimmer:desiredTemperature])-0.5}))

(IF ([HT_Kueche:mode] eq "auto") (set HT_Kueche desiredTemperature auto {([HT_Kueche:desiredTemperature])-0.5}))
(IF ([HT_Kueche:mode] eq "manual") (set HT_Kueche desiredTemperature manual {([HT_Kueche:desiredTemperature])-0.5}))


DOELSEIF
([:35])
(IF ([HT_Schlafzimmer:mode] eq "auto") (set HT_Schlafzimmer desiredTemperature auto {([HT_Schlafzimmer:desiredTemperature])+0.5}))
(IF ([HT_Schlafzimmer:mode] eq "manual") (set HT_Schlafzimmer desiredTemperature manual {([HT_Schlafzimmer:desiredTemperature])+0.5}))

(IF ([HT_Buero:mode] eq "auto") (set HT_Buero desiredTemperature auto {([HT_Buero:desiredTemperature])+0.5}))
(IF ([HT_Buero:mode] eq "manual") (set HT_Buero desiredTemperature manual {([HT_Buero:desiredTemperature])+0.5}))

(IF ([HT_Bad:mode] eq "auto") (set HT_Bad desiredTemperature auto {([HT_Bad:desiredTemperature])+0.5}))
(IF ([HT_Bad:mode] eq "manual") (set HT_Bad desiredTemperature manual {([HT_Bad:desiredTemperature])+0.5}))

(IF ([HT_Wohnzimmer:mode] eq "auto") (set HT_Wohnzimmer desiredTemperature auto {([HT_Wohnzimmer:desiredTemperature])+0.5}))
(IF ([HT_Wohnzimmer:mode] eq "manual") (set HT_Wohnzimmer desiredTemperature manual {([HT_Wohnzimmer:desiredTemperature])+0.5}))

(IF ([HT_Kueche:mode] eq "auto") (set HT_Kueche desiredTemperature auto {([HT_Kueche:desiredTemperature])+0.5}))
(IF ([HT_Kueche:mode] eq "manual") (set HT_Kueche desiredTemperature manual {([HT_Kueche:desiredTemperature])+0.5}))

Attributes:
   do         always
   group      Heizung
   room       DOIFs
   wait       0,0,60,0,60,0,60,0,60,0:0,0,60,0,60,0,60,0,60,0


Ziel ist einmal/h ein temperatur Reading von den MAX Thermostaten zu bekommen. Läuft ja auch super ist halt etwas starr.
Nun dachte ich mir es müsste doch auch sowas in der Art gehen.
define DI_TempSet_all_test DOIF (["^HT_:desiredTemperature:sec"] > 3559) {foreach (AggrDoIf('@','^HT_','mode','$_ eq "auto"')) {(set '$name' desiredTemperature auto {('$_' -0.5)})}}
oder define DI_TempSet_all_test DOIF (["^HT_:desiredTemperature:sec"] > 3559) {foreach (AggrDoIf('@','^HT_','mode','$_ eq "auto"')) fhem(set '$name' desiredTemperature auto {('$_' -0.5)})}

Leider funktionieren beide Versuche nicht. Kommt nur bis ( syntax error at (eval 13747) line 1, near "set '$name'" ) .
Kann mir hier jemand den richtigen Hinweis geben? Bin mir mitlerweile auch nicht im Klaren ob und wann ich mich auf der "Perl Ebene" befinde und wann ich Doif Syntax anwenden soll.

Vielen Dank fürs drüberschauen

VG Sinus

Damian

Es sind einige Sachen drin, die syntaktisch so nicht gehen. Formuliere erst mal was du vorhast, dann kann ich dir vielleicht helfen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sinus

Hallo,

ja da wollte ich mal wieder zuviel auf einmal.....
Wo ich nochmal drüberschaue, der Trigger ist schon sch... lecht. Natürlich sollte ich dort das Reading "temperature" abfragen und nicht "desiredTemperature". Das ich die Zeit des letzen Timestamp eines Readings mit "<Device>:<Reading>:sec" abfragen kann hab ich erst gestern wieder beim Lesen der Cr gesehen und musste das natürlich auch gleich noch mit reintun. Das "@" fehlt auch noch denn so ist es die Syntax für Eventabfragen. Oh ManOMan... Bin mir gerade gar nicht sicher ob Timestamp Abfragen in der Aggregatfunktion überhaupt implementiert ist. -Frage(?)
Ist aber auch nicht Kriegsentscheidend.
Mir ging  es eher darum alle HT_Devices in ein Array einzulesen und über eine foreach Schleife die Setting abzufackeln. Wobei ich dort die "wait" verliere und ggf. "sleep" in die Schleife packen müßte wodurch das vermutlich DOIF blockiert wäre. Auch nicht gut.

In Worten: Wenn bei irgend einem "HT_DEVICE" der Timestamp des Readings "temperature" größer 1/h ist (oder eben starr 1*h für jedes HT_Device), veringere die aktuell eingestellte Temp um 0.5 Einheiten, nach Zeitspanne X, setze die Solltemperatur wieder auf den ursprünglichen Wert zurück. Berücksichtige dabei das Value vom Reading "mode".

Vielen Dank
Sinus

Damian

Zitat von: Sinus am 10 Mai 2017, 20:16:19
Hallo,

ja da wollte ich mal wieder zuviel auf einmal.....
Wo ich nochmal drüberschaue, der Trigger ist schon sch... lecht. Natürlich sollte ich dort das Reading "temperature" abfragen und nicht "desiredTemperature". Das ich die Zeit des letzen Timestamp eines Readings mit "<Device>:<Reading>:sec" abfragen kann hab ich erst gestern wieder beim Lesen der Cr gesehen und musste das natürlich auch gleich noch mit reintun. Das "@" fehlt auch noch denn so ist es die Syntax für Eventabfragen. Oh ManOMan... Bin mir gerade gar nicht sicher ob Timestamp Abfragen in der Aggregatfunktion überhaupt implementiert ist. -Frage(?)
Ist aber auch nicht Kriegsentscheidend.
Mir ging  es eher darum alle HT_Devices in ein Array einzulesen und über eine foreach Schleife die Setting abzufackeln. Wobei ich dort die "wait" verliere und ggf. "sleep" in die Schleife packen müßte wodurch das vermutlich DOIF blockiert wäre. Auch nicht gut.

In Worten: Wenn bei irgend einem "HT_DEVICE" der Timestamp des Readings "temperature" größer 1/h ist (oder eben starr 1*h für jedes HT_Device), veringere die aktuell eingestellte Temp um 0.5 Einheiten, nach Zeitspanne X, setze die Solltemperatur wieder auf den ursprünglichen Wert zurück. Berücksichtige dabei das Value vom Reading "mode".

Vielen Dank
Sinus

Das Problem in deinem Denkansatz ist die Tatsache, dass ein Event, welches man abfragt zum Triggerzeitpunkt immer den jetzigen Zeitstempel hat, daher würde sec, wenn es überhaupt gehen würde, immer Null sein.

Du musst dir also einen anderen Trigger überlegen, im schlimmsten Falle einen Zeittrigger, wie zuvor.

Allerdings ist deine foreach-Schleife an diversen Stellen nicht richtig:

statt

{foreach (AggrDoIf('@','^HT_','mode','$_ eq "auto"')) fhem(set '$name' desiredTemperature auto {('$_' -0.5)})}

eher:

{foreach (AggrDoIf('@','^HT_','mode','$_ eq "auto"')) {fhem ("set $_ desiredTemperature auto".((ReadingsVal($_,"desiredTemperature",0)-0.5))}}

Das ist halt reines Perl :)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF