Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [Vorlage] Alias per Skript erzeugen

    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

    [Vorlage] Alias per Skript erzeugen

    This topic has been deleted. Only users with topic management privileges can see it.
    • lobomau
      lobomau @bishop last edited by

      Ich habe in meinen Alias folgenden Fehler. Im Script muss da wohl etwas angepasst werden. Weiß jemand was? Als Beispiel habe ich einen Alias error hingeschrieben. Ist bei fast allen anderen im Script auch so.

      Alias subscription error. Please check your alias definitions: sourceId=tesla-motors.0.LRW3E7EK4MC387xxx.charge_state.usable_battery_level, sourceObj={"type":"state","common":{"name":"usable_battery_level","role":"value","type":"number","write":false,"read":true},"native":{},"from":"system.adapter.tesla-motors.0","user":"system.user.admin","ts":1644763935883,"_id":"tesla-motors.0.LRW3E7EK4MC387xxx.charge_state.usable_battery_level","acl":{"object":1636,"state":1636,"owner":"system.user.admin","ownerGroup":"system.group.administrator"}}
      

      Script:

      // Originalversion: User Paul53, https://forum.iobroker.net/topic/27295/vorlage-alias-per-skript-erzeugen
      // Angepasst an die asynchrone Eigenschaft von Javascript, kleine Ergänzungen.
      
      const vin = "LRW3E7EK4MC387xxx"; // VIN des Teslas eintragen 
      const prefix = 'alias.0.';
      const custhist = {
           /* "history.0": {
              "enabled": true,
              "changesOnly": true,
              "debounce": "200",
              "maxLength": "960",
              "retention": "1209600",
              "changesRelogInterval": "0",
              "changesMinDelta": 0,
              "aliasId": ""
            }, */
            "influxdb.0": {
              "enabled": true,
              "changesOnly": true,
              "debounce": "200",
              "retention": "63072000", 
              "changesRelogInterval": "0",
              "changesMinDelta": 0,
              "storageType": "",
              "aliasId": ""
            }
          };
       
      // Aliasdefinition als Array of Objects
      var aa = [
      /***
      {
          idOrigin : prefix + '',      // Orignal-Datenpunkt
          idRead : '',        // Status-Datenpunkt, wenn Status und Kommando getrennt. Leer wenn keine Trennung
          idAlias : prefix + '',       // Alias-Datenpunkt
          recreate : false,   // true: evtl. existierender Alias wird gelöscht - EXPERIMENTAL
          extend : true,      // true: evtl. existierender Alias wird ergänzt - EXPERIMENTAL: extendObject() statt setObject()
          typeAlias : '',     // Datentyp für Alias: number, boolean, mixed
          read : '',          // "val < 20 ? true : false" // Erkennung "Aus" --> false erfolgt automatisch
          write : '',         // "val ? 'Ein' : 'Aus'"
          nameAlias : '',     // Bezeichnung
          role : '',          // ioBroker Rolle
          desc : '',          // Beschreibung
          min : 0,            // Minimalwert, nur bei Datentyp number
          max : 100,          // Maximalwert, nur bei Datentyp number
          unit : '',          // Einheit bei Datentyp number: %, W, °C, usw.
          states : '',        // {0: 'Aus', 1: 'Auto', 2: 'Ein'}; // Zahlen (Multistate) oder Logikwert (z.B. Aus/Ein)
          custom : [];        // leeres Array wird automatisch gesetzt, falls nichts angegeben. Verhindert doppelte Ausführung von
          history, ...
          raum : '',          // enum.room, Groß-/Kleinschreibung in der ID beachten
          gewerk : '',        // enum.function, Groß-/Kleinschreibung in der ID beachten
          owner : '',         // Owner, etwa system.user.admin
          group : '',         // Group, etwa system.group.familie
      },
      ***/
       
      // ---------------------------------------------------------------------------
      // Tesla charge
      // ----------------------------------------------------------------------------
      {
      	idAlias : prefix + 'Tesla.charge_state.charge_port_latch',
      	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.charge_port_latch',
      	recreate : true,
      	extend : true,
      	nameAlias : 'Tesla charge_port_latch',
      	raum : 'tesla',
      	custom : custhist,
      	owner : "system.user.admin",
      	group : "system.group.user"
      },
      {
      	idAlias : prefix + 'Tesla.charge_state.battery_heater_on',
      	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.battery_heater_on',
      	recreate : true,
      	extend : true,
      	nameAlias : 'Tesla battery_heater_on',
      	raum : 'tesla',
      	custom : custhist,
      	owner : "system.user.admin",
      	group : "system.group.user"
      },
      {
      	idAlias : prefix + 'Tesla.charge_state.battery_level',
      	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.battery_level',
      	recreate : true,
      	extend : true,
      	nameAlias : 'Tesla battery_level',
          unit : '%',
      	raum : 'tesla',
      	custom : custhist,
      	owner : "system.user.admin",
      	group : "system.group.user"
      },
      {
      	idAlias : prefix + 'Tesla.charge_state.battery_range_km',
      	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.battery_range_km',
      	recreate : true,
      	extend : true,
      	nameAlias : 'Tesla battery_range',
          unit : 'km',
      	raum : 'tesla',
      	custom : custhist,
      	owner : "system.user.admin",
      	group : "system.group.user"
      },
      {
      	idAlias : prefix + 'Tesla.charge_state.charge_energy_added',
      	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.charge_energy_added',
      	recreate : true,
      	extend : true,
      	nameAlias : 'Tesla charge_energy_added',
          unit : 'kWh',
      	raum : 'tesla',
      	custom : custhist,
      	owner : "system.user.admin",
      	group : "system.group.user"
      },
      {
      	idAlias : prefix + 'Tesla.charge_state.charge_limit_soc',
      	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.charge_limit_soc',
      	recreate : true,
      	extend : true,
      	nameAlias : 'Tesla charge_limit_soc',
          unit : '%',
      	raum : 'tesla',
      	custom : custhist,
      	owner : "system.user.admin",
      	group : "system.group.user"
      },
      {
      	idAlias : prefix + 'Tesla.charge_state.charge_km_added_rated',
      	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.charge_miles_added_rated',
      	recreate : true,
      	extend : true,
      	nameAlias : 'Tesla charge_km_added_rated',
          unit : 'km',
      	raum : 'tesla',
      	custom : custhist,
      	owner : "system.user.admin",
      	group : "system.group.user"
      },
      {
      	idAlias : prefix + 'Tesla.charge_state.charge_rate',
      	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.charge_rate',
      	recreate : true,
      	extend : true,
      	nameAlias : 'Tesla charge_rate',
          //unit : 'km',
      	raum : 'tesla',
      	custom : custhist,
      	owner : "system.user.admin",
      	group : "system.group.user"
      },
      {
      	idAlias : prefix + 'Tesla.charge_state.charger_power',
      	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.charger_power',
      	recreate : true,
      	extend : true,
      	nameAlias : 'Tesla charger_power',
          //unit : 'km',
      	raum : 'tesla',
      	custom : custhist,
      	owner : "system.user.admin",
      	group : "system.group.user"
      },
      {
      	idAlias : prefix + 'Tesla.charge_state.charging_state',
      	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.charging_state',
      	recreate : true,
      	extend : true,
      	nameAlias : 'Tesla charging_state',
          //unit : 'km',
      	raum : 'tesla',
      	custom : custhist,
      	owner : "system.user.admin",
      	group : "system.group.user"
      },
      {
      	idAlias : prefix + 'Tesla.charge_state.est_battery_range_km',
      	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.est_battery_range_km',
      	recreate : true,
      	extend : true,
      	nameAlias : 'Tesla est_battery_range_km',
          unit : 'km',
      	raum : 'tesla',
      	custom : custhist,
      	owner : "system.user.admin",
      	group : "system.group.user"
      },
      {
      	idAlias : prefix + 'Tesla.charge_state.fast_charger_present',
      	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.fast_charger_present',
      	recreate : true,
      	extend : true,
      	nameAlias : 'Tesla fast_charger_present',
          //unit : 'km',
      	raum : 'tesla',
      	custom : custhist,
      	owner : "system.user.admin",
      	group : "system.group.user"
      },
      {
      	idAlias : prefix + 'Tesla.charge_state.ideal_battery_range_km',
      	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.ideal_battery_range_km',
      	recreate : true,
      	extend : true,
      	nameAlias : 'Tesla ideal_battery_range_km',
          unit : 'km',
      	raum : 'tesla',
      	custom : custhist,
      	owner : "system.user.admin",
      	group : "system.group.user"
      },
      {
      	idAlias : prefix + 'Tesla.charge_state.minutes_to_full_charge',
      	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.minutes_to_full_charge',
      	recreate : true,
      	extend : true,
      	nameAlias : 'Tesla minutes_to_full_charge',
          unit : 'min',
      	raum : 'tesla',
      	custom : custhist,
      	owner : "system.user.admin",
      	group : "system.group.user"
      },
      {
      	idAlias : prefix + 'Tesla.charge_state.preconditioning_enabled',
      	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.preconditioning_enabled',
      	recreate : true,
      	extend : true,
      	nameAlias : 'Tesla preconditioning_enabled',
          //unit : 'min',
      	raum : 'tesla',
      	custom : custhist,
      	owner : "system.user.admin",
      	group : "system.group.user"
      },
      {
      	idAlias : prefix + 'Tesla.charge_state.usable_battery_level',
      	idOrigin : 'tesla-motors.0.' + vin + '.charge_state.usable_battery_level',
      	recreate : true,
      	extend : true,
      	nameAlias : 'Tesla usable_battery_level',
          unit : '%',
      	raum : 'tesla',
      	custom : custhist,
      	owner : "system.user.admin",
      	group : "system.group.user"
      },
      ];
       
       
      // ******************************
       
      // -------------------------------------------------
      // -------------------------------------------------
      function alias2enum(a, en, cb) {
          cb = (typeof(cb) === 'function') ? cb : function() {};
          if (en) {
              var o = getObject(en); 
              if(o) {
                  if (!o.common.members.includes(a)) {
                      o.common.members.push(a);
                      setObject(en, o, function(e, o) { cb(); });
                  } else cb();
              } else {
                  log('alias2enum: ' + en + ' cannot get object', 'warn');
                  cb();
              }
      	} else {
              log('alias2enum: ' + en + ' is invalid', 'warn');
              cb();
          }
      }    
       
       
      // ---------------------------------------------------
      // ---------------------------------------------------
      function createAlias(o, cb) {
          var obj = {};
          
          cb = (typeof(cb) === 'function') ? cb : function() {};
       
          if (!o || ! o.idOrigin || !o.idAlias) {
              log(o, 'error');
          }
          
          if (!existsState(o.idOrigin)) {
              log(o.idOrigin + ' existiert nicht', 'warn');
              cb();
              return;
          }
       
          if (existsState(o.idAlias)) {
              if (o.recreate) {
                  log(o.idAlias + ' wird gelöscht', 'warn');    
                  // EXPERIMENTAL
                  // deleteObject() gibt keinen Fehler aus, löscht aber auch nicht.
                  // falsche Anwendung? --> Recherchieren... ;-)
                  // workaround: recreate auf false und extend auf true setzen.
                  deleteObject(o.idAlias, false, function(err, obj) {
                      o.recreate = false;
                      o.extend = true;
                      createAlias(o, cb);
                      return;
                  });
              } else if (!o.extend) {
                  log(o.idAlias + ' schon vorhanden')
                  cb();
                  return;
              } else {
                  log(o.idAlias + ' wird ergänzt');
              }
          } else {
              log(o.idAlias + ' wird angelegt');
          }
       
          obj.type = 'state';
          obj.common = getObject(o.idOrigin).common;
          obj.acl = getObject(o.idOrigin).acl;
          obj.common.alias = {};
       
          if(o.idRead) {
              obj.common.alias.id = {};
              obj.common.alias.id.read = o.idRead;
              obj.common.alias.id.write = o.idOrigin;
              obj.common.read = true;
          } else obj.common.alias.id = o.idOrigin;
          
          if(o.typeAlias) obj.common.type = o.typeAlias;
          if(obj.common.read !== false && o.read) obj.common.alias.read = o.read;
          if(obj.common.write !== false && o.write) obj.common.alias.write = o.write;
          if(o.nameAlias) obj.common.name = o.nameAlias;
          if(o.role) obj.common.role = o.role;
          if(o.desc) obj.common.desc = o.desc;
          if(o.min !== undefined) obj.common.min = o.min;
          if(o.max !== undefined) obj.common.max = o.max;
          if(o.unit) obj.common.unit = o.unit;
          if(o.states) obj.common.states = o.states;
          if(o.owner && obj.acl.owner) obj.acl.owner = o.owner;
          if(o.group && obj.acl.ownerGroup) obj.acl.ownerGroup = o.group;
        
          if(o.custom) {
              obj.common.custom = o.custom;
          } else {
              obj.common.custom = [];
          }
          
          obj.native = {};
      	
          // EXPERIMENTAL
          // Auswirkung von extendObject() auf Historydaten?
          extendObject(o.idAlias, obj, function(e, oa) {
              if (e) {
                  log('Alias ' + o.idAlias + ' nicht angelegt - Fehler ' + e, 'error');
                  cb();
                  return;
              }
              log(o.idAlias + ' wird zum Raum ' + o.raum + ' hinzugefügt', 'info');
              alias2enum(o.idAlias, 'enum.rooms.' + o.raum, function() {
                  if (o.gewerk) {
                      log(o.idAlias + ' wird zur Funktion ' + o.gewerk + ' hinzugefügt', 'info');
                      alias2enum(o.idAlias, 'enum.funtions.' + o.gewerk, cb);
                  } else cb();
              });
          }); 
      }
       
       
      // ---------------------------------------------------
      // ---------------------------------------------------
      function createAliases() {
      	if (!aa) return;
      	if (!aa.length) return;
      	createAlias(aa.shift(), createAliases);
      }
       
       
      // *******************************
       
      createAliases();
      
      Garfonso 1 Reply Last reply Reply Quote 0
      • Garfonso
        Garfonso Developer @lobomau last edited by

        @lobomau said in [Vorlage] Alias per Skript erzeugen:

        tesla-motors.0.LRW3E7EK4MC387xxx.charge_state.usable_battery_level

        gibt es das Objekt tesla-motors.0.LRW3E7EK4MC387xxx.charge_state.usable_battery_level denn?

        lobomau 1 Reply Last reply Reply Quote 0
        • lobomau
          lobomau @Garfonso last edited by

          @garfonso ja, nur die xxx habe ich hier anonymisiert. Die Aliase funktioneren ansonsten auch. Kommt halt nur dieser Fehler. Bzw. ich hab in log grad geschaut und heute war der Fehler noch nicht.

          H 1 Reply Last reply Reply Quote 0
          • H
            homecineplexx @lobomau last edited by

            kann man zb unter einem Alias Ordner, wo von einem Device Alias-Datenpunkte liegen auch einen nicht Alias anlegen, dem ich einen Namen vergeben kann, den ich auch verwenden kann?

            lobomau 1 Reply Last reply Reply Quote 0
            • lobomau
              lobomau @homecineplexx last edited by lobomau

              @homecineplexx kann man erstmal machen. Ob es funktioniert und welche Nachteile es hat kann ich nicht sagen. Eigentlich hat man dafür ja "0_userdata".

              Mal testweise angelegt:
              83aaa6ba-7ef9-490c-8bd5-06d9a79ee04a-image.png

              admin warnt natürlich dass hier ein Alias ohne Ziel ist:

              
              admin.0
              2022-02-18 10:00:46.889	warn	Alias alias.0.Neuer_Ordner.Test has no target 9
              
              H 1 Reply Last reply Reply Quote 0
              • H
                homecineplexx @lobomau last edited by

                @lobomau said in [Vorlage] Alias per Skript erzeugen:

                "0_userdata".

                ja mag schon sein, aber ich hab ehrlich gesagt keine lust, dass ich teile eines Devices im Alias habe und andere wiederrum im userdata, was aus meiner Sicht auch keinen Sinn ergibt, wenn ich was suche.

                also per JavaScript konnte ich zwar so ein Objekt anlegen, aber keinen Wert zuweisen

                paul53 da_Woody 2 Replies Last reply Reply Quote 0
                • paul53
                  paul53 @homecineplexx last edited by

                  @homecineplexx sagte: keine lust, dass ich teile eines Devices im Alias habe und andere wiederrum im userdata,

                  Das lässt sich nicht vermeiden. Möglichst identische Ordner-Strukturen für beides verwenden.

                  1 Reply Last reply Reply Quote 0
                  • da_Woody
                    da_Woody @homecineplexx last edited by

                    @homecineplexx sagte in [Vorlage] Alias per Skript erzeugen:

                    keine lust

                    ist mal keine gute einstellung...
                    aber, warum legst du den DP nicht in userdate.0 an und machst dann einen alias davon?

                    paul53 H 2 Replies Last reply Reply Quote 0
                    • paul53
                      paul53 @da_Woody last edited by

                      @da_woody sagte: machst dann einen alias davon?

                      Ist auch eine Variante, die allerdings Ressourcen verschwendet.

                      da_Woody 1 Reply Last reply Reply Quote 0
                      • da_Woody
                        da_Woody @paul53 last edited by

                        @paul53 klar, aber wenn wer keine lust hat... 😉

                        1 Reply Last reply Reply Quote 0
                        • H
                          homecineplexx @da_Woody last edited by

                          @da_woody said in [Vorlage] Alias per Skript erzeugen:

                          @homecineplexx sagte in [Vorlage] Alias per Skript erzeugen:

                          keine lust

                          ist mal keine gute einstellung...
                          aber, warum legst du den DP nicht in userdate.0 an und machst dann einen alias davon?

                          das ist vielleicht eine gute Idee....ab und zu ist man so verbissen in eine Idee, dass man das rundherum nicht sieht...danke

                          1 Reply Last reply Reply Quote 2
                          • C
                            CBMOD @paul53 last edited by CBMOD

                            @paul53

                                 let obj = getObject('enum.functions.' + gewerk)
                                 obj.common.members.push(idDst);
                                 setObject('enum.functions.' + gewerk, obj);
                            

                            das setzen des Gewerks (Function) mit setObject funktioniert ! - aber wie kann ich es via script wieder entfernen?
                            bei dem Versuch mit delete object löscht es mir das komplette Gewerk

                            da_Woody paul53 2 Replies Last reply Reply Quote 0
                            • da_Woody
                              da_Woody @CBMOD last edited by

                              @cbmod das script in allen ehren, aber warum verwendest du nicht den Alias Manager?

                              F 1 Reply Last reply Reply Quote 0
                              • paul53
                                paul53 @CBMOD last edited by paul53

                                @cbmod sagte: wie kann ich es via script wieder entfernen?

                                Objekt einlesen, Element im Array obj.common.members löschen und Objekt schreiben.

                                @da_woody sagte in [Vorlage] Alias per Skript erzeugen:

                                warum verwendest du nicht den Alias Manager?

                                Ja, mittlerweile gibt es Adapter zum Alias erzeugen.

                                da_Woody 1 Reply Last reply Reply Quote 0
                                • da_Woody
                                  da_Woody @paul53 last edited by

                                  @paul53 ich denke, du kannst damit leben. ich hab ja auch mit deinem script angefangen, darum "in allen ehren" 🙂
                                  mit dem adapter ist aber auch das bearbeiten der aliase viel einfacher...
                                  trotzdem danke für dein script damals!

                                  paul53 1 Reply Last reply Reply Quote 0
                                  • paul53
                                    paul53 @da_Woody last edited by

                                    @da_woody sagte: ich denke, du kannst damit leben.

                                    Ja, natürlich. Ich verwende auch den Alias-Manager.

                                    1 Reply Last reply Reply Quote 1
                                    • F
                                      FuXXz2 @da_Woody last edited by

                                      @da_woody Mit dem Alias Manager kann ich auch mit EINEM Mausklick, in meinem Fall, 90 Aliase erstellen?🤔

                                      Kann ich eigentlich den Teil mit "nameAlias" mit mehreren Aliasen füllen? Ich möchte, dass einige Geräte in zwei Funktionen aufgenommen werden.

                                      da_Woody 1 Reply Last reply Reply Quote 0
                                      • da_Woody
                                        da_Woody @FuXXz2 last edited by

                                        @fuxxz2 mit einem mausklick? wie stellst du dir das vor?

                                        in meinem Fall, 90 Aliase erstellen?

                                        90? 😄 sparsamst hast du 4-6 aliase pro gerät, außer du willst nur schalten und keine anderen infos.
                                        du musst dir mal eine struktur überlegen. dann nimmst du ein gerät in deinen objekten, z.b.
                                        bee8085d-6999-4d4a-a91a-780b36112bbf-grafik.png
                                        trägst da deine struktur ein
                                        63874111-d85a-47a5-8fa1-eb7a9176e501-grafik.png b1c112a4-707e-4b3b-bd4b-620adbeddf31-grafik.png c3486d9d-de80-4f57-9bb5-d63aa1c3dcb5-grafik.png
                                        suchst dir die DP aus, die du brauchst und bekommst
                                        1c93b8c4-40ab-49a9-b01d-a480d3a73dff-grafik.png

                                        F 1 Reply Last reply Reply Quote 0
                                        • F
                                          FuXXz2 @da_Woody last edited by FuXXz2

                                          @da_woody Ich muss dann wohl leider mit dem Umstand leben, der Einzige zu sein, der mit dem Alias-Manager so gar nicht klar kommt.
                                          Egal was ich da drin mache, danach geht bei mir immer gar nix mehr. Da hilft meist nur, alle Aliase löschen und dann das Script für Aliase erstellen einmal neu zu starten. Dann habe ich zumindest alles wieder da 🙂

                                          Erstelle ich nun einen Alias automatisch, ein Shelly z.B.
                                          Dann kann ich irgendwie keine Ordner anlegen, zudem möchte ich einfach nur den shelly.0.SHSW-1#40F5201DDADA#1.Relay0.Switch Datenpunkt als Alias.
                                          Und zwar in diesem Format:
                                          alias.0.Licht.KZ-Spiel_Wandlampe
                                          Screenshot 2022-10-23 021027.png

                                          Bei einem Sonoff das gleiche Spiel, er nennt den Alias dann XX POWER
                                          Screenshot 2022-10-23 021502.png

                                          Das heißt, obwohl ich nur einen Datenpunkt als Alias pro Gerät möchte, muss ich manuell den Ordner anpassen und den Namen.

                                          Daher zu meiner ursprünglichen Frage:
                                          Kann ich eigentlich den Teil mit "nameAlias" mit mehreren Aliasen füllen? Ich möchte, dass einige Geräte in zwei Funktionen aufgenommen werden.

                                          da_Woody 1 Reply Last reply Reply Quote 0
                                          • da_Woody
                                            da_Woody @FuXXz2 last edited by da_Woody

                                            @fuxxz2 0594d1db-76c7-4c2f-9e46-339957d944ad-grafik.png
                                            wo ist das problem? hab gerade testweise ein raumlicht (shelly1) genommen. ist der selbe wie der:
                                            de3b6a92-e40c-478e-b91b-82d70f344fcf-grafik.png
                                            funktioniert astrein...

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            926
                                            Online

                                            31.9k
                                            Users

                                            80.1k
                                            Topics

                                            1.3m
                                            Posts

                                            38
                                            314
                                            48491
                                            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