Script in einer unendlich Schleife laufen lassen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Rainero
User
Beiträge: 7
Registriert: Dienstag 22. Oktober 2013, 08:01

Hallo Gemeinde,
auf meinem Raspberry läuft ein Webserver der mit meiner Homatic CCU kommuniziert.
Diesen Webserver frage ich in einer Endlosschleife ab und abhängig von der Antwort schaltet der Raspberry
Funksteckdosen ein bzw. aus. Das funktioniert tadellos.
Meine Frage nun:

Ist das mit der Endlosschleife Okay oder stürzt der irgendwann unweigerlich ab????

hier mein Script:

Code: Alles auswählen

 i=0
 Dose_1 = False

   while i == 100
      r = requests.get('http://petra.istmein.de:8080/api/getPlainValue/4954')  # abruf des Datenpunkt der Steckdose Dose_1 von der Homatic CCU 
      s=r.text    #das ist die Anwort des Servers. Ist immer "true" oder "false"
      if s =="true":
              os.popen("sudo /root/raspberry-remote/./send 10000 1 1")  # hier schaltet der Rapberry die Steckdose ein
        Dose_1 = True
    else:
                 os.popen("sudo /root/raspberry-remote/./send 10000 1 0") # hier schaltet der Rapberry die Steckdose aus
         Dose_1 = False
mit freundlichen Grüßen
Rainer
Zuletzt geändert von Anonymous am Sonntag 1. Februar 2015, 13:10, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Üpsilon
User
Beiträge: 225
Registriert: Samstag 15. September 2012, 19:23

Vorweg: Ich habe keine Ahnung vom Raspberri, nur von "normalem" Python.

Dieser Code startet nicht mal, weil in der Zeile mit dem while der Doppelpunkt fehlt. Und das while muss nicht eingerückt werden, nur das danach.

Wenn einer da wäre, würde die Schleife nie ausgeführt werden. Am Anfang setzt du ja i=0, und dann prüfst du sofort, ob i==100. Das wertet zu False aus und die Schleife wird deswegen übergangen.

(Hier stand ein gelöschter Abschnitt, der bei genauerem Nachdenken keinen Sinn ergibt.)

Außerdem sind s und r und i eigtl. auch blöde Variablennamen. Bei so kleinen Skripten mag das gehen, aber gewöhn dir das nicht an, wenn du mal größere Programme schreibst.

Da dein Skript ja hauptsächlich Shell-Befehle ausführt: Muss es unbedingt mit Python sein? Wäre vlt schlauer, ein Shell-Skript zu nutzen.

Wenn du bei Python bleiben willst, dann lies das: http://py-tutorial-de.readthedocs.org

Und: bei deinem nächsten Post im Forum darfst du gerne Quellcode mit den [code]...[/code] - Tags einschließen.

Zur eigentlichen Frage: Ich fände das mit der Endlosschleife ok. Man würde das Skript ja eh auf dem Terminal laufen lassen, da könnte man es dann mit C-c abschießen.

Lg Y.
Zuletzt geändert von Üpsilon am Sonntag 1. Februar 2015, 13:34, insgesamt 1-mal geändert.
PS: Die angebotene Summe ist beachtlich.
Sirius3
User
Beiträge: 17761
Registriert: Sonntag 21. Oktober 2012, 17:20

@Üpsilon: das mit dem s== "true" ist schon ok, weil das die Antwort auf eine Webabfrage ist.

@Rainero: Busy-loops sind immer schlecht, bloß in manchen Fällen gibt es keine bessere Lösung. Die Frage ist also, wie bekommst Du eine Änderung des Einschaltezustandes ohne diesen ständig abfragen zu müssen?
Dein Code enthält nicht nur Syntax-Fehler sondern auch falsche Einrückungen. Statt os.popen wäre hier subprocess.check_call passend. Was passiert, wenn es mehr als eine Dose gibt?
hwm
User
Beiträge: 39
Registriert: Mittwoch 20. April 2005, 23:33

@Rainero: Anmerkung am Rande: ob das jetzt so schlau ist, eine ungeschützte Web Adresse zu veröffentlichen? Da kann jeder drauf und mal eben beliebige Dinge ausführen.
acidbath
User
Beiträge: 21
Registriert: Mittwoch 26. Januar 2011, 19:10

Hallo Rainero,

wie von meinem Vorposter schon geschrieben hast Du Deinen ccu.io-Server letztlich für alle zugänglich ins Netz gestellt; keine Ahnung wie sicher das darunterliegende node.js und ccu.io sind, aber mir wär's an Deiner Stelle ein wenig zu riskant.
Im Homematic-Forum gibt's eine gute Anleitung, wie man auf dem Pi mit dem Apachen einen reverse proxy aufsetzen kann und somit vergleichweise sicher direkt auf seine CCU und andere Geräte zugreifen kann. Ich selbst habe einen VPN-Server laufen, aber bei einem Kumpel läuft besagter reverse proxy seit geraumer Zeit sehr stabil.
Und zu Deinem Polling des ccu.io-Servers: ich würde vermutlich zumindest ein kleines delay einbauen, um den Server nicht zu überlasten. Ansonsten kannst Du Dich auch recht einfach bei der CCU mit einem kleinen selbstgebastelten XML-RPC-Server registrieren und bekommst dann automatisch eine Benachrichtigung sobald sich ein Datenpunkt geändert hat. Python bringt bereits einen SimpleXMLRPCServer mit, ist also in vergleichsweise wenigen Zeilen zusammengetippert.

Viele Grüße,
Daniel
Antworten