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:
@ -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"
|
||||
)
|
||||
|
@ -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
67
pkg/types/sensor_test.go
Normal 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))
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user