Hallo Zusammen,
ich nutze Openhab 5.1 unter Win11, wo Openhab als Service läuft. Dazu habe noch eine MariaDB über das Plugin zur Persistenz angebunden. Items werden dort wunderbar einzeln auf Tabellen gespeichert.
Ich würde allerdings gerne eine Tabelle folgenden Aufbaus nutzen:
Timestamp, Value Item1, Value Item 2
Ich habe schon einige Wege versucht, auch mit der Unterstützung vom Copilot, aber bin nirgends auf eine Lösung gestoßen, mit der ich arbeiten kann. Derzeit schein mit der einzig gangbare Weg zu sein, ein String Item in Openhab aufzubauen, welches ein JSON aufnimmt, indem ich die Werte abgespeichert habe. Grafana kann das wieder auseinander nehmen und mir die Werte als einzelne Spalten anzeigen aber... schön ist das nicht.
Somit suche ich weiterhin einen einfachen gangbaren Weg, wie ich ein SQL Insert Statement so abschicken kann, dass es funktioniert, oder im besten Fall, das vorhandene und genutzte Persistenz Plugin so zu nutzen, das es auch hier möglich wäre einen solchen INSERT zu machen.
Weitere Vorschläge waren bislang eine MariaDB Event zu nutzen, was mir die Werte aus bereits gespeicherten Tabellen ausließt und in die neue Tabelle schreibt, was ich aber auch eher als Behelfslösung einstufe.
Oder es kam der Vorschlag ein Powershell Skript aufzurufen, was den Insert macht. Hier kommt man allerdings auf Rechteprobleme innerhalb von Windows. Es scheint zudem Unterschied zu geben zwischen Openhab auf Linux vs. Windows. Nicht alles was unter Linux funktioniert klappt auch unter Windows.
Wenn ich doch mit dem Persistenz Plugin eine Tabelle anlegen und mit einem Item beschreiben kann, warum nicht auch mehrere Items in eine Tabelle. Kann es das? Kann es das nicht? In der Doku habe ich nichts dazu gefunden. Wäre das mal ein Update des Plugins Wert?
Würde mir ggf. ein Wechsel der DB etwas bringen, wenn ich z.B. MySQL nutzen würde anstatt MariaDB?
Für Vorschläge bin ich offen. Danke
Gruß
SQL Statements ausführen
- udo1toni
- Beiträge: 15639
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: SQL Statements ausführen
Grundsätzlich könntest Du versuchen, in MariaDB einen View zu erstellen, in dem zwei Tabellen gejoined werden.
Das Problem ist allerdings, dass die Timestamps kaum exakt zueinander passen werden. Und das ist auch der Grund, warum es in openHAB keine Möglichkeit gibt, mehrere Items innerhalb einer Tabelle zu persistieren, man müsste dafür eine strikte on-time-strategy nutzen, also weder everyUpdate noch everyChange.
Ich habe hier eine Liste der Anrufer, die ich mitsamt Daten drum herum (Rufnummer kommend, Ziel, Name soweit ermittelbar, Dauer) als Tabelle in Grafana anzeige, da habe ich das genau wie von Dir beschrieben gelöst, also Daten über ein json Objekt als String in die Datenbank geschrieben, das war damals für mich tatsächlich der einfachste Weg.
Das Problem ist allerdings, dass die Timestamps kaum exakt zueinander passen werden. Und das ist auch der Grund, warum es in openHAB keine Möglichkeit gibt, mehrere Items innerhalb einer Tabelle zu persistieren, man müsste dafür eine strikte on-time-strategy nutzen, also weder everyUpdate noch everyChange.
Ich habe hier eine Liste der Anrufer, die ich mitsamt Daten drum herum (Rufnummer kommend, Ziel, Name soweit ermittelbar, Dauer) als Tabelle in Grafana anzeige, da habe ich das genau wie von Dir beschrieben gelöst, also Daten über ein json Objekt als String in die Datenbank geschrieben, das war damals für mich tatsächlich der einfachste Weg.
openHAB5.1.2 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime - LXC, 4 Kerne, 3 GByte RAM)
Hostsystem Proxmox VE 9.1.5 - AMD Ryzen 5 3600 6 Kerne, 12 Threads - 64 GByte RAM - ZFS Pools: Raid Z1, 3 x 20 TB HDD -> 40 TByte und Raid Z0-Mirrored 4 x 1 TByte NVMe -> 2 TByte
Hostsystem Proxmox VE 9.1.5 - AMD Ryzen 5 3600 6 Kerne, 12 Threads - 64 GByte RAM - ZFS Pools: Raid Z1, 3 x 20 TB HDD -> 40 TByte und Raid Z0-Mirrored 4 x 1 TByte NVMe -> 2 TByte
-
talcom
- Beiträge: 4
- Registriert: 13. Jan 2026 08:12
Re: SQL Statements ausführen
Ja das mit dem JSON ist machbar und führt im Endeffekt auch zu der Anzeige in Grafana.
In meinem Wunschbild würde ich gern eine Rule erzeugen, die mir ein SQL Statement mit Inhalten von div. Variablen zusammen baut. Dieses Statement könnte ich eine neue Variable packen, diese über eine everyChange Strategie dem PlugIN zuführen. Das Plugin muss nur erkennen ob es ein Statement oder eine einfache Variable mit Wert ist. Auch da könnte es Wege geben z.B. eigene Strategie wie everyChangeSQL oder everyUpdateSQL.
So hätte man über die Rule vorab schon tolle Möglichkeiten Bedingungen etc. auszunutzen für div. SQL-Statements.
Aber hier scheint OpenHAB bzw. die Schnittstelle zum Plugin dies noch nicht vorzusehen. Denn der Rest mit JSON oder einem nachgelagerten Event ist eher eine Notlösung. Wenn man direkt pur eine Tabelle mt mehreren Items nutzen könnte, müsste man sich über die Notlösungen keine Gedanken machen.
In meinem Wunschbild würde ich gern eine Rule erzeugen, die mir ein SQL Statement mit Inhalten von div. Variablen zusammen baut. Dieses Statement könnte ich eine neue Variable packen, diese über eine everyChange Strategie dem PlugIN zuführen. Das Plugin muss nur erkennen ob es ein Statement oder eine einfache Variable mit Wert ist. Auch da könnte es Wege geben z.B. eigene Strategie wie everyChangeSQL oder everyUpdateSQL.
So hätte man über die Rule vorab schon tolle Möglichkeiten Bedingungen etc. auszunutzen für div. SQL-Statements.
Aber hier scheint OpenHAB bzw. die Schnittstelle zum Plugin dies noch nicht vorzusehen. Denn der Rest mit JSON oder einem nachgelagerten Event ist eher eine Notlösung. Wenn man direkt pur eine Tabelle mt mehreren Items nutzen könnte, müsste man sich über die Notlösungen keine Gedanken machen.
- udo1toni
- Beiträge: 15639
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: SQL Statements ausführen
Wie schon oben erklärt, das Problem ist die Natur der Daten, die halt mit unterschiedlichen Zeitstempeln kommen, und seien es auch nur Mikrosekunden.
Daten, die zeitlich zusammenhängen, gibt es in openHAB nicht, openHAB verfolgt einen asynchronen Ansatz, das gesamte System ist darauf ausgerichtet.
Daten, die zeitlich zusammenhängen, gibt es in openHAB nicht, openHAB verfolgt einen asynchronen Ansatz, das gesamte System ist darauf ausgerichtet.
openHAB5.1.2 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime - LXC, 4 Kerne, 3 GByte RAM)
Hostsystem Proxmox VE 9.1.5 - AMD Ryzen 5 3600 6 Kerne, 12 Threads - 64 GByte RAM - ZFS Pools: Raid Z1, 3 x 20 TB HDD -> 40 TByte und Raid Z0-Mirrored 4 x 1 TByte NVMe -> 2 TByte
Hostsystem Proxmox VE 9.1.5 - AMD Ryzen 5 3600 6 Kerne, 12 Threads - 64 GByte RAM - ZFS Pools: Raid Z1, 3 x 20 TB HDD -> 40 TByte und Raid Z0-Mirrored 4 x 1 TByte NVMe -> 2 TByte
- udo1toni
- Beiträge: 15639
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: SQL Statements ausführen
Nachdem ich geschlafen habe ist mir noch was zum Thema eingefallen
denn ich hatte das beschriebene Problem ja auch schon.
Die "korrekte" Lösung (im Sinne von: wie openHAB aufgebaut ist) wäre, die gewünschte Funktionalität in ein Addon auszulagern, welches dann z.B. Database Addon hieße.
Dieses Addon wäre allerdings erst mal nicht als Persistence einzubinden, sondern wie ein Binding für IoT Hardware/Datenquellen (Beispiel weather mit forecast...). Man würde in einer Bridge definieren, auf welche Datenbank man zugreifen möchte (parametriert wie üblich, Engine, host, port, user/passwort usw), Things wären dann die Tabellen und/oder Views und Channel könnten gezielt die Daten aus einer oder mehreren Spalte(n) anbieten, als json, csv, whatever.
Das Ganze wäre also keine Persistence im Sinne von openHAB, sondern ein wahlfreier Datenbankzugriff.
Das ist eine von der Persistence losgelöste Funktion, die ganz klar in openHAB fehlt.
Was allerdings in dem Zusammenhang leider ebenfalls fehlt, ist jemand, der ein solches Binding entwickeln kann und will...
Die "korrekte" Lösung (im Sinne von: wie openHAB aufgebaut ist) wäre, die gewünschte Funktionalität in ein Addon auszulagern, welches dann z.B. Database Addon hieße.
Dieses Addon wäre allerdings erst mal nicht als Persistence einzubinden, sondern wie ein Binding für IoT Hardware/Datenquellen (Beispiel weather mit forecast...). Man würde in einer Bridge definieren, auf welche Datenbank man zugreifen möchte (parametriert wie üblich, Engine, host, port, user/passwort usw), Things wären dann die Tabellen und/oder Views und Channel könnten gezielt die Daten aus einer oder mehreren Spalte(n) anbieten, als json, csv, whatever.
Das Ganze wäre also keine Persistence im Sinne von openHAB, sondern ein wahlfreier Datenbankzugriff.
Das ist eine von der Persistence losgelöste Funktion, die ganz klar in openHAB fehlt.
Was allerdings in dem Zusammenhang leider ebenfalls fehlt, ist jemand, der ein solches Binding entwickeln kann und will...
openHAB5.1.2 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime - LXC, 4 Kerne, 3 GByte RAM)
Hostsystem Proxmox VE 9.1.5 - AMD Ryzen 5 3600 6 Kerne, 12 Threads - 64 GByte RAM - ZFS Pools: Raid Z1, 3 x 20 TB HDD -> 40 TByte und Raid Z0-Mirrored 4 x 1 TByte NVMe -> 2 TByte
Hostsystem Proxmox VE 9.1.5 - AMD Ryzen 5 3600 6 Kerne, 12 Threads - 64 GByte RAM - ZFS Pools: Raid Z1, 3 x 20 TB HDD -> 40 TByte und Raid Z0-Mirrored 4 x 1 TByte NVMe -> 2 TByte
-
talcom
- Beiträge: 4
- Registriert: 13. Jan 2026 08:12
Re: SQL Statements ausführen
Vielen Dank für Deine Antwort. So etwas in der Art habe ich mir auch schon gedacht.
Leider kenne ich mich mit Details zu solchen Bindings etc. zu wenig aus um das selbst entwickeln zu können. Ggf. gibt es einen Platz, wo man zumindest so einen Wunsch für die "Macher" platzieren kann.
Danke jedenfalls für das Feedback.
Leider kenne ich mich mit Details zu solchen Bindings etc. zu wenig aus um das selbst entwickeln zu können. Ggf. gibt es einen Platz, wo man zumindest so einen Wunsch für die "Macher" platzieren kann.
Danke jedenfalls für das Feedback.
-
talcom
- Beiträge: 4
- Registriert: 13. Jan 2026 08:12
Re: SQL Statements ausführen
Zu guter Letzt möchte ich das Forum daran teilhaben lassen, das es am Ende doch geht - auch wenn einige Schritte dazu notwendig sein.
OpenHAB ruft in einer Rule eine Powershell auf. Diese Powershell wiederum macht den DB Insert auf meiner Datenbank. Eine Tabelle mit mehreren Variablen.
Dazu muss aber der Powershell Aufruf als Thing im OpenHAB angelegt sein, die PowerShell selbst muss sich über die REST API die Variablen einlesen. Dazu muss auch ein Token im OpenHAB erzeugt werden. Zusätzlich muss in Win 11 der "Lokale Systembenutzer" die Rechte für den DB Insert haben. Dabei hat insbesondere die Schnittstelle OpenHAB zu Powershell die meisten Probleme bereitet. Es waren viele Versuche nötig hier eine tragfähige Lösung hin zu bekommen. Aber es geht und wenn einmal der Weg da ist, kann man diese Lösung dann entsprechend ausbauen.
OpenHAB ruft in einer Rule eine Powershell auf. Diese Powershell wiederum macht den DB Insert auf meiner Datenbank. Eine Tabelle mit mehreren Variablen.
Dazu muss aber der Powershell Aufruf als Thing im OpenHAB angelegt sein, die PowerShell selbst muss sich über die REST API die Variablen einlesen. Dazu muss auch ein Token im OpenHAB erzeugt werden. Zusätzlich muss in Win 11 der "Lokale Systembenutzer" die Rechte für den DB Insert haben. Dabei hat insbesondere die Schnittstelle OpenHAB zu Powershell die meisten Probleme bereitet. Es waren viele Versuche nötig hier eine tragfähige Lösung hin zu bekommen. Aber es geht und wenn einmal der Weg da ist, kann man diese Lösung dann entsprechend ausbauen.
- udo1toni
- Beiträge: 15639
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: SQL Statements ausführen
Joaa... kann man machen... das hat dann aber herzlich wenig mit openHAB zu tun
über das Exec Binding oder alternativ aus einer Rule heraus direkt mittels executeCommandLine-Action kann man letztlich alles programmieren, was man mittels Scripting auf dem OS bauen kann.
openHAB5.1.2 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime - LXC, 4 Kerne, 3 GByte RAM)
Hostsystem Proxmox VE 9.1.5 - AMD Ryzen 5 3600 6 Kerne, 12 Threads - 64 GByte RAM - ZFS Pools: Raid Z1, 3 x 20 TB HDD -> 40 TByte und Raid Z0-Mirrored 4 x 1 TByte NVMe -> 2 TByte
Hostsystem Proxmox VE 9.1.5 - AMD Ryzen 5 3600 6 Kerne, 12 Threads - 64 GByte RAM - ZFS Pools: Raid Z1, 3 x 20 TB HDD -> 40 TByte und Raid Z0-Mirrored 4 x 1 TByte NVMe -> 2 TByte