FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: grappa24 am 03 Februar 2020, 12:39:55

Titel: Abbildung von Wertebereichen auf diskrete Werte
Beitrag von: grappa24 am 03 Februar 2020, 12:39:55
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




Titel: Antw:Abbildung von Wertebereichen auf diskrete Werte
Beitrag von: Per am 03 Februar 2020, 12:59:17
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.
Titel: Antw:Abbildung von Wertebereichen auf diskrete Werte
Beitrag von: grappa24 am 03 Februar 2020, 13:09:43
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
Titel: Antw:Abbildung von Wertebereichen auf diskrete Werte
Beitrag von: Beta-User am 03 Februar 2020, 13:17:28
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).
Titel: Antw:Abbildung von Wertebereichen auf diskrete Werte
Beitrag von: Damian am 03 Februar 2020, 13:23:52
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.
Titel: Antw:Abbildung von Wertebereichen auf diskrete Werte
Beitrag von: grappa24 am 03 Februar 2020, 13:32:00
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  :(
Titel: Antw:Abbildung von Wertebereichen auf diskrete Werte
Beitrag von: grappa24 am 03 Februar 2020, 13:37:51
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]
Titel: Antw:Abbildung von Wertebereichen auf diskrete Werte
Beitrag von: Beta-User am 03 Februar 2020, 13:40:31
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...
Titel: Antw:Abbildung von Wertebereichen auf diskrete Werte
Beitrag von: Damian am 03 Februar 2020, 15:13:27
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 (...
     }

Titel: Antw:Abbildung von Wertebereichen auf diskrete Werte
Beitrag 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 15geht der innerhalb der Konstruktion nicht oder was ist der Grund, warum dufhem_set("CW400 desired-temp 15"); gewählt hat?
Titel: Antw:Abbildung von Wertebereichen auf diskrete Werte
Beitrag von: Damian am 03 Februar 2020, 15:45:57
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 15geht 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 ....