Temperatur-Server

  • Hallo Leute,
    habe nun meinen zweiten PI erhalten und das ganze Wochenende mit googlen und ausprobieren verbracht.
    Gestern habe ich dann zum testen einen von später wahrscheinlich drei DS18B20 Temperatur-Sensoren angeschlossen.
    Dann wie im Netz beschrieben mit den Befehlen gearbeitet und den Sensor auslesen können. Klappte wunderbar.
    Habe dann den PI nochmal neu aufgesetzt.

    Ich bin nun so weit:

    * Aktuelles Wheezy auf SD-Karte installiert, Updates gemacht *
    * Webserver eingerichtet mit Apache und php... lt. Anleitung http://mntechblog.de/webserver-lamp…e-installieren/ komme auch von jedem PC im Netzwerk drauf *
    * Die /etc/modules-Datei bearbeitet um die w1-gpio und w1-therm Module zu laden *

    Hatte dann auch noch irgendein Modul installiert, das eine Grafische Auswertung machen soll, aber ich finde den Beitrag sowie den Befehl nicht mehr. Sollte ja aber nicht schlimm sein...

    Nun zu meinem Vorhaben:
    Ich würde gerne eine einfache php Datei haben die mir die Temperatur der angeschlossenen Fühler ausgibt. Das ganze erstmal einfach nur in Textform am besten mit automatischer aktualisierung.
    Doch die frage ist für mich welche Kommandos muss ich wo eingeben oder geht das auch grafisch?

    Über´n Desktop konnte ich gestern die Temperatur-Daten in einer Textfile anzeigen. Kann man diese nicht als kopie in den Web-Ordner legen?

    Wenn mir jemand freundlicher weise eine kleine Anleitung *Step-by-Step* schreiben könnte damit ich das besser verstehe wäre ich sehr glücklich.
    Das ganze sollte auch Reboot-Fest sein (deshalb der Eintrag in die modules-Datei da der Raspy später in einem Gehäuse ohne Monitor arbeiten soll.
    (Außenfühler, Innenfühler und Wassertemperatur Pool)
    Damit man von unterwegs aus mal schauen kann was zuhause los ist, Domain-Namen hab ich und wie ich die Ports weiterleite ist auch bekannt ;)
    Wenn ihr mehr Infos braucht dann her damit ;)

    Vielen Dank schonmal
    freak3289

  • Also...

    Wenn du die Daten in PHP anzeigen lassen willst, dann hast du unterschiedliche Möglichkeiten:
    1.) Du kannst aus PHP raus direkt mit shell_exec arbeiten. Damit kannst du aus PHP raus Befehle auf der Console absetzen.
    Beispiel:

    Code
    $val = trim(@shell_exec("cat /sys/bus/w1/devices/<devid>/w1_slave"));


    Das trim entfernt noch gleich alle whitespaces am Anfang und Ende der Ausgabe. Den Wert speichert er anschließend in $val. Diese Variable kannst du jetzt mit PHP weiter verarbeiten oder einfach per Echo ausgeben.
    Falls du ein Graph zeichnen willst kann ich PHPlot empfehlen. Das ist recht einfach gehalten und reicht für die meisten Zwecke vollkommen aus.

    2.) Du schreibst dir ein Bash-Script welches per Cronjob alle (z.B.) 60 Minuten ausgeführt wird und die Temperaturen der drei Sensoren ausliest (Befehl siehe oben) und anschließend in einem einheitlichen Format in eine Textdatei schreibt.
    Diese Textdatei kannst du anschließend mit PHP auslesen (file() ). Das Ergebnis kannst du dann wieder an PHPlot übergeben und grafisch darstellen lassen.

    Ich würde die 2. Methode bevorzugen, da dort eben die Daten jeweils im 60 Minuten Abstand (oder weniger) ausgelesen und in der Textdatei gespeichert werden. Was du anschließend mit den Daten anstellst kannst du dann immer noch im PHP Script entscheiden.

    Linux - Für das Leben nach dem Absturz!

    Edited once, last by Nightskill (July 22, 2013 at 12:13 PM).

  • ich auch

    Fragen welches OS wäre am geeignetsten ? warum wheezy ?
    am PI wird kein Monitor hängen, also SSH und oder VNC aber da war doch was mit VNC und X-Win ging das zusammen ?
    es soll als Webseite angezeigt werden

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Hi @ all
    Hi Nightskill,
    danke für deine ausführliche Antwort und deine verlinkungen, werde mir das später nochmal genauer anschauen und mal testen wenn ich dazu komme.
    Wäre eigendlich auch eine "Echtzeit" Ausgabe möglich oder braucht´s dazu Java und so´n zeugs? Man sieht ja manchmal auf Webseiten die Uhrzeit eingeblendet, da aktualisiert sich ja auch nicht die Seite im Sekundentakt sondern nur die Zeit. Wie ginge das denn, bzw. überhaupt möglich?
    Wenn das wirklich so einfach sein soll wie du schreibst dann drücke mir mal die Daumen... das erstere sieht für mich einfacher aus, brauche ich dafür einfach nur einen php-Editor, die Zeilen einschreiben und das ganze dann auf den PI schieben? Oder ist es dann doch etwas schwieriger?
    Mit dem 2. komme ich noch nicht ganz klar, wie geht das mit dem Bash und den Zeiten? oO
    @ Jar,
    Ich weiss auch nicht, hab das überall gelesen das die Projekte mit Fühlern per Wheezy realisieren, da dachte ich mir das ist evtl. einfacher das auch so anzufangen...
    Klar, der PI hängt dann in einem Nebengebäude per LAN oder WLAN, ich muss mal schauen was da so liegt, also ohne andere Hardware. Zum warten könnte man diese aber wiederrum hinschaffen, das wäre kein Problem, wenn das ganze läuft sollte daran erstmal nichts mehr gefummelt werden ;)


  • Wäre eigendlich auch eine "Echtzeit" Ausgabe möglich oder braucht´s dazu Java und so´n zeugs? Man sieht ja manchmal auf Webseiten die Uhrzeit eingeblendet, da aktualisiert sich ja auch nicht die Seite im Sekundentakt sondern nur die Zeit.

    Hallo,

    die Uhrzeit wird meistens ja von der Lokalen Maschine mit JavaScript ausgegeben. Bei der Temperatur sieht es etwas anders aus, die muss ja immer wieder vom Raspi ausgelesen werden.

    Ich wollte auch eine Live-Anzeige haben, die möglichst genau die Temperatur ausgibt. Aber der 1-Wire Bus muss ja immer wieder ausgelesen werden. Ich hab mich zuletzt für die Bash-Variante entschieden und schreibe die Temperatur damit (und einem Cron-Job) in eine Datei und lese sie anschließend mit PHP/JavaScript minütlich aus. Wenn man ehrlich ist, reicht in den meisten Anwendungsfällen auch ein Intervall von einer Minute. ;)

    Du kannst mein Script als Anregung nutzen:
    Bash-Script für den Cron-Job

    Und als PHP-Funktion kannst Du folgenden Code übernehmen:

    Code
    //$sensor entspricht der Sensor-ID
    function get_temperature($sensor){
     $file = json_decode(file_get_contents('/tmp/temperature.json'), true);
     $temperatur = round($file[$sensor], 1);
     return $temperatur."°C";
    }

    Der Aufruf erfolgt dann einfach so:

    PHP
    <?php
     echo get_temperature("28-12345678");
    ?>

    Gruß
    Christian

    Edited once, last by Chris1705 (July 22, 2013 at 5:19 PM).

  • Hi Chris,
    natürlich reicht ein Intervall von einer Minute, selbst 5 Minuten würden es tun.
    Wie geht das ganze dann? Läd er dann nach einer Minute die Seite neu nach oder werden nur die Werte aktualisiert?
    Problem wäre dann ja die Ausgabe auf Handy-Browsern wenn die Seite aktualisiert werden müsste...

    Muss dazu sagen das ich absoluter Linux Neuling bin, habe davor immer Windows Zeugs gehabt und mit Linux nie wirklich gearbeitet ;)
    Wie muss ich das Bash-Skript interpretieren? Wie eine Batch-Datei im Windows? Mir kommen die echo und if-Anweisungen bekannt vor.
    Dann könnte ich dein Skript ja mal einfach in eine Textdatei kopieren, dann hätte ich das schonmal auf dem PI.
    Wie muss ich dann damit bzw. mit dem Code umgehen? Gibt's da eine spezielle Dateiendung damit das ausgeführt wird und wie mache ich einen Autostart dafür, das ich es ohne eingeloggten Benutzer ausführen kann?
    Dann erstelle ich eine *.php-Datei und schiebe den oberen Code da rein, kommt der untere dann einfach auch mit in die gleiche Datei oder wird das von einer anderen abgefragt? Das ganze dann in den wwwroot...
    Brauche ich dafür noch eine Datenbank?
    Gibt er mir dann alle Sensoren aus *cat /sys/bus/w1/devices/$sensor/* aus oder nur den ersten bzw. den mit der eindeutigen Kennung?

    Für das ich damit wirklich noch nie etwas gemacht habe finde ich die Übersicht an sich im Linux ganz komfortabel, gerade weil die Geräte alle einzeln in Ordnern abgelegt sind. Wenn ich mal dahinter bin gibt es kein halten mehr, habe so viele Ideen, weiss aber noch nicht wie ich es umsetzen kann ;)
    Schön wäre es wenn Windows das auch so bissl hätte, dann wäre alles einfacher zu verstehen. Aber da darf man ja sowieso an nichts rumpfuschen^^


  • Wie muss ich das Bash-Skript interpretieren? Wie eine Batch-Datei im Windows? Mir kommen die echo und if-Anweisungen bekannt vor.
    Dann könnte ich dein Skript ja mal einfach in eine Textdatei kopieren, dann hätte ich das schonmal auf dem PI.
    Wie muss ich dann damit bzw. mit dem Code umgehen? Gibt's da eine spezielle Dateiendung damit das ausgeführt wird und wie mache ich einen Autostart dafür, das ich es ohne eingeloggten Benutzer ausführen kann?


    Für das ich damit wirklich noch nie etwas gemacht habe finde ich die Übersicht an sich im Linux ganz komfortabel, gerade weil die Geräte alle einzeln in Ordnern abgelegt sind. Wenn ich mal dahinter bin gibt es kein halten mehr, habe so viele Ideen, weiss aber noch nicht wie ich es umsetzen kann ;)
    Schön wäre es wenn Windows das auch so bissl hätte, dann wäre alles einfacher zu verstehen. Aber da darf man ja sowieso an nichts rumpfuschen^^


    Bash-Scripte unter Linux sind quasi das Gegenstück zu Batch unter Windows.
    Du kannst das Script in eine leere Datei kopieren; die Datei-Endung ist egal. Die erste Zeile ist dagegen sehr wichtig und wird als Shebang bezeichnet. Diese Zeile gibt an, mit welchem "Interpreter" die Datei ausgeführt wird. (Im Beispiel mit /bin/bash).
    Wichtig ist auch, dass du der Bash-Datei nach dem Erstellen noch Ausführrechte geben musst:

    Code
    chmod +x <bashdatei>


    Den "Autostart" würde ich über Cronjobs realisieren. Das ist ähnlich zu den "geplanten Aufgaben (Scheduled Tasks)" unter Windows. Wie du da ein Script hinterlegst sagt dir zum Beispiel diese Seite.



    Dann erstelle ich eine *.php-Datei und schiebe den oberen Code da rein, kommt der untere dann einfach auch mit in die gleiche Datei oder wird das von einer anderen abgefragt? Das ganze dann in den wwwroot...
    Brauche ich dafür noch eine Datenbank?
    Gibt er mir dann alle Sensoren aus *cat /sys/bus/w1/devices/$sensor/* aus oder nur den ersten bzw. den mit der eindeutigen Kennung?


    Der obere Code ist nur die Funktion in PHP. Wenn du diesen Code alleine in eine Datei kopierst, wird dieser nicht ausgeführt werden. Erst der untere Code ruft die Funktion auf und führt somit den Code aus.
    Du kannst beides in eine Datei packen. Ist für dich für den Anfang am einfachsten.

    Eine Datenbank brauchst du nicht mehr. Die ganzen Daten werden in "/tmp/temperature.json" gespeichert.
    Der Code gibt immer nur einen Sensor aus; und zwar den, den du der Funktion übergibst. Im Beispiel wäre das "28-12345678".
    Du würdest also für jeden Sensor die Zeile

    Code
    echo get_temperature("28-12345678")


    benötigen.

    Die ganze PHP-Datei könnte dann so aussehen (die Sensor-ID's sind anzupassen!):

    Linux - Für das Leben nach dem Absturz!

  • Ich habe mir ein Python Script gebastelt, welches bis zu 10 Sensoren abfragt, die Werte mit RRDTool speichert und Grafiken erstellt. Dieses Script lasse ich per Cronjob alle fünf Minuten laufen. Dazu habe ich mir ein PHP-Script zusammengeklaubt, welches die erzeugten Bilder nach Namen sortiert anzeigt und die geladene Seite alle fünf Minuten aktualisiert. Die Intervalle kannst du natürlich auch kürzer einstellen.
    Meine Programmierfähigkeiten sind sicher nur rudimentär, aber es funktioniert und wenn du interesse hast schicke ich es gerne zu!

  • Dann füge ich hier den Code ein. Folgende PHP-Datei liegt als index in /var/www/, die lädt automatisch die erzeugten Bilder und aktualisiert sich nach fünf Minuten.

    Im Unterordner /var/www/temperature/ liegt das Script, welches alle fünf Minuten als Cronjob ausgeführt wird. Das Script ist für Python3 und stellt meinen ersten Versuch mit Python dar, Verbesserungsvorschläge sind willkommen! Ich habe meine Kommentare, auch was ich irgendwann noch hinzufügen will, mal drin gelassen. Ich hoffe es hilft.
    - Es wird, sofern noch nicht vorhanden, eine Datenbank für die angegebene Anzahl Sensoren erstellt.
    - Da ich manchmal Probleme beim Auslesen der Sensoren hatte (trat immer bei Last auf dem USB-Bus auf, zB wenn ein Paket heruntergeladen wird), werden diese bei Lesefehlern bis zu drei Mal ausgelesen, bis der CRC ok ist oder der Wert "U"nknown an die Datenbank gegeben wird.
    - Die RRD erwartet alle fünf Minuten neue Daten.
    - Das Intervall gibt den Zeitraum in Stunden an, für den die Grafiken erstellt werden.
    - Bei mehr oder weniger als vier Sensoren müssen die Zeilen bei rrd_graph angepasst werden.

    Edited once, last by c-st (July 24, 2013 at 9:45 AM).

  • bin ja gespannt wie das wird:

    so sieht gerade aus über 40°C auf meinem Balkon, schätze der Sensor bekommt Sonne ? mal sehen ob ich ihn nicht in den Schatten legen kann

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Hallo Leute, habe meinen Raspi nochmal neu aufgesetzt da ploetzlich die Fuehler nicht mehr erkannt wurden.
    Nun bin ich am verzweifeln, bekomme kein einziges Script mehr zum laufen.
    Der Sensor jedoch wird erkannt.
    Hab mich nun mal an c-st s anleitung gehalten.
    PHP-installier und die Datei in den www Ordner kopiert. Das ganze erstmal als temperatur.php
    Die index-Datei vom Apache wurde angezeigt. Beim aufruf der temperatur.php bzw. jetzt index.php kommt nur ein weisser Browser. Ohne inhalt.

    Das python3 - script habe ich auch erstellt, in eine Textdatei gepackt und ausfuehrrechte erteilt.
    Dieses liegt im www/temperature ordner.

    Im crontab ist das ganze auch aktiviert.

    Fuehre ich den Befehl manuell aus erscheint im Terminal folgendes:

    root@raspberrypi:/home/pi# /var/www/temperature/temp.py
    File "/var/www/temperature/temp.py", line 7
    max_sensors = 10 # Maximum number of sensors that might be connected.
    ^
    SyntaxError: invalid character in identifier
    root@raspberrypi:/home/pi#


    Habe auch gelesen das ich eine Zeile bearbeiten muss da ich nur einen Sensor habe aber was genau muss da rein?
    Hoffe ihr helft mir nochmal :)

  • So, wollte mich nur nochmal Rückmelden, habe ein kleines Script gebastelt das die Sensoren ausließt und die Werte in eine Datei ausgibt. Das ganze so eingerichtet das es alle Minute ausgelesen bzw. gestartet wird.
    Das Script Schreibt in die HTML-Datei die im /WWW -Ordner liegt zum einen die Werte der zwei Sensoren, das °C Zeichen sowie eine Beschreibung des jeweiligen Sensors.
    Das ganze wird dann in einer anderen also der index-Datei geladen (Eingeschlossene Seite) Die Indexseite ist Formatiert und so eingerichtet das sie den Browser veranlasst die Seite alle 30 Sekunden neu zu laden.
    Das klappt problemlos im Linux eigenen Browser, im IE sowie auf dem Android Phone.
    Hab mir auch eine Portweiterleitung gebaut und konnte bequem von unterwegs aus schauen.
    Leider ist das Wlan an der Stelle unstabil sodass es oft zu Ladefehlern kommt. Mal schauen wie ich das noch mache.
    Wisst ihr zufällig wieso die Funktion
    echo DATE
    immer knapp zwei Stunden nach geht? Wenn ich die Funktion:
    echo "Temperaturen" > $FILE
    echo "Letzte Aktualisierung: >> $FILE
    echo DATE >> $FILE
    dann erstellt er mir immer wieder die neue HTML (die unter FILE Definiert wurde) neu. Die Temperaturwerte (die Befehle Weiß ich jetzt nicht aufwendig) werden sauber aktualisiert aber eben die Uhrzeit geht plötzlich zwei Stunden nach.
    Hab mit dem ntp-Server aktualisiert aber der Sagt dann : Lokale Zeit 15:20 statt 17:43 z.B.
    Die Locale Einstellungen sind auf Europe und Berlin, sollte ja richtig sein...
    Da halt auch die Minuten falsch gehen kann ich nicht mal die GMC auf +2 setzen.. oO
    Evtl. fällt ja jemandem noch was ein ;)
    LG

  • Ja, werde ich am we mal tun, muss es erst wieder aufbauen, war ja nur zum testen.
    Denke aber die Programmierung ist eher schlecht, aber solange es geht...
    Jedenfalls kann man da gut die schritte ableiten.
    So long...

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!