Rule "Insert INTO" MariaDB

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Tentazione
Beiträge: 48
Registriert: 27. Jan 2018 08:46

Rule "Insert INTO" MariaDB

Beitrag von Tentazione »

Huhu....

da bin ich wieder mit einer neuen "Idee" ;-)

Ich möchte gerne aus einer Rule heraus einen Datensatz in eine MariaDB schreiben. Für den Anfang würde es mir reichen wenn mein Bewegungsmelder (Homematic) auslöst...einen Eintrag in einer MariaDB-Tabelle zu erzeugen. Folgendes habe ich bereits:


- Die MariaDB liegt auf einem anderen Raspi als Openhab.
- Ein Rue die "zündet" wenn der Bewegungsmelder aktiviert wird.

Meine Fragen:
- Wie bekomme ich das Sql-Statement abgesetzt? Möglicherweise über das Exec-Binding?
- Wo konfiguriere ich eine DB-Verbindung zu einer entfernten Datenbank?

Grüßle

Benutzeravatar
udo1toni
Beiträge: 13859
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Rule "Insert INTO" MariaDB

Beitrag von udo1toni »

Warum? openHAB hat einen Persistence Service, der direkt in MariaDB (und etliche andere SQL-Varianten) schreiben kann. Je nach gewählter Strategie landet dabei bei Wertänderungen, bei Updates oder auch zyklisch der Wert des Items zusammen mit einem Zeitstempel in der Datenbank.
Das heißt, es würde reichen, die zu speichernden Werte in einem Item abzulegen und dieses Item auf everyUpdate zu konfigurieren, damit jeder Schreibzugriff in der Datenbank landet.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Tentazione
Beiträge: 48
Registriert: 27. Jan 2018 08:46

Re: Rule "Insert INTO" MariaDB

Beitrag von Tentazione »

Weil ich schlussendlich wissen möchte...welcher Melder angeschlagen hat...und den Eintrag so vornehmen möchte, das ich auch noch Zusatzinformationen mitspeichern kann. Darum ;-)

Ne bessere Lösung ist mir leider noch nicht eingefallen.

mamoel
Beiträge: 137
Registriert: 12. Jan 2019 19:56

Re: Rule "Insert INTO" MariaDB

Beitrag von mamoel »

Die einfachste Lösung wäre es, ein einfaches "String-Item" anzulegen. Für dieses setzt Du als "Persistence strategy" "everyChange". Also jedes Mal, wenn sich der Wert dieses Strings ändert, wird auch ein Eintrag in die Tabelle geschrieben.
Wenn Du das wirklich für jeden Bewegungsmelder getrennt haben möchtest, dann lege einfach für jeden Melder ein eigenes String-Item an.

Die Verbindung zur MariaDB stellst Du über den MySQL-Adapter her. Das sollte nicht allzu schwer sein.

In Deiner Rule, die bei Bewegung auslöst, kannst Du jetzt in das jeweilige String-Item reinschreiben, was Dir gefällt (Uhrzeit + was sonst noch interessant sein könnte).
Einziger offensichtlicher Nachteil: du hast alle Infos aus einer einzelnen Auslösung in einem Feld stehen (außer dem Zeitstempel natürlich).
openHAB 2.5 (M1) in Docker auf NAS: Synology DS418play
mit Homematic, Hue, TP-Link, AVM Fritz!, FritzboxTR064, Nuki, Amazon Echo, Sonos, Harmony, zigbee2mqtt, Denon/Marantz, ...

Tentazione
Beiträge: 48
Registriert: 27. Jan 2018 08:46

Re: Rule "Insert INTO" MariaDB

Beitrag von Tentazione »

@mamoel: Das wäre ein erster gangbarer Weg...wenn es anders nicht geht

Muss mal schauen was Maria so alles unterstützt. In Oracle würde ich es dann so realisieren...

- Insert-Trigger der die mit Delimitern aufbereitete Zeichenkette zerlegt und in eine spezielle Tabelle schreibt
- Aufräumjob der Nachts die temporäre Tabelle wieder leert.

Wie gesagt...ich muss mal schauen was in Maria so geht. Hab damit bislang noch nie gearbeitet

Wo finde ich den MySQL-Adapter? Oder ein geeignetes Tutorial?

mamoel
Beiträge: 137
Registriert: 12. Jan 2019 19:56

Re: Rule "Insert INTO" MariaDB

Beitrag von mamoel »

AddOns->Persistence->MySQL Persistence müsste das Passende sein.
openHAB 2.5 (M1) in Docker auf NAS: Synology DS418play
mit Homematic, Hue, TP-Link, AVM Fritz!, FritzboxTR064, Nuki, Amazon Echo, Sonos, Harmony, zigbee2mqtt, Denon/Marantz, ...

Benutzeravatar
udo1toni
Beiträge: 13859
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Rule "Insert INTO" MariaDB

Beitrag von udo1toni »

Ich möchte Dir eher die jdbs Persistence ans Herz legen. Grundsätzlich kann diese alles, was die MySQL Persistence kann. Vorteil von jdbc ist aber, dass man einstellen kann, dass keine Übersetzungstabelle für Itemname <-> MySQL Tabelle genutzt, sondern der Itemname als Tabellenname verwendet wird.

In der Persistence gibt es keine Option, nicht zu wissen, welches Item ein Ereignis ausgelöst hat ;)
Die Information ist schon auf die kleinste Einheit herunter gebrochen: Pro Item eine Tabelle, pro Persistierung ein Eintrag mit Zeitstempel und Wert.

Ich habe aus meiner MariaDB schon die lustigsten Dinge per Abfrage hervorgezaubert - z.B. den Eigenverbrauch der Solaranlage (für die Steuer), der natürlich nicht als diskreter Wert vorlag.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Tentazione
Beiträge: 48
Registriert: 27. Jan 2018 08:46

Re: Rule "Insert INTO" MariaDB

Beitrag von Tentazione »

jdbs Persistence ans Herz legen
Zumindest was die Doku angeht...macht die MySql-Persitence mehr her :-)

Bei der JDBC-Maria bekomme ich nen 404er-Fehler

Code: Alles auswählen

Looks like we've got some broken links.
Ansonsten bin ich bei Dir und würde JDBC immer bevorzugen.

Benutzeravatar
udo1toni
Beiträge: 13859
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Rule "Insert INTO" MariaDB

Beitrag von udo1toni »

Eigentlich nicht... Schau mal hier: https://www.openhab.org/addons/persistence/jdbc/
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Tentazione
Beiträge: 48
Registriert: 27. Jan 2018 08:46

Re: Rule "Insert INTO" MariaDB

Beitrag von Tentazione »

es lüppt...teilweise ;-)

Ich hab jetzt erstmal einen Temperatursensor genommen. Den persistiere ich mit

Code: Alles auswählen

EGSensorTemp : strategy =  everyChange, restoreOnStartup
es erfolgt bei einem Update auch ein Eintrag in der Tabelle items...aber...

Code: Alles auswählen

ItemId       itemname
----------------------------------
1 	        EGSensorTemp
Der Wert wird "unterschlagen" :-(

Antworten