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. Skripten / Logik
  4. MQTT get und set anlegen für zigbee2mqtt

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.8k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    893

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.1k

MQTT get und set anlegen für zigbee2mqtt

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
8 Beiträge 4 Kommentatoren 1.2k Aufrufe 3 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.
  • EisteeE Offline
    EisteeE Offline
    Eistee
    schrieb am zuletzt editiert von Eistee
    #1

    Hallo ich versuche mit einem Javascript die get und set Datenpunkte für meine zigbee2mqtt geräte anzulegen so das ich ich dann über diese Datenpunkte meine Geräte steuern kann.

    Versucht habe ich folgendes:

    const mqtt = "mqtt.0";
    const topic = "zigbee2mqtt";
    const zigbee2mqtt = mqtt +"."+ topic;
    var devices = JSON.parse(getState(zigbee2mqtt +".bridge.devices").val);
    devices.forEach(device => {
        if (device.type == "EndDevice"
            && device.friendly_name.length > 0
            && existsState(zigbee2mqtt +"."+ device.friendly_name)
        ) {
            if (!existsState(zigbee2mqtt +"."+ device.friendly_name +".set")) {
                sendTo(mqtt, 'sendMessage2Client', {topic: '/'+ topic +'/'+ device.friendly_name +'/set', message: '{}'});
            }
            if (!existsState(zigbee2mqtt +"."+ device.friendly_name +".get")) {
                sendTo(mqtt, 'sendMessage2Client', {topic: '/'+ topic +'/'+ device.friendly_name +'/get', message: '{}'});
            }
        }
    });
    

    Hiermit werden leider keine Datenpunkte angelegt.

    Nächster versuch:

    const mqtt = "mqtt.0";
    const topic = "zigbee2mqtt";
    const zigbee2mqtt = mqtt +"."+ topic;
    var devices = JSON.parse(getState(zigbee2mqtt +".bridge.devices").val);
    devices.forEach(device => {
        if (device.type == "EndDevice"
            && device.friendly_name.length > 0
            && existsState(zigbee2mqtt +"."+ device.friendly_name)
        ) {
            if (!existsState(zigbee2mqtt +"."+ device.friendly_name +".set")) {
                setState(zigbee2mqtt +'.'+ device.friendly_name +'.set', '{}');
            }
            if (!existsState(zigbee2mqtt +"."+ device.friendly_name +".get")) {
                setState(zigbee2mqtt +'.'+ device.friendly_name +'.get', '{}');
            }
        }
    });
    

    Auch hier keine Datenpunkte.

    Jemand eine Idee wie ich das machen muss um die Datenpunkte anzulegen?

    Gruß Alina

    mickymM 1 Antwort Letzte Antwort
    0
    • EisteeE Eistee

      Hallo ich versuche mit einem Javascript die get und set Datenpunkte für meine zigbee2mqtt geräte anzulegen so das ich ich dann über diese Datenpunkte meine Geräte steuern kann.

      Versucht habe ich folgendes:

      const mqtt = "mqtt.0";
      const topic = "zigbee2mqtt";
      const zigbee2mqtt = mqtt +"."+ topic;
      var devices = JSON.parse(getState(zigbee2mqtt +".bridge.devices").val);
      devices.forEach(device => {
          if (device.type == "EndDevice"
              && device.friendly_name.length > 0
              && existsState(zigbee2mqtt +"."+ device.friendly_name)
          ) {
              if (!existsState(zigbee2mqtt +"."+ device.friendly_name +".set")) {
                  sendTo(mqtt, 'sendMessage2Client', {topic: '/'+ topic +'/'+ device.friendly_name +'/set', message: '{}'});
              }
              if (!existsState(zigbee2mqtt +"."+ device.friendly_name +".get")) {
                  sendTo(mqtt, 'sendMessage2Client', {topic: '/'+ topic +'/'+ device.friendly_name +'/get', message: '{}'});
              }
          }
      });
      

      Hiermit werden leider keine Datenpunkte angelegt.

      Nächster versuch:

      const mqtt = "mqtt.0";
      const topic = "zigbee2mqtt";
      const zigbee2mqtt = mqtt +"."+ topic;
      var devices = JSON.parse(getState(zigbee2mqtt +".bridge.devices").val);
      devices.forEach(device => {
          if (device.type == "EndDevice"
              && device.friendly_name.length > 0
              && existsState(zigbee2mqtt +"."+ device.friendly_name)
          ) {
              if (!existsState(zigbee2mqtt +"."+ device.friendly_name +".set")) {
                  setState(zigbee2mqtt +'.'+ device.friendly_name +'.set', '{}');
              }
              if (!existsState(zigbee2mqtt +"."+ device.friendly_name +".get")) {
                  setState(zigbee2mqtt +'.'+ device.friendly_name +'.get', '{}');
              }
          }
      });
      

      Auch hier keine Datenpunkte.

      Jemand eine Idee wie ich das machen muss um die Datenpunkte anzulegen?

      Gruß Alina

      mickymM Online
      mickymM Online
      mickym
      Most Active
      schrieb am zuletzt editiert von
      #2

      @eistee Nun wenn der Adapter ein Broker ist, dann wirst Du die Datenpunkte manuell anlegen müssen oder Du nutzt NodeRed oder einen anderen mqtt-Client.

      Dein Script ist kein mqtt-Client und mqtt-Nachrichten an einen Broker darf nur ein mqtt Client schicken.

      Bei dem 2. kannst Du versuchen, ob Du mit createState was erreichst, bin mir aber nicht sicher. setState geht dachte ich nur bei existierenden States - habe ich aber nie entwickelt. https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#createstate

      Ich bin mir auch immer nicht sicher, ob das zulässig ist, dass man in den Hoheitsraum eines Adapters schreiben darf, ausser über den Admin manuell anlegen.

      Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

      paul53P EisteeE 2 Antworten Letzte Antwort
      0
      • mickymM mickym

        @eistee Nun wenn der Adapter ein Broker ist, dann wirst Du die Datenpunkte manuell anlegen müssen oder Du nutzt NodeRed oder einen anderen mqtt-Client.

        Dein Script ist kein mqtt-Client und mqtt-Nachrichten an einen Broker darf nur ein mqtt Client schicken.

        Bei dem 2. kannst Du versuchen, ob Du mit createState was erreichst, bin mir aber nicht sicher. setState geht dachte ich nur bei existierenden States - habe ich aber nie entwickelt. https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#createstate

        Ich bin mir auch immer nicht sicher, ob das zulässig ist, dass man in den Hoheitsraum eines Adapters schreiben darf, ausser über den Admin manuell anlegen.

        paul53P Offline
        paul53P Offline
        paul53
        schrieb am zuletzt editiert von
        #3

        @mickym sagte: ob Du mit createState was erreichst

        createState() funktioniert nur für "javascript.N" und "0_userdata.0". Alle anderen Objekte müssen mittels setObject() erstellt werden.

        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

        1 Antwort Letzte Antwort
        2
        • mickymM mickym

          @eistee Nun wenn der Adapter ein Broker ist, dann wirst Du die Datenpunkte manuell anlegen müssen oder Du nutzt NodeRed oder einen anderen mqtt-Client.

          Dein Script ist kein mqtt-Client und mqtt-Nachrichten an einen Broker darf nur ein mqtt Client schicken.

          Bei dem 2. kannst Du versuchen, ob Du mit createState was erreichst, bin mir aber nicht sicher. setState geht dachte ich nur bei existierenden States - habe ich aber nie entwickelt. https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#createstate

          Ich bin mir auch immer nicht sicher, ob das zulässig ist, dass man in den Hoheitsraum eines Adapters schreiben darf, ausser über den Admin manuell anlegen.

          EisteeE Offline
          EisteeE Offline
          Eistee
          schrieb am zuletzt editiert von
          #4

          @mickym sagte in MQTT get und set anlegen für zigbee2mqtt:

          achte ich nur bei e

          Also ich habe einen mosquitto server laufen. iobroker ist als client dort angemeldet. Wenn ich manuell ein get oder ein set am mosquitto publishe legt iobroker den Datenpunkt ja an und ich kann ihn ab da nutzen. Ich möchte diese Datenpunkte nun automatisch anlegen lassen da ich nicht manuell für alle geräte diese publishen kann. Es muss ja eine Möglichkeit geben in iobroker Datenpunkte anzulegen. Ich kenne nur den passenden Befehl scheinbar nicht.

          mickymM 1 Antwort Letzte Antwort
          0
          • EisteeE Eistee

            @mickym sagte in MQTT get und set anlegen für zigbee2mqtt:

            achte ich nur bei e

            Also ich habe einen mosquitto server laufen. iobroker ist als client dort angemeldet. Wenn ich manuell ein get oder ein set am mosquitto publishe legt iobroker den Datenpunkt ja an und ich kann ihn ab da nutzen. Ich möchte diese Datenpunkte nun automatisch anlegen lassen da ich nicht manuell für alle geräte diese publishen kann. Es muss ja eine Möglichkeit geben in iobroker Datenpunkte anzulegen. Ich kenne nur den passenden Befehl scheinbar nicht.

            mickymM Online
            mickymM Online
            mickym
            Most Active
            schrieb am zuletzt editiert von mickym
            #5

            @eistee Na das war mir ja nicht klar, wie Deine Umgebung aussieht - wird halt immer nur ein Bruchteil von Informationen gepostet. Jetzt kenne ich die Umgebung und im Prinzip müsste das Senden zum Adapter tun. Dann liegst vielleicht daran, dass Du ein leeres Objekt anstatt eines leeren Strings schickst und die Syntax laut Beschriebung musst Du die Instanz des Adapters ja angeben:

            sendTo('mqtt.0', 'sendMessage2Client', {topic: '/'+ topic +'/'+ device.friendly_name +'/set', message: ''});
            

            Wobei ich persönlich die manuelle Vorgehensweise bevorzugen würde. Es macht keinen Sinn, wenn Sensoren set Punkte bekommen, die eh nicht verwendet werden können.
            In dem Fall filterst Du mE auch noch den falschen Typ, nämlich EndDevice, was in der Regel nur batteriebetriebene Sensoren sind. Du müsstest, wenn schon nach dem Typ "Router", filtern. So machts ja mal doppelt keinen Sinn.

            Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

            1 Antwort Letzte Antwort
            0
            • EisteeE Offline
              EisteeE Offline
              Eistee
              schrieb am zuletzt editiert von Eistee
              #6

              Hi,

              hab es hinbekommen was ich erreichen wollte. setObject muss in den Instanzeinstellungen vom Javascript aktiv sein.
              Für die Nachwelt hier meine Lösung:

              const mqtt = "mqtt.0";
              const topic = "zigbee2mqtt";
              const zigbee2mqtt = mqtt +"."+ topic;
              var devices = JSON.parse(getState(zigbee2mqtt +".bridge.devices").val);
              devices.forEach(device => {
                  if (device.friendly_name.length > 0
                      && existsObject(zigbee2mqtt +"."+ device.friendly_name)
                  ) {
                      if (!existsObject(zigbee2mqtt +"."+ device.friendly_name +".set")) {
                          setObject(zigbee2mqtt +'.'+ device.friendly_name +'.set', {
                              "common": {
                                  "name": topic +'/'+ device.friendly_name +"/set",
                                  "desc": topic +'/'+ device.friendly_name +"/set",
                                  "role": "json",
                                  "type": "json",
                                  "read": true,
                                  "write": true
                              },
                              "type": "state"
                          });
                      }
                      if (!existsObject(zigbee2mqtt +"."+ device.friendly_name +".get")) {
                          setObject(zigbee2mqtt +'.'+ device.friendly_name +'.get', {
                              "common": {
                                  "name": topic +'/'+ device.friendly_name +"/get",
                                  "desc": topic +'/'+ device.friendly_name +"/get",
                                  "role": "json",
                                  "type": "json",
                                  "read": true,
                                  "write": true
                              },
                              "type": "state"
                          });
                      }
                  }
              });
              
              paul53P 1 Antwort Letzte Antwort
              0
              • EisteeE Eistee

                Hi,

                hab es hinbekommen was ich erreichen wollte. setObject muss in den Instanzeinstellungen vom Javascript aktiv sein.
                Für die Nachwelt hier meine Lösung:

                const mqtt = "mqtt.0";
                const topic = "zigbee2mqtt";
                const zigbee2mqtt = mqtt +"."+ topic;
                var devices = JSON.parse(getState(zigbee2mqtt +".bridge.devices").val);
                devices.forEach(device => {
                    if (device.friendly_name.length > 0
                        && existsObject(zigbee2mqtt +"."+ device.friendly_name)
                    ) {
                        if (!existsObject(zigbee2mqtt +"."+ device.friendly_name +".set")) {
                            setObject(zigbee2mqtt +'.'+ device.friendly_name +'.set', {
                                "common": {
                                    "name": topic +'/'+ device.friendly_name +"/set",
                                    "desc": topic +'/'+ device.friendly_name +"/set",
                                    "role": "json",
                                    "type": "json",
                                    "read": true,
                                    "write": true
                                },
                                "type": "state"
                            });
                        }
                        if (!existsObject(zigbee2mqtt +"."+ device.friendly_name +".get")) {
                            setObject(zigbee2mqtt +'.'+ device.friendly_name +'.get', {
                                "common": {
                                    "name": topic +'/'+ device.friendly_name +"/get",
                                    "desc": topic +'/'+ device.friendly_name +"/get",
                                    "role": "json",
                                    "type": "json",
                                    "read": true,
                                    "write": true
                                },
                                "type": "state"
                            });
                        }
                    }
                });
                
                paul53P Offline
                paul53P Offline
                paul53
                schrieb am zuletzt editiert von paul53
                #7

                @eistee
                Füge noch native hinzu:

                                },
                                "native": {},
                                "type": "state"
                

                Sind set und get "r/w"?

                Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                1 Antwort Letzte Antwort
                0
                • Q Offline
                  Q Offline
                  quotschmacher
                  schrieb am zuletzt editiert von quotschmacher
                  #8

                  da ich bei mir die einzelnen attribute und kein komplettes json ausgeben lasse, hat mir das hier nicht wirklich weitergeholfen, aber schon ein wenig inspiriert. hier mal mein erster schnellschuss - bisher funktioniert alles, kann aber sicher noch etwas verbessert werden (datentyp, min/max-werte):

                  const mqtt = "mqtt.0";
                  const topic = "zigbee2mqtt";
                  const zigbee2mqtt = mqtt +"."+ topic;
                  const doNotGenerateSetStates = ["update-state", "availability", "linkquality"]
                  const doNotOverwriteExistingObjects = false;
                  var devices = JSON.parse(getState(zigbee2mqtt +".bridge.devices").val);
                  devices.forEach(device => {
                      if (device.friendly_name.length > 0)
                      {
                          var device_name = device.friendly_name.replaceAll("/", ".")
                          console.log(device_name)
                          //console.log({device})
                          if (device.type.toLowerCase() === "router")
                          {
                              console.log("ist router")
                              var datapointBase = zigbee2mqtt + "." + device_name;
                              if (existsObject(datapointBase)) {
                                  console.log(datapointBase + " existiert")
                                  var getPoints = $('[state.id=' + datapointBase + '.*]')
                                  //console.log({getPoints})
                                  getPoints.each(function (id, i) {
                                      if (existsObject(id)) {
                                          var attribute = id.split('.').pop();
                                          if (doNotGenerateSetStates.includes(attribute.toLocaleLowerCase())) {
                                              console.log("--ABBRUCH: " + attribute)
                                              return;
                                          }
                                          var setMqttPath = topic + "/" + device.friendly_name + "/set/" + attribute;
                                          var setId = datapointBase + ".set." + attribute;
                  
                                          if (existsObject(setId) && doNotOverwriteExistingObjects) {
                                              console.log("--ABBRUCH (existiert bereits): " + attribute)
                                              return;
                                          }
                                          
                                          var attributeSpecs = device.definition.exposes.find(data => data.hasOwnProperty('features')).features.find(data => data.name === attribute);
                                          if (attributeSpecs === undefined) {
                                              attributeSpecs = device.definition.exposes.find(data => data.name === attribute);
                                          }
                                          //console.log(attributeSpecs)
                  
                                          var getObj = getObject(id);
                                          getObj._id = setId;
                                          getObj.common.name = setMqttPath;
                                          getObj.native.topic = setMqttPath;
                                          if (attributeSpecs?.value_min != undefined) {
                                              getObj.common.min = attributeSpecs.value_min;
                                          }
                                          if (attributeSpecs?.value_max != undefined) {
                                              getObj.common.max = attributeSpecs.value_max;
                                          }
                                          if (attributeSpecs?.unit != undefined) {
                                              getObj.common.unit = attributeSpecs.unit;
                                          }
                                          
                                          setObject(setId, getObj, function (err) {
                                              if (err) console.error('Cannot write object: ' + err);
                                          });
                                          console.log(setId)
                                      }
                                  });
                              }
                          }
                      }
                  })
                  

                  und das ergebnis:
                  11798552-73cb-4280-a4da-507c4819625f-image.png

                  edit: ich war etwas ungehalten und habe min, max und unit schon hinzugeügt. mehr werte kann man ja bei bedarf analog dazu auslesen.

                  als nächstes kommt dann noch ein alias datenpunkt, der entsprechend read und write datenpunkte vereint.

                  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

                  690

                  Online

                  32.6k

                  Benutzer

                  82.1k

                  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