Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Visualisierung
    4. Zugriff auf Instanz-bezogene Daten (Binding oder JavaScript)

    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

    Zugriff auf Instanz-bezogene Daten (Binding oder JavaScript)

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

      Hallo,

      ich suche schon eine Weile nach einer Möglichkeit, innerhalb der Visualisierung(per Binding aus einem Widget oder per JavaScript) auf Daten zuzugreifen, die aber nur für die spezielle Instanz gültig sein sollen.

      Hintergrund:
      Ich habe meine Visualisierung auf mehreren Devices im Haus laufen, da mehrere Personen diese nutzen. Nun möchte ich z.B. für die manuelle Steuerung der Thermostate EINE View verwenden, die ich ja nach Aufruf aus der Instanz InstA und dem View ViewA (für Thermostat ThermA) und parallel per Aufruf aus Instanz InstB aus View ViewB (für Thermostat ThermB) auf unterschiedliche Datenpunkte zugreifen lassen möchte, damit die beiden Bedienungen A und B parallel möglich sind, ohne sich gegenseitig zu behindern.

      Status quo:
      Ich habe fü den Aufruf der Views (ViewA bzw. ViewB) einen gemeinsamen Datenpunkt, in den ich das zu steuernde Device (Pfad) eintrage und auf dessen Änderung ich per JavaScript reagiere. In diesem JavaScript sichere ich in lokalen Variablen zuerst das zu steuernde Device, die rufende Instanz und die rufende View, danach generiere ich mit dem Namen der rufenden Instanz im Pfad neue Datenpunkte für Device, Instanz und View und speichere die Daten dort ab.

      Das klappt soweit gut, da ich davon ausgehe, dass zwei Personen nicht innerhalb genau der gleichen Millisekunde die Steuerung auf verschiedenen Devices aufrufe.

      Die Instanznummer ist ja beim Aufruf der ViewA immer gleich, somit müsste eine Auswertung eigentlich gehen, wenn ich die Beschreibung der Bindings korrekt verstanden habe.
      Trotzdem habe ich es nicht geschafft, ist auf diesen Datenpunkt ein Binding zu erstellen.

      Meine Fragen:

      1. Wie kann ich ein Binding auf einen generierten Datenpunkt "aktuellerWert" anlegen, der als Teil des Pfades die aktuelle Instanz hat,
        z.B: javascript.0.vis.heizung.<instanznummer>.aktuellerWert ?

      2. Alternativ, wie kann ich Daten speziell für die laufende View (für die aktuelle Instanz) ablegen und darauf aus Widget zugreifen?

      3. Kann ich auf andere Weise in der View auf die oben genannten Datenpunkte mit dem Instanz-abhängigen Pfad zugreifen, um die Werte des aktuell zu steuernden Devices anzuzeigen?

      4. Ist mein Grundansatz falsch, dies über generierte Datenpunkte zu machen, wie ginge das besser?

      5. Die im Script Teil der View angelegten Programme laufen doch im Frontend, richtig? Kann ich ein Binding auf eine Variable dieser Scripte realisieren?

      Also in Summe: Wie kann ich eine View mehrfach in z.B. drei laufenden Instanzen nutzen und jede View/Instanz arbeitet mit seinen eigenen Daten?

      Ich habe noch folgende Alternativen überlegt, aber verworfen:

      • Keine Anzeige der aktuellen Daten des zu steuernden Devices, nur setzen von festen Werten -> das hat keine gute Usability.
      • Keine Instanz-bezogene Unterscheidung der Datenpunkte -> Dann brauche ich jeweils eine einzelne View für jedes Device, das ist vom Pflegeaufwand nicht sinnvoll.

      Ich in doch sicherlich nicht der Erste, der sowas versucht. Mir fehlt nur der entsprechende Denkanstoß, wie ich damit umgehen soll.
      Ein so mächtiges System sollte doch irgendwie dazu in der Lage sein, dynamisch Daten in der Visualisierung zu verarbeiten, oder bin ich da gedanklich komplettz falsch unterwegs?

      Danke für jede Idee oder jeden Hinweis,
      Peter

      OliverIO liv-in-sky 2 Replies Last reply Reply Quote 0
      • OliverIO
        OliverIO @PPB1308 last edited by

        @ppb1308

        leider gibt es keine dynamischen datenpunkte, bei dem man anteile des datenpunktnamens während der laufzeit abändern kann.

        was du machen kannst ist entwender den view doppeln oder im gleichen view die widgets mit angepassten datenpunktnamen drüber legen.
        per knopf einem weiteren datenpunkt der die ausgeählte instanz enthält und der sichtbarkeit in den widgets kannst du wählen welche widgets für welche instanz sichtbar sein sollen

        P 1 Reply Last reply Reply Quote 0
        • P
          PPB1308 @OliverIO last edited by

          @oliverio Danke für die Idee mit den über einander liegenden Widgets, das ist ein Weg, der aber noch mehr Pflegeaufwand hat, als einzelne Views für jedes Device.

          Gibt es weitere Möglichkeiten?

          OliverIO 1 Reply Last reply Reply Quote 0
          • OliverIO
            OliverIO @PPB1308 last edited by OliverIO

            @ppb1308

            Meines wissens nicht in vis.
            Prinzip von vis ist, nach dem Start:

            • sammle alle verwendeten Datenpunkte ein
            • abonniere diese Datenpunkte dann vom Server, das man bei Änderungen informiert wird
            • zeige dann alle Werte an der entsprechenden Stelle an
            • Aktualisiere die Werte wenn man über Änderungen informiert wird.

            daher können Datenpunkte, die nicht bekannt sind (also in widgets oder in bindings angegeben worden sind) nicht verwendet werden.

            P 1 Reply Last reply Reply Quote 0
            • P
              PPB1308 @OliverIO last edited by

              @oliverio
              Danke für die Erklärung, aber Du sagst, Bindings könnten nicht verwendet werden, aber genau diese sind ja nutzbar. Die werden imho dann zur Laufzeit ausgewertet, also beim Start der Instanz, da ist die Instanznummer aber doch auch schon bekannt oder müsste es sein.
              Ich müsste halt nur den Inhalt (Pfad zum DP) des Bindings zusammenbauen können.

              Wenn das dynamisch mit Instanz nicht geht, müsste ich in der laufenden Instanz nur irgendwie festlegen können, dass es die Instanz A bzw. welches Frontend-Gerät es ist oder eben auf einem anderen Gerät die Instanz B, dann könnte ich für jede Instanz eigene Datenpunkte bauen.

              So könnte das Tablet im Wohnzimmer immer mit den DPs arbeiten unter
              javascript.0.tabletWZ

              Und das Tablet im Schlafzimmer dann mit den DPs unter
              javascript.0.tabletSZ

              Aber genau das fehlt irgendwie.
              Ich frage mich, warum diese Überlegung bei der VIS Entwicklung nicht irgendwie berücksichtigt wurde,

              1 Reply Last reply Reply Quote 0
              • P
                PPB1308 last edited by

                Vielleicht stelle ich die Frage noch einmal anders:
                Kann ich ein Binding dynamisch mit dem Inhalt eines Datenpunktes zusammenbauen, also um Werte anzuzeigen oder zu ändern?

                OliverIO 1 Reply Last reply Reply Quote 0
                • OliverIO
                  OliverIO @PPB1308 last edited by

                  @ppb1308 sagte in Zugriff auf Instanz-bezogene Daten (Binding oder JavaScript):

                  Vielleicht stelle ich die Frage noch einmal anders:
                  Kann ich ein Binding dynamisch mit dem Inhalt eines Datenpunktes zusammenbauen, also um Werte anzuzeigen oder zu ändern?

                  wie oben schon geschrieben.
                  Nein.

                  @oliverio sagte in Zugriff auf Instanz-bezogene Daten (Binding oder JavaScript):

                  leider gibt es keine dynamischen datenpunkte, bei dem man anteile des datenpunktnamens während der laufzeit abändern kann.

                  1 Reply Last reply Reply Quote 1
                  • liv-in-sky
                    liv-in-sky @PPB1308 last edited by

                    @ppb1308

                    ich kenne nur einen weg über einen zusätzlichen trigger

                    du siehst 2 browser in der selben view - jeder nutzt einen anderen port des web adapters - also eine eigene instanz des web-adapters

                    das heizungsbild (zusätzlicher trigger) muss angeklickt werden, damit dahinter die eigentlichen schalter betätigt werden können - durch den klick werden die datenpunkte zugeteilt - je nach port (web instanz) wird dann ein anderer datenpunkt geschrieben. das bild erscheint wieder nach x-sekunden, damit der trigger wieder aktiviert wird

                    hoffe, du erkennst alles

                    AApossis (167).gif

                    1 Reply Last reply Reply Quote 0
                    • P
                      PPB1308 last edited by

                      @liv-in-sky
                      Das klingt interessant, wie hast Du in Abhängigkeit vom Port die DPs "zugeteilt"?
                      Das machst Du doch sicher in einem JavaScript, kannst Du das bitte mal teilen?

                      Danke.

                      liv-in-sky 2 Replies Last reply Reply Quote 0
                      • liv-in-sky
                        liv-in-sky @PPB1308 last edited by liv-in-sky

                        @ppb1308

                        das ist im vis-editor im script tab

                        • schreibt port in einen datenpunkt
                        • schreibt auch in dp, das sichtbar und unsichtbar machen des heizungsbildes - dp mußt du anlegen
                        • die zeit, wie lange das bild unsuchtbar bleibt ist auch dort einzutellen

                        
                        
                        function waitForElement(parent, elementPath, wid, widgetName, callBack, counter = 0, debug = false) {
                        
                                if (counter < 30) {
                        
                                    setTimeout(function () {
                        
                                        if (parent.find(elementPath).length > 0) {
                        
                                            if (debug) console.log(`[${widgetName} ${wid}] it took ${counter}ms to wait for the element '${elementPath}'`);
                        
                                            callBack();
                        
                                        } else {
                        
                                            if (debug) console.log(`[${widgetName} ${wid}] wait for element '${elementPath}'`);
                        
                                            counter++
                        
                                            waitForElement(parent, elementPath, wid, widgetName, callBack, counter, debug);
                        
                                        }
                        
                                    }, 1000);
                        
                                } else {
                        
                                   if (debug) console.warn(`[${widgetName} ${wid}] stop waiting after ${counter} retries`);
                        
                                    callBack();
                        
                               }
                        
                           }
                        
                        // Warten auf das (basic - Scren Resolution) Widget, ID ggf. anpassen
                        
                        waitForElement($('body'),'#w00009', 'dummy', 'dummy', function () {
                          // Widget ist geladen, auf das Widget klicken, w02705 ist die ID von meinem basic - Screen Resolution Widget
                             // und in einen Datenpunkt schreiben
                        
                        
                             $('#w00009').click(function(){
                          vis.setValue('0_userdata.0.CONTROL-OWN.AAATEST.vis-port', location.port);
                          vis.setValue('0_userdata.0.CONTROL-OWN.AAATEST.vis-port-sichtbar', false);
                          console.log(location.port);
                           setTimeout( () => { 
                              vis.setValue('0_userdata.0.CONTROL-OWN.AAATEST.vis-port-sichtbar',true); 
                           }, 6000);
                           
                           
                        });
                        
                         /*  }, 3000);*/
                        
                        }, 0, true);
                        
                        

                        das widget mit dem bild und den settings für unsichtbar ist hier

                        [{"tpl":"tplImage","data":{"g_fixed":false,"g_visibility":true,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":"true","visibility-groups-action":"hide","refreshInterval":"0","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"src":"/vis.0/armin/img/heating.png","visibility-oid":"0_userdata.0.CONTROL-OWN.AAATEST.vis-port-sichtbar"},"style":{"left":"142px","top":"224px","width":"199px","height":"233px","z-index":"20"},"widgetSet":"basic"}]
                        

                        das widget, welches wirklich schaltet ist hier

                        [{"tpl":"tplValueBoolCheckbox","data":{"oid":"{bar:0_userdata.0.CONTROL-OWN.AAATEST.vis-port; bar==\"8082\" ? \"0_userdata.0.CONTROL-OWN.AAATEST.TestLogic\" : \"0_userdata.0.CONTROL-OWN.AAATEST.TestLogic2\"}","g_fixed":false,"g_visibility":false,"g_css_font_text":false,"g_css_background":false,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":false,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0},"style":{"left":"219px","top":"327px","z-index":"1"},"widgetSet":"basic"}]
                        

                        1 Reply Last reply Reply Quote 0
                        • liv-in-sky
                          liv-in-sky @PPB1308 last edited by

                          @ppb1308

                          noch vergessen - du musst auch in zeile 44 und 49 im script die widget-id von dir eintragem - die ist ja anders als bei mir

                          #w00009 ist bei miir das widget mit dem bild - mss angeglichen werden

                          P 1 Reply Last reply Reply Quote 0
                          • P
                            PPB1308 @liv-in-sky last edited by

                            @liv-in-sky
                            Herzlichen Dank, probiere ich morgen aus.

                            Viele Grüße, Peter

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

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            686
                            Online

                            31.9k
                            Users

                            80.1k
                            Topics

                            1.3m
                            Posts

                            3
                            12
                            741
                            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