wie decodiere ich die Payload von TTN (Base64)?

Begonnen von Kristof, 16 Juli 2021, 10:20:36

Vorheriges Thema - Nächstes Thema

Kristof

Hallo Forum,

ich versuche gerade einen Sensor, den ich per LoRa in TheThingsNetwork eingebunden habe, in meiner FHEM-Umgebung zu verarbeiten. In TTN habe ich MQTT aktiviert und in FHEM erfolgreich ein MQTT2_DEVICE eingerichtet. Jetzt kommen die Daten an. Unter all den vielen Readings ist auch das eine, das mich "wirklich" interessiert: uplink_message_frm_payload
Kleiner Haken: die Daten sind Base64 codiert.  ???
Daher jetzt meine Frage: wie kann ich das Reading wieder decodieren, so dass ich an die eigentliche Payload herankomme? Geht das mit FHEM-Boardmitteln?

Ich bin mir bewusst, dass diese Frage hier unter MQTT vielleicht nicht wirklich richtig aufgehoben ist, wusste es aber einfach nicht besser - ich bitte um Nachsicht! :-[

Gruß
Kristof

Beta-User

#1
Hast du denn Perl-Code, um das decoding zu machen?

An sich ist es zumindest theoretisch einfach: Du übergibst $EVENT (=die Payload) an deine Funktion. Ggf. musst du dann halt noch dafür sorgen, dass die Funktion auch den Schlüssel findet...

Mit Glaskugel geraten so in der Art halt:
attr DEVICE readingList topic/branch1/subbranch/uplink_message_frm_payload { myDecodingCode($EVENT, 'secret') }

Nachtrag noch: deine Funktion sollte dann einen HASH zurückgeben mit { Readingname => "Wert" }
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

rudolfkoenig

Zitatwie kann ich das Reading wieder decodieren
Mit decode_base64() aus dem MIME::Base64 Modul, was meines Wissens mit perl mitinstalliert wird, und u.a. von FHEMWEB geladen wird.

Kristof

Danke für Eure Tipps und die prompte Reaktion!

Ich habe es jetzt mit einem userReading gelöst:
attr MQTT2_TTNGate userReadings Nutzlast {decode_base64(ReadingsVal("MQTT2_TTNGate","uplink_message_frm_payload",0))}

Klappt einwandfrei  :) Vorher hatte ich es mit readingList probiert, habe das aber mangels Perl-Kenntnissen nicht hinbekommen...

Jetzt habe ich allerdings immer wieder "automatisch" das hier:
attr MQTT2_TTNGate readingList TTNGate:v3/bienenwaage-nr-1\x40ttn/devices/stockwaage1/up:.* { json2nameValue($EVENT) }

Das lösche ich (deleteattr), speichere alles (Save config) und es ist weg ... bis eine neue MQTT-Nachricht eingeht - dann ist die readingList wieder da. Gehört das so oder mache ich was falsch?

Gruß
Kristof

Beta-User

Zitat von: Kristof am 16 Juli 2021, 11:55:28
Jetzt habe ich allerdings immer wieder "automatisch" das hier:
attr MQTT2_TTNGate readingList TTNGate:v3/bienenwaage-nr-1\x40ttn/devices/stockwaage1/up:.* { json2nameValue($EVENT) }
Falls in deinem (RAW-) list nicht zu viele Geheimnisse drin sind, wäre es evtl. einfacher, du könntest mal das ganze Device zeigen...?

Vermutlich ist das der Pfad, über den die Info reinkommt, irgendwo muss die eigentliche Info ja herkommen...?

Eventuell geht es so direkt:
attr MQTT2_TTNGate readingList TTNGate:v3/bienenwaage-nr-1\x40ttn/devices/stockwaage1/up:.* { my $rets = json2nameValue($EVENT);; my $val = decode_base64($rets->{uplink_message_frm_payload}); return { Nutzlast => $val } }

Ansonsten: userReadings bitte immer mit sauberem Trigger. Ist hier (noch) nicht wichtig, weil es scheinbar eh nur ein Reading gibt, aber trotzdem...
Und wenn, dann eher so:
attr MQTT2_TTNGate userReadings Nutzlast:uplink_message_frm_payload.* {decode_base64(ReadingsVal($name,'uplink_message_frm_payload',0))}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Kristof

#5
 ;) nein, Geheimnisse sind da keine drin:

defmod MQTT2_TTNGate MQTT2_DEVICE TTNGate
attr MQTT2_TTNGate IODev TTNGate
attr MQTT2_TTNGate readingList TTNGate:v3/bienenwaage-nr-1\x40ttn/devices/stockwaage1/up:.* { my $rets = json2nameValue($EVENT);;;; my $val = decode_base64($rets->{uplink_message_frm_payload});; return { Nutzlast => $val } }
attr MQTT2_TTNGate room MQTT2_DEVICE

setstate MQTT2_TTNGate 2021-07-16 11:50:44 correlation_ids_1 as:up:01FAQBKDK16YE1NRQPQ2GP6ANY
setstate MQTT2_TTNGate 2021-07-16 11:50:44 correlation_ids_2 rpc:/ttn.lorawan.v3.AppAs/SimulateUplink:3d1f72ec-be73-4cd2-b7e9-d5a43be52809
setstate MQTT2_TTNGate 2021-07-16 11:27:20 correlation_ids_3 pba:conn:up:01FAG0YDWHZ1B230NJRC6NGY0Y
setstate MQTT2_TTNGate 2021-07-16 11:27:20 correlation_ids_4 pba:uplink:01FAQA8HPM93VP8FFM5GYJK862
setstate MQTT2_TTNGate 2021-07-16 11:27:20 correlation_ids_5 rpc:/ttn.lorawan.v3.GsNs/HandleUplink:01FAQA8HPRS1SYZNTTKYMF9PZY
setstate MQTT2_TTNGate 2021-07-16 11:27:20 correlation_ids_6 rpc:/ttn.lorawan.v3.NsAs/HandleUplink:01FAQA8J0F4C05KRBXSXNV450N
setstate MQTT2_TTNGate 2021-07-16 11:50:44 end_device_ids_application_ids_application_id bienenwaage-nr-1
setstate MQTT2_TTNGate 2021-07-16 11:27:20 end_device_ids_dev_addr 260B622B
setstate MQTT2_TTNGate 2021-07-16 11:50:44 end_device_ids_dev_eui 0803197011031942
setstate MQTT2_TTNGate 2021-07-16 11:50:44 end_device_ids_device_id stockwaage1
setstate MQTT2_TTNGate 2021-07-16 11:50:44 received_at 2021-07-16T09:50:44.322175455Z
setstate MQTT2_TTNGate 2021-07-16 11:50:44 simulated true
setstate MQTT2_TTNGate 2021-07-16 11:27:20 uplink_message_consumed_airtime 0.082176s
setstate MQTT2_TTNGate 2021-07-16 11:27:20 uplink_message_f_cnt 883
setstate MQTT2_TTNGate 2021-07-16 11:50:44 uplink_message_f_port 1
setstate MQTT2_TTNGate 2021-07-16 11:50:44 uplink_message_frm_payload aGVsbG8gd29ybGQxIQ==
setstate MQTT2_TTNGate 2021-07-16 11:50:44 uplink_message_locations_user_latitude 47.------------
setstate MQTT2_TTNGate 2021-07-16 11:50:44 uplink_message_locations_user_longitude 7.------------
setstate MQTT2_TTNGate 2021-07-16 11:50:44 uplink_message_locations_user_source SOURCE_REGISTRY
setstate MQTT2_TTNGate 2021-07-16 11:50:44 uplink_message_received_at 0001-01-01T00:00:00Z
setstate MQTT2_TTNGate 2021-07-16 11:50:44 uplink_message_rx_metadata_1_channel_rssi 42
setstate MQTT2_TTNGate 2021-07-16 11:50:44 uplink_message_rx_metadata_1_gateway_ids_gateway_id test
setstate MQTT2_TTNGate 2021-07-16 11:27:20 uplink_message_rx_metadata_1_packet_broker_forwarder_cluster_id ttn-v2-eu-4
setstate MQTT2_TTNGate 2021-07-16 11:27:20 uplink_message_rx_metadata_1_packet_broker_forwarder_gateway_eui 0003FCC23D11----
setstate MQTT2_TTNGate 2021-07-16 11:27:20 uplink_message_rx_metadata_1_packet_broker_forwarder_gateway_id eui-0003fcc23d11----
setstate MQTT2_TTNGate 2021-07-16 11:27:20 uplink_message_rx_metadata_1_packet_broker_forwarder_net_id 000013
setstate MQTT2_TTNGate 2021-07-16 11:27:20 uplink_message_rx_metadata_1_packet_broker_forwarder_tenant_id ttnv2
setstate MQTT2_TTNGate 2021-07-16 11:27:20 uplink_message_rx_metadata_1_packet_broker_home_network_cluster_id ttn-eu1
setstate MQTT2_TTNGate 2021-07-16 11:27:20 uplink_message_rx_metadata_1_packet_broker_home_network_net_id 000013
setstate MQTT2_TTNGate 2021-07-16 11:27:20 uplink_message_rx_metadata_1_packet_broker_home_network_tenant_id ttn
setstate MQTT2_TTNGate 2021-07-16 11:27:20 uplink_message_rx_metadata_1_packet_broker_message_id 01FAQA8HPM93VP8FFM5GYJK862
setstate MQTT2_TTNGate 2021-07-16 11:50:44 uplink_message_rx_metadata_1_rssi 42
setstate MQTT2_TTNGate 2021-07-16 11:50:44 uplink_message_rx_metadata_1_snr 4.2
setstate MQTT2_TTNGate 2021-07-16 11:27:20 uplink_message_rx_metadata_1_time 2021-07-16T09:27:19.480285Z
setstate MQTT2_TTNGate 2021-07-16 11:27:20 uplink_message_rx_metadata_1_uplink_token eyJnIjoiWlhsS2FHSkhZMmxQYVVwQ1...-----
setstate MQTT2_TTNGate 2021-07-16 11:27:20 uplink_message_settings_coding_rate 4/5
setstate MQTT2_TTNGate 2021-07-16 11:27:20 uplink_message_settings_data_rate_index 5
setstate MQTT2_TTNGate 2021-07-16 11:50:44 uplink_message_settings_data_rate_lora_bandwidth 125000
setstate MQTT2_TTNGate 2021-07-16 11:50:44 uplink_message_settings_data_rate_lora_spreading_factor 7
setstate MQTT2_TTNGate 2021-07-16 11:27:20 uplink_message_settings_frequency 868100000


und das zugehörige IODev:
defmod TTNGate MQTT2_CLIENT eu1.cloud.thethings.network:1883
attr TTNGate autocreate simple
attr TTNGate username -----@ttn

setstate TTNGate opened
setstate TTNGate 2021-07-16 09:29:48 state opened


Sorry, dass ich das bisher nicht gezeigt habe - ich nahm einfach nur an, dass da ja nur die ersten 5 Zeilen relevant sind. Abzüglich "room" und die ja erst auf Eure Hinweise hin angelegten "userReadings" und das "readingList".
Mit deinem Vorschlag zur readingList funktioniert es jetzt einwandfrei, das userReading habe ich entfernt.

Ich danke euch!!


Beta-User

Na ja, den "token" könntest du vielleicht löschen, da sind ja doch einige mehr Infos in dem JSON drin gewesen (war ja eigentlich zu erwarten bei dem Readingnamen...).

"Unser" Reading ist aber gar nicht zu sehen?

(Und den ganzen Rest brauchst du nicht?)
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Kristof

Ich muss ja zugeben, dass ich von JSON (noch?) keine Ahnung habe, ebenso wie vom Inhalt des Token-Reading.
"Unser" Reading versteckt sich direkt über den beiden GPS-Koordinaten in der 16ten "setReading"-Zeile und ist durch die Base64-Codierung leicht am "==" am Ende zu erkennen...
Der ganze Rest ist eigentlich nicht wirklich spannend, wenn die Funkübertragung mal stabil läuft. Vielleicht noch "uplink_message_f_cnt 883", was einen fortlaufenden Zähler der Nachrichtenpakete darstellt und womit man feststellen kann, ob alles sauber ankommt oder Pakete verloren gehen.
Für's Erste jedenfalls bin ich mit meinem "Nutzlast"-Reading vollauf zufrieden und mal wieder begeistert, wie flexibel FHEM ist und was es alles für Möglichkeiten bietet - die sich mir Dank der Unterstützung hier aus dem Forum eröffnen.