Hauptmenü

wait bei Doif mit if

Begonnen von Olaf234, 27 Oktober 2024, 11:49:27

Vorheriges Thema - Nächstes Thema

Olaf234

Hallo zusammen,
ich habe eine Frage zum Einsatz von wait in diesem Szenario:
DOIF (
[01:00|So]
)
(IF ([VB1_SW1_OG_Raum1] eq "off")
(
attr VB1_SW1_OG_Raum1_Steuerung disable 1,
set VB1_SW1_OG_Raum1 on,
set VB1_SW1_OG_Raum1 off,
attr VB1_SW1_OG_Raum1_Steuerung disable 0
)
IF ([VB1_SW1_OG_Raum1] eq "on")
(
attr VB1_SW1_OG_Raum1_Steuerung disable 1,
set VB1_SW1_OG_Raum1 off,
set VB1_SW1_OG_Raum1 on,
attr VB1_SW1_OG_Raum1_Steuerung disable 0
)
)

Ein Heizungsventil soll je nach Stellung unterschiedlich gefahren werden. Die Temperatursteuerung des Ventils wird in dieser Zeit disabled. Im ersten Fall soll die Fahrt sofort begonnen werden und nach 400 Sekunden wieder zurück fahren (wait 0,0,400). Beim entgegengesetzten Zustand, soll das Ventil erst nach 120 Sekunden die Fahrt beginnen (wait 0,120,400). Da ich aber nur ein cmd habe komme ich nicht weiter.
0,0,400:0,120,400 klappt genausowenig wie 0,0,400,0,120,400. Die sufu hat mich nicht weitergebracht. Wie geht das bitte richtig?


Damian

Innerhalb eines IFs funktioniert wait nicht. Du musst die IF-Abfrage in die DOIF-Bedingungen packen, dann kannst du mit wait arbeiten:

DOIF ([01:00|So] and [VB1_SW1_OG_Raum1] eq "off")
(
attr VB1_SW1_OG_Raum1_Steuerung disable 1,
set VB1_SW1_OG_Raum1 on,
set VB1_SW1_OG_Raum1 off,
attr VB1_SW1_OG_Raum1_Steuerung disable 0
)
DOELSEIF ([01:00|So] and [VB1_SW1_OG_Raum1] eq "on")
(
attr VB1_SW1_OG_Raum1_Steuerung disable 1,
set VB1_SW1_OG_Raum1 off,
set VB1_SW1_OG_Raum1 on,
attr VB1_SW1_OG_Raum1_Steuerung disable 0
)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Olaf234

Vielen Dank für die Antwort. Ich verstehe. Schade nur, denn mit if zu arbeiten (ich übe mich gerade daran) finde ich super elegant.

Kann es sein das, wenn wait innnerhalb eines IF nicht funktioniert, dies auch nicht funktioniert? Damit habe ich auch Probleme.
DOELSEIF (
[?$SELF:Nutzung] eq "on"
and [?$SELF:betriebsart] eq "kühlen"
)
(IF ([TF.EG.Wohn:temperature] >= 25)
(
set VB3_SW3_EG_WZv on,
set VB3_SW4_EG_WZh on
)
IF ([TF.EG.Wohn:temperature] < 25)
(
set VB3_SW3_EG_WZv off,
set VB3_SW4_EG_WZh off
)
)

Ich vermute fast, dass dem so ist. Bei den anderen Bedingungen ist immer eine Zeit mit eingebunden, nur hier nicht und die anderen funktionieren. 

rabehd

Zitat von: Olaf234 am 27 Oktober 2024, 12:52:46Vielen Dank für die Antwort. Ich verstehe. Schade nur, denn mit if zu arbeiten (ich übe mich gerade daran) finde ich super elegant.
 

Das IF ist doch schon im DOIF drin.
Auch funktionierende Lösungen kann man hinterfragen.

Gisbert

Hi Olaf,

IF ist ein eigenständiges Modul in Fhem und hat (wahrscheinlich) wenig mit DOIF zu tun.

Auch wenn es wünschenswert ist, spielt der Code von IF nicht mit. Was ist so schlimm oder unübersichtlich den Code von Damian zu benutzen?

Warum sollte man immer eine Zeit als Trigger benützen müssen, ich lese es so aus deinem Beitrag raus?

Ich bezweifle zudem, dass dein letztes Beispiel überhaupt funktionieren kann. Ich sehe jedenfalls keinen Trigger, sondern nur 2 Bedingungen, die mit dem "?" nicht-triggernd sein sollten.

Viele Grüße Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

Olaf234

Es erscheint mir sinnvoll, statt 2 DOIF cmds eines zu verwenden. Normalerweise schreibe ich den code so:
DOELSEIF (
[TF.EG.Wohn:temperature] >= 25
and [?$SELF:Nutzung] eq "on"
and [?$SELF:betriebsart] eq "kühlen"
)
(set VB3_SW3_EG_WZv on)
(set VB3_SW4_EG_WZh on)

DOELSEIF (
[TF.EG.Wohn:temperature] < 25
and [?$SELF:Nutzung] eq "on"
and [?$SELF:betriebsart] eq "kühlen"
)
(set VB3_SW3_EG_WZv off)
(set VB3_SW4_EG_WZh off)

Der Ereignisteil ist identisch, es besteht nur eine Variation in der steigenden oder sinkenden Temperatur. Nur ein CMD dafür zu brauchen fände ich schöner

Gisbert

Zitat von: Olaf234 am 27 Oktober 2024, 19:46:13Nur ein CMD dafür zu brauchen fände ich schöner
Mir ist ein funktionierender Code lieber als in meinen Augen schöner Code, der aber nicht funktioniert. Ich weiß nicht wie du dazu stehst.
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

Damian

Du kannst innerhalb vom IF mit dem FHEM-Sleep Befehl arbeiten. Der bricht allerdings im Gegensatz zu wait nicht ab, wenn sich die Bedingung ändert.

Wenn du es schön haben willst, dann kannst du es im DOIF-Perl-Modus programmieren, dort kannst du beliebig ifs-verschachteln und an beliebiger Stelle Befehle über die Perl-Funktion Set_Exec verzögern. Allerdings erfordert es gewisse Programmierkenntnisse in Perl.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Olaf234

Wenn ich von schön spreche, meine ich natürlich nicht Ästhetik. Für mich als Laie ist ein "schöner" (funktionierender) Code, entsprechend meinen Kenntnissen, lesbar und verständlich aufgebaut. Es wäre nicht das erste Mal, dass ich mich wundere, was ich da vor 3 Jahren zusammengeschrieben habe :D

In dem Versuch meine Programmierkennnisse zu erweitern, passiert es dann zuweilen, dass ich vorangegangene Herangehensweisen überdenke und versuche, bestehenden (funktionierenden) Code neu zu schreiben, mit dem Ziel ihn "schöner" zu machen, was dann aber möglicherweise nicht funktioniert wie gedacht. So wie in diesem Fall. Schade, wie gesagt, dass es so nicht funktioniert aber dann bleibe ich eben bei dem ursprünglichen Code, oder, dank Damians konstruktivem Vorschlag, experimentiere ich nun mit dem sleep Befehl um herauszufinden, ob die Verwendung zweckmäßig ist (und natürlich für die Erfahrung). Zumindest aber werde ich mich intensiver mit dem DOIF-Perl Modus befassen. Das scheint mir am meisten Sinn zu machen.