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 -
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 Variablenbezeichnernameist 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 -
@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 Variablenbezeichnernameist 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
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden