Experimente mit PostGreSQL und PHP auf Pi3

Alles rund um Software, welche nichts mit der Wetterstation zu tun hat.
enager
Site Admin
Beiträge: 69
Registriert: 05.10.2016, 11:33

Experimente mit PostGreSQL und PHP auf Pi3

Beitragvon enager » 06.12.2018, 21:41

Guten Abend,

vor einigen Tagen habe ich mir einen weiteren Raspberry Pi 3 aufgesetzt. Ursprünglich war geplant, auch hier das Betriebssystem wieder auf eine USB-Festplatte zu installieren. Allerdings machte mir das Raspbian-Betriebssystem einen Strich durch die Rechnung. Ganz am Anfang hatte ich noch eine ältere Dektopversion des Raspbian-Systems auf der Festplatte. Dieses lief auch ohne Probleme. Daher führte ich die üblichen Updatebefehle "update" und "upgrade" aus. Nach einem Neustart erkannte Raspbian allerdings Maus und Tastatur nicht mehr. Daher lud ich mir dann das Minimal-Linux, ohne Desktop herunter. Hier lief alles. Ich konnte mit der Tastatur arbeiten und installierte daher per Kommandokonsole die Desktopumgebung "LXDE". Der Installationsprozess verlief ordnungsgemäß. Nach dem Neustart überraschte mich allerdings erneut, die Nicht-Erkennung von Maus und Tastatur. Da ich vermutete, dass die USB-Festplatte zusammen mit Maus und Tastatur zu viel Strom ziehen (Festplatte allein bei 1 Ampere), versuchte ich noch eine andere Festplatte mit 750mA Stromverbauch. Auch hier luden Maus und Tastatur beim Start der grafischen Oberfläche nicht. Letzter Akt der Verzweiflung: Ich nahm mir eine unbenutzte 32GB Micro-SD-Karte und installierte auch hier die grafische Raspbian-Version. Zu meiner Überraschung, lief alles auf Anhieb problemlos.

Somit machte ich mich bei, mir das Raspbian einzurichten und PostgreSQL zu installieren:

Zunächst wurde die Datenbanksoftware, sowie zusätzliche Komponenten installiert

Code: Alles auswählen

sudo apt-get install postgresql libpq-dev postgresql-client postgresql-client-common


Danach ging es weiter mit PgAdmin3, einer grafischen Oberfläche zur Datenbankverwaltung

Code: Alles auswählen

sudo apt-get install pgadmin3


Danach wurde mittels Leafpad (ein Texteditor, welcher mit der grafischen Raspbian-Version mitgeliefert wird) die PostGreSQL-Konfiguration bearbeitet:

Code: Alles auswählen

sudo leafpad /etc/postgresql/9.6/main/postgresql.conf


Relativ weit unten in dieser Datei findet sich ein Eintrag "listen_adresses = ..." Dieser ist in der Ausgangsversion auf "localhost" gesetzt, so dass die Datenbanksoftware nur auf Anfragen reagiert, welche vom Raspberry Pi3 kommen. Möchte man, dass auch Anfragen aus dem lokalen Netzwerk beantwortet werden, ist dieser Eintrag wie folgt zu ändern:

Code: Alles auswählen

# - Connection Settings -

listen_addresses = '*'                  # what IP address(es) to listen on;


Weiter geht es mit der Datei "pg_hba.conf"

Code: Alles auswählen

sudo leafpad /etc/postgresql/9.6/main/pg_hba.conf


Hier werden nun die Netzwerkadressen/Adressbereich angegeben, auf welchen die Datenbanksoftware reagieren soll:

Code: Alles auswählen

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             0.0.0.0/0            md5

Auch dies ist wieder relativ weit unten in der Konfigurationsdatei zu finden. Im Ausgangzustand ist unter IPv4 local connections der Eintrag 127.0.0.1 zu finden. Diese IP-Adresse verweist auf den Raspberry Pi3 selbst. Die 127.0.0.1 vergeben sich auch Computer selbst, wenn sie an keinem Netzwerk angeschlossen sind, so dass Programme, die mit Netzwerkadressen arbeiten, denoch eine gültige IP-Adresse haben, wohin sie ihre Datenpakete senden/empfangen können. Diese 127.0.0.1 wird nun auf 0.0.0.0/0 geändert. Damit reagiert die Datenbanksoftware nun auf Anfragen, welches aus dem lokalen Netzwerk kommen, egal welche IP-Adresse diese anfragenden Geräte auch haben.

Damit ist nun der Weg frei, um über einen Windowscomputer und PgAdmin3 (gibt es auch für Windows), sowie dem lokalen Netzwerk, sich mit der Datenbank zu verbinden.

Als nächstes folgt die Installation von PHP. Derzeit ist PHP7.0 für den Raspberry Pi3 aktuell. Installiert wird es mittels:

Code: Alles auswählen

sudo apt-get install php

Damit wird die derzeit aktuellste PHP-Version installiert. Allerdings werden sich PHP-Skripte noch nicht mit der PostGreSQL Datenbank verbinden können, da hierfür noch eine Art Treiber benötigt wird. Dieser wird mittels:

Code: Alles auswählen

sudo apt-get install php7.0-pgsql
installiert.

Ein erstes, einfaches Script, welches prüft, ob die Datenbank erreichbar ist, ist das Folgende:

Code: Alles auswählen

<?php
   $host        = "host=localhost";
   $port        = "port=5432";
   $dbname      = "dbname=postgres";
   $credentials = "user=postgres password=Passwort";

   $db = pg_connect("$host $port $dbname $credentials");
   $result = pg_query($db, 'SELECT * FROM people');
   if (!$result) {
      echo "Ein Fehler ist aufgetreten.\n";
      exit;
   }
?>


Einfach unter /var/www/html/ eine neue Datei anlegen, in dieser diesen Code ablegen, speichern und einen Internetbrowser öffnen. In diesem nun die Adresse des Raspberry-Pi3 + PHP-Dateiname eingeben, zum Beispiel "192.168.1.17/Dateiname.php" und dann sollte die sich öffnende Seite einfach leer bleiben. Wird der Fehler angezeigt, sind sehr wahrscheinlich die in der PHP-Datei hinterlegten Zugangsdaten für die Datenbank nicht richtig. Angefangen vom Host (Der IP-Adresse des RPi3), über dem Datenbankname (im Beispiel "postgres") über dem Nutzer und dem zugehörigen Passwort, bis hin zum Namen der Tabelle (zu finden bei "Select * from "Tabellenname", im Beispiel "people"), all diese Dinge müssen korrekt angegeben werden, anderfalls wird der Fehler ausgegeben.

Zum experimentieren habe ich mir in meiner Tabelle "people" zwei Spalten namens "Name" und "Company" angelegt, und dort über die Linux.Kommandokonsole Daten eingegeben. Um diese Daten abzufragen, nutze ich nun dieses Script:

Code: Alles auswählen

<?php
   $host        = "host=192.168.1.17";
   $port        = "port=5432";
   $dbname      = "dbname=postgres";
   $credentials = "user=postgres password=Passwort";

   $db = pg_connect("$host $port $dbname $credentials");
   $result = pg_query($db, 'SELECT * FROM people');
   if (!$result) {
      echo "Ein Fehler ist aufgetreten.\n";
      exit;
   }
      
   echo "Datenausgabe in Tabellenform <br><br>";   
   echo "<table border=1>";
   echo "<tr>";
   echo "<td align=center>Name</td>";
   echo "<td align=center>Firma</td>";
   echo "</tr>";   
   
   while ($row = pg_fetch_row($result)) {
      echo "<tr>";
      echo "<td align=center>$row[0]</td>";
      echo "<td align=center>$row[1]</td>";
      echo "</tr>";
   }
   echo "</table>";   
?>

Dieses Skipt liest in einer Schleife alle Daten der Tabelle "people" aus und stellt diese in einer HTML-Tabelle dar.

Und natürlich können per PHP in diese Tabelle auch Daten hinzugefügt werden:
HTML-Abfrage-Formular:

Code: Alles auswählen

<!DOCTYPE html>
<head>
<title>Insert data to PostgreSQL with php - creating a simple web application</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style>
li {
list-style: none;
}
</style>
</head>
<body>
<h2>Bitte tragen Sie Ihre Daten ein:</h2>
<ul>
<form name="insert" action="insert.php" method="post" >
<li>Name:</li><li><input type="text" name="name" /></li>
<li>Firma:</li><li><input type="text" name="company" /></li>
<li><input type="submit" /></li>
</form>
</ul>
</body>
</html>


Ausführende insert.php:

Code: Alles auswählen

<?php
$db = pg_connect("host=192.168.1.17 port=5432 dbname=postgres user=postgres password=Passwort");
$query = "INSERT INTO people VALUES ('$_POST[name]','$_POST[company]')";
$result = pg_query($query);
echo "Daten gesendet --- '$_POST[name]','$_POST[company]'";
?>

Hier ist stets die HTML-Datei zu öffnen. Beim Klick auf "absenden"/"submit" wird die insert.php Datei geöffnet und an diese die Formulardaten übergeben. Das Skript insert.php stellt nun eine Verbindung zur Datenbank her und schreibt die Formulardaten dort hinein.

Wozu mache ich das?
Nun, zum einen möchte ich mich weiter entwickeln. Mir im Selbststudium neues Wissen aneignen. Und ich überlege, ob ich meine Wetterstation auf Datenbank umstelle. Derzeit läuft sie mit einem CSV ähnlichen Speichersystem. Die Daten werden mit einem Semikolon als Trennzeichen, in einer Textdatei abgelegt und von dort von meiner Stationssoftware ausgelesen und weiter verarbeitet. Würde ich auf Datenbank umstellen, könnte ich die Datenbanksysteme auf dem Homepageserver (MySQL) nutzen und die Daten dort ablegen. Hier bräuchte ich dann PHP-Kenntnisse um Auswertescripte für die Homepage zu schreiben. Die Nutzung einer direkt auf dem Homepageserver liegenden Datenbank hätte den Vorteil, dass ich PHP-Scripte schreiben kann, welche dem Seitenbesucher die Auswahl bestimmter meteorologischer Auswahlkriterien ermöglicht. Es könnten dann beispielsweise alle Tage mit Tagesmaximum < 0°C angezeigt werden. Oder mit Windgeschwindigkeiten > 40km/h. Auch würden alle Wetterdaten eines Jahres in einer einzigen Datenbank Platz finden. Und es wären noch viele, viele weitere Möglichkeiten machbar. Vor allem mache ich es aber, um mich für meine berufliche Zukunft weiter zu bilden, so dass ich potenziellen, zukünftigen Arbeitgebern auch etwas bieten kann.

So, genug geschrieben für heute Abend.
Ich wünsche allen Lesern einen angenehmen Abend.

enager
Site Admin
Beiträge: 69
Registriert: 05.10.2016, 11:33

Re: Experimente mit PostGreSQL und PHP auf Pi3

Beitragvon enager » 17.12.2018, 11:42

Nach langem Probieren, ist es geschafft. Die Verbindung zur MySQL Datenbank auf dem Homepageserver steht. Die Wetterstationssoftware generiert eine HTML-Datei, welche nachfolgend über den Firefox Webbrowser geöffnet und ausgeführt wird. In dieser HTML-Datei ist auch ein kleiner Javascript-Code enthalten, welcher ein OnClick-Ereignis auslöst. Dadurch wird der Button "absenden" ausgelöst und alle im HTML-Formular angegebenen Daten an ein PHP-Script auf der Homepage gesendet. Dieses PHP-Script wiederum stellt die Verbindung zur Datenbank her und trägt dort die übermittelten Daten ein.

Die Stationsdaten werde nun im 15 Minutenintervall an die Datenbank übertragen. Ich hätte auch beim bisherigen 3 Minutenintervall bleiben können. Allerdings wären dies 5 mal mehr Datensätze, als mit dem jetzigen 15 Minutenintervall. Die Stationssoftware arbeitet auch weiterhin im 3 Minutenintervall. Hintergrund für das 15 Minutenintervall ist vor allem die Tatsache, dass ich als nächstes in eine weitere Datenbank alle Wetterdaten, welche die Station seit ihrem ersten Tag im Februar 2004 gesammelt hat, einfügen will. Somit befänden sich dann in einer einzigen Datenbank, in einer Tabelle, alle Wetterdaten von 02.2004 bis heute. Dadurch wird es möglich, per PHP umfassende Abfragescripte zu entwickeln. Was war der heißeste Tag in diesen 14 Jahren? Wann gab es die stärkste Winböe (Orkan Kyrill) und wie stark war sie? Wie hoch ist das Mittel aller 2m-Temperaturmesswerte? Darstellung der 2m Temperatur von 02.2004 bis heute? Und so weiter...

Da steht noch viel Arbeit an. Aber auch das wird irgendwie zu schaffen sein. Für heute kann ich immerhin schon einmal ein kleines Script anbieten, welches ALLE Wetterdaten in der neuen MySQL Datenbank, absteigend nach der ID-Nummer in Tabellenform ausgibt. Durch die Absteigende Sortierung, steht der aktuellste Datensatz stets oben. Link zum Script



Nachtrag:

Ich habe mir jetzt mal meine Wetterdaten zu Gemüte geführt. Leider wurden über die Jahre hinweg zu unterschiedliche Datenformate verwendet. Das alte WS2500-PC Funkinterface hat im 3 Minuten oder 5 Minutenintervall aufgezeichnet, das WS-2500-Display mit integrierten Datenlogger hat nur alle 15 Minuten einen aktuellen Datensatz gespeichert, leider nicht zeitlich synchronisiert. Die Daten wurden hier also mal in den Minuten 00,15,30,45, ... gespeichert und es kam auch regelmäßig zu Zeitverschiebungen, so dass dann auch in den Minuten 02,17,32,47,... gespeichert wurde. Zu Zeiten der aktuellen Banana-Pi Wetterstation wurden die Wetterdaten anfangs (2014 und 2015) ebenfalls nicht Zeitsynchron gespeichert, so dass ich diese Daten auch nicht im 15 Minutenintervall in die Datenbank schieben kann. Zudem würden gerade die Winddaten bei Speicherung im 15 Minutenintervall arg beschnitten. Wenn im 3 Minutenintervall aufgezeichnet wurde, würde hier nur jeder 5te Datensatz in die Datenbank gelangen. Die ganzen Zwischenwerte zwischen HH:00 und HH:15 würden entsprechend verloren gehen. Daher bleibt erst einmal alles beim alten und die Datenbank wird ab heute parallel im 15 Minutenintervll mit Daten versorgt. Damit kann ich mich in Sachen SQL und PHP anhand dieser Datenbank versuchen und ausprobieren.


Zurück zu „Software“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste