Dummy schaltetn DOIF - Dummy soll für gewisse Zeit gesperrt werden

Begonnen von iamandy, 15 Mai 2016, 14:28:20

Vorheriges Thema - Nächstes Thema

iamandy

Hallo FHEM Liebhaber,

ich benötige mal wieder Euren Rat!

Ziel: Ich möchte eine Funksteckdose schalten. An der Steckdose hängt ein Computer. Um den Computer zu schützen möchte ich einen Schutz einbauen der zwischen dem Ein-, oder Ausschalten wartet. Hintergrund ist, dass ich ein Script habe das den Computer erst aus der ferne herunter fährt und dann den Rechner ausschaltet.

Shell Script: Es gibt ein Shell Script das ich aus fhem mit den wert start, oder stop aufrufe. Um das herunterfahren des Rechners und das ausschalten der Funksteckdose, kümmert sich das Script.

Aktueller Stand der Dinge

Dummy:
define Schalter.Computer.WZ dummy
attr Schalter.Computer.WZ alias Computer
attr Schalter.Computer.WZ group Status
attr Schalter.Computer.WZ room iPhone
attr Schalter.Computer.WZ webCmd on:off


DOIF:
define Schalter.Computer.WZ.Doif DOIF ([Schalter.Computer.WZ] eq "on")  (\
  {system ("nohup sudo /home/pi/bin/Computer start &");;;;return undef}\
)\
\
DOELSEIF ([Schalter.Computer.WZ] eq "off")  (\
  {system ("nohup sudo /home/pi/bin/Computer stop &");;;;return undef}\
)
attr Schalter.Computer.WZ.Doif cmdpause 300:300
attr Schalter.Computer.WZ.Doif do always


Problem: Ich möchte verhindern das man schneller das start oder stop Script aufruft, als es dauert den Computer zu starten oder zu stoppen.

Idee:
Ich suche eine Möglichkeit die es verhindert den Dummy auf einen anderen als den aktuellen Wert zu schalten bevor nicht eine Mindestzeit abgelaufen ist.

Ich habe  bis jetzt nur das "cmdpause 300:300" im DOIF gefunden. Hier kann ich aber nicht verhindern das der Dummy geschaltet wird und dabei auch auf den neuen Wert umspringt. Also z.B. Ich drücke auf Dummy:on > DOIF springt auch auf ON > Startscript läuft > DOIF ist für 300 sec. "gesperrt". Drücke ich innerhalb der 300 Sec. auf Dummy:off, dann springt der Dummy auf off und für den Anwender sieht es aus als wäre auch der DOIF auf OFF gesprungen, ist er aber nicht da ja die Wartezeit noch nicht abgelaufen ist.

So was wie "cmdpause 300:300" für den Dummy wäre toll...
Schön wäre alternativ auch wenn ich auf dem Dummy verzichten könnte und nur mit dem DOIF arbeite und als schalter verwende, doch "webCmd on:off" im DOIF klappte nicht...

Hat jemand einen Rat für mich?

Damian


define sperre dummy

define Schalter.Computer.WZ.Doif DOIF ([Schalter.Computer.WZ] eq "on" and [sperre] ne "on") 
(set sperre on, {system ("nohup sudo /home/pi/bin/Computer start &");;return undef})
(set sperre off)
DOELSEIF ([Schalter.Computer.WZ] eq "off" and [sperre] ne "on")
(set sperre on, {system ("nohup sudo /home/pi/bin/Computer stop &");;return undef})
(set sperre off)

wait 0,300:0,300




Der Code ist für den Web-Editor gedacht.

Gruß

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Mein Vorschlag ohne extra Variable:
define Schalter.Computer.WZ.Doif DOIF ([Schalter.Computer.WZ] eq "on" and [?$SELF] ne "sperre") ({system ("nohup sudo /home/pi/bin/Computer start &");;return undef})()
DOELSEIF ([Schalter.Computer.WZ] eq "off" and [?$SELF] ne "sperre") ({system ("nohup sudo /home/pi/bin/Computer stop &");;return undef})()
wait 0,300:0,300
cmdState sperre,on|sperre,off

Damian

Zitat von: Per am 15 Mai 2016, 15:09:35
Mein Vorschlag ohne extra Variable:
define Schalter.Computer.WZ.Doif DOIF ([Schalter.Computer.WZ] eq "on" and [?$SELF] ne "sperre") ({system ("nohup sudo /home/pi/bin/Computer start &");;return undef})()
DOELSEIF ([Schalter.Computer.WZ] eq "off" and [?$SELF] ne "sperre") ({system ("nohup sudo /home/pi/bin/Computer stop &");;return undef})()
wait 0,300:0,300
cmdState sperre,on|sperre,off


Der Code ist natürlich eleganter. () jeweils am Ende sollte überflüssig sein.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

iamandy

Das ist noch nicht ganz das was ich such. Ich habe es bei mir mal ausprobiert. Ich kann mit Euren Vorschlägen gut verhindern das das Kommando mehrfach ausgeführt wird, das ist schon mal sehr gut, aber konnte ich im prinziep ja schon mit dem "attr Schalter.Computer.WZ.Doif cmdpause 300:300"

Was ich suche ist eine Möglichkeit die es verhindert den Dummy auf einen anderen als den aktuellen Wert zu schalten bevor nicht eine Mindestzeit abgelaufen ist...

Damian

Zitat von: iamandy am 15 Mai 2016, 15:25:05
Das ist noch nicht ganz das was ich such. Ich habe es bei mir mal ausprobiert. Ich kann mit Euren Vorschlägen gut verhindern das das Kommando mehrfach ausgeführt wird, das ist schon mal sehr gut, aber konnte ich im prinziep ja schon mit dem "attr Schalter.Computer.WZ.Doif cmdpause 300:300"

Was ich suche ist eine Möglichkeit die es verhindert den Dummy auf einen anderen als den aktuellen Wert zu schalten bevor nicht eine Mindestzeit abgelaufen ist...

Du hast Recht. cmdpause verhindert die Ausführung auch beim Zustandswechsel.

Es gab schon mal den Wunsch, DOIF-Befehlszweige per set zu schalten, das könnte man mit webcmd kombinieren - kommt in den todo-Sack.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

iamandy

Zitat von: Damian am 15 Mai 2016, 16:40:21
Du hast Recht. cmdpause verhindert die Ausführung auch beim Zustandswechsel.

Es gab schon mal den Wunsch, DOIF-Befehlszweige per set zu schalten, das könnte man mit webcmd kombinieren - kommt in den todo-Sack.

Fände ich toll ;-) - Aber das DOIF ist jetzt schon richtig geil! Ich finde das DOIF macht das Fhem richtig rund!

Ich habe für mich eine Möglichkeit gefunden das "Problem" mit einem 2. Hilfs DOIF zu lösen. Sicher nicht die schönste Art, aber so steht der Dummy immer so wie auch das DOIF, bzw. wird der Dummy immer wieder zu dem aktuellen Stand des DOIF zurück geschoben. So lange bis sich das DOIF wirklich in den nexten CMD State bewegt...

define Schalter.Computer.WZ.Doif DOIF ([Schalter.Computer.WZ] and [?Schalter.Computer.WZ.Doif:cmd:sec] > 0.5)  (\
\
IF ([Schalter.Computer.WZ] eq "on" and [Schalter.Computer.WZ.Doif:cmd] eq "2")\
     (set Schalter.Computer.WZ off),\
IF ([Schalter.Computer.WZ] eq "off" and [Schalter.Computer.WZ.Doif:cmd] eq "1")\
     (set Schalter.Computer.WZ on)\
\
)
attr Schalter.Computer.WZ.Doif do always
attr Schalter.Computer.WZ.Doif wait 0.2,0.2

Damian

Zitat von: iamandy am 15 Mai 2016, 18:26:22
Fände ich toll ;-) - Aber das DOIF ist jetzt schon richtig geil! Ich finde das DOIF macht das Fhem richtig rund!

Ich habe für mich eine Möglichkeit gefunden das "Problem" mit einem 2. Hilfs DOIF zu lösen. Sicher nicht die schönste Art, aber so steht der Dummy immer so wie auch das DOIF, bzw. wird der Dummy immer wieder zu dem aktuellen Stand des DOIF zurück geschoben. So lange bis sich das DOIF wirklich in den nexten CMD State bewegt...

define Schalter.Computer.WZ.Doif DOIF ([Schalter.Computer.WZ] and [?Schalter.Computer.WZ.Doif:cmd:sec] > 0.5)  (\
\
IF ([Schalter.Computer.WZ] eq "on" and [Schalter.Computer.WZ.Doif:cmd] eq "2")\
     (set Schalter.Computer.WZ off),\
IF ([Schalter.Computer.WZ] eq "off" and [Schalter.Computer.WZ.Doif:cmd] eq "1")\
     (set Schalter.Computer.WZ on)\
\
)
attr Schalter.Computer.WZ.Doif do always
attr Schalter.Computer.WZ.Doif wait 0.2,0.2


Du könntest zum "Richtigstellen" des Dummys auch dein ursprüngliches DOIF ausbauen:

define Schalter.Computer.WZ.Doif DOIF ([Schalter.Computer.WZ] eq "on") ({system ("nohup sudo /home/pi/bin/Computer start &");;return undef})(set Schalter.Computer.WZ on)
DOELSEIF ([Schalter.Computer.WZ] eq "off") ({system ("nohup sudo /home/pi/bin/Computer stop &");;return undef})(set Schalter.Computer.WZ off)

cmdpause 300:300
wait 0,300:0,300


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Zitat von: Damian am 15 Mai 2016, 15:13:33() jeweils am Ende sollte überflüssig sein.
Erkennt wait das trotzdem?

Zitat von: iamandy am 15 Mai 2016, 14:28:20Ich suche eine Möglichkeit die es verhindert den Dummy auf einen anderen als den aktuellen Wert zu schalten bevor nicht eine Mindestzeit abgelaufen ist.
Jetzt habe ich die Aufgabe verstanden. Ist aber kein Problem/Möglichkeit von DOIF, sondern ein Dummy-Task. Und da kannst du nur REagieren und zurückstellen.
Was noch gänge (für das Webfrontend), wäre beim Dummy das devStateIcon zu beinfussen. Im "sperre"-Status wird
devStateIcon off:off:off on:on:on
im "Normal-Modus"
devStateIcon off:off:on on:on:off
gesetzt.
Leider hast du ja nicht geschrieben (oder ich habe es übersehen), wie du den Dummy setzt, vllt. kann man dort ansetzen.


Zitat von: Damian am 15 Mai 2016, 16:40:21kommt in den todo-Sack.
:-*

Zitat von: Damian am 15 Mai 2016, 15:13:33Der Code ist natürlich eleganter.
Das drucke ich aus und hänge es mir neben den Monitor  :P

Damian

Zitat"() jeweils am Ende sollte überflüssig sein."

Erkennt wait das trotzdem?

Nein. Es war korrekt, ich habe mich beim Klammerzählen verzählt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

iamandy

Zitat von: Per am 15 Mai 2016, 21:06:11
Leider hast du ja nicht geschrieben (oder ich habe es übersehen), wie du den Dummy setzt, vllt. kann man dort ansetzen.

Da hast Du natürlich recht, dass hatte ich nur indirekt beschrieben. Ich setze den Dummy indem:
ich in meinem Fhem-Web auf on/off vom genannten Dummy drücke.

Darum wäre es toll, wenn es schon beim Dummy die Möglichkeit gäbe das Drücken abzufangen. Vielleicht mit einem Popup "du dafst noch nicht drücken". Aber ich mag nicht irgendetwas "umprogrammieren", sondern lieber eine Lösung mit Boardmittel nutzen. Das 2. DOIF tut es fürs 1.

Per

Zitat von: iamandy am 15 Mai 2016, 21:47:50Fhem-Web
Dann sollte die devStateIcon-Lösung klappen.
define Schalter.Computer.WZ.Doif DOIF ([Schalter.Computer.WZ] eq "on" and [?$SELF] ne "sperre") (attr Schalter.Computer.WZ devStateIcon off:off:nix on:on:nix,{system ("nohup sudo /home/pi/bin/Computer start &");;return undef})(attr Schalter.Computer.WZ devStateIcon off:off:on on:on:off)
DOELSEIF ([Schalter.Computer.WZ] eq "off" and [?$SELF] ne "sperre") (attr Schalter.Computer.WZ devStateIcon off:off:nix on:on:nix,{system ("nohup sudo /home/pi/bin/Computer stop &");;return undef})(attr Schalter.Computer.WZ devStateIcon off:off:on on:on:off)
wait 0,300:0,300
cmdState sperre,on|sperre,off