Ankündigung

Einklappen
Keine Ankündigung bisher.

Synchronisation von Labeln / Cursorn

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

    Synchronisation von Labeln / Cursorn

    Servus,

    Mein Ziel ist etwas wie der fünfte Plot auf dieser Docu Seite: https://docu.smartvisu.de/3.3/index....et_plot.period

    Ich klicke rein, und es werden die Datenpunkte im Label beider Kurven angezeigt. Sehr schön.

    Wenn ich das Beispiel bei mir einbaue in smarthomeng, rastet der Cursor meist auf einer Kurve ein, ich bekomme nur einen Wert im Label angezeigt.

    Es könnte daran liegen, dass die Zeitpunkte nicht vollständig identisch sind, eine numerische Ungenauigkeit werde ich trotz crontab nicht los.

    Ist das mit SmartVISU erreichbar?

    Viele Grüße
    curator17
    Zuletzt geändert von wvhn; 28.11.2024, 18:59.

    #2
    Das Springen des Tooltips ist tatsächlich etwas nervig. Highcharts bringt die Tooltip-Optionen „shared: false“ und „split: true“ mit, die Du in den Chartoptions von Plot.period mal ausprobieren kannst (https://api.highcharts.com/highcharts/tooltip).

    Eigentlich bräuchte man für den X-Wert im Tooltip ein Raster mit gewissen Toleranzbreiten. Ich habe aber bisher nicht gefunden, ob und wie dies bei den Zeitreihen möglich ist.

    Gruß
    Wolfram

    Kommentar


      #3
      Hallo Wolfram,

      Danke für deinen Tipp Mein Wunsch ist ja, dass der Tooltip geshared wird. shared:true hilft nicht.

      Auf Itemebene komme ich auch nicht ans Ziel. Hier müsste man die Zeitauflösung runter drehen.

      Auf der Demo Seite oben geht es ja, was ist denn dabei anders?

      Kommentar


        #4
        Auf der Demoseite wird der Offline-Treiber verwendet. Der generiert zufällige Datenreihen, die aber auf der Zeitachse synchronisiert sind. Wenn ich die Synchronisierung abstelle, zeigt das Beispiel auch nicht mehr das gewünschte Ergebnis.

        In Highcharts werden bei Zeitreihen nur diejenigen Werte der Serien gleichzeitig im Tooltip angezeigt, die identische Zeitstempel besitzen. Eine Erweiterung von Highcharts wurde zwar schon mal diskutiert, aber bisher nicht umgesetzt. Vermutlich würde das zu stark auf die Performance gehen.

        Tatsächlich wäre es am besten, im database-Plugin eine Möglichkeit einzurichten, die zeitliche Auflösung herunterzusetzen. Ich mache mir mal weiter Gedanken zu Alternativen.

        Gruß
        Wolfram

        Kommentar


          #5
          Ich hatte auch überlegt, statt drei Items mit type num ein Item mit type list zu nehmen, und die drei Werte (y1, y2, y3) so auf den gleichen Zeitstempel zu kriegen. Das bekomme ich in dem Format zwar in die Datenbank, aber nicht in den Plot.

          Kommentar


            #6
            Das ist eine interessante Idee. Da es hierfür ziemlich viele Anwendungsfälle gibt, würde ich das gerne in plot.period umsetzen.

            Leider habe ich gerade keinen Zugriff auf mein Testsystem. Kannst Du mal testen, was shNG auf den Websocket schickt, wenn Du so eine Serie von einem list-item mit plot.period anfragst? Am besten öffnest Du die Entwicklertools des Browsers und kopierst die Daten, die hinter „[io.smarthomeng] receiving data: " in der Konsole gelistet werden.

            Gruß
            Wolfram

            Kommentar


              #7
              Hallo,

              soweit komme ich nicht, das Plugin lässt das nicht durch:
              Code:
              2024-04-01  18:47:34 ERROR    modules.websocket.sv Problem fetching series for TheItem: float() argument must be a string or a real number, not 'list' - Wrong sqlite/database plugin?

              Kommentar


                #8
                Hallo curator17,

                kannst Du dazu deine Item-Defintion posten ? Ich nutze das in einigen Fällen (List-Item für Plots) und funktioniert ohne Probleme.

                Ich bin schon seit einiger Zeit mit der Überlegung beschäftigt wie man ein "plot.analyze" auf Basis von "plot.period" gestalten könnte. Deinen Ansatz die Daten in ein List-Item zu schreiben finde ich gut und könnte ein guter Schritt zu einer eventuellen Lösung sein.
                Oft möchte man Daten aus verschiedenen Quellen in einem Plot darstellen, es muss aber nicht immer alles und sofort dargestellt werden. (Performance zum Backend reduzieren) - Aktuell habe ich auf einer Seite 10 Plots mit RAW-Daten - die brauche ich nicht immer möchte bei Bedarf die Daten aber ansehen können.

                Zur Konkretisierung meiner Vorstellung :
                - Ich stelle mir hier vor, dass man X Items als Auswahl hat, die Darstellung der Items kann in der VISU aktiviert/deaktiviert werden.
                - Die Zuordnung zu rechter/linker Achse kann angegeben werden ( Direkt in der Visu).
                - Die Darstellung als Line/Spline/Balken/Stairs kann über die Visu ausgewählt werden.
                - Der Zeitraum von/bis des Plots kann über einen Datepicker gewählt werden

                Das hat zwar nicht direkt etwas mit Deiner Fragestellung zu tun, soll eher zur Weiterentwicklung beitragen und eventuelle Mitlesern zu Anregungen inspirieren.

                Zu Deiner Fragestellung:
                das sollte auf jeden Fall funktionieren, poste bitte Deine Item-Definition und am besten noch den Item-Inhalt.

                Viele Grüße
                Andre


                Kommentar


                  #9
                  Hier die Infos:
                  Code:
                  TestItem:
                            name: TestItem
                            visu_acl: rw
                            sv_widget: "{{ plot.period('test', 'item', 'raw')}}"
                            type: list
                            database: init
                            crontab: 0 * * * = 1
                            eval: "[(sh.Item1()), (sh.Item2()), (sh.Item3())]"
                  Das Item ist sinnvoll befüllt:
                  I1.png

                  Der CSV Export aus dem Database-Plugin WebIf sieht ebenfalls gut aus.

                  Eine Lösung, frei Items anzuzeigen wäre deutlich attaktiver, würde bei mir zumindest Hilfsitems sparen

                  Kommentar


                    #10
                    Hi curator17,

                    der Screenshot des Items ist nicht wirklich hilfreich, besser als Code einfügen.

                    mein Item für ein Plot vom Typ "List" sieht so aus :

                    Code:
                    [[1711947910000, 0], [1711951200000, 624], [1711954800000, 890], [1711958400000, 1015], [1711962000000, 1090], [1711965600000, 1115], [1711969200000, 1061], [1711972800000, 985], [1711976400000, 845], [1711980000000, 667], [1711983600000, 431], [1711987200000, 180], [1711990800000, 68], [1711994352000, 0], [1712034186000, 0], [1712037600000, 840], [1712041200000, 1193], [1712044800000, 1317], [1712048400000, 1340], [1712052000000, 1305], [1712055600000, 1150], [1712059200000, 992], [1712062800000, 797], [1712066400000, 589], [1712070000000, 377], [1712073600000, 165], [1712077200000, 33], [1712080800000, 15], [1712080839000, 0]]
                    Es ist immer der Timestamp ( x 1000) und dann der Wert, das ganze in einem Array innerhalb des List-Arrays. bei Dir ist der Timestamp soweit ich das im Screenshot sehe immer NULL

                    Der Aufruf in der Visu mit

                    Zitat von curator17 Beitrag anzeigen
                    sv_widget: "{{ plot.period('test', 'item', 'raw')}}"
                    ergibt so aus derHüfte geschossen kein Ergebniss, das "ITEM" - "item" ist in dem Auszug aus Deiner Item-Definintion nicht vorhanden, wenn dann müsste es "TestItem" lauten.

                    Evenutelll gibt es ein "Item" aus einer anderen yaml-Definition welche dann shNG zu Deinem zuvor geposteten Log-Eintrag veranlässt.

                    Viele Grüße
                    Andre

                    Kommentar


                      #11
                      Hi,

                      hier die TextVersion:
                      Code:
                      [0.0, 0.31850818999987496, 0.31850818999987496]
                      Der Unterschied zu deinen Werten ist, dass du also zu jedem y auch noch den Zeitstempel hat.
                      Also statt
                      Code:
                      [y1, y2, y3]
                      Code:
                      [ [t1, y1], [t1, y2], [t1, y3]]
                      Da das ja aber wieder in eine Datenbank geschrieben wird, kommt ja nochmal ein "t" dazu, oder habe ich jetzt einen Denkfehler?

                      Wie befüllst du dein Item denn? Ich mache das über auslesen von "normalen" items zu bestimmen Zeiten.

                      Zum item: Nach meinem Verständis bezieht sich "item" auf das Item selbst sowie "item.X" auf ein Child-Item 'X'(relative Addressierung). Ich habe es aber mal absolut gemacht, das ändert nichts.​

                      Kommentar


                        #12
                        Hallo curator17,

                        noch ein kleiner Hinweis, im Widget Plod.period muss als Parameter für die Data-Source ein Item angegeben werden.
                        Der Widget-Assitant kann dir dabei helfen.

                        Widget-Assistant.png

                        Viele Grüße
                        Andre

                        Kommentar


                          #13
                          wvhn Ich habe deinen Ansatz gerade mal mit der Brechstange versucht, das Database Plugin anzupassen, und es funktioniert wunderbar!

                          Idee (von Dir): Den Zeitstempel nicht zu genau in die Datenbank zu speichern.

                          Man ersetze in https://github.com/smarthomeNG/plugi...se/__init__.py, Z.1834
                          Code:
                                  val = int(time.mktime(dt.timetuple())) * 1000 + int(dt.microsecond / 1000)
                          durch
                          Code:
                                  val = int(time.mktime(dt.timetuple())) * 1000
                          Damit sind die "Ticks" auf sekundengenau und der Tooltip wird zusammen angezeigt.

                          Das müsste man jetzt als Parameter des Plugins rausführen. Als Parameter pro Item schwierig.

                          Könnte ich übernehmen, wenn mir jemand einen Vorschlag macht, wie der Parameter heissen soll :-)

                          Kommentar


                            #14
                            Zu deinem letzten Post,

                            es muss ein Zeitstempel vorhanden sein, sonst kan Highcharts mit den Daten nichts anfangen.
                            Du brauchst keinen DB-Eintrag, füll das Item einfach mit dem aktuellen Timestamp und Werten für das Item - und das im Array.
                            Für mehrere items benötigst Du mehrere List-items, je Item eines, das wird dann als Kurve (oder wie auch immer im Plot angezeigt)
                            Soll bedeuten, der Inhalt der items muss wie folgt sein :

                            Code:
                            item1 : [ [t1, y1], [t2, y2], [t3, y3]]
                            item2 : [ [t1, y1], [t2, y2], [t3, y3]]
                            item3 : [ [t1, y1], [t2, y2], [t3, y3]]
                            Idealerweise definierst Du den TimeStamp am Anfang (=bestimmte Zeit, t1 = immer gleich,t2,t3 ebenfalls vorher bestimmt), dann ist er für alle Einträge gleich und führt zum gewünschten Ergebniss mit Plot.

                            Ungefähr so :
                            Code:
                            for key, value in tmpDict.items():
                              time = datetime.datetime.strptime(key,"%Y-%m-%d %H:%M:%S")
                              timestamp = datetime.datetime.timestamp(time)
                              temp = [int(timestamp*1000),value]
                              dictlist.append(temp)
                              sh.YOUR_ITME(dictlist)

                            Viele Grüße
                            Andre

                            Kommentar


                              #15
                              Ich muss das - glaube ich - hier mal etwas sortieren:

                              es gibt die Möglichkeit, Plots aus list-items anstatt aus der Datenbank zu befüllen. Das ist der Vorschlag von AndreK. Das list-item muss dann aus Paaren mit jeweils Zeitstempel und item-Wert bestehen. Mit den in v1.10 hinzugekommenen Methoden zur Bearbeitung von list-items kann man solche items recht einfach mit neuen Werten ergänzen und die Zeitstempel für mehrere Items synchron halten.
                              Nachteil: diese Werte landen nicht in der Datenbank und müssen gecached werden, um nicht verloren zu gehen.
                              Alternative: die Originalwerte in die Datenbank schreiben und das list-item nach dem Systemstart aus der DB neu erzeugen.

                              curator17 hat dagegen ein list-item vorgeschlagen, in dem sich 3 verschiedene items einen Zeitstempel teilen und das so in die Datenbank geschrieben wird. Das würde für alle items sinnvoll sein, die man gemeinsam auf einer Zeitachse darstellen will, z.B. Verbrauchswerte oder Photovoltaik-Erträge. Das database-Plugin muss dazu in der Lage sein, dies als Serie auszugeben, jeweils als Gruppe aus einem Zeitstempel und 3 item-Werten. Das scheint aktuell nicht zu klappen. Schade, denn das wäre dann ein quick win ohne Eingriff ins Plugin gewesen. Der smarthomeNG-Treiber von smartVISU muss dann zusätzlich die list-items in 3 Serien aufteilen, die aus Paaren mit Zeitstempel und item-Wert bestehen. Das kann er zur Zeit definitiv nicht.

                              Die zuletzt von curator17 getestete Methode, die Zeitstempel beim Schreiben in die Datenbank auf Sekundengenauigkeit zu begrenzen, löst das Problem ebenfalls - jedenfalls solange die 3 Items nicht gerade um einen Sekundenwechsel herum in die DB geschrieben werden. Ich habe bei solchen Änderungen aber immer ziemlich Respekt davor, dass diese zu „breaking changes“ für andere Anwender werden könnten.

                              Daher würde ich vorschlagen, die Millisekunden im Zeitstempel beim Auslesen der Serien aus der DB abzuschneiden bzw. auf „000“ zu setzen. Das betrifft dann nur die Ausgabe für die Visu und beeinflusst keine anderen Anwendungen.

                              aschwith ist der Maintainer des database-Plugins und mit ihm müssen diese Änderungen abgesprochen werden.

                              Gruß
                              Wolfram
                              Zuletzt geändert von wvhn; 02.04.2024, 12:25.

                              Kommentar

                              Lädt...
                              X