Wie zeige ich die Temperatur des internen Sensors auf einer HTML-Seite an?

14

Ich bin gerade dabei, und während ich die Temperatur über SSH anzeigen kann, habe ich Probleme damit, sie auf der kleinen Webseite anzuzeigen, die ich auf meinem Pi mit Apache2 eingerichtet habe. Ich folgte diesem Beispiel http://www.raspberrypi.org/phpBB3/viewtopic.php?t=35487&p=310038, das AJAX und ein Skript im cgi-bin-Verzeichnis enthielt, aber ich erhalte die Fehlermeldung, dass $ was not defineddies wirklich ahnungslos ist Mit JavaScript habe ich keine Ahnung, wo der Fehler liegt. Ich frage mich, ob es das CGI-BIN-Verzeichnis sein könnte. Ich habe es gerade erstellt und konnte keine Informationen darüber finden, ob ich etwas Besonderes tun musste, um seine Verwendung für Skripte zu ermöglichen. Kann mir jemand diese Frage beantworten? Wenn es relevant ist, verwende ich die neueste Version von Raspbian.

Schließlich möchte ich die Werte in einer Datenbank protokollieren und von dort grafisch darstellen, aber das Wichtigste zuerst. :)

Die Hauptfrage ist, wie kann ich die Temperatur auf meiner Webseite vom internen Sensor anzeigen lassen?

BEARBEITEN

Ich werde den ersten Vorschlag später heute Abend versuchen, wenn ich nach Hause komme, aber ich habe schnell den zweiten (Lenik) in Gang gebracht, der anscheinend gut funktioniert. Ich musste allerdings einige Änderungen vornehmen, damit es funktioniert. Das Skript hat die rrd-Datei nicht erstellt, daher habe ich sie manuell mithilfe der Syntax erstellt, die er im Skript verwendet hat. Ich habe auch den UPDATEBefehl geändert, da er den Wert, der an ihn übergeben wurde, nicht mochte. Ich musste den widthTeil aus dem GRAPHBefehl entfernen, da er ebenfalls einen Fehler verursachte. Dann am Ende habe ich ein cpso hinzugefügt , dass es die Datei in das Bilderverzeichnis der Website legt und dann hinzufügt*/5 * * * * /home/root/scripts/temprec.sh >/dev/null 2>&1zu meiner crontab so läuft es alle 5 minuten. Es scheint zu funktionieren, aber mit nur 4 Proben ist es bisher schwierig, sicher zu wissen. Innerhalb einer Stunde oder so habe ich eine bessere Idee, ob meine Änderungen funktioniert haben.

#!/bin/bash
#
# update .rrd database with CPU temperature
#
# $Id: update_cputemp 275 2013-05-16 05:20:56Z lenik $
# Thanks to Lenik @ Raspberrypi.stackexchange.com.
cd /path/to/scripts
# read the temperature and convert .59234. into .59.234. (degrees celsius)
TEMPERATURE=`cat /sys/class/thermal/thermal_zone0/temp`
TEMPERATURE=`echo -n ${TEMPERATURE:0:2}; echo -n .; echo -n ${TEMPERATURE:2}`
/usr/bin/rrdtool update cputemp.rrd N:$TEMPERATURE
/usr/bin/rrdtool graph cputemp.png DEF:temp=cputemp.rrd:cputemp:AVERAGE LINE2:temp#00FF00
cp /path/to/scripts/cputemp.png /path/to/website/images
Trido
quelle

Antworten:

16

Das $ scheint, als würden Sie versuchen, jQuery zu verwenden . In diesem Fall können Sie es auch herunterladen und installieren.

Da Sie auf dem Pi sind, würde ich auch empfehlen, Ihre eigene Webanwendung mit Tornado zu schreiben . Es wurde mit Python (der bevorzugten Sprache von Pi) geschrieben und ich finde es immer sehr einfach, damit Webanwendungen zu erstellen.

Installieren Sie es einfach mit 'sudo apt-get install python-tornado'. Ich habe gerade eine minimalistische Tornado-Web-App geschrieben, die Sie ausprobieren konnten (ich konnte sie nicht testen), indem Sie eine Funktion aus einem anderen Forumsbeitrag verwendeten :

#!/usr/bin/env python

import tornado.ioloop
import tornado.web
import os

class MainHandler(tornado.web.RequestHandler):
    def getCPUtemperature( self ):
        res = os.popen('vcgencmd measure_temp').readline()
        return(res.replace("temp=","").replace("'C\n",""))

    def get(self):
        self.write( "Temperature: %s" % ( self.getCPUtemperature() ) )

application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

Wenn Sie dieses Programm ausführen ( chmod +x yourprogram.py ; ./yourprogram.py), sollten Sie in der Lage sein, Ihren Browser auf http: //raspberrypi.local: 8888 / zu verweisen und die Ausgabe zu sehen.

Update: Ich habe das obige Skript gerade zu Hause ausprobiert und es funktioniert. Nicht schön, aber es ist ein Anfang!

Arne
quelle
Danke dafür. Wenn ich heute Abend nach Hause komme, werde ich es versuchen, weil mir die Idee dahinter gefällt.
Trido
13

Vor einiger Zeit schrieb ich einen Artikel " Raspberry Pi :: Überwachung der CPU-Temperatur mit RRDTOOL " über das gleiche Problem. Meine Lösung umfasst das Empfangen der CPU-Temperatur, das Speichern in der Round-Robin-Datenbank und das Erstellen eines netten Diagramms als PNG-Datei, das ganz einfach auf der Webseite abgelegt werden kann. Kopieren Sie es einfach, wo immer Sie möchten. Ich hoffe, Sie werden es nützlich finden.

Bildbeschreibung hier eingeben

lenik
quelle
1
Danke dafür. Ich musste es bearbeiten, aber ich brachte es zum Laufen und brachte einige neue Dinge über Bash-Scripting und RRD bei, von denen ich wenig weiß. Ich habe meinen Beitrag bearbeitet, um zu reflektieren, was ich getan habe, und dies hilft hoffentlich jemandem, der wissen möchte, wie das geht.
Trido
2

Ich glaube, Sie könnten die Daten von Ihrem RPi abrufen, streamen und mit diesem Paket auf GitHub in den Browser einbetten .

So sieht ein Diagramm aus: https://plot.ly/~jensb89/12/ .

Sobald Sie Ihr Diagramm erstellt haben, können Sie es mit diesem Snippet als iframe einbetten:

<iframe id="igraph" src="https://plot.ly/~abhishek.mitra.963/1/400/250/" width="400" height="250" seamless="seamless" scrolling="no"></iframe>

Sie möchten Ihre URL im Code austauschen. Lassen Sie mich wissen, wenn Sie irgendwelche Probleme haben oder ich kann Ihnen bei allem helfen. Außerdem bin ich Teil von Plotly, das in diesem Paket verwendet wurde.

So sieht es aus:

Bildbeschreibung hier eingeben

Matthew Sundquist
quelle
Das sieht wirklich gut aus.
Trido
1

Die anderen Antworten hier sind fantastisch. Meine Lösung mit einem Shell-Skript und PHP lautet wie folgt:

Bitte beachten Sie, dass ich dies bei Raspbian Wheezy getan habe, sodass sich der Speicherort meines gesamten Codes in befindet /var/www/. Wenn Sie Jessie verwenden, muss es sich in '/ var / www / html /' befinden.

Erstens können Sie den Benutzer auf root umstellen (Superuser):

  • sudo su (und geben Sie Ihr Passwort ein)

An den richtigen Ort gelangen:

  • cd /var/www/ (Wheezy)

Nun legen Sie dort ein neues Verzeichnis an:

  • mkdir scripts

Gib ihm die richtigen Attribute:

  • chmod 755 scripts/

Erstellen Sie nun eine neue Datei, nennen wir sie 'temp.sh'.

  • nano scripts/temp.sh

Geben Sie den folgenden Code ein:

#!/bin/bash

cpuTemp0=$(/opt/vc/bin/vcgencmd measure_temp)
cpuTemp0=${cpuTemp0//\'C/}
cpuTemp0=${cpuTemp0//temp=/}

echo CPU: $cpuTemp0 > /var/www/include/temp.txt

Ctrl+X- Y- Enterspeichern und beenden.

Legen Sie nun die Attribute dieser Datei fest:

  • chmod 755 scripts/temp.sh

Erstellen Sie nun ein neues Verzeichnis

  • mkdir include/

Legen Sie die Attribute fest

  • chmod 744 include/

OK, jetzt können Sie das Skript ausführen und die Ausgabe testen:

  • cd scripts/
  • ./temp.sh
  • cd ../include/
  • cat temp.txt

Es sollte ungefähr so ​​aussehen:

53.5

Genial! Lassen Sie uns das einmal pro Minute ausführen. Wir werden eine neue Zeile in die Crontab eingeben.

  • crontab -e

Fügen Sie die untere Zeile am Ende der Datei ein

* * * * * /var/www/scripts/temp.sh

Ctrl+X- Y- Enterspeichern und beenden.

Jetzt müssen wir die Seite bearbeiten, auf der die Temperaturen angezeigt werden. Also bearbeiten wir die PHP-Datei:

  • cd /var/www/
  • nano index.php

Und fügen Sie dies in das <div>Ihrer Wahl ein:

<?php require_once("include/temp.txt"); ?>&#176;C

Das wird es schaffen. Laden Sie einfach Ihre Seite neu und Sie sollten sehen, dass die CPU- und GPU-Temps angezeigt werden.

Zusätzlicher Bonus: Ich möchte auch das Laden der Seite jedes Mal erzwingen (verhindern, dass der Browser die Temperatur zwischenspeichert). Dazu füge ich ganz am Anfang der Datei auch das folgende PHP ein:

<?php
    header("Cache-Control: no-cache, no-store, must-revalidate");
    header("Pragma: no-cache");
    header("Expires: 0");
?>

Hinweise: Der Grund, warum dies für mich funktioniert, ist, dass es auf einem Firmen-Dashboard angezeigt wird. Eine Seite auf einem Fernseher in meinem Büro, die eine ganze Reihe von Diagrammen anzeigt (Serverstatus, Benutzernummern, Durchschnittswerte usw. usw.). etc). Ich habe das pi so eingerichtet, dass es sich im Kiosk-Modus befindet (Vollbild-Browser beim Booten mit Iceweasel) und eine einzelne Seite angezeigt, die automatisch nach unten scrollt. Es dauert ungefähr 4 bis 5 Minuten, um von oben dorthin zu gelangen, und wird dann automatisch neu geladen, sobald es unten anschlägt. Daher wird es von Zeit zu Zeit neu geladen, ohne dass ich die Temperaturanzeige mithilfe einer clientseitigen Technologie aktualisieren muss. Ich habe es auch so eingerichtet, dass es mit einem anderen CSS / JS angezeigt wird, das auf dem Benutzeragenten basiert (kein Scrollen, keine aktuelle Zeit in der Ecke, kein Neuladen unten), aber in dieser Version

Jim
quelle