Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. SQL - Wert per Script speichern

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    SQL - Wert per Script speichern

    This topic has been deleted. Only users with topic management privileges can see it.
    • bahnuhr
      bahnuhr Forum Testing Most Active @Ahnungsbefreit last edited by

      @ahnungsbefreit sagte in SQL - Wert per Script speichern:

      @bahnuhr Vielleicht guck ich falsch aber die [] sind doch irgendwie zu viel bei Dir, oder? Das ist doch kein Array?

      Hast wohl recht.

      Ich habe das Beispiel von git:

      sendTo('sql.0', 'delete', [
          {id: 'mbus.0.counter.xxx, state: {ts: 1589458809352}, 
          {id: 'mbus.0.counter.yyy, state: {ts: 1589458809353}
      ], result => console.log('deleted'));
      

      geändert auf storeState.

      Vielleicht stimmt ja auch die git Seite nicht ?!?!?

      Danke an dich.
      Dein Script läuft.

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

        @mcu Also ne Insert query geht auch aber das geht dann noch mehr an allem vorbei ... da verspreche ich gar nix 🙂

        M 1 Reply Last reply Reply Quote 0
        • bahnuhr
          bahnuhr Forum Testing Most Active @apollon77 last edited by

          @apollon77 sagte in SQL - Wert per Script speichern:

          Was wollt Ihr denn damit anstellen? ;-))

          Ich möchte Werte in einen Datenpunkt schreiben mit einem veränderten (alten) ts.
          (Hintergrund: Wenn ich mal einen vergessen habe einzutragen, dass ich diesen dann mit dem richtigen ts eingetragen bekomme)
          Und dieser Datenpunkt will ich dann anzeigen lassen per flot.

          Geht das irgendwie anders?

          apollon77 1 Reply Last reply Reply Quote 0
          • M
            MCU @apollon77 last edited by

            @apollon77 Laut Adapter-Beschreibung:

            The given IDs are not checked against the ioBroker database and do not need to be set up there, but can only be accessed directly.

            Da kommt man schon auf die Idee, das keine Voraussetzungen notwendig sind. Vielleicht die Doku anpassen und den Hinweis auf die notwenige History-Einstellung (aktiv) erwähnen.
            Und gleich die Beispiele, die du oben schon angezeigt hast.
            Vielen Dank.

            1 Reply Last reply Reply Quote 0
            • M
              MCU @apollon77 last edited by MCU

              @apollon77 Hatte ich nur zum Testen gemacht, da es kein 'ADD'-Befehl in dem Adapter gibt. So habe ich herausgefunden, dass es noch andere Abhängigkeiten geben muss.
              Die Daten werden aber so angelegt. Also es funktioniert.
              7f0062b7-96a0-4b7f-9f30-e8eee67191f7-image.png

              Offene Frage: Muss die History vom DP dauerhaft aktiv sein, um einen neuen Wert über die Befehle speichern zu können (denn dann werden ja sowieso automatisch alle Wert vom DP gespeichert in SQL-DB), oder nur einmalig beim Anlegen oder für das Anlegen von dem DP in der SQL-DB?

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

                @bahnuhr Ne das ist ja ok

                bahnuhr 1 Reply Last reply Reply Quote 0
                • apollon77
                  apollon77 @MCU last edited by

                  @mcu Es wird nur das initialisiert was auch aktiviert ist. Alles andere "kennt" der Adapter nicht.

                  1 Reply Last reply Reply Quote 0
                  • bahnuhr
                    bahnuhr Forum Testing Most Active @apollon77 last edited by

                    @apollon77 sagte in SQL - Wert per Script speichern:

                    @bahnuhr Ne das ist ja ok

                    Versteh ich jetzt nicht.

                    Wenn ich einen Wert eintrage mit o.g. kleine Script wird dieser Wert ja in die Datenbank von sql geschrieben.
                    Zumindest kann ich diesen auslesen (mit einem anderen Script.

                    In dem Datenpunkt in iob werden diese Werte aber nicht angezeigt.

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

                      @bahnuhr Ich hab nur gemeint das der Anwendungsfall ok ist das Feature zu nutzen

                      1 Reply Last reply Reply Quote 0
                      • bahnuhr
                        bahnuhr Forum Testing Most Active last edited by

                        Ne andere Frage zu sql.

                        Wenn ich mit einem kleinen Script den ts ausrechne, klappt dies einwandfrei mit folgender Ausnahme:

                        Wenn das Datum vor 2000 liegt, dann wird offensichtlich ein falscher ts erzeugt.
                        Wenn ich diesen erzeugten ts eingebe im Internet scheint er aber richtig zu sein.
                        Nur in einem flot erscheint der Punkt nicht !?

                        Script:

                        var theDate = new Date("30 december 1999");
                                    if (logging) log (theDate.getTime());
                        

                        Warum ist der ts bei Daten vor 2000 falsch (oder zumindest im flot) ?
                        Oder was muss man anders machen.
                        Oder liegt es an flot ?

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

                          @bahnuhr was kommt da denn für ein Wert raus?

                          Kann es sein das der kleiner als 946681200000 wird?

                          WIr haben vor einigen Jahren mal intern die Daten von "Zeitstempel in Sekunden" auf "Zeistempel in Millisekunden" umgestellt.
                          Die Erkennung läuft so:

                          Wenn Wert < 946681200000 dann annahme es ist in Sekunden und wir nehmen wert intern "*1000"

                          Daher wenn du nen Wert < 946681200000 hast mache ihn / 1000 (der code korrigiert das dann)

                          bahnuhr 1 Reply Last reply Reply Quote 0
                          • bahnuhr
                            bahnuhr Forum Testing Most Active @apollon77 last edited by bahnuhr

                            @apollon77 sagte in SQL - Wert per Script speichern:

                            Daher wenn du nen Wert < 946681200000 hast mache ihn / 1000 (der code korrigiert das dann)

                            Klappt nicht.
                            Im Script habe ich folgendes eingebaut:

                                        ts_wert = theDate.getTime();
                                        if (ts_wert < 946681200000) { ts_wert = ts_wert / 1000 };
                            

                            Wie du im log sieht, schreibe ich Werte bis 1995 zurück. Und der ts wird durch 1000 geteilt.

                            javascript.0	2021-05-05 19:25:19.790	info	(21611) script.js.Scripte.Sonstige.abc: 912380400
                            javascript.0	2021-05-05 19:25:19.790	info	(21611) script.js.Scripte.Sonstige.abc: 21 -164.5 -143.5
                            javascript.0	2021-05-05 19:25:19.790	info	(21611) script.js.Scripte.Sonstige.abc: 30 november 1998
                            javascript.0	2021-05-05 19:25:19.789	info	(21611) script.js.Scripte.Sonstige.abc: 909702000
                            javascript.0	2021-05-05 19:25:19.789	info	(21611) script.js.Scripte.Sonstige.abc: 15.3 -165.2 -149.9
                            javascript.0	2021-05-05 19:25:19.789	info	(21611) script.js.Scripte.Sonstige.abc: 30 october 1998
                            javascript.0	2021-05-05 19:25:19.788	info	(21611) script.js.Scripte.Sonstige.abc: 907106400
                            javascript.0	2021-05-05 19:25:19.788	info	(21611) script.js.Scripte.Sonstige.abc: 20.7 -180.4 -159.7
                            javascript.0	2021-05-05 19:25:19.788	info	(21611) script.js.Scripte.Sonstige.abc: 30 september 1998
                            javascript.0	2021-05-05 19:25:19.787	info	(21611) script.js.Scripte.Sonstige.abc: 904428000
                            javascript.0	2021-05-05 19:25:19.787	info	(21611) script.js.Scripte.Sonstige.abc: 19.4 -181.4 -162
                            javascript.0	2021-05-05 19:25:19.786	info	(21611) script.js.Scripte.Sonstige.abc: 30 august 1998
                            javascript.0	2021-05-05 19:25:19.786	info	(21611) script.js.Scripte.Sonstige.abc: 901749600
                            javascript.0	2021-05-05 19:25:19.785	info	(21611) script.js.Scripte.Sonstige.abc: 43.7 -181.9 -138.2
                            javascript.0	2021-05-05 19:25:19.785	info	(21611) script.js.Scripte.Sonstige.abc: 30 july 1998
                            javascript.0	2021-05-05 19:25:19.785	info	(21611) script.js.Scripte.Sonstige.abc: 899157600
                            javascript.0	2021-05-05 19:25:19.784	info	(21611) script.js.Scripte.Sonstige.abc: 40.6 -182.6 -142
                            javascript.0	2021-05-05 19:25:19.784	info	(21611) script.js.Scripte.Sonstige.abc: 30 june 1998
                            javascript.0	2021-05-05 19:25:19.783	info	(21611) script.js.Scripte.Sonstige.abc: 896479200
                            javascript.0	2021-05-05 19:25:19.783	info	(21611) script.js.Scripte.Sonstige.abc: 36.2 -188.3 -152.1
                            javascript.0	2021-05-05 19:25:19.783	info	(21611) script.js.Scripte.Sonstige.abc: 30 may 1998
                            javascript.0	2021-05-05 19:25:19.782	info	(21611) script.js.Scripte.Sonstige.abc: 893887200
                            javascript.0	2021-05-05 19:25:19.782	info	(21611) script.js.Scripte.Sonstige.abc: 33.7 -188.8 -155.1
                            javascript.0	2021-05-05 19:25:19.782	info	(21611) script.js.Scripte.Sonstige.abc: 30 april 1998
                            

                            Im flot werden diese jedoch nicht angezeigt.
                            56ef46e3-f369-4907-ab09-d6c478f7d105-image.png
                            Alles was älter als 2000 ist kommt nicht in flot an.

                            Muss ich noch etwas anderes beachten?

                            1 Reply Last reply Reply Quote 0
                            • bahnuhr
                              bahnuhr Forum Testing Most Active last edited by

                              @apollon77

                              Nachtrag:

                              Wenn ich die gespeicherten Werte per Script abrufe:

                              sendTo('sql.0', 'query', 'SELECT id FROM datapoints WHERE name="javascript.0.Sonstige.xxxxxx"', function (result) {
                                  if (result.error) {
                                      console.error(result.error);
                                  } else {
                                      console.log('Rows: ' + JSON.stringify(result.result));
                                      var now = new Date();
                                      now.setHours(-10000000);
                                      sendTo('sql.0', 'query', 'SELECT * FROM ts_number WHERE id=' + result.result[0].id, function (result) {
                                          console.log('Rows: ' + JSON.stringify(result.result));
                                      });
                                  }
                              });
                              

                              dann wird ausgegeben:

                              {"id":177,"ts":820278000000,"val":-366.7,"ack":1,"_from":0,"q":0},{"id":177,"ts":822956400000,"val":-388.9,"ack":1,"_from":0,"q":0},{"id":177,"ts":825462000000,"val":-411.1,"ack":1,"_from":0,"q":0},{"id":177,"ts":828140400000,"val":-411.1,"ack":1,"_from":0,"q":0},{"id":177,"ts":830815200000,"val":-410.5,"ack":1,"_from":0,"q":0},{"id":177,"ts":833407200000,"val":-409.9,"ack":1,"_from":0,"q":0},{"id":177,"ts":836085600000,"val":-329.5,"ack":1,"_from":0,"q":0},{"id":177,"ts":838677600000,"val":-329.4,"ack":1,"_from":0,"q":0},{"id":177,"ts":841356000000,"val":-323.7,"ack":1,"_from":0,"q":0},{"id":177,"ts":844034400000,"val":-300.3,"ack":1,"_from":0,"q":0},{"id":177,"ts":846630000000,"val":-293.7,"ack":1,"_from":0,"q":0},{"id":177,"ts":849308400000,"val":-283.4,"ack":1,"_from":0,"q":0},{"id":177,"ts":851900400000,"val":-267.7,"ack":1,"_from":0,"q":0},{"id":177,"ts":854578800000,"val":-267.3,"ack":1,"_from":0,"q":0},{"id":177,"ts":857084400000,"val":-261.5,"ack":1,"_from":0,"q":0},{"id":177,"ts":859676400000,"val":-251.2,"ack":1,"_from":0,"q":0},{"id":177,"ts":862351200000,"val":-245.7,"ack":1,"_from":0,"q":0},{"id":177,"ts":864943200000,"val":-245.1,"ack":1,"_from":0,"q":0},{"id":177,"ts":867621600000,"val":-236.4,"ack":1,"_from":0,"q":0},{"id":177,"ts":870213600000,"val":-236.9,"ack":1,"_from":0,"q":0},{"id":177,"ts":872892000000,"val":-235.6,"ack":1,"_from":0,"q":0},{"id":177,"ts":875570400000,"val":-228.1,"ack":1,"_from":0,"q":0},{"id":177,"ts":878166000000,"val":-227.4,"ack":1,"_from":0,"q":0},{"id":177,"ts":880844400000,"val":-216.7,"ack":1,"_from":0,"q":0},
                              

                              Folglich werden (wei von apollon gesagt) die 3x 0 wieder angehängt.

                              Aber die Werte kommen trotzdem in flot nicht an (siehe oben).

                              Liegt das Problem bei flot (und nicht bei sql) ??

                              1 Reply Last reply Reply Quote 0
                              • bahnuhr
                                bahnuhr Forum Testing Most Active last edited by

                                Hallo an alle.

                                Nochmal die Frage ganz konkret.

                                Werte vor 01.01.2000 werden in sql gespeichert.
                                Wie bekommt man es hin, dass diese auch angezeigt werden in flot ?

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

                                  Ich könnte mir vorstellen das das hier der Grund ist

                                  https://github.com/ioBroker/ioBroker.sql/blob/c4df5fa0e25610dfcb3e245f8140331dea35022f/main.js#L1858-L1861

                                  Das denke ich macht keinen Sinn weil die Daten ja aus der DB kommen.

                                  Nimm das mal bitte Testweise bei dir raus. tuts dann?

                                  F bahnuhr 2 Replies Last reply Reply Quote 0
                                  • F
                                    fastfoot @apollon77 last edited by

                                    @apollon77 sagte in SQL - Wert per Script speichern:

                                    ...weil die Daten ja aus der DB kommen.

                                    das macht auch anders keinen Sinn, die Prüfung müsste auf < 946681200 lauten, nicht < 946681200000. Auch 946681199999 sind immer noch ms

                                    1 Reply Last reply Reply Quote 0
                                    • bahnuhr
                                      bahnuhr Forum Testing Most Active @apollon77 last edited by

                                      @apollon77
                                      @fastfoot

                                      Habe etliches funktioniert.
                                      Folgendes Testscript:

                                      // Wert schreiben
                                          var theDate = new Date("30 june 1999");
                                          var ts_wert = theDate.getTime();
                                          log (ts_wert);
                                          if (ts_wert < 946681200000) { ts_wert = ts_wert / 1000 };
                                          log (ts_wert);
                                          sendTo('sql.0', 'storeState', {id: 'javascript.0.Sonstige.testsql', state: {val: -80, ts: ts_wert, ack:true}});
                                      

                                      Wenn ich durch 1000 teile (9 Stellen), werden in sql 3x0 automatisch angehängt (also dann wieder 12 Stellen).
                                      Wenn ich * 1000 nehme, dann werden nochmals 3x0 angehängt (also dann 15 Stellen).

                                      Wenn ich alle Werte abrufe sieht man dies:

                                      19:07:23.372	info	javascript.0 (31981) script.js.Scripte.test5: Rows: [{"id":179,"ts":930693600000,"val":-80,"ack":1,"_from":0,"q":0},{"id":179,"ts":1620666302479,"val":30,"ack":0,"_from":16,"q":0},{"id":179,"ts":930693600000000,"val":-80,"ack":1,"_from":0,"q":0}]
                                      

                                      Aber in flot erscheint am 30.06.1999 kein Wert:
                                      163a8c68-cda5-4e77-bf1c-e32e43aaebb8-image.png

                                      Fazit für mich:
                                      /1000 teilen und sql setzt 3x0 dazu. Bei Abfrage der Daten scheint der Wert richtig zu sein.
                                      Aber in flot kommt dies nicht an.

                                      mfg
                                      Dieter

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

                                        @bahnuhr hä?!! Hast du mal die con mir genannten Zeilen bei dir entfernt und Adapter sql neu gestartet??

                                        bahnuhr 1 Reply Last reply Reply Quote 0
                                        • bahnuhr
                                          bahnuhr Forum Testing Most Active @apollon77 last edited by

                                          @apollon77

                                          So, alle Daten in sql gelöscht.
                                          Beim lesen der Werte kommt nur ein leeres Array:
                                          69099711-8a6b-4b23-a1ed-6db82ae4ed7f-image.png

                                          SQL neu gestartet.

                                          Dann folgendes Script (ohne Prüfung < ....):

                                             var theDate = new Date("30 june 1999");
                                              var ts_wert = theDate.getTime();
                                              log (ts_wert);
                                              //if (ts_wert < 946681200000) { ts_wert = ts_wert / 1000 };
                                              //log (ts_wert);
                                              sendTo('sql.0', 'storeState', {id: 'javascript.0.Sonstige.testsql', state: {val: -80, ts: ts_wert, ack:true}});
                                          

                                          Beim Lesen der Werte kommt nun:

                                          21:38:04.119	info	javascript.0 (31981) script.js.Scripte.test5: Rows: [{"id":179,"ts":930693600000000,"val":-80,"ack":1,"_from":0,"q":0}]
                                          

                                          15 Stellen (kann das richtig sein ???

                                          Und in flot kommt auch nichts an !

                                          F apollon77 2 Replies Last reply Reply Quote 0
                                          • F
                                            fastfoot @bahnuhr last edited by

                                            @bahnuhr sagte in SQL - Wert per Script speichern:

                                            15 Stellen (kann das richtig sein ???
                                            Und in flot kommt auch nichts an !

                                            verantwortlich für die 15 Stellen sind die Zeilen 1543 - 1547. Aber auch nach Auskommentierung dieser Zeilen (die Zeit steht dann richtig in der DB) bekomme ich in Flot kein Ergebnis. Letztlich ist es das gleiche Ergebnis welches Du schon mit der Division durch 1000 im Skript erreicht hattest. Ich würde meinen dass Flot hier ein Problem hat

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            361
                                            Online

                                            31.8k
                                            Users

                                            80.1k
                                            Topics

                                            1.3m
                                            Posts

                                            5
                                            58
                                            2509
                                            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