Forum: Mikrocontroller und Digitale Elektronik Raspberry Pi: Messwerte im Webbrowser anzeigen


von Felix L. (flex)


Lesenswert?

Hallo,

ich bin dabei eine Wetterstation zu bauen und möchte die Messwerte im 
lokalen Netzwerk anzeigen. Die Messwerte werden von einem AVR/ARM 
gemessen und ausgewertet und dann via I2C oder UART an das RPi 
weitergegeben. Meine Frage ist es nun, wie aufwendig ist es die 
Messwerte über einen Apache Webserver anzeigen zu lassen. Da ich über 
keine PHP Kenntnisse verfüge reicht eine simple Webdarstellung mit 
HTML/CSS. Wie bekomme ich die eingelesenen Werte in den Webserver?

Gruß
Felix

von Thomas (Gast)


Lesenswert?

Je nach Raspberry Distribution sollte ein "apt-get install apache2" und 
das kopieren einer Textdatei mit den Werten nach /var/www schon 
reichen...

Thomas

von Sascha W. (sascha-w)


Lesenswert?

Hallo Felix,

werden die Daten die vom AVR kommen auf dem PI schon irgendwie 
weiterverarbeitet?

es gibt zwei Möglichkeiten:
1.
Wenn neue Daten hereinkommen daraus eine Datei erstellen die dann im 
www-Verzeichnis von Apache landet und vom Browser direkt angezeigt 
werden kann. Es kann auch eine Javascriptdatei sein, deren Daten dann 
vom Browser verarbeitet und dargestellt werden.
- wie von Thomas vorgeschlagen

2.
Die eingehenden Daten speichern (Umgebungsvariable, Datei, ...)
Beim Abruf der Seite über Apache ein Script (PHP, Perl, Python) aufrufen 
das aus den zwischengespeicherten Daten die Seite erstellt.

Sascha

von Felix L. (flex)


Lesenswert?

Vielen Dank für die Antworten.

Sascha Weber schrieb:
> werden die Daten die vom AVR kommen auf dem PI schon irgendwie
> weiterverarbeitet?

Die Daten die vom AVR kommen sind schon fertig, also Temperatur, 
Luftfeuchte, etc.

Ich habe es mir so vorgestellt, ich schreibe auf dem RPi ein C-Programm, 
dass die Daten empfängt und in einer HTML Datei richtig einordnet. Diese 
Datei wird dann in das passende Verzeichnis kopiert und das alte 
überschieben.
Kann ich alle diese Schritte in C machen? Das empfangen denke ich schon, 
aber die HTML Datei erzeugen und das verschieben/ersetzen?

Gruß
Felix

von Thomas (Gast)


Lesenswert?

ja, kann man so machen

von c.m. (Gast)


Lesenswert?

wobei php auch nicht schwer zu erlernen ist. du hast ja jetzt ein 
spezifisches problem und kannst anhand dessen erste schritte in php 
wagen :)

vorteil davon wäre das du später mal interaktivität in die seite 
einbauen könntest, oder auch einen graph, z.b. mit rrdtool.

von Noch einer (Gast)


Lesenswert?

Am einfachsten geht es mit http://oss.oetiker.ch/rrdtool/

Damit lassen sich die Daten ohne Aufwand Minutenweise und als 
Jahresübersicht ausgeben.

Daten einlesen ist auch als Skript schnell genug. Daten als Text 
anzeigen ist als CGI-Script auch schnell genug. Grafische Darstellung 
braucht auf dem Raspi ein paar Sekunden - so gerade noch erträglich.

(3 Datenbanken mit 1 Update pro Sekunde ist keine gute Idee - da ist 
nach 1/2 Jahr die SD-Karte Schrott).

von Klaus H. (klummel69)


Lesenswert?

Apache halte ich für das handling von statischen Dateien auf dem kleinen 
Rechner für etwas oversized. Es gibt Webserver, die weniger Recourcen 
benötigen, zum Beispiel
lighttpd, monkey, oder „busybox hhtp“ (einfach mal googlen).

Eine weitere Alternative: Python ist bei den meisten Distributionen 
schon installiert. Der Aufruf

python -m SimpleHTTPServer 8000

startet einen einfachen Webserver der Zugriff auf Files des aktuellen 
Verzeichnisses per hhtp erlaubt. Für ein internes Netzwerk, in dem meist 
nur ein paar User zugreifen, reicht so etwas meist aus.

Ich persönlich nutze für ein Projekt Python plus ein kleines 
Webframework namens Bottle.py. Ein Python Programm holt Daten per RS232 
ab und speichert sie als File. Ein zweites Python Programm mit Bottle.py 
bildet den Webserver und stellt die Dateien zur Verfügung.

Wie in der Antwort oben schon beschrieben:
Vorsicht mit dem Schreiben von Daten alle x Sekunden. Das mögen die SD 
Karten nicht unbedingt. Eine Karte war nach 6 Monaten hin.

Ich habe mein System umgestellt: Die Datei wird zuerst in eine Ramdisk 
geschrieben. Alle 30min wird diese auf der SD Karte gesichert.

: Bearbeitet durch User
von Felix L. (flex)


Lesenswert?

c.m. schrieb:
> wobei php auch nicht schwer zu erlernen ist. du hast ja jetzt ein
> spezifisches problem und kannst anhand dessen erste schritte in php
> wagen :)
>
> vorteil davon wäre das du später mal interaktivität in die seite
> einbauen könntest, oder auch einen graph, z.b. mit rrdtool.

Das ist richtig, aber zuerst möchte ich das ganze zum laufen bekommen 
und später kommt dann das Feintuning.

Noch einer schrieb:
> (3 Datenbanken mit 1 Update pro Sekunde ist keine gute Idee - da ist
> nach 1/2 Jahr die SD-Karte Schrott).

Ich habe an alle 10min bis 30 min gedacht.

Klaus Hummel schrieb:
> Eine weitere Alternative: Python ist bei den meisten Distributionen
> schon installiert. Der Aufruf
>
> python -m SimpleHTTPServer 8000
>
> startet einen einfachen Webserver der Zugriff auf Files des aktuellen
> Verzeichnisses per hhtp erlaubt. Für ein internes Netzwerk, in dem meist
> nur ein paar User zugreifen, reicht so etwas meist aus.

Das Problem hierbei ist Python. Es ist bestimmt sehr praktisch, aber aus 
Zeitgründen möchte ich vorerst keine neue Programmiersprache lernen, 
sondern alles in C bzw. C++ realisieren.

von Noch einer (Gast)


Lesenswert?

Kein Problem, CGI-Skripte für einen Webserver kannst du auch in C 
schreiben. Ob du statische Seiten generierst, oder CGI in C schreibst - 
der Aufwand zur Programmierung ist der selbe. Performance musst du nur 
bei grafischer Darstellung berücksichtigen.

von c-hater (Gast)


Lesenswert?

Felix L. schrieb:

> Das Problem hierbei ist Python. Es ist bestimmt sehr praktisch, aber aus
> Zeitgründen möchte ich vorerst keine neue Programmiersprache lernen,
> sondern alles in C bzw. C++ realisieren.

Es ist eigentlich prinzipiell scheißegel, in welcher Sprache du eine 
serverseitige Anwendung erstellst, jedenfalls wenn CGI als Schnittstelle 
zur Kopplung zwischen Webserver und Anwendung verwendet wird, was in 
deinem Szenario sicher völlig ausreichend wäre.

Eine CGI-Anwendung ist eigentlich nichts anderes als ein ganz 
stinknormales EVA-Kommandozeilenprogramm. Und das darf natürlich auch in 
C oder C++ geschrieben sein.

Der Server ruft startet bei einem Zugriff auf die entsprechende 
Webadresse die ausführbare Datei und übergibt ihr einen Haufen 
Parameter, teils als Kommandozeilenargumente, teils in 
Umgebungsvariablen, teils über stdin. Wo genau was und wie an 
Informationen für die Anwendung bereitgestellt wird, steht in der 
CGI-Spezifikation.

Die Anwendung macht nun ihr Ding auf Grund der vom Webserver 
bereitgestellten Informationen und ballert letztlich über stdout den 
Quelltext einer Webseite als Ergebnis ihrer Arbeit raus, bevor sie sich 
beendet. Diese Ausgabe des Programms liefert der Webserver dann an den 
Aufrufer aus. Das ist schon das ganze "Geheimnis" serverseitiger 
Anwendungen.

Für einen ersten Test der korrekten CGI-Konfiguration des Webservers 
reicht erstmal ein ganz primitives "Hello world", dem die ganzen 
Eingaben scheißegal sind. Der einzige Unterschied zu einem normalen 
"Hello world" für die Kommandozeile ist, daß die Zeichenkette eben in 
den (hoffentlich korrekten) Quelltext einer Webseite eingebettet sein 
sollte, das String-Literal fällt also ein wenig länger aus...

von Julian E. (julian_e27)


Lesenswert?

So ein Projekt habe ich neulich auch gemacht. Hier mal ganz vereinfacht, 
was ich gemacht habe: Als Webserver läuft Apache (zwar oversized, wie 
zuvor schon gesagt wurde, aber wer weiß, was noch dazu kommt.

Die Messdaten (2x DHT22, Temperatur und Luftfeuchte) werden über ein 
Python-Skript in einer txt-Datei abgespeichert und in die index.html im 
Apache-www-Verzeichnis eingebunden und somit auf der Seite angezeigt.

Weiterhin logge ich die Daten und schreibe sie über ein Python-Skript 
fortlaufend in eine csv-Datei. Mit der JavaScript-Library dygraph wird 
der Messdatenverlauf visualisiert und in die Webseite eingebunden. Wie 
das aussieht, sieht man auf www.dygraphs.com.

Die Ausführung der beiden Python-Skripte wird über einen cronjob 
vorgenommen und die Webseite wird somit in festen Intervallen 
aktualisiert (hier: stündlich).

Python dürfte hier meiner Meinung nach keine Hürde darstellen. Ich habe 
die Python-Skripte ohne jegliche Vorkenntnisse mit Hilfe von 
Google-Suchen programmiert und war damit womöglich schneller, als ich es 
mit C hätte sein können.

von Noch einer (Gast)


Lesenswert?

Da hätte ich eine Frage zu.

Das 'rrdtool graph' ist auf dem Raspi recht träge. Hat jemand einen 
Vergleich rrdgraph auf Raspi vs. rrdfetch auf Raspi + dygraph auf einem 
modernen PC?

von Julian E. (julian_e27)


Lesenswert?

An diejenigen, die die mit dem CGI-Scripting von Apache auskennen:

Ist es möglich, über CGI auch sudo-Befehle auszuführen?

Beispiel: ich möchte auf meiner Webseite einen "Aktualisieren"-Button 
realisieren, der ein Python-Skript ausführt, um die Sensoren auszulesen 
und deren aktuelle Werte abzuspeichern. Dadurch hätte ich als Benutzer 
die Möglichkeit, die Messwerte bei Bedarf zu aktualisieren. Für das 
Auslesen der Sensoren brauche ich allerdings Zugriff auf die GPIO-Ports, 
der meines Wissens nach nur dem root-User gestattet ist.

von Karl (Gast)


Lesenswert?

Felix L. schrieb:
> Das Problem hierbei ist Python. Es ist bestimmt sehr praktisch, aber aus
> Zeitgründen möchte ich vorerst keine neue Programmiersprache lernen,
> sondern alles in C bzw. C++ realisieren.

Ich behaupte mal, dass du das Problem mit Python schon gelöst hast, 
während du bei C noch deine Variablen deklarierst. String-Operationen 
sind in C einfach hässlich!

von Noch einer (Gast)


Lesenswert?

Zugriff auf /sys/class/gpio/... ?
Habe in einem Init-Script die Zugriffsrechte gesetzt. Später las ich, es 
würde ausreichen, den Apache User in die Gruppe gpio aufzunehmen.

von Pete K. (pete77)


Angehängte Dateien:

Lesenswert?

Also ich habe meine Daten in eine mysql Datenbank geschrieben und dann 
mit www.highcharts.com auf einem Apache2 visualisiert.

von c-hater (Gast)


Lesenswert?

Karl schrieb:

> Ich behaupte mal, dass du das Problem mit Python schon gelöst hast,
> während du bei C noch deine Variablen deklarierst. String-Operationen
> sind in C einfach hässlich!

Python lernen ist noch häßlicher! Wenn schon eine Scriptsprache für CGI, 
dann Perl.

Aber du hast insofern Recht, als daß C für CGI-Anwendungen wirklich 
Scheiße ist. C läßt zu viele Freiheiten und zu viele Fehler zu (ja 
teilweise werden sie geradezu gefördert), so daß man allein die 
Verwendung von C schon als eine einzige riesige potentielle 
Sicherheitslücke betrachten kann.

von tmomas (Gast)


Lesenswert?

Noch einer schrieb:
> Das 'rrdtool graph' ist auf dem Raspi recht träge.

Was verstehst du unter "träge"?

von Jo (Gast)


Lesenswert?

Hallo!

Auch wenn es ziemlich langsam ist: auf dem raspberry ist wolfram 
installiert; das liefert Dir über die Import-Funktion und beispielsweise 
DateListPlot oder TemperaturGauge Bilder, die Du im Webbrowser (dafür 
braucht man nicht den "Moloch" apache, sondern lighttpd) anzeigen 
kannst.
Beispiel für ein script:

#!/usr/bin/wolfram -script
datamin=Import["/var/www/temperatur/min.txt","List"]
datamax=Import["/var/www/temperatur/max.txt","List"]
datalast=Import["/var/www/temperatur/last.txt","List"]
Export["/var/www/temperatur/dtherm.jpg",
ThermometerGauge[datalast, {-10, 50},
GaugeLabels -> "Value",
GaugeFrameStyle -> Gray,
GaugeFaceStyle ->{"LightBlue"}],
 ImageSize ->{300,300}]

Passt das für Dich? Die Möglichkeiten, Daten zu visualisieren sind 
ziemlich groß

VG

Joachim

von Jo (Gast)


Lesenswert?

noch etwas: wolfram braucht dafür xvfb, um Bilder zu erzeugen; das ganze 
mache ich über einen cronjob in einem script. im .wl liegt das 
wolfram-script

/usr/bin/xvfb-run -s "-screen 0 640x480x24" 
/var/www/temperatur/dtherm.wl > /dev
/null

von Klaus H. (klummel69)


Lesenswert?

>> Ich behaupte mal, dass du das Problem mit Python schon gelöst hast…
>Python lernen ist noch häßlicher! Wenn schon eine Scriptsprache für CGI,
dann Perl.

Ich arbeite mit verschiedenen Sprachen und habe Python gelernt um 
schnell solche Skripte erstellen zu können. Die Libs sind umfangreich. 
Aber im Grunde meines Herzens bin ich Fan von streng typisierten 
Sprachen. Ich habe schon mehr Zeit bei Python beim Debuggen verbracht, 
als beim Korrigieren von C Compilermeldungen wg. falschen Datentypen.

>Aber du hast insofern Recht, als daß C für CGI-Anwendungen wirklich
Scheiße ist.
Man sollte dann zumindest gescheite Libraries nutzen, die einem einiges 
abnehmen (womit wir meist bei C++ wären…).


@Felix L: Wie hast Du es jetzt denn gelöst?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.