Hallo!
Mich beschäftigt ein neues Problem:
Ich habe zwei Taster, die zwei verschiedene GPIOs ansteuern.
Wird der Taster 1 gedrückt, geht der Rollo rauf, wird der Taster 2 gedrückt, geht der Rollo runter.
Das ganze funktioniert mit zwei doif-Befehle:
defmod doif_open DOIF ([GPIO16] eq "on") (set myShelly1 open)
defmod doif_closed DOIF ([GPIO20] eq "on") (set myShelly1 closed)
Wie gesagt, drücke ich Taster 2, geht der Rollo runter.
Ist es möglich, den Rollo während der Fahrt nach unten stoppen zu lassen, wenn ich den Taster 2 ein weiteres Mal drücke?
Irgendwie müsste ich beim zweiten Tastendruck den Status abfragen können, und wenn mir der Status sagt "der Rollo bewegt sich gerade nach unten", folgt nicht der Befehl "set myShelly1 closed", sondern "set myShelly1 stopped".
Ich weiß jedoch nicht, ob man so eine Anforderung in eine doif einbauen kann.
Wer weiß mehr?
was hälst du von einem dritten doif mit und verknüpfung für ([GPIO20] eq "on") und position deines shellies nicht closed ist. alternativ kannst du ja noch pct auf != 0 abfragen.
vielleicht klappt das ja
Hier als Beispiel eines meiner Rollo DOIFs.
Ich steuere das Rollo Modul an, musst Dir die Readings an den Shelly anpassen.
defmod Rollo_Bad_EG DOIF ([GPIO_IN_06:"^on$"] and [?Rollo2_Bad_EG] ne "drive-up") (set Rollo2_Bad_EG open)\
DOELSEIF ([GPIO_IN_07:"^on$"] and [?Rollo2_Bad_EG] ne "drive-down") (set Rollo2_Bad_EG closed)\
DOELSEIF (([GPIO_IN_06:"^on$"] or [GPIO_IN_07:"^on$"]) and [?Rollo2_Bad_EG] =~ "drive-down|drive-up") (set Rollo2_Bad_EG stop)\
attr Rollo_Bad_EG checkReadingEvent 1
attr Rollo_Bad_EG cmdpause 2:2:2
attr Rollo_Bad_EG do always
Danke Frank, leider funktioniert das stoppen immer noch nicht
Ich habe zunächst meinen vorherigen Code mit dem Status erweitert:
alt:
defmod doif_open DOIF ([GPIO16] eq "on") (set myShelly1 open)
neu:
defmod doif_open DOIF ([GPIO16] eq "on" and [myShelly1] ne "moving_down|moving_up") (set myShelly1 open)
Beide Codes funktionieren, beim betätigen des Tasters wird der Rollo geöffnet.
Anschließend wurde der Code um DOELSEIF ergänzt:
defmod doif_open DOIF ([GPIO16] eq "on" and [myShelly1] ne "moving_down|moving_up") (set myShelly1 open) DOELSEIF ([GPIO16] eq "on" and [myShelly1] eq "moving_down|moving_up") (set myShelly1 stop)
Beim nochmaligen bestätigen des Tasters wird der Rollo leider nicht gestoppt. Warum?
Wenn ich in der FHEM-Befehlszeile "set myShelly1 stop" eingebe, wird der Rollo gestoppt. Der Befehl passt also.
Ich habe jetzt eine andere Herangehensweise gewählt, mit der es funktioniert:
defmod doif_open DOIF ([GPIO16] eq "on" and [myShelly1] eq "stopped") (set myShelly1 open) DOELSEIF ([GPIO16] eq "on") (set myShelly1 stop)
Nachtrag:
nach weiteren Tests habe ich herausgefunden, dass der Code nur funktioniert, wenn das Attribut cmdpause gesetzt ist. Warum, ist mir ein Rätsel.