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 package wsdcgq11lm
import (
//"log"
"fmt"
"reflect"
"encoding/json"
"udi/database"
)
type Observation struct { type Observation struct {
LinkQuality uint8 `unit:"" json:"linkquality"` LinkQuality uint8 `unit:"" json:"linkquality"`
Battery uint8 `unit:"%" json:"battery"` Battery uint8 `unit:"%" json:"battery"`
@ -17,32 +9,3 @@ type Observation struct {
Voltage uint16 `unit:"mV" json:"voltage"` 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" "log"
"time" "time"
"strings" "strings"
//"encoding/json" "reflect"
"encoding/json"
"udi/config" "udi/config"
"udi/handlers/handler" "udi/handlers/handler"
"udi/database" "udi/database"
@ -18,6 +19,35 @@ type Z2MHandler struct {
dbh *database.DatabaseHandle 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 { func New(id string, config config.HandlerConfigT) handler.Handler {
t := &Z2MHandler { t := &Z2MHandler {
@ -47,10 +77,10 @@ func (self *Z2MHandler) Handle(message handler.MessageT) {
measurement.Application = device.Application.Label measurement.Application = device.Application.Label
measurement.Device = device.Attributes["Label"].(string) 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 { switch device.DeviceType.ModelIdentifier {
case "WSDCGQ11LM": case "WSDCGQ11LM":
parser = wsdcgq11lm.Parse T = wsdcgq11lm.Observation{}
default: default:
self.Lost(fmt.Sprintf("No parser found for %s", device.DeviceType.ModelIdentifier), nil, message) self.Lost(fmt.Sprintf("No parser found for %s", device.DeviceType.ModelIdentifier), nil, message)
return return
@ -58,10 +88,10 @@ func (self *Z2MHandler) Handle(message handler.MessageT) {
measurement.Values = make(map[string]database.VariableType) measurement.Values = make(map[string]database.VariableType)
measurement.Attributes = make(map[string]interface{}) measurement.Attributes = make(map[string]interface{})
err3 := parser(message.Payload, err3 := parse(T,
&(measurement.Values), message.Payload,
&(measurement.Attributes), &(measurement.Values),
device) &(measurement.Attributes))
if err3 != nil { if err3 != nil {
self.Lost("Model parser failed", err3, message) self.Lost("Model parser failed", err3, message)
return return