fix: cli temperature read

changes:
- fix: read temperature values without daemon
  Add subcommand to read temperature values without starting the daemon

- fix: implement measured value types
  Replace measured value types with constants

- fix: add sensor pipelines
  Add functions which returns a channel with measured values

- fix: filter measured values from a channel
  Add functions to filter measured values by sensor id or measured
  value types.
This commit is contained in:
2020-09-21 19:36:42 +02:00
parent 7cbd80c726
commit 3a090d190e
17 changed files with 481 additions and 77 deletions

View File

@ -8,11 +8,19 @@ import (
// example from a sensor. It can contains different types, for example humidity
// or temperature.
type MeasuredValue struct {
ID string `json:"id" xml:"id"`
Value float64 `json:"value,string" xml:"value,string"`
ValueType string `json:"value_type" xml:"value_type"`
Date time.Time `json:"date" xml:"date"`
SensorID string `json:"sensor_id" xml:"sensor_id"`
CreationDate time.Time `json:"creation_date" xml:"creation_date"`
UpdateDate *time.Time `json:"update_date" xml:"update_date"`
ID string `json:"id" xml:"id"`
Value float64 `json:"value,string" xml:"value,string"`
ValueType MeasuredValueType `json:"value_type" xml:"value_type"`
Date time.Time `json:"date" xml:"date"`
SensorID string `json:"sensor_id" xml:"sensor_id"`
CreationDate time.Time `json:"creation_date" xml:"creation_date"`
UpdateDate *time.Time `json:"update_date" xml:"update_date"`
}
type MeasuredValueType string
const (
Humidity MeasuredValueType = "humidity"
Pressure = "pressure"
Temperature = "temperature"
)

View File

@ -1,6 +1,7 @@
package types
import (
"fmt"
"time"
)
@ -22,21 +23,6 @@ type Sensor struct {
UpdateDate *time.Time `json:"update_date" xml:"update_date"`
}
// GetID returns the UUID of the sensor.
func (s *Sensor) GetID() string {
return s.ID
}
// GetDeviceID returns the UUID of the configured device.
func (s *Sensor) GetDeviceID() string {
return s.DeviceID
}
// GetName returns the name of the sensor.
func (s *Sensor) GetName() string {
return s.Name
}
// GetTicker returns a new ticker, which tick every when the sensor should be
// read
func (s *Sensor) GetTicker() *time.Ticker {
@ -46,3 +32,34 @@ func (s *Sensor) GetTicker() *time.Ticker {
}
return time.NewTicker(duration)
}
// FilterSensorByMeasuredValueTypes filters sensors by the measured values types
// which they measure
func FilterSensorByMeasuredValueTypes(sensors []*Sensor, measuredValueTypes ...MeasuredValueType) ([]*Sensor, error) {
cachedSensors := make([]*Sensor, 0)
mapping := map[MeasuredValueType][]string{
Humidity: {"BME280", "DHT11", "DHT22"},
Pressure: {"BME280"},
Temperature: {"BME280", "DHT11", "DHT22", "DS18B20"},
}
for i := range measuredValueTypes {
mappedSensors, ok := mapping[measuredValueTypes[i]]
if !ok {
return nil, fmt.Errorf("No mapping for measured values type %v available", measuredValueTypes[i])
}
LOOP:
for j := range sensors {
for k := range mappedSensors {
if sensors[j].Model == mappedSensors[k] {
cachedSensors = append(cachedSensors, sensors[j])
continue LOOP
}
}
}
}
return cachedSensors, nil
}

67
pkg/types/sensor_test.go Normal file
View File

@ -0,0 +1,67 @@
package types_test
import (
"testing"
"git.cryptic.systems/volker.raschek/flucky/pkg/types"
"github.com/stretchr/testify/require"
)
func TestFilterSensorByMeasuredValueTypes(t *testing.T) {
require := require.New(t)
testCases := []struct {
sensors []*types.Sensor
expectedSensors []*types.Sensor
measuredValueTypes []types.MeasuredValueType
}{
{
sensors: []*types.Sensor{
{ID: "af7f845f-9a79-4638-8005-292754367d33", Model: "BME280"},
{ID: "2d2c20e4-2628-4660-9f8c-a301b4e5933b", Model: "DHT11"},
{ID: "30e69d52-c0cd-48a7-841a-3918b2ed5941", Model: "DHT22"},
{ID: "2d1ecf2e-2dc6-48f6-8158-822cab6e561b", Model: "DS18B20"},
},
expectedSensors: []*types.Sensor{
{ID: "af7f845f-9a79-4638-8005-292754367d33", Model: "BME280"},
{ID: "2d2c20e4-2628-4660-9f8c-a301b4e5933b", Model: "DHT11"},
{ID: "30e69d52-c0cd-48a7-841a-3918b2ed5941", Model: "DHT22"},
{ID: "2d1ecf2e-2dc6-48f6-8158-822cab6e561b", Model: "DS18B20"},
},
measuredValueTypes: []types.MeasuredValueType{types.Temperature},
},
{
sensors: []*types.Sensor{
{ID: "af7f845f-9a79-4638-8005-292754367d33", Model: "BME280"},
{ID: "2d2c20e4-2628-4660-9f8c-a301b4e5933b", Model: "DHT11"},
{ID: "30e69d52-c0cd-48a7-841a-3918b2ed5941", Model: "DHT22"},
{ID: "2d1ecf2e-2dc6-48f6-8158-822cab6e561b", Model: "DS18B20"},
},
expectedSensors: []*types.Sensor{
{ID: "af7f845f-9a79-4638-8005-292754367d33", Model: "BME280"},
{ID: "2d2c20e4-2628-4660-9f8c-a301b4e5933b", Model: "DHT11"},
{ID: "30e69d52-c0cd-48a7-841a-3918b2ed5941", Model: "DHT22"},
},
measuredValueTypes: []types.MeasuredValueType{types.Humidity},
},
{
sensors: []*types.Sensor{
{ID: "af7f845f-9a79-4638-8005-292754367d33", Model: "BME280"},
{ID: "2d2c20e4-2628-4660-9f8c-a301b4e5933b", Model: "DHT11"},
{ID: "30e69d52-c0cd-48a7-841a-3918b2ed5941", Model: "DHT22"},
{ID: "2d1ecf2e-2dc6-48f6-8158-822cab6e561b", Model: "DS18B20"},
},
expectedSensors: []*types.Sensor{
{ID: "af7f845f-9a79-4638-8005-292754367d33", Model: "BME280"},
},
measuredValueTypes: []types.MeasuredValueType{types.Pressure},
},
}
for i := range testCases {
s, err := types.FilterSensorByMeasuredValueTypes(testCases[i].sensors, testCases[i].measuredValueTypes...)
require.NoError(err)
require.ElementsMatch(testCases[i].expectedSensors, s)
require.Equal(len(testCases[i].expectedSensors), len(s))
}
}