WLAN-Türöffner per Smartphone und Raspi

  • Habe eine (Anfänger!)-Frage:

    bei im WLAN erkannter IP (des Smartphones) soll mein Script für eine Sek. einen Türöffner betätigen. Danach soll das Script in regelmässigen Abständen überprüfen, ob die IP immer noch im WLAN ist und das Script erst dann wieder 'scharf' schalten, wenn die IP für längere Zeit (hier 1 Std.) dann NICHT mehr im WLAN ist.

    Mit Bluetooth habe ich es probiert und es hat auch bestens funktioniert; aus baulichen Gegebenheiten (Reichweite) muss ich aber auf die Bluetooth-Lösung verzichten.

    Mein Code funktioniert aber nicht; steckt sicher voller [Denk-]Fehler!?


    Bitte Denkanstösse zum Überprüfen warum da was nicht funktioniert.


  • Mein Code funktioniert aber nicht; steckt sicher voller [Denk-]Fehler!?

    Da hätten wir (ohne näheres Anschauen):


    - Einrückungen fehlen, für Python essenziell, bitte nachbessern.

    - os.system ist nicht mehr zu verwenden, steht auch in der Doku: https://docs.python.org/3.7/library/os.html#os.system

    - Schau' dir mal das deutlich schönere API gpiozero statt RPi.GPIO (veraltet, wird nicht mehr weiterentwickelt) an: https://gpiozero.readthedocs.io/en/stable/

  • Danke für die Tipps. Mit


    Code
    1. if call("ping -c 1 " + ip, shell=True) != 0:

    sollte ich jetzt weiter kommen!


    gpiozero ist sicher 'neuer' und 'stabiler, für meine Pille-Palle-Anwendung tut's aber auch noch das alte RPI.GPIO


    Die Einrückungen waren/sind 'drin' werden beim kopieren hier in den Code nicht übernommen bzw. ich hätte sie hier nach bearbeiten müssen (mea culpa).


    Mein Script 'läuft' aber trotzdem nicht. Mit welchen Befehlen (Linux-Anfänger; hatte mich gerade mühsam in Wheezy und Jessie rein gefummelt ... und kann jetzt mit Stretch wieder von vorne anfangen) krieg ich raus, warum nicht? Und 'stimmt' überhaupt die Logik meines Scripts?

  • Der Wink mit dem Zaunpfahl ist (endlich) angekommen :danke_ATDE:


    ...

    PingServer('192.168.1.7'): status.alice,

    }

    ...


    Wobei da ein Komma 'zu viel' ist, oder? Ändert aber nix dran, dass die Prozedur (?) PingServer mein kleines Projekt erheblich voranbringt!

    verstehe ich das richtig:

    die for-Schleife pingt alle 5 Min. die IP(s), wenn vorhanden/gefunden schaltet (in meinem Fall) Pin 23 für 1 Sek. durch/an? Welchen Pin muss ich denn für red/AUS angeben? Gar keinen?


    und, wie kriege ich es jetzt hin, dass das Script zwar wie oben (richtig?) alle 5 Min. pingt, bei TRUE die Tür öffnet, dann aber nicht alle 5 Min. erneut Pin 23 schaltet (da zu Hause), sondern erst wieder, wenn alle IPs für ne gewisse Zeit NICHT mehr gefunden werden? Da komme ich mit den angedachten und vorhandenen Schleifen überhaupt nicht klar.

    Einmal editiert, zuletzt von frodo ()

  • Wobei da ein Komma 'zu viel' ist, oder?

    Nope, ist ok (an der Stelle optional).


    verstehe ich das richtig:

    die for-Schleife pingt alle 5 Min. die IP(s)

    Nein, falsch verstanden. Mal davon abgesehen, dass das TIME.Sleep(5) time.sleep(5) heißen muss und 5 Sekunden und nicht 5 Minuten pausiert, wird es NICHT benötigt.


    Die for-Schleife ist eine einmalige Initialisierung, die jeweils eine PingServer-Instanz (PingServer ist eine Klasse, keine Funktion/Prozedur) einem LED-Paar zuweist.


    Code
    1. source_delay = 1

    Bedeutet, dass jede Sekunde der Wert des PingServers abgefragt wird, dein RELAIS-An geschaltet wird und dein RELAIS-Aus negiert geschaltet wird.


    Bindestiche sind in Python-Bezeichnern NICHT erlaubt!

    Welchen Pin muss ich denn für red/AUS angeben? Gar keinen?

    Wenn du keine LEDs verwendest, macht es keinen Sinn, eine LEDBoard- oder LED-Instanz zu verwenden. Das Prinzip der source/values Zuweisung funktioniert mit allen gpiozero-Klassen.


    und, wie kriege ich es jetzt hin, dass das Script zwar wie oben (richtig?) alle 5 Min. pingt, bei TRUE die Tür öffnet, dann aber nicht alle 5 Min. erneut Pin 23 schaltet (da zu Hause), sondern erst wieder, wenn alle IPs für ne gewisse Zeit NICHT mehr gefunden werden? Da komme ich mit den angedachten und vorhandenen Schleifen überhaupt nicht klar.

    Zum Beispiel mit einem "custom generator" (auf verlinkter Seite beschrieben).


    Eine einfache Implementierung für die in deinem Beispiel verwendete negated Funktion:

    Code
    1. def negated(values):
    2. for v in values:
    3. yield not v

    (https://github.com/RPi-Distro/…ter/gpiozero/tools.py#L30)


    Da kannst du nun beliebige Checks hinzufügen, ob eine bestimmte Zeit schon abgelaufen ist, wann ein Client das letzte mal reagiert hat usw. usw.

  • Wenn ich schon deine Geduld mit meinen Fehlern strapaziere, will ich auch zu einem Ergebnis kommen.


    Bin ich auf dem richtigen Weg mit der Klasse


    Code
    1. DigitalInputDevice(EventsMixin, InputDevice)


    und dem Parameter

    Code
    1. float bounce_time

    und, wenn ja, was muss ich denn in 'meiner' def_init für meine Zwecke angeben und wo im Script gehört das überhaupt hin?

    Ich seh schon ich muss mich erst mal in gpiozero richtig einlesen und auch einen Python-Grundkurs machen, sonst stochere ich ewig in meinem eigenen Nebel herum.

  • DigitalInputDevice = Digitales Eingabegerät. Die Eingabe ist bei dir aber der Ping, du brauchst nun ein "Ausgabe"Gerät. Ich müsste suchen, aber es gibt bestimmt eine Klasse für Relais...


    Was du genau mit deiner __init__ (Funktion oder Methode?) machen willst, habe ich nicht verstanden.