Hauptmenü

DOIF-Problem?!

Begonnen von FHEM_Alex_Pi, 20 September 2014, 22:49:49

Vorheriges Thema - Nächstes Thema

FHEM_Alex_Pi

Hallo!

Danke für das vielseitige Modul. Leider tut es nicht was ich will, aber vielleicht sitzt der Fehler ja vor dem Rechner. Daher bitte ich um Unterstützung.

Ich will das Modul für eine Rollladensteuerung einsetzen:

  • DOIF Wenn die Sonne aufgeht soll der Rollladen öffnen, nicht jedoch zwischen 22:00 und 05:30
  • DOELSEIF Wenn die Sonne auf dem Fenster steht und es wärmer als 22°C wird soll beschattet werden
  • DOELSE ansonsten Rollladen schließen

Auszug aus der fhem.cfg:
...
#Wettervorhersage Yahoo
define eVorhersage Weather 648378 1800 de

# Sonnenauf- und -untergang / Dämmerung
define eDaemmerung Twilight 51.0896 6.32218 0 648378

# Aktor Küche Rollladen
define aKueRol EnOcean FFF74D80
...

# Küche Rollladensteuerung
define pRolDif DOIF (([eDaemmerung:twilight_weather]<40) or [22:00-05:30]) (set aKueRol closes)\
DOELSEIF (([eDaemmerung:azimuth]<180) and ([eVorhersage:fc1_high_c]>22) and [08:00-22:00]) (set aKueRol position 40 0)\
DOELSE (set aKueRol opens)
...

# Filelog Küche Rollladen
define fKueRol FileLog ./log/fKueRol.log aKueRol:positon:.*|eDaemmerung:twilight:.*|eDaemmerung:twilight_weather:.*|eVorhersage:temp_c:.*|pRolDif:.


Auszug aus dem Logfile:
...
2014-09-20_21:04:13 aKueRol positon: 0
2014-09-20_21:06:53 eDaemmerung twilight: 0
2014-09-20_21:06:53 eDaemmerung twilight_weather: 0
2014-09-20_21:06:53 pRolDif cmd_nr: 1
2014-09-20_21:06:53 pRolDif cmd_event: eDaemmerung
2014-09-20_21:06:53 pRolDif cmd_1
2014-09-20_21:06:53 aKueRol positon: 0
...
2014-09-20_21:07:17 aKueRol positon: 100
2014-09-20_21:11:53 eDaemmerung twilight: 0
2014-09-20_21:11:53 eDaemmerung twilight_weather: 0
2014-09-20_21:16:53 eDaemmerung twilight: 0
2014-09-20_21:16:53 eDaemmerung twilight_weather: 0
2014-09-20_21:21:53 eDaemmerung twilight: 0
2014-09-20_21:21:53 eDaemmerung twilight_weather: 0
2014-09-20_21:22:17 aKueRol positon: 100
2014-09-20_21:26:53 eDaemmerung twilight: 0
2014-09-20_21:26:53 eDaemmerung twilight_weather: 0
2014-09-20_21:31:53 eDaemmerung twilight: 0
2014-09-20_21:31:53 eDaemmerung twilight_weather: 0
2014-09-20_21:33:49 eVorhersage temp_c: 18
2014-09-20_21:33:49 pRolDif cmd_nr: 3
2014-09-20_21:33:49 pRolDif cmd_event: eVorhersage
2014-09-20_21:33:49 pRolDif cmd_3
2014-09-20_21:33:49 aKueRol positon: 100
...
2014-09-20_21:34:13 aKueRol positon: 0
2014-09-20_21:36:53 eDaemmerung twilight: 0
2014-09-20_21:36:53 eDaemmerung twilight_weather: 0
2014-09-20_21:36:53 pRolDif cmd_nr: 1
2014-09-20_21:36:53 pRolDif cmd_event: eDaemmerung
2014-09-20_21:36:53 pRolDif cmd_1
2014-09-20_21:36:53 aKueRol positon: 0
...
2014-09-20_21:37:17 aKueRol positon: 100
2014-09-20_21:41:53 eDaemmerung twilight: 0
2014-09-20_21:41:53 eDaemmerung twilight_weather: 0
2014-09-20_21:46:53 eDaemmerung twilight: 0
2014-09-20_21:46:53 eDaemmerung twilight_weather: 0
2014-09-20_21:51:53 eDaemmerung twilight: 0
2014-09-20_21:51:53 eDaemmerung twilight_weather: 0
2014-09-20_21:52:17 aKueRol positon: 100
2014-09-20_21:56:53 eDaemmerung twilight: 0
2014-09-20_21:56:53 eDaemmerung twilight_weather: 0
2014-09-20_22:00:00 pRolDif cmd_nr: 3
2014-09-20_22:00:00 pRolDif cmd_event: timer_4
2014-09-20_22:00:00 pRolDif cmd_3
2014-09-20_22:00:00 aKueRol positon: 100
...
2014-09-20_22:00:24 aKueRol positon: 0
2014-09-20_22:01:53 eDaemmerung twilight: 0
2014-09-20_22:01:53 eDaemmerung twilight_weather: 0
2014-09-20_22:01:53 pRolDif cmd_nr: 1
2014-09-20_22:01:53 pRolDif cmd_event: eDaemmerung
2014-09-20_22:01:53 pRolDif cmd_1
2014-09-20_22:01:53 aKueRol positon: 0
2014-09-20_22:01:53 aKueRol positon: 0
...
2014-09-20_22:02:17 aKueRol positon: 100
2014-09-20_22:03:49 eVorhersage temp_c: 18
2014-09-20_22:03:49 pRolDif cmd_nr: 3
2014-09-20_22:03:49 pRolDif cmd_event: eVorhersage
2014-09-20_22:03:49 pRolDif cmd_3
2014-09-20_22:03:49 aKueRol positon: 100
...
2014-09-20_22:04:13 aKueRol positon: 0
2014-09-20_22:06:53 eDaemmerung twilight: 0
2014-09-20_22:06:53 eDaemmerung twilight_weather: 0
2014-09-20_22:06:53 pRolDif cmd_nr: 1
2014-09-20_22:06:53 pRolDif cmd_event: eDaemmerung
2014-09-20_22:06:53 pRolDif cmd_1
2014-09-20_22:06:53 aKueRol positon: 0
...
2014-09-20_22:07:17 aKueRol positon: 100
2014-09-20_22:11:53 eDaemmerung twilight: 0
2014-09-20_22:11:53 eDaemmerung twilight_weather: 0


Immer wenn ein Event kommt, welcher in DOELSEIF verwendet wird wird offensichtlich diese Bedingung geprüft.
Die DOELSEIF-Bedingung ist aber nicht erfüllt, also wird der Befehl DOELSE ausgeführt.
Da die DOIF-Bedingung erfüllt ist müsste diese ausgeführt werden und DOELSEIF & DOELSE übersprungen werden?! Passiert aber nicht.

(Was) mache ich falsch, oder ist das ein Bug?  :-[

Im Logflile wird "temp_c" mitgeschrieben, "fc1_high_c" in DOIF ausgewertet. Spielt IMHO aber keine Rolle, da es offensichtlich mit dem Aufruf des Moduls zusammenhängt.

Grüße aus Erkelenz,

Alexander

Damian

Zitat von: FHEM_Alex_Pi am 20 September 2014, 22:49:49

Ich will das Modul für eine Rollladensteuerung einsetzen:

  • DOIF Wenn die Sonne aufgeht soll der Rollladen öffnen, nicht jedoch zwischen 22:00 und 05:30
  • DOELSEIF Wenn die Sonne auf dem Fenster steht und es wärmer als 22°C wird soll beschattet werden
  • DOELSE ansonsten Rollladen schließen

Auszug aus der fhem.cfg:
...

# Küche Rollladensteuerung
define pRolDif DOIF (([eDaemmerung:twilight_weather]<40) or [22:00-05:30]) (set aKueRol closes)\
DOELSEIF (([eDaemmerung:azimuth]<180) and ([eVorhersage:fc1_high_c]>22) and [08:00-22:00]) (set aKueRol position 40 0)\
DOELSE (set aKueRol opens)




Irgendwie passt die Definition nicht zu deiner Beschreibung. Erste Bedingung soll lt. Beschreibung bei Sonnenaufgang Rollladen hochfahren, es sieht für mich aber so aus, als wenn diese Bedingung bei dir zum runterfahren definiert ist. DOELSE soll Rollladen schließen, definiert ist aber "set aKueRol opens".

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FHEM_Alex_Pi

Das ist richtig. Das habe ich in der Beschreibung verwechselt:

Wenn ([eDaemmerung:twilight_weather]<40), also wenn es dunkel ist => (set aKueRol closes)
Diese Bedingung ist Nachts immer erfüllt, trotzdem fährt der Rollladen zeitweise wieder hoch. Und war immer dann, wenn ([eVorhersage:fc1_high_c]>22) neu gelesen wird. Da diese Bedingung hier nicht erfüllt ist wird (set aKueRol opens) ausgeführt.
Ist das ein Bug oder mein Fehler. Warum wird die DOIF-Abfrage übersprungen?
Wenn [eDaemmerung:twilight_weather] wieder gelesen wird fährt er auch wieder runter, selbst wenn sich der Wert nicht geändert hat. (=0)

Damian

Zitat von: FHEM_Alex_Pi am 21 September 2014, 10:07:03
Das ist richtig. Das habe ich in der Beschreibung verwechselt:

Wenn ([eDaemmerung:twilight_weather]<40), also wenn es dunkel ist => (set aKueRol closes)
Diese Bedingung ist Nachts immer erfüllt, trotzdem fährt der Rollladen zeitweise wieder hoch. Und war immer dann, wenn ([eVorhersage:fc1_high_c]>22) neu gelesen wird. Da diese Bedingung hier nicht erfüllt ist wird (set aKueRol opens) ausgeführt.
Ist das ein Bug oder mein Fehler. Warum wird die DOIF-Abfrage übersprungen?
Wenn [eDaemmerung:twilight_weather] wieder gelesen wird fährt er auch wieder runter, selbst wenn sich der Wert nicht geändert hat. (=0)

ja, nach deiner Definition kann das passieren: nämlich, wenn  ein Ereignis von eVorhersage kommt und die zweite Bedingung erfüllt ist. Die erste wird laut Doku nur dann überprüft, wenn auch ein Ereignis dazu stattfindet, bei dir also nur eDaemmerung. eVorhersage kommt in der ersten Bedingung nicht vor, daher wird sie nicht überprüft.

Du hast mehrere Möglichkeiten das zu regeln. Entweder du nimmst eVorhersage in der ersten Bedingung mit auf oder grenzt die zweite Bedingung ein (nur nach Sonnenaufgang) z. B.:

define pRolDif DOIF (([eDaemmerung:twilight_weather]<40) or [22:00-05:30]) (set aKueRol closes)\
DOELSEIF (([eDaemmerung:azimuth]<180) and (eDaemmerung:twilight_weather]>=40) and ([eVorhersage:fc1_high_c]>22) and [08:00-22:00]) (set aKueRol position 40 0)\
DOELSE (set aKueRol opens)


Gruß

Damian


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FHEM_Alex_Pi

Danke für die Erklärung. Welche Doku meinst Du: http://fhem.de/commandref_DE.html#DOIF ?

ZitatDie Angaben werden immer von links nach rechts abgearbeitet. Es wird immer nur ein Kommando ausgeführt, und zwar das erste, für das die dazugehörige Bedingung in der abgearbeiteten Reihenfolge wahr ist.

Jedenfalls weiß ich das jetzt und habe eine Lösung für mein Problem. Ich mache derzeit meine ersten Erfahrungen der fhem.

Schönen Sonntag noch,

Alexander

Damian

#5
Ich sehe gerade, dass gerade dein DOELSE-Fall Probleme bereiten wird. Nämlich immer dann, wenn eDaemmerung- bzw. eVorhersage-Ereignis kommt und die dazugehörigen Bedingungen nicht wahr sind. Es bietet sich immer an, je mehr Abfragen man definiert, statt eines DOELSE-Falls einen DELESEIF zu nehmen, bei dem man genau definiert, wann was passieren soll. Bei dir z. B.:

...
DOELSEIF (([eDaemmerung:twilight_weather]>=40) and [05:00-22:00]) (set aKueRol opens)



Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Zitat von: FHEM_Alex_Pi am 21 September 2014, 10:47:57
Danke für die Erklärung. Welche Doku meinst Du: http://fhem.de/commandref_DE.html#DOIF ?
ja, insbesondere den Absatz:

"Die Angaben werden immer von links nach rechts abgearbeitet. Es wird immer nur ein Kommando ausgeführt, und zwar das erste, für das die dazugehörige Bedingung in der abgearbeiteten Reihenfolge wahr ist. Hinzu kommt, dass nur die Bedingungen überprüft werden, die zum ausgelösten Event auch ein Device beinhalten (Angaben in eckigen Klammern)."

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF