DHT 22 Werte auslesen und in einem Web UI ausgeben-

  • Ich versuche bereits seit einigen Tagen die Werte meines DHT 22 Sensors über ein WEb ui auszugeben. Habe es schon mit mehreren Tutorials im internet versucht hat aber leider nie funktioniert.
    Mein biheriger stand:
    - Werte können über ein Script im Terminal abgefragt werden
    - Apache ist instaliert
    OS: Rasbian

    Das ansteuern eines Relais über PHP und ein Script hat bereits funktioniert.
    Ich weiß nur nicht wie man Werte zurückgibt.
    Hoffe ihr könnt mir Helfen.

    Einmal editiert, zuletzt von Florian_ (20. Dezember 2016 um 22:50)

  • DHT 22 Werte auslesen und in einem Web UI ausgeben-? Schau mal ob du hier fündig wirst!

  • Servus,


    ... Habe es schon mit mehreren Tutorials im internet versucht hat aber leider nie funktioniert.


    na dann erzähl doch mal, was genau Du schon alles probiert hast ... da werden wir den/die Fehler schon finden.
    Und poste das, was Du an scripten probiert hast, am besten gleich mit ...

    cu,
    -ds.

  • Ich habe ich es mit verschiedenen Shell Scripten versucht die den Terminal befehl der die Werte korrekt auslesen kann ausgibt da kam das erste Problem auf mich zu wie die dort ausgegebenen Werte weiter verarbeitet werden sollen. Daher habe ich diese option erst einmal zur seite gelegt (nicht aufgegeben) und mich nach einer anderen Lösung um gesehen.

    Danach habe ich noch mal in etwa so weit geschfft mit diesem Tutorial (https://www.sweetpi.de/blog/436/luftf…berry-pi-messen)
    darüber hinaus habe ich immer um die entsprechenden Lösungen

    recherchiert hat mich aber auch nicht viel weiter gebracht. (leider)

    p.s.
    habe erst überlegt op man die mit python machen kann (habe noch nie ernsthaft mit Python zu tun gehabt)

    MFG
    Florian

    sorry hab den letzten Satz erst überlesen:

    Code
    #! /bin/bash
    su -
    PASSWD-HIER-EINSETZEN
    cd /
    cd Adafruit_Python_DHT/examples/
    print ./AdafruitDHT.py 22 4

    Vom prinip alle so aufgebaut nur manche mit den befehlen von dem verlinkten Tutorial

    Einmal editiert, zuletzt von Florian_ (20. Dezember 2016 um 23:17)

  • Da das Script zum auslesen des DHT22 Sensors vermutlich in Python ist würde ich lieber den Weg komplett über Python gehen. Siehe dazu:
    FAQ => Nützliche Links / Linksammlung => [Python] Webserver, Websocket und ein bisschen AJAX

    Dort findest du auch eine HighCharts Variante => Python: Sensor Werte mit HighCharts visualisieren

  • erstmal Danke für eure Hilfestellungen!!! Habe grade noch eine andere idee gehabt und zwar das man die werte über ein Python Script regelmäßig in eine MySQL datenbank schreibt und diese dann über den Webserver ausliest (? PHP ?) was haltet ihr davon und ist dies sauber und (ralativ) leicht umzusetzen ?

    Freue mich über eruer Feedback

    Grüße
    Florian


    EDIT:
    Vermutlich währe SQLite besser oder?

    Einmal editiert, zuletzt von Florian_ (22. Dezember 2016 um 18:25)

  • Naja, die Werte in eine Datenbank zu schreiben benötigst du nur wenn du eine History also einen Verlauf haben willst - du also sehen willst wie die Werte in der Vergangenheit waren. Wenn du aber nur den aktuellen Wert haben willst wäre der Umweg über mehrere Sprachen hinweg Quatsch => python sql php html.
    Wenn du nur den aktuellen Wert haben willst also kein Verlauf dann kannst du das auch wie folgt umsetzen:

    Spoiler anzeigen


    [code=php]
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>1 wire</title>
    </head>
    <body>
    <?php
    // (c) meigrafd 09.2015
    // Temperaturlogging + webserver Problem cronjob
    if (!file_exists("/sys/bus/w1/devices/w1_bus_master1/w1_master_slave_count")) {
    echo "<b>ERROR: w1 Kernel Module not loaded?<br/>modprobe w1-gpio pullup=1<br/>modprobe w1-therm<br/></b>\n";
    } else if (file_get_contents("/sys/bus/w1/devices/w1_bus_master1/w1_master_slave_count") === 0) {
    echo "<b>ERROR: No 1-wire Sensors connected?</b>\n";
    } else {
    $w1_slaves = file("/sys/bus/w1/devices/w1_bus_master1/w1_master_slaves");
    foreach ($w1_slaves AS $slave) {
    $lines = file("/sys/bus/w1/devices/".$slave."/w1_slave");
    if (preg_match("/t=(.*)/", $lines[1], $match)) {
    echo $slave.": ".$match[1]."<br/>\n";
    }
    }
    }
    ?>
    </body>
    </html>
    [/php]
    Oder so: Temperaturlogging + webserver Problem cronjob

    Über bereits erwähnte Anleitung erreichst du folgendes:
    - Von apache2 & Co unabhängiger Webserver = Schneller, Ressourcenschonender (apache gilt als Traktor unter den Webservern).
    - Visualisierung der Messwerte; entweder nur der aktuelle Wert direkt, oder ein Verlauf mithilfe von HighCharts.
    - Alles in Python, abgesehen von HighCharts was in JavaScript umgesetzt wird.

    Python übernimmt dann den Part von:
    apache2 = Bereitstellung eines Webservers mithilfe des bottle Frameworks inkl. JS Unterstützung.
    php = Aufbereitung und Verarbeitung auf seiten des Servers.
    Sensor = Die meisten Sensoren können direkt über Python angesprochen werden; SPI, I2C, 1wire etcpp können leicht angesprochen werden.

    Möglichkeiten gibt es aber viele ;)

    Ob SQLite oder MySQL usw ist nahezu nebensächlich - die Datenbankstruktur wäre wichtiger :fies:

  • Ja , die Lösug klingt schon interesant.
    Wenn ich es richtig Versanden habe wird der Apache durch Python ersetzt.
    Das problem ist das bereits eine Webcam über den Pi gestreamt wird dieser stellt das bild über mod_Proxy bereit ... . Das heißt der Apache muss leider bleiben.

    Grüße
    Florian

  • Geht leider auch nicht das das Nezwerk so Konfiguriert ist das nur Kommunikation auf Port 80 (HTTP) und Port 443 (HTTPS) erlaubt ist.

    Sorry, habe ich vergessen in der Ursprungs Post zu Packen.


    Oder man greift die Daten wieder über den Apache ab ?


    Gruß
    Florian

  • So ganz genau habe ich nicht verstanden was du vorhast bzw. wo genau dein Problem ist. Einen DHT22 lese ich auch aus und gebe seine Werte auf einer html Seite aus und schreiben sie in eine Datenbank, so daß ich den Temperaturverlauf der letzten 24 Stunden und der letzten 7 Tage grafisch darstellen kann. Die Ausgabe schreibe ich, wie auf der auf der Seite von sweetpi gezeigt, in eine Datei, aus der ich die Werte auslese und einer html Template Datei ersetze. Außerdem schreibe ich sie über rrdtool in eine Datenbank. Per Befehl werden dann aus der Datenbank direkt Grafiken erzeugt, die ich wiederum in einer anderen Website eingebunden habe. Den DHT22 ausschließlich beim Zugriff auf die Website auszulesen würde ja beim Befüllen einer Datenbank keinen Sinn machen.
    Oder habe ich dich falsch verstnden?

  • Ja ich habe mich etwas umständlich ausgedrückt.

    Im endeffekt soll der Sensor die Daten auf einer HTML seite angezeigt werde.
    Diese soll möglichst auf dem Apache webserver laufen.
    Eine Protokolierung ist (erstmal) nicht vorgesehen.

    Hoffe das es Jetzt etwas klarer ist.

    Die Abfrage im Terminal funktioniert schon.

    Meine Anfängliche frage war wie ich das ganze in eine HTML seite einbinde.

    Gruß
    Florian

  • Ich habe das mal als Shellscript geschrieben und später mit Lazarus realisiert. Angestoßen wurde das durch die eingehenden Telegramme einer ELV Wetterstation. In den Räumen, in denen sich ohnehin ein Raspberry befindet, nehme ich einen DHT22 oder auch einen BMP085 für den Luftdruck. Als Webserver habe ich lighthttpd genommen, mit Apache sollte das aber auch gehen. Die Scriptversion funktionierte in etwa so:

    DHT22 auslesen und Werte in ein Script einlesen:

    # Sensor dht22 auslesen
    sudo /home/pi/lol_dht22/loldht 7 >$quelle2
    ta=$(grep "Humidity" $quelle2 | cut -c 34-37)
    ha=$(grep "Humidity" $quelle2 | cut -c 12-15)

    Das Script ersetzt in der Datei eines statischem Template mit dem Befehl:

    sed -e "s/#ta#/$ta/" |\
    sed -e "s/#ha#/$ha/" |\

    Die Platzahltervaribalen in der index.tmpl durch die tatsächlichen Werte und schreibt diese in die index.html des Webservers

    <td>#ta#</td>
    <td>#ha#</td>

    Vielleicht nicht sehr elegant, hat aber problemlos finktioniert. Vielleicht hilft dir das schon.

  • Dank!
    Bin mir aber immoment nicht Sicher ob ich das richtig verstanden habe von der Logig her.
    Vorerst : Das Script läuft im Hintergrund oder wird es per cronjob o.ä. ausgeführt?

    Das Script fragt also den Sensor ab und ersetzt Variablen in der HTML datei durch die Werte oder?

    Aslo werden die werte bei jedem aufruf neu eingelesen Richtig ?
    Hoffe ich kann es Morgen alles ausprobieren. (und Verstehen :))
    Grüße
    Floran :s

    Einmal editiert, zuletzt von Florian_ (22. Dezember 2016 um 21:12)


  • Im endeffekt soll der Sensor die Daten auf einer HTML seite angezeigt werde.
    Diese soll möglichst auf dem Apache webserver laufen.
    Eine Protokolierung ist (erstmal) nicht vorgesehen.

    Blöde Frage: Wieso machst du es dann nicht so wie in Beitrag#8 im Spoiler beschrieben?

    DHT22 ist ein 1wire Sensor. Sobald die Kernel Module geladen sind kann man den Sensor über eine gewisse Datei in /sys/bus/w1/devices/ auslesen. Das baust du einfach in dein PHP Script wie in Beitrag#8 beschrieben ein und fertig

    [code=php]
    <?php
    $lines = file_get_contents('/sys/bus/w1/devices/28-0004734d65ff/w1_slave');
    $boom = explode('t=', $lines);
    echo round(floatval($boom[1] / 1000), 2);
    ?>
    [/php]

    Man sollte immer so gut es geht alles in der jeweiligen Sprache umsetzen. Ein MischMasch aus verschiedenen Sprachen ( PHP + Bash oder was auch immer ) ist schlechter, langsamer und anfälliger.


    Ansonsten => FAQ => Nützliche Links / Linksammlung => HighChart

  • Das Script lief im Hintergrund und hat auf das Eintreffen eines Datentelegramms gewartet. Das ist bei dir ja nicht der Fall. Entweder du startest es zyklisch per cron oder direkt durch den Zugriff auf die Website und fragst dann den Sensor ab. Das Template ist eine von dir erstellte html Datei die deiner Website entspricht aber statt der tatsächliechen Werte Platzahltervaribalen enthält. Das Script erstzt dann die Platzhaltervariablen durch die Werte des DHT22. Die Werte werden bei der cron Version entsprechend der Parametrierung zyklisch neu eingeslen. Per Webaufruf sollte das auch gehen, das habe ich aber mit dem DHT22 noch nicht gemacht. Ich habe einen RPi, der beim Aufruf einer URL, und nur dann, das Bild seiner Webcam bereitstellt. Das könnte man ggf. so anpassen, daß er den DHT22 ausliest.

  • Sorry aber davon krieg ich Kopfschmerzen

    Was spricht dagegen anstatt einer *.html Datei einfach eine *.php Datei zu nehmen und an der Stelle wo der Sensorwert stehen soll den obigen PHP Code einzusetzen? Bzw eben nur dort die Variable auszugeben...
    Man kann dafür auch ein iFrame setzen was sich unabhängig der restlichen Seite aktualisiert... Oder man verwendet AJAX, was der bessere Weg wäre.

    Aber ein Bash Script zu verwenden um jedesmal eine "Vorlage" zu verändern um dort einen Wert einzusetzen, die dann eine vorhandene *.html überschreibt - ist m.E. ein schlechter Weg. Die neuen Werte sieht man dann auch nur wenn die komplette Seite neu geladen wurde.
    Sicherlich funktioniert das auch, aber was ist wenn das bash Script mal, warum auch immer, mal nicht funktioniert? 2 Ecken über die es geht die anfällig sind. Zumal er ja seine Webcam streamt oder zumindest anzeigt, also kann er nicht ständig die Seite neu laden, um den veränderten HTML Code darzustellen...

  • Habe es jetzt so hinbekommen das die Daten in eine .txt geschrieben werden. Dies macht ein Script das ich per CronJob ausführen lasse.
    Das Problem das ich die entsprechenden Kernel module nicht finden konnte konnte ich relatiiv leicht daran fest machen das diese niht existieren

    Zitat

    DHT22 ist ein 1wire Sensor. Sobald die Kernel Module geladen sind kann man den Sensor über eine gewisse Datei in /sys/bus/w1/devices/ auslesen. Das baust du einfach in dein PHP Script wie in Beitrag#8 beschrieben ein und fertig

    wöhre es dann nicht die einfachste lösung die entsprechenden Daten wieder aus der TXT datei auszulesen und dann mit html oder PHP in die Website zu integrieren?
    würde es in dem Fall sin machen das daten verzeichnis auszulagern auf eine USB Stick oder der gleichen das das ständige schreiben und lesen der SD Karte bestimmt zusetzen würde ?!

    Danke für eure Antworten

    Grüße
    Florian_

Jetzt mitmachen!

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