@ -9,67 +9,36 @@
|
|||||||
"dev_addr": "260B0E1A"
|
"dev_addr": "260B0E1A"
|
||||||
},
|
},
|
||||||
"correlation_ids": [
|
"correlation_ids": [
|
||||||
"gs:uplink:01HH4TTA29NV2GZXGYQ61R2BVZ"
|
"gs:uplink:01HH53T0RPG7QFT6N267J3Q2PA"
|
||||||
],
|
],
|
||||||
"received_at": "2023-12-08T13:45:34.236364394Z",
|
"received_at": "2023-12-08T16:22:41.900339885Z",
|
||||||
"uplink_message": {
|
"uplink_message": {
|
||||||
"session_key_id": "AYxJcJyrJgr7XiIUdO3EBA==",
|
"session_key_id": "AYxJcJyrJgr7XiIUdO3EBA==",
|
||||||
"f_port": 1,
|
"f_port": 2,
|
||||||
"f_cnt": 64,
|
"f_cnt": 374,
|
||||||
"frm_payload": "3B1zZQsAAAAADAAAAAANAAAAAA4AAAAAFwAYABkA8ABm",
|
"frm_payload": "BEFzZSQAAAAAAAAAACYAAAAAAAAAACgAAAAAAAAAACoAAAAAAAAAAMk=",
|
||||||
"decoded_payload": {
|
"decoded_payload": {
|
||||||
"Active Power L1": {
|
"Active Energy Export T1 64bit": {
|
||||||
"cfgphase": 1,
|
"unit": "Wh",
|
||||||
"unit": "W",
|
|
||||||
"value": 0
|
"value": 0
|
||||||
},
|
},
|
||||||
"Active Power L123": {
|
"Active Energy Import T1 64bit": {
|
||||||
"unit": "W",
|
"unit": "Wh",
|
||||||
"value": 0
|
"value": 0
|
||||||
},
|
},
|
||||||
"Active Power L2": {
|
"Reactive Energy Export T1 64bit": {
|
||||||
"cfgphase": 2,
|
"unit": "varh",
|
||||||
"unit": "W",
|
|
||||||
"value": 0
|
"value": 0
|
||||||
},
|
},
|
||||||
"Active Power L3": {
|
"Reactive Energy Import T1 64bit": {
|
||||||
"cfgphase": 3,
|
"unit": "varh",
|
||||||
"unit": "W",
|
|
||||||
"value": 0
|
|
||||||
},
|
|
||||||
"Powerfactor L1": {
|
|
||||||
"cfgphase": 1,
|
|
||||||
"unit": "Cos",
|
|
||||||
"value": 0,
|
|
||||||
"value_raw": 0
|
|
||||||
},
|
|
||||||
"Powerfactor L2": {
|
|
||||||
"cfgphase": 2,
|
|
||||||
"unit": "Cos",
|
|
||||||
"value": 0,
|
|
||||||
"value_raw": 0
|
|
||||||
},
|
|
||||||
"Powerfactor L3": {
|
|
||||||
"cfgphase": 3,
|
|
||||||
"unit": "Cos",
|
|
||||||
"value": 0,
|
|
||||||
"value_raw": 0
|
|
||||||
},
|
|
||||||
"errorcode": {
|
|
||||||
"CTRatioChange": false,
|
|
||||||
"ImpulseRatioChange": false,
|
|
||||||
"ImpulseWidthChange": false,
|
|
||||||
"LogbookFull": false,
|
|
||||||
"PowerFail": false,
|
|
||||||
"TimeChanged": false,
|
|
||||||
"VTRatioChange": false,
|
|
||||||
"value": 0
|
"value": 0
|
||||||
},
|
},
|
||||||
"medium": {
|
"medium": {
|
||||||
"desc": "Electricity",
|
"desc": "Electricity",
|
||||||
"type": 1
|
"type": 1
|
||||||
},
|
},
|
||||||
"timeStamp": 1702043100
|
"timeStamp": 1702052100
|
||||||
},
|
},
|
||||||
"rx_metadata": [
|
"rx_metadata": [
|
||||||
{
|
{
|
||||||
@ -77,18 +46,18 @@
|
|||||||
"gateway_id": "eui-b827ebfffe8b01dd",
|
"gateway_id": "eui-b827ebfffe8b01dd",
|
||||||
"eui": "B827EBFFFE8B01DD"
|
"eui": "B827EBFFFE8B01DD"
|
||||||
},
|
},
|
||||||
"time": "2023-12-08T13:45:33.311665058Z",
|
"time": "2023-12-08T16:22:40.969499111Z",
|
||||||
"timestamp": 3841207982,
|
"timestamp": 383972090,
|
||||||
"rssi": -86,
|
"rssi": -93,
|
||||||
"channel_rssi": -86,
|
"channel_rssi": -93,
|
||||||
"snr": 13.25,
|
"snr": 12.75,
|
||||||
"location": {
|
"location": {
|
||||||
"latitude": 51.404164272478724,
|
"latitude": 51.404164272478724,
|
||||||
"longitude": 7.060088589208832,
|
"longitude": 7.060088589208832,
|
||||||
"source": "SOURCE_REGISTRY"
|
"source": "SOURCE_REGISTRY"
|
||||||
},
|
},
|
||||||
"uplink_token": "CiIKIAoUZXVpLWI4MjdlYmZmZmU4YjAxZGQSCLgn6//+iwHdEK7d0KcOGgsI/rvMqwYQn82PDCCwr9nO5eulAg==",
|
"uplink_token": "CiIKIAoUZXVpLWI4MjdlYmZmZmU4YjAxZGQSCLgn6//+iwHdEPrli7cBGgwI0YXNqwYQoteqxwIgkMGUtJb+pwI=",
|
||||||
"received_at": "2023-12-08T13:45:34.006723465Z"
|
"received_at": "2023-12-08T16:22:41.668146811Z"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"settings": {
|
"settings": {
|
||||||
@ -99,13 +68,13 @@
|
|||||||
"coding_rate": "4/5"
|
"coding_rate": "4/5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"frequency": "868300000",
|
"frequency": "867700000",
|
||||||
"timestamp": 3841207982,
|
"timestamp": 383972090,
|
||||||
"time": "2023-12-08T13:45:33.311665058Z"
|
"time": "2023-12-08T16:22:40.969499111Z"
|
||||||
},
|
},
|
||||||
"received_at": "2023-12-08T13:45:34.027717446Z",
|
"received_at": "2023-12-08T16:22:41.687510109Z",
|
||||||
"confirmed": true,
|
"confirmed": true,
|
||||||
"consumed_airtime": "0.092416s",
|
"consumed_airtime": "0.102656s",
|
||||||
"version_ids": {
|
"version_ids": {
|
||||||
"brand_id": "emu",
|
"brand_id": "emu",
|
||||||
"model_id": "emu-prof-ii",
|
"model_id": "emu-prof-ii",
|
||||||
|
@ -1,11 +0,0 @@
|
|||||||
package emuProfIILoRa
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"udi/database"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Parse(decodedPayload interface{}) ([]database.VariableType, error) {
|
|
||||||
return nil, fmt.Errorf("Nothing works so far")
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,53 @@
|
|||||||
|
package emuProfIILoRaCfg1
|
||||||
|
|
||||||
|
// provisioning device with
|
||||||
|
// f_port=1: 01 00 0A 0B 0C 0D 0E 17 18 19 F0 4C
|
||||||
|
// f_port=2: 01 00 0A 24 26 28 2A 7A
|
||||||
|
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"fmt"
|
||||||
|
//"encoding/json"
|
||||||
|
"udi/database"
|
||||||
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
const nameMapping = map[string]string {
|
||||||
|
"Active Energy Export T1 64bit": "ActiveEnergyExport",
|
||||||
|
"Reactive Energy Export T1 64bit": "ReactiveEnergyExport",
|
||||||
|
"Active Energy Import T1 64bit": "ActiveEnergyImport",
|
||||||
|
"Reactive Energy Import T1 64bit": "ReactiveEnergyImport",
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
type emuVariable struct {
|
||||||
|
Value interface{} `json:"value"`
|
||||||
|
Unit string `json:"unit"`
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func i2m(i interface{}) (map[string]interface{}, error) {
|
||||||
|
o, ok := i.(map[string]interface{})
|
||||||
|
if ! ok {
|
||||||
|
return nil, fmt.Errorf("Unable to transform payload, outer stage")
|
||||||
|
}
|
||||||
|
return o, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func Parse(fPort int, decodedPayload interface{}) (map[string]database.VariableType, error) {
|
||||||
|
dp, err := i2m(decodedPayload)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
variables := make(map[string]database.VariableType)
|
||||||
|
for key, item := range dp {
|
||||||
|
log.Printf("Key: %s, Item: %s", key, item)
|
||||||
|
variables[key] = database.VariableType{ Variable: key, Unit: item.(map[string]interface{})["unit"], Value: item.(map[string]interface{})["value"] }
|
||||||
|
}
|
||||||
|
|
||||||
|
return variables, nil
|
||||||
|
}
|
||||||
|
|
@ -5,7 +5,7 @@ import "fmt"
|
|||||||
import "encoding/json"
|
import "encoding/json"
|
||||||
import "udi/config"
|
import "udi/config"
|
||||||
import "udi/handlers/handler"
|
import "udi/handlers/handler"
|
||||||
import "udi/handlers/ttn/models/emuProfIILoRa"
|
import "udi/handlers/ttn/models/emuProfIILoRaCfg1"
|
||||||
import "udi/database"
|
import "udi/database"
|
||||||
|
|
||||||
var idSeq int = 0
|
var idSeq int = 0
|
||||||
@ -115,13 +115,16 @@ func (self *TTNHandler) Handle(message handler.MessageT) {
|
|||||||
|
|
||||||
log.Printf("DeviceLabel: %s, DeviceType: %s", device.Label, device.DeviceType.ModelIdentifier)
|
log.Printf("DeviceLabel: %s, DeviceType: %s", device.Label, device.DeviceType.ModelIdentifier)
|
||||||
|
|
||||||
var parser func(interface{}) ([]database.VariableType, error)
|
var parser func(int, interface{}) (map[string]database.VariableType, error)
|
||||||
switch device.DeviceType.ModelIdentifier {
|
switch device.DeviceType.ModelIdentifier {
|
||||||
case "emu-prof-ii-lora":
|
case "emu-prof-ii-lora-cfg1":
|
||||||
parser = emuProfIILoRa.Parse
|
parser = emuProfIILoRaCfg1.Parse
|
||||||
|
default:
|
||||||
|
lost(fmt.Sprintf("No parser found for %s", device.DeviceType.ModelIdentifier), message)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err3 := parser(uplinkMessage.UplinkMessage.DecodedPayload)
|
_, err3 := parser(uplinkMessage.UplinkMessage.FPort, uplinkMessage.UplinkMessage.DecodedPayload)
|
||||||
if err3 != nil {
|
if err3 != nil {
|
||||||
lost(fmt.Sprintf("Model parser failed: %s", err3), message)
|
lost(fmt.Sprintf("Model parser failed: %s", err3), message)
|
||||||
return
|
return
|
||||||
|
Reference in New Issue
Block a user