Mit DoIf auf telegramm message reagieren und Rechner neustarten

Begonnen von wowogiengen, 23 Oktober 2017, 20:13:07

Vorheriges Thema - Nächstes Thema

wowogiengen

Hallo,
ich habe mir ein DoIf gebastelt, dass jedesmal, wenn eine bestimmte Nachricht ("XXXXX") an den Bot gesendet wird, das System einmal durch bootet...:

defmod teleBotRestartPi DOIF ([teleBot:msgText] eq "XXXXX") (set teleBot message Mach ich;;{system('shutdown -r 1')})

setstate teleBotRestartPi cmd_1
setstate teleBotRestartPi 2017-10-23 20:08:28 Device teleBot
setstate teleBotRestartPi 2017-10-23 20:07:10 cmd 1
setstate teleBotRestartPi 2017-10-23 20:07:10 cmd_event teleBot
setstate teleBotRestartPi 2017-10-23 20:07:10 cmd_nr 1
setstate teleBotRestartPi 2017-10-23 20:08:28 e_teleBot_msgText XXXXX
setstate teleBotRestartPi 2017-10-23 20:07:10 error set teleBot message Mach ich;;{system('shutdown -r 1')}: -1
setstate teleBotRestartPi 2017-10-23 20:07:10 state cmd_1

Irgendwie bleibt er aber immer im State cmd_1 hängen, und schaltet nicht weiter, um beim nächsten Empfang des Texts nochmal neu zu starten, da er ja bereits im cmd_1 ist und nicht mehr im cmd_0

Wie mach ich das? Über ein notify, das auf die Message reagiert und sonst gar nix?

Otto123

#1
Ich denke das ist ein typischer Fall für attr teleBotRestartPi do always

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

wowogiengen

Leider nicht...
Das hab ich auch schon nach gelesen, aber dann müllt mich das DoIf mit der ACK-Antwort zu, und ich denke, dass es dann auch beim nächsten Neustart gleich wieder zuschlagen würde, und somit eine Dauerbootschleife entstünde. Zum Glück hatte ich vergessen das attribut auch abzuspeichern  :P

Aber vielleicht mach ich was an der Syntax des Readings falsch. Es soll ja nur dann getriggert werden, wenn es sich ändert, bzw. wenn sich der Zeitstempel ändert (-> event-on-change-reading bzw. event-on-update-reading müsste dann auf 1 gesetzt sein).

Aber da sieht es so aus, als ob sich nur die msgId ändert und der Text gleich bleibt...

Viele Grüße
Wolfgang

Otto123

#3

Ok. Du darfst natürlich auch nur ein Event pro Text erzeugen attr teleBot event-on-change-reading msgText

Solche Konstrukte sind sowieso etwas "Freude spendend" Du solltest den restart erst nach ordentlichen Tests freischalten  ;D

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

viegener

Ich kann nicht genau sagen was passiert, aber im Prinzip kommt das DOIF ja nie zum Ende des cmd_1, denn der shutdown verhindert ja ein vollständiges ausführen und der letzte Status wird nie gespeichert.

Generell finde ich den Ansatz etwas hart, den Rechner mit laufendem FHEM ohne Speicherung etc einfach neuzustarten.

Grundsätzlich hoffe ich, dass Du den bot entsprechend abgesichert hast, dass nicht jeder Spassvogel, der Deinen Bot kennt ihn herunterfahren kann?
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

wowogiengen

Hallo,
mein Problem ist, dass das DoIf nicht korrekt ausgeführt wird, sondern beim 2. Empfangen des Kommandos kein msgText aktualisiert wird, und somit das DoIf beim 2. Mal nicht triggert. Wenn ich eine andere Nachricht zwischen rein empfange, dann triggert das DoIf auch wieder.

Der Shutdown löst bei mir jetzt so aus, dass nach 1 Minute ein reboot ausgelöst wird, und dann alles wieder läuft. Ich hoffe ja, dass FHEM einen korrekten eigenen Shutdown ausführt, wenn das OS runterfährt...

Dass nicht gespeicherte Änderungen verloren gehen, mag sein, aber das stört mich nicht.

Vielleicht muss ich beim Empfangen einer Nachricht im telebot-code das Reading auch nochmal aktualisieren...
Viele Grüße
Wolfgang

Brockmann

Zitat von: wowogiengen am 24 Oktober 2017, 06:23:23
mein Problem ist, dass das DoIf nicht korrekt ausgeführt wird, sondern beim 2. Empfangen des Kommandos kein msgText aktualisiert wird, und somit das DoIf beim 2. Mal nicht triggert. Wenn ich eine andere Nachricht zwischen rein empfange, dann triggert das DoIf auch wieder.
Ich denke, der Status des Moduls wird im statefile gespeichert und beim FHEM-Neustart von dort wieder hergestellt. Einmal ausgeführt bleibt es also im cmd1, bis irgendeine andere Nachricht reinkommt. Dann wechselt es in den (impliziten) DOELSE-Fall und somit zu cmd2. Erst dann kann es wieder mit einem Zustandswechsel auf Dein Kommando reagieren.

Versuch mal
attr teleBotRestartPi initialize initialized
Dann wird das Modul beim FHEM-Neustart immer auf initialized gesetzt und kann wieder mit einem Zustandswechsel auf Dein Kommando reagieren.

Otto123

Zitat von: wowogiengen am 24 Oktober 2017, 06:23:23sondern beim 2. Empfangen des Kommandos kein msgText aktualisiert wird, und somit das DoIf beim 2. Mal nicht triggert.
Moin Wolfgang,

mit den beiden von mir empfohlenen Attributen sollte das DOIF genau einmal triggern und dann solange ruhig bleiben bis es entweder zurückgesetzt wird oder sich der msgText ändert. Beim Neustart von FHEM müsstest Du also noch das DOIF wie Brockmann schreibt wieder in den Ausgangszustand versetzen. Oder den msgText ändern :)

FHEM wird korrekt beendet wenn man das System neu startet.

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

Per

Versuch mal "," statt ";;". So steht es nämlich auch in der Doku.
Du kannst auch einen zweiten Zustand (DOELSEIF) mit reinbringen, welcher auf den Neustart reagiert.