Raspberry Pi – Raumtemperatur überwachen

pi-logo_1Nachdem der Kleinstcomputer Raspberry Pi mittlerweile doch schon einige Zeit auf dem Markt ist, habe ich mich jetzt endlich mal dazu entschieden mir dieses kleine feine Spielzeug zu bestellen. Für alle die den Raspberry Pi nicht kennen: Es handelt sich dabei um einen scheckkartengroßen Einplatinen-Rechner mit einer ARM-CPU als Herzstück. Diese ist mit 700 MHz getaktet und hat beim Raspberry Pi in der Version B 512MB RAM zur Verfügung. In der Version 3 Model B ist diese mit 4x 1,2 GHz getaktet und bietet 1GB RAM.

Interessant macht den Raspberry Pi v.a. auch die vielen Anschlussmöglichkeiten, wie USB, HDMI, Ethernet, etc. Als Betriebsystem kommt in meinem Fall Raspbian zum Einsatz, was nichts anderes ist, als ein Debian-Derivat für Raspberry Pi mit ARM-Unterstützung. Was gibt es besseres, als ein Linux auch auf solch einer Plattform? 😉

Nicht vergessen sollte man aber die GPIO-Schnittstelle, die dem Kleinstcomputer IO-Möglichkeiten, wie bei einem Microcontroller verpasst. Sehr toll für Bastel-Projekte mit Standardbauteilen, wie sie in diesem Beitrag auch beschrieben werden. Wie der Titel dieses Beitrags bereits ankünditgt: Mit Hilfe des Raspis (so wird der kleine Computer von der Community liebevoll genannt) soll die Raumtemperatur überwacht werden.
Einsatzzweck im Detail: Ein Serverraum soll insofern überwacht werden, dass die Raumtemperatur nicht über eine gewisse Solltemperatur steigt. Steigt sie dennoch über einen Schwellenwert, ist dies das Indiz für den Ausfall der Klimaanlage.

Also die Aufgabenstellung nochmal im Detail:

  • Überwachung der Temperatur im Serverraum.
  • Bei Überschreiten eines gewissen Schwellenwertes (bei mir 30°C) soll eine Meldung abgesetzt werden.
  • Bleibt die Temperatur unter 30°C wird die aktuelle Temperatur mit Datum und Uhrzeit geloggt.

Mit dem Raspberry Pi nicht weiter tragisch, wir benötigen dazu folgende Komponenten bzw. Software:

  • 1-Wire-Temperatursensor DS18B20, z.B. bei Reichelt für 1,60€ pro Stück oder 5Stk. bei Amazon (oder gleich komplett mit Kabel).
  • Einen 4k7 Widerstand (4,7 kOhm) für ca. 11 Cent als Pullup-Widerstand am 1-Wire-Bus (siehe Datenblatt Seite 9).
  • Ein paar Kabel (z.B. Jumperkabel), genau genommen 3 Stück (Ein Set mit Breadboard ist evtl. hilfreich, wenn man öfters mal was probieren will).
  • Schrumpfschlauch nach Belieben.
  • Shellskript zum Loggen der Temperatur und zum Verschicken der Fehlermeldung.DS18B20_1

Nachdem ich also meine Bestellung bei Reichelt aufgegeben hatte, war diese auch schon zwei Tage später bei mir und ich konnte die ersten Tests fahren. Dazu baute ich mir die Schaltung mit einem Steckboard (auch Breadboard) auf. Wer also keine Lötkenntnisse hat, kann auch so problemlos experimentieren, da alle Verbindungen lediglich gesteckt werden (mit Steckbrücken bzw. mit Jumper-Kabel).

Um die Schaltung aufbauen zu können, müssen wir natürlich wissen, wie die Pins des Sensors belegt sind. Diese Info finden wir im Datenblatt, auf der ersten Seite und Beschreibt sämtliche Gehäuseformen. Hier dargestellt, die Belegung unseres Sensors: Pin 1 = Ground, P2 = Datenleitung und P3 = Versorgungsspannung.

Nach dem Datenblatt Seite 9, wissen wir auch, dass der 1-Wire-Bus einen Pullup-Widerstand zwischen Datenleitung und Versorgungsspannung benötigt. Dieser Widerstand soll etwa 5 kOhm betragen, wie setzen also besagten 4,7 kOhm Widerstand ein. Nachfolgend nochmal das Schaltbild aus dem Datenblatt.

DS18B20_Widerstand

Alles zusammengesteckt ergibt sich bei mir ein Aufbau wie im nachfolgenden Bild zu sehen. Der Pin 1 des Raspberry Pis (links oben) führt die +3,3 V Versorgungsspannung und muss mit dem Pin 3 (Vdd) des Temperatursensors verbunden werden. Der dritte Pin von oben auf der rechten Seite ( Pin 6) ist der Ground-Pin des Raspis und wird mit dem Pin 1 (GND) des Sensors verbunden. Als letzten muss noch die Datenleitung verbunden werden, dies erfolgt mit Pin 7 (GPIO 4) des Raspis und Pin 2 (DQ) des Sensors. Nicht zu vergessen natürlich der 4k7-Widerstand zwischen VDD und DQ.

schaltung_raspi_temp

Ist alles richtig aufgebaut, starten wir den Pi und widmen uns der Software. Um den Temperatursensor überhaupt auslesen zu können, müssen wir die entsprechenden Kernelmodule laden. Die beiden benötigten Module sind bei Raspbian bereits an Board und müssen nur geladen werden. Zum einen brauchen wir das Modul w1-gpio, dieses Modul macht den GPIO 4 (Pin 7) zum 1-Wire-Bus. Das zweite Modul macht es uns möglich über den 1-Wire-Bus Temperaturen auszulesen: w1-therm.

— Update 21.09.2016 —

DIe Kernel-Module werden nicht mehr geladen, sondern über den Device-Tree eingebunden (danke für den Hinweis in den Kommetaren unten!):

In die Datei /boot/config.txt nachfolgende Zeilen eintragen:

# activating 1-wire with pullup
dtoverlay=w1-gpio-pullup

Zusätzlich kann noch gleich eine Debugging-Funktion aktiviert werden (zusätzlicher Eintrag in /boot/config.txt):

# activating device tree debugging (use: sudo vcdbg log msg)
dtdebug=on

Debug-Infos können mit nachfolgendem Befehl ausgelesen werden:

sudo vcdbg log msg

Die alte Vorgehensweise zu Archivzwecken durchgestrichen (nicht mehr verwenden!)

Das laden der Module geschieht mit folgenden Befehlen:

sudo modprobe w1-gpio
sudo modprobe w1-therm

Damit diese beiden Kernelmodule bei einem Neustart wieder automatisch geladen werden, tragen wir diese einfach in die /etc/modules-Datei ein:

w1-gpio 
w1-therm

Nachdem wir also die Treiber geladen haben, können wir uns daran machen die Temperatur auszulesen. Dazu müssen wir nur die dazugehörige Datei aufrufen, in der die Temperatur gespeichert wird. Diese findet man unter dem Pfad /sys/bus/w1/devices/w1_bus_master1/ danach folgt die eindeutige, aber etwas kryptische Kennung des Sensors. Mein Sensor hat die Kennung 28-00000503cea5, die Datei mit der ausgelesenen Temperatur befindet sich im Ordner mit der Kennung als Namen und heißt w1_slave.

Der komplette Pfad zur w1_slave Datei ist in meinem Fall also:

/sys/bus/w1/devices/w1_bus_master1/28-00000503cea5/w1_slave

Mit dem nachfolgenden Befehl können wir also den Sensor zum ersten mal auslesen und sehen, welche Werte er uns liefert (natürlich mit der Kennung eures Sensors!):

cat /sys/bus/w1/devices/w1_bus_master1/28-00000503cea5/w1_slave

Die Ausgabe ist etwas kryptisch, die Temperatur findet sich in der zweiten Zeile und muss erst durch 1000 geteilt werden, damit man Grad Celsius erhält:

64 01 4b 46 7f ff 0c 10 01 : crc=01 YES
64 01 4b 46 7f ff 0c 10 01 t=22250

Im obigen Beispiel misst der Sensor also eine Temperatur von  22,250 °C (t=22250).

Geschafft! Wir können also mit dem Raspi Temperaturen messen 🙂

Jetzt müssen wir nur noch die Messung so aufbereiten, dass wir etwas damit anfangen können. Wie am Anfang des Beitrags geschrieben, will ich die Raumtemperatur im Serverraum messen und bei Überschreiten von 30°C eine Warnung per Mail verschicken. Bleibt die Temperatur unter 30°C wird das Messergebnis nur alle 5 Minuten in eine Log-Datei gespeichert.

Als erstes müssen wir den Raspi dazu befähigen, dass er Mails verschicken kann. Zum eigentlichen Versand benutzen wir GMail – wenn nötig also einen Mail-Account eröffnen und die Zugangsdaten verwenden, wie nachfolgend beschrieben.

Für dieses Vorhaben benötigen wir das Programm ssmtp und die beiden Pakete mailutils und mpack:

sudo apt-get install ssmtp mailutils mpack

Nach der Installation bearbeiten wir die Konfigurationsdatei von ssmtp:

sudo nano /etc/ssmtp/ssmtp.conf

Folgende Einträge werden ergänzt bzw. editiert (Achtung! Die richtigen GMail-Daten verwenden!)

root=eure.gmail.adresse@gmail.com
mailhub=smtp.gmail.com:587
hostname=euer_raspi_rechnername
UseSTARTTLS=YES
AuthUser=eure.gmail.adresse@gmail.com
AuthPass=euer-mail-passwort
FromLineOverride=YES

Danach legen wir noch fest, wer alles Mails über ssmtp verschicken darf (root und pi):

sudo nano /etc/ssmtp/revaliases
root:eure.gmail.adresse@gmail.com:smtp.gmail.com:587
pi:eure.gmail.adresse@gmail.com:smtp.gmail.com:587

So, nun ist die Voraussetzung getroffen, mit dem Raspi per Shell-Skript Mails verschicken zu können. Um die Temperatur vernünftig darstellen/verrechnen zu können, installieren wir noch das Programm bc.

sudo apt-get install bc

Die Temperatur lassen wir uns jetzt mit dem nachfolgenden Befehl exakt und ohne Nackkommastelle ausgeben:

echo "scale=0; $(grep 't=' /sys/bus/w1/devices/w1_bus_master1/28-00000503cea5/w1_slave | awk -F't=' '{print $2}')/1000" | bc -l

Nun definieren wir uns noch einen Mail-Text, der verschickt wird:

Betreff: !!!!! WARNUNG !!!!! TEMPERATUR IM SERVERRAUM KRITISCH!

Text:

!!ACHTUNG!! Die kritische Temperatur von 30 Grad im Serverraum wurde ueberschritten!

Ein Ausfall der Klimaanlage bei einer Raumtemperatur von T=$temp Grad Celsius ist wahrscheinlich!

Bitte Klimatisierung pruefen und ggf. Server herunterfahren!

Beste Gruesse, der Severraum

Die Temperaturangabe in der Mail soll natürlich die gemessene Temperatur sein, weshalb ich hier die Variable $temp im Text habe. Verschickt wir die Mail dann mit dem Befehl:

mail -s "$subject" "$email" < $emailmessage

Wobei wir als Mail-Adresse natürlich jene verweden, die uns auch etwas nützt: Der Admin oder eine sonstige Person, die Zugang zum Serverraum hat und entsprechend handeln kann 😉

Das ganze ergibt dann nachfolgendes Skript, welches per Cronjob alle 5 Minuten ausgeführt wird:

UPDATE (14.10.2013) – Skript so angepasst, dass bei Überschreiten der Temperaturschwelle von 30 Grad nur eine Mail pro Tag verschickt wird (und nicht alle 5 Minuten 😉 )

Quellcode   
#!/bin/sh
 
# Variablen-Definitionen
# Temperaturen
tempok=30
tempfile="/home/pi/temp.txt"
tempfile2="/home/pi/temp_zu_hoch.txt"
 
# Datum
d=`date +%Y-%m-%d-%H-%M`
d2=`date +%Y-%m-%d`
# Mailversand
subject="!!!!! WARNUNG !!!!! TEMPERATUR IM SERVERRAUM KRITISCH!"
email="admin@serverraum.de"
emailmessage="/home/pi/tempmail.txt"
 
# Temperatur auslesen, bewerten und reagieren
 
temp=`echo "scale=0; $(grep 't=' /sys/bus/w1/devices/w1_bus_master1/28-00000503cea5/w1_slave | awk -F't=' '{print $2}')/1000" | bc -l`
 
if [ $temp -ge $tempok ]
then 
	# Nur Mail versenden, wenn nicht bereits eine Mail an diesem Tag verschickt wurde!
        grep -i $d2 $tempfile2
        if [ $? -eq 0 ]
        then
              echo "$d -- T=$temp" >> $tempfile2
        else
              # Logdatei befuellen
              echo "$d -- T=$temp" >> $tempfile2
              # Inhalt der Mail erstellen und in emailmessage.txt zwischenspeichern
              echo "!!ACHTUNG!! Die kritische Temperatur von 30 Grad im Serverraum wurde ueberschritten!" >> $emailmessage
              echo " " >> $emailmessage
              echo "Ein Ausfall der Klimaanlage bei einer Raumtemperatur von T=$temp Grad Celsius ist wahrscheinlich!" >> $emailmessage
              echo " " >> $emailmessage
              echo "Bitte Klimatisierung pruefen und ggf. Server herunterfahren!" >> $emailmessage
              echo " " >> $emailmessage
              echo " " >> $emailmessage
              echo "Beste Gruesse, der Severraum" >> $emailmessage
 
             # emailmessage verschicken
             mail -s "$subject" "$email" < $emailmessage
 
             # temporäre emailmessege.txt löschen
             rm $emailmessage
 
        fi
else
        echo "$d -- T=$temp" >> $tempfile
fi

 

← Vorheriger Beitrag

Nächster Beitrag →

47 Kommentare

  1. werner mueller

    Bei der Überarbeitung wohl das script beschädigt.
    Die Variable $d2 ist nicht definiert.
    Zwei echo-Ausgaben werden nicht mehr geschrieben.
    Warum wird der Text jedesmal neu creiert und dann wieder gelöscht?
    Am nächsten Tag wieder „the same procedure as evry year“.

  2. Hallo Werner,

    die Variable $d2 ist der aktuelle Tag, ohne Uhrzeit, ich hab’s im Skript oben bereits korrigiert.

    Sicherlich kann man es auch anders lösen, um die Mail zu verschicken. Ich generiere sie immer neu, um die aktuelle Temperatur auch drinnen stehen zu haben. Natürlich geht es sicherlich auch eleganter. Für mich erfüllt es seinen Zweck und war in 10 Minuten geschrieben 😉

    Nicht am nächsten Tag, sondern nur, wenn auch die Temperatur weiterhin überschritten wurde „the same procedure as every year“ 😉

    Grüße
    Andreas

  3. Friedel Kottwitz

    Ich bin Linux-Kaumkenner/-Kaumkönner u. hatte/habe folgende Probleme:
    Ich hatte die Hardware auf meinem Breadboard zusammengesteckt, die Software-Anweisungen ausgeführt, u. wider Erwarten funktionierte alles.
    Nach einiger Zeit ging aber nix mehr, ich tauschte den Temperaturfühler aus, steckte die Bauteile um, weil ich einen Wackelkontakt befürchtete, kam dann mit dem Kabel v. GPIO4 an einen falschen Kontakt, u. der Raspi stürzte
    daraufhin sofort ab. Weiteres Experimentieren half nix, u. ich dachte, die GPIOs seien abgeraucht. Ein neuer Raspi wurde angeschafft, aber das Problem blieb das gleiche: Es funktionierte nicht. Nach etlichen Abenden der Fehlersuche fand ich schließlich folgendes:
    http://www.fhemwiki.de/wiki/Raspberry_Pi_und_1-Wire#1-wire_am_GPIO4-Port_funktioniert_nicht_mehr_nach_Systemupdate

    Ich machte den „Alternativer Workaround“ u. alles funktionierte wieder wie am 1. Tag. Jetzt habe ich jedenfalls 2 Raspis! 🙂 Nachdem ich das so in epischer Breite erzählt habe, bitte ich um Hilfe bei der Konfiguration der Software zum e-mails-verschicken: Beim Befehl „sudo apt-get install ssmtp mailutils mpack“ erhalte ich folgende Fehlermeldungen:
    Err http://mirrordirector.raspbian.org/raspbian/ wheezy/main mysql-common all 5.5.44-0+deb7u1
    404 Not Found
    Err http://mirrordirector.raspbian.org/raspbian/ wheezy/main libmysqlclient18 armhf 5.5.44-0+deb7u1
    404 Not Found
    Failed to fetch 404 Not Found
    Failed to fetch 404 Not Found
    E: Unable to fetch some archives, maybe run apt-get update or try with –fix-missing?

    Was kann ich tun?
    Vielen Dank im Voraus!
    Friedel

    • Hallo Friedel,

      sorry für die späte Antwort, aber es sieht danach aus, als könnte er das Repository nicht erreichen. Sprich, die Server, die die Pakete zur Verfügung stellen, sind unter der Adresse nicht erreichbar, deshalb auch 404 Not Found.

      Mal probiert, vorher sudo apt-get update laufen zu lassen, wie angegeben?
      Wie der Fehler zu Stande kommt, kann ich auch nicht genau sagen, aber Google liefert hierzu einige Treffer: Google-Treffer

  4. Hmm, ich bekomme folgende Fehlermeldung beim Script.
    ./temp-script: 51: ./temp-script: Syntax error: Unterminated quoted string

    Irgendeine Idee?
    Hab eigentlich nur dein Script zu mit auf den Raspi kopiert…

    • Imrazor

      Hallo Markus,

      du hast wohl irgendwo einen „Quote“ nicht geschlossen, z.B. eine Pfadangabe: tempfile2=“/home/pi/temp_zu_hoch.txt
      Hier würde das abschließende Anführungszeichen hinter dem String fehlen: tempfile2=“/home/pi/temp_zu_hoch.txt“

      Grüße
      Andreas

  5. Ah, ok. Problem war scheinbar der Eintrag:

    echo „Ein Ausfall der Klimaanlage bei einer Raumtemperatur von T=$temp Grad
    Celsius ist wahrs$
    Hab jetzt mal das „wahrs$“ entfernt und dort ein Anführungszeichen gesetzt.

  6. Aquarasp

    Besten Dank für dein Tutorial, bin begeistert.
    Jetzt zu meinem Problem, ich bin schon des älteren Semesters und bräuchte dieses Script um einen Temperatur Bereich im Aquarium zu überwachen. Beispielsweise. Bereich von 22-26grad ober und unterhalb soll minütlich per cronjob überwacht werden ob es sich darin befindet dann email an root.
    Ssmtp, bc, Raspbian und DS18B20 laufen bereits und Temperatur wird mir auch angezeigt.
    Frage was muss ich wie ändern um mein Vorhaben zu realisieren?
    Beste Grüße

  7. Aquarasp

    Ups falsch beschrieben, es soll natürlich nur eine Email an mich versenden wenn sich die Temperatur außerhalb des Bereichs befindet.

    • Imrazor

      Hallo Timo!
      Also, ich würde das so lösen:

      1. Einen zweiten Temperaturwert definieren, der OK ist, also tempok2=26 und tempok=22 setzen. Damit hast du schon mal deinen Temperaturbereich.
      2. Die Abfrage, ob die aktuell gemessene Temperatur oberhalb eines Wertes liegt, musst du in eine Abfrage ändern, ob diese unterhalb tempok oder oberhalb tempok2 liegt: if [ $temp -ge $tempok ] in folgendes ändern: if [ $temp -le $tempok ] || [$temp -ge $tempok2]

      Wichtig: Mein Skript schickt nur einmal am Tag eine Mail raus, wenn der obige Fall eintritt, damit man keine Mailflut bekommt. Text und Cronjob musst du halt noch auf deine Bedürfnisse anpassen.

      Grüße
      Andreas

  8. Aquarasp

    Vielen Dank für deine Antwort Andreas,
    Wie müsste das Script denn aussehen wenn ich die Mailflut haben möchte? Bzw 1x die Minute wenn die Temperatur außerhalb der range ist?
    Beste Grüße Timo

    • Imrazor

      Hallo Timo,

      du musst die Abfrage entfernen, ob bereits eine Mail verschickt wurde. Also folgendes löschen:

      # Nur Mail versenden, wenn nicht bereits eine Mail an diesem Tag verschickt wurde!
      grep -i $d2 $tempfile2
      if [ $? -eq 0 ]
      then
      echo „$d — T=$temp“ >> $tempfile2
      else

      Und am Ende noch die dazugehörigen Anweisungen „fi“ entfernen (4. Zeile von hinten). So würde ich jetzt mal tippen, kann es momentan nicht testen, deshalb keine Gewähr, ob das so funktioniert, wie du willst.

      Gruß
      Andreas

  9. Stefan

    Hallo ich hätte versucht deinen skript zu verwenden aber leider bekomme ich nur fehlermeldungen (invalid syntax) .
    Was mache ich falsch?

    • Imrazor

      Kann fast nur ein Tippfehler sein oder dass ein Zeichen vergessen wurde oder eine Zeile…

  10. Moin Andreas,
    mich würde freuen, wenn du das Tutorial auf den aktuellen Stand der Dinge bringen würdest.

    Nach einigen Problemen mit dem Breadboard und der Steckverbindungen (Ground GPIO-Pin hat unregelmäßig den 5v GPIO-Pin berührt, damit ist halt der Raspberry immer abgestürzt) konnte ich letzten endlich die Temperatur mithilfe der BC Anweisung ausgeben lassen.

    Ich möchte das Skript folgender Maßen verwenden:

    Es soll nur eine E-Mail versendet werden, wenn ein gewisser Temparaturwert unterschritten wird. Hast du eine Idee, wie man das umsetzten könnte?

    Ich weiß nicht was ich falsch gemacht habe, jedoch nach Copy&Paste und der E-Mail Anpassung funktioniert das Script nicht und es gibt keinen Fehler bzw das Script wird ausgeführt und nicht beendet…

    Was hab ich falsch gemacht?

    Ich danke für die Hilfe. 😉

    Liebe Grüße;

    • Hat sich eventuell irgendwas am Syntax während der letzten Monate getan?

      • Servus Benji,

        an der Syntax hat sich nix geändert, die ist Shell-Standard seit vielen Jahren 😉
        Was meinst du mit „auf aktuellen Stand der Dinge“? Bei mir rennt das Skript immer noch anstandslos mit aktueller Softwarebasis, nur eben kein neuer Raspi. Eine Lösung für dein Vorhaben schreibe ich dir morgen, muss ich mir erst ansehen…
        Gruß Andreas

        • Servus Andreas,
          wenn ich mich nicht täusche so müsste ich doch eigentlich die If Abfrage: „if [ $temp -ge $tempok ]“ durch „if [ $temp -le $tempok ]“ austauschen oder nicht?

          Mittlerweile bin ich soweit, dass er das Skript ausführt, jedoch mit einem „mail: cannot send message: Process exited with non-zero“ Fehler beendet. Nachdem ich in die Mail Logs geschaut habe, bin ich auf den (Authorization failed (534 5.7.14 https://support.google.com/mail/answer/78754 g7sm29427126wjc.43 – gsmtp)
          ) Fehler gestoßen. Ich kann mir das nur so erklären, dass Google Mail mein Raspi bwz. die Anwendung ssmtp als unsicher einstuft und daher keine Verbindung zulässt, oder liege ich falsch? Passwort und Anmeldedaten habe ich zig mal auf Richtigkeit geprüft :/

          Nach kleiner Recherche hab ich zudem herausgefunden, dass das Passwort keine Sonderzeichen enthalten sollte (tut es nicht) und in den Google Sicherheitseinstellungen die Verbindung zu unsicheren Geräten / Apps zugelassen werden sollte. Irgendwie funktioniert das ganze Konstrukt dennoch nicht, gibt es da eventuelle Abhilfe?

          Vielen Dank für deinen Rat 😉 !

          Liebe Grüße aus dem Norden

          PS: Mit dem aktuellen Stand der Dinge meinte ich eigentlich die Vorgehensweise ab Kernel 3.18.3. Denn dort reicht es nicht mehr, die Module nur in /etc/modules einzutragen. Nachzulesen unter: http://www.fhemwiki.de/wiki/Raspberry_Pi_und_1-Wire#1-wire_am_GPIO4-Port_funktioniert_nicht_mehr_nach_Systemupdate 🙂

          • Hallo Benji,

            richtig, -le macht den Vergleich auf lower equal und sollte das liefern, was du haben möchtest.

            Ich hatte auch mal Probleme mit der Anmeldung, habe dann aber nur die unsicheren Apps in GMail freigeben, dann ging es wieder.

            OK, das neue Laden der Module war mir nicht bekannt, hatte mal einen anderen Workaround benutzt. Kann ich ja mal hier ändern, danke für den Hinweis.

            Gruß
            Andreas

  11. Hallo,
    Ich habe versucht dein Skript anzuwenden aber ich bekomme immer einen Syntax Error:
    File „pTemperaturMail.py“, line 19
    temp=’echo „scale=0; $(grep ‚t=‘ /sys/bus/w1/devices/w1_bus_master1/28-0316816f1aff/w1_slave | awk -F’t=‘ ‚{print $2}‘)/1000“ | bc -l‘

    Weißt du woran das liegen könnte? Einen Rechtschreibfehler kann ich eigentlich ausschließen da ich dein Skript per copy&paste übernommen habe.

    • Hallo Phillip,

      das von mir gezeigte Skript ist ein Shell-Skript und kein Python-Skript. Vielleicht liegts daran? Du hast das Skript ja anscheinend in eine Python-Datei gepackt „pTemperaturMail.py“. Bei mir läuft das Skript als Shell-Variante einwandfrei ohne Syntax-Fehler -> *.sh Endung ausgeführt in der Shell bzw. als Cronjob.

      Grüße
      Andreas

      • Hallo,

        ich habe das Skript in eine .sh gepackt und ausführbar gemacht und bekomme jetzt die Fehlermeldung:

        -bash: ./pTemperaturMail.sh: /bin/sh^M: Defekter Interpreter: Datei oder Verzeichnis nicht gefunden

        Hast du eine Idee woran das liegen könnte?

        Grüße
        Phillip

        • Hallo Phillip,

          mit welchem Editor hast du das Skript erstellt? Es sieht zwar aus, als würde er die Shell nicht finden (/bin/sh), allerdings schaut mit das „^M“ als Eintrag aus, der da nicht hingehört. Das heißt er sucht nach einer Datei die /bin/sh^M heisst und die gibts natürlich nicht. Ich vermute du hast ein Problem, wie es hier beschrieben wird: https://forum.ubuntuusers.de/topic/keine-bashscripte-ausfuehrbar-bin-bash-m-bad-i/

          Ansonsten nimm doch mal als Editor „nano“ her und schau dir das Skript mal an, ob da komische Einträge wie „^M“ vorkommen. Mit dem Befehl echo $SHELL kannst du auch prüfen welche Shell bei dir läuft und den Verweis z.B. auf /bin/bash umstellen, falls es kein sh in deinem System gibt.

          Grüße

          • Hallo,

            ich habe das Skript mit Nano erstellt. Als ich die Datei dann mal mit vi öffnete sah ich das hinter jeder Zeile ein „^M“ war. Das wurde mir bei Nano nicht angezeigt. Also habe ich es im vi Editor entfernt. Außerdem habe ich dann festgestellt das bei mir die /bin/bash Shell läuft. Bis hierhin schonmal Vielen Dank aber jetzt das nächste Problem. Beim ausführen bekomme ich jetzt folgende Fehlermeldungen:

            ./pTemperaturMail.sh: Zeile 19: })/1000″ | bc -l: Datei oder Verzeichnis nicht gefunden

            ./pTemperaturMail.sh: Zeile 49: Dateiende beim Suchen nach `“‚ erreicht.

            ./pTemperaturMail.sh: Zeile 51: Syntax Fehler: Unerwartetes Dateiende.

          • Hallo Phillip,

            vielleicht nochmal meine ganze Anleitung lesen und nicht nur das Skript kopieren? 😉
            Dir fehlt wohl das Programm bc, das musst du – wie beschrieben – zuerst mal installieren: sudo apt-get install bc

          • Hallo,

            ich bin die Anleitung schritt für schritt durchgegangen und habe das Skript erst abgeschrieben und aufgrund des Syntax Fehlers erst copy und paste angewendet. Das Programm bc ist eigentlich installiert denn wenn ich diese Zeile normal im Terminal eingebe bekomme ich ja die Temperatur korrekt augegeben.

            Grüße Phillip

          • Hallo Philipp,

            das mit dem Lesen war Spass 😉 Die Fehlermeldung liest sich nur fast so, als würde er bc nicht finden. Oder es fehlen irgendwelche Anführungsstriche oder Apostrophen. Bitte prüfe mal dein Skript, ob wirklich alle " ` etc enthalten sind. Die Zeile mit dem bc wird nämlich mit einem ` geschlossen:
            temp=`echo "scale=0; $(grep 't=' /sys/bus/w1/devices/w1_bus_master1/28-00000503cea5/w1_slave | awk -F't=' '{print $2}')/1000" | bc -l`

            Darauf ist in Shell-Skripten generell penibel zu achten, ansonsten erzeugt man die wildesten Fehlermeldungen.

            Grüße
            Andreas

          • Hallo Andreas,

            In der Zeile mit bc war echt ein Fehler mit den Anführungsstrichen. Ich dachte ‚ und ` sind das gleiche…
            Aber egal jetzt weiß ich es besser. Allerdings sind die anderen Fehlermeldungen geblieben:

            ./pTemperaturMail.sh: Zeile 49: Dateiende beim Suchen nach `“ erreicht.

            ./pTemperaturMail.sh: Zeile 51: Syntax Fehler: Unerwartetes Dateiende.

            Hat das auch etwas mit den Anführungsstrichen zu tun? Die anderen hab ich auch nochmal alle kontrolliert und die scheinen richtig zu sein.

            Grüße Phillip

          • Die Fehlermeldungen sind in der vorigen Nachricht nicht richtig!

            ./pTemperaturMail.sh: Zeile 19: Dateiende beim Suchen nach `“‚ erreicht.

            ./pTemperaturMail.sh: Zeile 50: Syntax Fehler: Unerwartetes Dateiende.

            Entschuldige!

          • Hallo Phillip,

            du hast wohl immer noch ein Problem mit dem Zeichen ` (Auf der Tastatur rechts neben dem ?). Die Meldung sagt ja, dass er nach dem Zeichen gesucht hat. Evtl. hast du auch einen Zeilenumbruch gemacht, wo keiner hingehört? Wenn du mit ENTER die Zeile umbrichst, kann es sein, dass beim Ausführen schon was nicht mehr passt. Nur weil in der Darstellung hier ein Zeilenumbruch in Zeile 19 ist, darf im wirklichen Skript keiner manuell gemacht werden. Das hier muss durchgehend in einer Zeile ohne manuellen Umbruch stehen: temp=`echo "scale=0; $(grep 't=' /sys/bus/w1/devices/w1_bus_master1/28-00000503cea5/w1_slave | awk -F't=' '{print $2}')/1000" | bc -l`.

            Grüße
            Andreas

  12. Hab den Fehler gefunden und das Skript ist jetzt ausführbar. Allerdings kommt irgendwie die mail nicht an. Kann man irgendwo eine Fehlermeldung finden oder muss ich blind den Fehler suchen?

    • Was war der Fehler, damit wir hier auch eine Auflösung haben?
      Ich würde bzgl. Mailversand-Fehler in der Syslog auf Suche gehen: /var/log/syslog

      • Der Fehler war in Zeile 33. Da fehlt bei dir im code ein Anführungszeichen bei
        echo „Ein Ausfall der Klimaanlage bei einer Raumtemperatur von T=$temp Grad
        Celsius ist wahrs$

        Gut dann werde ich da mal gucken.
        Vielen Dank für deine schnelle und gute Hilfe. 🙂

        • Danke für das Feedback! Ich habe die betroffene Zeile korrigiert bzw. ergänzt. Es hat noch mehr gefehlt, auch eine oder zwei Zeilen drüber ging anscheinend irgendwann das >> emailmessage verloren.
          Ansonsten: Kein Thema, ich helfe gerne weiter, wenn ich Zeit habe 🙂

  13. Hallo,

    tolle Anleitung, danke für die Mühe!

    Ich habe versucht deiner Anleitung zu folgen aber einen DHT11 Sensor genutzt, doch leider dieser unter /sys/bus/w1/devices/w1_bus_master1
    oder /sys/bus/w1/devices nicht angezeigt.

    Unter /sys/bus/w1/devices finde ich jedoch folgende Einträge…welche ich aber nicht zuordnen kann:
    00-3c0000000000 00-bc0000000000 w1_bus_master2
    00-7c0000000000 w1_bus_master1

    Kannst du mich in die richtige Richtung weisen? Oder hast ggf schon eine einfache Lösung?

    Ich mag komplett falsch liegen, aber nutzen der DHT11 und der DS18B20 nicht beide nur einen Pin für die Kommunikation?

    Ich bin zuerst dieser Anleitung hier gefolgt und kann auch Daten über das Skript auslesen, also der Sensor funktioniert schon…nur halt nicht so wie bei dir beschrieben.
    https://tutorials-raspberrypi.de/raspberry-pi-luftfeuchtigkeit-temperatur-messen-dht11-dht22/

    LG
    Tim

    • Hallo Tim,

      ich bin nicht so der erfahrene Raspberry Pi Programmierer, weshalb ich mich mit dem DHT11 Sensor auch nicht auskenne. Google ich allerdings das Ding, finde ich ähnliche Anleitung, wie die, die du verlinkt hast. Dem Anschein nach kann man auf den DHT11 nicht auf gleiche Weise zugreifen,wie auf den DS18B20 Temperatursensor. Für den DHT11 wird ein Python Skript benutzt, mein Skript ist jedoch ein schnödes Shell-Skript. Ich würde mir an deiner Stelle mal das Python-Skript im Detail anschauen und versuchen damit die Werte zu speichern und dann mit einem Shellskript die Werte auslesen und bei bestimmten Schwellwerten die Mail verschicken. Sorry, mehr kann ich zu deinem Problem leider nicht beitragen.
      Grüße
      Andreas

  14. Hallo,

    danke für die Anleitung.

    Ich habe alles prima ans laufen bekommen, aber leider gehen die Emails nicht raus.
    ——————-
    mail: Nachricht kann nicht gesendet werden: Prozess wurde mit einem von Null verschiedenen Status beendet
    ——————-
    Im Log steht: Unable to connect to „587“ port 578.

    Einstellungen in GMail habe ich geprüft und die Unterstützung für unsichere Clients activiert. Habe nun sogar einen anderen Emailanbieter getestet ohne Erfolg. Der Raspberry Pi steht momentan in der DMZ und daher würde ich mal davon ausgehen, dass der Port 578 nicht geblockt ist.

    Könntest jemand seine ssmtp.conf mit mir teilen? Bei mir ist irgendwo der Wurm drin.

    Danke & Gruss

    • Hallo und guten Tag, habe die gleiche Fehlermeldung. Wurde eine Lösung gefunden?
      Würde mich für Infos hrzlich bedanken.
      LG
      Gerhard

      • Hallo Gerhard,
        bei mir funktioniert es eigentlich immer noch so wie gehabt und den obigen Einstellungen. Allerdings hatte ich auf meinem Webserver ein vergleichbares Problem. Das Mailprogramm (ebenfalls ssmtp) konnte keine Mails mehr verschicken, das Problem bei mir war die geänderte Benutzerauthentifizierung von Google.
        Wenn man die Zwei-Faktor-Authentifizierung benutzt, können sich unsichere Anwendungen nicht mehr anmelden und mailen. Die Lösung hierfür ist die Generierung eines speziellen App-Passworts, das das eigentliche Passwort in der ssmtp.conf ersetzt.
        Mehr dazu hier:
        https://support.google.com/accounts/answer/185833?hl=de

        Nach Erzeugen des App-Passworts ging es bei mir sofort wieder (auf meinem Server).

        Grüße
        Andreas

        • Hallo Andreas,
          vielen Dank für die promte Antwort!
          Habe mittlerweile auf einem anderen Raspberry die Installation wiederholt und siehe da der Fehler kommt nicht mehr … aber dafür erwartet sich beim versenden einer Mail das Programm scheinbar eine weitere Emailadresse oder interpretiere ich das CC falsch!?
          Nach Eingabe einer solchen tut sich nichts mehr …
          Das sehe ich im Editor:

          pi@raspberrypi: mail -s „Mailtest“ „Testtext“ mail@gmx.org
          Cc:

          Kann jemand helfen?

          Danke und liebe Grüsse aus Österreich
          Gerhard

          • Hallo Gerhard,

            das Cc: ist unwichtig, das wurde nur eine Adresse angeben, an die eine Kopie geschickt wird. Wie eben bei einem normalen Mail-Programm.
            Versuch doch mal in der Konsole folgenden Befehl zum Testen: echo „Mail-Inhalt“ | mail -s „Betreff“ mail@gmx.org

            Grüße
            Andreas

          • Hallo Andreas
            Habe es mit Deiner Version versucht, leider kein Erfolg. Es hat sich in diesem Fall wieder die alte Fehlermeldung gemeldet:
            mail: Nachricht kann nicht gesendet werden: Prozess wurde mit einem von Null verschiedenen Status beendet

            Beim vorigen Fehler habe ich auch verschiedenste Mailadressen eingegeben (Cc). wenn man dann Enter drückt tut sich nichts mehr auf der Konsole. Man kann sie beenden dann gehts wieder.
            Sorry, ich will dich aber nicht quälen mit meinem Problem, versuche auch permanent im Netz eine Lösung zu finden.
            Wird Wohl oder Übel darauf hinauslaufen einen der komplizierten Mail Dinger zu installieren 🙁

            LG
            Gerhard

          • Hallo Andreas 😉

            Schon wieder ich.
            Ich kann es nicht glauben und schon gar nicht kann ich es erklären, aber bei meinen vielen verzweifelten Versuchen habe ich auch folgende Variante probiert …
            pi@raspberrypi:~ $ mpack -s „Test Foto“ /home/pi/test.jpg mail@gmx.org
            … und man glaubt es kaum, es funktioniert.
            Es macht genau das das ich erreichen wollte, nämlich ein Foto eines Zeitraffer Projekt zur regelmässigen Überprüfung per Mail an mich schicken 🙂

            Trotzdem vielen Dank nochmals für die Mühe die Du Dir mit mir gemacht hast!

            Liebe Grüsse und noch eine schöne Woche
            Gerhard

          • Hallo Gerhard,

            danke für das Feedback, vielleicht hilft es anderen, die hier her kommen 🙂
            Ansonsten helfe ich immer gerne, wenn ich grad Zeit hab und helfen kann.

            Viel Spass noch mit deinem Projekt!

            Grüße
            Andreas

  15. Hallo,

    ich finde es recht interessant was man so mit einem PI anstellen kann. 🙂

    Nun zu meinen Problem: Es sollen in unserem Serverräumen PI’s zum Temp- und Luftfeuchtigkeits messen zum Einsatz kommen.

    Nun habe ich folgende Artikel auf meiner Einkaufsliste bei reichelt:
    RPI3 BDL BF 2017
    Das Raspberry PI 3 Black-Bundle (mit Netzteil, SD-Card und Gehäuse)

    RPI COOL SI
    Raspberry Pi – Kühlsatz, 3-teilig, silber

    STECKBOARD MW
    Experimentier-Steckboard, 170 Kontakte, weiss

    GRV TEMP HUM PRO
    Arduino – Grove Temperatur- & Feuchtigkeitssensor Pro (präzise)

    DS 18B20
    Digital Thermometer, 1-wire +/- 0,5°C, TO-92

    1/4W 4,7K
    Widerstand, Kohleschicht, 4,7 kOhm, 0207, 250 mW, 5%

    1/4W 10K
    Widerstand, Kohleschicht, 10 kOhm, 0207, 250 mW, 5%

    STECKBOARD LSBSW
    Flexible Drahtbrücken, 10cm, Stecker-Buchse

    Die Frage die sich mir stellt: Ist das alles? wenn ja welche Stückzahl benötige ich pro Artikel?

    Lieben Gruß

    • Hallo Marius,

      ich denke, das sollte soweit passen. Bis auf den Grove Temperatur und Feuchtigkeitssensor, der für Arduino ist. Ich weiß nicht, ob das Ding für den Raspi auch geeignet ist. Ich würde für Feuchtigkeit/Temperatur eher den DHT11 bzw. DHT22 nehmen. Dazu gibt es auch genügend Anleitungen im Netz. Ich selbst habe nur den Temperatursensor DS18B20 im Einsatz. Am besten du nimmst die Dinger gleich vorkonfektioniert mit Kabel, Platine und Widerstände, dann ersparst du dir das fummelige Löten etc.

      Brauchst du dann noch einen extrigen DS18B20, wenn du im DHT11 bzw. DHT22 bereits einen kombinierten Temperatur und Feuchtigkeitssensor hast?

      Wie gesagt, nimmst du das Raspi-Kit mit den von mir vorgeschlagenen Sensoren, brauchst du keine Widerstände. Ansonsten nimmst du halt die Anzahl x 2, wenn du den Spass zweimal aufbauen willst. Die Steckboards brauchst du nicht, wenn du die vorkonfektionierten Sensoren nimmst, sind aber eine nette Spielerei, wenn man mal was anderes ausprobieren will.

      Grüße
      Andreas

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

Durch die weitere Nutzung der Seite stimmst du der Verwendung von Cookies und dem Einbinden Drittanbieterinhalten zu. Weitere Informationen

Die Cookie-Einstellungen auf dieser Website sind auf "Cookies zulassen" eingestellt, um das beste Surferlebnis zu ermöglichen. Wenn du diese Website ohne Änderung der Cookie-Einstellungen verwendest oder auf "Akzeptieren" klickst, erklärst du sich damit einverstanden.

Schließen