Ich habe mich mal an den Webhooks bei TTN versucht.
Ein data
Block vom TTN-Event sieht zB so aus:
"data": {
"@type": "type.googleapis.com/ttn.lorawan.v3.ApplicationUp",
"end_device_ids": {
"device_id": "hiveeyes-thias-freiland-hive2",
"application_ids": {
"application_id": "hiveeyes"
},
"dev_eui": "00465D1CCFB4A17A",
"join_eui": "70B3D57ED0007AA4",
"dev_addr": "260B35C2"
},
"correlation_ids": [
"as:up:01FSRWFW1R4AH0ZMZT2S0W79H9",
"gs:conn:01FS1XREKAF1VGXD79TV7QXCZN",
"gs:up:host:01FS1XREN37S08XY8TQABVMKV2",
"gs:uplink:01FSRWFVTX04GS2NBSYTT1KTJZ",
"ns:uplink:01FSRWFVV2FQCC9XXPXXZKKZHT",
"rpc:/ttn.lorawan.v3.GsNs/HandleUplink:01FSRWFVV121HBKGFRNBHNEQXY",
"rpc:/ttn.lorawan.v3.NsAs/HandleUplink:01FSRWFW1Q69FFWRVZ6JK5T7D2"
],
"received_at": "2022-01-19T10:00:35.642012331Z",
"uplink_message": {
"session_key_id": "AX5KoGq/st4z2NPfzyALvg==",
"f_port": 1,
"f_cnt": 2181,
"frm_payload": "AQIXBgICFuQCZwAqAmi3A2cAIgMCAV0=",
"decoded_payload": {
"analog_in_1": 58.94,
"analog_in_2": 58.6,
"analog_in_3": 3.49,
"relative_humidity_2": 91.5,
"temperature_2": 4.2,
"temperature_3": 3.4
},
"rx_metadata": [
{
"gateway_ids": {
"gateway_id": "machbar-ffp",
"eui": "B827EBFFFE9EE1AB"
},
"time": "2022-01-19T10:00:35.392669Z",
"timestamp": 1867852644,
"rssi": -100,
"channel_rssi": -100,
"snr": 2.5,
"location": {
"latitude": 52.38947922585195,
"longitude": 13.078503949318263,
"altitude": 35,
"source": "SOURCE_REGISTRY"
},
"uplink_token": "ChkKFwoLbWFjaGJhci1mZnASCLgn6//+nuGrEOTW1PoGGgwIw8KfjwYQsefnyAEgoP3Fpa6drwEqDAjDwp+PBhDIzp67AQ==",
"channel_index": 6
}
],
"settings": {
"data_rate": {
"lora": {
"bandwidth": 125000,
"spreading_factor": 7
}
},
"coding_rate": "4/5",
"frequency": "867700000",
"timestamp": 1867852644,
"time": "2022-01-19T10:00:35.392669Z"
},
"received_at": "2022-01-19T10:00:35.426356023Z",
"consumed_airtime": "0.077056s",
"locations": {
"user": {
"latitude": 52.389433391870924,
"longitude": 13.078771058635807,
"altitude": 35,
"source": "SOURCE_REGISTRY"
}
},
"network_ids": {
"net_id": "000013",
"tenant_id": "ttn",
"cluster_id": "ttn-eu1"
}
}
},
Recap von gegenwärtiger Lösung mit Putsreq:
- TTN-Webhook direkt an Putsreq
-
Putsreq extahiert das
decoded_payload
aus dem Uplink JSON, welches im Block uplink_message.decoded_payload
residiert. Zusätzlich entnimmt das Skript einige Parameter über die Empfangseigenschaften des Pakets aus uplink_message.rx_metadata
und uplink_message.settings
. zB RSSI, SNR, SF und BW.
- Das Topic wird aus der TTN
devID
abgeleitet per replace(/-/g, '/') + "/data"
Bedeutet also, dass die devID 4 Komponenten haben muss, die den MQTT Topiclevels entsprechen. Hat den Vorteil, dass man all seine Devices in die gleiche TTN App legen kann und trotzdem Kontrolle auf das gesamte Topic hat. Bei der direkten Variante unten geht das nicht.
Aus devID=hiveeyes-thias-freiland-hive2
wird dann hiveeyes/thias/freiland/hive2/data
- Das alles wird in ein eindimensionales JSON verpackt und dann an die swarm API gesendet.
Vision: Kotori vesteht das Webhook Payload direkt:
Mit dem gegenwärtigen Fähigkeiten von Kotori ist die Annahme von device-spezifisches Topics insofern möglich, als dass man die ersten drei Levels vom Topics (/+/+/+/
) schon im Basepath fixieren und dem Device einen kurzen Namen für das letzte Level vergeben müsste. Sehr ähnlich dem Vorschlag von @MKO oben. Der Webhook wird dann so konfiguriert:
Das Problem ist jetzt wohl das große und verschachtelte JSON, welches von TTN ankommt. zB:
(hier noch mit meiner langen Device ID)
hiveeyes/thias/freiland/hiveeyes-thias-freiland-hive2/data.json {"end_device_ids": {"device_id": "hiveeyes-thias-freiland-hive2", "application_ids": {"application_id": "hiveeyes"}, "dev_eui": "00465D1CCFB4A17A", "join_eui": "70B3D57ED0007AA4", "dev_addr": "260B35C2"}, "correlation_ids": ["as:up:01FSRWFW1R4AH0ZMZT2S0W79H9", "gs:conn:01FS1XREKAF1VGXD79TV7QXCZN", "gs:up:host:01FS1XREN37S08XY8TQABVMKV2", "gs:uplink:01FSRWFVTX04GS2NBSYTT1KTJZ", "ns:uplink:01FSRWFVV2FQCC9XXPXXZKKZHT", "rpc:/ttn.lorawan.v3.GsNs/HandleUplink:01FSRWFVV121HBKGFRNBHNEQXY", "rpc:/ttn.lorawan.v3.NsAs/HandleUplink:01FSRWFW1Q69FFWRVZ6JK5T7D2"], "received_at": "2022-01-19T10:00:35.642012331Z", "uplink_message": {"session_key_id": "AX5KoGq/st4z2NPfzyALvg==", "f_port": 1, "f_cnt": 2181, "frm_payload": "AQIXBgICFuQCZwAqAmi3A2cAIgMCAV0=", "decoded_payload": {"analog_in_1": 58.94, "analog_in_2": 58.6, "analog_in_3": 3.49, "relative_humidity_2": 91.5, "temperature_2": 4.2, "temperature_3": 3.4}, "rx_metadata": [{"gateway_ids": {"gateway_id": "machbar-ffp", "eui": "B827EBFFFE9EE1AB"}, "time": "2022-01-19T10:00:35.392669Z", "timestamp": 1867852644, "rssi": -100, "channel_rssi": -100, "snr": 2.5, "location": {"latitude": 52.38947922585195, "longitude": 13.078503949318263, "altitude": 35, "source": "SOURCE_REGISTRY"}, "uplink_token": "ChkKFwoLbWFjaGJhci1mZnASCLgn6//+nuGrEOTW1PoGGgwIw8KfjwYQsefnyAEgoP3Fpa6drwEqDAjDwp+PBhDIzp67AQ==", "channel_index": 6}], "settings": {"data_rate": {"lora": {"bandwidth": 125000, "spreading_factor": 7}}, "coding_rate": "4/5", "frequency": "867700000", "timestamp": 1867852644, "time": "2022-01-19T10:00:35.392669Z"}, "received_at": "2022-01-19T10:00:35.426356023Z", "consumed_airtime": "0.077056s", "locations": {"user": {"latitude": 52.389433391870924, "longitude": 13.078771058635807, "altitude": 35, "source": "SOURCE_REGISTRY"}}, "network_ids": {"net_id": "000013", "tenant_id": "ttn", "cluster_id": "ttn-eu1"}}}
Die Möglichkeit nur bestimmte Blöcke in den Webhook zu leiten, ist nicht vorgesehen bei TTN. Kotori quittiert das jedenfalls mit:
hiveeyes/thias/freiland/hiveeyes-thias-freiland-hive2/error.json {
"type": "<class 'influxdb.exceptions.InfluxDBClientError'>",
"message": "400: {\"error\":\"unable to parse 'freiland_hiveeyes_thias_freiland_hive2_sensors
...