[Gelöst] Wo ist der Fehler, DOIF schaltet unerwünschten Zweig?

Begonnen von cwagner, 21 April 2019, 11:14:53

Vorheriges Thema - Nächstes Thema

cwagner

Die Osterfeuer haben es bewiesen: ich habe leider einen Wurm in meinem Lüftungs-DOIF, den ich nicht finde. Eigentlich dachte ich, verstanden zu haben, dass DOIF bei der ersten Bedingung "einrastet", die zutrifft und dann erst wieder den Zustand wechselt, wenn diese Bedingung nicht mehr zutrifft.
Die Bedingungen meines DOIFs sind eigentlich simpel: Es gibt einen Dummy, der die Zustände min, max, AUS und auto kennt.
Und nun meine ich programmiert zu haben:
Wenn Dummy Lueftung max, dann gibt Gas
Wenn Lueftung AUS (oder abwesend an) dann gehe auf 0
Wenn Lueftung MIN ... dann stelle Lueftung auf 55
Die beiden AUTO-Zweige funktionieren gut im Alltag.

Reproduzierbar springt das DOIF aber bei Dummy eq "AUS" mit dem ersten Signal vom CO2-Sensor auf die dritte Bedingung und regelt also "MINimum".

Warum? Welches Osterei habe ich mir da in meiner Lüftungssteuerung gelegt?


Danke für hilfreichen Erfahrungsaustausch im Voraus!

Christian


Das Listing:Internals:
   DEF        ([Lueftung] eq "max") (set Steller_Zuluft gpio 255) (set Steller_Abluft gpio 255)
DOELSEIF ([abwesend] eq "an" or [Lueftung] eq "AUS") (set Steller_Zuluft gpio 0) (set Steller_Abluft gpio 0)
DOELSEIF ([Lueftung] eq "min" or [CO2Sensor:CO2:d]<700) (set Steller_Zuluft gpio 55) (set Steller_Abluft gpio 55) ##LWR 0,8/h
DOELSEIF ([?Lueftung] eq "auto" and [CO2Sensor:CO2:d]>([$SELF:CO2_alt]+10) and [Steller_Zuluft:gpio:d]<246) (setreading $SELF CO2_alt [$SELF:sCO2],setreading $SELF Stell_neu {(sprintf "%.0f", ([Steller_Zuluft:gpio:d]+10))}) (set Steller_Zuluft gpio [$SELF:Stell_neu:d]) (set Steller_Abluft gpio [$SELF:Stell_neu:d]) ## Vereinfachung möglich mit dirkten Einstetzen von Stellwert-Zuluft als Steuerwert bei Abluft
DOELSEIF ([?Lueftung] eq "auto" and [CO2Sensor:CO2:d]<([$SELF:CO2_alt]-10) and [Steller_Zuluft:gpio:d]>64) (setreading $SELF CO2_alt [$SELF:sCO2],setreading $SELF Stell_neu {(sprintf "%.0f", ([Steller_Zuluft:gpio:d]-10))}) (set Steller_Zuluft gpio [$SELF:Stell_neu:d]) (set Steller_Abluft gpio [$SELF:Stell_neu:d])
   FUUID      5c43298b-f33f-e1df-09ea-ab76a5ff2ccd3b93
   MODEL      FHEM
   NAME       DI_Lueftung
   NR         110
   NTFY_ORDER 50-DI_Lueftung
   STATE      Betrieb
   TYPE       DOIF
   VERSION    18890 2019-03-13 18:56:41
   .attraggr:
   .attrminint:
   CHANGED:
     sCO2: 870
   CHANGEDWITHSTATE:
     sCO2: 870
   DOIF_Readings:
     sCO2       (::ReadingValDoIf($hash,'CO2Sensor','CO2','','med3'))
   READINGS:
     2019-04-20 23:59:30   CO2_alt         810
     2019-04-21 10:54:48   Device          CO2Sensor
     2019-04-19 10:36:22   Stell_neu       65
     2019-04-21 10:25:03   cmd             3.2
     2019-04-21 10:25:03   cmd_event       CO2Sensor
     2019-04-21 10:25:03   cmd_nr          3
     2019-04-21 10:25:03   cmd_seqnr       2
     2019-04-21 10:54:48   e_CO2Sensor_CO2 888
     2019-04-16 23:59:30   e_DI_Lueftung_CO2_alt 749
     2019-04-21 10:19:57   e_Lueftung_STATE AUS
     2019-03-31 19:49:08   mode            enabled
     2019-04-21 10:54:48   sCO2            870
     2019-04-21 10:25:03   state           Betrieb
     2019-04-21 10:25:03   wait_timer      no timer
   Regex:
     DOIF_Readings:
       CO2Sensor:
         sCO2:
           CO2        ^CO2Sensor$:^CO2:
       DI_Lueftung:
     accu:
       CO2Sensor:
         accu:
           CO2        ^CO2Sensor$:^CO2:
   accu:
     CO2Sensor CO2:
       dim        3
       value:
         860
         870
         888
   attr:
     cmdState:
     repeatsame:
     wait:
       0:
         0
         15
       1:
         0
         15
       2:
         0
         15
       3:
         0
         15
         15
         15
       4:
         0
         15
         15
         15
     waitdel:
   condition:
     0          ::InternalDoIf($hash,'Lueftung','STATE') eq "max"
     1          ::InternalDoIf($hash,'abwesend','STATE') eq "an" or ::InternalDoIf($hash,'Lueftung','STATE') eq "AUS"
     2          ::InternalDoIf($hash,'Lueftung','STATE') eq "min" or ::ReadingValDoIf($hash,'CO2Sensor','CO2','','d')<700
     3          ::InternalDoIf($hash,'Lueftung','STATE') eq "auto" and ::ReadingValDoIf($hash,'CO2Sensor','CO2','','d')>(::ReadingValDoIf($hash,'DI_Lueftung','CO2_alt')+10) and ::ReadingValDoIf($hash,'Steller_Zuluft','gpio','','d')<246
     4          ::InternalDoIf($hash,'Lueftung','STATE') eq "auto" and ::ReadingValDoIf($hash,'CO2Sensor','CO2','','d')<(::ReadingValDoIf($hash,'DI_Lueftung','CO2_alt')-10) and ::ReadingValDoIf($hash,'Steller_Zuluft','gpio','','d')>64
   devices:
     0           Lueftung
     1           abwesend Lueftung
     2           Lueftung CO2Sensor
     3           CO2Sensor DI_Lueftung Steller_Zuluft
     4           CO2Sensor DI_Lueftung Steller_Zuluft
     all         Lueftung abwesend CO2Sensor DI_Lueftung Steller_Zuluft
   do:
     0:
       0          set Steller_Zuluft gpio 255
       1          set Steller_Abluft gpio 255
     1:
       0          set Steller_Zuluft gpio 0
       1          set Steller_Abluft gpio 0
     2:
       0          set Steller_Zuluft gpio 55
       1          set Steller_Abluft gpio 55
     3:
       0          setreading DI_Lueftung CO2_alt [DI_Lueftung:sCO2],setreading DI_Lueftung Stell_neu {(sprintf "%.0f", ([Steller_Zuluft:gpio:d]+10))}
       1          set Steller_Zuluft gpio [DI_Lueftung:Stell_neu:d]
       2          set Steller_Abluft gpio [DI_Lueftung:Stell_neu:d]
     4:
       0          setreading DI_Lueftung CO2_alt [DI_Lueftung:sCO2],setreading DI_Lueftung Stell_neu {(sprintf "%.0f", ([Steller_Zuluft:gpio:d]-10))}
       1          set Steller_Zuluft gpio [DI_Lueftung:Stell_neu:d]
       2          set Steller_Abluft gpio [DI_Lueftung:Stell_neu:d]
     5:
   helper:
     DOIF_Readings_events
     event      sCO2: 870
     globalinit 1
     last_timer 0
     sleepdevice CO2Sensor
     sleepsubtimer -1
     sleeptimer -1
     timerdev   CO2Sensor
     timerevent CO2: 626
     triggerDev DI_Lueftung
     DOIF_eventas:
       cmd_nr: 3
       cmd_seqnr: 2
       cmd_event: CO2Sensor
       state: Betrieb
     timerevents:
       CO2: 626
     timereventsState:
       CO2: 626
     triggerEvents:
       sCO2: 870
     triggerEventsState:
       sCO2: 870
   internals:
     0           Lueftung:STATE
     1           abwesend:STATE Lueftung:STATE
     2           Lueftung:STATE
     3           Lueftung:STATE
     4           Lueftung:STATE
     all         Lueftung:STATE abwesend:STATE
   itimer:
   perlblock:
   readings:
     2           CO2Sensor:CO2
     3           CO2Sensor:CO2 DI_Lueftung:CO2_alt Steller_Zuluft:gpio
     4           CO2Sensor:CO2 DI_Lueftung:CO2_alt Steller_Zuluft:gpio
     all         CO2Sensor:CO2 DI_Lueftung:CO2_alt Steller_Zuluft:gpio
   trigger:
   uiState:
   uiTable:
Attributes:
   DOIF_Readings sCO2:([CO2Sensor:CO2:med3])
   DbLogExclude .*
   room       Lueftung
   startup    set $SELF checkall
   state      Betrieb
   verbose    2
   wait       0,15:0,15:0,15:0,15,15,15:0,15,15,15
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Otto123

Hi,

([Lueftung] eq "min" or [CO2Sensor:CO2:d]<700)
Diese Bedingung wird wahr, wenn entweder die Lueftung auf min steht oder der CO2 Wert kleiner als 700 ist.

Der Zustand vom Dummy spielt also bei einem Messwert von CO2 kleiner 700 keine Rolle.
Du willst eigentlich UND and?

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

Damian

Das sollte doch einfach nachzuvollziehen sein.

Deine dritte Bedingung beinhaltet eine or-Verknüpfung.

Wenn Lueftung aus ist und CO2Senso triggert, dann wird nicht die zweite, sondern die dritte Bedingung ausgewertet (weil der Trigger in der zweiten nicht vorkommt), diese ist dann wahr und die Anweisung wird ausgeführt.

Du könntest den Zustand "aus" mit in die Bedingung aufnehmen:

([Lueftung] eq "min" or [CO2Sensor:CO2:d]<700 and [Lueftung] ne "aus")
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cwagner

Hallo Damian,

wie blöd von mir - ganz herzlichen Dank für die schnelle Aufklärung meines Fehlers.

Herzliche Grüße

Christian
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB