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

@ -115,7 +115,7 @@ func (postgres *Postgres) InsertDevices(ctx context.Context, devices ...*types.D
// InsertMeasuredValues into the database
func (postgres *Postgres) InsertMeasuredValues(ctx context.Context, measuredValues ...*types.MeasuredValue) error {
splittedMeasuredValues := make(map[string][]*types.MeasuredValue, 0)
splittedMeasuredValues := make(map[types.MeasuredValueType][]*types.MeasuredValue, 0)
for _, measuredValue := range measuredValues {
if _, ok := splittedMeasuredValues[measuredValue.ValueType]; !ok {
@ -164,11 +164,11 @@ func (postgres *Postgres) InsertMeasuredValues(ctx context.Context, measuredValu
var queryFile string
switch measuredValueType {
case "humidity":
case types.Humidity:
queryFile = "insertHumidity.sql"
case "pressure":
case types.Pressure:
queryFile = "insertPressure.sql"
case "temperature":
case types.Temperature:
queryFile = "insertTemperature.sql"
default:
tx.Rollback()
@ -361,7 +361,7 @@ func (postgres *Postgres) SelectHumidity(ctx context.Context, id string) (*types
}
for _, measuredValue := range measuredValues {
measuredValue.ValueType = "humidity"
measuredValue.ValueType = types.Humidity
}
return measuredValues[0], nil
@ -391,7 +391,7 @@ func (postgres *Postgres) SelectHumidities(ctx context.Context) ([]*types.Measur
}
for _, measuredValue := range measuredValues {
measuredValue.ValueType = "humidity"
measuredValue.ValueType = types.Humidity
}
return measuredValues, nil
@ -462,7 +462,7 @@ func (postgres *Postgres) SelectPressure(ctx context.Context, id string) (*types
}
for _, measuredValue := range measuredValues {
measuredValue.ValueType = "pressure"
measuredValue.ValueType = types.Pressure
}
return measuredValues[0], nil
@ -492,7 +492,7 @@ func (postgres *Postgres) SelectPressures(ctx context.Context) ([]*types.Measure
}
for _, measuredValue := range measuredValues {
measuredValue.ValueType = "pressure"
measuredValue.ValueType = types.Pressure
}
return measuredValues, nil
@ -622,7 +622,7 @@ func (postgres *Postgres) SelectTemperature(ctx context.Context, id string) (*ty
}
for _, measuredValue := range measuredValues {
measuredValue.ValueType = "temperatures"
measuredValue.ValueType = types.Temperature
}
return measuredValues[0], nil
@ -652,7 +652,7 @@ func (postgres *Postgres) SelectTemperatures(ctx context.Context) ([]*types.Meas
}
for _, measuredValue := range measuredValues {
measuredValue.ValueType = "temperatures"
measuredValue.ValueType = types.Temperature
}
return measuredValues, nil

View File

@ -114,7 +114,7 @@ func (sqlite *SQLite) InsertDevices(ctx context.Context, devices ...*types.Devic
// InsertMeasuredValues into the database
func (sqlite *SQLite) InsertMeasuredValues(ctx context.Context, measuredValues ...*types.MeasuredValue) error {
splittedMeasuredValues := make(map[string][]*types.MeasuredValue, 0)
splittedMeasuredValues := make(map[types.MeasuredValueType][]*types.MeasuredValue, 0)
for _, measuredValue := range measuredValues {
if _, ok := splittedMeasuredValues[measuredValue.ValueType]; !ok {
@ -163,11 +163,11 @@ func (sqlite *SQLite) InsertMeasuredValues(ctx context.Context, measuredValues .
var queryFile string
switch measuredValueType {
case "humidity":
case types.Humidity:
queryFile = "insertHumidity.sql"
case "pressure":
case types.Pressure:
queryFile = "insertPressure.sql"
case "temperature":
case types.Temperature:
queryFile = "insertTemperature.sql"
default:
tx.Rollback()
@ -360,7 +360,7 @@ func (sqlite *SQLite) SelectHumidity(ctx context.Context, id string) (*types.Mea
}
for _, measuredValue := range measuredValues {
measuredValue.ValueType = "humidity"
measuredValue.ValueType = types.Humidity
}
return measuredValues[0], nil
@ -390,7 +390,7 @@ func (sqlite *SQLite) SelectHumidities(ctx context.Context) ([]*types.MeasuredVa
}
for _, measuredValue := range measuredValues {
measuredValue.ValueType = "humidity"
measuredValue.ValueType = types.Humidity
}
return measuredValues, nil
@ -461,7 +461,7 @@ func (sqlite *SQLite) SelectPressure(ctx context.Context, id string) (*types.Mea
}
for _, measuredValue := range measuredValues {
measuredValue.ValueType = "pressure"
measuredValue.ValueType = types.Pressure
}
return measuredValues[0], nil
@ -491,7 +491,7 @@ func (sqlite *SQLite) SelectPressures(ctx context.Context) ([]*types.MeasuredVal
}
for _, measuredValue := range measuredValues {
measuredValue.ValueType = "pressure"
measuredValue.ValueType = types.Pressure
}
return measuredValues, nil
@ -621,7 +621,7 @@ func (sqlite *SQLite) SelectTemperature(ctx context.Context, id string) (*types.
}
for _, measuredValue := range measuredValues {
measuredValue.ValueType = "temperatures"
measuredValue.ValueType = types.Temperature
}
return measuredValues[0], nil
@ -651,7 +651,7 @@ func (sqlite *SQLite) SelectTemperatures(ctx context.Context) ([]*types.Measured
}
for _, measuredValue := range measuredValues {
measuredValue.ValueType = "temperatures"
measuredValue.ValueType = types.Temperature
}
return measuredValues, nil

View File

@ -98,8 +98,28 @@ func (repo *Repository) GetSensor(sensorID string) (*types.Sensor, error) {
// GetSensors returns all sensors. If no sensors has been found, the function
// returns nil.
func (repo *Repository) GetSensors() ([]*types.Sensor, error) {
return repo.database.SelectSensors(context.Background())
func (repo *Repository) GetSensors(models ...string) ([]*types.Sensor, error) {
sensors, err := repo.database.SelectSensors(context.Background())
switch {
case err != nil:
return nil, err
case len(models) > 0:
cachedSensors := make([]*types.Sensor, 0)
LOOP:
for i := range sensors {
for j := range models {
if strings.ToLower(sensors[i].Model) == strings.ToLower(models[j]) {
cachedSensors = append(cachedSensors, sensors[i])
continue LOOP
}
}
}
return cachedSensors, nil
case len(models) <= 0:
fallthrough
default:
return sensors, err
}
}
// GetSensorsByDeviceID returns all sensors by a device id. If no sensor has

View File

@ -188,6 +188,26 @@ func testBackend(t *testing.T, repo *repository.Repository) {
require.NoError(err)
require.Len(sensors, len(expectedSensors))
sensors, err = repo.GetSensors("BME280")
require.NoError(err)
require.Len(sensors, 1)
require.JSONEq(jsonEncoder(expectedSensors[2]), jsonEncoder(sensors[0]))
sensors, err = repo.GetSensors("DS18B20")
require.NoError(err)
require.Len(sensors, 1)
require.JSONEq(jsonEncoder(expectedSensors[1]), jsonEncoder(sensors[0]))
sensors, err = repo.GetSensors("DHT11")
require.NoError(err)
require.Len(sensors, 1)
require.JSONEq(jsonEncoder(expectedSensors[0]), jsonEncoder(sensors[0]))
sensors, err = repo.GetSensors("DHT11", "DS18B20")
require.NoError(err)
require.Len(sensors, 2)
require.ElementsMatch(expectedSensors[0:2], sensors)
// Test: GetSensor
sensor, err := repo.GetSensor(expectedSensors[0].ID)
require.NoError(err)
@ -278,7 +298,7 @@ func testBackend(t *testing.T, repo *repository.Repository) {
{
ID: "2e5a297a-3da0-46ae-89d2-0fcab0f1d5f7",
Value: 32,
ValueType: "humidity",
ValueType: types.Humidity,
Date: *timeNow(require),
SensorID: "8c74397f-8e60-4c9d-960d-3197747cef9a",
CreationDate: *timeNow(require),
@ -287,7 +307,7 @@ func testBackend(t *testing.T, repo *repository.Repository) {
{
ID: "d69f1b62-0c6c-4058-b42c-4a2821bd220c",
Value: 38,
ValueType: "pressure",
ValueType: types.Pressure,
Date: *timeNow(require),
SensorID: "8c74397f-8e60-4c9d-960d-3197747cef9a",
CreationDate: *timeNow(require),
@ -296,7 +316,7 @@ func testBackend(t *testing.T, repo *repository.Repository) {
{
ID: "ea945ae0-412b-4561-a191-1f8f1f909fa4",
Value: 35.4,
ValueType: "temperature",
ValueType: types.Temperature,
Date: *timeNow(require),
SensorID: "8c74397f-8e60-4c9d-960d-3197747cef9a",
CreationDate: *timeNow(require),