Script wird nicht ausgefuehrt

  • Hallo,
    habe ein scipt fuer eine Lichtsteuerung.

    Jedestunde6_23.py


    Ist waehrend einem reboot, if pfd.input_pins[0].value == 0: geht es, cmd`s werden alle ausgefuehrt.
    Ist es waehrend einem reboot, if pfd.input_pins[0].value == 1: geht es nicht, cmd`s werden nicht ausgefuehrt.

    ist in rc.local, so.
    /usr/bin/python /bin/led/Jedestunde6_23.py &

    Ist Alarm in der Nacht , if pfd.input_pins[0].value == 0: ausgeschaltet, funktioniert die Lichtsteuerung ab 06.00h Jedestunde6_23.py einwandfrei.

    Ist jedoch der Alarm in der Nacht ein (reboot at 05.30h) wird script Jedestunde6_23.py den ganzen Tag nicht ausgefuehrt, obwohl ab 07.00h Alarm wieder ausgeschaltet wurde, also if pfd.input_pins[0].value == 0: wieder auf 0 ist.
    Habe jetzt in crontab -e, um 07.02 ein, 02 7 * * * /etc/rc.local #restart at 07.02h eingefuegt.

    So geht es nun, aber ist das der richtige Weg, ich denke das muss auch anderst, eleganter gehen.

    Hat jemand einen Tip?

    Gruss
    gwaag

    Einmal editiert, zuletzt von gwaag (8. November 2016 um 08:48)

  • Wenn der Dateiname des Scripts dem entspricht wann es ausgeführt werden soll, wäre es sinnvoller das Script in Crontab anstatt /etc/rc.local einzutragen.
    Warum?
    Weil man über Crontab ganz einfach sagen kann "jede stunde".
    Würde man das Script stattdessen mit einer Schleife permanent laufen lassen müsste man etwas aufwändiger quasi prüfen ob die aktuelle Zeit eine volle Stunde ist..

    digiart hats bereits angesprochen: Deine 20 if Abfragen prüfen alle das selbe/gleiche, macht also so gar kein Sinn. Alle prüfen ob pfd.input_pins[0].value == 0 ist.

    So wie ich das sehe macht es aber generell kaum ein Sinn das Script überhaupt zu haben. Erstell dir einfach ein einziges Script was wie bereits erwähnt über Crontab jede Stunde ausgeführt wird. Da ich jetzt zwar nicht weiß was /bin/led/jedestunde macht würde ich dennoch sagen das du einfach diese Datei nimmst und dort dann einfach prüfst ob pfd.input_pins[0].value == 0 ... fertig.


  • Vielleicht solltest du erstmal erklären was du überhaupt machen willst. Aus dem Script ist das nicht erkennbar. Wenn wir das wissen, können wir dir auch sagen wie es besser geht.

    dbv
    Danke fuer Dein Interesse was das was ich vor habe.

    Wenn Alarmanlage nicht scharf ist: PiFace Eingang =0.

    Lichtsteuerung von 6.00h bis 23.00h, jede stunde ein mal blincken, oder andere Licht spielereien. Das Script so wie es ist funktioniert einwandfrei.
    Mit script AbwesendAbend.py rufe ich ein script "Zone1-4Abend" auf, dass das Licht sporadisch aendert wenn Alarmanlage scharf ist, um 22.30h beendet das script, Zone1-4Abend das Licht mit /bin/led/aus
    AbwesendAbend.py:

    Obiges scipt startet uebe Popen, dieses scipt:
    Zone1-4Abend.

    Dieses script wird einwandfrei aufgerufen und funktioniert auch.


    Wenn Alarmanlage scharf ist brauche ich die Lichtsteuerung nicht da ich nicht zu Hause bin oder schlafe. PiFace Eingang = 1.

    Um ca. 22.00h wird Alarmanlage eingeschaltet und bleibt scharf bis ca. 7.00h.

    in etc/rc.local habe ich eingetragen:

    /usr/bin/python /bin/led/AbwesendAbend.py &
    /usr/bin/python /bin/led/Jedestunde6_23.py&
    exit 0
    jeden Tag um 05.30h reboot per crontab -e. rc.local wird nach einem reboot dann neu gestartet.

    Ist die Alarmanlage um 5.30h eingeschaltet funktioniert das scipt Jedestunde6-23 nicht, ist sie die ganze Nacht ausgeschaltet funktioniert das scipt zu allen Zeiten von 6-23.

    sudo atq zeigt wenn Eingang =1 keine Zeiten an, wenn Eingang =0 zeigt es alle Zeiten (jobs) von 6-23 an, d.h. wenn beim booten Eingang 1 ist, wird script Jedestunde6-23 nicht geladen??
    Wenn ich aber mit crontab -e um ca. 7.00h wenn Alarm ausgeschaltet ist nochmals die /etc/rc.local anschubse geht das scriot wieder den ganzen Tag.

    Hoffentlich kannst Du jetzt nachvollziehen was ich machen will, Danke fuer Deine Zeit.

    gruss
    gwaag
    Automatisch zusammengefügt:


    Wenn der Dateiname des Scripts dem entspricht wann es ausgeführt werden soll, wäre es sinnvoller das Script in Crontab anstatt /etc/rc.local einzutragen.
    Warum?
    Weil man über Crontab ganz einfach sagen kann "jede stunde".
    Würde man das Script stattdessen mit einer Schleife permanent laufen lassen müsste man etwas aufwändiger quasi prüfen ob die aktuelle Zeit eine volle Stunde ist..

    digiart hats bereits angesprochen: Deine 20 if Abfragen prüfen alle das selbe/gleiche, macht also so gar kein Sinn. Alle prüfen ob pfd.input_pins[0].value == 0 ist.

    So wie ich das sehe macht es aber generell kaum ein Sinn das Script überhaupt zu haben. Erstell dir einfach ein einziges Script was wie bereits erwähnt über Crontab jede Stunde ausgeführt wird. Da ich jetzt zwar nicht weiß was /bin/led/jedestunde macht würde ich dennoch sagen das du einfach diese Datei nimmst und dort dann einfach prüfst ob pfd.input_pins[0].value == 0 ... fertig.


    @ meigraf
    Danke fuer die Rueckmeldung.

    ich habe in meinem script verschiedene Lichtsteuerungen, JedestundeerstesMal, jedestunde, meteo, ect. Also wenn pin =0 macht es zu den "at" Zeiten das gewueschte.

    Wie muesste dann das script aussehen wenn ich alle unterscipts mit nur einem pfd.input_pins[0].value == 0 oder 1, pruefe? d.h ich will wenn pin 0 ist alle unterscript ausfuehren, wenn pin 1 ist, nichts ausfueheren.
    gwaag

    Einmal editiert, zuletzt von gwaag (8. November 2016 um 17:44)

    • Offizieller Beitrag

    Du hast Scripte die Scripte aufrufen die Scripte aufrufen? Das klingt nach broken by Design ;). Ein If sähe dann so aus

    Code
    if pfd.input_pins[0].value == 0:
        cmd = "echo /bin/led/jedestundeerstesMal | at 06:00 today"
        subprocess.Popen(cmd, shell=True)
        cmd = "echo /bin/led/jedestunde | at 07:00 today"
        subprocess.Popen(cmd, shell=True)
       .
       .

    Das ist immer noch nicht schön. Ich würde mir ein extra python modul bauen welches die ganzen Abläufe beinhaltet. Und dann per cron, wie vom Grafen vorgeschlagen,ein script laufen lassen welches sich die ganzen sachen aus dem Modul holt.

  • Halten wir erst mal fest, das dein in Beitrag#1 gezeigte Script nirgends, wirklich nirgends, auf == 1 prüft. In ausnahmslos jeder if Abfrage wird nur auf == 0 geprüft.
    Da es also die ganze Zeit exakt die gleiche Abfrage/Prüfung ist kann man alles in nur einer if Abfrage abhandeln.
    Nun widersprichst du dem ganzen aber und zwar indem du meinst dass das Script auch auf 1 prüfen würde - aber guck dir doch mal bitte das von Dir gepostete Script in Beitrag#1 an. Wenn das was du da gezeigt hast gar nicht der Realität entspricht wie gut kann dann mögliche Hilfestellung sein? :-/

    Deine Script-Namensgebung und dazugehörige Beschreibung nun in Beitrag#5 finde ich als Aussenstehender extrem verwirrend.

    Dein AbwesendAbend.py würde so wie es da steht 100% CPU Last erzeugen, was letztlich nicht nur das Script selbst sondern auch alles andere negativ beeinflusst. Wieso? Weil die while Schleife ungebremst rotiert sofern keiner der if Abfragen zutrifft (auch die verschachtelte Abfrage)

    Also sorry aber so ganz steig ich da nicht durch, daher kann ich auch schlecht helfen und sofort wissen was für dich die passende Lösung wäre

    Ein paar mehr Hintergrundinfos und weniger WirrWarr wäre schön.
    Fangen wir zB erst mal damit an was an pfd.input_pins[0] angeschlossen ist.

  • Ich glaube Dein Denkfehler liegt darin, daß Du nur einmalig beim Ausführen von rc.local den Zustand des Pins prüfst, und dann abhängig davon entweder ALLE at-Jobs einstellst oder eben KEINEN. Danach beendet sich Dein über rc.local gestartetes Skript.

    Ich vermute, was Du wirklich willst, ist, zur AUSFÜHRUNGSZEIT des at-Jobs, also zu jeder vollen Stunde den Zustand des Pins zu prüfen. Deshalb gehört die if-Abfrage nicht in Dein Startskript, sondern in die jedestunde_irgendwas-Skripte. Und die müssen immer, jeden Tag ausgeführt werden. Insofern gebe ich meigrafd recht, daß cron-Jobs hier sinnvoller wären als Einstellen von at-Jobs über rc.local in Verbindung mit einem ansonsten überflüssigen täglichen reboot.

  • k


    Halten wir erst mal fest, das dein in Beitrag#1 gezeigte Script nirgends, wirklich nirgends, auf == 1 prüft. In ausnahmslos jeder if Abfrage wird nur auf == 0 geprüft.
    Da es also die ganze Zeit exakt die gleiche Abfrage/Prüfung ist kann man alles in nur einer if Abfrage abhandeln.
    Nun widersprichst du dem ganzen aber und zwar indem du meinst dass das Script auch auf 1 prüfen würde - aber guck dir doch mal bitte das von Dir gepostete Script in Beitrag#1 an. Wenn das was du da gezeigt hast gar nicht der Realität entspricht wie gut kann dann mögliche Hilfestellung sein? :-/

    Deine Script-Namensgebung und dazugehörige Beschreibung nun in Beitrag#5 finde ich als Aussenstehender extrem verwirrend.

    Dein AbwesendAbend.py würde so wie es da steht 100% CPU Last erzeugen, was letztlich nicht nur das Script selbst sondern auch alles andere negativ beeinflusst. Wieso? Weil die while Schleife ungebremst rotiert sofern keiner der if Abfragen zutrifft (auch die verschachtelte Abfrage)

    Also sorry aber so ganz steig ich da nicht durch, daher kann ich auch schlecht helfen und sofort wissen was für dich die passende Lösung wäre

    Ein paar mehr Hintergrundinfos und weniger WirrWarr wäre schön.
    Fangen wir zB erst mal damit an was an pfd.input_pins[0] angeschlossen ist.

    meigrafd,

    Alarmanlage hat einen potenzialfreien Kontakt, ueber pfd.input_pins[0] fragt er ab, ob offen oder geschlossen, was am Eingang als 1 oder 0 ankommt.

    Alle scripte funktionieren ok, nur dass es Probleme bereitet wenn zum Zeitpunkt des reboots, Eingang auf 1 ist, das script was auf Eingan 0 abfragt nicht funktioniert.

    gruss
    gwaag


  • Alle scripte funktionieren ok, nur dass es Probleme bereitet wenn zum Zeitpunkt des reboots, Eingang auf 1 ist, das script was auf Eingan 0 abfragt nicht funktioniert.

    Doch, das funktioniert genau so, wie Du es programmiert hast: Es läuft innerhalb von Sekundenbruchteilen durch alle if-Abfragen durch, und da der Eingang in dieser Zeit durchgängig auf 1 steht, legt es keinen einzigen at-Job an, sondern beendet sich, ohne was getan zu haben.

  • Wie gesagt....

    Du startest über /etc/rc.local ein Script, was nur ein einziges mal durchläuft.
    In diesem Script prüfst du den Eingang nur auf 0.

    Mag ja sein das dein Konstrukt bisher funktioniert - es ginge aber eben auch einfacher. Ein großes Manko ist die von dbv angesprochene "Scripte die Scripte aufrufen die Scripte aufrufen" Sache. Du hast also mehrere Ecken die zu einem Problem werden können.
    Sinnvoller und durchsichtiger wäre ein einziges Script was sich um den kompletten Ablauf kümmert.
    In deinem /etc/rc.local Script verwendest du 'at' um /bin/led/jedestunde jede Stunde auszuführen. Das ist so eigentlich auch Quatsch.

    Was ich also vorschlage ist:

    Du erstellst einen einzigen Crontabeintrag wie zum Beispiel:

    Code
    0 * * * *    /usr/bin/python /usr/local/bin/Steuerung.py


    Bedeutet: Das Script wird zur Minute 0, Jede Stunde, Jeden Tag des Monats, Jeden Monat des Jahres und Jeden Tag der Woche ausgeführt. Minute 0 bedeutet also zB: 12:00 , 13:00 , 14:00 usw. Mehr dazu siehe FAQ => Nützliche Links / Linksammlung => crontab

    Darüber wird dann also das Script /usr/local/bin/Steuerung.py ausgeführt... Hier behandelst du dann deine Steuerung: Abfrage des Eingangs und wenn die aktuelle Stunde der gewünschten Schaltzeit entspricht schaltest du halt deine LED's, oder was auch immer.
    Der Inhalt dieses Scripts könnte wie folgt aussehen:

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!