Temperatursensor auslesen und email senden

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

    ich habe mit meinem Raspberry nach dieser Anleitung hier einen DHT22 Temperatursensor installiert.

    die Abfrage des Sensors in telnet mache ich im Veteichniss "lol_dht22" mit
    sudo ./loldht 7

    die Ausgabe wäre dann in etwa:
    Raspberry Pi wiringPi DHT22 reader
    http://www.lolware.net
    Data not good, skip
    Humidity = 57.60 % Temperature = 20.40 *C

    Ich würde gerne ein script basteln das mir z.b. alle 5min die Temperatur und Luftfeuchtigkeit abfrägt und wenn die Luftfeuchtigkeit über 50% ist eine email an meine Adresse sendet.

    Hat jemand eine Idee wie das zu machen wäre?

    Danke schonmal

    MFG Rooki

  • Alles was du dazu brauchst findest du hier im Forum.
    Die Themen wurden schon zig mal abgehandelt.

    1. Sensor auslesen per Script
    2. Mittels grep und awk die Luftfeuchte aus dem String extrahieren.
    3. Prüfen ob der Wert > 50
    4. Wenn ja mail senden.

    Alles in allem werden das so ca. 10 Zeilen Code werden.

    Such ein wenig, du wirst fündig werden.
    Dabei wirst du auch lernen und verstehen.
    Das ist besser als dir jetzt ein fertiges Script vor die Füße zu schmeissen.

    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.

  • Hi,

    ich habe jetzt mal zum testen
    [code=php]#!/bin/bash
    cd /home/pi/lol_dht22
    WERTE=$(sudo ./loldht 7 | grep "Pin = 7")
    Temp=( $(echo $WERTE | awk '{ print $ 10}'))
    Hum=( $(echo $WERTE | awk '{ print $ 6}'))
    [/php]

    Nach dem Start des scripts passiert allerdings gar nichts.

    Gruß Rooki


  • Hi,

    ich habe jetzt mal zum testen

    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.

  • Hi leider nicht.

    Hier das script:
    [code=php]#!/bin/bash
    cd /home/pi/lol_dht22
    WERTE=$(sudo ./loldht 7 | grep "Pin = 7")
    Temp=( $(echo $WERTE | awk '{ print $ 10}'))
    Hum=( $(echo $WERTE | awk '{ print $ 6}'))

    echo $Temp
    echo $Hum[/php]

    Es ist imho aber auch noch kein Sensor angeschlossen, kann das damit etwas zu tun haben.?

    Im Pilight Webinterface funktioniert es z.B. es kommt halt Temperatur 0 und Luftfeuchtigkeit 0

    Ich dachte ich könnte so mal trocken probieren.

    Gruß Rooki

  • Dann scheint etwas mit dem DHT22 nicht zu passen und es können keine Daten ausgelesen zu werden.

    Deshalb wird das Script nicht so plump aussehen können sondern muss etwas umfassender werden.

  • Hier:

    [code=php]pi@raspberrypi ~/lol_dht22 $ cd ..
    pi@raspberrypi ~ $ sudo /home/pi/lol_dht22/loldht 7
    Raspberry Pi wiringPi DHT22 reader
    http://www.lolware.net
    Data not good, skip
    Data not good, skip
    Data not good, skip
    Data not good, skip
    Data not good, skip
    Data not good, skip
    Data not good, skip
    Data not good, skip
    Data not good, skip
    Data not good, skip
    [/php]

    Naja, wie in Beitrag 5 von mir erwähnt, habe ich den noch nicht angeschlossen weil mir noch der Widerstand und die Platine fehlt. Ich wollte einfach schonmal "trocken" vorarbeiten.

    Gruß Rooki

    Einmal editiert, zuletzt von rooki_1 (4. Januar 2015 um 16:21)

  • Versuch es mal damit:
    [code=php]
    #!/bin/bash

    while true; do
    WERTE=$(sudo /home/pi/lol_dht22/loldht 7 | grep Humidity)
    # Humidity = 57.60 % Temperature = 20.40 *C
    [[ ! -z "$WERTE" ]] && break
    echo "Konnte keine Werte auslesen, Wiederholung in 5 Sekunden"
    sleep 5
    done

    Hum=$(echo $WERTE | awk {'print $3'})
    Temp=$(echo $WERTE | awk {'print $7'})

    echo "Humidity: $Hum"
    echo "Temperature: $Temp"
    [/php]

    //EDIT: awk muss natürlich auch passen...

    Von dir:
    [code=php]WERTE="Humidity = 57.60 % Temperature = 20.40 *C"
    Temp=( $(echo $WERTE | awk '{ print $ 10}'))
    Hum=( $(echo $WERTE | awk '{ print $ 6}'))
    echo "Humidity: $Hum"
    echo "Temperature: $Temp"
    [/php]..funktioniert nicht..

    Korrigiert man das so wies richtig wäre:
    [code=php]
    WERTE="Humidity = 57.60 % Temperature = 20.40 *C"
    Hum=$(echo $WERTE | awk {'print $3'})
    Temp=$(echo $WERTE | awk {'print $7'})
    echo "Humidity: $Hum"
    echo "Temperature: $Temp"
    [/php]..kaum macht mans richtig ..geht das.. :D

  • Ja der awk Befehl war auch falsch - keine Ahnung wo du den her hattest... Siehe Beitrag #10


    Und Btw wenn sich das Script die ganze Zeit im Kreis dreht kann der Sensor nicht ausgelesen werden. Dann solltest du mal den Anschluss prüfen und sicherstellen das der Data-Pin auch an wiringPi-Pin-7 bzw GPIO-4 angeschlossen ist


  • Es ist imho aber auch noch kein Sensor angeschlossen, kann das damit etwas zu tun haben.?

    Moin,

    in dem Fall wird loldht unendwegt ausgeführt.
    loldht fragt solange den GPIO ab bis ein Wert geliefert wird und blockiert weitere Abfragen des Sensors.
    Vergiss den Widerstand, geht auch ohne.

    Pi 3,3 Volt an VCC
    Pi GPIO an DATA
    0/Ground an GND

    Sollten keine Werte vorliegen, ist es ratsam mit erneuten Abfrage den vormaligenAbfrageprozess zu killen:

    Code
    ....
    killall -q loldht
    ....

    Bye

    Jürgen

  • Hi,

    also mit diesem script
    [code=php]#!/bin/bash
    cd /home/pi/lol_dht22
    WERTE="Humidity = 57.60 % Temperature = 20.40 *C"
    Hum=$(echo $WERTE | awk {'print $3'})
    Temp=$(echo $WERTE | awk {'print $7'})
    echo "Humidity: $Hum"
    echo "Temperature: $Temp" [/php]

    schreibt er mir jetzt:
    [code=php]pi@raspberrypi /scripte $ ./temp1.sh
    Humidity: 57.60
    Temperature: 20.40
    [/php]
    das ist wohl für meine Trockenübung ok. Wenn ich den Sensor angeschlossen habe muss ich was ändern?

    Sorry aber ich bin da noch nicht so drinn? Schön wäre wenn du die einzelnen Zeilen noch erklären könntest. Ich möchte das ja auch verstehen.

    Gruß Rooki

  • Hm hab ich das nur überlesen dass du noch gar kein DHT22 angeschlossen hast? :-/

    Erklärung:
    [code=php]#!/bin/bash[/php]
    Der Shebang

    [code=php]while true; do[/php]
    while Schleife starten. Dreht sich solange im Kreis bis es mit break unterbrochen wird.

    [code=php] WERTE=$(sudo /home/pi/lol_dht22/loldht 7 | grep Humidity)[/php]
    Das innerhalb $( ) wird ausgeführt und die Ausgabe in die Variable WERTE hinterlegt.
    Es wird also die Binary loldht mit dem Parameter 7 ausgeführt und die Ausgabe durch eine Pipe ( | ) an grep übergeben, welches nur die Zeile in der Humidity enthalten ist anzeigt.

    [code=php] [[ ! -z "$WERTE" ]] && break[/php]
    Das Ausrufezeichen bedeutet: NICHT
    -z bedeutet: wenn Variable leer
    && bedeutet dass das nachfolgende nur ausgeführt wird wenn das vorherige erfolgreich bzw zutrifft.
    Wenn also $WERTE NICHT leer ist, dann führe break aus, was in diesem Fall bewirkt das die while-Schleife unterbrochen wird.

    [code=php] echo "Konnte keine Werte auslesen, Wiederholung in 5 Sekunden"[/php]
    Falls die Schleife weiter ausgeführt wird, wird diese echo Zeile ausgegeben.

    [code=php] sleep 5[/php]
    Die Schleife wird für 5 Sekunden pausiert bis sie wieder von Vorne anfängt.

    [code=php]done[/php]
    while-Schleife wird geschlossen.

    [code=php]Hum=$(echo $WERTE | awk {'print $3'})[/php]
    Wenn while-Schleife beendet wurde folgenden die nächsten Zeilen. Programme werden immer von oben nach unten abgearbeitet.
    $WERTE ausgeben, an awk pipen und das 3.Argument ausgeben
    Argumente sind durch Leerzeichen getrennt. $1 ist das erste Argument, $2 das zweite usw.

    ...der Rest sollte klar sein...

  • Moin,

    da loldht IMMER solange ackert, bis ein Wert vorliegt kann die while Schleife gleich für die Auswertung herangezogen werden.
    $Hum < 50
    exit

    $Hum > 50
    break
    Und Übergabe an mailer (muss gegebenenfalls nachinstalliert werden) z. B.:

    sudo mail -s Luftfeuchte-hoch DEINACCOUNT@MAILSERVER.DE

    Als mail-body können weitere Daten oder sogar Anhänge übergeben werde, wie Datum/Uhrzeit/Wert Hum. u.s.w.

    Bye

    Jürgen

    Einmal editiert, zuletzt von rpivpn (4. Januar 2015 um 20:54)

  • Moin,

    also erstmal herzlichen Dank meigrafd für die detailierte Beschreibung, das hat mir schon mal sehr geholfen.

    Ich habe jetzt mal so probiert:
    [code=php]#!/bin/bash
    MAXtemp=35
    MAXhum=50
    cd /home/pi/lol_dht22
    WERTE="Humidity = 51.6 % Temperature = 20.40 *C"
    Hum=$(echo $WERTE | awk {'print $3'})
    Temp=$(echo $WERTE | awk {'print $7'})
    echo "Humidity: $Hum"
    echo "Temperature: $Temp"
    if [ "$Hum" -gt "$MAXhum" ]; then
    echo "jetzt E-mail senden"
    fi
    [/php]

    Ausgabe ist:
    [code=php]pi@raspberrypi /scripte $ ./temp1.sh
    Humidity: 51.6
    Temperature: 20.40
    ./temp1.sh: Zeile 10: [: 51.6: Ganzzahliger Ausdruck erwartet.
    pi@raspberrypi /scripte $
    [/php]
    Wenn ich die Zeile
    [code=php]WERTE="Humidity = 51.6 % Temperature = 20.40 *C"[/php]
    in
    [code=php]WERTE="Humidity = 51 % Temperature = 20.40 *C"[/php]
    ändere, funktioniert schonmal das echo "jetzt e-mail senden"

    Ich denke, das Problem ist, dass durch die " nach WERTE die Variable als Text deklariert wird, wobei die Zeile bei angeschlossenem Sensor ja so aussieht:
    [code=php]WERTE=$(sudo /home/pi/lol_dht22/loldht 7 | grep Humidity) [/php]
    bitte berichtigt mich wenn ich falsch liege.
    Dann könnte ich jetzt versuchen die e-mail Geschichte mit Leben zu füllen.

    rpivpn: welchen mailer würdest du empfehlen?

    Gruß Rooki

    Einmal editiert, zuletzt von rooki_1 (5. Januar 2015 um 06:41)

  • Hi,

    ich habe mal weitergebastelt. Folgendes script funktioniert schon mal:
    [code=php]#!/bin/bash
    #Mail Einstellungen
    SMTPFROM='pi@anbieter.de' #Absender
    SMTPTO='add@anbieter.de' #Empfänger
    SMTPSERVER='mail.anbieter.de' #SMTP-Server
    SMTPUSER='meinuser' #Benutzer
    SMTPPASS='passwd' #Passwort
    # CONFIG - END
    SUBJECT="Luftfeuchtigkeit ist zu hoch!"
    MESSAGE="Die Luftfeuchtigkeit im Wohnzimmer beträgt =$Hum bitte lüften"
    #Sensor Variablen
    MAXtemp=35
    MAXhum=50
    # End
    cd /home/pi/lol_dht22
    WERTE="Humidity = 51 % Temperature = 20.40 *C"
    Hum=$(echo $WERTE | awk {'print $3'})
    Temp=$(echo $WERTE | awk {'print $7'})
    echo "Humidity: $Hum"
    echo "Temperature: $Temp"
    if [ "$Hum" -gt "$MAXhum" ]; then
    echo "E-Mail wird verschickt"
    sendEmail -f $SMTPFROM -t $SMTPTO -u $SUBJECT -m $MESSAGE -s $SMTPSERVER -xu "$SMTPUSER" -xp "$SMTPPASS"
    fi
    [/php]

    was noch nicht funktioniert, die Variable "Hum" (gemessener Wert) sollte in der Message erscheinen.

    Wäre es sinnvoll eine art Timestamp anzulegen und die e-mails auf 5 pro Tag zu begrenzen?
    Wenn die Luftfeuchtigkeit zu hoch ist, mein cronjob z.b. alle 5min läuft, bekomme ich ja evtl. alle 5min eine mail.

    Nachtrag zur Installation von sendemail: ich musste in der
    [code=php]/usr/share/perl5/IO/Socket/SSL.pm[/php]

    die Zeile 1490
    [code=php]m{^(!?)(?SSL(?:v2|v3|v23|v2/3))|(TLSv1[12]?))$}i[/php]

    in
    [code=php]m{^(!?)(?SSL(?:v2|v3|v23|v2/3))|(TLSv1[12]?))}i[/php]

    ändern.

    Gruß Rooki

    Einmal editiert, zuletzt von rooki_1 (5. Januar 2015 um 08:55)


  • if [ "$Hum" -gt "$MAXhum" ]; then

    MESSAGE="Die Luftfeuchtigkeit im Wohnzimmer beträgt =$Hum bitte lüften"

    sendEmail -f $SMTPFROM -t $SMTPTO -u $SUBJECT -m $MESSAGE -s $SMTPSERVER -xu "$SMTPUSER" -xp "$SMTPPASS"

    Moin,

    mit "$Hum" -gt "$MAXhum" wird das so nix, da der Sensor zu 99,99999 % keine ganze Zahl ermitteln wird.
    $Hum muss somit vorher bearbeitet/gerundet werden oder mit | bc (Ausgabe 1 / 0) "berechnet" werden.

    Sofern Du 50% rel. Luftfeuchtigkeit als Schwellenwert verwendest, bei einem bewohnten Raum, wirst Du den ganzen Tag über mit Mails zugemüllt, das ist praxisfremd.


    Zum Mailversand, welchen Mailhoster nutzt Du (GMX/Google/WEB.DE...)?
    Viele nutzen SSL/TLS!!!!

    Ssmtp ermöglicht den Transport zum Mailhoster und alle Zugangsdaten können in /etc/ssmtp/ssmtp.conf hinterlegt werden.
    Beispiel GMX:

    Ich bevorzuge heirloom-mailx um mails von der Commandozeile abzusetzen und mpack um Anhänge zu versenden.
    Das ganze bleibt übersichtlich, da ssmtp die Zugangsdaten aus der ssmtp.conf abruft und heirloom-mailx mailbody und Betreff befüllt.

    Ssmtp und heirloom-mailx benötigen nur ca. 2 MB

    Zudem kannst Du den DHT22 ohne Widerstand betreiben und gleich mit reellen Daten arbeiten.

    Bye

    Jürgen

    PS.:
    Geht es dir um Wohlfühlklima (ca. 40 - 65%) oder Schimmelprevention?
    Bei Schimmelprevention musst Du den Taupunkt und die Aussen.-Temp./Luftfeuchtigkeit im Auge behalten.

    Einmal editiert, zuletzt von rpivpn (5. Januar 2015 um 13:07)


  • mit "$Hum" -gt "$MAXhum" wird das so nix, da der Sensor zu 99,99999 % keine ganze Zahl ermitteln wird.
    $Hum muss somit vorher bearbeitet/gerundet werden oder mit | bc (Ausgabe 1 / 0) "berechnet" werden.

    Genau.

    Mach es deshalb mal so:

    Voraussetzung installieren:

    Code
    sudo apt-get install bc

    Script:

    Spoiler anzeigen

    [code=php]
    #Mail Einstellungen
    SMTPFROM='pi@anbieter.de' #Absender
    SMTPTO='add@anbieter.de' #Empfänger
    SMTPSERVER='mail.anbieter.de' #SMTP-Server
    SMTPUSER='meinuser' #Benutzer
    SMTPPASS='passwd' #Passwort
    SMTPTLS=1
    SUBJECT="Luftfeuchtigkeit ist zu hoch!"
    MESSAGE="Die Luftfeuchtigkeit im Wohnzimmer beträgt =$Hum bitte lüften"
    #Sensor Variablen
    MAXtemp=35
    MAXhum=50
    # CONFIG - END

    WERTE="Humidity = 51.12 % Temperature = 20.40 *C"
    Hum=$(echo $WERTE | awk {'print $3'})
    Temp=$(echo $WERTE | awk {'print $7'})
    echo "Humidity: $Hum"
    echo "Temperature: $Temp"

    if [ "$(echo "$Hum > $MAXhum" | bc)" == 1 ]; then
    echo "E-Mail wird verschickt"
    if [ -n "$SMTPTLS" ] && [ $SMTPTLS == 1 ]; then
    sendEmail -f $SMTPFROM -t $SMTPTO -u $SUBJECT -m $MESSAGE -o tls=yes -s $SMTPSERVER -xu "$SMTPUSER" -xp "$SMTPPASS"
    else
    sendEmail -f $SMTPFROM -t $SMTPTO -u $SUBJECT -m $MESSAGE -s $SMTPSERVER -xu "$SMTPUSER" -xp "$SMTPPASS"
    fi
    fi
    [/php]

    bc kann mit ungeraden Zahlen umgehen und ist allgemein sehr mächtig.

    Was die if Schleife macht ist quasi zu prüfen ob die Bedingung "51.12 größer als 50" ist an bc zu übergeben und wenn das zutrifft eine 1 aus, wenn nicht eine 0

    Beachte auch meine kleine Anpassung bezüglich SMTPTLS , was das Anliegen von rpivpn deckt.
    Das scheinst du aber ja auch aus einer meiner Scripts kopiert zu haben - stand da nicht auch SMTPTLS mit drin? :fies:


    PS: Interessiert dich eigentlich nur die Luftfeuchtigkeit oder auch die Temperatur? Denn eigentlich gehört das ja zusammen ;) Im Winter z.B. ist die Luft trockener, im Sommer aber feuchter - weswegen es oft nicht sooo gut ist im Sommer übermäßig viel zu lüften, und zB im Keller zu Schimmel führen kann (ist wirklich so, im Sommer steigt die Gefahr für Schimmel)

Jetzt mitmachen!

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