feat(cli/humidity): add new subcommand to read humidity values
This commit is contained in:
		
							
								
								
									
										140
									
								
								pkg/cli/cli.go
									
									
									
									
									
								
							
							
						
						
									
										140
									
								
								pkg/cli/cli.go
									
									
									
									
									
								
							| @@ -4,30 +4,138 @@ import ( | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"text/tabwriter" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/go-flucky/flucky/pkg/config" | ||||
| 	"github.com/go-flucky/flucky/pkg/internal/temperature" | ||||
| 	"github.com/go-flucky/flucky/pkg/types" | ||||
| ) | ||||
|  | ||||
| // PrintHumidities displays a list of humidities | ||||
| func PrintHumidities(humidities []*types.Humidity, cnf *config.Configuration, w io.Writer) { | ||||
| 	// determine all humidity sensors based on the humidiy values | ||||
| // GetSensorsByTemperatures returns commulated list of sensors by temperature values | ||||
| func GetSensorsByHumidities(humidities []*types.Humidity, cnf *config.Configuration) []*types.Sensor { | ||||
| 	sensors := []*types.Sensor{} | ||||
| 	for _, humidity := range humidities { | ||||
| 		// Search for the sensor that has acquired the measured value | ||||
| 		for _, sensor := range cnf.Sensors { | ||||
| 			if sensor.SensorID == humidity.SensorID { | ||||
| 				sensors = append(sensors, sensor) | ||||
| 				break | ||||
| 		duplicated := false | ||||
| 		foundSensor := &types.Sensor{} | ||||
| 		for _, cnfSensor := range cnf.Sensors { | ||||
| 			if humidity.SensorID == cnfSensor.SensorID { | ||||
| 				foundSensor = cnfSensor | ||||
|  | ||||
| 				// compare if id has already been added to list | ||||
| 				for _, sensor := range sensors { | ||||
| 					if cnfSensor.SensorID == sensor.SensorID { | ||||
| 						duplicated = true | ||||
| 						break | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		// If it was not found, pass only the sensor with the UUID on | ||||
| 		sensor := &types.Sensor{ | ||||
| 			SensorID: humidity.SensorID, | ||||
| 		if duplicated { | ||||
| 			continue | ||||
| 		} | ||||
| 		if foundSensor != nil { | ||||
| 			sensors = append(sensors, foundSensor) | ||||
| 			continue | ||||
| 		} else { | ||||
| 			sensors = append(sensors, &types.Sensor{SensorID: humidity.SensorID}) | ||||
| 		} | ||||
| 		sensors = append(sensors, sensor) | ||||
| 	} | ||||
| 	return sensors | ||||
| } | ||||
|  | ||||
| // GetSensorsByTemperatures returns commulated list of sensors by temperature values | ||||
| func GetSensorsByTemperatures(temperatures []*types.Temperature, cnf *config.Configuration) []*types.Sensor { | ||||
| 	sensors := []*types.Sensor{} | ||||
| 	for _, temperature := range temperatures { | ||||
| 		duplicated := false | ||||
| 		foundSensor := &types.Sensor{} | ||||
| 		for _, cnfSensor := range cnf.Sensors { | ||||
| 			if temperature.SensorID == cnfSensor.SensorID { | ||||
| 				foundSensor = cnfSensor | ||||
|  | ||||
| 				// compare if id has already been added to list | ||||
| 				for _, sensor := range sensors { | ||||
| 					if cnfSensor.SensorID == sensor.SensorID { | ||||
| 						duplicated = true | ||||
| 						break | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		if duplicated { | ||||
| 			continue | ||||
| 		} | ||||
| 		if foundSensor != nil { | ||||
| 			sensors = append(sensors, foundSensor) | ||||
| 			continue | ||||
| 		} else { | ||||
| 			sensors = append(sensors, &types.Sensor{SensorID: temperature.SensorID}) | ||||
| 		} | ||||
| 	} | ||||
| 	return sensors | ||||
| } | ||||
|  | ||||
| // GetTemperaturesBetweenTimeRange returns a list of temperatures between a given time range | ||||
| func GetTemperaturesBetweenTimeRange(from time.Time, till *time.Time, temperatures []*types.Temperature) ([]*types.Temperature, error) { | ||||
|  | ||||
| 	if till != nil && from.After(*till) { | ||||
| 		fFormat := from.Format("2006-01-02 15:04:05") | ||||
| 		tFormat := till.Format("2006-01-02 15:04:05") | ||||
| 		return nil, fmt.Errorf("%v is after %v", fFormat, tFormat) | ||||
| 	} | ||||
|  | ||||
| 	cachedTemperatures := []*types.Temperature{} | ||||
| 	for _, temperature := range temperatures { | ||||
|  | ||||
| 		if temperature.TemperatureFromDate.After(from) && till == nil { | ||||
| 			cachedTemperatures = append(cachedTemperatures, temperature) | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		if temperature.TemperatureFromDate.After(from) && temperature.TemperatureTillDate.Before(*till) { | ||||
| 			cachedTemperatures = append(cachedTemperatures, temperature) | ||||
| 		} | ||||
| 	} | ||||
| 	return cachedTemperatures, nil | ||||
| } | ||||
|  | ||||
| // GetTemperaturesBySensors returns a list of temperatures given by the sensor id. | ||||
| // If the sensor name, wire-id or id can not found in configured sensors, it would be skiped! | ||||
| func GetTemperaturesBySensors(sensorNamesOrIDs []string, temperatures []*types.Temperature, cnf *config.Configuration) []*types.Temperature { | ||||
| 	cachedSensors := []*types.Sensor{} | ||||
| 	cachedTemperatures := []*types.Temperature{} | ||||
|  | ||||
| 	// match sensor name, wire-id or sensor id with configured sensors | ||||
| 	// and append the matched sensor to the list | ||||
| 	for _, sensor := range sensorNamesOrIDs { | ||||
| 		for _, cs := range cnf.Sensors { | ||||
| 			if cs.SensorID == sensor { | ||||
| 				cachedSensors = append(cachedSensors, cs) | ||||
| 			} | ||||
| 			if cs.WireID != nil && *cs.WireID == sensor { | ||||
| 				cachedSensors = append(cachedSensors, cs) | ||||
| 			} | ||||
| 			if cs.SensorName == sensor { | ||||
| 				cachedSensors = append(cachedSensors, cs) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// march all temperatures which matched with the sensor id | ||||
| 	for _, temperature := range temperatures { | ||||
| 		for _, cachedSensor := range cachedSensors { | ||||
| 			if temperature.SensorID == cachedSensor.SensorID { | ||||
| 				cachedTemperatures = append(cachedTemperatures, temperature) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return cachedTemperatures | ||||
| } | ||||
|  | ||||
| // PrintHumidities displays a list of humidities | ||||
| func PrintHumidities(humidities []*types.Humidity, cnf *config.Configuration, w io.Writer) { | ||||
|  | ||||
| 	sensors := GetSensorsByHumidities(humidities, cnf) | ||||
|  | ||||
| 	// sort temperature values for every sensor | ||||
| 	orderedHumidities := make(map[string][]*types.Humidity) | ||||
| @@ -62,12 +170,14 @@ func PrintHumidities(humidities []*types.Humidity, cnf *config.Configuration, w | ||||
| 			} else { | ||||
| 				fmt.Fprint(tw, "\t") | ||||
| 			} | ||||
| 			fmt.Fprint(tw, "\n") | ||||
|  | ||||
| 		} | ||||
| 		fmt.Fprint(tw, "\n") | ||||
| 	} | ||||
| 	tw.Flush() | ||||
| } | ||||
|  | ||||
| // PrintRGBLEDs displays a list with all configured RGBLEDs | ||||
| func PrintRGBLEDs(cnf *config.Configuration, w io.Writer) { | ||||
|  | ||||
| 	// declare tabwriter | ||||
| @@ -103,7 +213,7 @@ func PrintSensors(cnf *config.Configuration, w io.Writer) error { | ||||
| // PrintTemperatures displays a list of temperatures | ||||
| func PrintTemperatures(temperatures []*types.Temperature, cnf *config.Configuration, w io.Writer) { | ||||
|  | ||||
| 	sensors := temperature.GetSensorsByTemperatures(temperatures, cnf) | ||||
| 	sensors := GetSensorsByTemperatures(temperatures, cnf) | ||||
|  | ||||
| 	// sort temperature values for every sensor | ||||
| 	orderedTemperatures := make(map[string][]*types.Temperature) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user