NEWS
LoRaWAN MQTT -> iobroker Objekte (Newbie)
-
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 -
@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 Variablenbezeichnername
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
-
@paul53 vielen herzlichen Dank, funktioniert auf Anhieb