Hauptmenü

DOIF Taster zum umschalten

Begonnen von Dersch, 26 Dezember 2018, 18:11:48

Vorheriges Thema - Nächstes Thema

Dersch

Die Taster sind PullUp mit 10 kOhm ausgeführt und zusätzlich noch Kerkos 100nf als Entstörfilter verbaut. Leitungen sind cat5e einseitig geerdert und etwa 50cm lang. Die Taster triggern Hardwareseitig korrekt ohne Fehltriggerung.

Die Relais selbst:
Internals:
   DEF        MCP23017:PortA7
   DEVICE     MCP23017
   NAME       GarageTorHoch
   NOTIFYDEV  MCP23017,global
   NR         38
   NTFY_ORDER 50-GarageTorHoch
   READING    PortA7
   STATE      off
   TYPE       readingsProxy
   CONTENT:
     MCP23017   1
   READINGS:
     2018-12-27 13:24:37   lastCmd         off
     2018-12-27 13:24:37   state           off
Attributes:
   group      MCP23017 Outputs
   room       GPIO-Devices
   setFn      {($CMD eq "on")?"PortA7 off":"PortA7 on"}
   setList    on off
   valueFn    {($VALUE eq "on")?"off":"on"}


Internals:
   DEF        MCP23017:PortA6
   DEVICE     MCP23017
   NAME       GarageTorRunter
   NOTIFYDEV  MCP23017,global
   NR         37
   NTFY_ORDER 50-GarageTorRunter
   READING    PortA6
   STATE      off
   TYPE       readingsProxy
   CONTENT:
     MCP23017   1
   READINGS:
     2018-12-27 13:33:11   lastCmd         off
     2018-12-27 13:33:11   state           off
Attributes:
   group      MCP23017 Outputs
   room       GPIO-Devices
   setFn      {($CMD eq "on")?"PortA6 off":"PortA6 on"}
   setList    on off
   valueFn    {($VALUE eq "on")?"off":"on"}


Vom MCP23017 gehe ich auf "kleine Relais" mit einer Steuerspannung von 24v womit ich "große Relais" für die 230v steuere.

Zur Ansteuerung der Tor Relais habe ich mir ein doif Device gebaut:
Internals:
   DEF        (["$SELF:Tor: Runter"]) (set GarageTorRunter on-for-timer 30)
DOELSEIF
(["$SELF:Tor: Hoch"]) (set GarageTorHoch on-for-timer 32)
   MODEL      FHEM
   NAME       doifGarageTor
   NR         49
   NTFY_ORDER 50-doifGarageTor
   STATE      Runter
   TYPE       DOIF
   READINGS:
     2018-12-27 13:32:40   Device          doifGarageTor
     2018-12-27 13:32:40   Tor             Runter
     2018-12-27 13:32:41   cmd             1
     2018-12-27 13:32:41   cmd_event       doifGarageTor
     2018-12-27 13:32:41   cmd_nr          1
     2018-12-26 13:45:11   last_cmd        Runter
     2018-12-26 13:47:24   mode            enabled
     2018-12-27 13:32:41   state           Runter
   Regex:
     cond:
       :
         0:
           "doifGarageTor:Tor: Runter" doifGarageTor:Tor: Runter
         1:
           "doifGarageTor:Tor: Hoch" doifGarageTor:Tor: Hoch
   attr:
     cmdState:
       0:
         Runter
       1:
         Hoch
     wait:
     waitdel:
   condition:
     0          ::EventDoIf('doifGarageTor',$hash,'Tor: Runter',0)
     1          ::EventDoIf('doifGarageTor',$hash,'Tor: Hoch',0)
   devices:
   do:
     0:
       0          set GarageTorRunter on-for-timer 30
     1:
       0          set GarageTorHoch on-for-timer 32
     2:
   helper:
     event      Tor: Runter
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   doifGarageTor
     timerevent Tor: Runter
     triggerDev doifGarageTor
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: doifGarageTor
       state: Runter
     timerevents:
       Tor: Runter
       Device: doifGarageTor
       cmd_nr: 1
       cmd: 1
       cmd_event: doifGarageTor
       Runter
     timereventsState:
       Tor: Runter
       Device: doifGarageTor
       cmd_nr: 1
       cmd: 1
       cmd_event: doifGarageTor
       Runter
     triggerEvents:
       Tor: Runter
       Device: doifGarageTor
       cmd_nr: 1
       cmd: 1
       cmd_event: doifGarageTor
       Runter
     triggerEventsState:
       Tor: Runter
       Device: doifGarageTor
       cmd_nr: 1
       cmd: 1
       cmd_event: doifGarageTor
       Runter
   internals:
   itimer:
   perlblock:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   cmdState   Runter|Hoch
   devStateIcon Runter:fts_garage_door_100@green Hoch:fts_garage_door_10@red
   do         always
   readingList Tor
   room       DOIFs
   setList    Tor:Runter,Hoch
   webCmd     Hoch:Runter


Dieses Device verwende ich um von mehreren Wegen das Tor steuern zu können und immer den letzten Zustand zu kennen egal mit was ich es getriggert habe.
Dazu kommt noch ein Reed Kontakt um den Zustand zu genau zu kennen.

Internals:
   DEF        23
   EXCEPT_FD  11
   GPIO_Basedir /sys/class/gpio
   GPIO_Nr    23
   NAME       GarageTorReed
   NR         40
   STATE      on
   TYPE       RPI_GPIO
   WiringPi_gpio /usr/local/bin/gpio
   lasttrg    1545913987.8867
   READINGS:
     2018-12-27 13:33:07   Dblclick        on
     2018-12-27 13:33:08   Longpress       on
     2018-12-27 13:33:07   Pinlevel        high
     2018-12-27 13:33:07   state           on
   fhem:
     interfaces switch
Attributes:
   active_low yes
   direction  input
   interrupt  both
   room       GPIO-Devices


Hier die Taster selbst:

Internals:
   DEF        5
   EXCEPT_FD  14
   GPIO_Basedir /sys/class/gpio
   GPIO_Nr    5
   NAME       GarageTasterTorRunter
   NR         47
   STATE      off
   TYPE       RPI_GPIO
   WiringPi_gpio /usr/local/bin/gpio
   lasttrg    1545913425.3458
   READINGS:
     2018-12-27 13:23:45   Dblclick        off
     2018-12-27 13:23:45   Longpress       off
     2018-12-27 13:23:45   Pinlevel        low
     2018-12-27 13:23:45   state           off
   fhem:
     interfaces switch
Attributes:
   active_low yes
   direction  input
   interrupt  both
   room       GPIO-Devices


Internals:
   DEF        17
   EXCEPT_FD  13
   GPIO_Basedir /sys/class/gpio
   GPIO_Nr    17
   NAME       GarageTasterTorHoch
   NR         46
   STATE      off
   TYPE       RPI_GPIO
   WiringPi_gpio /usr/local/bin/gpio
   lasttrg    1545913477.3926
   READINGS:
     2018-12-27 13:24:37   Dblclick        off
     2018-12-27 13:24:37   Longpress       off
     2018-12-27 13:24:37   Pinlevel        low
     2018-12-27 13:24:37   state           off
   fhem:
     interfaces switch
Attributes:
   active_low yes
   direction  input
   interrupt  both
   room       GPIO-Devices


Hier ist das DOIF womit ich das Tor von aussen mittels 1 Wire öffne:

Internals:
   DEF        ([?GarageTorReed] eq "on" and [doifGarageTor:Tor] eq "Runter" and [DirkTag:present] eq "1" or [DanniTag:present] eq "1" or [KlausTag:present] eq "1") (setreading doifGarageTor Tor Hoch)
DOELSEIF
([doifGarageTor:Tor] eq "Hoch" and [DirkTag:present] eq "1" or [DanniTag:present] eq "1" or [KlausTag:present] eq "1") (setreading doifGarageTor Tor Runter)
   MODEL      FHEM
   NAME       doifGarageTorTag
   NR         56
   NTFY_ORDER 50-doifGarageTorTag
   STATE      cmd_2
   TYPE       DOIF
   READINGS:
     2018-12-27 15:03:29   Device          DanniTag
     2018-12-27 13:32:41   cmd             2
     2018-12-27 13:32:41   cmd_event       DirkTag
     2018-12-27 13:32:41   cmd_nr          2
     2018-12-27 15:03:29   e_DanniTag_present 0
     2018-12-27 15:03:29   e_DirkTag_present 0
     2018-12-27 15:03:28   e_KlausTag_present 0
     2018-12-27 13:24:22   e_doifGarageTor_Tor Hoch
     2018-12-24 13:56:16   mode            enabled
     2018-12-27 13:32:41   state           cmd_2
   Regex:
   attr:
     cmdState:
     cmdpause:
       0
       10
     wait:
     waitdel:
   condition:
     0          ::InternalDoIf($hash,'GarageTorReed','STATE') eq "on" and ::ReadingValDoIf($hash,'doifGarageTor','Tor') eq "Runter" and ::ReadingValDoIf($hash,'DirkTag','present') eq "1" or ::ReadingValDoIf($hash,'DanniTag','present') eq "1" or ::ReadingValDoIf($hash,'KlausTag','present') eq "1"
     1          ::ReadingValDoIf($hash,'doifGarageTor','Tor') eq "Hoch" and ::ReadingValDoIf($hash,'DirkTag','present') eq "1" or ::ReadingValDoIf($hash,'DanniTag','present') eq "1" or ::ReadingValDoIf($hash,'KlausTag','present') eq "1"
   devices:
     0           doifGarageTor DirkTag DanniTag KlausTag
     1           doifGarageTor DirkTag DanniTag KlausTag
     all         doifGarageTor DirkTag DanniTag KlausTag
   do:
     0:
       0          setreading doifGarageTor Tor Hoch
     1:
       0          setreading doifGarageTor Tor Runter
     2:
   helper:
     event      present: 0,location: absent
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   DirkTag
     timerevent id: 82XX,present: 1,location: bus.0
     triggerDev DanniTag
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: DirkTag
       state: cmd_2
     timerevents:
       id: 82XX
       present: 1
       location: bus.0
     timereventsState:
       id: 82XX
       present: 1
       location: bus.0
     triggerEvents:
       present: 0
       location: absent
     triggerEventsState:
       present: 0
       location: absent
   internals:
     0           GarageTorReed:STATE
     all         GarageTorReed:STATE
   itimer:
   perlblock:
   readings:
     0           doifGarageTor:Tor DirkTag:present DanniTag:present KlausTag:present
     1           doifGarageTor:Tor DirkTag:present DanniTag:present KlausTag:present
     all         doifGarageTor:Tor DirkTag:present DanniTag:present KlausTag:present
   trigger:
   uiState:
   uiTable:
Attributes:
   cmdpause   0:10
   do         always
   room       DOIFs



Und hier der letzte Stand der Taster. Mit den Tastern möchte ich von Innen manuell das Tor hoch und runter fahren können. Es ist eine Garagen Werkstatt und nicht für ein Auto ;)

Internals:
   DEF        ([GarageTasterTorHoch:"on"] and $cmd=~"0|2") (setreading doifGarageTor Tor Hoch)
DOELSEIF
([GarageTasterTorHoch:"on"] and $cmd==1) (set GarageTorHoch off)

   MODEL      FHEM
   NAME       doifGarageTorTasterHoch
   NR         57
   NTFY_ORDER 50-doifGarageTorTasterHoch
   STATE      cmd_2
   TYPE       DOIF
   READINGS:
     2018-12-27 13:24:37   Device          GarageTasterTorHoch
     2018-12-27 13:24:37   cmd             2
     2018-12-27 13:24:37   cmd_event       GarageTasterTorHoch
     2018-12-27 13:24:37   cmd_nr          2
     2018-12-27 13:24:37   e_GarageTasterTorHoch_events Pinlevel: low,off,Longpress: off
     2018-12-27 12:06:11   mode            enabled
     2018-12-27 13:24:37   state           cmd_2
   Regex:
   attr:
     cmdState:
     cmdpause:
       2
       2
     wait:
     waitdel:
   condition:
     0          ::EventDoIf('GarageTasterTorHoch',$hash,'on',1) and $cmd=~"0|2"
     1          ::EventDoIf('GarageTasterTorHoch',$hash,'on',1) and $cmd==1
   devices:
     0           GarageTasterTorHoch
     1           GarageTasterTorHoch
     all         GarageTasterTorHoch
   do:
     0:
       0          setreading doifGarageTor Tor Hoch
     1:
       0          set GarageTorHoch off
     2:
   helper:
     event      Longpress: off
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   GarageTasterTorHoch
     timerevent Longpress: off
     triggerDev GarageTasterTorHoch
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: GarageTasterTorHoch
       state: cmd_2
     timerevents:
       Pinlevel: low
       off
       Longpress: off
     timereventsState:
       Pinlevel: low
       state: off
       Longpress: off
     triggerEvents:
       Pinlevel: low
       off
       Longpress: off
     triggerEventsState:
       Pinlevel: low
       state: off
       Longpress: off
   internals:
   itimer:
   readings:
   trigger:
     all         GarageTasterTorHoch
   uiState:
   uiTable:
Attributes:
   cmdpause   2:2
   room       DOIFs


Internals:
   DEF        ([GarageTasterTorRunter:"on"] and $cmd=~"0|2") (setreading doifGarageTor Tor Runter)
DOELSEIF
([GarageTasterTorRunter:"on"] and $cmd==1) (set GarageTorRunter off)

   MODEL      FHEM
   NAME       doifGarageTorTasterRunter
   NR         58
   NTFY_ORDER 50-doifGarageTorTasterRunter
   STATE      cmd_2
   TYPE       DOIF
   READINGS:
     2018-12-27 13:23:45   Device          GarageTasterTorRunter
     2018-12-27 13:23:45   cmd             2
     2018-12-27 13:23:45   cmd_event       GarageTasterTorRunter
     2018-12-27 13:23:45   cmd_nr          2
     2018-12-27 13:23:45   e_GarageTasterTorRunter_events Pinlevel: low,off,Longpress: off
     2018-12-27 12:06:24   mode            enabled
     2018-12-27 13:23:45   state           cmd_2
   Regex:
   attr:
     cmdState:
     cmdpause:
       2
       2
     wait:
     waitdel:
   condition:
     0          ::EventDoIf('GarageTasterTorRunter',$hash,'on',1) and $cmd=~"0|2"
     1          ::EventDoIf('GarageTasterTorRunter',$hash,'on',1) and $cmd==1
   devices:
     0           GarageTasterTorRunter
     1           GarageTasterTorRunter
     all         GarageTasterTorRunter
   do:
     0:
       0          setreading doifGarageTor Tor Runter
     1:
       0          set GarageTorRunter off
     2:
   helper:
     event      Longpress: off
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   GarageTasterTorRunter
     timerevent Longpress: off
     triggerDev GarageTasterTorRunter
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: GarageTasterTorRunter
       state: cmd_2
     timerevents:
       Pinlevel: low
       off
       Longpress: off
     timereventsState:
       Pinlevel: low
       state: off
       Longpress: off
     triggerEvents:
       Pinlevel: low
       off
       Longpress: off
     triggerEventsState:
       Pinlevel: low
       state: off
       Longpress: off
   internals:
   itimer:
   readings:
   trigger:
     all         GarageTasterTorRunter
   uiState:
   uiTable:
Attributes:
   cmdpause   2:2
   room       DOIFs



An sich klappt das mit dem öffnen von außen mittels 1 Wire zuverlässig (auch wenn es sich "hingebastelt" anfühlt von der Softwareseite her). Auch kann man ja via Web oder App das Device triggern. Der Zustand ist dann bekannt. Die Tastertriggerung funktioniert ja nun auch grundsätzlich wenn da nicht die Fehltriggerung der beiden DOIF's wäre, die ich nun aber überhaupt nicht verstehe.... Ich schiebe es auf meine fehlerhafte Programmabfolge.

Du gehst in die Garage von außen mittels 1Wire geöffnet (DS2401), die Relais sind ausgeschaltet, drückst auf den Taster für Runter und das Tor fährt. Drückst wieder auf Runter das Tor hält an (Relais wird ja dann direkt geschaltet, das Device doifGarageTor steht auf Runter) das doifGarageTasterTorRunter steht auf cmd2.

Alles gut.

Du drückst nun auf den Taster für Tor Hoch. Das Tor fährt. Dann aber springt das doifGarageTasterTorRunter auf cmd1 was ja eigentlich auf cmd2 stehen bleiben muss. Das Triggert natürlich doifGarageTor:Tor Runter. Nun sind beide an (Da die beiden 230v Relais elektrisch gegeneinander gesperrt sind entsteht kein Kurzer.)

Also stellt sich mir nur die Frage warum springt das doifGarageTasterTorRunter auf cmd1? Es wurde nicht getriggert... Zumindest nicht von der Hardware her.


Frank_Huber

Oben im list steht es auf cmd_2.
Könntest du den list im Fehlerfall ziehen bitte?

@Ellert, was meinst du zu der $cmd Auswertung?
Ich kenne / nutze das nur mit $SELF.

Gesendet von meinem Doogee S60 mit Tapatalk


Ellert

$cmd entspricht [$SELF:cmd], funktioniert auch, beim Match muss man aber aufpassen, wenn wait im Spiel ist und es Zwischenzustände gibt $cmd =~ "0|2" matcht wenn cmd  gleich 2, 2.1, 2.2, 1.2, 3.2 usw. ist

Ellert

Zitat von: Dersch am 27 Dezember 2018, 15:19:43
Also stellt sich mir nur die Frage warum springt das doifGarageTasterTorRunter auf cmd1? Es wurde nicht getriggert... Zumindest nicht von der Hardware her.
Schau Dir die Events im Eventmonitor und poste sie, daraus sollte man erkennen was genau das DOIF triggert.

Grundsätzlich triggert z.B. [GarageTasterTorRunter:"on"] auf alle Events von GarageTasterTorRunter die on enthalten, wenn nur auf state : on getriggert werden soll, dann muss beschränkt werden [GarageTasterTorRunter:"^on$"] oder bei gesetztem addStateEvent dann [GarageTasterTorRunter:"^state: on$"]

Dersch

Ich habe nun [GarageTasterTorRunter:"^on$"] verwendet und mehrfach das Verhalten getestet. Das Fehlverhalten ist nicht mehr aufgetreten! Es funktioniert einfach  :D