diff --git a/pkg/deconz/event.go b/pkg/deconz/event.go index 58f0cd4..5e456d9 100644 --- a/pkg/deconz/event.go +++ b/pkg/deconz/event.go @@ -43,6 +43,19 @@ func (s *SensorEvent) Timeseries() (map[string]string, map[string]interface{}, e fields["battery"] = int(s.Sensor.Config.Battery) } + // special cases + switch s.Type { + + case "ZHAThermostat": + fields["heatsetpoint"] = float64(*s.Config.HeatSetpoint) / 100 + fields["mode"] = *s.Config.Mode + fields["offset"] = float64(*s.Config.Offset) / 100 + fields["externalsensortemp"] = float64(*s.Config.ExternalSensorTemp) / 100 + + + } + + return map[string]string{ "name": s.Name, "type": s.Sensor.Type, diff --git a/pkg/deconz/sensor/sensor.go b/pkg/deconz/sensor/sensor.go index 6ff747a..c797b6e 100644 --- a/pkg/deconz/sensor/sensor.go +++ b/pkg/deconz/sensor/sensor.go @@ -45,7 +45,11 @@ type Sensor struct { // Currently, it holds only the battery state. type Config struct { // Battery state in percent; not present for all sensors - Battery uint32 `json:"battery"` + Battery uint32 `json:"battery"` + HeatSetpoint *int `json:"heatsetpoint"` + Mode *string `json:"mode"` + Offset *int `json:"offset"` + ExternalSensorTemp *int `json:"externalsensortemp"` } // State contains properties that are provided by all sensors @@ -110,6 +114,17 @@ func (s *Sensor) Timeseries() (map[string]string, map[string]interface{}, error) fields["battery"] = int(s.Config.Battery) } + // special cases + switch s.Type { + + case "ZHAThermostat": + fields["heatsetpoint"] = float64(*s.Config.HeatSetpoint) / 100 + fields["mode"] = *s.Config.Mode + fields["offset"] = float64(*s.Config.Offset) / 100 + fields["externalsensortemp"] = float64(*s.Config.ExternalSensorTemp) / 100 + + } + return map[string]string{ "name": s.Name, "type": s.Type, @@ -210,6 +225,12 @@ func DecodeSensorState(rawState json.RawMessage, sensorType string) (interface{} var s ZHAWater err = json.Unmarshal(rawState, &s) return &s, err + + case "ZHAThermostat": + var s ZHAThermostat + err = json.Unmarshal(rawState, &s) + return &s, err + } return nil, fmt.Errorf("%s is not a known sensor type", sensorType) diff --git a/pkg/deconz/sensor/zhalightlevel.go b/pkg/deconz/sensor/zhalightlevel.go index c701d0d..e8b0a0d 100644 --- a/pkg/deconz/sensor/zhalightlevel.go +++ b/pkg/deconz/sensor/zhalightlevel.go @@ -6,7 +6,7 @@ type ZHALightLevel struct { Dark bool Daylight bool LightLevel int32 - Lux int16 + Lux int32 } // Fields implements the fielder interface and returns time series data for InfluxDB diff --git a/pkg/deconz/sensor/zhaopenclose.go b/pkg/deconz/sensor/zhaopenclose.go index a0d75ad..64876fb 100644 --- a/pkg/deconz/sensor/zhaopenclose.go +++ b/pkg/deconz/sensor/zhaopenclose.go @@ -15,5 +15,14 @@ func (z *ZHAOpenClose) Fields() map[string]interface{} { "lowbattery": z.Lowbattery, "tampered": z.Tampered, "open": z.Open, + "open_int": boolToInt(z.Open), }) } + +func boolToInt(b bool) int { + if b { + return 1 + } else { + return 0 + } +} diff --git a/pkg/deconz/sensor/zhathermostat.go b/pkg/deconz/sensor/zhathermostat.go new file mode 100644 index 0000000..d4da232 --- /dev/null +++ b/pkg/deconz/sensor/zhathermostat.go @@ -0,0 +1,17 @@ +package sensor + +// ZHAThermostat represents the state of a thermostat +type ZHAThermostat struct { + State + Temperature int + Valve int +} + +// Fields implements the fielder interface and returns time series data for InfluxDB +func (z *ZHAThermostat) Fields() map[string]interface{} { + return mergeFields(z.State.Fields(), + map[string]interface{}{ + "temperature": float64(z.Temperature) / 100, + "valve": z.Valve, + }) +} diff --git a/pkg/deconz/sensor/zhavibration.go b/pkg/deconz/sensor/zhavibration.go index fcb8abd..6121919 100644 --- a/pkg/deconz/sensor/zhavibration.go +++ b/pkg/deconz/sensor/zhavibration.go @@ -5,6 +5,9 @@ package sensor type ZHAVibration struct { State Vibration bool + Tiltangle int16 + Vibrationstrength int16 + Orientation []int16 } // Fields implements the fielder interface and returns time series data for InfluxDB @@ -12,5 +15,10 @@ func (z *ZHAVibration) Fields() map[string]interface{} { return mergeFields(z.State.Fields(), map[string]interface{}{ "vibration": z.Vibration, + "tiltangle": z.Tiltangle, + "vibrationstrength": z.Vibrationstrength, + "orientation_x": z.Orientation[0], + "orientation_y": z.Orientation[1], + "orientation_z": z.Orientation[2], }) }