From 81e067e672da74d7b7e4f2495d2465d8a797fb19 Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Mon, 11 Nov 2024 16:11:32 +0100 Subject: [PATCH] seems to work now --- .../z2m/models/wsdcgq11lm/wsdcgq11lm.go | 37 ---------------- src/udi/handlers/z2m/z2m.go | 44 ++++++++++++++++--- 2 files changed, 37 insertions(+), 44 deletions(-) diff --git a/src/udi/handlers/z2m/models/wsdcgq11lm/wsdcgq11lm.go b/src/udi/handlers/z2m/models/wsdcgq11lm/wsdcgq11lm.go index d9f435b..db7ffd2 100644 --- a/src/udi/handlers/z2m/models/wsdcgq11lm/wsdcgq11lm.go +++ b/src/udi/handlers/z2m/models/wsdcgq11lm/wsdcgq11lm.go @@ -1,13 +1,5 @@ package wsdcgq11lm -import ( - //"log" - "fmt" - "reflect" - "encoding/json" - "udi/database" -) - type Observation struct { LinkQuality uint8 `unit:"" json:"linkquality"` Battery uint8 `unit:"%" json:"battery"` @@ -17,32 +9,3 @@ type Observation struct { Voltage uint16 `unit:"mV" json:"voltage"` } - -func Parse(payload string, variables *map[string]database.VariableType, attributes *map[string]interface{}, _ *database.Device) error { - var observation Observation - err := json.Unmarshal([]byte(payload), &observation) - if err != nil { - return fmt.Errorf("Unable to parse payload into Observation struct: %v, %s", err, payload) - } - - observationType := reflect.TypeOf(observation) - observationValue := reflect.ValueOf(observation) - - for i := 0; i < observationType.NumField(); i++ { - field := observationType.Field(i) - name := field.Name - unit := field.Tag.Get("unit") - value := observationValue.Field(i).Interface() - - (*variables)[name] = database.VariableType { - Label: name, - Variable: "y", - Unit: unit, - Value: value, - } - } - - (*attributes)["Status"] = "ok" - - return nil -} diff --git a/src/udi/handlers/z2m/z2m.go b/src/udi/handlers/z2m/z2m.go index d9427f2..a9dc3c5 100644 --- a/src/udi/handlers/z2m/z2m.go +++ b/src/udi/handlers/z2m/z2m.go @@ -5,7 +5,8 @@ import ( "log" "time" "strings" - //"encoding/json" + "reflect" + "encoding/json" "udi/config" "udi/handlers/handler" "udi/database" @@ -18,6 +19,35 @@ type Z2MHandler struct { dbh *database.DatabaseHandle } +func parse(T any, payload string, variables *map[string]database.VariableType, attributes *map[string]interface{}) error { + observationType := reflect.TypeOf(T) + observation := reflect.New(observationType).Interface() + + err := json.Unmarshal([]byte(payload), observation) + if err != nil { + return fmt.Errorf("Unable to parse payload into Observation struct: %v, %s", err, payload) + } + + observationValue := reflect.ValueOf(observation).Elem() + + for i := 0; i < observationType.NumField(); i++ { + field := observationType.Field(i) + name := field.Name + unit := field.Tag.Get("unit") + value := observationValue.Field(i).Interface() + + (*variables)[name] = database.VariableType { + Label: name, + Variable: "y", + Unit: unit, + Value: value, + } + } + + (*attributes)["Status"] = "ok" + + return nil +} func New(id string, config config.HandlerConfigT) handler.Handler { t := &Z2MHandler { @@ -47,10 +77,10 @@ func (self *Z2MHandler) Handle(message handler.MessageT) { measurement.Application = device.Application.Label measurement.Device = device.Attributes["Label"].(string) - var parser func(string, *map[string]database.VariableType, *map[string]interface{}, *database.Device) error + var T any switch device.DeviceType.ModelIdentifier { case "WSDCGQ11LM": - parser = wsdcgq11lm.Parse + T = wsdcgq11lm.Observation{} default: self.Lost(fmt.Sprintf("No parser found for %s", device.DeviceType.ModelIdentifier), nil, message) return @@ -58,10 +88,10 @@ func (self *Z2MHandler) Handle(message handler.MessageT) { measurement.Values = make(map[string]database.VariableType) measurement.Attributes = make(map[string]interface{}) - err3 := parser(message.Payload, - &(measurement.Values), - &(measurement.Attributes), - device) + err3 := parse(T, + message.Payload, + &(measurement.Values), + &(measurement.Attributes)) if err3 != nil { self.Lost("Model parser failed", err3, message) return