Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. LoRaWAN MQTT -> iobroker Objekte (Newbie)

    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

    LoRaWAN MQTT -> iobroker Objekte (Newbie)

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

      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

      paul53 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @vbernd last edited by 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 1 Reply Last reply Reply Quote 1
        • V
          vbernd @paul53 last edited by

          @paul53 vielen herzlichen Dank, funktioniert auf Anhieb 😉

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

          Support us

          ioBroker
          Community Adapters
          Donate

          668
          Online

          31.8k
          Users

          80.0k
          Topics

          1.3m
          Posts

          2
          3
          1339
          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