Hauptmenü

if verzögert ausführen

Begonnen von Tobi, 26 Januar 2019, 23:34:33

Vorheriges Thema - Nächstes Thema

Tobi

Hallo
Ich stehe vor dem Problem das ich über Telegram einen Befehl an FHEM sende um eine Siemens SPS anzusteuert.
Ich möchte überprüfen ob der Befehl ausgeführt wurde. Dazu muss ich jedoch mindestens einen Zyklus der SPS abwarten.
Meine Frage ist wie ich den für Befehl "if(Value("Ausgang1") eq "off")" eine Verzögerung von ca. einer halben Sekunde bekomme.

defmod telegrammtext notify teleBot:msgText.* {\
if ($EVTPART1 eq 'On') {\
fhem ("set Eingang1 on");;\
fhem ("set teleBot message Ich schaue nach");;\
{if(Value("Ausgang1") eq "off") {\
fhem ("set teleBot message Achtung! Das Licht ist nicht an");;\
    } \
else {\
      fhem ("set teleBot message erledigt");;\
    }\
}\
fhem ("set teleBot message Auf Wiedersehen");;\
}\
elsif ($EVTPART1 eq 'Off') {\
fhem ("set Eingang1 off;; set teleBot message Ich schaue nach");;\
{if(Value("Ausgang1") eq "on") {\
fhem ("set teleBot message Achtung! Das Licht ist nicht aus");;\
    } \
else {\
      fhem ("set teleBot message erledigt");;\
    }\
}\
fhem ("set teleBot message Auf Wiedersehen");;\
}\
else{\
fhem ("set teleBot message Befehl unbekannt");;\
}\

}\

Otto123

#1
Hi,

das Einfachste wäre ein sleep 0.5 davor. Das legt Dir allerdings dein FHEM für genau diese Zeit lahm.

Alternativ geht auch die Umstellung auf  komplett FHEM Befehle (FHEM IF), da wirkt sleep nicht blockierend.
Du verwendest eigentlich nichts, wo Du wirklich perl brauchst.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Tobi

Danke Otto123
genau das blockieren vom Sleep habe ich auch erkannt.
Ich habe heute versucht mein Code umzuschreiben, bin jedoch gescheitert.
Vielleicht kann mir jemand meinen Fehler erklären?
Nachdem ich ihn nicht zum Laufen bekommen habe, habe ich jeweils zwei kleine Schritte getestet.

Es wird richtig auf den State "on" der SPS reagiert.

defmod test1 notify teleBot \
IF ([Ausgang1:state] eq "on") \
(set Eingang1 on , set teleBot message Q1 ist an) \
ELSE \
(set teleBot message Fehler)


und es wird auch richtig auf die msgText "ON" von telegram reagiert

defmod test2 notify teleBot \
IF ([teleBot:msgText] eq "On") \
(set Eingang1 on , set teleBot message Ich schaue nach) \
ELSE \
(set teleBot message Fehler)



Ich schaffe es aber nicht den Fehler zu finden um eine verschachtelte IF abfrage zusammen zu stellen.
defmod test3 notify teleBot  \
IF ([teleBot:msgText] eq "On") \
(set Eingang1 on , set teleBot message Ich schaue nach) (\
IF ([Ausgang1:state] eq "on") (set teleBot Q1 ist an) \
) ELSE (set teleBot message Fehler) \
ELSE (set teleBot message Fertig)


keine Rückmeldung im telegram
Kann mir jemand bitte helfen meinen Denk oder anderen Fehler zu identifizieren?

im logfile finde ich das:
Triggering test3
2019.01.27 23:07:24 4: test3 exec IF ([teleBot:msgText] eq "On")
(set Eingang1 on , set teleBot message Ich schaue nach) (
IF ([Ausgang1:state] eq "on") ( set teleBot Q1 ist an)
) ELSE (set teleBot message Fehler)
ELSE (set teleBot message Fertig)
2019.01.27 23:07:24 3: test3 return value: IF: expected ELSE:  (IF ([Ausgang1:state] eq "on") ( set teleBot Q1 ist an) ) ELSE (set teleBot message Fehler) ELSE (set teleBot message Fertig)


bevor ich dieses nicht zum laufen bekommen, brauch ich auch kein sleep einzubauen :-[

Otto123

Hallo Tobi,

das IF funktioniert ja grundlegend so:
IF (Bedingung)(FHEM BEFEHLE)
Da IF auch bloß ein FHEM Befehl ist, würde ich so schachteln:
IF(Bedingung1)(IF(Bedingung2)(Befehl) ELSE (Befehl))
Für Deinen Fall mit mehreren Befehlen dann doch so:
IF(Bedingung1)(BefehlIF1,BefehlIF1,IF(Bedingung2)(BefehlIF2) ELSE (BefehlIF2),BefehlIF1)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Deudi

Pack doch alles in eine Funktion, die du im notify aufrufst, und zwar mittels at kurz verzögert.
Gigabyte Brix, Ubuntu 16.04.3 LTS, Homematic, Z-Wave, EnOcean, Shelly@MQTT, SIGNALduino, JeeLink DAVIS-Sketch

Otto123

Moin,

definierte Wartezeiten sind ein billige und schlechte Lösung. Besser ist die Events vom System zu nutzen.

Ich habe so etwas ähnliches mehrteilig gelöst.
defmod di_ServerAn DOIF ([06:45|8] and [Arbeit]) (set Server1 on)

defmod w_ServerStart watchdog di_ServerAn:cmd_1 00:05 Server1:on {if (Value("Server1") ne "on") {DebianMail('xxx@yyy.de,aaa@bbb.de','FHEM: Serverproblem','Server Server1 nicht gestartet')}};; trigger w_ServerStart .

Der Server soll unter der Woche automatisch starten, ich will eine Info falls er nicht innerhalb 5 min gestartet ist.
Es gibt einen Start Event di_ServerAn:cmd_1 und den zu überwachenden Event Server1:on

Während ich mir das so anschaue, denke ich man kann die if Abfrage weglassen. Die ist redundant.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz