diff --git a/src/udi/handlers/ttn/emu-example.json b/src/udi/handlers/ttn/emu-example.json index 02dc180..980e485 100644 --- a/src/udi/handlers/ttn/emu-example.json +++ b/src/udi/handlers/ttn/emu-example.json @@ -9,67 +9,36 @@ "dev_addr": "260B0E1A" }, "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": { "session_key_id": "AYxJcJyrJgr7XiIUdO3EBA==", - "f_port": 1, - "f_cnt": 64, - "frm_payload": "3B1zZQsAAAAADAAAAAANAAAAAA4AAAAAFwAYABkA8ABm", + "f_port": 2, + "f_cnt": 374, + "frm_payload": "BEFzZSQAAAAAAAAAACYAAAAAAAAAACgAAAAAAAAAACoAAAAAAAAAAMk=", "decoded_payload": { - "Active Power L1": { - "cfgphase": 1, - "unit": "W", + "Active Energy Export T1 64bit": { + "unit": "Wh", "value": 0 }, - "Active Power L123": { - "unit": "W", + "Active Energy Import T1 64bit": { + "unit": "Wh", "value": 0 }, - "Active Power L2": { - "cfgphase": 2, - "unit": "W", + "Reactive Energy Export T1 64bit": { + "unit": "varh", "value": 0 }, - "Active Power L3": { - "cfgphase": 3, - "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, + "Reactive Energy Import T1 64bit": { + "unit": "varh", "value": 0 }, "medium": { "desc": "Electricity", "type": 1 }, - "timeStamp": 1702043100 + "timeStamp": 1702052100 }, "rx_metadata": [ { @@ -77,18 +46,18 @@ "gateway_id": "eui-b827ebfffe8b01dd", "eui": "B827EBFFFE8B01DD" }, - "time": "2023-12-08T13:45:33.311665058Z", - "timestamp": 3841207982, - "rssi": -86, - "channel_rssi": -86, - "snr": 13.25, + "time": "2023-12-08T16:22:40.969499111Z", + "timestamp": 383972090, + "rssi": -93, + "channel_rssi": -93, + "snr": 12.75, "location": { "latitude": 51.404164272478724, "longitude": 7.060088589208832, "source": "SOURCE_REGISTRY" }, - "uplink_token": "CiIKIAoUZXVpLWI4MjdlYmZmZmU4YjAxZGQSCLgn6//+iwHdEK7d0KcOGgsI/rvMqwYQn82PDCCwr9nO5eulAg==", - "received_at": "2023-12-08T13:45:34.006723465Z" + "uplink_token": "CiIKIAoUZXVpLWI4MjdlYmZmZmU4YjAxZGQSCLgn6//+iwHdEPrli7cBGgwI0YXNqwYQoteqxwIgkMGUtJb+pwI=", + "received_at": "2023-12-08T16:22:41.668146811Z" } ], "settings": { @@ -99,13 +68,13 @@ "coding_rate": "4/5" } }, - "frequency": "868300000", - "timestamp": 3841207982, - "time": "2023-12-08T13:45:33.311665058Z" + "frequency": "867700000", + "timestamp": 383972090, + "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, - "consumed_airtime": "0.092416s", + "consumed_airtime": "0.102656s", "version_ids": { "brand_id": "emu", "model_id": "emu-prof-ii", diff --git a/src/udi/handlers/ttn/models/emuProfIILoRa/emuProfIILoRa.go b/src/udi/handlers/ttn/models/emuProfIILoRa/emuProfIILoRa.go deleted file mode 100644 index 3695e97..0000000 --- a/src/udi/handlers/ttn/models/emuProfIILoRa/emuProfIILoRa.go +++ /dev/null @@ -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") -} - diff --git a/src/udi/handlers/ttn/models/emuProfIILoRaCfg1/emuProfIILoRaCfg1.go b/src/udi/handlers/ttn/models/emuProfIILoRaCfg1/emuProfIILoRaCfg1.go new file mode 100644 index 0000000..d1cf9af --- /dev/null +++ b/src/udi/handlers/ttn/models/emuProfIILoRaCfg1/emuProfIILoRaCfg1.go @@ -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 +} + diff --git a/src/udi/handlers/ttn/ttn.go b/src/udi/handlers/ttn/ttn.go index d30fa6e..416918f 100644 --- a/src/udi/handlers/ttn/ttn.go +++ b/src/udi/handlers/ttn/ttn.go @@ -5,7 +5,7 @@ import "fmt" import "encoding/json" import "udi/config" import "udi/handlers/handler" -import "udi/handlers/ttn/models/emuProfIILoRa" +import "udi/handlers/ttn/models/emuProfIILoRaCfg1" import "udi/database" 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) - var parser func(interface{}) ([]database.VariableType, error) + var parser func(int, interface{}) (map[string]database.VariableType, error) switch device.DeviceType.ModelIdentifier { - case "emu-prof-ii-lora": - parser = emuProfIILoRa.Parse + case "emu-prof-ii-lora-cfg1": + 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 { lost(fmt.Sprintf("Model parser failed: %s", err3), message) return