Funksteckdose in Abhängigkeit von Anwesenheit schalten

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hi,

    wenn ich in meine Wohnung komme, steht sofort rechts eine Lampe. Diese kann ich aktuell per Raspberry Pi mittels Funksteckdosen schalten.

    Habe mir nun ein Python-Script geschrieben, welches per Ping überprüft ob die IP meines iPhones erreichbar ist und falls das so ist die Steckdose anschaltet.

    Zuerst einmal wird das Script per Cronjob um 19:30 Uhr ausgeführt. Anschließend wird 12000 mal, alle 3 Sekunden, gecheckt ob ich zu Hause bin. Also 10 Stunden, bis 5:30 Uhr.
    Sinn ist, dass ich nach Hause komme und es dunkel ist, sich automatisch die Lampe am Eingang einschaltet.

    Erstes Problem: Script würde alle 3 Sekunden die Lampe anschalten und das Funksignal senden. Unnötigerweise, da die Lampe ja ab dem zweiten Schleifendurchlauf bereits an ist.

    Daher wollte ich eine Hilfsvariable "status" einführen, welche sich merkt ob die Lampe gerade an oder aus ist.

    Trotzdem wird nach jedem Ping wieder "eingeschaltet". Ich hab keine Ahnung wieso. Muss irgendein kleiner Denkfehler sein.

    Zweiter Punkt: Ich würde gerne noch eine weitere Funktion einbauen. So, wie das Script jetzt ist, würde die Lampe natürlich dauerhaft eingeschaltet sein, solange mein iPhone im WLAN ist. Wenn ich die Lampe manuell ausschalte, würde sie beim nächsten Schleifendurchlauf wieder eingeschaltet werden.
    Allerdings will ich ja auch ins Bett gehen irgwann und dann bekäme ich die Lampe bei laufendem Script nicht ausgeschaltet. Hat jmd eine Idee, wie ich das clever lösen könnte?

    Danke im Voraus! :)

  • Funksteckdose in Abhängigkeit von Anwesenheit schalten? Schau mal ob du hier fündig wirst!

  • Zyklus würde ich nicht auf 3 Sekunden stellen. 5-10 sollten reichen wenn dein WLAN nicht in der Wohnung noch endet. Paar Sekunden braucht man ja um Türe aufzusperren und zu öffnen. Ich konnte mir jetzt unterwegs den Code nicht weiter ansehen.
    Generell wäre meine Idee in etwa so.
    Schleife alle 5-10 sek die prüft IP ja/nein. Wenn nein Intervall weiter. Wenn ja, Licht an und alle x-Minuten prüfen ob IP noch da ist. Wenn ja, Schleife von vorne, wenn nein dann wieder erste Schleife. Das ganze im Zeitraum nur von - bis. Somit kannst du einen manuellen kill an die dose schicken und der status ist ihr egal, da deine IP ja noch vorhanden ist.

  • fuuman: Für deine Statusüberwachung erwähnst du doch schon alles was du brauchst. Eine Variable in dem der Status gespeichert wird. Dazu würde ich ein Flag setzen, also einen Boolean-Wert ("True" / "False"). Um das dann in der Schleife umzusetzen, kannst du innerhalb deines Zeitintervalls überprüfen, ob das Handy in Reichweite UND wie der Status des Flags ist. Wäre das Handy in Reichweite und der Flag auf "False", dann wird das Licht eingeschaltet sowie der Flag auf "True" gesetzt. Nächster Durchlauf: Ist das Handy in Reichweite und der Flag bereits auf "True", passiert nichts. Erst wenn dann das Handy außerhalb der Reichweite ist und der Flag noch auf "True" wird das Licht ausgeschaltet sowie der Flag auf "False" gesetzt. Das könnte so aussehen (ungetestet):

    Zum manuellen Schalten könntest du eine dritte If-Abfrage mit einer extra Status-Variable einfügen, aber das überlass ich jetzt mal dir ;)

    //edit: Hab mal noch dein os.system richtig gestellt.

  • Geht auch ganz ohne Status, denn die Lampe wechselt ja immer ihren Status von an zu aus und umgekehrt.

  • Das Script an sich funktioniert. Nur komischerweise klappt es nicht wenn ich es per cronjob ausführe. :\
    kA wieso.
    0 20 * * * python /home/pi/script.py

    Und ich weiß noch nicht wie ich das "endgültig-aus-Signal" senden soll.. hmm, muss mir da noch was überlegen.

Jetzt mitmachen!

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