Hauptmenü

DOIF Taster zum umschalten

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

Vorheriges Thema - Nächstes Thema

Dersch

Hi und frohe Weihnachten,

ich habe hier ein doif welches auf einen Taster hört und zwischen 2 Zuständen schalten soll. Es soll sein eigener cmd state ausgelesen werden. Allerdings klappt das nicht so wie ich es gedacht hatte.

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

   MODEL      FHEM
   NAME       doifGarageTorTasterHoch
   NR         57
   NTFY_ORDER 50-doifGarageTorTasterHoch
   STATE      initialized
   TYPE       DOIF
   READINGS:
     2018-12-26 16:36:49   cmd             0
     2018-12-26 16:36:49   mode            enabled
     2018-12-26 16:36:49   state           initialized
   Regex:
   condition:
     0          ::InternalDoIf($hash,'GarageTasterTorHoch','STATE') eq "on" and $cmd=~"0|2"
     1          ::InternalDoIf($hash,'GarageTasterTorHoch','STATE') eq "on" and $cmd==1
   devices:
     0           GarageTasterTorHoch
     1           GarageTasterTorHoch
     all         GarageTasterTorHoch
   do:
     0:
       0          setreading doifGarageTor Tor Hoch
     1:
       0          set GarageTorHoch off
     2:
   helper:
     globalinit 1
     last_timer 0
     sleeptimer -1
   internals:
     0           GarageTasterTorHoch:STATE
     1           GarageTasterTorHoch:STATE
     all         GarageTasterTorHoch:STATE
   itimer:
   uiState:
   uiTable:
Attributes:
   do         always
   room       DOIFs


Es verhält sich nun so das bei jedem Tastendruck erst cmd1 und dann sofort cmd2 ausgeführt wird. Was ich aber nicht verstehe denn die Bedingung beinhaltet ja den cmd Zustand.

Als Bsp. Habe ich das verwendet https://wiki.fhem.de/wiki/DOIF/Mehrfachnutzung_eines_Tasters

Aber es scheint als würde $cmd  gar nicht beachtet.

Was interpretiere ich falsch?

Frank_Huber

Eq on prüfer den Zustand.
Wenn du den Taster länger drückst als das doif zum schalten benötigt ist das richtig.

Baue um auf event trigger und es wird gehen.


Gesendet von meinem Doogee S60 mit Tapatalk


Ellert

@Dersch
Warum hast Du das zitierte Beispiel mit do always ergänzt?

Dersch

Das würde ja heißen statt [GarageTasterTorHoch] eq "on" einfach [GarageTasterTorHoch] zu schreiben? Aber dann ist das Verhalten identisch.

@ellert: gute Frage,  nur zum ausprobieren. Aber es hat sich rein gar nichts am Verhalten geändert.

Frank_Huber

[GarageTasterTorHoch]:"on"

Du willst ja nur auf on triggern und nicht auf das off beim loslassen.

Gesendet von meinem Doogee S60 mit Tapatalk


Dersch

Aha das ist natürlich logisch. Danke ich probiere aus :)

Dersch

Zitat von: Frank_Huber am 26 Dezember 2018, 19:06:12
[GarageTasterTorHoch]:"on"

Du willst ja nur auf on triggern und nicht auf das off beim loslassen.

Gesendet von meinem Doogee S60 mit Tapatalk

Diese Schreibweise gibt leider einen Syntax Error zurück. Richtig ist es so: [GarageTasterTorHoch:"on"]

Allerdings springt er mir nun immer noch von cmd1 gleich auf cmd2 beim betätigen des Tasters.

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


das $cmd==1 bzw $cmd=~"0|2" wird nicht beachtet. Schreibe ich das irgendwie falsch? Wenn ja ist auch der Wiki Eintrag falsch oder? Denn dort habe ich es ja einfach abgeschrieben?

Gibt es noch einen anderen Weg über das DOIF eigene Reading "cmd" die Bedingung klar zu separieren?

Frank_Huber

Ja, sorry. Schreibfehler meinerseits.

Prellt dein Taster evtl?
Dann kannst es mit dem Attribut cmdpause 2:2 entprellen.

Gesendet von meinem Doogee S60 mit Tapatalk


Dersch

Es sind Pi GPIO's. Habe grade cmdpause 1:1 aber dann geht es unregelmäßig mal gut und mal nicht.

Probiere nun deine vorgeschlagenen 2:2.

Ich lese oft von Taster "prellen". Was genau passiert da? Möchte den Begriff gerne verstehen.

Das mit den $cmd==1 bzw $cmd=~"0|2" ist aber garantiert korrekt? Bin mir da unsicher da ich es noch nie verwendet habe.

Dersch

#9
Also mit 2s cmdpause klappt es gut. Nun kann man zwar nicht sofort wieder den anderen Befehl ausführen aber das muss ja in der Regel auch nicht.

ZitatAls Prellen wird ein mechanisch ausgelöster Störeffekt bei elektromechanischen Schaltern und Tastern bezeichnet: Statt des sofortigen elektrischen Kontaktes ruft die Betätigung des Schalters kurzzeitig ein mehrfaches Schließen und Öffnen des Kontakts hervor. Ursache ist elastisches Zurückprallen gegen die Federung. Wesentlich seltener dagegen kommt es beim Ausschalten der Schalter bzw. Loslassen der Taster nach der ersten Unterbrechung zur wiederholten erneuten Kontaktgabe.

Quelle: https://de.wikipedia.org/wiki/Prellen

Zum Glück habe ich erst vor 2 Wochen meine jährliche Spende an Wikipedia gegeben ;D

Also es sind Bulgin Taster https://bulgin.engelking.de/produkte/schalter-taster/drucktaster/mpi-serie-drucktaster/22mm-einpoliger-punktbeleuchteter-edelstahltaster-ip66-mpi001 und woanders mit dem gleichen Problem sind es handelsübliche BuschJäger Lichttaster welche auf die GPIO's gehen. Ob diese prellen kann ich nun nicht sagen und daher auch nicht ausschließen. Angaben seitens der Hersteller finde ich dazu nicht.

Vielen Dank schon mal für die Hilfe! :D

Frank_Huber

Ja, wenn DU mindestens 1 sec benötigst musst Du 2 sec einstellen.
Hat Damian mir "damals" hier erklärt: https://forum.fhem.de/index.php/topic,86562.msg

Dersch

So richtig rund geht es leider immer noch nicht:

Internals:
   DEF        ([GarageTasterTorHoch:"on"] and $cmd=~"0|2") (setreading doifGarageTor Tor Hoch)
DOELSE
([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 10:49:19   Device          GarageTasterTorHoch
     2018-12-27 10:49:19   cmd             2.2
     2018-12-27 10:49:19   cmd_event       GarageTasterTorHoch
     2018-12-27 10:49:19   cmd_nr          2
     2018-12-27 10:49:19   cmd_seqnr       2
     2018-12-27 10:49:19   e_GarageTasterTorHoch_events Pinlevel: low,off,Longpress: off
     2018-12-26 22:39:27   mode            enabled
     2018-12-27 10:49:19   state           cmd_2
   Regex:
   attr:
     cmdState:
     cmdpause:
       2
       2
     wait:
     waitdel:
   condition:
     0          ::EventDoIf('GarageTasterTorHoch',$hash,'on',1) and $cmd=~"0|2"
   devices:
     0           GarageTasterTorHoch
     all         GarageTasterTorHoch
   do:
     0:
       0          setreading doifGarageTor Tor Hoch
     1:
       0          [GarageTasterTorHoch:"on"] and $cmd==1
       1          set GarageTorHoch off
   helper:
     event      Longpress: off
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   GarageTasterTorHoch
     timerevent Longpress: off
     triggerDev GarageTasterTorHoch
     DOIF_eventas:
       cmd_nr: 2
       cmd_seqnr: 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


Warum schreibt er mir denn als reading cmd 2.2 dahin? Das passiert doch nur wenn getrennte (set) (set) als Aktion aufgeführt sind?
Nun klappt es zwar meistens aber er triggert mir manchmal (unregelmäßig) das Runterfahren wenn er dann hochgefahren ist obwohl das getrennte Taster sind. Und das verstehe ich nun so gar nicht.

Das ist der 2. Taster:

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

   MODEL      FHEM
   NAME       doifGarageTorTasterRunter
   NR         58
   NTFY_ORDER 50-doifGarageTorTasterRunter
   STATE      cmd_1
   TYPE       DOIF
   READINGS:
     2018-12-27 10:49:58   Device          GarageTasterTorRunter
     2018-12-27 10:49:58   cmd             1
     2018-12-27 10:49:58   cmd_event       GarageTasterTorRunter
     2018-12-27 10:49:58   cmd_nr          1
     2018-12-27 10:49:58   e_GarageTasterTorRunter_events Pinlevel: low,off,Longpress: off
     2018-12-27 10:41:47   mode            enabled
     2018-12-27 10:49:58   state           cmd_1
   Regex:
   attr:
     cmdState:
     cmdpause:
       2
       2
     wait:
     waitdel:
   condition:
     0          ::EventDoIf('GarageTasterTorRunter',$hash,'on',1) and $cmd=~"0|2"
   devices:
     0           GarageTasterTorRunter
     all         GarageTasterTorRunter
   do:
     0:
       0          setreading doifGarageTor Tor Runter
     1:
       0          [GarageTasterTorRunter:"on"] and $cmd==1
       1          set GarageTorRunter off
   helper:
     event      Longpress: off
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   GarageTasterTorRunter
     timerevent Longpress: off
     triggerDev GarageTasterTorRunter
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: GarageTasterTorRunter
       state: cmd_1
     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


Und die Taster gehen auf dieses DOIF welches wiederrum die Relais mittels on-for-timer ansteueren. Ich steuere direkt über das Reading Tor damit der Status immer bekannt ist. Ausser den Tastern wird das Tor noch über 1 Wire DS2401 angesteuert was in einem getrennten DOIF abläuft. Ich habe mich daher dazu entschieden die Relais nicht direkt anzusteuern (ausser bei den Tastern für OFF) damit ich ein Device habe dessen Status immer bekannt ist und damit die Position des Tors.

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 10:49:58   Device          doifGarageTor
     2018-12-27 10:49:58   Tor             Runter
     2018-12-27 10:49:58   cmd             1
     2018-12-27 10:49:58   cmd_event       doifGarageTor
     2018-12-27 10:49:58   cmd_nr          1
     2018-12-26 13:45:11   last_cmd        Runter
     2018-12-26 13:47:24   mode            enabled
     2018-12-27 10:49:58   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


Ich bin mir zwar sicher es gibt schönere Wege das alles abzubilden aber grundsätzlich klappt es ganz gut. Außer das mit den Tastern halt.

Ellert

Zitat von: Dersch am 26 Dezember 2018, 22:43:25
Nun kann man zwar nicht sofort wieder den anderen Befehl ausführen aber das muss ja in der Regel auch nicht.
Falls Du das Modul RPI_GPIO verwendest könntest Du mit dem Attribut debounce_in_ms entprellen.

Frank_Huber

Debounce verzögert aber meiner Beobachtung nach den Schaltvorgang.
Hab da wochenlang mit experimentiert.

Das cmd 2_2 bekommst weil dein DOELSE ein DOELSEIF sein muss.

Gesendet von meinem Doogee S60 mit Tapatalk


Dersch

#14
Ah ok, dachte immer bei nur 2 Bedingungen kann ich auch einfach DOELSE verwenden aber das stimmt ja nur wenn nach DOELSE einfach ein (set) kommt und halt keine weitere Bedingung zum Ausführen.

Aber hat das cmd2.2 was damit zu tun, dass das DOIF des anderen Tasters auf cmd1 springt wenn ich den einen Taster verwende? Irgendwie wird die Bedingung des einen Tasters wahr wenn ich den anderen Taster betätige. Kapiere allerdings nicht warum und auch nicht warum das nur unregelmäßig passiert. Die Bedingung ist doch ein Event der Taste und die wird ja gar nicht gedrückt und zeigt auch keinen Event.