Forum: PC-Programmierung Monitoringsystem mit Webinterface


von Philipp W. (phil9)


Lesenswert?

Derzeit plane ich eine kleine Steuerung mit einem Monitoringsystem inkl. 
Webinterface. Ich würde jedoch gerne auch mit der Steuerung 
interagieren.
Für dieses Projekt werde ich einen Raspberry verwenden.
Ich bin momentan noch auf der Suche nach dem perfekten Umsetzungskonzept 
und wäre euch für jegliche Anregungen dankbar.
- kostenloses Hosting der Website?
- kostenlose Datenbank?
ThinkSpeak wäre auch eine nette Lösung nur gefällt es mit in Sachen 
Datenweiterleitung und Interaktion mit der Steuerung nicht sonderlich.

: Verschoben durch Moderator
von Antwort vom Antworter (Gast)


Lesenswert?

Nodered und Grafana ohne irgendein Webhosting auf dem Pi

von Mark B. (markbrandis)


Lesenswert?

Philipp W. schrieb:
> - kostenloses Hosting der Website?

Ein Webinterface bedeutet nicht unbedingt, dass das zu verwaltende Gerät 
per Internet erreichbar ist. Vielleicht befindet es sich ja bei Dir 
zuhause im Intranet. Dann lass doch auf dem Gerät einen einfachen 
Webserver laufen, den andere Geräte übers Intranet erreichen können.

> - kostenlose Datenbank?

Für viele Zwecke reicht SQLite:

https://de.wikipedia.org/wiki/SQLite

von Oliver S. (oliverso)


Lesenswert?

Auf dem Raspi läuft ein vollwertiges (Debian)-Linux. Damit wird der 
genauso zum Webserver wie alle anderen Linux-Rechner auch. Apache, 
nginx, MariaDB, PHP, was auch immer, und alles kostenlos. Das Web ist 
mehr als randvoll mit allem, was man dazu braucht.

Oliver

von Philipp W. (phil9)


Lesenswert?

Dankeschön für die ersten Anregungen.
Ich möchte die Website jedoch nicht am RasPi lokal hostn.

von Mark B. (markbrandis)


Lesenswert?

Philipp W. schrieb:
> Dankeschön für die ersten Anregungen.
> Ich möchte die Website jedoch nicht am RasPi lokal hostn.

Okay, also was willst Du eigentlich machen? Auf welchem Rechner soll das 
Webinterface laufen, und welche Verbindung soll dieser zum Rasberry Pi 
haben?

: Bearbeitet durch User
von Ingo D. (ingo2011)


Lesenswert?

Hi Phillip,

na, kostenlos wird schwierig.

> - kostenloses Hosting der Website?
> - kostenlose Datenbank?

Es gibt aber genügen Angebote, wo man für wenig
Euros einen Server im Internet bekommt.
Da kannst Du dann alles installieren was du möchtest (Grafana,Influxdb 
usw.)

z.B.
https://contabo.de/?show=konfigurator&vserver_id=206

Ich habe mit der Fa. nichts zu tun, habe aber dort seit einiger Zeit
dort auch ein paar Server stehen, und nutze die ganz ähnlich.
Gibt es aber bestimmt auch bei ganz vielen andern Anbietern..

Gruß Ingo , DH1AAD

von cppbert3 (Gast)


Lesenswert?

Philipp W. schrieb:
> Dankeschön für die ersten Anregungen.
> Ich möchte die Website jedoch nicht am RasPi lokal hostn.

Warum nicht lokal?

Wie kommen die Daten zum Webserver wenn der nicht auf dem Raspi läuft, 
lass mich raten, der Raspi soll in die DB schreiben und der Webserver 
pollt die Daten aus der DB?

Schreib doch mal auf wie du dir den Datenfluss vorstellst
Und warum du das so machen möchtest, oft sind die "einfachen Ideen" gar 
nicht so einfach

von Unbekannter (Gast)


Lesenswert?

cppbert3 schrieb:
> Wie kommen die Daten zum Webserver

AQMP, MQTT, HTTP/POST, ach es gibt so viele einfache Lösungen, zu denen 
es Tonnen von fertigen Frameworks und Libs gibt.

von cppbert3 (Gast)


Lesenswert?

Unbekannter schrieb:
> cppbert3 schrieb:
> Wie kommen die Daten zum Webserver
>
> AQMP, MQTT, HTTP/POST, ach es gibt so viele einfache Lösungen, zu denen
> es Tonnen von fertigen Frameworks und Libs gibt.

Ist mir klar, der Eingangspost lässt aber vermuten das das nicht alle 
wissen

von Philipp W. (phil9)


Lesenswert?

Tut mir leid, dass ich nicht gleich zu Beginn schon alles ausführlich 
und genau beschrieben habe. Der Grund dafür ist das ich auf diesem 
Gebiet eher ein Neuling bin. Habe lediglich gute Kenntnisse in C und 
C++.
Was den Datenfluss angeht habe ich keine fixen Vorstellungen. Die Idee, 
dass ich zwischen dem Raspi und dem Webinterface eine DB nutzen könnte 
gefiel mir vor meinem ersten Eintrag hier jedoch am besten. Ich bin 
jedoch für andere Lösungen gerne offen.
Ich versuche nochmals gesammelt meine Eckpunkt zu schildern.
Über des Webinterface sollen Daten vom Raspi angezeigt werden und ebenso 
auch Befehle an den Raspi geschickt werden können.
- die Datenübertragung soll über WiFi passieren
- Das Webinterface soll auf einem servicierten Webhost liegen
- cool wäre auch wenn ein zeitlicher Verlauf der Daten auf der Website 
angezeigt wird (daher die Idee mit der Datenbank)

Ich bin mir noch nicht sicher ob ich bei diesem Projekt von grafischen 
Entwicklungsumgebungen nicht eher Abstand nehmen sollte, oder wird es 
sonst zu knifflig? Mir geht es bei diesem Projekt primär um den 
Lerneffekt und es sollte kostenfrei bleiben.
Vielen Dank für eure Unterstützung.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Daten mit Python an einen Server mit PHP zu senden und in eine Datenbank 
zu schreiben ist nicht schwierig. Das haben unsere Battlefield 2 Server 
schon vor 10 Jahren gemacht.

Aber bei WLAN muss man immer mal damit rechnen, das es nicht sofort 
geht, sondern man muss fehlertolerant schreiben.
Kannst du mit PHP und Webfrontends schon was?

Philipp W. schrieb:
> und ebenso
> auch Befehle an den Raspi geschickt werden können.

Das ist schon komplizierter und riecht nach Sicherheitsloch.

: Bearbeitet durch User
von Mark B. (markbrandis)


Lesenswert?

Philipp W. schrieb:
> Über des Webinterface sollen Daten vom Raspi angezeigt werden und ebenso
> auch Befehle an den Raspi geschickt werden können.

Wenn jedermann übers Internet an Dein Gerät Befehle senden kann, dann 
hast Du ein Sicherheitsproblem.

Natürlich kann man sich eine entsprechende Authentifizierung überlegen 
und erst ein Login mit Benutzername und Passwort verlangen etc., aber es 
gibt halt auch immer mal wieder Sicherheitslücken in Webservern. 
Irgendwas sicherheitskritisches sollte also besser nicht übers Internet 
erreichbar sein.

von Heiner (Gast)


Lesenswert?

Mark B. schrieb:
> Natürlich kann man sich eine entsprechende Authentifizierung überlegen
> und erst ein Login mit Benutzername und Passwort verlangen etc.

... was schon deshalb schwierig wird, weil ich bisher noch keinen 
kostenlosen Hoster mit TLS gesehen habe. Ja, das kann man auch irgendwie 
anders nachbauen, aber ist das wirklich der Sinn dieses Projekts?

Philipp W. schrieb:
> Was den Datenfluss angeht habe ich keine fixen Vorstellungen.

Das Problem sehe ich eher so: Du hast gar keine Vorstellungen. Das ist 
an sich nicht schlimm (jeder fängt so an), aber mein Eindruck ist, dass 
du die Komplexität dieses ganzen Vorhabens unterschätzt. Erstens kann 
man keine guten Entscheidungen treffen, wenn man die Folgen nicht 
absehen kann, und zweitens ist es auf Dauer frustrierend, wenn sich 
ständig neue Komplikationen ergeben.

Mach's dir am Anfang nicht komplizierter, als es unbedingt sein muss: 
Lass das ganze Internet weg. Kleiner Webserver auf dem Raspi (mein 
Vorschlag wäre lighttpd), kleine Datenbank im Hintergrund (z.B. SQLite), 
vielleicht schreibst du auch einfach nur in ein Textfile. Mit PHP und 
HTML befassen. Das Ergebnis sieht wenig schön aus und ist nur lokal 
verfügbar, aber du erkennst, wie die Dinge zusammenhängen und was dich 
überhaupt interessiert. Diese Fähigkeiten sind auch mit hoher 
Wahrscheinlichkeit noch nützlich, wenn du irgendwann etwas anderes "mit 
Internet" machst.

Danach kannst du entscheiden, in welche Richtung es weitergeht, wo du 
vielleicht Frameworks einsetzen möchtest, oder ob du eine komplett 
selbstgestrickte Lösung haben möchtest. An diesem Punkt kannst du dann 
auch eine sinnvolle Entscheidung treffen, ob dir ein kostenloser Hoster 
ausreichende Funktionen anbietet, um deinen Ansatz zu verfolgen, oder ob 
es sich nicht doch lohnt, sich damit zu beschäftigen, wie man den Raspi 
ausreichend abhärtet, um ihn auch öffentlich verfügbar zu machen. Um das 
Thema Netzsicherheit kommst du sowieso nicht herum.

von Sheeva P. (sheevaplug)


Lesenswert?

Philipp W. schrieb:
> Tut mir leid, dass ich nicht gleich zu Beginn schon alles ausführlich
> und genau beschrieben habe. Der Grund dafür ist das ich auf diesem
> Gebiet eher ein Neuling bin. Habe lediglich gute Kenntnisse in C und
> C++.

Das ist ja schonmal eine gute Voraussetzung.

> Was den Datenfluss angeht habe ich keine fixen Vorstellungen. Die Idee,
> dass ich zwischen dem Raspi und dem Webinterface eine DB nutzen könnte
> gefiel mir vor meinem ersten Eintrag hier jedoch am besten. Ich bin
> jedoch für andere Lösungen gerne offen.

Meine (ganz persönliche) Erfahrung ist, daß klassische Relationale 
Datenbanken in sehr vielen Fällen eine sehr gute, und in mindestens 
ebensovielen Fällen eine sehr schlechte Wahl sind. Für Zeitserien sind 
sie meist nicht allzu gut geeignet, dafür gibt es oft wesentlich bessere 
Lösungen. Es sei denn, man darf niemals nie nicht einen Datenpunkt 
verlieren, aber das ist bei Deinem Projekt... naja.

> Ich versuche nochmals gesammelt meine Eckpunkt zu schildern.
> Über des Webinterface sollen Daten vom Raspi angezeigt werden und ebenso
> auch Befehle an den Raspi geschickt werden können.
> - die Datenübertragung soll über WiFi passieren

WLAN ist noch unsicherer als kabelgebundene Netzwerke, und auch in denen 
muß man sich schon intensive Gedanken über Ausfälle machen.

> - Das Webinterface soll auf einem servicierten Webhost liegen

Das ist eher... nicht so schwierig.

> - cool wäre auch wenn ein zeitlicher Verlauf der Daten auf der Website
> angezeigt wird (daher die Idee mit der Datenbank)

Tja, und hier geht es dann langsam los... aber mehr dazu weiter unten. 
;-)

> Ich bin mir noch nicht sicher ob ich bei diesem Projekt von grafischen
> Entwicklungsumgebungen nicht eher Abstand nehmen sollte, oder wird es
> sonst zu knifflig? Mir geht es bei diesem Projekt primär um den
> Lerneffekt und es sollte kostenfrei bleiben.

Wenn Du lernen möchtest, solltest Du Dir einen guten Texteditor mit 
sowas wie Syntax-Highlighting und idealerweise Tab-Completion für die 
gewünschte Sprache suchen. Heute dürften Atom, Sublime, VSCode, Kate und 
UltraEdit bieten, was Du brauchst.

Okay, kommen wir zu dem, was ich von Deiner Idee vielleicht verstanden 
habe, oder möglicherweise auch nicht.

1. Du hast einen Raspberry Pi, der irgendwelche Daten sammeln soll.
2. Du möchtest gerne ein wenig (oder ein wenig mehr) Python lernen.
3. Du möchtest die Daten vom Pi auf einen Webserver übertragen.
4. Der Webserver soll die Daten speichern und per Webinterface anzeigen.
5. Der Webserver soll Bedienelemente anzeigen um den RasPi einzustellen.

Habe ich das richtig verstanden? Dann... habe ich vielleicht ein paar 
Tipps. ;-)

Zunächst möchte ich aber kurz auf die anderen Tipps eingehen, die Dir 
hier gegeben wurden. Hier war mehrfach die Rede von relationalen 
Datenbanken wie MySQL. Diese halte ich für Deinen Anwendungsfall für 
weitgehend ungeeignet: die Features, die solche Datenbanken bieten, etwa 
relationale und transaktionale Sicherheit, brauchst Du für Zeitserien 
normalerweise gar nicht. Aber genau diese Features, die Du gar nicht 
brauchst, machen Relationale Datenbanken ziemlich teuer.

Es war auch die Rede von PHP, dabei möchtest Du doch -- wenn ich das 
richtig sehe -- eigentlich Python lernen. Mit Python kann man wunderbare 
Webinterfaces schreiben, dazu komme ich allerdings später. Warum Du 
jetzt auch noch PHP lernen sollst, ist mir (vorsichtig gesagt) 
schleierhaft.


Okay, kommen wir nach dieser kurzen Vorrede zum Eingemachten. Ich möchte 
das gerne quasi "chronologisch" anhand des Datenflusses behandeln:

1. Datensammlung
2. Datenübertragung
3. Datenspeicherung
4. Visualisierung der Daten
5. "Befehlsübertragung"
6. Kostenloses Hosting
7. Zeitkritikalität
8. Housekeeping


1. Datensammlung

Vermutlich hast Du bereits eine Idee, wie Dein RasPi die Daten sammeln 
soll; wenn nicht, dann frag' bitte einfach. Da gibt es ja viele 
Möglichkeiten: digitale Signale über die GPIO-Pins lesen, 
USB-Gerätschaften, und so weiter. Ich ganz persönlich mag Dir den Rat 
geben, die Daten zunächst einmal auf dem RasPi zu puffern, sie also 
zwischenzuspeichern, damit -- wenn das WLAN mal ausfallen und / oder der 
Server einmal nicht erreichbar sein sollte -- keine Daten verloren 
gehen. Wie Du das mit relativ wenig Aufwand machen kannst, dazu mehr 
unter Punkt 3 "Datenspeicherung".


2. Datenübertragung

Die Übertragung der Daten kann auf vielen Wegen stattfinden, hier wurden 
bereits einige Message Queues genannt. Da Dein Webserver allerdings 
ohnehin bereits eine Webschnittstelle hat, bietet sich die natürlich an. 
Auf diese Weise kannst Du a) unterschiedlicheste Datenformate übertragen 
(JSON, CSV, XML oä.), von denen Du Dir eines (oder sogar mehrere) frei 
auswählen kannst.

In diesem Fall würde ich vermutlich aus Gründen der Performanz und 
Sparsamkeit bei der Datenübertragung das gute alte CSV-Format nehmen, 
die Daten komprimieren und -- siehe auch unter Punkt 8 
"Zeitkritikalität" -- die Daten in regelmäßigen Abständen auf den 
Webserver übertragen. Nachteil: Du siehst neue Daten nicht sofort, 
sondern schlimmstenfalls erst nach Ablauf des zeitlichen Abstandes plus 
Übertragungs- und Eintragungszeit. Vorteil: je größer die Datenmenge 
ist, desto besser kann sie für die Übertragung komprimiert werden.


3. Datenspeicherung

Für die Speicherung der Daten auf dem Server würde ich einen gemischten 
Ansatz wählen: kurzfristig würde ich die Daten in einen Redis-Server 
schreiben, der den großen Vorteil hat, die Daten im Arbeitsspeicher und 
damit maximal performant verfügbar vorzuhalten.

Später, wenn das Redis-Kontingent erschöpft ist, würde ich die Daten 
dann wieder komprimieren und in eine Relationale Datenbank wie 
PostgreSQL schreiben. Dies auch wegen Punkt 6, "Kostenloses Hosting". 
Dann sind die Daten zwar noch vorhanden, aber der Zugriff dauert 
wesentlich länger. So etwas nennt sich "Multi-Tiered Storage", 
allerdings wirst Du es in diesem Fall selbst implementieren müssen... 
ist jedoch wirklich nicht allzu schwierig.


4. Visualisierung der Daten

Es gibt unendlich viele Möglichkeiten, Deine Daten anständig und 
übersichtlich darzustellen. Das geht los mit einfachen Bibliotheken wie 
jq-Plot oder Flot, mit denen Du möglicherweise anfangen solltest; 
später, wenn Du Python besser kannst, könnten die äußerst 
leistungsfähige Python-Bibliothek Pandas benutzen und Deine Daten 
darüber nicht nur statistisch analysieren, sondern auch mit DataTables 
zu einer interaktiven Tabelle und / oder über Bokeh und pandas-bokeh 
interaktive Datenplots zeichnen (lassen). In [1] diesem Beitrag von mir 
siehst Du ein sehr einfaches Beispiel, was mit diesen Techniken möglich 
ist. (Bitte die dt_*.html zunächst lokal abspeichern...)

[1] Beitrag "Re: Linux wird nicht wirklich akzeptiert, woran liegt das ?"


5. "Befehlsübertragung"

Bei der Übertragung von Befehlen auf den RasPi kannst Du intern 
denselben Redis benutzen, entweder eine Liste oder auch dessen 
Publish-/Subscribe-Mechanismus... oder sogar beides. Im letzteren Fall 
mit PubSub wären Websockets wohl hilfreich, oder der RasPi kann eine 
Liste blockierend abrufen bis ein neuer Eintrag da ist, oder... hier 
sind wir wieder bei Fragen wie Pufferung und dem Ausfall von WLAN, 
Internet, des RasPi oder Ähnlichem.


6. Kostenloses Hosting

Eine sehr beliebte (und bei überschaubaren Größenordnungen kostenlose) 
Plattform zum Hosting von Python-Webapplikationen ist Heroku. Dort 
bekommst Du kostenlos etliche Stunden Rechenzeit, und außerdem eine 
PostgreSQL-Datenbank mit bis zu 10.000 Zeilen sowie einen Redis-Server 
mit bis zu 25 Megabyte.


7. Zeitkritikalität

Tja, hier kann ich leider nicht allzuviel sagen, weil ich Deine 
Anforderungen nicht ausreichend genau kenne. Müssen die Daten SOFORT auf 
dem Webserver verfügbar sein? Müssen die Befehle an den RasPi SOFORT 
umgesetzt werden? Dann fallen Lösungen mit einer Zwischenpufferung 
trotzdem nicht aus, denn eine Pufferung kann -- wenn sie korrekt 
implementiert ist -- zwei Szenarien abfangen: einen Ausfall von WLAN 
oder Internet, und obendrein (wenn mit Komprimierung kombiniert) eine 
signifikante Reduktion der zu übertragenden Datenmengen. Und wenn Du 
Deine Daten nur einmal täglich oder gar wöchentlich überträgst, kannst 
Du bei Deinem Provider auch noch maximale Rechenzeit sparen...


8. Housekeeping

Nun, die meisten kostenlosen Hoster haben gewisse... Beschränkungen, 
meistens in Bezug auf Prozessorzeit und Datenvolumen. Deswegen ist es 
womöglich sinnvoll, die Daten nicht nur remote auf Deinem Webserver zu 
speichern, sondern obendrein auch noch lokal -- und Deine Daten auf dem 
Webserver nach einer gewissen Zeit einfach zu löschen. Meiner Erfahrung 
nach verlieren Daten mit zunehmendem Alter an Wert.


Soviel erstmal zu meinen ersten Gedanken. Vielleicht magst Du, wenn Du 
Dich ein wenig in Python hineingefuchst hast, einmal ins 
Flask-Mega-Tutorial von Miguel Grinberg [1] schauen, der einen 
herausragend guten Kurs über die Entwicklung von Webapplikationen unter 
Python mit dem Flask-Webframework geschrieben hat. Eine weitere 
unglaublich gute Quelle ist ExploreFlask [2], ebenso zu Python und 
Flask. (Du merkst schon, ich bin ein Freund von Flask...)

Deutlich umfangreichere Python-Webframeworks, die zwar mehr 
Funktionalität, dafür jedoch viel weniger Flexibilität mitbringen, sind 
das ebenfalls äußerst beliebte Django und das nicht (mehr) ganz so 
bekannte Plone. YMMV -- für Deine Anwendung würde aber ich eher ein 
Microframework wie Flask oder Bottle nutzen.

Wenn Du Fragen hast, ist hier vielleicht nicht der schlechteste Ort 
dafür, und Du bist herzlich eingeladen, mir eine PM zu schreiben. Viel 
Erfolg und Vergnügen!


[1] 
https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world
[2] https://exploreflask.com/en/latest/

von Philipp W. (phil9)


Lesenswert?

Danke für die wirklich hilfreichen Kommentare.
> Wenn Du Fragen hast, ist hier vielleicht nicht der schlechteste Ort
> dafür, und Du bist herzlich eingeladen, mir eine PM zu schreiben. Viel
> Erfolg und Vergnügen!
Danke auch für das nette Angebot, ich werde dir auf jeden Fall 
schreiben.

Ich werde mich dann schön langsam an die Arbeiten machen und werde mich 
bei Fragen wieder melden.

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.