Ich möchte die folgenden Wertebereiche auf diskrete Werte abbilden:
[00] -> 15
[01-19]-> 16
[20-39]-> 17
[40-59]-> 18
[60-79]-> 19
[80-100]-> 20
Mein DOIF für den ersten Fall sieht so aus: ([valves:state] == 0) (set CW400 desired-temp 15) DOELSE / (do always)
Wichtig ist, dass sobald sich der Wertebereich ändert, der set-Befehl ausgeführt wird.
Hab zwar schon viele DOIFs geschrieben, staune aber gern immer wieder über die eleganten Lösungen, die hier möglich sind ... ;)
Grüße, grappa24
Wenn du den Bereich etwas verschiebst (verschieben kannst), kannst du mit einer einfachen Formel arbeiten:
15 + round([value]/20)
Wenn nicht, fängst du die beiden Abweichler ab und nutzt die Formel angepasst für den Rest.
Danke Per, guter Ansatz!
Ich möchte jedoch die Bereiche und die Zielwerte möglichst flexibel halten bzw. anpassen können, was erstmal gegen eine Formel spricht ... :(
grappa24
Na ja, dann sollte es über eine Abfragekaskade gehen (if/elsif bzw. die DOIF-Pendants): kleiner 01: 15, kleiner als 20: 16 usw...
Aber mal was ganz anderes: Eventuell solltest du mal checken, ob nicht PID20 (https://wiki.fhem.de/wiki/PID20_-_Der_PID-Regler) eine Sache wäre, die hier für die Regelung passen würde (ich kenne das nur vom Hörensagen und kann daher nicht viel mehr liefern als das Stichwort).
Zitat von: grappa24 am 03 Februar 2020, 12:39:55
Wichtig ist, dass sobald sich der Wertebereich ändert, der set-Befehl ausgeführt wird.
Sollen sich die Grenzen ändern? Oder meinst du nur [valves:state] was sich logischerweise immer ändert?
Wenn du auf Grenzenänderungen triggern willst, dann wirst du die Grenzen als Readings in den if-Abfragen angeben müssen, damit das DOIF die Änderungen bemerkt.
Zitat von: Beta-User am 03 Februar 2020, 13:17:28
Eventuell solltest du mal checken, ob nicht PID20 (https://wiki.fhem.de/wiki/PID20_-_Der_PID-Regler) eine Sache wäre, die hier für die Regelung passen würde
wow, das ist aber dann die volle Breitseite ;D Danke für den Tipp
OT: Wie du siehtst kämpfe ich gerade mit meiner Heizung und hab daher wenig Zeit für die attrTemplates :(
Zitat von: Damian am 03 Februar 2020, 13:23:52
Sollen sich die Grenzen ändern? Oder meinst du nur [valves:state] was sich logischerweise immer ändert?
nein, die Grenzen sind fest, es ändert sich nur [valves:state]
Zitat von: grappa24 am 03 Februar 2020, 13:32:00
wow, das ist aber dann die volle Breitseite ;D Danke für den Tipp
OT: Wie du siehtst kämpfe ich gerade mit meiner Heizung und hab daher wenig Zeit für die attrTemplates :(
Nevermind, ich unterstelle mal, du wirst schon "beizeiten liefern" ;) .
Falls du erfolgreich gekämpft hast, kannst du ja auch die Stichwortliste in https://wiki.fhem.de/wiki/Grundlagen_der_Heizungssteuerung eventuell mal ergänzen/verbessern, PID20 fehlt da offenkundig noch...
Zitat von: grappa24 am 03 Februar 2020, 13:37:51
nein, die Grenzen sind fest, es ändert sich nur [valves:state]
Dann einfach
DOIF { if ([valves:state]<1) {
fhem_set("CW400 desired-temp 15");
} elsif ([valves:state]<19) {
fhem_set("CW400 desired-temp 16");
} elsif ([valves:state]<40) {
fhem_set("CW400 desired-temp 17");
} elsif (...
}
@Damian: Das ist genau das was ich gesucht habe (elegant ...) :D Sehr strukturiert und doch mit dem gewissen etwas des DOIFs ;D
Nur eine Frage: Der normale Befehl ist ja set CW400 desired-temp 15
geht der innerhalb der Konstruktion nicht oder was ist der Grund, warum dufhem_set("CW400 desired-temp 15");
gewählt hat?
Zitat von: grappa24 am 03 Februar 2020, 15:36:34
@Damian: Das ist genau das was ich gesucht habe (elegant ...) :D Sehr strukturiert und doch mit dem gewissen etwas des DOIFs ;D
Nur eine Frage: Der normale Befehl ist ja set CW400 desired-temp 15
geht der innerhalb der Konstruktion nicht oder was ist der Grund, warum dufhem_set("CW400 desired-temp 15");
gewählt hat?
Mein Vorschlag läuft komplett in Perl, fhem_set ist eine Perl-Funktion, sie ist etwas schneller als fhem("set ...
Zu bedenken ist allerdings, dass in der Perl-Variante ein wiederholendes Schalten nicht automatisch unterbunden wird.
Ansonsten kannst du immer konventionell im FHEM-Modus definieren:
DOIF ([valves:state]<1) (set CW400 desired-temp 15)
DOELSEIF ([valves:state]<19 ) (set CW400 desired-temp 16)
DOELSEIF ....