FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: stgeran am 05 September 2017, 13:26:20

Titel: DOIF in "Etappen"
Beitrag von: stgeran am 05 September 2017, 13:26:20
Wenn ich ein DOIF habe mit einer Bedingung, die einen zweistufigen Schalter betätigt, kann ich das in einem DOIF schreiben? Oder ist es besser ein zweites DOIF zu nehmen?
z.B. DOIF  Ventilator Feuchte über 50% set Schalter1 on; Feuchte über 70% set Schalter2 on DOELSE Feuchte unter 50% set Schalter1 und Schalter2 off.
Ich habe es nicht als code geschrieben, es soll nur ein Beispiel sein.
Titel: Antw:DOIF in "Etappen"
Beitrag von: CoolTux am 05 September 2017, 13:44:14
kann man alles in einem DOIF schreiben. Das geht ja noch von der Größe/Übersicht her.
Titel: Antw:DOIF in "Etappen"
Beitrag von: Otto123 am 05 September 2017, 13:47:44
Hi,

ist wie immer sicher auch Geschmacksache. Du hast ja nicht eine Bedingung, so wie Du schreibst hast Du drei!
Du solltest die Bedingungen klar definieren und dann sind getrennte DOELSEIF Zweige kein Problem. Keinen Fall unberücksichtigt lassen!

Feuchte > 50 and Feuchte <= 70 
Feuchte > 70

Gruß Otto
Titel: Antw:DOIF in "Etappen"
Beitrag von: stgeran am 06 September 2017, 17:57:37
Hier mein Versuch mit "richtigen" Definitionen
([HM_Wand_Weather:humidity] > 60 and [HM_Wand_Weather:humidity] <= 70)(set Vent_Bad_Sw_01 on) DOELSE (set Vent_Bad_Sw_01 off)
([HM_Wand_Weather:humidity] >70)(set Vent_Bad_Sw_01, Vent_Bad_Sw_02 on) DOELSE (set Vent_Bad_Sw_01, Vent_Bad_Sw_02 off)

Würde es reichen, im zweiten DOIF nur Sw_02 einzuschalten? Ich brauche > 70% Sw_01 und Sw_02; bei < 70% nur Sw_01; und unter 60% sollen beide ausgehen.
Titel: Antw:DOIF in "Etappen"
Beitrag von: Otto123 am 06 September 2017, 18:13:07
Hallo,
"richtige" Definitionen wären die Kopie der Raw Defintion oder ein list. Nur die DEF kopieren ist für mich immer ein bisschen halbherzig.  ;)

Kommas haben in DOIF einen spezielle Bedeutung -> Du musst sie extra klammern  :-[ :-X :'(

Ich würde so denken?
define di_Feuchte DOIF ([HM_Wand_Weather:humidity] > 60 and [HM_Wand_Weather:humidity] <= 70)(set Vent_Bad_Sw_01 on)\
DOELSEIF ([HM_Wand_Weather:humidity] >70)((set Vent_Bad_Sw_01,Vent_Bad_Sw_02 on))\
DOELSE ((set Vent_Bad_Sw_01,Vent_Bad_Sw_02 off))


Wenn es nur die beiden Schalter mit dem namen gibt kannst Du auch so schreiben: (set Vent_Bad_Sw_0. off)

Du schickst damit unter Umständen extra Schaltbefehle obwohl der Schaltzustand schon stimmt, kann man mit einem FILTER noch verhindern.

Gruß Otto
Titel: Antw:DOIF in "Etappen"
Beitrag von: stgeran am 06 September 2017, 18:26:58
Prima, Danke. Der "\" ist zum Zeilenumbruch, ist das korrekt? Wegen der Übersicht?
Titel: Antw:DOIF in "Etappen"
Beitrag von: stgeran am 06 September 2017, 18:37:28
Das ist jetzt das "list Luft_Bad"
Internals:
   CFGFN
   DEF        ([HM_Wand_Weather > 60 and [HM_Wand_Weather <= 70)(set Vent_Bad_Sw_01 on)
DOELSEIF ([HM_Wand_Weather >70)((set Vent_Bad_Sw_01, Vent_Bad_Sw_02 on))
DOELSE ((set Vent_Bad_Sw_01, Vent_Bad_Sw_02 off))
   NAME       Luft_Bad
   NR         435
   NTFY_ORDER 50-Luft_Bad
   STATE      cmd_3
   TYPE       DOIF
   READINGS:
     2017-09-06 18   Device          HM_Wand_Weather
     2017-09-06 18   cmd             3
     2017-09-06 18   cmd_event       HM_Wand_Weather
     2017-09-06 18   cmd_nr          3
     2017-09-06 18   e_HM_Wand_Weather_humidity 53
     2017-09-06 18   error           set Vent_Bad_Sw_01, Vent_Bad_Sw_02 off: Unknown argument Vent_Bad_Sw_02, choose one of clear getConfig getRegRaw inhibit off on-for-timer on-till on peerBulk peerIODev press pressS pressL regBulk regSet sign statusRequest toggle
     2017-09-06 18   state           cmd_3
   condition:
     0          ReadingValDoIf($hash,'HM_Wand_Weather','humidity') > 60 and ReadingValDoIf($hash,'HM_Wand_Weather','humidity') <= 70
     1          ReadingValDoIf($hash,'HM_Wand_Weather','humidity') >70
   devices:
     0           HM_Wand_Weather
     1           HM_Wand_Weather
     all         HM_Wand_Weather
   do:
     0:
       0          set Vent_Bad_Sw_01 on
     1:
       0          (set Vent_Bad_Sw_01, Vent_Bad_Sw_02 on)
     2:
       0          (set Vent_Bad_Sw_01, Vent_Bad_Sw_02 off)
   helper:
     event      humidity: 53,T: 26.3 H: 53 D: 16.0,temperature: 26.3,dewpoint: 16.0
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   HM_Wand_Weather
     timerevent humidity: 53,T: 26.3 H: 53 D: 16.0,temperature: 26.3,dewpoint: 16.0
     triggerDev HM_Wand_Weather
     timerevents:
       humidity: 53
       T: 26.3 H: 53 D: 16.0
       temperature: 26.3
       dewpoint: 16.0
     timereventsState:
       humidity: 53
       T: 26.3 H: 53 D: 16.0
       temperature: 26.3
       dewpoint: 16.0
     triggerEvents:
       humidity: 53
       T: 26.3 H: 53 D: 16.0
       temperature: 26.3
       dewpoint: 16.0
     triggerEventsState:
       humidity: 53
       T: 26.3 H: 53 D: 16.0
       temperature: 26.3
       dewpoint: 16.0
   internals:
   itimer:
   readings:
     0           HM_Wand_Weather
     1           HM_Wand_Weather
     all         HM_Wand_Weather
   regexp:
     0:
     1:
     all:
   state:
     STATE:
   trigger:
Attributes:
   room       Bad
   wait       1200

Es zickt aber rum
error

set Vent_Bad_Sw_01, Vent_Bad_Sw_02 off: Unknown argument Vent_Bad_Sw_02, choose one of clear:readings,trigger,register,oldRegs,rssi,msgEvents,attack,all getConfig:noArg getRegRaw inhibit:on,off off:noArg on-for-timer on-till on:noArg peerBulk peerIODev press pressS:HM_Wand_SwitchTr pressL:HM_Wand_SwitchTr regBulk regSet sign:on,off statusRequest:noArg toggle:noArg
Titel: Antw:DOIF in "Etappen"
Beitrag von: stgeran am 06 September 2017, 18:45:07
Sorry für den Wind.
Der Sw_02 war noch nicht mit dem ...Weather gepeert :-(((
Titel: Antw:DOIF in "Etappen"
Beitrag von: stgeran am 06 September 2017, 18:55:11
Ah, Sch.... ich krieg den verdammten error nicht weg!
Titel: Antw:DOIF in "Etappen"
Beitrag von: Damian am 06 September 2017, 19:17:37
Zitat von: stgeran am 06 September 2017, 18:55:11
Ah, Sch.... ich krieg den verdammten error nicht weg!

Korrekte Schreibweise:

ohne Leerzeichen:

((set Vent_Bad_Sw_01,Vent_Bad_Sw_02 on))

oder

hier ist das Leerzeichen egal:

(set Vent_Bad_Sw_01 on, set Vent_Bad_Sw_02 on)
Titel: Antw:DOIF in "Etappen"
Beitrag von: stgeran am 06 September 2017, 19:31:51
Das sieht schon besser aus :-)
Titel: Antw:DOIF in "Etappen"
Beitrag von: Otto123 am 06 September 2017, 21:07:25
Zitat von: stgeran am 06 September 2017, 18:26:58
Prima, Danke. Der "\" ist zum Zeilenumbruch, ist das korrekt? Wegen der Übersicht?
So ist es. Dann ist die Zeile nicht so lang.
In der Raw Def geht das so per cut & paste

Aber nimm doch set Vent_Bad_Sw_0. on - dann hast Du den Kuddel Muddel mit den Kommas nicht.
Titel: Antw:DOIF in "Etappen"
Beitrag von: Per am 07 September 2017, 08:40:42
Zitat von: stgeran am 06 September 2017, 17:57:37Würde es reichen, im zweiten DOIF nur Sw_02 einzuschalten?
Jein. Wenn dein Fhem garantiert 24/7 läuft, ja. Ansonsten würde ich einfach auf Nummer sicher gehen. Kostet ja nix.
Titel: Antw:DOIF in "Etappen"
Beitrag von: stgeran am 07 September 2017, 11:23:17
Ich habs mit Ottos Vorschlag gemacht. Danke euch für die Hilfe :-)