Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Visualisierung
  4. eigene Visualisierung mit vue.js per socket

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    22
    1
    1.2k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.2k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.5k

eigene Visualisierung mit vue.js per socket

Geplant Angeheftet Gesperrt Verschoben Visualisierung
socket io
6 Beiträge 4 Kommentatoren 1.2k Aufrufe 4 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • D Offline
    D Offline
    Darth2010
    schrieb am zuletzt editiert von
    #1

    Hallo ioBrokers,

    ich versuche gerade meine ioBroker Instanz mit einer Vue.js App zu verbinden.

    Ein einfacher Test per HTML (https://github.com/ioBroker/ioBroker.socketio/tree/master/example) hat mit meiner Instanz funktioniert.

    2021-04-09T11:12:20.701Z Connected => authenticate
    conn.js:317 2021-04-09T11:12:20.840Z Authenticated: true
    index.html:26 connected ==============================
    index.html:32 Received 4360 states.
    

    Die Verbindung wird auch im socket.io Objekt im ioBroker gelistet:
    a1b948ab-9f67-4bf7-aaa6-6c64d19a81a1-grafik.png

    Aber nun stehe ich vor dem Problem das Ganze in Vue einzubinden.
    Die conn.js von Bluefox einfach in Vue importieren und dort wie in der index.html aufzurufen klappt leider nicht:

    Test.vue:

    <template>
    ...
    </template>
    
    <script>
    import { servConn } from '../js/conn.js';
    
        servConn.namespace   = 'vue.0';
        servConn._useStorage = false;
    
        var states = [];
        servConn.init({
        ... });
    
    <style>
    ...
    </style>
    
    

    Die onConnChange Funktion wird nicht durch die init Funktion getriggert:

            onConnChange: function (isConnected) {
                if (isConnected) {
                    console.log('connected ==============================');
                    servConn.getStates(function (err, _states) {
                        var count = 0;
                        for (var id in _states) {
                            count++;
                        }
                        console.log('Received ' + count + ' states.');
                        states = _states;
                    });
    
                    servConn.subscribe('0_userdata.0.Entwicklung.Test.sampleState');   
                    servConn.subscribe('alias.0.sensor.temperatur.garten');
                } else {
                    console.log('disconnected ==============================');
                }
            },
    
    console.log(servConn);
    

    Die Ausgabe aus Zeile 20 oben zeigt

    console.log(servConn);
    

    zeigt
    f1583eaf-ef03-4cc1-9923-fe06db07d74b-grafik.png

    das keine Verbindung hergestellt wurde (alles null- oder Initialwerte), der Namespace aber korrekt auf "vue.0" gesetzt wurde.

    Hoffentlich hat jemand einen Tipp, wo das Problem liegt.

    Gruß
    Darth

    UncleSamU B 2 Antworten Letzte Antwort
    0
    • D Darth2010

      Hallo ioBrokers,

      ich versuche gerade meine ioBroker Instanz mit einer Vue.js App zu verbinden.

      Ein einfacher Test per HTML (https://github.com/ioBroker/ioBroker.socketio/tree/master/example) hat mit meiner Instanz funktioniert.

      2021-04-09T11:12:20.701Z Connected => authenticate
      conn.js:317 2021-04-09T11:12:20.840Z Authenticated: true
      index.html:26 connected ==============================
      index.html:32 Received 4360 states.
      

      Die Verbindung wird auch im socket.io Objekt im ioBroker gelistet:
      a1b948ab-9f67-4bf7-aaa6-6c64d19a81a1-grafik.png

      Aber nun stehe ich vor dem Problem das Ganze in Vue einzubinden.
      Die conn.js von Bluefox einfach in Vue importieren und dort wie in der index.html aufzurufen klappt leider nicht:

      Test.vue:

      <template>
      ...
      </template>
      
      <script>
      import { servConn } from '../js/conn.js';
      
          servConn.namespace   = 'vue.0';
          servConn._useStorage = false;
      
          var states = [];
          servConn.init({
          ... });
      
      <style>
      ...
      </style>
      
      

      Die onConnChange Funktion wird nicht durch die init Funktion getriggert:

              onConnChange: function (isConnected) {
                  if (isConnected) {
                      console.log('connected ==============================');
                      servConn.getStates(function (err, _states) {
                          var count = 0;
                          for (var id in _states) {
                              count++;
                          }
                          console.log('Received ' + count + ' states.');
                          states = _states;
                      });
      
                      servConn.subscribe('0_userdata.0.Entwicklung.Test.sampleState');   
                      servConn.subscribe('alias.0.sensor.temperatur.garten');
                  } else {
                      console.log('disconnected ==============================');
                  }
              },
      
      console.log(servConn);
      

      Die Ausgabe aus Zeile 20 oben zeigt

      console.log(servConn);
      

      zeigt
      f1583eaf-ef03-4cc1-9923-fe06db07d74b-grafik.png

      das keine Verbindung hergestellt wurde (alles null- oder Initialwerte), der Namespace aber korrekt auf "vue.0" gesetzt wurde.

      Hoffentlich hat jemand einen Tipp, wo das Problem liegt.

      Gruß
      Darth

      UncleSamU Offline
      UncleSamU Offline
      UncleSam
      Developer
      schrieb am zuletzt editiert von
      #2

      @darth2010 Ich kenne vue nicht, habe aber dasselbe mit Angular 10 gemacht. Allerdings habe ich nicht sie Datei von Bluefox verwendet sondern einfach selber einen wrapper für socket.io geschrieben. Ausser getState und subscribe habe ich bis heute nichts anderes benötigt.

      Leider hat dein Code oben so viele Lücken, dass ich nicht sagen kann, was das Problem ist.

      Vielleicht kannst du ja mal den ganzen Code hier oder sonst wo posten.

      Ansonsten versuche es mit einem Tutorial für vue + socket.io und schreibe dann deinem eigenen Code für getState und subscribe.

      Bitte bei Problemen mit meinen Adaptern, Issue auf GitHub erfassen: Loxone | I2C | Luxtronik2
      ♡-lichen Dank an meine Sponsoren

      D 1 Antwort Letzte Antwort
      1
      • UncleSamU UncleSam

        @darth2010 Ich kenne vue nicht, habe aber dasselbe mit Angular 10 gemacht. Allerdings habe ich nicht sie Datei von Bluefox verwendet sondern einfach selber einen wrapper für socket.io geschrieben. Ausser getState und subscribe habe ich bis heute nichts anderes benötigt.

        Leider hat dein Code oben so viele Lücken, dass ich nicht sagen kann, was das Problem ist.

        Vielleicht kannst du ja mal den ganzen Code hier oder sonst wo posten.

        Ansonsten versuche es mit einem Tutorial für vue + socket.io und schreibe dann deinem eigenen Code für getState und subscribe.

        D Offline
        D Offline
        Darth2010
        schrieb am zuletzt editiert von
        #3

        @unclesam

        Ja das ist natürlich eine Lösung :+1: .

        Mir geht auch primar nur darum die Änderungen in den Datenpunkten mitzubekommen ohne den Server alle 5 sek mit Simple API gets zu fluten ;-).

        Ich dachte mit der schon fertigen js lib könnte ich mir das sparen ;-)

        Dann werde ich mir das Tutorial für socket.io ansehen.

        1 Antwort Letzte Antwort
        0
        • D Darth2010

          Hallo ioBrokers,

          ich versuche gerade meine ioBroker Instanz mit einer Vue.js App zu verbinden.

          Ein einfacher Test per HTML (https://github.com/ioBroker/ioBroker.socketio/tree/master/example) hat mit meiner Instanz funktioniert.

          2021-04-09T11:12:20.701Z Connected => authenticate
          conn.js:317 2021-04-09T11:12:20.840Z Authenticated: true
          index.html:26 connected ==============================
          index.html:32 Received 4360 states.
          

          Die Verbindung wird auch im socket.io Objekt im ioBroker gelistet:
          a1b948ab-9f67-4bf7-aaa6-6c64d19a81a1-grafik.png

          Aber nun stehe ich vor dem Problem das Ganze in Vue einzubinden.
          Die conn.js von Bluefox einfach in Vue importieren und dort wie in der index.html aufzurufen klappt leider nicht:

          Test.vue:

          <template>
          ...
          </template>
          
          <script>
          import { servConn } from '../js/conn.js';
          
              servConn.namespace   = 'vue.0';
              servConn._useStorage = false;
          
              var states = [];
              servConn.init({
              ... });
          
          <style>
          ...
          </style>
          
          

          Die onConnChange Funktion wird nicht durch die init Funktion getriggert:

                  onConnChange: function (isConnected) {
                      if (isConnected) {
                          console.log('connected ==============================');
                          servConn.getStates(function (err, _states) {
                              var count = 0;
                              for (var id in _states) {
                                  count++;
                              }
                              console.log('Received ' + count + ' states.');
                              states = _states;
                          });
          
                          servConn.subscribe('0_userdata.0.Entwicklung.Test.sampleState');   
                          servConn.subscribe('alias.0.sensor.temperatur.garten');
                      } else {
                          console.log('disconnected ==============================');
                      }
                  },
          
          console.log(servConn);
          

          Die Ausgabe aus Zeile 20 oben zeigt

          console.log(servConn);
          

          zeigt
          f1583eaf-ef03-4cc1-9923-fe06db07d74b-grafik.png

          das keine Verbindung hergestellt wurde (alles null- oder Initialwerte), der Namespace aber korrekt auf "vue.0" gesetzt wurde.

          Hoffentlich hat jemand einen Tipp, wo das Problem liegt.

          Gruß
          Darth

          B Offline
          B Offline
          Bombel
          schrieb am zuletzt editiert von Bombel
          #4

          @darth2010 Der Beitrag ist zwar schon etwas älter, aber vielleicht steht die Lösung ja noch aus. Ich habe mich auch mit dem Thema Vue.js auseinander gesetzt und die Verbindung zwischen ioBroker und Vue.js via socket.io zum Laufen bekommen. Meine Vue.js Visualisierung ist aktuell noch im Versuchs- und Aufbaustadium...

          ioBroker_Vuejs_Heizung.png

          Zunächst habe ich eine JS Datei mit dem Namen "ioBroker.js" erstellt in der ich die conn.js initialisiere.

          import servConn from "@/services/conn.js";
          import store from "@/store/index.js";
          
          export default {
            connect: function(baseURL) {
              servConn.namespace = "vis.0";
              servConn._useStorage = false;
              servConn.init(
                {
                  name: "vis.0", // optional - default 'vis.0'
                  connLink: baseURL, // optional URL of the socket.io adapter
                  socketSession: "" // optional - used by authentication
                },
                {
                  onConnChange: function(isConnected) {
                    if (isConnected) {
                      console.log("connected");
                      servConn.getStates(function(err, _states) {
                        if (!err) {
                          store.dispatch("ioBrokerInit", _states);
                          console.log("ioBroker Initalisierung erfolgreich!");
                        } else {
                          console.log("ioBroker Initalisierung fehlgeschlagen!");
                        }
                      });
                    } else {
                      console.log("disconnected");
                    }
                  },
                  onUpdate: function(id, state) {
                    setTimeout(function() {
                      var ioBrokerID = "";
                      var ioBrokerState = {};
                      ioBrokerID = id;
                      ioBrokerState = state;
                      store.dispatch("ioBrokerUpdate", { ioBrokerID, ioBrokerState });
                    }, 0);
                  }
                }
              );
            },
          
            setState: function(id, val) {
              servConn.setState(id, val);
            }
          };
          
          

          Bei der Initialisierung werden zunächst alle Objekte aus ioBroker als State im Store (vuex) angelegt (onConnChange). Im anschließenden Verlauf werden die States dann immer bei Änderung aktualisiert (onUpdate).

          Die Initialisierung an sich stoße ich in der app.vue an:

          <script>
          import ioBroker from "@/services/ioBroker.js";
          
          const baseURL = "http://192.168.xxx.yyy:8084";
          
          export default {
            data() {
              return {  };
            },
          
            methods: {
              ioBrokerConnect: function() {
                this.$loadScript(baseURL + "/socket.io/socket.io.js")
                  .then(() => {
                    console.log("Verbunden");
                    ioBroker.connect(baseURL);
                  })
                  .catch(() => {
                    console.log("Nicht Verbunden");
                  });
              }
            },
          
            created() {
              this.ioBrokerConnect();
            },
          
            beforeDestroy() {
              this.$unloadScript(this.baseURL + "/socket.io/socket.io.js");
            }
          };
          </script>
          

          Um die Verbindung herzustellen habe ich das "LoadScript-Plugin" installiert.

          Hier noch mein Store:

          import Vue from "vue";
          import Vuex from "vuex";
          // modules
          import * as homematic from "./modules/homematic.js";
          //import ioBroker from "@/services/ioBroker.js";
          
          Vue.use(Vuex);
          
          export default new Vuex.Store({
            // ------------------------------------------------------------------------------------------------------
            //    MODULES
            // ------------------------------------------------------------------------------------------------------
            modules: { homematic },
          
            // ------------------------------------------------------------------------------------------------------
            //    STATE
            // ------------------------------------------------------------------------------------------------------
            state: {
              ioBroker: {
                states: [],
                Heizung: { out: { PumpeEin: false, VentilAuf: false, VentilZu: false } },
                config: {
                  isDataFetched: false
                }
              }
            },
          
            // ------------------------------------------------------------------------------------------------------
            //    ACTIONS
            // ------------------------------------------------------------------------------------------------------
            actions: {
              // States von ioBroker im Store aktualisieren
              ioBrokerUpdate({ commit }, { ioBrokerID, ioBrokerState }) {
                commit("IOBROKER_UPDATE", { ioBrokerID, ioBrokerState });
                commit("IOBROKER_MOD");
              },
          
              // Beim Laden alle States einmal einlesen
              ioBrokerInit({ commit }, ioBrokerStates) {
                commit("IOBROKER_INIT", ioBrokerStates);
                commit("IOBROKER_MOD");
              },
              // States an ioBroker senden
              ioBrokerSetState({ commit }, { ioBrokerID, ioBrokerState }) {
                commit("IOBROKER_SETSTATE", { ioBrokerID, ioBrokerState });
              }
            },
          
            // ------------------------------------------------------------------------------------------------------
            //    MUTATIONS
            // ------------------------------------------------------------------------------------------------------
            mutations: {
              // States von ioBroker im Store aktualisieren
              IOBROKER_UPDATE(state, { ioBrokerID, ioBrokerState }) {
                state.ioBroker.states[ioBrokerID] = ioBrokerState;
              },
          
              // States von ioBroker im Store aktualisieren
              IOBROKER_INIT(state, ioBrokerStates) {
                state.ioBroker.states = ioBrokerStates;
                state.ioBroker.config.isDataFetched = true;
              },
          
              // Spezifische ioBroker State-Modifikationen
              IOBROKER_MOD(state) {
                var TempState =
                  state.ioBroker.states["modbus.0.inputRegisters.3998_Heizung_Ausgaenge"];
                state.ioBroker.Heizung.out.VentilAuf = (TempState.val & 1) == 1;
                state.ioBroker.Heizung.out.VentilZu = (TempState.val & 2) == 2;
                state.ioBroker.Heizung.out.PumpeEin = (TempState.val & 64) == 64;
              }
            },
          
            // ------------------------------------------------------------------------------------------------------
            //    GETTERS
            // ------------------------------------------------------------------------------------------------------
            getters: {
              GETioBroker: state => ioBrokerID => {
                return state.ioBroker.states[ioBrokerID];
              },
          
              HomematicDevice: state => HMdevice => {
                for (var i = 0; i <= state.homematic.devices.length; i++) {
                  if (state.homematic.devices[i].name == HMdevice) {
                    return state.homematic.devices[i];
                  }
                }
              }
            }
          });
          

          Meine conn.js Datei. Diese musste auch noch etwas angepasst werden.

          Ich hoffe die Beschreibung hilft etwas beim Anbinden deiner Vue.js Instanz. Bei mir läuft das ganze bisher ohne Probleme. Leider bin ich kein Profi und habe mir das ganze per Selbststudium versucht beizubringen. Bitte geht bei Fehlern nicht zu hart mit mir ins Gericht ;-)

          Gruß Florian

          UncleSamU P 2 Antworten Letzte Antwort
          0
          • B Bombel

            @darth2010 Der Beitrag ist zwar schon etwas älter, aber vielleicht steht die Lösung ja noch aus. Ich habe mich auch mit dem Thema Vue.js auseinander gesetzt und die Verbindung zwischen ioBroker und Vue.js via socket.io zum Laufen bekommen. Meine Vue.js Visualisierung ist aktuell noch im Versuchs- und Aufbaustadium...

            ioBroker_Vuejs_Heizung.png

            Zunächst habe ich eine JS Datei mit dem Namen "ioBroker.js" erstellt in der ich die conn.js initialisiere.

            import servConn from "@/services/conn.js";
            import store from "@/store/index.js";
            
            export default {
              connect: function(baseURL) {
                servConn.namespace = "vis.0";
                servConn._useStorage = false;
                servConn.init(
                  {
                    name: "vis.0", // optional - default 'vis.0'
                    connLink: baseURL, // optional URL of the socket.io adapter
                    socketSession: "" // optional - used by authentication
                  },
                  {
                    onConnChange: function(isConnected) {
                      if (isConnected) {
                        console.log("connected");
                        servConn.getStates(function(err, _states) {
                          if (!err) {
                            store.dispatch("ioBrokerInit", _states);
                            console.log("ioBroker Initalisierung erfolgreich!");
                          } else {
                            console.log("ioBroker Initalisierung fehlgeschlagen!");
                          }
                        });
                      } else {
                        console.log("disconnected");
                      }
                    },
                    onUpdate: function(id, state) {
                      setTimeout(function() {
                        var ioBrokerID = "";
                        var ioBrokerState = {};
                        ioBrokerID = id;
                        ioBrokerState = state;
                        store.dispatch("ioBrokerUpdate", { ioBrokerID, ioBrokerState });
                      }, 0);
                    }
                  }
                );
              },
            
              setState: function(id, val) {
                servConn.setState(id, val);
              }
            };
            
            

            Bei der Initialisierung werden zunächst alle Objekte aus ioBroker als State im Store (vuex) angelegt (onConnChange). Im anschließenden Verlauf werden die States dann immer bei Änderung aktualisiert (onUpdate).

            Die Initialisierung an sich stoße ich in der app.vue an:

            <script>
            import ioBroker from "@/services/ioBroker.js";
            
            const baseURL = "http://192.168.xxx.yyy:8084";
            
            export default {
              data() {
                return {  };
              },
            
              methods: {
                ioBrokerConnect: function() {
                  this.$loadScript(baseURL + "/socket.io/socket.io.js")
                    .then(() => {
                      console.log("Verbunden");
                      ioBroker.connect(baseURL);
                    })
                    .catch(() => {
                      console.log("Nicht Verbunden");
                    });
                }
              },
            
              created() {
                this.ioBrokerConnect();
              },
            
              beforeDestroy() {
                this.$unloadScript(this.baseURL + "/socket.io/socket.io.js");
              }
            };
            </script>
            

            Um die Verbindung herzustellen habe ich das "LoadScript-Plugin" installiert.

            Hier noch mein Store:

            import Vue from "vue";
            import Vuex from "vuex";
            // modules
            import * as homematic from "./modules/homematic.js";
            //import ioBroker from "@/services/ioBroker.js";
            
            Vue.use(Vuex);
            
            export default new Vuex.Store({
              // ------------------------------------------------------------------------------------------------------
              //    MODULES
              // ------------------------------------------------------------------------------------------------------
              modules: { homematic },
            
              // ------------------------------------------------------------------------------------------------------
              //    STATE
              // ------------------------------------------------------------------------------------------------------
              state: {
                ioBroker: {
                  states: [],
                  Heizung: { out: { PumpeEin: false, VentilAuf: false, VentilZu: false } },
                  config: {
                    isDataFetched: false
                  }
                }
              },
            
              // ------------------------------------------------------------------------------------------------------
              //    ACTIONS
              // ------------------------------------------------------------------------------------------------------
              actions: {
                // States von ioBroker im Store aktualisieren
                ioBrokerUpdate({ commit }, { ioBrokerID, ioBrokerState }) {
                  commit("IOBROKER_UPDATE", { ioBrokerID, ioBrokerState });
                  commit("IOBROKER_MOD");
                },
            
                // Beim Laden alle States einmal einlesen
                ioBrokerInit({ commit }, ioBrokerStates) {
                  commit("IOBROKER_INIT", ioBrokerStates);
                  commit("IOBROKER_MOD");
                },
                // States an ioBroker senden
                ioBrokerSetState({ commit }, { ioBrokerID, ioBrokerState }) {
                  commit("IOBROKER_SETSTATE", { ioBrokerID, ioBrokerState });
                }
              },
            
              // ------------------------------------------------------------------------------------------------------
              //    MUTATIONS
              // ------------------------------------------------------------------------------------------------------
              mutations: {
                // States von ioBroker im Store aktualisieren
                IOBROKER_UPDATE(state, { ioBrokerID, ioBrokerState }) {
                  state.ioBroker.states[ioBrokerID] = ioBrokerState;
                },
            
                // States von ioBroker im Store aktualisieren
                IOBROKER_INIT(state, ioBrokerStates) {
                  state.ioBroker.states = ioBrokerStates;
                  state.ioBroker.config.isDataFetched = true;
                },
            
                // Spezifische ioBroker State-Modifikationen
                IOBROKER_MOD(state) {
                  var TempState =
                    state.ioBroker.states["modbus.0.inputRegisters.3998_Heizung_Ausgaenge"];
                  state.ioBroker.Heizung.out.VentilAuf = (TempState.val & 1) == 1;
                  state.ioBroker.Heizung.out.VentilZu = (TempState.val & 2) == 2;
                  state.ioBroker.Heizung.out.PumpeEin = (TempState.val & 64) == 64;
                }
              },
            
              // ------------------------------------------------------------------------------------------------------
              //    GETTERS
              // ------------------------------------------------------------------------------------------------------
              getters: {
                GETioBroker: state => ioBrokerID => {
                  return state.ioBroker.states[ioBrokerID];
                },
            
                HomematicDevice: state => HMdevice => {
                  for (var i = 0; i <= state.homematic.devices.length; i++) {
                    if (state.homematic.devices[i].name == HMdevice) {
                      return state.homematic.devices[i];
                    }
                  }
                }
              }
            });
            

            Meine conn.js Datei. Diese musste auch noch etwas angepasst werden.

            Ich hoffe die Beschreibung hilft etwas beim Anbinden deiner Vue.js Instanz. Bei mir läuft das ganze bisher ohne Probleme. Leider bin ich kein Profi und habe mir das ganze per Selbststudium versucht beizubringen. Bitte geht bei Fehlern nicht zu hart mit mir ins Gericht ;-)

            Gruß Florian

            UncleSamU Offline
            UncleSamU Offline
            UncleSam
            Developer
            schrieb am zuletzt editiert von
            #5

            @bombel Sorry, dass ich das hier nie geschrieben habe, aber es gibt inzwischen eine offizielle Lösung dafür:
            https://www.npmjs.com/package/@iobroker/socket-client

            Diese npm Library kannst du einfach bei dir einbinden und hast mit Connection eine Klasse, die du konfigurieren und dann benutzen kannst. Einfacher geht es kaum noch.

            Falls du deine Vuex Integration auch als npm Library zur Verfügung stellen würdest, wäre sicherlich allen Vue(x) Programmierern geholfen. :-)

            Bitte bei Problemen mit meinen Adaptern, Issue auf GitHub erfassen: Loxone | I2C | Luxtronik2
            ♡-lichen Dank an meine Sponsoren

            1 Antwort Letzte Antwort
            0
            • B Bombel

              @darth2010 Der Beitrag ist zwar schon etwas älter, aber vielleicht steht die Lösung ja noch aus. Ich habe mich auch mit dem Thema Vue.js auseinander gesetzt und die Verbindung zwischen ioBroker und Vue.js via socket.io zum Laufen bekommen. Meine Vue.js Visualisierung ist aktuell noch im Versuchs- und Aufbaustadium...

              ioBroker_Vuejs_Heizung.png

              Zunächst habe ich eine JS Datei mit dem Namen "ioBroker.js" erstellt in der ich die conn.js initialisiere.

              import servConn from "@/services/conn.js";
              import store from "@/store/index.js";
              
              export default {
                connect: function(baseURL) {
                  servConn.namespace = "vis.0";
                  servConn._useStorage = false;
                  servConn.init(
                    {
                      name: "vis.0", // optional - default 'vis.0'
                      connLink: baseURL, // optional URL of the socket.io adapter
                      socketSession: "" // optional - used by authentication
                    },
                    {
                      onConnChange: function(isConnected) {
                        if (isConnected) {
                          console.log("connected");
                          servConn.getStates(function(err, _states) {
                            if (!err) {
                              store.dispatch("ioBrokerInit", _states);
                              console.log("ioBroker Initalisierung erfolgreich!");
                            } else {
                              console.log("ioBroker Initalisierung fehlgeschlagen!");
                            }
                          });
                        } else {
                          console.log("disconnected");
                        }
                      },
                      onUpdate: function(id, state) {
                        setTimeout(function() {
                          var ioBrokerID = "";
                          var ioBrokerState = {};
                          ioBrokerID = id;
                          ioBrokerState = state;
                          store.dispatch("ioBrokerUpdate", { ioBrokerID, ioBrokerState });
                        }, 0);
                      }
                    }
                  );
                },
              
                setState: function(id, val) {
                  servConn.setState(id, val);
                }
              };
              
              

              Bei der Initialisierung werden zunächst alle Objekte aus ioBroker als State im Store (vuex) angelegt (onConnChange). Im anschließenden Verlauf werden die States dann immer bei Änderung aktualisiert (onUpdate).

              Die Initialisierung an sich stoße ich in der app.vue an:

              <script>
              import ioBroker from "@/services/ioBroker.js";
              
              const baseURL = "http://192.168.xxx.yyy:8084";
              
              export default {
                data() {
                  return {  };
                },
              
                methods: {
                  ioBrokerConnect: function() {
                    this.$loadScript(baseURL + "/socket.io/socket.io.js")
                      .then(() => {
                        console.log("Verbunden");
                        ioBroker.connect(baseURL);
                      })
                      .catch(() => {
                        console.log("Nicht Verbunden");
                      });
                  }
                },
              
                created() {
                  this.ioBrokerConnect();
                },
              
                beforeDestroy() {
                  this.$unloadScript(this.baseURL + "/socket.io/socket.io.js");
                }
              };
              </script>
              

              Um die Verbindung herzustellen habe ich das "LoadScript-Plugin" installiert.

              Hier noch mein Store:

              import Vue from "vue";
              import Vuex from "vuex";
              // modules
              import * as homematic from "./modules/homematic.js";
              //import ioBroker from "@/services/ioBroker.js";
              
              Vue.use(Vuex);
              
              export default new Vuex.Store({
                // ------------------------------------------------------------------------------------------------------
                //    MODULES
                // ------------------------------------------------------------------------------------------------------
                modules: { homematic },
              
                // ------------------------------------------------------------------------------------------------------
                //    STATE
                // ------------------------------------------------------------------------------------------------------
                state: {
                  ioBroker: {
                    states: [],
                    Heizung: { out: { PumpeEin: false, VentilAuf: false, VentilZu: false } },
                    config: {
                      isDataFetched: false
                    }
                  }
                },
              
                // ------------------------------------------------------------------------------------------------------
                //    ACTIONS
                // ------------------------------------------------------------------------------------------------------
                actions: {
                  // States von ioBroker im Store aktualisieren
                  ioBrokerUpdate({ commit }, { ioBrokerID, ioBrokerState }) {
                    commit("IOBROKER_UPDATE", { ioBrokerID, ioBrokerState });
                    commit("IOBROKER_MOD");
                  },
              
                  // Beim Laden alle States einmal einlesen
                  ioBrokerInit({ commit }, ioBrokerStates) {
                    commit("IOBROKER_INIT", ioBrokerStates);
                    commit("IOBROKER_MOD");
                  },
                  // States an ioBroker senden
                  ioBrokerSetState({ commit }, { ioBrokerID, ioBrokerState }) {
                    commit("IOBROKER_SETSTATE", { ioBrokerID, ioBrokerState });
                  }
                },
              
                // ------------------------------------------------------------------------------------------------------
                //    MUTATIONS
                // ------------------------------------------------------------------------------------------------------
                mutations: {
                  // States von ioBroker im Store aktualisieren
                  IOBROKER_UPDATE(state, { ioBrokerID, ioBrokerState }) {
                    state.ioBroker.states[ioBrokerID] = ioBrokerState;
                  },
              
                  // States von ioBroker im Store aktualisieren
                  IOBROKER_INIT(state, ioBrokerStates) {
                    state.ioBroker.states = ioBrokerStates;
                    state.ioBroker.config.isDataFetched = true;
                  },
              
                  // Spezifische ioBroker State-Modifikationen
                  IOBROKER_MOD(state) {
                    var TempState =
                      state.ioBroker.states["modbus.0.inputRegisters.3998_Heizung_Ausgaenge"];
                    state.ioBroker.Heizung.out.VentilAuf = (TempState.val & 1) == 1;
                    state.ioBroker.Heizung.out.VentilZu = (TempState.val & 2) == 2;
                    state.ioBroker.Heizung.out.PumpeEin = (TempState.val & 64) == 64;
                  }
                },
              
                // ------------------------------------------------------------------------------------------------------
                //    GETTERS
                // ------------------------------------------------------------------------------------------------------
                getters: {
                  GETioBroker: state => ioBrokerID => {
                    return state.ioBroker.states[ioBrokerID];
                  },
              
                  HomematicDevice: state => HMdevice => {
                    for (var i = 0; i <= state.homematic.devices.length; i++) {
                      if (state.homematic.devices[i].name == HMdevice) {
                        return state.homematic.devices[i];
                      }
                    }
                  }
                }
              });
              

              Meine conn.js Datei. Diese musste auch noch etwas angepasst werden.

              Ich hoffe die Beschreibung hilft etwas beim Anbinden deiner Vue.js Instanz. Bei mir läuft das ganze bisher ohne Probleme. Leider bin ich kein Profi und habe mir das ganze per Selbststudium versucht beizubringen. Bitte geht bei Fehlern nicht zu hart mit mir ins Gericht ;-)

              Gruß Florian

              P Offline
              P Offline
              PSchuBu
              schrieb am zuletzt editiert von
              #6

              @bombel ich hole diesen Thread mal aus der Versenkung. Mich würde mal interessieren, ob jemand eine Anbindung mit VueJS 3 und Vuex umgesetzt hat. Ich bekomme es zwar hin, dass meine Aktualisierungen im Store landen aber die Initialisierung klappt nicht. Hat da wer einen Ansatz, wie die onConnChange aussehen muss und wo ich sie aufrufen soll? Hab's bisher bei beforeMount() eingebunden. Aber irgendwie gehts nicht ...

              Danke für eure Hilfe.

              Peter

              1 Antwort Letzte Antwort
              0
              Antworten
              • In einem neuen Thema antworten
              Anmelden zum Antworten
              • Älteste zuerst
              • Neuste zuerst
              • Meiste Stimmen


              Support us

              ioBroker
              Community Adapters
              Donate

              868

              Online

              32.5k

              Benutzer

              81.7k

              Themen

              1.3m

              Beiträge
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
              ioBroker Community 2014-2025
              logo
              • Anmelden

              • Du hast noch kein Konto? Registrieren

              • Anmelden oder registrieren, um zu suchen
              • Erster Beitrag
                Letzter Beitrag
              0
              • Home
              • Aktuell
              • Tags
              • Ungelesen 0
              • Kategorien
              • Unreplied
              • Beliebt
              • GitHub
              • Docu
              • Hilfe