diff --git a/src/udi/handlers/prepared/prepared.go b/src/udi/handlers/prepared/prepared.go new file mode 100644 index 0000000..3157036 --- /dev/null +++ b/src/udi/handlers/prepared/prepared.go @@ -0,0 +1,79 @@ +package prepared + +import ( + "time" + "log" + "encoding/json" + "udi/config" + "udi/handlers/handler" + "udi/database" +) + + +type PreparedHandler struct { + handler.CommonHandler + dbh *database.DatabaseHandle +} + +type endpoint_t struct { + Label string `json:"label"` + Variable string `json:"variable"` + Value string `json:"value"` + Unit string `json:"unit"` + Status string `json:"status"` +} + +type observation_t struct { + Device string `json:"device"` + Label string `json:"label"` + Variables map[string]endpoint_t `json:"variables"` +} + + +func New(id string, config config.HandlerConfigT) handler.Handler { + t := &PreparedHandler { + } + t.Id = id + t.dbh = database.NewDatabaseHandle() + log.Printf("Handler Prepared %d initialized", id) + return t +} + +func (self *PreparedHandler) Handle(message handler.MessageT) { + log.Printf("Handler Prepared %d processing %s -> %s", self.Id, message.Topic, message.Payload) + + var observation observation_t + err := json.Unmarshal([]byte(message.Payload), &observation) + if err != nil { + self.Lost("Unable to parse payload into Observation struct", err, message) + return + } + + var measurement database.Measurement + measurement.Time = time.Now() + + measurement.Application = self.Id + measurement.Device = observation.Device + + measurement.Attributes = map[string]interface{} { + "Label": observation.Label, + } + + measurement.Values = make(map[string]database.VariableType) + for k, v := range observation.Variables { + measurement.Values[k] = database.VariableType { + Label: v.Label, + Variable: v.Variable, + Unit: v.Unit, + Value: v.Value, + Status: v.Status, + } + } + + log.Printf("Prepared measurement item: %s", measurement) + + self.dbh.StoreMeasurement(&measurement) + self.S() +} + +