diff --git a/queries/hottis.sql b/queries/hottis.sql index 9f2c6f5..c627ac5 100644 --- a/queries/hottis.sql +++ b/queries/hottis.sql @@ -67,3 +67,12 @@ create or replace view soil_v as device from measurements where application = 'de-hottis-app01' and attributes->>'DeviceType' = 'dragino-lse01'; + +create or replace view co2_v as + select time, + cast(values->'CO2concentration'->>'value' as float) as co2concentration, + cast(values->'Humidity'->>'value' as float) as humidity, + cast(values->'Temperature'->>'value' as float) as temperature, + device + from measurements + where application = 'de-hottis-app01' and attributes->>'DeviceType' = 'hottis-scd30'; diff --git a/src/udi/dispatcher/dispatcher.go b/src/udi/dispatcher/dispatcher.go index 25d977d..b55dddb 100644 --- a/src/udi/dispatcher/dispatcher.go +++ b/src/udi/dispatcher/dispatcher.go @@ -16,6 +16,7 @@ import "udi/handlers/mbgw3" import "udi/handlers/sver" import "udi/handlers/svej" import "udi/handlers/dt1t" +import "udi/handlers/locative" var handlerMap map[string]handler.Handler = make(map[string]handler.Handler) @@ -44,6 +45,8 @@ func InitDispatcher() { factory = svej.New case "DT1T": factory = dt1t.New + case "Locative": + factory = locative.New default: factory = nil log.Printf("No handler %s found, ignore mapping", mapping.Handler) diff --git a/src/udi/handlers/locative/locative.go b/src/udi/handlers/locative/locative.go new file mode 100644 index 0000000..851c673 --- /dev/null +++ b/src/udi/handlers/locative/locative.go @@ -0,0 +1,73 @@ +package locative + +import ( + "reflect" + "time" + "log" + "encoding/json" + "udi/config" + "udi/handlers/handler" + "udi/database" +) + + +type LocativeHandler struct { + handler.CommonHandler + dbh *database.DatabaseHandle +} + +type locativeEvent struct { + Trigger string `json:"trigger"` + Device string `json:"device"` + Location string `json:"location"` + Latitude string `json:"latitude"` + Longitude string `json:"longitude"` + Person string `json:"person"` + Timestamp string `json:"timestamp"` +} + +func New(id string, config config.HandlerConfigT) handler.Handler { + t := &LocativeHandler { + } + t.Id = id + t.dbh = database.NewDatabaseHandle() + return t +} + + +func (self *LocativeHandler) Handle(message handler.MessageT) { + log.Printf("Handler Locative %d processing %s -> %s", self.Id, message.Topic, message.Payload) + + var locativeEvent locativeEvent + err := json.Unmarshal([]byte(message.Payload), &locativeEvent) + if err != nil { + self.Lost("Unable to parse payload into locativeEvent struct", err, message) + return + } + + variables := make(map[string]database.VariableType) + locativeEventStructValue := reflect.ValueOf(locativeEvent) + for i := 0; i < locativeEventStructValue.NumField(); i++ { + field := locativeEventStructValue.Type().Field(i) + fieldValue := locativeEventStructValue.Field(i) + v := database.VariableType { + Label: "", + Variable: field.Name, + Unit: "", + Value: fieldValue.Interface(), + } + variables[field.Name] = v + } + + measurement := database.Measurement { + Time: time.Now(), + Application: "Locative", + Device: locativeEvent.Person, + Values: variables, + } + + self.dbh.StoreMeasurement(&measurement) + self.S() +} + +