Shell-Skript starten bei wechseln von On --> Standby und bei Standby --> On

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Shell-Skript starten bei wechseln von On --> Standby und bei Standby --> On

      Hallo,

      ich suche eine Möglichkeit mit dem aktuellen Image (VTi 11.0.1) zwei Skripte auszuführen.
      • Skript #1 soll starten wenn die Box von "On" in "Standby" (nicht Deep-Standby) geht.
      • Skript #2 soll starten wenn die Box aus dem "Standby" (nicht Deep-Standby) zu "On" wechselt.
      Ich meine, dass man "früher" die Möglichkeit hatte sich in /usr/lib/enigma2/python/Screens/Standby.py einzuklinken. jetzt liegen da aber nur noch .pyo Dateien.
      Die Runlevel kann ich auch nicht nehmen, da es leider keinen Wechsel gibt.

      Hat jemand eine Idee?
    • Wenn's dir um die Datei Standby.py geht: die kannst du über das Paket "enigma2-python-src" installieren.
      Das OpenWebif pollt alle 10 Sekunden die URL http://<box>/api/statusinfo, da wird auch der Standby-Screen abgefragt.
      Diskutiere nie mit einem Idioten. Er zieht dich auf sein Niveau runter und schlägt dich mit seiner Erfahrung.
    • BTW: Hast du mal den Code in /usr/lib/enigma2/python/mytest.py gesehen:


      Quellcode

      1. #demo code for use of standby enter leave callbacks
      2. #def leaveStandby():
      3. # print "!!!!!!!!!!!!!!!!!leave standby"
      4. #def standbyCountChanged(configElement):
      5. # print "!!!!!!!!!!!!!!!!!enter standby num", configElement.value
      6. # from Screens.Standby import inStandby
      7. # inStandby.onClose.append(leaveStandby)
      8. #config.misc.standbyCounter.addNotifier(standbyCountChanged, initial_call = False)
      9. ####################################################
      Alles anzeigen
      Damit sollte sich relativ einfach ein Plugin realisieren lassen, welches auf Standby On/Off reagiert. Der Wert von config.misc.standbyCounter wird im Standby-Screen geändert.

      Wird außerdem in Components/FanControl.py, Components/Lcd.py, Components/ParentalControl.py, SystemPlugins/AutoShutdown, SystemPlugins/HDMICEC und vielleicht weiteren benutzt. Da hast du Beispiele, wie du dich da reinhängen kannst.
      Diskutiere nie mit einem Idioten. Er zieht dich auf sein Niveau runter und schlägt dich mit seiner Erfahrung.
    • Oha, das sind ja zwei geniale Hinweise. Leider ist Python nicht so mein Ding, und an ein Plugin habe ich noch nicht gedacht.

      Eigentlich will ich nur jeweils eine URL zum triggern aufrufen. In der Art
      ToStandby: server/to_standby
      FromStandby: server/from_standby

      Dazu habe ich jetzt mal in der Standby.py hinter

      Python-Quellcode

      1. print "enter standby"


      folgendes eingetragen:

      Python-Quellcode

      1. import os
      2. wgetCommand = "wget -O /dev/null -q "https://server/from_standby"
      3. os.system(wgetCommand)

      Aber irgendwie wird das "ignoriert". Muss ich mal weiter forschen.

      Ich versuche jetzt das wget in einem Shell-Skript zu machen:

      in Standby.py hinter
      print "enter standby"

      also jetzt folgendes:

      Python-Quellcode

      1. import os
      2. wgetCommand = "/media/usb/go2standby.sh"
      3. os.system(wgetCommand)

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Toskache ()

    • Hier das Ganze ohne dein os.system() als Plugin - dann musst du die Standby.py nicht ändern und überlebst auch jedes Update:


      Python-Quellcode

      1. # -*- coding: utf-8 -*-
      2. from Components.config import config
      3. from Plugins.Plugin import PluginDescriptor
      4. def leaveStandby():
      5. print "[Info-Plugin] leaving standby..."
      6. def standbyCounterChanged(configElement):
      7. print "[Info-Plugin] going to standby..."
      8. from Screens.Standby import inStandby
      9. inStandby.onClose.append(leaveStandby)
      10. def autostart(reason, **kwargs):
      11. if kwargs.has_key("session") and reason == 0:
      12. print "[Info-Plugin] start...."
      13. config.misc.standbyCounter.addNotifier(standbyCounterChanged, initial_call = False)
      14. def Plugins(**kwargs):
      15. return PluginDescriptor(
      16. name="Info-Plugin",
      17. description="Bastel Plugin",
      18. where = [PluginDescriptor.WHERE_SESSIONSTART, PluginDescriptor.WHERE_AUTOSTART],
      19. fnc=autostart)
      Alles anzeigen
      Wenn ich den Debug-Modus anstelle, werden bei Standby und zurück die beiden Zeilen auch ausgegeben:

      /media/hdd/dvbapp2_debug_2017-03-18_215045.log:21:51:18.927 [e2-python] [Info-Plugin] going to standby...
      /media/hdd/dvbapp2_debug_2017-03-18_215045.log:21:51:27.155 [e2-python] [Info-Plugin] leaving standby...
      Diskutiere nie mit einem Idioten. Er zieht dich auf sein Niveau runter und schlägt dich mit seiner Erfahrung.
    • Whow! Vielen Dank! Da merkt man wieder das man nix kann ;)

      Ich habe jetzt in
      /usr/lib/enigma2/python/Plugins/SystemPlugins/
      ein Verzeichnis
      Standby
      angelegt und dort die Datei plugin.py angeleg:

      Python-Quellcode

      1. # -*- coding: utf-8 -*-
      2. from Components.config import config
      3. from Plugins.Plugin import PluginDescriptor
      4. def leaveStandby():
      5. print "[Info-Plugin] leaving standby..."
      6. import os
      7. ShellCommand = "/media/usb/from_standby.sh"
      8. os.system(ShellCommand)
      9. def standbyCounterChanged(configElement):
      10. print "[Info-Plugin] going to standby..."
      11. import os
      12. ShellCommand = "/media/usb/to_standby.sh"
      13. os.system(ShellCommand)
      14. from Screens.Standby import inStandby
      15. inStandby.onClose.append(leaveStandby)
      16. def autostart(reason, **kwargs):
      17. if kwargs.has_key("session") and reason == 0:
      18. print "[Info-Plugin] start...."
      19. config.misc.standbyCounter.addNotifier(standbyCounterChanged, initial_call = False)
      20. def Plugins(**kwargs):
      21. return PluginDescriptor(
      22. name="Info-Plugin",
      23. description="Bastel Plugin",
      24. where = [PluginDescriptor.WHERE_SESSIONSTART, PluginDescriptor.WHERE_AUTOSTART],
      25. fnc=autostart)
      Alles anzeigen
      Dann habe ich noch eine Datei __init__.py in das Verzeichnis gelegt. Sie hat nur den Inhalt:
      # -*- coding: utf-8 -*-

      Nach einem Neustart und einem Standby liegt dort dan auch die plugin.pyo angelegt, aber leider scheint das Shell-Skript nicht ausgeführt zu werden. Rufe ich das Shell-Skript aus der Shell auf, funktioniert es.

      Nachtrag:
      Ich glaube ich bin bald am Ziel....
      Im Debug-Log tauchen auch folgende Zeilen auf:
      23:04:29.117 [e2-python] [Info-Plugin] going to standby...
      und
      23:04:37.823 [e2-python] [Info-Plugin] leaving standby...

      Nur das Shell-Skript wird nicht getriggert....

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Toskache ()

    • Wie sieht das Shell-Script aus? Von Cron-Jobs habe ich die Erfahrung gemacht, dass gerne mal der Ausführungspfad (PATH-Variable) in der Shell ein anderer ist als in der Umgebung, wo der Cron-Job ausgeführt wird. Könnte sowas sein.

      Bau in das Shell-Script doch mal sowas wie 'echo "Wurde ausgeführt um " $(date) >> /tmp/shell.log' ein, um zu schauen, ob das Script ausgeführt wird oder nicht. Das Script hat Ausführungsrechte und beginnt auch mit #!/bin/bash oder?
      Diskutiere nie mit einem Idioten. Er zieht dich auf sein Niveau runter und schlägt dich mit seiner Erfahrung.
    • Das Gute ist, dass das Skript bei Standby-Aktionen aufgerufen wird.
      Komischer weise funktioniert das Skript in der Shell problemlos, nur nicht über das PlugIn


      Shell-Script

      1. #!/bin/bash
      2. /usr/bin/wget -O /dev/null -q "https://adresse/on_trigger"
      3. echo "Wurde ausgeführt" $(date) >> /tmp/shell.log
      Die Rechte sollte auch passen:
      -rwxr-xr-x 1 root root 250 Mar 18 23:40 to_standby.sh

      Was mir aufgefallen ist: Über das Plugin wird das Skript zweimal bei einer Aktion ausgeführt. Also 2x bei der Aktion "in den Standby".

      Ha, ich hab's hinbekommen! Ich habe den Web-Aufruf einfach in das PlugIn-gepackt:

      Python-Quellcode

      1. import urllib2
      2. urllib2.urlopen("https://adresse/trigger...").read()


      ...hatte ich ganz vergessen: Vielen Dank für die Hilfe!!

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Toskache ()

    • Moin zusammen,

      ich habe mich mal ein wenig da heran gewagt, aber leider bekomme ich nur viele Fehler.

      Das Plugin läuft nicht und es werden Fehler angezeigt, wenn ich die Liste der Plugins aufrufe. (unexpected indent on line 7)
      Meine VTI Version ist die 11.0.1

      Hier mein angepasstes Script plugin.py
      Woraus leider keine plugin.pyo erstellt wird.

      Quellcode

      1. # -*- coding: utf-8 -*-
      2. from Components.config import config
      3. from Plugins.Plugin import PluginDescriptor
      4. def leaveStandby():
      5. print "[Info-Plugin] leaving standby..."
      6. import urllib2
      7. urllib2.urlopen("http://n.n.n.n/config/xmlapi/statechange.cgi?ise_id=3946&new_value=1").read()
      8. def standbyCounterChanged(configElement):
      9. print "[Info-Plugin] going to standby..."
      10. import urllib2
      11. urllib2.urlopen("http://n.n.n.n/config/xmlapi/statechange.cgi?ise_id=3946&new_value=0").read()
      12. from Screens.Standby import inStandby
      13. inStandby.onClose.append(leaveStandby)
      14. def autostart(reason, **kwargs):
      15. if kwargs.has_key("session") and reason == 0:
      16. print "[Info-Plugin] start...."
      17. config.misc.standbyCounter.addNotifier(standbyCounterChanged, initial_call = False)
      18. def Plugins(**kwargs):
      19. return PluginDescriptor(
      20. name="CCU-Plugin",
      21. description="CCU VU Status",
      22. where = [PluginDescriptor.WHERE_SESSIONSTART, PluginDescriptor.WHERE_AUTOSTART],
      23. fnc=autostart)
      Alles anzeigen

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von hgdo () aus folgendem Grund: Formatierung vom Skript angepasst.

    • "import urllib2" unterhalb oder oberhalb der beiden "from"-Zeilen verschieben, und zwar alle Vorkommen.
      Auf die Einrücktiefe von "urllib2.urlopen()" achten - in Python bestimmt die Einrücktiefe, zu welchem Block der Code gehört.
      Nicht zwischen einrücken mit Tabs und einrücken mit Leerzeichen wechseln. Auch Zeile 16 sieht nicht korrekt eingerückt aus.
      Diskutiere nie mit einem Idioten. Er zieht dich auf sein Niveau runter und schlägt dich mit seiner Erfahrung.
    • Gerne ;)

      Und meine Meinung: wenn du viel mit anderen Programmiersprachen arbeitest und den Code von Kollegen benutzen und verstehen musst, die nicht einrücken können (und wo das nicht so wichtig ist), weisst du zu schätzen, dass das in Python zur Sprache dazu gehört. Viele schimpfen darüber, ich find's genial.
      Diskutiere nie mit einem Idioten. Er zieht dich auf sein Niveau runter und schlägt dich mit seiner Erfahrung.
    • Ich versuche, das gerade nachzuvollziehen.
      Leider funktioniert #5 nur bis zum GUI Neustart.
      Jemand eine Idee?

      Plugin:
      Spoiler anzeigen


      Quellcode

      1. from Plugins.Plugin import PluginDescriptor
      2. from Components.config import config
      3. def autostart(reason, **kwargs):
      4. if kwargs.has_key("session") and reason == 0:
      5. session = kwargs["session"]
      6. print "[TEST] Autostart"
      7. config.misc.standbyCounter.addNotifier(onEnterStandby, initial_call = False)
      8. elif reason == 1:
      9. print "[TEST] - Shutdown"
      10. # config.misc.standbyCounter.removeNotifier(onEnterStandby)
      11. def onLeaveStandby():
      12. print "[TEST] onLeaveStandby"
      13. def onEnterStandby(self):
      14. print "[TEST] onEnterStandby"
      15. from Screens.Standby import inStandby
      16. inStandby.onClose.append(onLeaveStandby)
      17. def Plugins(**kwargs):
      18. return [PluginDescriptor(where = [PluginDescriptor.WHERE_SESSIONSTART, PluginDescriptor.WHERE_AUTOSTART], fnc = autostart)]
      Alles anzeigen


      Log mit removeNotifier
      Spoiler anzeigen
      INIT4 - INIT3
      19:17:06.186 [e2-python] [TEST] Autostart
      Standby gedrückt
      19:17:23.752 [e2-python] [TEST] onEnterStandby
      Standby gedrückt
      19:17:27.106 [e2-python] [TEST] onLeaveStandby
      GUI Neustart ausgeführt
      19:18:34.315 [e2-python] [TEST] - Shutdown
      19:18:34.315 [e2-python] EXCEPTION IN PYTHON STARTUP CODE:
      19:18:34.316 [e2-python] ------------------------------------------------------------
      19:18:34.316 [e2-python] Traceback (most recent call last):
      19:18:34.316 [e2-python] File "/usr/lib/enigma2/python/mytest.py", line 686, in <module>
      19:18:34.318 [e2-python] plugins.shutdown()
      19:18:34.318 [e2-python] File "/media/build01/vti-dorie/build/tmp/work/mips32el-oe-linux/enigma2-python/enigma2-python-vti-11.0.2-20170822-r0r0/git/lib/python/Components/PluginComponent.py", line 142, in shutdown
      19:18:34.319 [e2-python] File "/media/build01/vti-dorie/build/tmp/work/mips32el-oe-linux/enigma2-python/enigma2-python-vti-11.0.2-20170822-r0r0/git/lib/python/Components/PluginComponent.py", line 41, in removePlugin
      19:18:34.319 [e2-python] File "/usr/lib/enigma2/python/Plugins/Extensions/stb/plugin.py", line 14, in autostart
      19:18:34.320 [e2-python] config.misc.standbyCounter.removeNotifier(onEnterStandby)
      19:18:34.320 [e2-python] AttributeError: 'ConfigInteger' object has no attribute 'removeNotifier'
      19:18:34.321 [e2-python] ------------------------------------------------------------
      19:18:34.322 [e2-core] (exit code 5)
      Log ohne removeNotifier
      Spoiler anzeigen
      INIT4 - INIT3
      19:20:54.413 [e2-python] [TEST] Autostart
      Standby gedrückt
      19:21:32.489 [e2-python] [TEST] onEnterStandby
      Standby gedrückt
      19:21:36.092 [e2-python] [TEST] onLeaveStandby
      GUI Neustart ausgeführt
      19:21:44.890 [e2-python] [TEST] - Shutdown
      19:22:10.312 [e2-python] [TEST] Autostart
      Standby gedrückt
      Standby gedruckt
      GUI Neustart ausgeführt
      19:23:11.212 [e2-python] [TEST] Autostart
      Rechtschreibfehler sind beabsichtigt, sie fördern ein genaueres Lesen
      Debug Log aktivieren Putty Telnet Screenshots erstellen
    • @rdamas

      danke für das Plugin, funktioniert super!

      folgendes Problem besteht bei mir. Und zwar habe ich einen Pi Zero W am TV. Dort habe ich cec-utils + lirc mit TSOP laufen.

      Jetzt möchte ich beim standyby und wakeup meiner duo2 immer 2 Befehle senden.

      Standby:

      Shell-Script

      1. #!/bin/sh
      2. curl -u name:pass http://ip.meines.fhem.servers:8085/fhem?cmd=setstate%20Fernseher%20off > /dev/null
      3. sleep 1
      4. dbclient -i /home/root/.ssh/id_rsa pi@ip.meines.cec-utils.servers -t "echo "unkown" > /etc/lirc/powerstatus.txt"



      Wakeup:

      Shell-Script

      1. #!/bin/sh
      2. curl -u name:pass http://ip.meines.fhem.servers:8085/fhem?cmd=setstate%20Fernseher%20on > /dev/null
      3. sleep 1
      4. dbclient -i /home/root/.ssh/id_rsa pi@ip.meines.cec-utils.servers -t "echo "on" > /etc/lirc/powerstatus.txt"

      Der Aufruf an Curl klappt wunderbar, aber Dbclient zickt. Rufe ich die Scripte von Terminal auf, klappt es wunderbar....
      Auskommentieren von Dbclient im Script führt dazu, das das Plugin anstandslos funktioniert.

      Jetzt könnte ich mit Curl auch einen Einzeiler machen

      Shell-Script

      1. #!/bin/sh
      2. curl -u name:pass http://ip.meines.fhem.servers:8085/fhem?cmd=set%20Fernseher%20on > /dev/null
      bzw.

      Shell-Script

      1. #!/bin/sh
      2. curl -u name:pass http://ip.meines.fhem.servers:8085/fhem?cmd=set%20Fernseher%20off > /dev/null
      Aber das wäre doppelt gemoppelt, da meine Duo2 den TV schon per HDMI-CEC anschaltet.

      Grund für mein Vorgehen, ich versuche alle möglichen An- und Ausschaltszenarien abzudecken, um den Status in Fhem anzuzeigen sowie für LIRC den aktuellen Status des TV's
      in einer Datei festzuhalten.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von schwatter ()

    • ungetestet, aber das musst du so schreiben.

      dbclient -i /home/root/.ssh/id_rsa pi@ip.meines.cec-utils.servers -t "echo \“on\“ > /etc/lirc/powerstatus.txt"
      Rechtschreibfehler sind beabsichtigt, sie fördern ein genaueres Lesen
      Debug Log aktivieren Putty Telnet Screenshots erstellen
    • Danke, leider war es das auch nicht. Aber endlich, ich habs gerade durch Zufall gefunden. Folgendes funktioniert:

      standyby:

      Shell-Script

      1. #!/bin/sh
      2. curl -u name:pass http://ip.meines.fhem.servers:8085/fhem?cmd=setstate%20Fernseher%20on > /dev/null
      3. sleep 1
      4. dbclient -i /home/root/.ssh/id_rsa pi@ip.meines.cec-utils.servers -t "echo "on" > /etc/lirc/powerstatus.txt" <<'ENDSSH'


      Wichtig ist:

      Quellcode

      1. <<'ENDSSH'