Aus Raspberry Pi Geek 12/2021

Vordefinierte Prozeduren mit MariaDB (Seite 2)

Abbildung 2: Mit DBeaver erstellen Sie relativ schnell und einfach eine Tabelle für die Messwerte.

Abbildung 2: Mit DBeaver erstellen Sie relativ schnell und einfach eine Tabelle für die Messwerte.

Zum Speichern der Tabelle klicken Sie auf Save. Das Programm zeigt Ihnen noch einmal das SQL-Statement, das es gegen die Datenbank ausführt. Das hat den Vorteil, dass Sie es noch einmal kontrollieren können. Der Button Persistieren speichert die Tabelle in der Datenbank.

Legen Sie jetzt noch eine zweite Tabelle (statistics) mit den Spalten min_value (float), max_value (float) und average an. Wollen Sie die beiden Tabellen von Hand anlegen, nutzen Sie Listing 5 und Listing 6. In Letzterem finden Sie am Ende eine Zeile, die alle Spalten mit jeweils dem Wert 1 füllt. Listing 7 zeigt, wie Sie die Skripte anwenden.

Listing 5

Datei create-table-temperatures.sql

USE sensor
CREATE TABLE temperature (
  id int(11) NOT NULL AUTO_INCREMENT,
  time timestamp NULL DEFAULT current_timestamp(),
  value float DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=456 DEFAULT CHARSET=utf8mb4;

Listing 6

Datei create-table-statistics.sql

USE sensor;
CREATE TABLE statistics (
  min_value float DEFAULT NULL,
  max_value float DEFAULT NULL,
  avg_value float DEFAULT NULL,
  s_stmp timestamp NULL DEFAULT current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO statistics (min_value, max_value, avg_value) VALUES(1,1,1);

Listing 7

Tabellen anlegen

$ sudo mysql < create-table-temperatures.sql
$ sudo mysql < create-table-statistics.sql

Daten sammeln

Zum Auslesen der Daten aus dem Baustein kommt das Python-Skript bmp280.py zum Einsatz, das die Messwerte auch in die Datenbank schreibt (Listing 8). Sie führen es mit dem Aufruf python3 bmp280.py aus. Um es nicht für jede Messung manuell starten zu müssen, richten Sie einen Cron-Eintrag dafür ein (Listing 9). Eine genaue Anleitung, wie Cron arbeitet, finden Sie im Netz [4].

Listing 8

Datei bmp280.py

#! /usr/bin/env python3
import board
import adafruit_bmp280
import mariadb
import sys
i2c = board.I2C()
sensor = adafruit_bmp280.Adafruit_BMP280_I2C(i2c)
USER="sensor"
PASS="sensor123!"
ADDR="192.168.3.119"
PORT=3306
DBNM="sensor"
SQLCMD="INSERT INTO temperature (value) VALUES (%s)"
try:
  conn = mariadb.connect(
    user=USER,
    password=PASS,
    host=ADDR,
    port=PORT,
    database=DBNM
  )
except mariadb.Error as e:
  print(f"Error connecting to MariaDB Platform: {e}")
  sys.exit(1)
sql=SQLCMD % format(sensor.temperature)
cur = conn.cursor()
cur.execute(sql)
conn.commit()
conn.close()

Listing 9

Crontab-Eintrag anlegen

echo "* * * * * python3 /home/pi/bmp280.py" | crontab

Prozedur und Trigger

Bevor Sie das Ganze jedoch endgültig starten, lohnt es sich, die Datenbank noch etwas zu erweitern, und zwar um Stored Procedures (vorgefertigte Prozeduren). Dabei speichern Sie innerhalb der Datenbank kleine Programme, die Sie später in Verbindung mit SQL-Kommandos auslösen. Auf diese Weise lassen sich die Funktionen von reinem SQL erweitern. Um eine Prozedur zu starten, verwenden Sie das Schlüsselwort CALL, gefolgt vom Namen der Prozedur und gegebenenfalls den Parametern in Klammern.

Standardmäßig sieht die Software alle Parameter der Prozedur als reine Input-Parameter an. Wollen Sie das ändern, verwenden Sie in der Liste der Parameter eines der drei Schlüsselworte IN, OUT und INOUT.

Innerhalb von Prozeduren dürfen Sie Variablen benutzen. Diese erzeugen Sie mit dem Kommando DECLARE, gefolgt von Variablennamen und dem Datentyp: DECLARE Name INT;. Um einen Wert in der Variablen abzulegen, setzen Sie das Kommando SELECT Wert INTO Name; ab.

Den Wert einer Variablen fragen Sie mit SELECT ab (SELECT Name;). Beachten Sie, dass die Software immer nur die erste Variable ausgibt. Auch Zeichenketten lassen sich auf diese Art ausgeben (SELECT 'Hallo Welt';).

TIPP

Setzen Sie Variablennamen in Prozeduren nie in Anführungszeichen, andernfalls interpretiert die Software sie als Text.

Das Kommando, um Programmcode nur unter bestimmten Bedingungen auszuführen, heißt – Sie ahnen es schon – IF. Zum If-Kommando gehören traditionell THEN, ELSE und END IF. Um eine Schleife innerhalb der Prozedur zu erzeugen, nutzen Sie FOR. Den Block der Schleife kennzeichnen Sie mit DO und END FOR. Eine Übersicht über die Befehle finden Sie auf der MariaDB-Homepage [5].

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 5 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben