FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Dersch am 26 Dezember 2018, 18:11:48

Titel: DOIF Taster zum umschalten
Beitrag von: Dersch am 26 Dezember 2018, 18:11:48
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?
Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Frank_Huber am 26 Dezember 2018, 18:26:44
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

Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Ellert am 26 Dezember 2018, 18:36:03
@Dersch
Warum hast Du das zitierte Beispiel mit do always ergänzt?
Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Dersch am 26 Dezember 2018, 18:37:37
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.
Titel: Antw:DOIF Taster zum umschalten
Beitrag 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

Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Dersch am 26 Dezember 2018, 19:16:04
Aha das ist natürlich logisch. Danke ich probiere aus :)
Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Dersch am 26 Dezember 2018, 22:10:43
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?
Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Frank_Huber am 26 Dezember 2018, 22:13:24
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

Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Dersch am 26 Dezember 2018, 22:31:18
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.
Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Dersch am 26 Dezember 2018, 22:43:25
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 (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
Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Frank_Huber am 27 Dezember 2018, 10:52:55
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
Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Dersch am 27 Dezember 2018, 11:27:04
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.
Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Ellert am 27 Dezember 2018, 11:34:10
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.
Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Frank_Huber am 27 Dezember 2018, 11:58:00
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

Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Dersch am 27 Dezember 2018, 12:13:51
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.
Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Frank_Huber am 27 Dezember 2018, 12:15:59
Das zweite cmd ist deine Bedingung.
Bei DOELSE wird jede klammer als Befehl ausgewertet.

Was meinst du mit dem anderen Taster?
Versuche doch mal mit DOELSEIF, und wenn du denkst da ist was faul poste ein list im fehlerstatus.

Gesendet von meinem Doogee S60 mit Tapatalk

Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Dersch am 27 Dezember 2018, 12:17:44
Ich probiere aus. DOELSEIF aber mit do always? Denn er soll es ja wieder ausführen wenn die Bedingung wiederholt wahr wird?
Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Ellert am 27 Dezember 2018, 12:21:58
Tasten prellen sollte im Bereich von Millisekunden liegen, bei 2 Sekunden ist was faul.

und
([GarageTasterTorHoch:"on"] and $cmd==1) (set GarageTorHoch off) wird nach DOELSE als Sequenz interpretiert, weil es keine Bedigung sein kann.
Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Frank_Huber am 27 Dezember 2018, 12:24:10
Zitat von: Dersch am 27 Dezember 2018, 12:17:44
Ich probiere aus. DOELSEIF aber mit do always? Denn er soll es ja wieder ausführen wenn die Bedingung wiederholt wahr wird?
Dürfte bei dem doif egal sein weil die zweige ja eh nur abwechselnd auslösen können.

Gesendet von meinem Doogee S60 mit Tapatalk

Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Frank_Huber am 27 Dezember 2018, 12:26:44


Zitat von: Ellert am 27 Dezember 2018, 12:21:58
Tasten prellen sollte im Bereich von Millisekunden liegen, bei 2 Sekunden ist was faul.
2sec ist halt das minimum das im Doif richtig funktioniert.

Wenn du debounce auf 100ms stellst schaltet das Licht auch 100ms verzögert an.
Da war der WAF sehr tief.
Über das "entprellen" im Doif geht alles tadellos.



Gesendet von meinem Doogee S60 mit Tapatalk

Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Dersch am 27 Dezember 2018, 12:28:51
Wegen dem Prellen mache ich mir grade noch Gedanken. Ich habe bisher bei RPI_GPIO als Interrupt immer "both" verwendet. Warum kann ich eigentlich gar nicht sagen, wahrscheinlich nur im Bedarf die Option von Longpress nutzen zu können, ein weiterer Sinn fällt mir nicht ein. Aber ist es nicht einfach besser Rising bzw Falling zu verwenden und damit auch nur die Flanke auswerten wenn Longpress gar nicht gebraucht wird? Oder denke ich da falsch?
Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Ellert am 27 Dezember 2018, 12:54:45
Zitat2sec ist halt das minimum das im Doif richtig funktioniert.
Bei mir funktionieren im DOIF auch Timer < 1s zum Trennen von Sequenzen (Pi 2B), insofern ist die Verallgemeinerung falsch.

ZitatWenn du debounce auf 100ms stellst schaltet das Licht auch 100ms verzögert an.
Sinn des Entprellen ist es, erst dann einen Zustand zu signalisieren, wenn sicher ist das der Zustand stabil ist, dabei ist eine Verzögerung unabdingbar.

ZitatAber ist es nicht einfach besser Rising bzw Falling zu verwenden und damit auch nur die Flanke auswerten
Das würde sozusagen die Prellfrequenz halbieren, aber nicht verhindern.
Ich würde mir den die Schaltevents im Eventmonitor ansehen (mit gesetztem mseclogAttribut), die Prellhäufigkeit/zeit ansehen und dann debounce setzen.
Es ist immer besser Störungen möglichst früh auszuschalten, als unnötige Events durchs System zu jagen.
Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Frank_Huber am 27 Dezember 2018, 13:04:52


Zitat von: Ellert am 27 Dezember 2018, 12:54:45
Bei mir funktionieren im DOIF auch Timer < 1s zum Trennen von Sequenzen (Pi 2B), insofern ist die Verallgemeinerung falsch.
Sinn des Entprellen ist es, erst dann einen Zustand zu signalisieren, wenn sicher ist das der Zustand stabil ist, dabei ist eine Verzögerung unabdingbar.
Das würde sozusagen die Prellfrequenz halbieren, aber nicht verhindern.
Ich würde mir den die Schaltevents im Eventmonitor ansehen (mit gesetztem mseclogAttribut), die Prellhäufigkeit/zeit ansehen und dann debounce setzen.
Es ist immer besser Störungen möglichst früh auszuschalten, als unnötige Events durchs System zu jagen.

Hi,

Es geht nicht um timer allgemein sondern um das Attribut cmdpause.
Im oben verlinkten Thema ist nachzulesen warum.

Klar ist ein eliminieren so weit vorne wie möglich besser,
Verzögert aber eben alles nachgelagerte.
Da muss man eben abwägen was das kleinere Übel ist. [emoji6]

Gesendet von meinem Doogee S60 mit Tapatalk

Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Ellert am 27 Dezember 2018, 13:42:48
Das Beispiel aus dem Wiki wird über Dummy geschaltet die Prellen nicht, daher muss es angepasst werden. Wenn tatsächlich 2 s das praktische Minimum für cmdpause sind, dann würde ich es mit wait lösen

([GarageTasterTorHoch] eq "on" and [$SELF] =~"initialized|^cmd_2)\$" (setreading doifGarageTor Tor Hoch)
DOELSEIF
([GarageTasterTorHoch] eq "on" and [$SELF]  eq "cmd_1") (set GarageTorHoch off)


und

wait x:x mit x etwas länger als die längste Prellzeit

Funktionsweise: Der Befehl wird erst nach der Prellzeit ausgeführt und erst dann kann in einen anderen Zweig geschaltet werden
Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Frank_Huber am 27 Dezember 2018, 13:56:27
Da wird aber wieder der Befehl verzögert.
Was spricht denn gegen die 2sec?
Wenn ich Licht anschalte will ich es ja nicht nach ner halben wieder ausschalten.
Viel mehr will ich dass es direkt mit dem Tastendruck angeht.

Je nach Einsatzzweck mag es auch mit wait Sinn machen, Klar.

Gesendet von meinem Doogee S60 mit Tapatalk

Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Dersch am 27 Dezember 2018, 14:24:38
Es klappt auch mit Umstellung auf DOELSEIF leider nicht.

Ist das Tor oben (nicht mit Taster nach oben gefahren) und drücke ich den Taster für Runter, lasse einen Moment fahren und drücke erneut den Taster Runter für Stop springt das DOIF des Tasters für Hoch auf cmd1 und das Tor fährt wieder hoch.

Es gibt doch aber gar nichts was das DOIF für den Taster triggern könnte außer der Taster selbst?
Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Ellert am 27 Dezember 2018, 14:25:58
@Frank_Huber
Du sprichst von Licht, hier geht es um ein Garagentor, das springt nicht auf Tastendruck auf oder zu, da sind 100 ms nix. 2 s können für einen Notstop/Richtungsumkehr
schon zu lang sein.
Es hängt vom Einsatzzweck, wie Du es sagst.
Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Ellert am 27 Dezember 2018, 14:31:17
Zitat von: Dersch am 27 Dezember 2018, 14:24:38
Es klappt auch mit Umstellung auf DOELSEIF leider nicht.

Ist das Tor oben (nicht mit Taster nach oben gefahren) und drücke ich den Taster für Runter, lasse einen Moment fahren und drücke erneut den Taster Runter für Stop springt das DOIF des Tasters für Hoch auf cmd1 und das Tor fährt wieder hoch.

Es gibt doch aber gar nichts was das DOIF für den Taster triggern könnte außer der Taster selbst?
Wie soll das DOIF erraten, das Du das Tor manuell bedient hast, das musst Du in den Bedingungen zusätzlich implementieren.
Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Frank_Huber am 27 Dezember 2018, 14:46:36
Wie ist denn das Gesamtkonstrukt des Garagentors?
Wäre nicht evtl das Rollo Modul eine Idee für dich?
Poste doch mal von allem ein List nachdem der Fehler aufgetreten ist.


@Ellert,
Ja da hast du recht.
Mit cmdpause kann es alles zwischen 1,01 und 2,99 sec sein.
Mit wait kann man es gezielt auf 0,1 sec stellen.
Aber eben dann immer verzögert anstatt sofort geschalten.



Gesendet von meinem Doogee S60 mit Tapatalk

Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Frank_Huber am 27 Dezember 2018, 14:48:46
Zitat von: Dersch am 27 Dezember 2018, 14:24:38
Es klappt auch mit Umstellung auf DOELSEIF leider nicht.

Ist das Tor oben (nicht mit Taster nach oben gefahren) und drücke ich den Taster für Runter, lasse einen Moment fahren und drücke erneut den Taster Runter für Stop springt das DOIF des Tasters für Hoch auf cmd1 und das Tor fährt wieder hoch.

Es gibt doch aber gar nichts was das DOIF für den Taster triggern könnte außer der Taster selbst?
Beobachte mal im event monitor deine gpio.
Könnte es sein dass der zweite mit triggert?

Falls ja:
Hast du pull up /pull down Widerstände verbaut?
Wie lange sind die Kabel?

Gesendet von meinem Doogee S60 mit Tapatalk

Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Dersch am 27 Dezember 2018, 15:19:43
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.

Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Frank_Huber am 27 Dezember 2018, 15:31:31
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

Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Ellert am 27 Dezember 2018, 15:54:49
$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
Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Ellert am 27 Dezember 2018, 16:26:11
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$"]
Titel: Antw:DOIF Taster zum umschalten
Beitrag von: Dersch am 27 Dezember 2018, 17:08:27
Ich habe nun [GarageTasterTorRunter:"^on$"] verwendet und mehrfach das Verhalten getestet. Das Fehlverhalten ist nicht mehr aufgetreten! Es funktioniert einfach  :D