Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Tester
    4. Test Adapter History 2.0.0

    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

    Test Adapter History 2.0.0

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

      @marty56 J natürlich. Wenn du wirklich so selten ändernde Daten hast mit den Einstellungen, dann ist deine Aussage korrekt

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

        @apollon77
        Ich schaffe es übrigens nicht, auch im Expertenmodus, beim History Adapter einen Wert zu ändern.
        Es kommt zwar eine Abfrage, in der der Wert geändert werden kann, aber die Werte werden nicht übernommen.
        Wäre schön, wenn man das fixen könnte.

        Außerdem schaffe ich es nicht, per Script in die History DB zu schreiben.
        Das Script läuft durch, macht aber nichts.

        const timestamp = new Date("2021-01-01 00:01:00.000").getTime();
        var value = 15
        sendTo('history.0', 'store', [
            {id: 'javascript.0.strom.Erz_Energie_Jahr', ts: timestamp,val: value}
        ], result => console.log('stored'));
        

        Wie gesagt, die "Unkorrigierbarkeit" von Daten in der History DB ist für mich ein Issue und es wäre schön, wenn man da etwas machen könnte.

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

          @marty56 Zum Editieren. Bitte mal Debug Log aktivieren und Debug log zeigen von so einer editieraktion ... bei mir tat es die Tage

          Zum storeState ... ... ... liess nochmal genau die Readme https://github.com/ioBroker/ioBroker.history/tree/master/docs/en#storestate ... store -> storeState

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

            @apollon77 Debug gibt keine weitere Ausgaben.

            Die Syntax vermute ich nicht korrekt. Leider gibt die Dokumentation nichts dazu her.

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

              @appollon

              Vielleicht fragst Du Dich, warum will der den ganzen Quatsch.

              Mein Use Case.
              Ich habe zwei Balkendiagram meiner Solaranlage, die einmal Jahres bzw Monatsverbräuche darstellen sollen.
              Jeweils am Monatsende schreibe ich einen Wert in das Monatsdiagramm bzw. Ende des Jahres in das Jahresdiagramm.

              Was schön wäre, wenn der Wert für den noch nicht abgeschlossenen Zeitraum auch angezeigt würde.

              Was ich also machen will, als Beispiel das Jahresdiagramm, jeden Tag für den 31.12. des Jahres einen Wert schreiben. Am nächsten Tag möchte ich den alten Wert für den 31.12. löschen und danach wieder mit dem (erhöhten) Wert neu schreiben.
              In der DB ist also immer nur ein Wert pro Jahr und der soll upgedatet werden.

              Ich hoffe, dass ist verständlich.

              PS: was ich auch bemerkt habe, ist, dass die Beispiele in der Dokumentation auch syntaktisch nicht korrekt sind. z.B.

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

              fehlen wohl die Klammern, also

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

              Ich habe mit verschiedenen Versionen der "store" oder "storeState" Commandos herumgespielt, die funktionieren aber alle nicht.

              Was ich letztlich benötigen würde, ist ein Script Beispiel für die history.db

              1. einen State zu löschen
              2. einen State zu schreiben
              M apollon77 2 Replies Last reply Reply Quote 0
              • M
                Marty56 @Marty56 last edited by

                @apollon77

                Ich habe mir die gewünschte Funktion jetzt zusammengebastelt. Sie funktioniert, ich bin aber nicht sicher, ob ich etwas übersehen habe oder ich mir irgendwelche unerwünschten Probleme damit einfange.
                Expertenfeedback wäre sehr wünschenswert.

                function write_history_db(id,date,value) {
                    const fs = require('fs/promises');
                    const path = require('path');
                    var filename = "history." + id + ".json"
                    var timestamp = new Date(date).getTime();
                    var folder = "/opt/iobroker/history/" + date.substring(0,10).replace("-","").replace("-","") + "/"
                    var data = [
                                    {
                                        "val": value,
                                        "ts": timestamp,
                                        "q": 0,
                                        "c": "script.js.common.Energie",
                                        "from": "system.adapter.javascript.0",
                                        "user": "system.user.admin"
                                    }
                                    ]
                    var filecontent = JSON.stringify(data)
                
                    async function isExists(path) {
                    try {
                        await fs.access(path);
                        return true;
                    } catch {
                        return false;
                    }
                    };
                
                    async function writeFile(filePath, data) {
                    try {
                        const dirname = path.dirname(filePath);
                        const exist = await isExists(dirname);
                        if (!exist) {
                        await fs.mkdir(dirname, {recursive: true});
                        }
                        
                        await fs.writeFile(filePath, data, 'utf8');
                    } catch (err) {
                        throw new Error(err);
                    }
                    }
                
                    (async ()  => {
                        await writeFile(folder+filename, filecontent);
                    })();
                }
                write_history_db("javascript.0.strom.Erz_Energie_Jahr", "2022-12-31 12:00:00.000",3100)
                
                1 Reply Last reply Reply Quote 0
                • apollon77
                  apollon77 last edited by

                  Also wenn sollten wir die Funktionen fixen und nicht Du anfangen am Adapter vorbei die Files zu editieren

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

                    @Marty56 Nochmal Frage: geht es denn per admin zu ändern?

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

                      So GitHub Verison 2.0.0 hat ein neues Feature bekommen (@Diginix) ... Die Retention time kann nun auch Custom in tagen definiert werden.

                      Bitte checken

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

                        @marty56 Ja klammern fehlen im beispiel. Ist schon gefixt.

                        storeState tut ... das machen auch die tests. zeig doch mal deine beispiele von uüdate oder delete (warum eigentloch nicht update?)

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

                          @apollon77

                          Das folgende Beispiel funktioniert nicht.

                              var timestamp = new Date("2021-05-31 23:55:00.000").getTime();
                              sendTo('history.0', 'storeState', [
                                  {id: 'javascript.0.Test', state: {ts: timestamp, val: 15, ack: true, q: 0}}, 
                          
                              ], result => console.log('deleted'));
                          
                              var timestamp = new Date("2021-05-31 23:55:00.000").getTime();
                              sendTo('history.0', 'update', [
                                  {id: 'javascript.0.Test', state: {ts: timestamp, val: 15, ack: true, q: 0}}, 
                          
                              ], result => console.log('deleted'));
                          

                          Mit Version 2.0 ausprobiert. Alle Varianten oben funktionieren nicht.
                          Hast Du es wirklich mit dem History Adapter ausprobiert? könnte mir vorstellen, dass mit SQL eher funktioniert.

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

                            @marty56 Also zu aller erst mal kann dein Code ggf gar nicht tun ... du speicherst den State und ZEITGLEICH sendest du das update.

                            Beides wird aber asynchron verarbeitet.

                            Weiterhin ... wie willst Du sehen ob das was tut? Das update setzt den gleichen Wert wie das "store" Uuund wenn Du das Skript nochmals ausführst hast Du danach zwei oder mehr Datenpunkte mit dem genannten Zeitstempel (wegen dem StoreState). Wenn Du dann ein Update sendest dann ändert er irgendeinen von denen.

                            Die Adaptertests nutzen mindestens mal storeState aktuell in allen 3 Adaptern, also das Tut in jedem Fall!

                            Zu Update und delete bitte checke ob es per Admin geht. Wenn ja dann geht es erstmal generell - aber auch hier bitte mit einem State der nicht mehrfach existiert zum gleichen Zeitstempel

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

                              @apollon77
                              Ich habe natürlich die beiden Code Stücke nicht gleichzeitig ausgeführt! Das ist mir schon klar, dass das nicht möglich ist.

                              Es waren nur Beispiele, die ich ausprobiert habe, mangels Dokumentation der Syntax.
                              Also einmal

                                  var timestamp = new Date("2021-05-31 23:55:00.000").getTime();
                                  sendTo('history.0', 'storeState', [
                                      {id: 'javascript.0.Test', state: {ts: timestamp, val: 15, ack: true, q: 0}}, 
                               
                                  ], result => console.log('deleted'));
                               
                              

                              ausgeführt und dann nachgeschaut über die Admin Oberfläche, ob der Wert mit dem richtigen Wert und Timestamp gespeichert wird. Das ist nicht der Fall. Und dann habe noch die andere Varianten getestet und dann noch weitere. Funktionieren tut die alle nicht.

                              Nochmal die Frage. Die meinst, dass der Code oben (nicht die zwei Teile hintereinander) den Wert "15" in den Datenpunkt 'javascript.0.Test' mit dem TimeStamp 31.5.2021 um 23:55 schreiben kann?

                              Ich gebe auf und bleibe jetzt erst mal bei meiner direkten Bearbeitung der History Files. Das möchte ich eigentlich nicht, weil ich dadurch keine Möglichkeit habe, meinen Code leicht auf SQL umzustellen.

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

                                @marty56
                                so jetzt habe ich eine Millionen verschiedene Syntax Versionen ausprobiert.

                                    var timestamp = new Date("2022-05-06 23:55:00.000").getTime();
                                    sendTo('history.0', 'storeState', 
                                        {
                                            'id': 'javascript.0.Test', 
                                            'state': {'ts': timestamp, 'val': 1}
                                        } 
                                    , result => console.log('deleted'));
                                

                                funktioniert.

                                Schade, ein kleines bisschen Dokumentation hätte mir viel Zeit erspar!

                                M apollon77 2 Replies Last reply Reply Quote 0
                                • M
                                  Marty56 @Marty56 last edited by

                                  Funktioniert leider nicht zuverlässig.
                                  Ich gebe auf. Das ist Zeitverschwendung.

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

                                    @marty56 sagte in Test Adapter History 2.0.0:

                                    Funktioniert leider nicht zuverlässig.

                                    Das heisst?

                                    Wie prüfst Du es denn? Indem Du schaust ob es im File steht? Kann es sein das es nicht gespeichert wurde weil du mehrere Datensätze im RAM hälst? Dann wird es nach spätestens 10 Mins gespeichert. Oder was ist dein Problem?

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

                                      @marty56 Also storeState kann drei varianten:

                                      • Wenn das Message Objekt (der parameter nach storeState) ein Array ist dann kann man mehrere "id + jeweils ein State Objekt" speichern
                                      • Wenn message.state ein Array ist dann kann man mehrere States für eine ID speichern
                                      • Sanst ist der Call für eine ID mit einem State in einem Objekt.

                                      Wenn du mich sosoooo lieb fragst kann ich das gern mal noch in die Doku aufnehmen

                                      Ergo: Dein Code von oben muss genauso tun wie der jetzt hier.

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

                                        @apollon77 Danke, eine bessere Doku wäre wirklich super.

                                        Außerdem der Code oben funktioniert so nicht, wenn derselbe Datenpunkt zur selben Zeit schon vorhanden ist. Dann muss man den erst vorher löschen.

                                        Ich habe jetzt hingefummelt und es scheint zu funktionieren. Mal sehn, ob's hält.

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

                                          @apollon77

                                          Kleiner Bug bei V2.0

                                          Wenn man sich die Verlaufsdaten anschauen möchte, kann man nicht scrollen.
                                          Getestet mit Safari unter MacOS Monterey

                                          Bildschirmfoto 2022-05-11 um 04.41.26.png

                                          Soll ich einen Github Issue anlegen?

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

                                            @marty56 Ja aber im Admin Repo ... und am besten mit Chrome versuchen ... 🙂

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            763
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            12
                                            100
                                            5349
                                            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