Seite 1 von 1

Script in einer unendlich Schleife laufen lassen?

Verfasst: Sonntag 1. Februar 2015, 12:55
von Rainero
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

Re: Script in einer unendlich Schleife laufen lassen?

Verfasst: Sonntag 1. Februar 2015, 13:21
von Üpsilon
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.

Re: Script in einer unendlich Schleife laufen lassen?

Verfasst: Sonntag 1. Februar 2015, 13:31
von Sirius3
@Ü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?

Re: Script in einer unendlich Schleife laufen lassen?

Verfasst: Sonntag 1. Februar 2015, 16:58
von hwm
@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.

Re: Script in einer unendlich Schleife laufen lassen?

Verfasst: Sonntag 1. Februar 2015, 18:44
von acidbath
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