[Modul] Archive Control MySQL

Halllo zusammen,

ich hatte das Problem, daß ich keine Verbindung zu meiner MySQL-DB herstellen konnte. Nach Recherche stellte sich heraus, dass ab MySQL 8 die default authentication auf caching_sha2_password umgestellt wurde. Leider kann mysqli dass aber erst ab Version 7.4, während Symcon gegenwärtig mit PHP 7.3 kommt. Um das AddOn zur Verbindung mit der DB zu überreden muss der Symcon-User entsprechend angelegt, bzw. geändert werden, so daß er auf mysql_native_password reagiert:


ALTER USER 'symcon'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; 

bzw.

CREATE USER 'symcon'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Der Vollständigkeit halber erwähne ich noch einen Stolperstein, auf den ich nebenbei gestoßen bin: Wenn MySQL auf Mac über Brew installiert wird, wird es in der my.cnf mittels mysqlx-bind-address = 127.0.0.1 hart an localhost gebunden. Sollte man remote zugreifen wollen muss der Eintrag auf bind-address = * geändert werden.

Gruß,
Thomas

Hi,

ich hatte heute das Problem, dass ich eine Variable hinzugefügt hab, die dann erst mal keine Einträge in der Datenbank hatte.
Dadurch krieg ich einen Fehler in der Anzeige des Konfigurationsbildschirms.

Ich hab einen quickfix gebaut, dazu muss die Funktion GetSummary in libs/MySQLArchiv.php erweitert werden:


    protected function GetSummary($VariableId)
    {
        if (!$this->isConnected) {
            return false;
        }

        $query = "SELECT unix_timestamp(timestamp) AS 'TimeStamp' " .
                'FROM  var' . $VariableId . ' ' .
                'ORDER BY timestamp ASC ' .
                'LIMIT 1';
        /* @var $sqlresult mysqli_result */

        $sqlresult = $this->DB->query($query);

        if ($sqlresult->num_rows == 0) {
             return false;
        }

Die Abfrage stellt sicher, dass mindestens eine Row in der Datenbank vorhanden ist. Eventuell könntest du das bitte ins Modul mit einpflegen oder den Fehler anderweitig umgehen.

Jetzt läuft auch alles bei mir. Super Modul. Danke!

VG
Michael

Dank für den Fund und Fix.
Gab noch eine Stelle wo es auch ähnlich hätte auftreten können.

Beides gefixt und als Beta im Store verfügbar.

Michael

Neues Stable Release im Store:

Version 3.35:

  • Das Anzeigen der Konfiguration konnte fehlschlagen, wenn in einer Tabelle keine Werte vorhanden waren.
  • ACmySQL_GetAggregationVariables konnte fehlschlagen, wenn in einer Tabelle keine Werte vorhanden waren.
  • ACmySQL_ChangeVariableID konnte fehlschlagen,wenn in einer Tabelle keine Werte vorhanden waren.
  • ACmySQL_GetLoggedValues konnte fehlschlagen,wenn in einer Tabelle keine Werte vorhanden waren.
  • ACmySQL_GetAggregatedValues konnte fehlschlagen,wenn in einer Tabelle keine Werte vorhanden waren.

Nabend Nall-chan,

ich benutze dein Modul um Werte in meine mysql Datenbank zu schreiben nun seit ein paar Tagen.
Visualisieren möchte ich diese mit grafana.
Allerdings gibt es bei grafana das Problem, das grafana mit dem Format des timestamp nicht so ganz zurecht kommt.
Die Daten werden trotz richtig eingestellten Zeitzonen in beiden Programmen in grafana um 1h versetzt aufgezeichnet und der Graf hat einen Versatz um 2h.
Das Problem liegt nach Onlinerecherche an den unterschiedlichen Zeitformaten mit denen die Programme arbeiten.
Die Datenbank in mysql wird wohl in CEST gespeichert und grafana arbeitet mit dem UTC Format.

Jetzt meine Frage.
Kann ich in der mysql das Zeitformat in UTC ändern ohne das an dem Modul was geändert werden müsste?
Es schreibt weiterhin die Daten in die 3 Spalten der vorhandenen Tabelle.
Oder wäre es möglich in der Datenbank händisch eine 4 Spalte einzufügen die dann automatisch den timestamp im UTC Format speichert?
Halt jeweils ohne Änderungen am Modul durchführen zu müssen.
Den Namen der Tabelle ändern geht ja nicht wie ich hier gelesen habe.

Als Lösung hab ich bisher geschafft in grafana mit unix_timestamp(timestamp) AS time die Daten und den Grafen wieder richtig angezeigt zu bekommen.
Allerdings kann man so nicht mehr im Graf nach hinten scrollen um sich z.B. den letzten Tag anschauen zu können. Also nicht ganz so optimal.

mysql und grafana laufen auf der gleiche raspi.
Für mich ist alles noch absolutes neuland ich bitte daher um Nachsicht.

Das benutzte Feld mit Typ DATETIME enthält keine Info zur Zeitzone, wird aber mit einem UTC Timestamp befüllt.
Und eine konvertieren findet beim lesen schreiben nicht automatisch statt.
Somit würde ich den Fehler bei Grafana suchen.
Michael

Danke für die schnelle Antwort,

das Problem liegt ja bei grafana.
Die einzigen Lösungen die ich bisher gefunden habe ist aber bisher die nicht ganz zufriedenstellende UNIX Lösung
und das man in der mysql Tabelle eine neue spalte einfügt mit einem Zeitstempel mit dem grafana umgehen kann.

Könnte ich einfach in den Tabellen eine 4 Spalte erzeugen und das Modul schreibt weiterhin Daten in die 3 Spalten?
Ich versuch dann einen Code zu finden mit dem ich dann automatisch den timestamp aus deinen werten in ein anderes Format umschreibe.
Oder ist es gar nicht möglich irgendwas, an durch das Modul erzeugten Tabellen zu verändern, damit die Werte weiterhin in die Tabelle geschrieben werden.

Gruß
Marius

Musst du ausprobieren, kann ich dir gerade nicht beantworten.
Michael

Wollte heute eine zusätzliche Variable hinzufügen.
Beim Speichern kommt diese grosse Fehlermeldung…Konnte Konfigurationsform nicht laden


Notice: Trying to access array offset on value of type null in /var/lib/symcon/modules/.store/de.nall.chan.archive.mysql/libs/MySQLArchiv.php on line 254



Notice: Trying to access array offset on value of type null in /var/lib/symcon/modules/.store/de.nall.chan.archive.mysql/libs/MySQLArchiv.php on line 262

{„elements“:[{„type“:„ExpansionPanel“,„caption“:„Connection“,„items“:[{„type“:„RowLayout“,„items“:[{„name“:„Host“,„type“:„ValidationTextBox“,„caption“:„Host“},{„name“:„Database“,„type“:„ValidationTextBox“,„caption“:„Database“}]},{„type“:„RowLayout“,„items“:[{„name“:„Username“,„type“:„ValidationTextBox“,„caption“:„Username“},{„name“:„Password“,„type“:„PasswordTextBox“,„caption“:„Password“}]}]},{„type“:„List“,„name“:„Variables“,„rowCount“:20,„add“:true,„delete“:true,„sort“:{„column“:„VariableId“,„direction“:„ascending“},„columns“:[{„caption“:„VariableID“,„name“:„Variable“,„width“:„100px“,„add“:"",„save“:false},{„caption“:„Variable“,„name“:„VariableId“,„width“:„auto“,„add“:0,„edit“:{„type“:„SelectVariable“}},{„caption“:„First value“,„name“:„FirstTimestamp“,„width“:„200px“,„add“:"",„save“:false},{„caption“:„Last value“,„name“:„LastTimestamp“,„width“:„200px“,„add“:"",„save“:false},{„caption“:„Count“,„name“:„Count“,„width“:„100px“,„add“:"",„save“:false},{„caption“:„Size“,„name“:„Size“,„width“:„100px“,„add“:"",„save“:false}],„values“:[{„VariableId“:42017,„Variable“:42017,„Count“:0,„FirstTimestamp“:„Do 01 Jan 1970 01:00:00 CET“,„LastTimestamp“:„Do 01 Jan 1970 01:00:00 CET“,„Size“:„0,02 MB“}]}],„actions“:[{„type“:„Button“,„caption“:„Create Highcharts Script“,„onClick“:"$id=IPS_CreateScript(0);IPS_SetParent($id, 36753);IPS_SetName($id,„Highcharts.ips.php“);IPS_SetScriptContent($id, file_get_contents("/var/lib/symcon/modules/.store/de.nall.chan.archive.mysql/ArchiveControlMySQL/…/docs/Highcharts.ips.php"));echo „Erledigt“;"}],„status“:[{„code“:102,„icon“:„active“,„caption“:„Database connected.“},{„code“:104,„icon“:„inactive“,„caption“:„No connection.“},{„code“:202,„icon“:„error“,„caption“:„Cannot connect to database.“},{„code“:203,„icon“:„error“,„caption“:„Error on create tables.“}]} (Code: -32603)

Diese Meldung kommt nun immer wenn ich die Instanz öffenen möchte.
Nur ein neu installieren dieser behebt das Problem bis ich wieder eine Variable hinzufügen möchte.
Dann kommt immer wieder diese Meldung.

Ergänzung: Wenn ich einige Minuten warte erscheint diese Fehlermeldung nicht mehr.
Ich kann eine Variabel hinzufügen und Speichern. Dann kommt die Fehlermeldung.
Dann eifach mal einige Minuten warten dan gehts.

Etwas unschön. Aber ich kann Variablen hinzufügen.

Ich vermute dies Meldung erscheint solange bis die hinzugefügte Variable einmal eine Aktualisierung durchgeführt hat.

Hast du die aktuelle Version?
Wurde hier eigentlich gefixt:

Michael

Habe dies heute morgen über den Store neu installiert.
Das müsste ja die neuste Version sein.
Oder muss ich die Beatversion installieren?

Ja, musst wohl die Beta benutzen.
Ich glaube ich habe vergessen das einzureichen.
Michael

Hallo, funktioniert das Modul noch auf IPS 6.3?

Hab die aus dem thread verlinkte x86 PHP For Windows: Binaries and sources Releases heruntergeladen und nach symcon/ext kopiert, anschließend dein Modul installiert. Fehlermeldung bleibt aber dennoch in symcon, dass mysqli nicht geladen werden konnte.

Konnte Konfigurationsform nicht laden
Fatal error: Uncaught Error: Class 'mysqli' not found in C:\ProgramData\Symcon\modules\.store\de.nall.chan.archive.mysql\libs\MySQLArchiv.php:42
Stack trace:
#0 C:\ProgramData\Symcon\modules\.store\de.nall.chan.archive.mysql\ArchiveControlMySQL\module.php(210): ArchiveControlMySQL->Login()
#1 C:\Windows\System32\-(3): ArchiveControlMySQL->GetConfigurationForm()
#2 {main}
  thrown in C:\ProgramData\Symcon\modules\.store\de.nall.chan.archive.mysql\libs\MySQLArchiv.php on line 42
Abort Processing during Fatal-Error: Uncaught Error: Class 'mysqli' not found in C:\ProgramData\Symcon\modules\.store\de.nall.chan.archive.mysql\libs\MySQLArchiv.php:42
Stack trace:
#0 C:\ProgramData\Symcon\modules\.store\de.nall.chan.archive.mysql\ArchiveControlMySQL\module.php(210): ArchiveControlMySQL->Login()
#1 C:\Windows\System32\-(3): ArchiveControlMySQL->GetConfigurationForm()
#2 {main}
  thrown
   Error in Script C:\ProgramData\Symcon\modules\.store\de.nall.chan.archive.mysql\libs\MySQLArchiv.php on Line 42 (Code: -32603)

Hat jemand eine Idee?

Gruß oekomat

Edit: hab die Version 7.4.10 der mysqli genutzt

Wenn eine php_mysqli.dll existiert (kann soweit ich weiß auch eine leere Datei sein), sollte der Symcon Updater die automatisch aktualisieren.

Ansonsten: Welche DLL hast du genau verwendet? Plattform, TS, NTS, x86, x86_64?

Du musst die 7.4.x (x64 Thread Safe) nutzen:

Michael

Hab aus dem Archiv jetzt 7.4.0 win32 vc15 x64 probiert ging nicht, läuft bei mir auf win10 vm.

Schaut korrekt aus. Auch wenn ich vielleicht die 7.4.10 genommen hätte.
Wo hast du sie hin kopiert (ganzer Pfad) und welche Datei genau?
Anschließend Symcon neu gestartet?
Da steht im Logfiles auf jeden Fall die genaue PHP Version und vielleicht auch wenn sie nicht geladen wird.
Michael

Zudem: Steht die DLL in der php.ini? Eigentlich erkennt Symcon (korrekte?) DLLs von selbst und schreibt sie dort rein. Es gab jetzt auch ab und an Probleme mit Syntaxfehlern in der php.ini, wodurch dann keine Module geladen wurden.

symcon neu gestartet, ja.

c:\ProgramData\Symcon\ext - wo die anderen dll auch drin sind.

Datei php_mysqli.dll

Bin jetzt ratlos.

Da liegt nicht die Symcon executable!
Den ext Ordner kannst du löschen.
Unter ProgramData liegt die Konfig, die logs usw…

Du musst es in das Symcon Programmverzeichnis und dort unter ext kopieren
Das ist entweder unter C:/Program Files (x86) oder auch gerne noch c:/ip-symcon
Michael