Ankündigung

Einklappen
Keine Ankündigung bisher.

Datenreihen für Balken- und Liniendiagrammen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Datenreihen für Balken- und Liniendiagrammen

    Erweiterung des DB und websocket plugin, damit Datenreihen auf Smartvisu Seite immer korrekt interpretiert werden können

    wvhn
    Ich finde Deine Idee gut, den aktuellen Wert aus der DB extra zu kennzeichnen, damit dieser besonders auf Visu Seite interpretiert werden kann. Muss mir allerdings bei Gelegenheit erstmal das anschauen, wie DB plugin und websocket ineinandergreifen.
    Zuletzt geändert von aschwith; 01.11.2022, 19:43.

    #2
    Hallo wvhn,

    aktuell werden die Datenreihen folgendermaßen gepackt:

    Code:
    result = {
                'cmd': 'series', 'series': tuples, 'sid': sid,
                'params': {'update': True, 'item': item, 'func': func, 'start': logs['iend'], 'end': end,
                           'step': logs['step'], 'sid': sid},
                'update': self.shtime.now() + datetime.timedelta(seconds=int(logs['step'] / 1000))
            }​
    Vorschlag: Wir bereinigen die tuples des Attributes "series" auf eine Minimalanzahl (noch zu definieren) und führen die erweiterten Werte in einem neuen Attribut "series_extended" mit. Z.B. so:

    Code:
    result = {
                'cmd': 'series', 'series': tuples, 'series_extended': tuples_extended, 'sid': sid,
                'params': {'update': True, 'item': item, 'func': func, 'start': logs['iend'], 'end': end,
                           'step': logs['step'], 'sid': sid},
                'update': self.shtime.now() + datetime.timedelta(seconds=int(logs['step'] / 1000))
            }
    Wäre dieses Konstrukt für dich auf SmartVisu Seite so auswertbar? Für die klassischen Linienplots müsstest Du die tuples_extended dann zeitlich in die regulären tuples einsortieren. Für die Balkendiagramme würde aus auf eine Nutzung der regulären tuples hinauslaufen.

    Später müssten wir nochmal die Abwärtskompatibilität besprechen.

    VG
    Alex

    Kommentar


      #3
      Hi aschwith

      series_extended müsste sich schon so auswerten lassen. Ich frage mich aber, ob es nicht noch einfacher geht.

      Grundidee:
      an jedem Ende des Plots jeweils einen Wert anfügen, der um das definierte Abtastintervall außerhalb des abgefragten Wertebereichs liegt
      (Abtastintervall = (tmax - tmin) / count). Evtl. reicht es sogar, die jetzt schon vorhandenen Korrekturen (Zeilen 861-876 im Master v1.9.3) in dieses Zeitraster zu bringen.

      Ich denke, dass Highcharts die Darstellung dann schon richtig macht. Das versuche ich mal zu simulieren und melde mich wieder.

      Gruß
      Wolfram

      Kommentar


        #4
        Hi wvhn,

        verstehe deinen Ansatz. Hier ist allerdings das Problem, dass diese Werte bei relativ kleinem count weiter außerhalb des abgefragten Wertebereichs liegen und damit interporliert werden müssten. Das ergibt unplausible Werte. Am Beginn des Plots wird aktuell auch schon eine Näherung gemacht. Der Wert, der aktuell am Ende hinzugefügt wird, passt aber extaxt mit Zeitstempel und Wert. Das wäre ein großer Kompromiss in meinen Augen.

        Die Balkendiagramme müssen in der Lage sein, die zusätzlichen Werte außerhalbt des abgefrage Wertebereichs auszusortieren.

        Gruß
        Alex

        Kommentar


          #5
          Hi Alex,
          ich habe mir gestern nochmal angesehen, wie Highcharts mit den Punkten außerhalb des Darstellungsbereichs umgeht. Bei Linienplots verbindet es die Punkte (interpoliert also selbständig) und schneidet die Linie außerhalb des Darstellungsbereichs ab. Bei Säulenplots zeichnet es einfach nur die Säulen im Darstellungsbereich und lässt die anderen weg. Das ist eigentlich das gewünschte Verhalten.

          Dann habe ich mir angesehen, was beim Update des items passiert. smartVISU schiebt den dargestellten Plot auf der Zeitachse, indem die neuen Punkte hinten angefügt werden und alle Punkte außerhalb des Darstellungsbereichs am Anfang des Plots gelöscht werden - außer dem letzten(!). Somit beginnt die Datenreihe nach dem ersten Update immer mit einem Wert, der um ein Abtastintervall vor dem ersten dargestellten Punkt liegt. Und der letzte Punkt liegt zwangsläufig auf dem Ende des Darstellungsbereichs.

          Das bringt mich zu einem Kompromissvorschlag: Am Anfang der Datenreihe wird wie oben vorgeschlagen zusätzlich ein Wert aus der DB gelesen, der um ein Abtastintervall vor dem ersten dargestellten Punkt liegt. Für das Ende der Daten kann man den aktuellen item-Wert separat mitliefern ("Series_extended" oder einfach "actual"). Bei Linienplots kann ich den Wert dann hinten anfügen und dadurch werden keine unplausiblen Werte produziert.

          Wäre das aus Deiner Sicht ein Ansatz? Wir müssen dann übrigens auch nochmal genau ansehen, welche Werte beim item-Update geschickt werden und ob die plausibel sind.

          Gruß
          Wolfram

          Kommentar


            #6
            Hallo Wolfram, finde ich gut, machen wir so.

            Kommentar


              #7
              Hallo Wolfram,

              ich habe eine erste Modifikation des DB plugins in das lokale Repo geschoben:
              https://github.com/aschwith/plugins_db/tree/develop

              Die optionalen Tuples, die angehängt werden, habe ich von series in series_ext verschoben. Weiterhin habe ich die Anhänge unterdrückt, die extakt identische Einträge zu bestehenden Tuples hatten (Diff Time 0). Kannst Du damit testen?

              Mir ist bei genauerer Untersuchung aufgefallen, dass das Anhängen des aktuellen Werts (jetzt in der series_ext) auch für Linienplots nicht immer gewünscht ist. Ein gutes Beispiel sind wieder Items, die nur sehr selten aktualisiert werden, z.B. Zählerstände. Bisher wird hier einfach der aktuelle Wert (Zählerstand) am Ende mit des Abfragezeitraums nochmal eingefügt und suggiert damit wieder ein Informationsupdate Plot, die es in Wirklichkeit nicht gegeben hat. Das zeigt sich dann im Linienplot mit einem Plateau am Ende der Linie, welches nicht korrekt ist:

              Plateu.jpg

              Bezüglich item update: Was erwartet die Visu bei einem update von der Time Series? Was ist der Unterschied zu der erstmaligen Anfrage?

              Kommentar


                #8
                Hi Alex,

                ich hab mal ein Update auf v1.9.3 gemacht und Deine Dateien eingespielt (__init__.py und plugin.yaml).

                Dann habe ich im WebIF des Database-Plugins die tatsächlich vorhandenen Einträge angezeigt und dann einen Plot des items "env.system.load" in der VISU aufgerufen.

                Datensatz "series":
                • erster Wert liegt exakt auf dem Start des Plots, ist aber vom Plugin künstlich erzeugt
                • zweiter Wert ist der erste reale Wert aus der Datenbank im abgefragten Zeitraum
                • letzter Wert ist der letzte reale Wert in der Datenbank (mit duration None)
                Datensatz "series_ext":
                • erster Wert ist überwiegend (nicht immer) identisch mit dem letzen Wert des "series" Datensatzes
                • zweiter Wert ist ein vom Plugin ergänzter Wert genau am Ende des abgefragten Zeitraums
                Die Debug-Ausgabe enthält noch einen Fehler:
                Code:
                DEBUG 2a _series: item=env.system.load, overwriting first tuple[0] from (0.14,0.14) to (1667680043972, 0.14)
                hier muss in Zeile 872 tuples[0][0] für den Zeitstempel ausgegeben werden.

                Ich muss in den nächsten Tagen noch einmal testen, unter welchen Bedingungen die beiden Werte in "series_ext" mal nützlich sein können

                Gruß
                Wolfram

                Kommentar


                  #9
                  Hallo Wolfram,

                  der Fehler Zeile 872 wurde gestern im RePo schon gefixt.

                  Deinen Punkt "erster Wert ist überwiegend (nicht immer) identisch mit dem letzen Wert des "series" Datensatzes" hatte ich auch schon gesehen und unterdrückt. Ist auch schon im RePo.

                  Noch ein paar Klärungspunkte:

                  1) Erwartest Du die Tuples in serie_ext zeitlich sortiert? Das war bis jetzt nicht immer der Fall.
                  2) Mein Vorschlag ist, alle vom Plugin generierten extra Tuples in die series_ext zu schreiben:
                  Das ist zum Beispiel dieser hier: "erster Wert liegt exakt auf dem Start des Plots, ist aber vom Plugin künstlich erzeugt". Passt das, wenn dieser in die series_ext verschoben wird? Weiterhin erzeugt das Plugin auch extra Werte mitten in den Datenreihe, wenn aufgrund eines sehr geringen DB Abtastintervals ein Item Change nicht hoch genug aufgelöst wird. Auch diesen würde ich in die series_ext schreiben.
                  Abschließend gibt es den aktuellen Wert am Ende, auch diesen würde ich in die series_ext schreiben.
                  3) Damit wären wir bei dem Ergebnis, dass die series nur noch Tuples aus der DB Abfrage beinhaltet und die series_ext dann die ergänzenden Werte.
                  4) Zu Deiner Frage, wofür die series_ext dann nützlich sein könnte, siehst Du sofort, wenn Du nur die series plottest. Hier fehlend dann je nach Abfrage am Anfang und Ende des Plots Daten.
                  5) Zum Update Modus: Verstehst Du, warum aktuell die series unterschiedlich befüllt wird, je nachdem ob eine Serie von der Visu erstmalig angefragt wird (update==false) oder ein Update (update==true) getriggert wird? Aktuelle wird z.B. der aktuelle Wert nur bei der erstmaligen Anfrage mit angehängt. Wie soll sich das zukünftig verhalten?
                  6) Wie fliegen wir die Kompatibilität DB plugin/smartVisu an? Zwei series Funktionen vorbereiten, die je nach smartVisu Version getriggert werden?

                  VG
                  Alex

                  Kommentar


                    #10
                    Zitat von aschwith Beitrag anzeigen
                    der Fehler Zeile 872 wurde gestern im RePo schon gefixt.

                    Deinen Punkt "erster Wert ist überwiegend (nicht immer) identisch mit dem letzen Wert des "series" Datensatzes" hatte ich auch schon gesehen und unterdrückt. Ist auch schon im RePo.​

                    Die Änderungen finde ich nicht im oben verlinkten Repo.
                    Zitat von aschwith Beitrag anzeigen
                    1) Erwartest Du die Tuples in serie_ext zeitlich sortiert? Das war bis jetzt nicht immer der Fall.
                    Das muss nicht unbedingt sein, wenn es sich nicht von selbst ergibt.
                    Zitat von aschwith Beitrag anzeigen
                    2) Mein Vorschlag ist, alle vom Plugin generierten extra Tuples in die series_ext zu schreiben:
                    ​​​​​​​Das finde ich gut. In den series sollen nur echte Daten stehen, die aus der Datenbank stammen.

                    Zitat von aschwith Beitrag anzeigen

                    Das ist zum Beispiel dieser hier: "erster Wert liegt exakt auf dem Start des Plots, ist aber vom Plugin künstlich erzeugt". Passt das, wenn dieser in die series_ext verschoben wird?
                    ​​​​​​​Nein. Wenn ich das mit meinen mangelnden Python-Kenntnissen richtig interpretiere, wird dieser Punkt erzeugt, indem sein echter Zeitstempel, der vor Beginn des Abfragezeitraums liegt, einfach auf diesen Beginn verschoben wird. Das ist überflüssig, weil Highcharts die Darstellung von selbst richtig macht. Wie gesagt ist ein Wert aus der DB mit Zeitstempel vor Beginn des Abfragezeitraums in der serie wünschenswert.

                    Zitat von aschwith Beitrag anzeigen

                    Weiterhin erzeugt das Plugin auch extra Werte mitten in den Datenreihe, wenn aufgrund eines sehr geringen DB Abtastintervals ein Item Change nicht hoch genug aufgelöst wird. Auch diesen würde ich in die series_ext schreiben.
                    Als früherem Leiter eines Bereichs mit Messtechnikentwicklung sträuben sich mir die Nackenhaare. Wenn ich Änderungen besser aufgelöst haben will, dann erhöhe ich die Anzahl der Messpunkte im Zeitraum. Dieses "Feature" würde ich mir gerne nochmal ansehen. "series_ext" wäre jedenfalls der richtige Ort, wenn wir uns dafür entscheiden, dies beizubehalten.

                    Zitat von aschwith Beitrag anzeigen

                    Abschließend gibt es den aktuellen Wert am Ende, auch diesen würde ich in die series_ext schreiben.
                    ​​​​​​​Ja. Falls das Ende des Abfragezeitraums kleiner als "now" ist und dazwischen Werte in der DB existieren, wäre ein echter Wert aus der DB im passenden Zeitraster in "series" wünschenswert.

                    Zitat von aschwith Beitrag anzeigen
                    3) Damit wären wir bei dem Ergebnis, dass die series nur noch Tuples aus der DB Abfrage beinhaltet und die series_ext dann die ergänzenden Werte.
                    Ja genau.

                    Zitat von aschwith Beitrag anzeigen
                    4) Zu Deiner Frage, wofür die series_ext dann nützlich sein könnte, siehst Du sofort, wenn Du nur die series plottest. Hier fehlend dann je nach Abfrage am Anfang und Ende des Plots Daten.
                    Bei meinen Tests enthielt series_ext keine Werte, die nicht schon in series enthalten waren. Das kann an den Testdaten liegen.

                    Zitat von aschwith Beitrag anzeigen
                    5) Zum Update Modus: Verstehst Du, warum aktuell die series unterschiedlich befüllt wird, je nachdem ob eine Serie von der Visu erstmalig angefragt wird (update==false) oder ein Update (update==true) getriggert wird? Aktuelle wird z.B. der aktuelle Wert nur bei der erstmaligen Anfrage mit angehängt. Wie soll sich das zukünftig verhalten?
                    Ich kenne den Mechanismus im db-plugin nicht und welche Werte noch beeinflusst werden. Beim Update braucht man IMHO den aktuellen Wert nicht zusätzlich, da der Wert im Moment des Updates ja der aktuelle ist.

                    Zitat von aschwith Beitrag anzeigen
                    6) Wie fliegen wir die Kompatibilität DB plugin/smartVisu an? Zwei series Funktionen vorbereiten, die je nach smartVisu Version getriggert werden?
                    Die Unterscheidung kann in smartVISU erfolgen. Wenn series_ext vorhanden ist, werden die Daten nach neuer Methode ausgewertet. Trifft eine neue shNG-Version auf eine alte SV-Version, kommt es IMHO nur zu minimalen Veränderungen in der Anzeige, die nach dem ersten item-Update eh nicht mehr vorhanden sind. Dies würde ich einfach so tolerieren.

                    Gruß
                    Wolfram
                    Zuletzt geändert von wvhn; 09.11.2022, 22:54.

                    Kommentar


                      #11
                      Die Änderungen sind ins Hauptverzeichnis des develop branch gerutscht. Deshalb habe ich sie nicht gefunden. Ich teste damit mal weiter.

                      Gruß
                      Wolfram

                      Kommentar


                        #12
                        Hallo @wvhn,

                        ich schiebe in das git unter https://github.com/aschwith/plugins_...velop/database gleich die nächste Version. Dort habe ich die Anpassungen wie oben vorgenommen:

                        1) Keine zusätzliche Sortierung der series_ext. Die series sollte aus der DB schon sortiert kommen.
                        2) Kein Clipping des ersten Werts auf den Beginn des Anzeigezeitraums mehr. Der Wert wird immer in der normalen series belassen
                        3) Das pseudo-Erhöhung der Auflösung durch ein extra Schreiben der letzten Wertänderung (sofern im Abfrageinterval) habe ich erstmal auskommentiert.
                        4) Der aktuelle Wert wird jetzt in die series_ext geschrieben, falls die letzte Änderung innerhalb des Abfrageintervalls statt gefunden hat. Der Zeitstempel dieser Änderung wird nicht mehr künstlich auf das Ende des Abfrageintervalls gesetzt sondern mit dem echten Zeitstempel der letzten Änderung.
                        5) Solange am Ende des Abfragezeitraums noch kein Wert liegt, wird der letzte Wert innerhalb des Abfragezeitraums nochmal künstlich gedoppelt und mit Zeitstempel vom Ende des Abfragezeitraums in der series_ext abgelegt. Damit werden Lücken am Ende der Plots vermieden. Eine erneute Suche von DB Werten rechts außerhalb des Abfragezeitraums ist schwierig und aktuell nicht implementiert.

                        Schauen wir mal, wie weit wir damit kommen.
                        Viele Grüße
                        Alex
                        Zuletzt geändert von aschwith; 10.11.2022, 22:30. Grund: Inhalt korrigiert

                        Kommentar


                          #13
                          Hallo Alex,

                          ich teste gerne mit dem item env.system.load, weil dafür alle 5 Minuten ein Wert in die Datenbank geschrieben wird. Also habe ich einen Plot mit 100 Werten und 10 Tagen Dauer erstellt. Das gibt ein Abtastintervall von etwas mehr als 2,4 Stunden. Ich würde jetzt erwarten, dass die Datenbankabfrage 100 Werte im Abstand von je 2,4 Stunden liefert.

                          Stattdessen passiert folgendes:
                          • der erste Wert in "series" ist genau auf die aktuelle Uhrzeit vor 10 Tagen geclippt. Es gibt keinen echten Wert dazu in der Datenbank
                          • die weiteren Werte in "series" sind immer gleich, egal wann ich die Abfrage starte. (1.11. 01:00:47, 1.11. 03:26:13, 1.11. 05:51:39 .... 10.11. 22:36:27). Die Werte existieren in der Datenbank, aber die Ausgabe orientiert sich nicht am abgefragten Intervall. Sonst müssten bei einer Abfrage 5 Minuten später andere Werte kommen.
                          • den letzten existierenden Wert in der Datenbank würde ich noch in "series" erwarten, da die Abfrage bis "now" geht. Er wird aber in "series_ext" geschrieben.
                          • Zusätzlich wird ein Wert am Ende in "series_ext" erzeugt, wie Du in 5) beschrieben hast.
                          Gleiches Verhalten auch bei einem Abfragezeitraum von 1 Tag.

                          Modus der Darstellung ist übrigens "avg". Das sollte aber auf die Zeitstempel keinen Einfluss haben. Um das zu verifizieren, wollte ich gerade nochmal mit dem Modus "raw" testen. Der ignoriert aber die abgefragte Punktezahl und wirft einfach alle Punkte des abgefragten Zeitraums aus. Bug oder Feature?

                          Ich glaube ich teste morgen nochmal zum Vergleich mit dem aktuellen Plugin aus dem Master.

                          Gruß
                          Wolfram

                          Kommentar


                            #14
                            Also: das Plugin im aktuellen Master hat das gleiche Problem. Die von der Datenbank gesendeten Werte müssten sich ungefähr alle 5 Minuten mit den Abfragezeitpunkten verschieben. Das tun sie aber nicht.

                            Ich denke, dass muss mit der Gruppierung zusammen hängen. Default ist "GROUP BY ROUND(time / :step)". Bin aber noch nicht dahinter gekommen, wie das genau berechnet wird und warum die Gruppen sich nicht verändern, wenn neue Werte in die Datenbank geschrieben werden.

                            Dass "raw" alle Daten durchlässt, ist offenbar bewusst so eingestellt (raw.group: ' '). Sinnvoll wäre IMHO ein weiterer Modus, der die angegebene Anzahl Punkte berücksichtigt.

                            Gruß
                            Wolfram

                            Kommentar


                              #15
                              Über Nacht habe ich das Problem des Gruppierens in Zeitraster verarbeitet und bin zu dem Schluss gekommen, dass wir daran nichts ändern sollten. Egal wie man das angeht: es wird immer so sein, dass der Plot nur zum Zeitpunkt des Updates ganz genau passt und im Ablauf des Abtastintervalls immer mehr veraltet. Wer seine Plots genauer haben will, kann die Anzahl der Punkte erhöhen, also das Abtastintervall verringern. Auch den Modus "raw" sollten wir so belassen und in der Doku darauf hinweisen, dass die Angabe für "count" hier wirkungslos ist (falls das da nicht schon steht).

                              Sorry also für den Exkurs. Lass uns mal auf die Aufgabe konzentrieren, die veränderten bzw. zusätzlich generierten Werte zu bereinigen.

                              Gruß
                              Wolfram

                              Kommentar

                              Lädt...
                              X