Script für ein Stressfrei Button

  • Guten Morgen alle zusammen,

    Ich brauche eure Hielfe!
    Undzwar will ich für unsere Firma einen Stressfreibutton installier. Funktion von diesem is:
    -Wenn butto unbetätigt zähle tage biss Button betätigt.
    -Wenn button betätigt gibt anzahl Tage auf BIldschrim aus wieviele Tage stressfrei waren.
    -Wenn button betätigt zähle tage biss Button unbetätigt wird.
    -Wenn button unbetätigt gib anzahl Tage auf Bildschrim áus wieviele Tage stress waren.
    -Und wenn es geht diese zeiten in einer Datei schreiben wo man nacher vergleichen kann wieviele Tage im Jahr waren Stressfrei und wieviele nicht.

    Danke schoneinmal im Vorraus!

    Edited once, last by p.klose (September 19, 2016 at 8:50 AM).

  • Du kannst dir das time Modul für Python mal ansehen... da hast du eigentlich alles drin was du brauchst um den Zeitpunkt des Buttondrucks bzw. die seit diesem Zeitpunkt vergangene Zeit ausrechnen zu können. Wenn das nicht reichen sollte, dann kannst du dir auch noch die datetime und calendar Module in Python ansehen.


  • Du kannst dir das time Modul für Python mal ansehen... da hast du eigentlich alles drin was du brauchst um den Zeitpunkt des Buttondrucks bzw. die seit diesem Zeitpunkt vergangene Zeit ausrechnen zu können. Wenn das nicht reichen sollte, dann kannst du dir auch noch die datetime und calendar Module in Python ansehen.

    Danke schoeinaml für den Tipp
    Werde mir das mal genauer anschauen

  • Deine Beschreibung ist etwas verwirrend. Biss und unbetätigt sowie kurz und abgehackte Beschreibung...

    Du hast also einen Button mit Beschriftung " STRESS ". Sobald dieser gedrückt wird, gibts Stress in eurer Firma ?
    Es handelt sich zudem um einen Taster oder einen Schalter? Also bleibt er gedrückt oder released er nach Betätigung?

    Dann merk dir einfach im Script den Tag wann gedrückt wurde.
    Also angenommen du installierst das Heute und am Donnerstag wird der Button gedrückt... Dann merkt sich das Script einfach den Tag an dem es gestartet wurde = 19.09 und wann der Button gedrückt wurde = 22.09 und rechnet dann ein bisschen rum. Wird der Button dann wieder gelöst merkt sich das Script dies usw.
    Die Daten würde ich in eine Datenbank schreiben, das wäre "rebootsicher" und einfacher zu handhaben - SQLite reicht. Beachten musst du nur das du mit Kalendertage rechnen musst, weil sonst rechnest du 05 minus 19 ... 05.10 - 19.09


  • Deine Beschreibung ist etwas verwirrend. Biss und unbetätigt sowie kurz und abgehackte Beschreibung...

    Du hast also einen Button mit Beschriftung " STRESS ". Sobald dieser gedrückt wird, gibts Stress in eurer Firma ?
    Es handelt sich zudem um einen Taster oder einen Schalter? Also bleibt er gedrückt oder released er nach Betätigung?

    Dann merk dir einfach im Script den Tag wann gedrückt wurde.
    Also angenommen du installierst das Heute und am Donnerstag wird der Button gedrückt... Dann merkt sich das Script einfach den Tag an dem es gestartet wurde = 19.09 und wann der Button gedrückt wurde = 22.09 und rechnet dann ein bisschen rum. Wird der Button dann wieder gelöst merkt sich das Script dies usw.
    Die Daten würde ich in eine Datenbank schreiben, das wäre "rebootsicher" und einfacher zu handhaben - SQLite reicht. Beachten musst du nur das du mit Kalendertage rechnen musst, weil sonst rechnest du 05 minus 19 ... 05.10 - 19.09

    Es handelt sich um einen Schalter, dieser auch nur mir einem extra Schlüssel wieder geöffnet werden kann.

    genau so soll es laufen.
    Leider habe ich keine bzw. geringe erfahrungen mit der Python programmierung, und wie ich jetzt am besten das Datum speichern soll und dieses dann mit der 2. Vergleichen.
    Gibt es da irgentwie beispiele wo man sich das mal anschauen kann oder so?


  • -Wenn button betätigt zähle tage biss Button unbetätigt wird.

    Das habe ich auch noch nicht verstanden... Vielleicht machst du dir ja doch nochmal die Mühe und versuchst es uns in ganzen Sätzen mit passender Rechtschreibung näher zu bringen. Woher weiß der Button 'biss er unbetätigt wird'?

    Für mich liest sich das nach einem Schalter der auf 'Voll der Stress hier' geschaltet wird und dort bleibt bis man ihn wieder auf 'Kein Stress mehr' schaltet, nicht nach einem Button.


    Gibt es da irgentwie beispiele wo man sich das mal anschauen kann oder so?

    Etwas Eigeninitiative wirst du schon aufbringen müssen. Und ja, das Netz ist voll von Beispielen zu dem Thema...

    Edited once, last by doing (September 19, 2016 at 10:09 AM).

  • Ich habe jetzt schon mein Script soweit das ich wenn der betätigt / unbetätigt ist ich mir den wert in einer .txt datei schreibe
    wie bekomme ich das in python hin das man sich jetzt die Werte aus den .txt Datein im selben script wieder öffnen und den aktuellen wert Minus den Vorherigen wert errechen kann

  • Zunächst mal würde dein Script nur ein mal laufen, nach Starten wird es also quasi sofort wieder beendet.

    Deine Einrückungen (Abstand von links) sind auch etwas übertrieben - man verwendet normalerweise 4 Leerzeichen.

    Desweiteren setzt du zwar Variablen wie "a", nutzt diese aber nicht zum schreiben in die txt. Eine Textdatei zu verwenden halte ich aber eher für schlecht da der Umgang unnötig schwierig wird sobald da mehr als nur ein Wert drin steht.
    Heutztage nutzt man auch eher das "with" Statement da sich dieses selbstständig ums schließen kümmert. Und am besten auch Variable Sachen wie den GPIO-Pin in einer Variable festlegen sodass man später nicht 20 Zeilen des Codes anpassen müsste

    [code=php]
    #!/usr/bin/env python
    import RPi.GPIO as GPIO
    import time

    pin=10

    GPIO.setmode(GPIO.BCM)
    GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    while True:
    time.sleep(0.1)
    a=time.strftime("%j")
    if GPIO.input(pin) == 1:
    with open("stresstage.txt", "w") as f:
    f.write(a)
    print a, GPIO.input(pin)
    elif GPIO.input(pin) == 0:
    with open("stressfreietage.txt", "w") as f:
    f.write(a)
    print a, GPIO.input(pin)
    [/php]Das Problem hierran wäre aber, dass wenn der GPIO nicht HIGH ist, permanent in die Datei geschrieben werden würde und das eine extreme Belastung für die SD bedeuten würde - die aber nicht unendlich viele Schreibzugriffe verträgt. Hier solltest du also besser ein Flag verwenden um sicherzustellen das nicht ständig in die Datei geschrieben wird.
    Besser wäre jedoch einen Interrupt zu verwenden, weil dann eine selbst definierte Funktion nur dann ausgeführt wird wenn ein Flankenwechsel stattfindet, also ein Wechsel von LOW auf HIGH oder von HIGH auf LOW. Das obige Script nutzt die sog. Polling Methode und ist umständlicher/ungenauer. Siehe dazu: FAQ => Nützliche Links / Linksammlung => Interrupt


    Du solltest dir aber wie ich finde auch erst noch Gedanken darüber machen Womit du das ganze darstellen möchtest, also welche Oberfläche du zur Visualisierung nutzen willst. Am besten irgend etwas in Python wie zum Beispiel eine GUI mithilfe von Tkinter / Pygame, oder eine WebUI... Das wiederum wäre davon abhängig ob direkt am Pi ein Monitor/Display angeschlossen wäre oder die Darstellung über einen bereits vorhandenen PC erfolgen soll zB über einen normalen Webbrowser...
    Wenn du das soweit weißt kannst du daher gehen und auf dieser Basis den weiteren Code aufbauen.

  • p.klose
    Zum bereits Erwähnten `with`Statement ist noch zusagen, dass auf Modulebene nichts ausser Konstanten, Klassen und/oder Funktionen zu stehen haben. Des Weiteren würde ich einen Blick in die Doku von ``gpiozero`` werfen, da dieses Modul anfängerfreundlicher ist. Zudem sei noch erwähnt, dass es eigentlich:

    Python
    from RPi import GPIO

    anstelle von

    Code
    import RPi.GPIO as GPIO

    lauten sollte, da sonst doppelt gemoppelt wird.

    Auch deine Namenswahl ist nicht gut, denn was soll `a` & `b` dem Leser aussagen??

    https://gpiozero.readthedocs.io/en/v1.3.1/api_input.html#button
    https://gpiozero.readthedocs.io/en/v1.3.1/note…-script-running

  • Der Code von bootsmann würde wie folgt dem bisherigen Versuch von p.klose entsprechen:

    [code=php]
    #!/usr/bin/env python
    from gpiozero import Button
    from signal import pause

    def stressig():
    print "Stress!"
    dayOfYear=time.strftime("%j")
    with open("stresstage.txt", "w") as f:
    f.write(dayOfYear)

    def stressfrei():
    print "Kein Stress mehr!"
    dayOfYear=time.strftime("%j")
    with open("stressfreietage.txt", "w") as f:
    f.write(dayOfYear)

    def main():
    try:
    button = Button(21, pull_up=True)
    button.when_pressed = stressig
    button.when_released = stressfrei
    pause()
    except KeyboardInterrupt:
    pass
    finally:
    button.close()

    if __name__ == '__main__':
    main()
    [/php]

    Ich denke so lässt sich ein Vergleich am besten verstehen. Das Script macht fast das gleiche wie das aus Beitrag#11 nur schöner und übersichtlicher

    Problem wäre nur das hier in diesem Fall ja ein Schalter genutzt wird, kein Taster..... Solange der Schalter betätigt ist wird auch soweit ich das sehe ständig in die stresstage.txt geschrieben - aber ich könnte mich auch irren, hab mit gpiozero noch nicht viel gemacht :blush:

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!