Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Visualisierung
    4. Dynamische Erstellung von Widgets

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Dynamische Erstellung von Widgets

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

      Ist es möglich, Widgets dynamisch mit JS zu erstellen und hat jemand eventuell Beispiele?

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

        @karlheinz-knapp

        da musst du deine anforderungen genauer beschreiben was du mit widgets meinst.
        wenn du vis1 widgets meinst, dann geht das so nicht.
        Das steht so im log

        vis.js:2602 Error in eval[value]: {x:0_userdata.0.test1;x.a}
        vis.js:2603 Error in eval[script]: var x = JSON.parse("{"a":true,"b":false}");return x.a;
        vis.js:2604 Error in eval[error]: SyntaxError: missing ) after argument list
        
        Karlheinz Knapp 1 Reply Last reply Reply Quote 0
        • Karlheinz Knapp
          Karlheinz Knapp @OliverIO last edited by Karlheinz Knapp

          @oliverio ich würde gerne bei der Proxmox instance je qemu VM und je node ein Widget in vis automatisiert erstellen.

          Kommt eine node oder VM hinzu wird diese automatisiert in die Visualisierung integriert.

          arteck 1 Reply Last reply Reply Quote 0
          • arteck
            arteck Developer Most Active @Karlheinz Knapp last edited by arteck

            @karlheinz-knapp sagte in Dynamische Erstellung von Widgets:

            @oliverio ich würde gerne bei der Proxmox instance je qemu VM und je node ein Widget in vis automatisiert erstellen.

            Kommt eine node oder VM hinzu wird diese automatisiert in die Visualisierung integriert.

            du kannst ein html widget nehmen und den per binding aus dem object befüllen..

            Karlheinz Knapp 1 Reply Last reply Reply Quote 0
            • Karlheinz Knapp
              Karlheinz Knapp @arteck last edited by Karlheinz Knapp

              @arteck
              Hast Du mal hierzu ein paar zeilen Code damit ich auf den richtigen Weg komme ?

              Karlheinz Knapp 1 Reply Last reply Reply Quote 0
              • Karlheinz Knapp
                Karlheinz Knapp @Karlheinz Knapp last edited by Karlheinz Knapp

                @karlheinz-knapp
                Ich schreibe noch einmal genau, was ich vorhabe:

                Ich möchte dynamische Widgets erzeugen. Wenn in dem Pfad 10 Einträge sind, möchte ich 10 Widgets erstellen.
                Kommen noch weitere n Einträge hinzu, möchte ich dynamisch die n Einträge hinzufügen und die Positionierung sowie, das Binding mit JS setzen.

                Hierzu suche ich ein paar Zeilen Code, damit ich auf den richtigen Weg komme?

                David G. R Meister Mopper OliverIO 4 Replies Last reply Reply Quote 0
                • David G.
                  David G. @Karlheinz Knapp last edited by David G.

                  @karlheinz-knapp

                  Das liegt daran, wie schön die sein sollen.
                  Mit Blockly könnte man in einer Schleife alle Maschinen abfragen.

                  So ähnlich (wenn ich es recht in Erinnerung habe ^^) mache ich es hier.

                  Screenshot_20250302_180617_Fully Kiosk Browser.jpg

                  Man könnte es mit was html Kenntnissen auch Tabellarjsch was anders aufarbeiten.

                  EDIT
                  Die Tabelle greift auf Daten von Linux Control zurück,lässt sich aber 1 zu 1 (sofern Daten bereitgestellt) auf proxmox abändern.

                  1 Reply Last reply Reply Quote 0
                  • R
                    Ralf 2 @Karlheinz Knapp last edited by

                    @karlheinz-knapp
                    Als Anregung:
                    Für solche Dynamischen Widgets kann man von MaterialDesign die Iconlist nehmen.
                    Ein Beispiel ist das Script adapter-status

                    Für die Adapter-Liste wird dann zum Beispiel solch ein JSon erzeugt und angezeigt, das ist aber schon komplex auf zu bauen:

                    [{
                            "text": "<div style=\"display: flex; flex-direction: row; line-height: 1.5; padding-right: 8px; align-items: center;\">\n                            <div style=\"flex: 1\"> Javascript</div>\n                            <div style=\"color: grey; font-size: 12px; font-family: RobotoCondensed-LightItalic;\">v8.8.3</div>\n                        </div>",
                            "subText": "<div style=\"display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;\">\n                                <div style=\"flex: 1;\">CPU</div>\n                                <div style=\"color: #888888; font-size: 14px; font-family: RobotoCondensed-LightItalic; text-align: right;\">3.2 %</div>\n                            </div>\n                            <div style=\"display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;\">\n                                <div style=\"flex: 1;\">RAM total</div>\n                                <div style=\"color: #888888; font-size: 14px; font-family: RobotoCondensed-LightItalic; text-align: right;\">535.77 MB</div>\n                            </div>\n                            <div style=\"display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;\">\n                                <div style=\"flex: 1;\">RAM verwendet</div>\n                                <div style=\"color: #888888; font-size: 14px; font-family: RobotoCondensed-LightItalic; text-align: right;\">503.48 MB</div>\n                            </div>\n                            <div style=\"display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;\">\n                                <div style=\"flex: 1;\">RAM reserviert</div>\n                                <div style=\"color: #888888; font-size: 14px; font-family: RobotoCondensed-LightItalic; text-align: right;\">658.85 MB</div>\n                            </div>\n                            <div style=\"display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;\">\n                                <div style=\"flex: 1;\">Betriebszeit</div>\n                                <div style=\"color: #888888; font-size: 14px; font-family: RobotoCondensed-LightItalic; text-align: right;\">03T 04h 53m</div>\n                            </div>\n                            <div style=\"display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;\">\n                                <div style=\"flex: 1;\">Modus</div>\n                                <div style=\"color: #888888; font-size: 14px; font-family: RobotoCondensed-LightItalic; text-align: right;\">daemon</div>\n                            </div>",
                            "image": "/javascript.admin/javascript.png",
                            "listType": "buttonState",
                            "objectId": "0_userdata.0.vis.AdapterStatus.restartTrigger",
                            "buttonStateValue": "system.adapter.javascript.0",
                            "statusBarColor": "green",
                            "showValueLabel": false,
                            "name": "Javascript",
                            "mode": "daemon",
                            "hasUpdates": "",
                            "cpu": 3.2,
                            "memHeapTotal": 535.77,
                            "memHeapUsed": 503.48,
                            "memRss": 658.85,
                            "uptime": 276752,
                            "status": 0,
                            "lockEnabled": true
                        }, {
                            "text": "<div style=\"display: flex; flex-direction: row; line-height: 1.5; padding-right: 8px; align-items: center;\">\n                            <div style=\"flex: 1\"> Javascript.1</div>\n                            <div style=\"color: grey; font-size: 12px; font-family: RobotoCondensed-LightItalic;\">v8.8.3</div>\n                        </div>",
                            "subText": "<div style=\"display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;\">\n                                <div style=\"flex: 1;\">CPU</div>\n                                <div style=\"color: #888888; font-size: 14px; font-family: RobotoCondensed-LightItalic; text-align: right;\">2 %</div>\n                            </div>\n                            <div style=\"display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;\">\n                                <div style=\"flex: 1;\">RAM total</div>\n                                <div style=\"color: #888888; font-size: 14px; font-family: RobotoCondensed-LightItalic; text-align: right;\">351.66 MB</div>\n                            </div>\n                            <div style=\"display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;\">\n                                <div style=\"flex: 1;\">RAM verwendet</div>\n                                <div style=\"color: #888888; font-size: 14px; font-family: RobotoCondensed-LightItalic; text-align: right;\">337.55 MB</div>\n                            </div>\n                            <div style=\"display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;\">\n                                <div style=\"flex: 1;\">RAM reserviert</div>\n                                <div style=\"color: #888888; font-size: 14px; font-family: RobotoCondensed-LightItalic; text-align: right;\">476.32 MB</div>\n                            </div>\n                            <div style=\"display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;\">\n                                <div style=\"flex: 1;\">Betriebszeit</div>\n                                <div style=\"color: #888888; font-size: 14px; font-family: RobotoCondensed-LightItalic; text-align: right;\">03T 04h 50m</div>\n                            </div>\n                            <div style=\"display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;\">\n                                <div style=\"flex: 1;\">Modus</div>\n                                <div style=\"color: #888888; font-size: 14px; font-family: RobotoCondensed-LightItalic; text-align: right;\">daemon</div>\n                            </div>",
                            "image": "/javascript.admin/javascript.png",
                            "listType": "buttonState",
                            "objectId": "0_userdata.0.vis.AdapterStatus.restartTrigger",
                            "buttonStateValue": "system.adapter.javascript.1",
                            "statusBarColor": "green",
                            "showValueLabel": false,
                            "name": "Javascript",
                            "mode": "daemon",
                            "hasUpdates": "",
                            "cpu": 2,
                            "memHeapTotal": 351.66,
                            "memHeapUsed": 337.55,
                            "memRss": 476.32,
                            "uptime": 276607,
                            "status": 0,
                            "lockEnabled": true
                        }, {
                            "text": "<div style=\"display: flex; flex-direction: row; line-height: 1.5; padding-right: 8px; align-items: center;\">\n                            <div style=\"flex: 1\"> Javascript.3</div>\n                            <div style=\"color: grey; font-size: 12px; font-family: RobotoCondensed-LightItalic;\">v8.8.3</div>\n                        </div>",
                            "subText": "<div
                    u.s.w.
                    
                    1 Reply Last reply Reply Quote 0
                    • Meister Mopper
                      Meister Mopper @Karlheinz Knapp last edited by

                      @karlheinz-knapp

                      Hattest du schon Berührungen mit KI/AI?

                      Aus meiner Erfahrung kommt man damit sehr schnell zu passablen Ergebnissen.

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

                        @karlheinz-knapp

                        Dynamisch bindings erzeugen (auf dem Client) geht leider wegen der Funktionsweise von vis nicht. Bei vis müssen bei Start alle datenpunkte bekannt sein, diese werden dann beim Server abonniert und dann laufend aktuell gehalten.

                        Du benötigst ein blockly,Skript,etc. auf dem Server welches deine aktuelle Anzahl der datenpunkte die du darstellen willst abfragt, den jeweiligen Wert abfragt, daraus dann html erstellt und in einen datenpunkt schreibt.
                        Dieses html kann dann mit dem html Widget dargestellt werden.
                        Immer wenn ein datenpunkt sich ändert wird das html erzeugt und auch dynamisch im Client aktualisiert.
                        Hinzukommende datenpunkte oder auch wegfallende datenpunkte müsste man zyklisch abfragen. Da gibt es glaube ich keine automatismen.
                        Aber ich glaube bei den triggern kann man pattern definieren, die auch zukünftige datenpunkte treffen.

                        Wäre so eine Lösung für dich denkbar?

                        David G. 1 Reply Last reply Reply Quote 0
                        • David G.
                          David G. @OliverIO last edited by David G.

                          Das hab ich grad nur schnell getestet. Ohne eine Schleife in js oder Blockly mit festen Werten.

                          Nur html ohne css etc (nutze lovelace, kann kein css), für VIS kann man noch css einbauen um es schon zu machen. Ggf auch noch responsive.

                          Screenshot_20250302_222412_Fully Kiosk Browser.jpg

                          P. S.
                          Bedenke, dass die DPs von gelöschten VMs manuell gelöscht werden müssen, sonst bleibt in deiner view alles erhalten.
                          Deshalb würde ich es "halbautomatisch" lösen, dass man im Script die IDs der VMs eingibt die man sehen möchte.

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

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          871
                          Online

                          31.7k
                          Users

                          79.7k
                          Topics

                          1.3m
                          Posts

                          6
                          11
                          363
                          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