Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Visualisierung
    4. [gelöst] VIS - Wert von JS-Variable in Widget verwenden

    NEWS

    • Neues Video über Aliase, virtuelle Geräte und Kategorien

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    [gelöst] VIS - Wert von JS-Variable in Widget verwenden

    This topic has been deleted. Only users with topic management privileges can see it.
    • B
      badsnoopy667 @BananaJoe last edited by badsnoopy667

      @bananajoe
      Ganz spontane Idee und nicht ausgegoren:

      In den Objekten gibt es ja "vis.0.control.data" und "vis.0.control.instance"
      Der data Datenpunkt zeigt mir an, welcher View gerade in VIS geöffnet ist und wechselt, wenn ich den View am Tablet ändere. Der instance Datenpunkt zeigt an, von welchem Browser die Änderung kam.

      Idee: Benutze ein View-Wechsel Widget anstelle eines Knopfes. Damit kann man vielleicht zuverlässig triggern auf welchem Tablet dieses Widget gedrückt wurde. Wenn das dann auf denselben View zurückwechselt auf dem es liegt, fällt der Viewwechsel vielleicht auch kaum störend auf...

      BananaJoe 1 Reply Last reply Reply Quote 0
      • BananaJoe
        BananaJoe Most Active @badsnoopy667 last edited by

        @badsnoopy667 Den Datenpunkt hatte ich mir auch schon angesehen - und verworfen weil das eben nur bei View-Wechseln aktualisiert wird. Ich arbeite auch mit "View in Widget" und da klappt das sowieso nicht.
        Die Lösung von @Andersmacher funktioniert super

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

          @bananajoe

          @bananajoe sagte in [gelöst] VIS - Wert von JS-Variable in Widget verwenden:

          und verworfen weil das eben nur bei View-Wechseln aktualisiert

          aber die browser instance ändert sich doch eigentlich nie (für den einzelnen client)?
          diese wird einmalig je client/browser festgelegt. gespeichert wird diese in der localStorage des Browsers

          die instance dient ja dazu client spezifische unterscheidungen in der vis einzubauen, wie bspw das bestimmte widgets nur auf bestimmten clients sichtbar sind oder ggfs unterschiedlich formatiert werden.

          tatsächlich ist das special binding instance irgendwie nicht mehr da.
          getSpecialValues oder die andere stelle hab ich nicht gefunden. aber irgendwie hat das schon mal funktioniert.

          als alternative, wie schon erwähnt könnte man das hier nehmen

          {vis.0.control.instance}
          

          oder nochmal eine andere alternative um an die internen werte zu kommen, sofern es sich nicht um Objekte handelt:

          {v:local_xxx;vis.instance}
          

          wichtig wäre hier der 2.parameter. der object id wird nur verwendet um die aktualisierung zu triggern, da kann aber ein beliebige id drin stehen, auch eine locale, die dann mit vis.setValue bei bedarf getriggert werden kann.

          BananaJoe 1 Reply Last reply Reply Quote 0
          • BananaJoe
            BananaJoe Most Active @OliverIO last edited by

            @oliverio sagte in [gelöst] VIS - Wert von JS-Variable in Widget verwenden:

            aber die browser instance ändert sich doch eigentlich nie (für den einzelnen client)?

            Das Thema hatten wir hier auch schon (wo es um das automatische Ermitteln geht): https://forum.iobroker.net/topic/43361/gelöst-vis-intance-id-automatisiert-ermitteln

            Ja, eigentlich. Aber wenn ich mit 3 verschiedenen Browser von meinem Rechner aus Teste sind es 3 verschiedene Ids.
            Und der Fully Kiosk - den ich auf jeden Tablett bei mir einsetze - löscht den ggf. auch (wenn er den Cache löscht, war man Standard-Einstellung).

            Mit der Methode der automatischen Ermittlung muss ich mich nicht darum kümmern (die wäre vielleicht noch zu verbessern das man das VIS-Skript nicht anpassen muss), mit der nun gefundenen Methode können sich mehrere Tablets eine View Teilen und trotzdem Individuelle Dinge anzeigen bzw. individuell reagieren.

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

              @bananajoe

              ja hab ich gesehen.
              mit express und einem skript im iobroker könnte man den apache wegreduzieren.
              dann läuft der webserver auf einem beliebigen port von einem iobroker skript aus

              BananaJoe 1 Reply Last reply Reply Quote 0
              • BananaJoe
                BananaJoe Most Active @OliverIO last edited by BananaJoe

                @oliverio sagte in [gelöst] VIS - Wert von JS-Variable in Widget verwenden:

                @bananajoe

                ja hab ich gesehen.
                mit express und einem skript im iobroker könnte man den apache wegreduzieren.
                dann läuft der webserver auf einem beliebigen port von einem iobroker skript aus

                Wenn der JavaScript Teil aus der VIS dann noch in einem Widget abgelegt werden kann, könnte man da sogar einen eigenen Adapter draus bauen 🙂
                Ist Express bei ioBroker im npm schon mit drin? Eigentlich braucht es ja quasi nix, es muss ja nur eine Antwort auf einen http-Request geben.
                So etwas habe ich mir sonst immer in Python mit Flask gebaut, da bekommt man den kompletten Aufruf der URL als einzelne Werte/Parameter an das Skript übergeben.

                Nachtrag: Jupp, ist sehr simpel, ich habe mal das Beispiel von hier: https://www.digitalocean.com/community/tutorials/how-to-create-a-web-server-in-node-js-with-the-http-module
                in ein JavaScript gekippt (mit Anpassung von Host und Port)
                VORSICHT BEIM TESTEN

                const http = require("http");
                const host = '0.0.0.0';
                const port = 16384;
                
                const requestListener = function (req, res) {
                    res.writeHead(200);
                    res.end("My first server!");
                };
                
                const server = http.createServer(requestListener);
                server.listen(port, host, () => {
                    console.log(`Server is running on http://${host}:${port}`);
                });
                

                VORSICHT BEIM TESTEN
                Funktioniert!
                4c7e5125-4c58-490f-ab99-394cf6682dd0-image.png

                Hier eine Version welche die IP als JSON zurück gibt:
                VORSICHT BEIM TESTEN

                const http = require("http");
                const host = '0.0.0.0';
                const port = 16384;
                
                const requestListener = function (req, res) {
                    res.setHeader("Content-Type", "application/json");
                    res.writeHead(200);
                    res.end('{"ipAddress":"' + req.socket.remoteAddress + '"}');
                };
                
                const server = http.createServer(requestListener);
                server.listen(port, host, () => {
                    console.log(`Server is running on http://${host}:${port}`);
                });
                

                VORSICHT BEIM TESTEN
                012df778-77f1-43fa-9393-7853ceaa9d22-image.png
                Das ganze hat noch die Macke das der Webserver nicht beendet wird, wenn man das Skript beendet ... da bräuchte ich jetzt noch eine Lösung, ein "http.destroyServer" oder ähnlich scheint es nicht zu geben.
                Zum Glück teste ich so etwas in einer eigenen JavaScript-Instanz, den diese muss man zum beenden im Moment noch neu starten.

                1 Reply Last reply Reply Quote 0
                • BananaJoe
                  BananaJoe Most Active last edited by BananaJoe

                  Und mein eigener Nachtrag mit der Lösung:

                  // Webserver erstellen der die eigene IP zurück gibt, gefunden hier: https://www.digitalocean.com/community/tutorials/how-to-create-a-web-server-in-node-js-with-the-http-module
                  const http = require("http");
                  const host = '0.0.0.0';
                  const port = 16384;
                  
                  const requestListener = function (req, res) {
                      res.setHeader('Access-Control-Allow-Origin', '*');
                      res.setHeader("Content-Type", "application/json");
                      res.writeHead(200);
                      res.end('{"ipAddress":"' + req.socket.remoteAddress + '"}');
                  };
                  
                  var server = http.createServer(requestListener);
                  server.listen(port, host, () => {
                      console.log(`Server is running on http://${host}:${port}`);
                  });
                  
                  // Socket-Handling, gefunden hier: https://stackoverflow.com/questions/14626636/how-do-i-shut-down-a-node-js-https-server-immediately
                  // Maintain a hash of all connected sockets
                  var sockets = {}, nextSocketId = 0;
                  server.on('connection', function (socket) {
                    // Add a newly connected socket
                    var socketId = nextSocketId++;
                    sockets[socketId] = socket;
                    console.log('socket ' + socketId + ' opened');
                  
                    // Remove the socket when it closes
                    socket.on('close', function () {
                      console.log('socket ' + socketId + ' closed');
                      delete sockets[socketId];
                    });
                  
                    // Extend socket lifetime for demo purposes
                    socket.setTimeout(4000);
                  });
                  
                  // Wenn das Skript beendet wird, Webserver auch stoppen und alle noch offenen Sockets beenden
                  // auch von https://stackoverflow.com/questions/14626636/how-do-i-shut-down-a-node-js-https-server-immediately
                  // close Webserver if script stopped
                  onStop(function (callback) {
                      console.log("Stopping Server ...");
                      // Close the server
                      server.close(function () { console.log('Server closed!'); });
                      // Destroy all open sockets
                      for (var socketId in sockets) {
                          console.log('socket ' + socketId + ' destroyed');
                          sockets[socketId].destroy();
                      }
                      callback();
                  }, 10000 /*ms*/);
                  

                  Da ist nun ein Socket-Handling drin welches die einzelnen Verbindungen auch wieder schließt.
                  Und wenn das Skript beendet wird, wird die Funktion onStop aufgerufen die den Webserver auch wieder schließt (und alle noch offenen Sockets entfernt).
                  Diese Version kann nun gefahrloser getestet werden.

                  Edit: res.setHeader('Access-Control-Allow-Origin', '*'); ergänzt damit die URL von auch von einem anderen Port aus aufgerufen werden darf (z.B. aus der VIS heraus)

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

                    @bananajoe

                    Ok jetzt sogar ohne Express nur mit nativen Funktionen von Node
                    Express hätte man über die zusätzlichen npm Module in den Einstellungen des JavaScript Adapters dazuladen können

                    BananaJoe 1 Reply Last reply Reply Quote 0
                    • BananaJoe
                      BananaJoe Most Active @OliverIO last edited by

                      @oliverio sagte in [gelöst] VIS - Wert von JS-Variable in Widget verwenden:

                      Express hätte man über die zusätzlichen npm Module in den Einstellungen des JavaScript Adapters dazuladen können

                      ja, das scheue ich immer. Ich schaue gerne in die NPM Pakete und im Zweifel kopiere ich mir die Funktionen da heraus die ich brauche. In der Regel brauche ich immer nur ein Bruchteil von dem was das Paket bietet.

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

                        @bananajoe

                        Für kleinere Sachen kann man das machen und man lernt sogar draus.
                        Bei komplexeren Dingen lohnt sich das meist nicht, da man ansonsten das Rad neu erfindet.
                        Hinter manchen Bibliotheken stecken ja wieder uU eine größere Community, die dafür sorgt das der Code sicher ist und alle Features enthält die man so braucht

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        863
                        Online

                        32.1k
                        Users

                        80.6k
                        Topics

                        1.3m
                        Posts

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