NEWS
[gelöst] Payload Daten in Objekte schreiben
-
Hallo,
ich habe nun mein LoRaWan erfolgreich in Betrieb genommen.
Folgendes Payload bekomme ich vom Gateway:
... /HandleUplink:01H5FA9TDQNKAJE50A140RA48P"],"received_at":"2023-07-16T12:20:13.367814098Z","uplink_message":{"session_key_id":"AYleIPJHcDVYfnq3XreUCg==","f_port":2,"f_cnt":144,"frm_payload":"NdgAAAAAAAA0/0E=","decoded_payload":{"ACI1_mA":0, "ACI2_mA":0, "AVI1_V":13.784, "AVI2_V":0, "DI1_status":"L", "DI2_status":"H", "DO1_status":"H", "DO2_status":"H", "Hardware_mode":"LT22222", "%(#ff0000)[RO1_status":"OFF", "RO2_status":"OFF]", "Work_mode":"2ACI+2AVI"},"rx_metadata":[{"gateway_ids":{"gateway_id":"eui-7076ff0056080b0f","eui":"7076FF0056080B0F"},"time":"2023-07-16T12:20:13.072Z","timestamp":3188114652,"rssi":cl: ....
Wie kann ich die Daten nach ACI1 ACI2 AVI1 AVI2 DI1 DI2 usw. in Blockly aufschlüsseln und in Variablen schreiben?
Ausserdem benötige hierzu noch den Timestamp.
JS kann ich leider nicht.Gruß
Gregor -
@gregors sagte in Payload Daten in Objekte schreiben:
Folgendes Payload bekomme ich vom Gateway:
ist das vollständig?
wo kommt das hin? Liegt es in einem Datenpunkt? -
-
@homoran
Nein, ist nicht vollständig. Habe nur die relevanten Infos rauskopiert.
Sie liegt in einem JSON-File. -
@paul53
Schon gesehen, aber JS kann ich nicht. -
@gregors sagte in Payload Daten in Objekte schreiben:
Sie liegt in einem JSON-File.
und da kommt bei jedem Paket ein neues JSON, das ausgelesen werden soll?
@gregors sagte in Payload Daten in Objekte schreiben:
Habe nur die relevanten Infos rauskopiert.
das nutzt nichts.
Du musst ja beim Auseinandernehmen die gesamte JSON-Struktur berücksichtigen -
@homoran
Ok.
Hier das komplette JSON:{"end_device_ids":{"device_id":"eui-xxxxxxxxxxxxxxxxxxx","application_ids":{"application_id":"gs-mg-dragino-01"},"dev_eui":"xxxxxxxxxxxxxxxxxxx","join_eui":"yyyyyyyyyyyyyyyyyyy","dev_addr":"zzzzzzzzz"},"correlation_ids":["as:up:01H5KSJPMRECPFW9X31X3RZVV2","gs:conn:01H4KAYPR4MRPH50CJE9DZ7YHC","gs:up:host:01H4KAYPRB2CYT22K4H1T83DQS","gs:uplink:01H5KSJPE94D98RBTM11WVQ1SY","ns:uplink:01H5KSJPEA3KC8FPJJSHNZ1QQX","rpc:/ttn.lorawan.v3.GsNs/HandleUplink:01H5KSJPEAS7598TVH1ZPW5BJ8","rpc:/ttn.lorawan.v3.NsAs/HandleUplink:01H5KSJPMQT2K85MP8BY0FY6SN"],"received_at":"2023-07-18T06:04:10.775410433Z","uplink_message":{"session_key_id":"AYleIPJHcDVYfnq3XreUCg==","f_port":2,"f_cnt":2648,"frm_payload":"NOwAAAAAAAA0/0E=","decoded_payload":{"ACI1_mA":0, "ACI2_mA":0, "AVI1_V":13.548, "AVI2_V":0, "DI1_status":"L", "DI2_status":"H", "DO1_status":"H", "DO2_status":"H", "Hardware_mode":"LT22222", "RO1_status":"OFF", "RO2_status":"OFF", "Work_mode":"2ACI+2AVI"},"rx_metadata":[{"gateway_ids":{"gateway_id":"eui-7076ff0056080b0f","eui":"7076FF0056080B0F"},"time":"2023-07-18T06:04:10.444Z","timestamp":3101631076,"rssi":-116,"channel_rssi":-116,"snr":-9.5,"uplink_token":"CiIKIAoUZXVpLTcwNzZmZjAwNTYwODBiMGYSCHB2/wBWCAsPEOTE/MYLGgwI2tbYpQYQk7fJjwIgoK35vKLj9wEqDAja1tilBhCAztvTAQ==","channel_index":7,"gps_time":"2023-07-18T06:04:10.444Z","received_at":"2023-07-18T06:04:10.277432218Z"}],"settings":{"data_rate":{"lora":{"bandwidth":125000, "spreading_factor":12, "coding_rate":"4/5"}}, "frequency":"868500000", "timestamp":3101631076, "time":"2023-07-18T06:04:10.444Z"},"received_at":"2023-07-18T06:04:10.570656374Z","consumed_airtime":"1.482752s","version_ids":{"brand_id":"dragino", "model_id":"lt22222-l", "hardware_version":"_unknown_hw_version_", "firmware_version":"1.5.6", "band_id":"EU_863_870"},"network_ids":{"net_id":"000013","tenant_id":"ttn","cluster_id":"eu1","cluster_address":"eu1.cloud.thethings.network"}}}
Bei jeder neuen Meldung kommt ein neues JSON-File mit aktualisierten Daten.
-
@gregors sagte in Payload Daten in Objekte schreiben:
Hier das komplette JSON:
und du willst immer
die decoded payload in einzelne Datepunkte schreiben?
es kommen auch immer nur diese Attribute an? -
-
@homoran sagte in Payload Daten in Objekte schreiben:
Liegt es in einem Datenpunkt?
wenn ja, triggerst du auf diesen DP bei Änderung.
Zerlegst den Inhalt des DP mit Attribut von.. und dem "Pfad zum Wert", z.b.uplink_message.decoded_payload.ACI1_mA
das schreibst du dann in deinen selbst angelegten Datenpunkt.ich habe hier das json als Text eingefügt und das Ergebnis als debug ausgegeben.
du müsstest mit dem Wert des JSON DP arbeiten und unten die ID des DP für di ACI1 einsetzen -
-
@marc-berg sorry, der cache hatte deine Antwort geschluckt. hab sie jetzt nur durch Pauls reponse gefunden.
-
@paul53 sagte in Payload Daten in Objekte schreiben:
Dann sollte man prüfen.
ja, genau. Wenn man zum Beispiel einen Schaltbefehl als Downlink absetzt, bekommt man immer zwei Uplinks zurück. Einen mit Work_mode "Exit mode" und einen mit Work_Mode "2ACI+2AVI". Das ist zunächst etwas verwirrend, aber sicher der vielfältigen Möglichkeiten geschuldet, die man mit diesem Gerät hat.
-
Danke.
Werde es mal die Tage probieren. -
Leider hat es nicht funktioniert.
Beim Blockly kommen folgende Fehlermeldungen:
avascript.0 2023-07-20 18:55:46.674 error script.js.LoRaWAN_DEV_1: Cannot get AVI2_V of null javascript.0 2023-07-20 18:55:46.674 error script.js.LoRaWAN_DEV_1: Cannot get ACI1_mA of undefined javascript.0 2023-07-20 18:53:46.292 error script.js.LoRaWAN_DEV_1: Cannot get AVI2_V of null javascript.0 2023-07-20 18:53:46.292 error script.js.LoRaWAN_DEV_1: Cannot get ACI1_mA of null javascript.0 2023-07-20 18:52:46.262 error script.js.LoRaWAN_DEV_1: Cannot get AVI2_V of null javascript.0 2023-07-20 18:52:46.261 error script.js.LoRaWAN_DEV_1: Cannot get ACI1_mA of undefined
Habe es dann noch mit einem JS versucht (hier aus dem Forum).
Alles angepasst, aber dies hat auch nicht funktioniert.javascript.0 2023-07-20 18:57:52.096 error at Script.runInContext (node:vm:141:12) javascript.0 2023-07-20 18:57:52.096 error at script.js.LoRAWAN_DEV_1:127:3 javascript.0 2023-07-20 18:57:52.096 error at script.js.LoRAWAN_DEV_1:1:1 javascript.0 2023-07-20 18:57:52.095 error script.js.LoRAWAN_DEV_1: ReferenceError: ttn_decode is not defined
Wie deffiniere ich den TTN_decode?
ttn_decode //Device createState("0_userdata.0.LoRaWAN.eui-a840414601871305.ACI_1", false, { name: "Strom_1", read: true, write: false, desc: "", def: 0, unit: "mA", role: "", type: "number" }); createState("0_userdata.0.LoRaWAN.eui-a840414601871305.ACI_2", false, { name: "Strom_2", read: true, write: false, desc: "", def: 0, unit: "mA", role: "", type: "number" }); createState("0_userdata.0.LoRaWAN.eui-a840414601871305.AVI_1", false, { name: "Spannung_1", read: true, write: false, desc: "", def: 0, unit: "V", role: "", type: "number" }); createState("0_userdata.0.LoRaWAN.eui-a840414601871305.AVI_2", false, { name: "Spannung_2", read: true, write: false, desc: "", def: 0, unit: "V", role: "", type: "number" }); //const fs = require('fs'); on({id: 'v3/gs-mg-dragino-01@ttn/devices/eui-a840414601871305/up', change: "ne"}, function (obj) { obj = JSON.parse(getState("v3/gs-mg-dragino-01@ttn/devices/eui-a840414601871305/up").val); setState("0_userdata.0.LoRaWAN.eui-a840414601871305.ACI_1", parseFloat(obj["payload_fields"]["ACI1_mA"].toFixed(2)), true); setState("0_userdata.0.LoRaWAN.eui-a840414601871305.ACI_2", parseFloat(obj["payload_fields"]["ACI2_mA"].toFixed(2)), true); setState("0_userdata.0.LoRaWAN.eui-a840414601871305.AVI_1", parseFloat(obj["payload_fields"]["AVI1_V"].toFixed(2)), true); setState("0_userdata.0.LoRaWAN.eui-a840414601871305.AVI_2", parseFloat(obj["payload_fields"]["AVI2_V"].toFixed(2)), true); /* var file = "/opt/iobroker/ttn_log.csv"; if(!fs.existsSync(file)) { fs.writeFileSync(file, "Time\tData\r\n"); } fs.appendFileSync(file, (new Date()).toISOString() + "\t" + getState("on({id: 'v3/gs-mg-dragino-01@ttn/devices/eui-a840414601871305/up', change: "ne"}, function (obj) { ").val + "\r\n"); */ });
Brauche da wohl ein bisschen Nachilfe.
Danke
-
@gregors sagte in Payload Daten in Objekte schreiben:
Beim Blockly kommen folgende Fehlermeldungen:
Hast du die Überprüfung, ob der Inhalt existiert nicht umgesetzt?
@marc-berg sagte in Payload Daten in Objekte schreiben:
@paul53 sagte in Payload Daten in Objekte schreiben:
Dann sollte man prüfen.
ja, genau. Wenn man zum Beispiel einen Schaltbefehl als Downlink absetzt, bekommt man immer zwei Uplinks zurück. Einen mit Work_mode "Exit mode" und einen mit Work_Mode "2ACI+2AVI". Das ist zunächst etwas verwirrend, aber sicher der vielfältigen Möglichkeiten geschuldet, die man mit diesem Gerät hat.
und hier die Lösung
@paul53 sagte in Payload Daten in Objekte schreiben:
@marc-berg sagte: unterschiedliche Payloads
Dann sollte man prüfen.
-
Komme mit mit Blockly nicht klar.
Muss ich die Variablen "payload","jason" vorher erstellen? Wo?
Muss ich im Attribut "uplink_message...." den Pfad zu meinem Objekt reinkopieren?
So sieht meine Struktur aus:
Ich sende keine Befehle, sondern empfange nur welche von LoRaWan.
Muss ich trotzdem die Abfrage machen?
Irgendwie bin ich dazu zu blöd. -
@gregors sagte: Muss ich die Variablen "payload","jason" vorher erstellen? Wo?
Die Variable
payload
muss unter "Variablen" erstellt werden.
Der Datenpunkt "up" dient als Trigger:Wert
findet man unter "Trigger". -
@gregors sagte: Brauche da wohl ein bisschen Nachilfe.
const idUp = 'mqtt.2.v3.gs-mg-dragino-01@ttn.devices.eui-a840414601871305.up'/*v3/gs-mg-dragino-01@ttn/devices/eui-a840414601871305/up*/; on(idUp, function (dp) { let payload = JSON.parse(dp.state.val).uplink_message.decoded_paylod; if(payload && payload.AVI1_V != undefined) { setState("0_userdata.0.LoRaWAN.eui-a840414601871305.ACI_1", Math.round(payload.ACI1_mA * 100) / 100, true); setState("0_userdata.0.LoRaWAN.eui-a840414601871305.ACI_2", Math.round(payload.ACI2_mA * 100) / 100, true); setState("0_userdata.0.LoRaWAN.eui-a840414601871305.AVI_1", Math.round(payload.AVI1_V * 100) / 100, true); setState("0_userdata.0.LoRaWAN.eui-a840414601871305.AVI_2", Math.round(payload.AVI2_V * 100) / 100, true); } });
Zum Triggern muss die DP-ID - nicht der DP-Name - verwendet werden.
-
Habe ich ausprobiert.
Keine Fehler mehr, aber es wird nichts in die Objekte geschrieben.