Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Node.js Script in iobroker integrieren

    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

    Node.js Script in iobroker integrieren

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

      könntest Du bitte eine Anleitung für "Dummies" erstellen? Was genau muss zu erst installiert werden? Danke

      R 1 Reply Last reply Reply Quote 0
      • R
        rettroo @pseudoreal last edited by

        @pseudoreal
        Hi, kann ich machen sobald ich alles fertig habe. Die Dahua hängt zur Zeit auch noch nicht an der Tür sondern in meinem Büro 😉

        pseudoreal 1 Reply Last reply Reply Quote 1
        • R
          rettroo @UncleSam last edited by

          Hi @unclesam,

          das Script hat soweit schon ganz gut funktioniert, nun startet es aber nicht mehr und ich bekomme folgenden Fehler.
          Was hat es mit dem MD5 auf sich?

          
          host.debian	2021-03-10 14:02:45.431	info	instance system.adapter.javascript.0 started with pid 2673
          host.debian	2021-03-10 14:02:15.418	info	Restart adapter system.adapter.javascript.0 because enabled
          host.debian	2021-03-10 14:02:15.418	error	instance system.adapter.javascript.0 terminated with code 1 (JS_CONTROLLER_STOPPED)
          host.debian	2021-03-10 14:02:15.418	error	Caught by controller[0]: at TCP.onStreamRead (internal/stream_base_commons.js:188:23)
          host.debian	2021-03-10 14:02:15.418	error	Caught by controller[0]: at Socket.Readable.push (_stream_readable.js:214:10)
          host.debian	2021-03-10 14:02:15.418	error	Caught by controller[0]: at readableAddChunk (_stream_readable.js:273:9)
          host.debian	2021-03-10 14:02:15.418	error	Caught by controller[0]: at addChunk (_stream_readable.js:298:12)
          host.debian	2021-03-10 14:02:15.418	error	Caught by controller[0]: at Socket.EventEmitter.emit (domain.js:483:12)
          host.debian	2021-03-10 14:02:15.417	error	Caught by controller[0]: at Socket.emit (events.js:314:20)
          host.debian	2021-03-10 14:02:15.417	error	Caught by controller[0]: at DahuaVTO.receive (script.js.DAHUA.Dahua_Script:287:12)
          host.debian	2021-03-10 14:02:15.417	error	Caught by controller[0]: at DahuaVTO.handleFirstLoginPayload (script.js.DAHUA.Dahua_Script:330:27)
          host.debian	2021-03-10 14:02:15.417	error	Caught by controller[0]: at DahuaVTO.genMD5Hash (script.js.DAHUA.Dahua_Script:401:24)
          host.debian	2021-03-10 14:02:15.417	error	Caught by controller[0]: TypeError: md5 is not a function
          mqtt.0	2021-03-10 14:02:15.400	info	(1533) Client [mqttjs_09066ccf] connection closed: closed
          javascript.0	2021-03-10 14:02:15.386	error	(2658) at TCP.onStreamRead (internal/stream_base_commons.js:188:23)
          javascript.0	2021-03-10 14:02:15.385	error	(2658) at Socket.Readable.push (_stream_readable.js:214:10)
          javascript.0	2021-03-10 14:02:15.385	error	(2658) at readableAddChunk (_stream_readable.js:273:9)
          javascript.0	2021-03-10 14:02:15.385	error	(2658) at addChunk (_stream_readable.js:298:12)
          javascript.0	2021-03-10 14:02:15.385	error	(2658) at Socket.EventEmitter.emit (domain.js:483:12)
          javascript.0	2021-03-10 14:02:15.385	error	(2658) at Socket.emit (events.js:314:20)
          javascript.0	2021-03-10 14:02:15.385	error	(2658) at DahuaVTO.receive (script.js.DAHUA.Dahua_Script:286:12)
          javascript.0	2021-03-10 14:02:15.385	error	(2658) at DahuaVTO.handleFirstLoginPayload (script.js.DAHUA.Dahua_Script:329:27)
          javascript.0	2021-03-10 14:02:15.385	error	(2658) at DahuaVTO.genMD5Hash (script.js.DAHUA.Dahua_Script:400:24)
          javascript.0	2021-03-10 14:02:15.385	error	(2658) script.js.DAHUA.Dahua_Script: TypeError: md5 is not a function
          mqtt.0	2021-03-10 14:02:15.356	info	(1533) Client [mqttjs_09066ccf] connected with secret 1615381335356_7933
          javascript.0	2021-03-10 14:02:15.292	info	(2658) script.js.DAHUA.Dahua_Script: registered 0 subscriptions and 0 schedules
          javascript.0	2021-03-10 14:02:15.246	error	(2658) at Script.runInContext (vm.js:130:18)
          javascript.0	2021-03-10 14:02:15.246	error	(2658) at script.js.DAHUA.Dahua_Script:518:3
          javascript.0	2021-03-10 14:02:15.246	error	(2658) at script.js.DAHUA.Dahua_Script:5:13
          javascript.0	2021-03-10 14:02:15.245	error	(2658) at require (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:397:36)
          javascript.0	2021-03-10 14:02:15.245	error	(2658) at require (internal/modules/cjs/helpers.js:74:18)
          javascript.0	2021-03-10 14:02:15.245	error	(2658) at Module.require (internal/modules/cjs/loader.js:903:19)
          javascript.0	2021-03-10 14:02:15.245	error	(2658) script.js.DAHUA.Dahua_Script: Error: Cannot find module '/opt/iobroker/node_modules/iobroker.javascript/lib/../../md5'
          
          UncleSam 1 Reply Last reply Reply Quote 0
          • UncleSam
            UncleSam Developer @rettroo last edited by

            @rettroo Hast du das md5 Modul installiert?

            const md5 = require('md5');

            Sollte eigentlich schief gehen, wenn du md5 nicht installiert hast, was ich etwas komisch finde. Hast du das etwa aus dem Skript gelöscht?

            1 Reply Last reply Reply Quote 0
            • pseudoreal
              pseudoreal @rettroo last edited by

              @rettroo
              also ich habe jetzt den MQTT server installiert. Das Script in Javascript erstellt und alle Instanzen gestartet. Ich bekomme den Fehler:
              (20360) FetchError: request to https://192.168.178.10:443/cgi-bin/magicBox.cgi?action=getSystemInfo failed, reason: unable to verify the first certificate

              Unter Instanzen ist jedoch MQTT gelb und auch im Script sebst sind mir einige Zeilen als Fehler unterstrichen - zB const DigestFetch = require('digest-fetch');
              md5 und digest-fetch sind aber in der JavaScript instanz aktiviert.

              UncleSam R 2 Replies Last reply Reply Quote 0
              • UncleSam
                UncleSam Developer @pseudoreal last edited by

                @pseudoreal sagte in Node.js Script in iobroker integrieren:

                request to https://192.168.178.10:443/cgi-bin/magicBox.cgi?action=getSystemInfo failed, reason: unable to verify the first certificate

                Da steht ja die Fehlermeldung. Du machst HTTPS und das Zertifikat ist ungültig. Muss es denn HTTPS sein? Wie du die Zertifikatsüberprüfung ausschaltest, kann ich dir leider auch nicht sagen (ich kenne digest-fetch nicht).

                1 Reply Last reply Reply Quote 0
                • R
                  rettroo @pseudoreal last edited by

                  @pseudoreal

                  Hi,

                  wie von @UncleSam angemerkt würde ich das "s" mal weglassen also "http://

                  MQTT sollte erst grün werden wenn sich das Script mit Dahua verbindet

                  pseudoreal 1 Reply Last reply Reply Quote 0
                  • pseudoreal
                    pseudoreal @rettroo last edited by

                    @rettroo @UncleSam
                    ok, ich habe das https weggelassen uns nun klappt die Verbindung und ich sehe auch im Script log, wenn sich jemand bewegt (VideoEvent) oder jemand klingelt (Invite).

                    Jetzt fehlt mir nur noch die Information wie ich diese in iobroker weiterverarbeite, damit mir zB eine WhatsApp geschickt wird. Habe hier schon gesucht, aber leider nichts gefunden - wahrscheinlich falsche Suchbegriffe. Habt ihr irgendwo ein gutes Tutorial, wie man nun mit den Werten in MQTT weiterarbeitet?

                    UncleSam 1 Reply Last reply Reply Quote 0
                    • UncleSam
                      UncleSam Developer @pseudoreal last edited by

                      @pseudoreal sagte in Node.js Script in iobroker integrieren:

                      Jetzt fehlt mir nur noch die Information wie ich diese in iobroker weiterverarbeite, damit mir zB eine WhatsApp geschickt wird. Habe hier schon gesucht, aber leider nichts gefunden - wahrscheinlich falsche Suchbegriffe. Habt ihr irgendwo ein gutes Tutorial, wie man nun mit den Werten in MQTT weiterarbeitet?

                      @pseudoreal Du füllst Datenpunkte ab und schreibst Skripte, Blocklys oder machst Rules. Das hat dann nichts mehr mit deinem Skript zu tun sondern ist ganz gewöhnliches Skripting in ioBroker.

                      pseudoreal 1 Reply Last reply Reply Quote 0
                      • pseudoreal
                        pseudoreal @UncleSam last edited by

                        @unclesam @rettroo
                        Danke - das stimmt. Ich habe das via blockly hinbekommen. Habe aber noch folgendes Problem, wie kann ich aus MQTT einen speziellen String aus dem Wert in den Objekten rauslesen und in Blockly verarbeiten?

                        UncleSam 1 Reply Last reply Reply Quote 0
                        • UncleSam
                          UncleSam Developer @pseudoreal last edited by

                          @pseudoreal was meinst du damit? Kannst du mal in einem Screenshot zeigen, was du wo hast und was du daraus haben willst?

                          pseudoreal 1 Reply Last reply Reply Quote 0
                          • pseudoreal
                            pseudoreal @UncleSam last edited by

                            @unclesam
                            im Objekt von MQTT habe ich eines der VTO, welches FingerPrintCheck heißt. Das dazugehörige Event hat unter Wert, den folgenden Eintrag:
                            {"Data":{"FingerPrintID":6,"LocaleTime":"2021-05-03 08:17:42","UTC":1620026262},"deviceType":"VTO4202F","serialNumber":"xxxxxxxxxx"}

                            Ich bräuchte nun den Datenpunkt FingerPrintID im Blockly, da ich gerne nur bei nicht erfolgreichen Fingerabdruckscans eine Aktion auslösen möchte. In einem anderen Thread wurde mir diese Seite empfohlen - https://www.machs-smart.de/json-blockly-einlesen-parsen-verarbeiten/
                            Ich schau mir das mal an.

                            Danke

                            UncleSam oldi-2000 2 Replies Last reply Reply Quote 0
                            • UncleSam
                              UncleSam Developer @pseudoreal last edited by

                              @pseudoreal Genau, ich würde einfach in einem Blockly oder JavaScript das JSON parsen und dann in einen Datenpunkt abfüllen. Das sollte recht einfach sein. Mit Blockly kann ich aber leider nicht weiterhelfen, das verwende ich nie.

                              1 Reply Last reply Reply Quote 0
                              • oldi-2000
                                oldi-2000 @pseudoreal last edited by

                                @pseudoreal Hallo ich hänge gerade genau an dem Thema Json parsen und hab leider null Ahnung davon ich habe ein Vto 4202 habe das Skript und den mqtt Adapter am laufen und bräuchte jetzt aber normale Datenpunkte z. B. für die einen Gong aber auch wenn möglich für den Türoffner usw. Hast du mir vielleicht ein Skript das funktioniert?

                                F 1 Reply Last reply Reply Quote 0
                                • F
                                  fastfoot @oldi-2000 last edited by

                                  @oldi-2000 poste mal so ein json

                                  oldi-2000 1 Reply Last reply Reply Quote 0
                                  • oldi-2000
                                    oldi-2000 @fastfoot last edited by

                                    @fastfoot

                                    {
                                      "Data": {
                                        "LocaleTime": "2021-11-20 20:12:39",
                                        "State": 9,
                                        "UTC": 1637439159
                                      },
                                      "deviceType": "VTO4202F-P-S2",
                                      "serialNumber": "7H05F88PAJ18009"
                                    }
                                    

                                    Das ist was Mqtt als Datenpunkt raushaut, ich benötige aber möglichst einen Datenpunkt der einfach true bei State = 1 bzw. false bei allen anderen States ist.
                                    Ich hab aber leider null Ahnung vom skripten. 😧

                                    F 1 Reply Last reply Reply Quote 0
                                    • F
                                      fastfoot @oldi-2000 last edited by

                                      @oldi-2000 so könnte es aussehen
                                      vto.PNG

                                      1 Reply Last reply Reply Quote 0
                                      • H
                                        h07d0q last edited by

                                        @rettroo @fastfoot
                                        Würde jemand von euch eine fertige, funktionierende Lösung hier veröffentlichen?
                                        Dann muss nicht jeder von neu beginnen 🙂
                                        Ich habe vor das ganze ohne den Schritt über MQTT direkt in Datenpunkte zu schreiben, sonst kann man es sich ja sparen das über iobroker laufen zu lassen.
                                        Am schönsten wäre natürlich ein Adapter, aber davon bin ich weit entfernt 😄

                                        I 2 Replies Last reply Reply Quote 0
                                        • I
                                          init5 @h07d0q last edited by

                                          @h07d0q das wäre ideal, wenn dafür jemand einen Adapter erstellen kann. Scheinbar ist die Nachfrage bei dem System nicht sonderlich hoch. Ich versuche gerade das Skript so anzupassen, dass es bei mir läuft. Sollte ich es hinbekommen, werde ich es dir zur Verfügung stellen.

                                          1 Reply Last reply Reply Quote 0
                                          • I
                                            init5 @h07d0q last edited by init5

                                            @h07d0q So, ich habe nun ein funktionierendes Skript am Laufen. Geklaut habe ich es von hier. Wäre schön wenn jemand einen Adapter daraus bauen kann.

                                            const DigestFetch = require('digest-fetch');
                                            const net = require('net');
                                            const fs = require('fs');
                                            const path = require('path');
                                            const md5 = require('md5');
                                            const mqtt = require('mqtt');
                                            
                                            class DahuaVTO {
                                              deviceType;
                                              serialNumber;
                                            
                                              requestId = 0;
                                            
                                              sessionId = 0;
                                            
                                              keepAliveInterval = 60;
                                            
                                              _keepAliveTimer;
                                            
                                              doorbellSocket;
                                            
                                              mqttClient;
                                            
                                              constructor() {
                                                this.dahua_host = "192.168.xxx.xxx";
                                                this.dahua_username = "VTOusername";
                                                this.dahua_password = "VTOpassword";
                                                this.mqtt_broker_host = "192.168.xxx.xxx";
                                                this.mqtt_broker_port = "1883";
                                                this.mqtt_broker_username = "mqttUsername";
                                                this.mqtt_broker_password = "mqttPassword";
                                                this.mqtt_broker_topic_prefix = "DahuaVTO";
                                                this.digestClient =  new DigestFetch(
                                                  this.dahua_username,
                                                  this.dahua_password
                                                );
                                            
                                                this.getDeviceDetails().then(({ deviceType, serialNumber }) => {
                                                  this.deviceType = deviceType;
                                                  this.serialNumber = serialNumber;
                                                  this.start();
                                                });
                                              }
                                            
                                              start() {
                                                this.setupDoorbellSocket();
                                                this.setupMQTT();
                                                this.initLogin();
                                              }
                                            
                                              async getDeviceDetails() {
                                                return this.digestClient
                                                  .fetch(
                                                    `http://${this.dahua_host}/cgi-bin/magicBox.cgi?action=getSystemInfo`
                                                  )
                                                  .then((r) => r.text())
                                                  .then((text) => {
                                                    const deviceDetails = text
                                                      .trim()
                                                      .split('\n')
                                                      .reduce((obj, str) => {
                                                        const [key, val] = str.split('=');
                                                        obj[key] = val.trim();
                                                        return obj;
                                                      }, {});
                                                    return deviceDetails;
                                                  });
                                              }
                                            
                                              saveSnapshot(p = '/tmp/') {
                                                let now = new Date();
                                                let dateStr = `${now.getFullYear()}-${
                                                  now.getMonth() + 1
                                                }-${now.getDate()}-${now.getHours()}-${now.getMinutes()}-${now.getSeconds()}`;
                                                let destination = path.join(p, `DoorBell_${dateStr}.jpg`);
                                                this.digestClient
                                                  .fetch(`http://${this.dahua_host}/cgi-bin/snapshot.cgi`)
                                                  .then((r) => {
                                                    return r.buffer();
                                                  })
                                                  .then((buf) => {
                                                    fs.writeFile(destination, buf, 'binary', function (err) {
                                                      if (err) {
                                                        log('Error saving snapshot to disk', err);
                                                      } else {
                                                        log('Snapshot saved');
                                                      }
                                                    });
                                                  });
                                              }
                                            
                                              setupDoorbellSocket() {
                                                let socket = new net.Socket({ readable: true, writable: true });
                                                socket.on('end', function () {
                                                  log('Doorbell socket ended');
                                                });
                                                socket.on('close', function () {
                                                 log('Doorbell socket closed');
                                                  clearInterval(this._keepAliveTimer);
                                                });
                                                socket.on('data', this.receive.bind(this));
                                                socket.on('error', function (e) {
                                                  log('Doorbell socket error', e);
                                                  this.doorbellSocket.destroy();
                                                  this.mqttClient.end(true);
                                                  clearInterval(this._keepAliveTimer);
                                                  this.start();    });
                                                this.doorbellSocket = socket.connect({ port: 5000, host: this.dahua_host });
                                              }
                                            
                                              setupMQTT() {
                                                this.mqttClient = mqtt.connect({
                                                  host: this.mqtt_broker_host,
                                                  port: this.mqtt_broker_port,
                                                  username: this.mqtt_broker_username,
                                                  password: this.mqtt_broker_password,
                                                  will: {
                                                    topic: `${this.mqtt_broker_topic_prefix}/lwt`,
                                                    payload: 'connected',
                                                    qos: 1,
                                                  },
                                                });
                                                this.mqttClient.on('disconnect', function (packet) {
                                                  log('MQTTDisconnect', packet);
                                                });
                                                this.mqttClient.on('message', function (topic, message, packet) {
                                                  log('MQTTMessage', { topic, message, packet });
                                                });
                                              }
                                            
                                              publishToMQTT(name, payload) {
                                                let message = JSON.stringify(payload);
                                                this.mqttClient.publish(
                                                  `${this.mqtt_broker_topic_prefix}/${name}/Event`,
                                                  message
                                                );
                                              }
                                            
                                              send(data) {
                                                let json = JSON.stringify(data);
                                                let buf = Buffer.alloc(32);
                                                let offset = buf.writeUInt32BE(0x20000000);
                                                offset = buf.writeUInt32BE(0x44484950, offset);
                                                offset = buf.writeDoubleBE(0, offset);
                                                offset = buf.writeUInt32LE(json.length, offset);
                                                offset = buf.writeUInt32LE(0, offset);
                                                offset = buf.writeUInt32LE(json.length, offset);
                                                offset = buf.writeUInt32LE(0, offset);
                                                buf = Buffer.concat([buf, Buffer.from(json)]);
                                                this.requestId += 1;
                                                this.doorbellSocket.write(buf);
                                              }
                                            
                                              receive(buf) {
                                                let str = buf.slice(32).toString();
                                                let obj = JSON.parse(str);
                                                if (this.requestId === 1) {
                                                  this.handleFirstLoginPayload(obj);
                                                } else if (this.requestId === 2) {
                                                  this.handleSecondLoginPayload(obj);
                                                } else if (obj.method === 'client.notifyEventStream') {
                                                  this.handleEvents(obj.params.eventList);
                                                } else {
                                                  this.handleGenericPayload(obj);
                                                }
                                              }
                                            
                                              initLogin() {
                                                this.send({
                                                  id: 10000,
                                                  magic: '0x1234',
                                                  method: 'global.login',
                                                  params: {
                                                    clientType: '',
                                                    ipAddr: '(null)',
                                                    loginType: 'Direct',
                                                    password: '',
                                                    userName: this.dahua_username,
                                                  },
                                                  session: 0,
                                                });
                                              }
                                            
                                            
                                              handleFirstLoginPayload({ session, params: { random, realm } }) {
                                                this.sessionId = session;
                                                let randomHash = this.genMD5Hash(random, realm);
                                                this.send({
                                                  id: 10000, 
                                                  magic: '0x1234',
                                                  method: 'global.login',
                                                  session: this.sessionId,
                                                  params: {
                                                    userName: this.dahua_username,
                                                    password: randomHash,
                                                    clientType: '',
                                                    ipAddr: '(null)',
                                                    loginType: 'Direct',
                                                    authorityType: 'Default',
                                                  },
                                                });
                                              }
                                            
                                              handleSecondLoginPayload(obj) {
                                                if (obj.result) {
                                                  log('Logging to Dahua Doorbell successful');
                                                  this.keepAliveInterval = obj.params.keepAliveInterval - 5;
                                                  this.attachEventManager();
                                                  this.keepConnectionAlive();
                                                } else {
                                                  log('Failed to login. Response was: ', obj);
                                                }
                                              }
                                            
                                              handleGenericPayload(obj) {
                                                if (
                                                  obj.result === true &&
                                                  obj.params &&
                                                  Object.hasOwnProperty.call(obj.params, 'timeout')
                                                ) {
                                                  log('Publish KeepAlive event');
                                                  this.publishToMQTT('keepAlive', {
                                                    deviceType: this.deviceType,
                                                    serialNumber: this.serialNumber,
                                                  });
                                                } else {
                                                  log(
                                                    'handleGenericPayload# Cannot handle received payload',
                                                    obj
                                                  );
                                                }
                                              }
                                            
                                              genMD5Hash(random, realm) {
                                                const base_credentials = `${this.dahua_username}:${realm}:${this.dahua_password}`;
                                                const pwddb_hash = md5(base_credentials).toUpperCase();
                                                const base_pass = `${this.dahua_username}:${random}:${pwddb_hash}`;
                                                return md5(base_pass).toUpperCase();
                                              }
                                            
                                              attachEventManager() {
                                                this.send({
                                                  id: this.requestId,
                                                  magic: '0x1234',
                                                  method: 'eventManager.attach',
                                                  params: {
                                                    codes: ['All'],
                                                  },
                                                  session: this.sessionId,
                                                });
                                              }
                                            
                                              handleEvents(events) {
                                                events.forEach((event) => {
                                                  log(`Publish event ${event.Code} to MQTT`);
                                                  this.publishToMQTT(event.Code, {
                                                    Action: event.eventAction,
                                                    Data: event.Data,
                                                    deviceType: this.deviceType,
                                                    serialNumber: this.serialNumber,
                                                  });
                                                });
                                              }
                                            
                                            
                                              keepConnectionAlive(delay) {
                                                this._keepAliveTimer = setInterval(() => {
                                                  let keepAlivePayload = {
                                                    method: 'global.keepAlive',
                                                    magic: '0x1234',
                                                    params: {
                                                      timeout: delay,
                                                      active: true,
                                                    },
                                                    id: this.requestId,
                                                    session: this.sessionId,
                                                  };
                                            
                                                  this.send(keepAlivePayload);
                                                }, this.keepAliveInterval * 1000);
                                              }
                                            
                                              openDoor() {
                                                return this.digestClient
                                                  .fetch(
                                                    `http://${this.dahua_host}/cgi-bin/accessControl.cgi?action=openDoor&channel=1&UserID=101&Type=Remote`
                                                  )
                                                  .then((r) => {
                                                    if (r.ok) {
                                                      log('Door relay triggered');
                                                    } else {
                                                      log('Error triggering the door relay', e);
                                                    }
                                                  })
                                                  .catch(e => log('Connection error triggering the door relay'));
                                              }
                                            };
                                            
                                            exports.default = DahuaVTO;
                                            
                                            new DahuaVTO();```
                                            H 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            404
                                            Online

                                            31.8k
                                            Users

                                            80.0k
                                            Topics

                                            1.3m
                                            Posts

                                            7
                                            33
                                            4940
                                            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