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?
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
@Dersch
Warum hast Du das zitierte Beispiel mit do always ergänzt?
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.
[GarageTasterTorHoch]:"on"
Du willst ja nur auf on triggern und nicht auf das off beim loslassen.
Gesendet von meinem Doogee S60 mit Tapatalk
Aha das ist natürlich logisch. Danke ich probiere aus :)
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?
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
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.
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
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
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.
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.
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
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.
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
Ich probiere aus. DOELSEIF aber mit do always? Denn er soll es ja wieder ausführen wenn die Bedingung wiederholt wahr wird?
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.
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
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
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?
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.
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
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
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
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?
@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.
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.
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
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
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.
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
$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
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$"]
Ich habe nun [GarageTasterTorRunter:"^on$"] verwendet und mehrfach das Verhalten getestet. Das Fehlverhalten ist nicht mehr aufgetreten! Es funktioniert einfach :D