Hinweis: Schöne Alternative für Charts/Plots mit Grafana und DBLog (MySQL)

Begonnen von Thyraz, 08 Oktober 2017, 15:02:38

Vorheriges Thema - Nächstes Thema

andies

Ich kenne mich mit SQL nicht aus, aber ein paar Sachen verstehe ich nicht: wieso steht da Varianz und wieso ist das ,,nicht plausibel"?
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

kadettilac89

Zitat von: Phili am 04 November 2022, 18:45:33
Hi,

benutzt jemand Grafana in Docker und kommt damit auf die sqlite db die auf dem host mit FHEM (nicht im docker container) läuft?
Ich habe Grafana im docker weil ich es dort zusammen mit teslamate am laufen habe.

Ich habe in den datasource Einstellungen die lokale IP des rpi genutzt und den Pfad zur fhem.db (siehe Bild)

Ich bekomme allerdings "Query data error".
Wenn du eine SQLite Datenbank nutzen willst musst du  diese auch per SQLite-Adapter einrichten. Du nutzt den MySQL-Adapter.

Phili

Zitat von: kadettilac89 am 05 November 2022, 10:26:03
Wenn du eine SQLite Datenbank nutzen willst musst du  diese auch per SQLite-Adapter einrichten. Du nutzt den MySQL-Adapter.

Danke das macht natürlich Sinn. Die Datenbank Datei wird jedoch nicht gefunden. Denke mal das hängt mit dem container zusammen?!

rob

Wenn Du wirklich direkt auf das File auf dem Host liegend zugreifen musst, dann müsste dieses oder zumindest der Pfad dahin in den Container hingereicht werden (mounten). Das Filesystem im Container ist normalerweise vom Host gekapselt.

beim Start des Containers z.B. als Parameter hinzufügen
-v /lokaler/pfad/fhem.db:/opt/fhem/fhem.db

Wie startest Du denn den Container konkret (Parameter)?

VG
rob

Phili

Hi,

danke für die Antworten. Ich starte ihn aktuell über compose docker-compose up -d weil ich in der .yml einige Dienste mit starte.
Ich lese mich gerade in named volumes ein, die in der .yml eingetragen werden. Ich denke das bewirkt das gleiche wie ein direktes mounten beim start mit -v

Phili

So ich bin einen Schritt weiter.
Der Pfad ist gemounted:

grafana:
    image: teslamate/grafana:latest
    restart: always
    environment:
      - DATABASE_USER=
      - DATABASE_PASS=
      - DATABASE_NAME=teslamate
      - DATABASE_HOST=database
      - GF_INSTALL_PLUGINS=frser-sqlite-datasource
    ports:
      - 3000:3000
    volumes:
      - teslamate-grafana-data:/var/lib/grafana
      - /opt/fhem/fhem.db:/opt/fhem/fhem.db


Jedoch bekomme ich jetzt den Fehler:
Query error
attempt to write a readonly database (1544)


Dabei wird doch eigentlich nur gelesen?

Phili

Ich denke mal das liegt daran das FHEM die sqlite db nutzt und "sperrt".

rob

Finde den direkten Zugriff auf die DB halt ungewöhnlich. Kann aber sein, dass man so machen kann mit sqlite, bin da kein Experte. Normalerweise kennen ich das so, dass Grafana auf eine Connection zu einem Netzwerkservice zugreift.
Erst recht wenn Grafana auch noch in DB schreiben will.
Wenn ich eine sqlite Verbindung anlegen möchte (add datasource), fragt Grafana auch nach IP und Port - so würde ich das erwarten. Keine DB als file.
Vielleicht hilft dies ansonsten auch weiter https://matthewsetter.com/sqlite-attempt-to-write-to-readonly-database/?

kadettilac89

Zitat von: rob am 05 November 2022, 23:26:52
Finde den direkten Zugriff auf die DB halt ungewöhnlich. Kann aber sein, dass man so machen kann mit sqlite, bin da kein Experte. Normalerweise kennen ich das so, dass Grafana auf eine Connection zu einem Netzwerkservice zugreift.
Erst recht wenn Grafana auch noch in DB schreiben will.
Wenn ich eine sqlite Verbindung anlegen möchte (add datasource), fragt Grafana auch nach IP und Port - so würde ich das erwarten. Keine DB als file.
Vielleicht hilft dies ansonsten auch weiter https://matthewsetter.com/sqlite-attempt-to-write-to-readonly-database/?
Du musst berücksichtigen, dass SQLite nicht für Multiuser und paralleles Schreiben entwickelt wurde sondern für Einzelbenutzer und Anwendungen die exclusive auf die Daten zugreifen. Da es nur eine Datei ist kann man als Anwendnungsentwickler mit kleinem Overhead DB-Funktionen nutzen.

Wenn du mit mehreren Benutzern und Prozessen parallel arbeiten willst musst du zu MySQL oder anderen DBS wechseln. Dafür wurde SQLite nicht gebaut.

kadettilac89

Zitat von: Phili am 05 November 2022, 22:21:47
Jedoch bekomme ich jetzt den Fehler:
Query error
attempt to write a readonly database (1544)


Dabei wird doch eigentlich nur gelesen?
Scheinbar wird doch geschrieben. Vielleicht nur um einen Commit abzusetzen oder Cache auf die db zu schreibe damit die Auswertung konsistent ist. Da du die SQLite in Fhem hast und nun in Grafana einbindest hast du nur Leserechte.

Du hast doch in Grafana die Path Option read only. Sieht man sogar in deinem Screenshot. Warum setzt du nicht auf RO und testest nochmal?

Phili

Die Path Option ist in grau und nur als "Beispiel". Wenn man in das Feld reingeht dann erlischt der Text. Das heisst ich habe da nichts angegeben.
Ich habe es auch schon mit "mode=ro" bzw. "mode=rw" getestet.

Ich bin gerade dabei die SQLite db auf MariaDB umzuziehen. Denke das wird auch mal Zeit da das .db file auch schon einige gb groß ist.

Danke für eure Antworten!

Phili

Zur Doku falls das Setup auch jemand mal braucht.

SQLite nach MariaDB umgezogen.
Grafana läuft im Container (zusammen mit teslamate und einer postgredb zum loggen der Tesla Daten)

Die docker-compose.yml muss angepasst werden damit auf die lokale sql db zugegriffen werden kann. Über die Zeile network_mode: "host" in der service config des containers kann dann ganz normal in grafana über localhost:3306 auf die sqldb auf dem host zugegriffen werden.

Siehe Beitrag weiter unten. Es lag an einer falschen config des mysql servers.

kadettilac89

#492
Zitat von: Phili am 06 November 2022, 13:12:27
Zur Doku falls das Setup auch jemand mal braucht.

SQLite nach MariaDB umgezogen.
Grafana läuft im Container (zusammen mit teslamate und einer postgredb zum loggen der Tesla Daten)

Die docker-compose.yml muss angepasst werden damit auf die lokale sql db zugegriffen werden kann. Über die Zeile network_mode: "host" in der service config des containers kann dann ganz normal in grafana über localhost:3306 auf die sqldb auf dem host zugegriffen werden.
Warum braucht eine Datenbank exklusiven Host Zugriff? Dafür ist ja der Port da um die Kommunikation eben nicht wild über irgend welche unbekannte Kanäle laufen zu lassen.

Hast du Port der Datenbank zum Host durchgereicht? Oder welchem Container gibst du "host"?

Edit: du darfst nicht localhost:3306 eintragen sondern die IP des HOsts, z. B. vom Raspberry. Localhost ist nur der Container, darum gehts mit Parameter Host auch wenn es nciht empfohlen ist. Oder <name des MySql-Containers>:3306, einfach genau so wie du auch in Fhem definierst.

Phili

Nicht die Datenbank braucht host Zugriff sondern der Container.
Der Container läuft in einem anderem Netzwerk. Mit localhost:3306 sowie 168.0.1.100:3306 (feste ip des rpi) als auch mit 127.0.0.1 kommst du mit grafana im container nicht auf die Datenbank die lokal auf dem rpi läuft.

Fragt man den container ab sieht man das auch auch gut:

pi@fhemrpi:~/teslamate $ docker inspect teslamate_grafana_1 | grep Gateway
            "Gateway": "",
            "IPv6Gateway": "",
                    "Gateway": "172.29.0.1",
                    "IPv6Gateway": "",


Damit war klar das aus dem container die Datenbank mit 168.0.1.100:3306 nicht angesprochen werden kann.

Mit der Erweiterung der compose .yml über network_mode sieht das jetzt so aus.
pi@fhemrpi:~/teslamate $ docker inspect teslamate_grafana_1 | grep Gateway
            "Gateway": "",
            "IPv6Gateway": "",
                    "Gateway": "",
                    "IPv6Gateway": "",

Und die lokale ip des rpis ist erreichbar sowohl mit localhost als auch 192.168.0.100

kadettilac89

Zitat von: Phili am 06 November 2022, 17:52:36
Damit war klar das aus dem container die Datenbank mit 168.0.1.100:3306 nicht angesprochen werden kann.

Mit der Erweiterung der compose .yml über network_mode sieht das jetzt so aus.

Und die lokale ip des rpis ist erreichbar sowohl mit localhost als auch 192.168.0.100
OK, verstehe dein spezielles Setup nicht. Aber wenn du damit dein Problem löst. Auch dass du MySQL nicht als Docker sondern lokal installierst ist eigenartig wenn schon fhem, grafana als Docker läuft.

Zitat von: Phili am 06 November 2022, 13:12:27
Zur Doku falls das Setup auch jemand mal braucht.
Dein Setup ist sehr speziell, die Empfehlung "network_mode: host" sollte nicht als default kommuniziert werden.