Verständnisfrage: DOIF mit Thermostat

Begonnen von curt, 01 Oktober 2020, 02:02:58

Vorheriges Thema - Nächstes Thema

curt

Ich möchte über FHEMWEB einem Thermostat eine neue Soll-Temperatur mitteilen. Ich stelle mir ein Klapp-Runter-Menü mit vorgegebenen Temperaturen vor - aus denen ich auswählen kann.

Ich habe verstanden, dass das mit DOIF (setList, readingList),  geht. Einfache DOIF kann ich auch. Allerdings scheitere ich hier schon am Verständnis: Bei DOIF wird zuerst ja was getestet. Ich habe aber garnichts zum testen. Ich will einfach nur eine neue Temperatur auswählen.

Gegeben ist:

Thermostat_Gaestezimmer ZWave xxxxxxxx xx


Vermittels

set Thermostat_Gaestezimmer desired-temp 14

sende ich dem Thermostaten den Befehl, die Solltemperatur auf 14°C zu stellen, das geht fein.

Nun möchte ich gern ein Klapp-Runter-Menü haben, welches mir drei verschiedene Soll-Temperaturen anbietet, ich kann dann eine auswählen usw. Also sagen wir mal: 14, 18, 21.

Alle veröffentlichten Beispiele sind überfrachtet mit zig zu testenden Nebenbedingungen (Uhrzeit et al) - das will ich alles nicht. Und damit werden die Beispiele so kompliziert, dass ich nichts verstehe.

Wäre bitte jemand so freundlich, mir ein vollständiges Beispiel für diese scheinbar leichte Aufgabe 14, 18, 21 zu zeigen? Das würde mir sehr helfen.
RPI 4 - Jeelink HomeMatic Z-Wave

Otto123

Hallo curt,

Du willst es einfach, Du meinst DOIF ist einfach  ::)
Gaaanz Basic Vorschlag:
define setTemperatur dummy
attr setTemperatur setList desired-temp:14,18,21
define n_setTemperatur notify setTemperatur set Thermostat_Gaestezimmer $EVENT


Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Eistee

#2
Du musst ein userreading im DOIF anlegen. Dann kannst du auf dieses triggern. und du kannst für dieses eine liste definieren aus der du deine Temperatur auswählst. Durch das auswählen der Temperatur wird das userreading geändert und es erzeugt ein Event auf welches DOIF triggert.

Auf einen Dummy kannst du verzichten da DOIF alle Funktionen eines Dummy auch beherrscht.

Evtl. ist das noch hilfreich: https://wiki.fhem.de/wiki/DOIF/Ein-_und_Ausgabe_in_FHEMWEB_und_Tablet-UI_am_Beispiel_einer_Schaltuhr

curt

Zitat von: Eistee am 01 Oktober 2020, 09:11:37
Du musst ein userreading im DOIF anlegen. Dann kannst du auf dieses triggern. und du kannst für dieses eine liste definieren aus der du deine Temperatur auswählst.

Wärst Du bitte so freundlich, mir da an Hand des kleinen Temperaturproblems als Beispiel zu zeigen?
RPI 4 - Jeelink HomeMatic Z-Wave

amenomade

setreading <DOIFname> desired-temp 14.0
attr <DOIFname> readingList desired-temp
attr <DOIFname> setList desired-temp:14,18,21

Benutzung im DOIF:
[$SELF:desired-temp]

DOIF ([$SELF:desired-temp] > 25)(set Thermostat_Gaestezimmer desired-temp [$SELF:desired-temp], set $SELF desired-temp 14)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Otto123

@amenomade [$SELF:desired-temp] > 25  - der löst doch nie aus? Und wenn Du < nimmst triggert er doch selbst nochmal? Gut ohne do always nur einmal, aber dann sowieso nie wieder? Aber ich habe jetzt nur drüber nachgedacht und nicht probiert. Vielleicht sehe ich nicht alles.  ;)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Damian

#6
Zitat von: Otto123 am 02 Oktober 2020, 10:18:59
@amenomade [$SELF:desired-temp] > 25  - der löst doch nie aus? Und wenn Du < nimmst triggert er doch selbst nochmal? Gut ohne do always nur einmal, aber dann sowieso nie wieder? Aber ich habe jetzt nur drüber nachgedacht und nicht probiert. Vielleicht sehe ich nicht alles.  ;)

ja, das Beispiel ist nicht besonders sinnvoll, aber demonstriert zumindest, dass man auf das Reading triggern bzw. abfragen kann

im Perl-Modus könnte man z.B. zu der setList definieren:

DOIF {fhem_set("Thermostat_Gaestezimmer desired-temp ".[$SELF:desired-temp])}

hier wird auf Änderung des eigenen Readings getriggert und gleichzeitig das Thermostat gesetzt, ähnlich wie bei dem notify nur dass hier beides (Eingabe und Änderung) in einem Modul stattfindet.

PS. Wenn man etwas mehr will, kann man auch sowas in einem Modul unterbringen: https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Visualisierung_und_Steuerung_von_Raumtemperaturen
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

amenomade

Zitat von: Damian am 02 Oktober 2020, 11:20:28
ja, das Beispiel ist nicht besonders sinnvoll, aber demonstriert zumindest, dass man auf das Reading triggern bzw. abfragen kann

Genau. Das war der einzige Sinn meines Beispiels.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

curt

Entschuldigt bitte: Kurz vor der vmtl. 2. Corona-Welle machte ich nochmal Kurzurlaub. Da hätte ich zwar auf mein FHEM zugreifen können, aber ich traute mich nicht: Wenn da was schief geht ...

Ich bin fürchterlich dumm, ich merke das immer wieder. Wenn ich meine alten (seit 2017 dabei) fragenden Beiträge so lese ... meine Fresse. - Ok, ich bin jetzt auch wieder dumm.

Würde das folgende Konstrukt denn gehen? Habe ich das richtig verstanden?


defmod mein_doif DOIF ([$SELF:desired-temp] < 30)(set Thermostat_Gaestezimmer desired-temp [$SELF:desired-temp], set $SELF desired-temp 14)
setreading mein_doif desired-temp 14.0
attr mein_doif readingList desired-temp
attr mein_doif setList desired-temp:14,18,21
attr mein_doif Room Heizung


Oder habe ich da mal wieder was falsch verstanden?

* Ist das "kleiner 30" grundsätzlich richtig?
* Muss ich da irgendwie noch ein do always reinmanschen (und falls ja: Warum?)
RPI 4 - Jeelink HomeMatic Z-Wave

Otto123

#9
Moin,

warum nimmst Du nicht den Vorschlag vom "DOIF Chef", sondern den, wo drei Leute gesagt haben der ist nicht sinnvoll sondern nur zur Demonstration?
Wenn Du das machst wie Du jetzt zeigst und da noch ein do always rein machst, brauchst Du mMn nichts weiter zu tun - da heizt der Rechner mit FHEM deine Bude von ganz alleine  :o
Das gibt ne Schleife: "wenn ich kleiner 30 bin dann setze mich selbst auf 14 und triggere mich wieder" -> rennt im Kreis.

Edit: nach einem Test rennt es nicht im Kreis ;)

Mein unwesentlicher Vorschlag: Ersetze Deinen Code hinter DOIF durch den von Damian. Ich verstehe ihn nur ansatzweise, aber wenn DOIF so funktioniert (Damian wirds wissen) dann ist es so. ;)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Sany

Hallo curt,

ich hab mal was gebastelt, hier als raw um es direkt einzufügen:
defmod di_Thermostat_Gaestezimmer DOIF ([$SELF:"SollGaeste"])\
   (set Thermostat_Gaestezimmer desired-temp [$SELF:SollGaeste])
attr di_Thermostat_Gaestezimmer do always
attr di_Thermostat_Gaestezimmer event-on-change-reading SollGaeste
attr di_Thermostat_Gaestezimmer readingList SollGaeste
attr di_Thermostat_Gaestezimmer room Test
attr di_Thermostat_Gaestezimmer setList SollGaeste:14,18,21
attr di_Thermostat_Gaestezimmer stateFormat gewaehlt: SollGaeste
attr di_Thermostat_Gaestezimmer webCmd SollGaeste


etwas Erklärung dazu:
setList SollGaeste:14,18,21 erzeugt die Möglichkeit, ein Reading SollGaeste mit einem der 3 Werte zu füllen
readingList SollGaeste legt eben dieses Reading an.
webCmd SollGaeste erzeugt das Dropdown Menü zur Auswahl im FHEMWEB
stateFormat ändert den STATE des DOIF. Kannst du auch weglassen

Das DOIF triggert auf den EVENT  "SollGaeste". Diesen Trigger gibt es immer, wenn im Dropdown ein anderer Wert gewählt wird. Daraufhin wird das Reading SollGaeste geändert und dann der Inhalt dieses Readings an den Thermostaten geschickt.
doAlways muss gesetzt sein, sonst klappts nur einmal
event-on-change-Reading SollGaeste sorgt dafür, das von DOIF keine weiteren Events im System erzeugt werden.

Das Ganze ist ein DOIF im DOIF-Modus. Das Beispiel von Damian ist im DOIF-Perl-Modus. Es sollte klar sein, was man verwendet und dann nicht mischen! (z.B. do always gibts im DOIF-Perl-modus nicht!

@Otto:
ZitatErsetze Deinen Code hinter DOIF durch den von Damian. Ich verstehe ihn nur ansatzweise, aber wenn DOIF so funktioniert (Damian wirds wissen) dann ist es so
durch den ersten Satz würde er die beiden DOIF-Modi mischen -> nicht gut.
den 2ten Satz kann ich Dir gar nicht glauben, wenn ich überlege, was ich schon hilfreiches Deinerseits gelesen haben. Zur Erklärung gibts 2 Stellen aus der Commandref:
ZitatEin DOIF-Block wird ausgeführt, wenn dieser bedingt durch Ereignis- und Zeittrigger in eckigen Klammern innerhalb des Blocks, getriggert wird.
ZitatEreignis-/Zeittrigger sind intern Perlfunktionen, daher können sie an beliebiger Stelle im Perlcode angegeben werden, wo Perlfunktionen vorkommen dürfen,

Viel Erfolg!
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Otto123

#11
Zitat von: Sany am 08 Oktober 2020, 14:16:00
@Otto: durch den ersten Satz würde er die beiden DOIF-Modi mischen -> nicht gut.
den 2ten Satz kann ich Dir gar nicht glauben, wenn ich überlege, was ich schon hilfreiches Deinerseits gelesen haben. Zur Erklärung gibts 2 Stellen aus der Commandref:
Wieso würde er da was mischen? Damians Code ist doch sauber Perl? Der wird doch durch setreading sowie attr readingList, setList und room nicht gemischt?
Aber ich sollte mich raushalten, ich hab es nicht getestet. Wenn Du sagst es ist so - kann sein: Dann hab ich grundlegend was nicht verstanden und werde mich in Zukunft aus DOIF Fragen besser raushalten.
Deine Zitate belegen für mich nicht, dass es keine Schleife gibt. Aber das probier ich gleich mal aus ;)

Edit: Ok es ergibt keine Schleife mit do always.  8)

So habe ich getestet:
Variante curt
defmod mein_doif DOIF ([$SELF:desired-temp] < 30)(set Thermostat_GaestezimmerT desired-temp [$SELF:desired-temp], set $SELF desired-temp 14)
attr mein_doif readingList desired-temp
attr mein_doif room Heizung
attr mein_doif setList desired-temp:14,18,21
attr mein_doif do always

defmod Thermostat_GaestezimmerT dummy
attr Thermostat_GaestezimmerT readingList desired-temp
attr Thermostat_GaestezimmerT room Heizung

Variante Damian
defmod mein_doif DOIF {fhem_set("Thermostat_GaestezimmerT desired-temp ".[$SELF:desired-temp])}
deleteattr mein_doif do

Läuft beides :) ohne Zusatzheizung(Schleife)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Sany

@Otto: mit mischen meinte ich, wenn er in seinem begonnenen DOIF (DOIF-Modus) mit Attributen dann in der DEF DOIF-Perl schreibt bleiben seine Attribute ja stehen, und auch wenn sie nix bewirken (ist nur ein Annahme, ungeprüft) stehen sie da und verwirren den nächsten, der sich das anschaut. Sollten sie die Funktion beeinträchtigen umso schlimmer. Also ein DOIF entweder im DOIF-Modus oder im Perl-Modus beginnen und dann nicht wechseln.

Zu Deinen Tests: in Variante curt statt ([$SELF:desired-temp] < 30) einfach auf den Event triggern ([$SELF:"desired-temp"]) und in der Ausführung kann man das , set $SELF desired-temp 14 weglassen. Durch setList und readingList mit dem gleichen Namen wird das Reading bei Änderung über das Auswahlfeld gesetzt und triggert das DOIF. Das ist eigentlich genau mein Beispiel, nur habe ich das Reading SollGaeste genannt, um es lesbarer zu machen.

Gruß und schönen Abend!
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Otto123

Drum prüfe wenn Du behauptest :)
https://fhem.de/commandref_DE.html#DOIF_Attribute_Perl_Modus
ZitatDer Modus eines definierten DOIF-Devices wird automatisch aufgrund der Definition vom Modul erkannt (FHEM-Modus beginnt mit einer runden Klammer auf)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Sany

habs geprüft. hab ich auch in etwa so geschrieben:
ZitatAlso ein DOIF entweder im DOIF-Modus oder im Perl-Modus beginnen und dann nicht wechseln

Wichtig ist hier "beginnen";-)

Wenn Du testen möchtest:
defmod testDOIF DOIF ([08:00])\
   (set lamp on)\
   DOELSE\
   (set lamp off)
attr testDOIF do always
attr testDOIF wait 10


ein lupenreines DOIF-Modus DOIF, mit Attributen do und wait. Die gibt es beide nicht im Perl-Modus.
Wenn Du dieses DOIF nun änderst: die DEF ersetzen durch z.B.
init {
set_Reading("Hallo","Test");
}

dann hast Du ein DOIF im Perl-Modus, die Attribute do und wait sind aber immer noch da, allerdings nicht in der Attribut-Auswahl zu finden.

Internals:
   CFGFN     
   DEF        init {
set_Reading("Hallo","Test");
}
   FUUID      5f7f68b5-f33f-da6d-ca20-fbacc169f73d000c
   MODEL      Perl
   NAME       testDOIF
   NOTIFYDEV  global
   NR         760
   NTFY_ORDER 50-testDOIF
   STATE      initialized
   TYPE       DOIF
   VERSION    22913 2020-10-04 21:46:02
   READINGS:
     2020-10-08 21:32:10   Hallo           Test
     2020-10-08 21:32:10   block_init      executed
     2020-10-08 21:32:10   mode            enabled
     2020-10-08 21:32:10   state           initialized
   Regex:
     accu:
   attr:
     wait:
       0:
         10
   condition:
     0         
set_Reading("Hallo","Test");

   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
     globalinit 1
     last_timer 0
     sleeptimer -1
   perlblock:
     0          init
     init       0
   uiTable:
Attributes:
   do         always
   wait       10



@curt: Klappts denn jetzt wie gewünscht?
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....