seems to work now

This commit is contained in:
2024-11-11 16:11:32 +01:00
parent 45e4cd793b
commit 81e067e672
2 changed files with 37 additions and 44 deletions

View File

@ -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
}

View File

@ -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