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. JavaScript
  5. LoRaWAN MQTT -> iobroker Objekte (Newbie)

NEWS

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    10
    1
    132

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.4k

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

LoRaWAN MQTT -> iobroker Objekte (Newbie)

Geplant Angeheftet Gesperrt Verschoben JavaScript
3 Beiträge 2 Kommentatoren 1.4k Aufrufe 1 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.
  • V Offline
    V Offline
    vbernd
    schrieb am zuletzt editiert von
    #1

    Hallo an Alle,
    ev. kann mir IOBroker / MQTT / LoRaWAN Anfänger hier wer weiterhelfen, stehe auf dem Schlauch:

    Ich habe ein LoRaWAN-Gateway am Dachboden und einen LoRaWAN-Füllstandssensor an den IBC-Containern im Garten montiert. Signal ist da, alles ist in TTN eingebunden, Daten kommen bei TTN an.

    Der "Uplink payload formatter" auf TTN sieht wie folgt aus:

    function decodeUplink(input) {
      var data = {};
      data.payload_type = input.bytes[0];
      data.fuellstand = input.bytes[5];
      data.temperatur = input.bytes[6];
      return {
        data: data
      };
    }
    

    und liefert dieses Ergebnis zum IOBroker (mqtt-client):

    {"end_device_ids":{"device_id":"eui-############","application_ids":{"application_id":"############"},"dev_eui":"ZZZZZZZ############ZZZZ","join_eui":"############","dev_addr":"############"},"correlation_ids":["as:up::#########################","gs:conn::#########################","gs:up:host:01:#########################","gs:uplink::#########################","ns:uplink::#########################","rpc:/ttn.lorawan.v3.GsNs/HandleUplink::#########################","rpc:/ttn.lorawan.v3.NsAs/HandleUplink:#########################"],"received_at":"2022-08-08T05:02:13.263995730Z","uplink_message": {"session_key_id":":#########################","f_port":16,"f_cnt":24,
    
    "frm_payload":"EAAAAAAMEpoADBOaAA4amgAOHpo=",
    "decoded_payload":{"fuellstand":12,"payload_type":16,"temperatur":18},
    
    "rx_metadata":[{"gateway_ids":{"gateway_id":"############","eui":"############"},"timestamp":843522929,"rssi":-93,"channel_rssi":-93,"snr":8.8,"frequency_offset":"-630","location":{"latitude":############,"longitude":############,"altitude":####,"source":"SOURCE_REGISTRY"},"uplink_token":"########################","channel_index":6}],"settings":{"data_rate":{"lora":{"bandwidth":125000,"spreading_factor":7}},"coding_rate":"4/5","frequency":"867700000","timestamp":843522929},"received_at":"2022-08-08T05:02:13.047628893Z","confirmed":true,"consumed_airtime":"0.071936s","locations":{"user":{"latitude":############,"longitude":############,"altitude":274,"source":"SOURCE_REGISTRY"}},"network_ids":{"net_id":"000013","tenant_id":"ttn","cluster_id":"eu1","cluster_address":"eu1.cloud.thethings.network"}}}
    

    Mittels nachfolgendem IOBroker-Skript möchte ich jetzt die Werte aus dem "deoded_payload" herausholen und in ein IOBroker-Objekt speichern - das funktioniert aber leider so nicht (Objekte sind zwar da, aber immer nur mit 0 gefüllt):

    on({id: "mqtt-client.0.v3.############@ttn.devices.eui-##########.up", change: "any"}, function (obj) { ParseCommand(obj); });
    
    function ParseCommand(obj) {
        let name = "###########";
        let fuellstand = 1;
        let payload_type = 1;
        let temperatur = 1;
        let LoRaDestination = "javascript.0.LoRa.";
    
        try { 
          var Wasserstand = JSON.parse(obj);
    
          fuellstand = Wasserstand.decoded_payload.fuellstand;
          payload_type = Wasserstand.payload_type;
          temperatur = Wasserstand.temperatur;
    
          let StateFuellstand = LoRaDestination + name + ".fuellstand";
          let StatePayloadType = LoRaDestination + name + ".payload_type";
    	  let StateTemperatur = LoRaDestination + name + ".temperatur";
    
          createState(StateFuellstand, 0);
          createState(StatePayloadType, 0);
    	  createState(StateTemperatur, 0);
    
          setState(StateFuellstand, fuellstand);
          setState(StatePayloadType, payload_type);
    	  setState(StateTemperatur, temperatur);
        } catch (e) {
        return;
      }
    }
    

    Ich vermute mal, das letztere JavaScript ist so noch nicht in Ordnung..... jemand ein "best practice" oder eine Anregung?
    Danke und lg

    paul53P 1 Antwort Letzte Antwort
    0
    • V vbernd

      Hallo an Alle,
      ev. kann mir IOBroker / MQTT / LoRaWAN Anfänger hier wer weiterhelfen, stehe auf dem Schlauch:

      Ich habe ein LoRaWAN-Gateway am Dachboden und einen LoRaWAN-Füllstandssensor an den IBC-Containern im Garten montiert. Signal ist da, alles ist in TTN eingebunden, Daten kommen bei TTN an.

      Der "Uplink payload formatter" auf TTN sieht wie folgt aus:

      function decodeUplink(input) {
        var data = {};
        data.payload_type = input.bytes[0];
        data.fuellstand = input.bytes[5];
        data.temperatur = input.bytes[6];
        return {
          data: data
        };
      }
      

      und liefert dieses Ergebnis zum IOBroker (mqtt-client):

      {"end_device_ids":{"device_id":"eui-############","application_ids":{"application_id":"############"},"dev_eui":"ZZZZZZZ############ZZZZ","join_eui":"############","dev_addr":"############"},"correlation_ids":["as:up::#########################","gs:conn::#########################","gs:up:host:01:#########################","gs:uplink::#########################","ns:uplink::#########################","rpc:/ttn.lorawan.v3.GsNs/HandleUplink::#########################","rpc:/ttn.lorawan.v3.NsAs/HandleUplink:#########################"],"received_at":"2022-08-08T05:02:13.263995730Z","uplink_message": {"session_key_id":":#########################","f_port":16,"f_cnt":24,
      
      "frm_payload":"EAAAAAAMEpoADBOaAA4amgAOHpo=",
      "decoded_payload":{"fuellstand":12,"payload_type":16,"temperatur":18},
      
      "rx_metadata":[{"gateway_ids":{"gateway_id":"############","eui":"############"},"timestamp":843522929,"rssi":-93,"channel_rssi":-93,"snr":8.8,"frequency_offset":"-630","location":{"latitude":############,"longitude":############,"altitude":####,"source":"SOURCE_REGISTRY"},"uplink_token":"########################","channel_index":6}],"settings":{"data_rate":{"lora":{"bandwidth":125000,"spreading_factor":7}},"coding_rate":"4/5","frequency":"867700000","timestamp":843522929},"received_at":"2022-08-08T05:02:13.047628893Z","confirmed":true,"consumed_airtime":"0.071936s","locations":{"user":{"latitude":############,"longitude":############,"altitude":274,"source":"SOURCE_REGISTRY"}},"network_ids":{"net_id":"000013","tenant_id":"ttn","cluster_id":"eu1","cluster_address":"eu1.cloud.thethings.network"}}}
      

      Mittels nachfolgendem IOBroker-Skript möchte ich jetzt die Werte aus dem "deoded_payload" herausholen und in ein IOBroker-Objekt speichern - das funktioniert aber leider so nicht (Objekte sind zwar da, aber immer nur mit 0 gefüllt):

      on({id: "mqtt-client.0.v3.############@ttn.devices.eui-##########.up", change: "any"}, function (obj) { ParseCommand(obj); });
      
      function ParseCommand(obj) {
          let name = "###########";
          let fuellstand = 1;
          let payload_type = 1;
          let temperatur = 1;
          let LoRaDestination = "javascript.0.LoRa.";
      
          try { 
            var Wasserstand = JSON.parse(obj);
      
            fuellstand = Wasserstand.decoded_payload.fuellstand;
            payload_type = Wasserstand.payload_type;
            temperatur = Wasserstand.temperatur;
      
            let StateFuellstand = LoRaDestination + name + ".fuellstand";
            let StatePayloadType = LoRaDestination + name + ".payload_type";
      	  let StateTemperatur = LoRaDestination + name + ".temperatur";
      
            createState(StateFuellstand, 0);
            createState(StatePayloadType, 0);
      	  createState(StateTemperatur, 0);
      
            setState(StateFuellstand, fuellstand);
            setState(StatePayloadType, payload_type);
      	  setState(StateTemperatur, temperatur);
          } catch (e) {
          return;
        }
      }
      

      Ich vermute mal, das letztere JavaScript ist so noch nicht in Ordnung..... jemand ein "best practice" oder eine Anregung?
      Danke und lg

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

      @vbernd sagte. liefert dieses Ergebnis zum IOBroker (mqtt-client):

      JSON ist fehlerhaft und lässt sich dadurch nicht vollständig analysieren.

      @vbernd sagte in LoRaWAN MQTT -> iobroker Objekte (Newbie):

      eine Anregung?

      Konstanten (IDs) sollten außerhalb der Funktion deklariert und initialisiert werden.
      Der Variablenbezeichner name ist durch den Javascript-Adapter belegt und sollte deshalb nicht verwendet werden.

      Wesentlich ist Zeile 10, weshalb man sie zum Test durch eine Log-Ausgabe prüfen sollte:

      const idJSON = 'mqtt-client.0.v3.############@ttn.devices.eui-##########.up';
      const LoRaDestination = '0_userdata.0.LoRa.';
      const nameLoRa = '###########';
      const idFuellstand = LoRaDestination + nameLoRa + '.fuellstand';
      const idPayloadType = LoRaDestination + nameLoRa + '.payload_type';
      const idTemperatur = LoRaDestination + nameLoRa + '.temperatur';
      
      function ParseCommand(dp) {
          try { 
            let Wasserstand = JSON.parse(dp.state.val).uplink_message.decoded_payload;
            log(Wasserstand); // Test
            let fuellstand = Wasserstand.fuellstand;
            let payload_type = Wasserstand.payload_type;
            let temperatur = Wasserstand.temperatur;
            if(existsState(idFuellstand)) {
              setState(idFuellstand, fuellstand, true);
              setState(idPayloadType, payload_type, true);
      	setState(idTemperatur, temperatur, true);
            } else {
              createState(idFuellstand, fuellstand, {type: 'number', role: 'value', def: fuellstand, unit: 'cm', name: 'Füllstand ' + nameLoRa});
              createState(idPayloadType, payload_type, {type: 'number', role: 'value', def: payload_type, name: 'Typ ' + nameLoRa});
      	createState(idTemperatur, temperatur, {type: 'number', role: 'value', def: temperatur, unit: '°C', name: 'Temperatur ' + nameLoRa});
            } 
          } catch (e) {return;}
      }
      
      on(idJSON, ParseCommand); // triggert bei Wertänderung
      

      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

      V 1 Antwort Letzte Antwort
      1
      • paul53P paul53

        @vbernd sagte. liefert dieses Ergebnis zum IOBroker (mqtt-client):

        JSON ist fehlerhaft und lässt sich dadurch nicht vollständig analysieren.

        @vbernd sagte in LoRaWAN MQTT -> iobroker Objekte (Newbie):

        eine Anregung?

        Konstanten (IDs) sollten außerhalb der Funktion deklariert und initialisiert werden.
        Der Variablenbezeichner name ist durch den Javascript-Adapter belegt und sollte deshalb nicht verwendet werden.

        Wesentlich ist Zeile 10, weshalb man sie zum Test durch eine Log-Ausgabe prüfen sollte:

        const idJSON = 'mqtt-client.0.v3.############@ttn.devices.eui-##########.up';
        const LoRaDestination = '0_userdata.0.LoRa.';
        const nameLoRa = '###########';
        const idFuellstand = LoRaDestination + nameLoRa + '.fuellstand';
        const idPayloadType = LoRaDestination + nameLoRa + '.payload_type';
        const idTemperatur = LoRaDestination + nameLoRa + '.temperatur';
        
        function ParseCommand(dp) {
            try { 
              let Wasserstand = JSON.parse(dp.state.val).uplink_message.decoded_payload;
              log(Wasserstand); // Test
              let fuellstand = Wasserstand.fuellstand;
              let payload_type = Wasserstand.payload_type;
              let temperatur = Wasserstand.temperatur;
              if(existsState(idFuellstand)) {
                setState(idFuellstand, fuellstand, true);
                setState(idPayloadType, payload_type, true);
        	setState(idTemperatur, temperatur, true);
              } else {
                createState(idFuellstand, fuellstand, {type: 'number', role: 'value', def: fuellstand, unit: 'cm', name: 'Füllstand ' + nameLoRa});
                createState(idPayloadType, payload_type, {type: 'number', role: 'value', def: payload_type, name: 'Typ ' + nameLoRa});
        	createState(idTemperatur, temperatur, {type: 'number', role: 'value', def: temperatur, unit: '°C', name: 'Temperatur ' + nameLoRa});
              } 
            } catch (e) {return;}
        }
        
        on(idJSON, ParseCommand); // triggert bei Wertänderung
        
        V Offline
        V Offline
        vbernd
        schrieb am zuletzt editiert von
        #3

        @paul53 vielen herzlichen Dank, funktioniert auf Anhieb ;)

        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

        753

        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