Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Tester
    4. [Aufruf] Dringender Test sql 1.6.4

    NEWS

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    [Aufruf] Dringender Test sql 1.6.4

    This topic has been deleted. Only users with topic management privileges can see it.
    • sissiwup
      sissiwup last edited by

      @apollon77:

      Die Meldungen sagen folgendes:

      Wenn Du für einen Datenpunkt das "gleiche Werte loggen nach x Sekunden" einschaltest verssucht der Adapter das auch zu tun wenn innerhalb der Zeit kein neuer Wert kam. Er sucht dann im Zweifel dafür den zuletzt gespeicherten Wert raus.

      Wenn es aber keinen gibt - und bei einigen HM-States kann das durchaus passieren - und damit keinerlei "State-Wert" existiert dann kann er auch nichts loggen (NULL loggen macht da keinen Sinn weil es kein echter Wert wäre). Aus dem Grund wird das zeitliche "gleicher Wert loggen" temporär ausgeschaltet. Genau das sagt die Meldung.

      Falls für so einen State ein neuer Wert käme dann würde ab dann automatisch das "gleiche Werte loggen" wieder eingeschaltet werden.

      Zu der Frage wegen:

      For getHistory for id tankerkoenig.0.stations.9.diesel.feed: Type empty. Need to write data first. Index = undefined
      

      Wenn das direkt nach dem Start des Adapters passiert, so kann es sein das deine Grafiken "zu schnell" waren.

      Beim Start des Adapters wird nach dem Verbindung und "Initialisierung" der Datenbanktabellen alle Datenpunkte, typen und Indizes ausgelesen und gespeichert. Ein "Index=undefined" wie in der Meldung oben könnte darauf hinweisen das die History-Daten abgefragt wurden BEVOR die Daten gelesen wurden. Das würde solche meldungen direkt nach dem Start erklären.

      Ich könnte jetzt was einbauen was das im Zweifel behebt und auch das bei getHistory vorher rausliesst … Nötig? 🙂 `

      Hallo,

      nein. Ich habe jetzt die Punkt ausgenommen vom "gleicher Wert loggen"

      1 Reply Last reply Reply Quote 0
      • sissiwup
        sissiwup last edited by

        Hallo.

        immer noch Duplicate Keys:

        *   2018-02-18 14:42:19 Alarmstatus: im Haus/Lüften
        *   2018-02-18 12:26:32 Alarmstatus: OFF
        *   2018-02-15 21:41:40 Alarmstatus: Haus alles gesichert
        

        Das Ereignis wird einmal in eine Variable geschrieben (siehe manuelles Protokoll), aber:

        609_sql12.jpg

        In der Datenbank wird es 3x geschrieben:

        609_sql11.jpg

        Was mich wundert ist, das er so lange braucht, bis er in die DB Schreibt.

        Und warum er überhaupt doppelt schreibt,

        a) ist entprellen auf 1 Sekunde gesetzt.

        b) sollen nur Änderungen geschrieben werden

        609_sql13.jpg

        Wie ist denn der Ablauf des SQL-Adapters?

        Beim starten sollte er sich alle Werte für Datenpunkte + ts aus der DB holen. -> Wertecache

        Bei jeder Änderung sollte er

        Das muss Atomar sein:

        a) prüfen ob aktueller ts - Entprell-Intervall > letzter ts

        b) prüfen ob aktueller Wert <> alter Wert aus DB (bei nur Änderungen)

        c) Wenn er denn schreiben möchte, dann Cache aktualisieren

        Jetzt kann parallelisiert werden

        d) schreiben

        1 Reply Last reply Reply Quote 0
        • apollon77
          apollon77 last edited by

          Um die Duplicates zu verstehen bräuchte ich Debug Log bitte.

          Die genaue Logik zu beschreiben ist sehr umfangreich. Ganz grob (ohne spezielle Startlogik):

          Sämtliche Abarbeitung ist atomar weil nur ein Prozess läuft. Alles asynchrone bei JS wird am Ende auch nur sequenziell abgearbeitet.

          • Werteänderung kommt rein

          • prüfen ob je nach einstellungen geloggt werden soll oder nicht (vergleich mit letztem geloggten Wert)

          • Wenn nein, geskippten Wert intern zusätzlich sichern

          • Wenn ja, Wert sichern und diesen als Referenzwert speichern

          Wie die Duplicates zustandekommen weiss ich gerade nicht. Ich finde in deinem Screenshot nur nteressant das der timestamp in der Query und die in der Fehlermeldung unterschiedlich sind.

          Ich weiss aber das es sonderlogik für "Duplicates" gibt die das ganze mit +1ms Timestamp nochmals schreibt. Die ist schon ewig drin …

          Ingo

          1 Reply Last reply Reply Quote 0
          • ruhr70
            ruhr70 last edited by

            @apollon77:

            Hm, wüsste nicht wie das zu „duplicate key“ führen sollte. Das ist an sich eher das zum gleichen zeitstempel schon ein wert in der dB existiert.

            Starte mal sql Adapter neu dann sollten pot Probleme vom manuellen löschen weg sein. `

            Nach einem Neustart des SQL-Adapters sind die Meldungen weg.

            1 Reply Last reply Reply Quote 0
            • sissiwup
              sissiwup last edited by

              @apollon77:

              Um die Duplicates zu verstehen bräuchte ich Debug Log bitte

              Ingo `
              Hallo,

              Leider tritt der Fehler nur sporadisch auf und der SQL-Adapter schreibt im debug solche Massen an Logdaten, dass ich den nicht für längere Zeit aktivieren möchte.

              Es ist scheinbar meistens eine Datenpunkt der vom JavaScript-Adapter ausgelöst/geschrieben wird.

              1 Reply Last reply Reply Quote 0
              • apollon77
                apollon77 last edited by

                Hm … dann ist es echt schwierig dem auf die Spur zu kommen ... 😞

                Ist es immer der gleiche Datenpunkt?

                Wenn ja vllt zweite ssql-Instanz in Debug Log aufsetzen in zweite DB schreiben und nur wenige Datenpunkte dort aktivieren (die halt wo sowas passiert). Ich kann es aktuell nicht nachvollziehen. Ich brauche aber die Info was passiert wenn es das erste mal passiert

                1 Reply Last reply Reply Quote 0
                • sissiwup
                  sissiwup last edited by

                  @apollon77:

                  Hm … dann ist es echt schwierig dem auf die Spur zu kommen ... 😞

                  Ist es immer der gleiche Datenpunkt?

                  Wenn ja vllt zweite ssql-Instanz in Debug Log aufsetzen in zweite DB schreiben und nur wenige Datenpunkte dort aktivieren (die halt wo sowas passiert). Ich kann es aktuell nicht nachvollziehen. Ich brauche aber die Info was passiert wenn es das erste mal passiert `

                  War die Woche auf Dienstreise, werde das mal ausprobieren. Habe ja noch einen 2. Server der die DB schon installiert hat und vor sich hinläuft.

                  1 Reply Last reply Reply Quote 0
                  • sissiwup
                    sissiwup last edited by

                    609_sql14.jpg

                    Wie verhext. Reload im Browser und die Daten sind da.

                    Ist das vlt. ein Timeout?

                    1 Reply Last reply Reply Quote 0
                    • apollon77
                      apollon77 last edited by

                      welche sql.Adapter Version? Ehrlich noch die 1.6.4?

                      1 Reply Last reply Reply Quote 0
                      • sissiwup
                        sissiwup last edited by

                        @sissiwup:

                        sql14.JPG

                        Wie verhext. Reload im Browser und die Daten sind da.

                        Ist das vlt. ein Timeout? `

                        1.7.1

                        1 Reply Last reply Reply Quote 0
                        • apollon77
                          apollon77 last edited by

                          Hm … wann vorher neu gestartet?

                          1 Reply Last reply Reply Quote 0
                          • sissiwup
                            sissiwup last edited by

                            @apollon77:

                            Hm … wann vorher neu gestartet? `

                            Jede Nacht um 4:00.

                            Ist aber der erste Aufruf von vis.

                            1 Reply Last reply Reply Quote 0
                            • sissiwup
                              sissiwup last edited by

                              Folgendes Script:

                              setState("vEreignissAkt","------------ NEUSTART ------------");
                              

                              führt beim Neustart zu:

                               error: sql.0 Cannot insert INSERT INTO `iobroker`.ts_string (id, ts, val, ack, _from, q) VALUES(1617, 1521256587638, '------------ NEUSTART ------------', 0, 13, 0);: Error: ER_DUP_ENTRY: Duplicate entry '1617-1521256587638' for key 'PRIMARY'
                              2018-03-17 04:16:28	
                               error: sql.0 Cannot insert INSERT INTO `iobroker`.ts_string (id, ts, val, ack, _from, q) VALUES(1617, 1521256587637, '------------ NEUSTART ------------', 0, 13, 0);: Error: ER_DUP_ENTRY: Duplicate entry '1617-1521256587637' for key 'PRIMARY'
                               error: sql.0 Cannot insert INSERT INTO `iobroker`.ts_string (id, ts, val, ack, _from, q) VALUES(1617, 1521256587638, '------------ NEUSTART ------------', 0, 13, 0);: Error: ER_DUP_ENTRY: Duplicate entry '1617-1521256587638' for key 'PRIMARY'
                               error: sql.0 Cannot insert INSERT INTO `iobroker`.ts_string (id, ts, val, ack, _from, q) VALUES(1617, 1521256587637, '------------ NEUSTART ------------', 0, 13, 0);: Error: ER_DUP_ENTRY: Duplicate entry '1617-1521256587637' for key 'PRIMARY'
                              

                              Das sieht so aus als würde er beim Neustart das Skript 2x starten?

                              Alle anderen Datenpunkte mit den duplicates sind auch aus ähnlichen Aktion.

                              Meistens ist der Datenpunkt aus dem yr.0 Adapter: yr.0.forecast.day0.pressure

                              1 Reply Last reply Reply Quote 0
                              • apollon77
                                apollon77 last edited by

                                Debug Log?

                                1 Reply Last reply Reply Quote 0
                                • foxriver76
                                  foxriver76 Developer last edited by

                                  Habe auch mal eine Frage. Nutze den Adapter jetzt entsprechend mittels SQLite - läuft auch soweit. 🙂 Nur beim Neustart loggt er mir haufenweise

                                  Cannot queue new requests, because more than 100
                                  
                                  

                                  Ich schätze mal, dass er den alten Status nicht mehr kennt und versucht sämtliche abonnierte DPs auf ein mal in die DB zu schreiben, was die SQLite DB überfordert? Kann ich dem irgendwie entgegenwirken?

                                  beste Grüße

                                  fox

                                  1 Reply Last reply Reply Quote 0
                                  • apollon77
                                    apollon77 last edited by

                                    Ja das liegt an SQLite, Die kann immer nur eine Anfrage abarbeiten und ist daher (und auch aus anderen gründen) nur für nicht so viele Datenpunkte geeignet.

                                    Und ja der Start schreibt den aktuellen Wert überall rein.

                                    Du könntest mal versuchen das Limit höher zu setzen. Wenn Du das versuchen willst mach mal /opt/iobroker/node_modules/iobroker.sql/main.js in einem editor auf. und suche dort nach der Meldung. Gibts mehrfach. Ist immer so grob bei:

                                        if (!multiRequests) {
                                            if (tasks.length > 100) {
                                                adapter.log.error('Cannot queue new requests, because more than 100');
                                    

                                    Da musst Du das 100 mal durch was anderes tauschen, also 500 oder 1000 🙂

                                    Interessant wäre da vorher/nachher mal Speicherverbrauch und sowas zu vergleichen.

                                    Eine Alternative wäre noch bei SQLite dieses Initiale Schreiben zu verhindern … Denke das ist eher noch "the way to go".

                                    1.7.2 vom SQL Adapter vom Github schaltet WriteNulls bei SQLite automatisch aus

                                    1 Reply Last reply Reply Quote 0
                                    • foxriver76
                                      foxriver76 Developer last edited by

                                      @apollon77:

                                      Du könntest mal versuchen das Limit höher zu setzen. Wenn Du das versuchen willst mach mal /opt/iobroker/node_modules/iobroker.sql/main.js in einem editor auf. und suche dort nach der Meldung. Gibts mehrfach. Ist immer so grob bei:

                                          if (!multiRequests) {
                                              if (tasks.length > 100) {
                                                  adapter.log.error('Cannot queue new requests, because more than 100');
                                      

                                      Da musst Du das 100 mal durch was anderes tauschen, also 500 oder 1000 🙂

                                      Interessant wäre da vorher/nachher mal Speicherverbrauch und sowas zu vergleichen. `

                                      Ich werde es bei Gelegenheit mal versuchen, allerdings war die DB wohl teilweise auch schon überfordert beim Neustart.

                                      2018-03-24 09:48:11.319 - error: sql.0 Cannot queue new requests, because more than 100
                                      2018-03-24 09:48:11.428 - error: sql.0 Cannot select SELECT id, type, name FROM datapoints WHERE name='harmony.0.fox.activities.Anzeige-Netflix';: Error: SQLITE_BUSY: database is locked
                                      2018-03-24 09:48:11.430 - warn: sql.0 Cannot get index of "harmony.0.fox.activities.Anzeige-Netflix": Error: SQLITE_BUSY: database is locked
                                      
                                      

                                      @apollon77:

                                      Eine Alternative wäre noch bei SQLite dieses Initiale Schreiben zu verhindern … Denke das ist eher noch "the way to go". `

                                      Das habe ich jetzt erst mal so gemacht. Danke - war mir nicht sicher ob ich das mit den NULL-Werten bei Start/Stop schreiben richtig interpretiert hatte. 😄

                                      1 Reply Last reply Reply Quote 0
                                      • S
                                        SabineT last edited by

                                        @apollon77:

                                        Ich weiss aber das es sonderlogik für "Duplicates" gibt die das ganze mit +1ms Timestamp nochmals schreibt. Die ist schon ewig drin … `
                                        Die Werte doppelt in die Datenbank zu schreiben ist aber auch nicht wirklich sehr Resourcen schonend.

                                        1 Reply Last reply Reply Quote 0
                                        • First post
                                          Last post

                                        Support us

                                        ioBroker
                                        Community Adapters
                                        Donate

                                        699
                                        Online

                                        31.6k
                                        Users

                                        79.5k
                                        Topics

                                        1.3m
                                        Posts

                                        15
                                        203
                                        22512
                                        Loading More Posts
                                        • Oldest to Newest
                                        • Newest to Oldest
                                        • Most Votes
                                        Reply
                                        • Reply as topic
                                        Log in to reply
                                        Community
                                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                        The ioBroker Community 2014-2023
                                        logo