GPIO Status Mail

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo zusammen,

    leider muss ich hier ein Thema öffnen da ich nicht mehr weiterkomme.

    Das Projekt: Mailversand bei gpio Pegeländerung

    Was funktioniert bis jetzt: Mailversand über Konsole angeschoben klappt wunderbar

    Was macht Probleme: Das Script macht Probleme durch den der vor der Tastatur sitzt, leider fehlt mir die Programmiererfahrung.

    Hier ein Auszug wie ich es versucht habe

    #!/bin/bash

    # Den Pin als Eingang definieren
    echo "7" > /sys/class/gpio/export
    echo "in" > /sys/class/gpio/gpio7/direction

    # Den Zustand des Eingangs lesen
    previous=$(cat /sys/class/gpio/gpio7/value)

    # Endlose Schleife
    while true
    do
    # Den Zustand des Eingangs lesen
    pin=$(cat /sys/class/gpio/gpio7/value)

    # Wenn der Zustand geändert hat
    if [ $pin -ne $previous ]
    then
    mailnotify.sh "Jemand ist an der Haustüre" "Es hat geklingelt"


    previous=$pin
    sleep 0.5
    done

    Was möchte ich wissen: Ist das Script so richtig?
    Wenn ja was müsst Ihr wissen um eine Auskunft zu geben warum es bei mir nicht läuft.

  • pi@raspberrypi ~ $ sudo haustuer.sh
    /usr/local/bin/haustuer.sh: Zeile 4: echo: Schreibfehler: Das Gerät oder die Ressource ist belegt.
    /usr/local/bin/haustuer.sh: Zeile 21: Syntaxfehler beim unerwarteten Wort `fi'
    /usr/local/bin/haustuer.sh: Zeile 21: `fi'


    Was mache ich hier falsch

    while true
    do
    # Den Zustand des Eingangs lesen
    pin=$(cat /sys/class/gpio/gpio14/value)

    # Wenn der Zustand geändert hat
    if [ $pin -ne $previous ]
    then
    mailnotify.sh "Jemand ist an der Haustüre" "Es hat geklingelt"
    fi
    fi


    previous=$pin
    sleep 0.5
    done

  • 1. Das ist Bash und kein Python ;)
    2. Bitte benutz zukünftig den Code-Text, damit das Skript für uns leichter lesbar ist
    3. Du hast einen IF-Block, den du mit zwei 'fi' schließt
    4. Dein Konstrukt mit der while-Schleife ist ungünstig. Wenn jemand in der sleep Zeit an deiner Tür klingelt, bekommst Du das nicht mit. Eine mögliche Lösung wäre das ganze unter Python mit der RPi.GPIO-Bibilothek und Interrupts zu lösen. dbv hat dazu bereits ein Tutorial verfasst :)

  • Hallo Chris1705,

    ich habe nun das python script aus dem Tut. Leider bekomme ich das mit der Mail nicht in den Griff.


    Starten des Programmes in der Konsole

    pi@raspberrypi ~ $ sudo klingel.py
    Ich warte
    Schalter wurde gedrueckt, nun kann es weiter gehen
    /usr/local/bin/mailnotify.sh: 72: [: 1: unexpected operator
    Reading message body from STDIN because the '-m' option was not used.
    If you are manually typing in a message:
    - First line must be received within 60 seconds.
    - End manual input with a CTRL-D on its own line.

    Dies ist mein python script

    #!/usr/bin/python

    import RPi.GPIO as GPIO
    GPIO.setmode(GPIO.BCM)
    import os

    #setzen des GPIO 23 auf HIGH
    GPIO.setup(23, GPIO.IN,)
    try:
    #Das Programm wartet an der dieser Stelle so lange bis der Schalter
    #gedrueckt wurde und der GPIO 23 dadurch auf LOW wechselt
    print "Ich warte"
    GPIO.wait_for_edge(23, GPIO.FALLING)
    print "Schalter wurde gedrueckt, nun kann es weiter gehen"
    #code der jetzt kommt wird erst nach dem Schalterdruck ausgefuehrt
    os.system ("mailnotify.sh")
    except KeyboardInterrupt:
    GPIO.cleanup()
    GPIO.cleanup()


    warum startet er das mailnotfiy nicht?

  • 1. Setz bitt Code in die Code Tags
    2. Der Fehler ist in der mailnotify.sh, Poste diese mal, in code tags ;)

    Offizieller Schmier und Schmutzfink des Forum.
    Warum einfach wenn's auch schwer geht ?

    Kein Support per PN !
    Fragen bitte hier im Forum stellen. So hat jeder etwas davon.

  • Hier der code der mailnotify.sh

    [/code][code]
    #!/bin/bash

    # Sender of the mail
    SENDER="sender-mail-adresse"

    # Recipient of the mail
    RECIPIENT="empfänger-mail-adresse"

    # SMTP server
    SMTPSERVER="smtp.gmail.com"

    # User name on the SMTP server
    SMTPUSERNAME="mein-user"

    # Password on the SMTP server
    SMTPPASSWORD="meinpasswort"

    # Enable TLS for the SMTP connection
    USETLS=1

    ###################################################################
    # NORMALLY THERE IS NO NEED TO CHANGE ANYTHING BELOW THIS COMMENT #
    ###################################################################

    # Use first argument as mail subject
    if [ -n "$1" ]; then
    SUBJECT="$1"
    else
    # No subject specified
    SUBJECT=""
    fi

    # Use second argument as mail body
    if [ -n "$2" ]; then
    BODY="$2"
    else
    # No mail body specified
    BODY=""
    fi

    # Generate the options list for sendEmail
    OPTIONS=""

    if [ -n "${SMTPSERVER}" ]; then
    OPTIONS="${OPTIONS} -s ${SMTPSERVER}"
    fi

    if [ -n "${SMTPUSERNAME}" ]; then
    OPTIONS="${OPTIONS} -xu ${SMTPUSERNAME}"
    fi

    if [ -n "${SMTPPASSWORD}" ]; then
    OPTIONS="${OPTIONS} -xp ${SMTPPASSWORD}"
    fi

    if [ -n "${USETLS}" ]; then
    if [ ${USETLS} == 1 ]; then
    OPTIONS="${OPTIONS} -o tls=yes"
    else
    OPTIONS="${OPTIONS} -o tls=no"
    fi
    fi

    # Send the mail with sendEmail
    sendEmail -f ${SENDER} -t ${RECIPIENT} -u "${SUBJECT}" -m "${BODY}" ${OPTIONS}

    exit 0

  • 1. Was ist so schwer an eckigeklammerauf-c-o-d-e-eckigeklammerzu-enter-DeinProgrammcode-enter-eckigeklammerauf-schrägstrich-c-o-d-e-eckigeklammerzu zu verstehen? :s

    2. Ersetz doch die doppelten Gleichheitszeichen mal durch einfache.

  • Hallo, sorry wegen der codeklammern. Ich hatte die Vorschau übersprungen und nich gemerkt das ich den code nicht zwischen den Tags plaziert habe.

    @ bootsmann

    Ich habe mir die codeschnipsel nur zusammenkopiert da ich nicht wirklich programmieren kann! Das mailnotify läuft als standalone schon mal und die klingel.py läuft als standalone auch.

    Wenn du mir aber nen tip hadt oder ein tut weist würde ich den mail code noch in python probieren.

  • Hallo zusammen,

    habe es nun hinbekommen das eine Mail versandt wird, mit dem unten angehängten Code.
    Leider funktioniert dies nur wenn ich die 3,3V vom zum GPIO 23 unterbreche.
    Ich hatte versucht dies über "GPIO.wait_for_rising_edge(23, GPIO.FALLING)" zu ändern in dem ich das FALLING durch RISING ersetze aber dadurch ändert sich nichts.

    Wo liegt denn mein Fehler?

    Was dann meine nächste Frage ist, wie bekomme ich den Code im Hintergrund des Pi zum laufen. Dazu ist es aktuell noch so das der Code nur einmal durchläuft und dann das Programm beendet wir. Wie kann ich das denn lösen?


Jetzt mitmachen!

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