[Tutorial] DHT22 anschließen, Werte in Datenbank speichern und auf einer Webseite ausgeben

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Das Tutorial war für mich.... 7

    1. hilfreich / lehrreich (6) 86%
    2. hatte das Gleiche vor und konnte es mit diesem Tutorial nachbauen (3) 43%
    3. die Beschreibung war zu knapp (0) 0%
    4. die Beschreibung war zu ausführlich (0) 0%
    5. unsinnig / überflüssig (1) 14%

    Hallo zusammen,

    ich habe an meinem Raspberry einen DHT22-Sensor angeschlossen. Nun war mir das einfache Messen der Temperatur und der Luftfeuchtigkeit aber zu wenig. Ich wollte die gemessenen Werte in einer Datenbank speichern und deren Inhalt dann auf einer Webseite ausgeben.

    Ich habe mir alle erforderlichen Schritte notiert und wollte euch meine private Doku hier zur Verfügung stellen - eventuell ist die Anleitung ja für euch interessant.

    Die einzelnen Schritte sind:

    1. Anschluss des DHT22-Sensors am Raspberry PI
    2. Erstellung einer MySQL/MariaDB - Datenbank mit eigenem Benutzer, zum Einspeichern der gemessenen Werte
    3. Erstellung eines Bashscriptes, dass alle 5 Minuten läuft, misst und dann mit einem Zeitstempel die Werte in die Datenbank einträgt
    4. Bau einer Webseite, auf der die gemessenen Daten aus der Datenbank ausgegeben werden

    Ich habe die einzelnen Schritte in Form eines PDF-Dokumentes an diesen Thread angehangen...da steht alles drin: Code, Vorgehensweise, alle einzelnen Konsolenbefehle etc....

    Falls es Fragen gibt gerne fragen...für konstruktive Kritik wäre ich dankbar, genauso wie ein Feedback, ob die Anleitung für euch hilfreich war.

    Viele Grüße

  • [Tutorial] DHT22 anschließen, Werte in Datenbank speichern und auf einer Webseite ausgeben? Schau mal ob du hier fündig wirst!

  • Hallo DocRocco,

    da ich das gleiche vorhatte, habe ich es schon nachgebaut und ergänze meine Notizen. Die Sensordaten erfasse ich mit einem Raspberry Pi4B.

    Mein Anwendungsfall sah so aus, dass der MariaDB Server auf den Pi Zero W kommen sollte, auf dem schon ein Webserver lief (pi-hole mit lighttpd):

    Code
    sudo apt install mariadb-server

    Remoteverbindungen erlauben, "#" vor bind-address hinzufügen und Dienst neustarten:

    Code
    sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
    
    #bind-address = 127.0.0.1
    
    sudo service mysql restart

    Bevor die Datenbank erstellt wird:

    Code
    sudo mysql

    Ohne phpmyadmin, bei mir mit zusätzlicher Spalte für CPU Temperatur:

    Code
    use messstation;
    
    CREATE TABLE dht22(id INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY, uhrzeit VARCHAR(50), luftfeuchtigkeit VARCHAR(25), raumtemperatur VARCHAR(25), cputemperatur VARCHAR(25));

    Die vereinfachte Webseite kommt auf den Webserver. Ich nutze lighttpd, der vorher installiert war. Es geht aber auch Apache2. Wichtig ist, dass php Dateien ausgeführt werden können. Das Skript lagert bei mir unter /var/www/html/ als sensordaten.php (Screenshot abtippen und anpassen ist mühsam):

    Damit das Ganze ausgeführt werden kann:

    Code
    sudo apt install php7.3-mysql
    
    sudo service lighttpd force-reload

    Statt Shellskript mit Python. Achtung, benutzt CircuitPython_DHT

    Der 7. Pin ist für die Datenübertragung verkabelt, also BCM4. Wichtig wegen ...DHT22(board.D4)

    Das Skript kann zum Beispiel beliebig im /home Verzeichnis erstellt werden.

    Neben libgpiod braucht man zum Ausführen auch noch mysql connector, bei python3 sudo pip3 install mysql-connector-python.

    Bei Connection muss statt localhost in meinem Fall die IP-Adresse des Datenbankservers eingetragen werden, z.B.

    Code
    host = "192.168.0.3"

    Mit dieser externen Datenbank können auch Sensordaten von mehreren Systemen erfasst werden. Entweder in eigenen Tabellen, oder mit einer zusätzlichen Spalte für die jeweilige Bezeichnung vom Sensor / Raum. Es werden nur gültige Daten in die Datenbank eingetragen. Fehlmessungen werden verworfen. Das Skript muss ausführbar gemacht und manuell mit Python3 aufgerufen oder beim Systemstart automatisch gestartet werden. Das Skript wird nicht alle 5 Minuten aufgerufen, sondern läuft endlos und hat eine Wartezeit von 5Min bis der Sensor erneut ausgelesen wird.

    Die Webseite kann nun im Webbrowser über die IP-Adresse, bei mir mit "192.168.0.3/sensordaten.php" aufgerufen werden oder lokal mit "127.0.0.1/sensordaten.php".

    Ebenfalls kann die Ausgabe angepasst. Das folgende Beispiel listet jeden 12. gespeicherten Eintrag auf (ohne Fehlmessungen = 1 Stunde). Dabei werden 48 Ergebnisse dargestellt (2 Tage).

    Code
     $result = mysqli_query($con,"SELECT uhrzeit, luftfeuchtigkeit, raumtemperatur, cputemperatur FROM dht22 WHERE id MOD 12 = 0 ORDER BY id DESC LIMIT 48")

    Es wird anhand des Primärschlüssels sortiert.


    Hier noch ein Beispiel für ein responsive Design mit den Werten aus 2 Räumen. Es werden 2 hübsche Tabellen nebeneinander bzw. untereinander dargestellt. Das habe ich mit w3.css erstellt. Die Datei w3.css wird dafür benötigt (Zeile 5 im Quelltext, online oder lokal). in meinem Fall lokal heruntergeladen. Jeder zweite Wert wird aus der Datenbank ausgelesen. Die Datenbank ist ebenfalls lokal auf dem gleichen Raspberry.

    Gruß,

    Tigerbeere

    12 Mal editiert, zuletzt von Tigerbeere (20. März 2021 um 21:23) aus folgendem Grund: verrutschte Einrückungen, Ergänzungen

  • Hey Tigerbeere,

    ich danke dir für das Update.

    Du hast Recht, einen Screenshot abzutippen ist Murks - das stimmt.

    Da ich ja meinen Pi jeden Abend sichere sind natürlich die ganzen Webseiten etc im backup mit drin und die Doku war ursprünglich nur für mich gedacht, falls ich in einem Jahr oder so den PI neu aufsetzen muss und keine Ahnung mehr habe was ich da gebaut habe :)

    Dank deinen Ergänzungen ist es bestimmt noch hilfreicher für viele Leute - VIELEN DANK DAFÜR !

    Das ist genau das Feedback, was ich erreichen wollte

    Worin liegt der Unterschied zwischen Batman und Bill Gates?

    - Batman hat den Pinguin besiegt...

  • Guten Abend,

    ich weis nicht, ob ich das Offensichtliche übersehe.

    Da ich noch nie eine Website geschrieben habe, habe mal den Code von Tigerbeere übernommen.

    Wie rufe ich die Webseite nun auf? :blush:

    Der Rest hat soweit funktioniert.

    Danke und Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • In meinem Fall ist lighttpd der Webserver, weil der bei pi-hole gleich dabei ist. Das bedeutet unter /var/www/html/ kannst du deine Datei anlegen, z.B. "sensordaten.php" und dann per Webbrowser aufrufen mit "127.0.0.1/sensordaten.php" oder "localhost/sensordaten.php"

  • Falls das Skript einmal gestartet wurde, kann es nicht erneut gestartet werden, da eine Fehlermeldung erscheint (Unable to set ...). Vielleicht bekommt man das Problem auch mit dhtDevice.exit() in den Griff. Wer sonst nicht jedes Mal den Raspberry neustarten möchte, kann den Prozess libgpiod_pulsein suchen und beenden. Folgendes Pythonskript kann diese Aufgabe übernehmen.

    Code
    #!/usr/bin/env python3
    import psutil
    for proc in psutil.process_iter(['pid', 'name', 'username']):
        if proc.name()=='libgpiod_pulsein':
            psutil.Process(proc.pid).kill()
            print(f"{proc.pid} terminiert")

    Einmal editiert, zuletzt von Tigerbeere (20. März 2021 um 21:26)

  • Hallo Tigerbeere,

    vielen lieben Dank für den Hinweis.

    Ich hatte bei dem Schreiben des Tutorials noch einen PI3.

    Bei meinem aktuellen Pi4 habe ich tatsächlich das Problem mit dem Pulsmesser und Fehlermeldungen.

    Ich probiere deinen Code heute einmal aus und mede mich dann. Das scheint bei dem PI4 ein gängiges Problem zu sein an dem ich auch seit 4 Wochen nicht weiter komme.

    Meine Fehlermeldung lautet so:

    Unable to set line 23 to input

    Traceback (most recent call last):

    File "/home/pi/Scirpts/DHT22.py", line 4, in <module>

    print(dht.temperature)

    File "/home/pi/.local/lib/python3.7/site-packages/adafruit_dht.py", line 242, in temperature

    self.measure()

    File "/home/pi/.local/lib/python3.7/site-packages/adafruit_dht.py", line 187, in measure

    pulses = self._get_pulses_pulseio()

    File "/home/pi/.local/lib/python3.7/site-packages/adafruit_dht.py", line 125, in _get_pulses_pulseio

    while self.pulse_in:

    File "/home/pi/.local/lib/python3.7/site-packages/adafruit_blinka/microcontroller/bcm283x/pulseio/PulseIn.py", line 153, in __len__

    message = self._wait_receive_msg()

    File "/home/pi/.local/lib/python3.7/site-packages/adafruit_blinka/microcontroller/bcm283x/pulseio/PulseIn.py", line 89, in _wait_receive_msg

    "Timed out waiting for PulseIn message. Make sure libgpiod is installed."

    RuntimeError: Timed out waiting for PulseIn message. Make sure libgpiod is installed.

    Worin liegt der Unterschied zwischen Batman und Bill Gates?

    - Batman hat den Pinguin besiegt...

  • Die Fehlermeldung vom DHT22 kommt trotzdem....das ist ja das Kernproblem. obwohl libgpiod2 installiert ist.

    Wenn man das pythonscript selbst startet und es in einer Dauerschleife läuft, dann ist es in Ordnung. Wenn man es aber durch ein bash-Script antriggert, dann kommt eben der Fehler mit der Fehlermeldung und die Meldung ist ja nicht ganz zutreffend.

    Worin liegt der Unterschied zwischen Batman und Bill Gates?

    - Batman hat den Pinguin besiegt...

Jetzt mitmachen!

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