An PiFace angeschlossene LED blinken lassen

  • Hallo,


    folgendes Ausgangsszenario:


    An Output-Pin 2 meines PiFace-Moduls habe ich eine LED angeschlossen, die mir beim Betätigen eines Tasters anzeigt, ob Post im Briefkasten ist, oder nicht.


    Die LED leuchtet sechs Sekunden, wenn man den daneben angeordneten Taster betätigt.


    Hier die von mir vorgenommene Einträge in der doorpi.ini:



    Das zugehörige Shellskript "BriefkastenStatus.sh" setzt bei Vorliegen mindestens eines Einwurf die Datei "briefkastenstatus" auf true, was dann zum Einschalten der Status-LED gemäß "[virtual_InputPins]" führt.


    Soweit, so gut.


    Nun möchte ich gerne genau diese LED des PiFace-Moduls auch zur Anzeige des Status des Tagesriegels unserer Haustür nutzen. Dabei soll die LED so lange blinken, wie der Tagesriegel entsperrt ist. Den Zustand des Tagesriegels rufe ich über die HomeMatic ab. Das ist nicht das Problem. Mir geht es lediglich um die Umsetzung des Blinkens am entsprechenden Ausgang 2 des PiFace-Moduls. Habt ihr eine Idee, wie ich das am besten realisiert bekomme? Kann ich hierzu irgendwie den Schlüssel "is_alive_led" verwenden?


    Gruß,


    Thorsten

    • Offizieller Beitrag

    Möchtest du dieses Blinken aktiv kontrollieren? Ansonsten würde ich ein kleines Python Script im Hintergrund laufen lassen, dass alle x sec den Status von diesem "Tagesriegel" abruft und dazwischen ein Heartbeat Muster anzeigt.... Kenne aber den Begriff "Tagesriegel" jetzt auch nicht, vllt ist es was ganz anderes :D

  • Ein Tagesriegel ist so ein kleiner Hebel, der mit einem Haustürsummer zusammenwirkt und die Falle des Türschlosses freigibt oder sperrt. Hier ist das etwas besser beschrieben.


    Ich detektiere den Sperrzustand - wie in dem verlinkten Thread beschrieben - mit einem Mikroschalter und einem damit verbundenen HomeMatic-Modul und möchte nun, wenn der Tagesriegel entsperrt ist, eine LED im Briefkasten blinken lassen, und wenn er gesperrt ist, sie wieder ausschalten. Das Blinken deshalb, weil ich über dieselbe LED auch noch - wie oben beschrieben, den Zustand des Briefkastens mit einem Taster anzeigen lasse.


    Umgekehrt wäre es natürlich auch möglich. Sprich, die LED leuchtet konstant, wenn der Tagesriegel entsperrt ist, und sie blinkt für einige Sekunden, wenn nach dem Betätigen des Tasters Post im Briefkasten liegt.


    Am einfachste wäre es, wenn ich dazu den Schlüssel "is_alive_led" verwenden könnte, aber den nutze ich schon für das PiFace-Modul und ich weiß nicht, ob man ihn auch mehrmals in der doorpi.ini nutzen kann.


    Kann ich denn das von dir angesprochene Pythonskript zur Ansteuerung des PiFace-Ausgangs einfach durch ein Shellskript starten und stoppen? Müsste mir dann noch mal so ein kleines Pythonskript suchen, oder hast du da eine Quelle?

    • Offizieller Beitrag

    Hatte mir gerade nochmal deinen Thread DoorPi im Parallelbetrieb mit Siedle TLE 061-0 von dtp durchgelesen. In wie fern nutzt du da die is_alive_led besonders? Also wenn dort ein GPIO hinterlegt ist, legt DoorPi ein Event für Even und eines für Odd-Sekunden an und schaltet in diesem Event das GPIO high oder low.


    Sodele, ich hab dir mal was zusammen gesetzt. Dabei rufst du beim DoorPi OnStartup Event die Aktion LockState mit den Parametern pin, curl frequenz, ccu-ip, ise-uid auf.


    Du brauchst dafür eine Python-Bibliothek requests. Weiß ich nicht ob die standardmäßig installiert ist. Momentan wird die Serverresponse auf den Inhalt 'True' abgeglichen. Ich hab extra eine debug-Ausgabe reingesetzt, damit du gucken kannst was wirklich als response kommt und man das gegebenenfalls noch anpassen kann.


    Das ganze müsste evtl. noch in einen extra Thread gepackt werden - könnte sonst sein dass er dir DoorPi blockt (falls er das Event nicht async auslöst). Zumindest aber an das Ende des OnStartup-Events. Beendet wird die Aktion wenn DoorPi runtergefahren ist (_shutdown == True). Auch hier kann es sein, dass die shutdown-Variable erst gesetzt wird, wenn alle Threads beendet sind. Hier beißt sich dann etwas die Katz in den Schwanz :P


    Wie immer: Ich hab den Code hier nur ins Fenster getippt - es kann sein das Syntax-Fehler drin sind.

  • Puh, das klingt etwas kompliziert. ;) Aber trotzdem danke.


    Ich habe es aber schon mal geschafft, die am Ausgang 2 meines PiFace-Moduls angeschlossene LED mit diesem simplen Python-Skript zum Blinken zu bringen:


    Python
    from time import sleep
    import pifacedigitalio as p
    p.init()
    while(True):
         p.digital_write(2,1) #turn on      
         sleep(1)
         p.digital_write(2,0) #turn off
         sleep(1)

    Das Skript habe ich unter dem Namen "LedFlash.py" gespeichert. Auf der Konsole rufe ich es dann mit


    Code
     python LedFlash.py


    auf.


    Nun kommen aber ein paar Fragen auf.


    1. Kann ich das Skript in der doorpi.ini z.B. mit

    Code
    [virtual_InputPins]
    briefkastenstatus = out:Briefkasten-Status-LED,1,0,6
    tagesriegel = os_execute:/usr/local/etc/DoorPi/scripts/LedFlash.py

    starten, wenn "tagesriegel" auf true gesetzt wird?


    2. Falls das geht, wie stoppe ich das Skript wieder, wenn "tagesriegel" auf false gesetzt wird?


    3. "briefkastenstatus" und "tagesriegel" wirken auf dieselbe LED. Würde es funktionieren, dass die LED beim Setzen von "briefkastenstatus" auf true für sechs Sekunden dauerhaft leuchtet, um danach wieder weiterzublinken, wenn "tagesriegel" auf true steht?

    • Offizieller Beitrag

    Eigtl ist es doch relativ simpel. Das ganze in eine lock_state.py Datei im Ordner action ablegen und beim start ausführen ;)


    1) müsste gehen bzw. Normal noch einppython mit rein ;)

    2) du hast so halt keine Abbruchbedingung im Script. D.h. von extern wohl nur mit pkill -f nname-of-the-python-script in os_execute

    3) nja kannst ja im Event für den Taster erst dein Blink Script killen, dann dein Leuchten für 6sec auslösen (out_triggered) und anschließend dein Blinken wieder starten. Hast dabei dass Problem, dass du auf den Status Tagesriegel == False && Taster gedrückt nicht adäquat reagierst.

  • Danke auf jeden Fall für deine Hilfe, aber ich habe da jetzt eine Lösung gefunden, die ganz gut funktoiniert.


    Mit folgendem Shellskript im Verzeichnis /usr/local/etc/DoorPi/scripts/ rufe ich nun zwei Pythonskripte zum Starten des Blinkens und zum Ausschalten der LED auf.



    Das Skript fragt zunächst den Status einer Systemvariablen "EG Haustür SV Tagesriegel" meiner CCU ab. Ist der Status 1, dann wird das Pythonskript "TagesriegelLedFlash.py"


    Python
    # Pin 2 des PiFace-Moduls blinken lassen
    from time import sleep
    import pifacedigitalio as pfio
    pfio.init()
    while(True):
      pfio.digital_write(2,1) #LED an Pin 2 einschalten      
      sleep(1)
      pfio.digital_write(2,0) #LED an Pin 2 ausschalten
      sleep(1)

    im Hintergrund aufgerufen. Ist der Status 0, dann wird das Pythonskript wieder beendet, falls es noch laufen sollte, und das Pythonskript "TagesriegelLedOff.py"


    Code
    # Pin 2 des PiFace-Moduls ausschalten
    import pifacedigitalio as pfio 
    pfio.init()
    pfio.digital_write(2,0) #LED ausschalten


    ausgeführt.


    Hier noch der Vollständigkeit halber das auf der CCU laufende Skript zum Starten des obigen Shellskripts: