refac(cmd): mergeing, ordering and outsourcing cmd subcommands
This commit is contained in:
parent
0261203395
commit
0765bd29d1
@ -1,20 +0,0 @@
|
|||||||
package completion
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
var bashCompletionCmd = &cobra.Command{
|
|
||||||
Use: "bash",
|
|
||||||
Short: "Generates a bash completion file",
|
|
||||||
Args: cobra.NoArgs,
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
rootCmd.GenBashCompletion(os.Stdout)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
completionCmd.AddCommand(bashCompletionCmd)
|
|
||||||
}
|
|
@ -1,22 +1,42 @@
|
|||||||
package completion
|
package completion
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"os"
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
// InitCmd initialize all completion subcommands
|
||||||
rootCmd *cobra.Command
|
func InitCmd(cmd *cobra.Command) error {
|
||||||
)
|
|
||||||
|
|
||||||
var completionCmd = &cobra.Command{
|
completionCmd := &cobra.Command{
|
||||||
Use: "completion",
|
Use: "completion",
|
||||||
Short: "Generates a shell completion file",
|
Short: "Generates a shell completion file",
|
||||||
}
|
}
|
||||||
|
|
||||||
// InitCmd initialize the subcommand
|
bashCompletionCmd := &cobra.Command{
|
||||||
func InitCmd(cmd *cobra.Command) {
|
Use: "bash",
|
||||||
|
Short: "Generates a bash completion file",
|
||||||
|
Args: cobra.NoArgs,
|
||||||
|
Example: "flucky completion bash",
|
||||||
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
return cmd.GenBashCompletion(os.Stdout)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
zshCompletionCmd := &cobra.Command{
|
||||||
|
Use: "zsh",
|
||||||
|
Short: "Generate a zsh completion file",
|
||||||
|
Args: cobra.NoArgs,
|
||||||
|
Example: "flucky completion zsh",
|
||||||
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
return cmd.GenZshCompletion(os.Stdout)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
completionCmd.AddCommand(bashCompletionCmd)
|
||||||
|
completionCmd.AddCommand(zshCompletionCmd)
|
||||||
cmd.AddCommand(completionCmd)
|
cmd.AddCommand(completionCmd)
|
||||||
|
|
||||||
rootCmd = cmd
|
return nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,20 +0,0 @@
|
|||||||
package completion
|
|
||||||
|
|
||||||
import (
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
var zshCompletionCmd = &cobra.Command{
|
|
||||||
Use: "zsh",
|
|
||||||
Short: "Generate a zsh completion file",
|
|
||||||
Args: cobra.NoArgs,
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
rootCmd.GenZshCompletion(os.Stdout)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
completionCmd.AddCommand(zshCompletionCmd)
|
|
||||||
}
|
|
@ -1,8 +1,6 @@
|
|||||||
package compression
|
package compression
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/storage"
|
"github.com/go-flucky/flucky/pkg/storage"
|
||||||
"github.com/go-flucky/flucky/pkg/storage/logfile"
|
"github.com/go-flucky/flucky/pkg/storage/logfile"
|
||||||
|
|
||||||
@ -10,21 +8,31 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
configFile *string
|
|
||||||
round float64
|
round float64
|
||||||
)
|
)
|
||||||
|
|
||||||
var compressionCmd = &cobra.Command{
|
// InitCmd initialize all compression subcommands
|
||||||
|
func InitCmd(cmd *cobra.Command) error {
|
||||||
|
|
||||||
|
compressionCmd := &cobra.Command{
|
||||||
Use: "compression",
|
Use: "compression",
|
||||||
Short: "Compress a logfile",
|
Short: "Compress a logfile",
|
||||||
Args: cobra.ExactArgs(1),
|
Args: cobra.ExactArgs(1),
|
||||||
Example: "flucky compression /var/log/flucky/logfile.csv",
|
Example: "flucky compression /var/log/flucky/logfile.csv",
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
RunE: run,
|
||||||
|
}
|
||||||
|
|
||||||
|
compressionCmd.Flags().Float64Var(&round, "round", 0, "Round values. The value 0 deactivates the function")
|
||||||
|
cmd.AddCommand(compressionCmd)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func run(cmd *cobra.Command, args []string) error {
|
||||||
logfileInput := logfile.New(args[0])
|
logfileInput := logfile.New(args[0])
|
||||||
measuredValues, err := logfileInput.Read()
|
measuredValues, err := logfileInput.Read()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln(err)
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if round != 0 {
|
if round != 0 {
|
||||||
@ -35,15 +43,8 @@ var compressionCmd = &cobra.Command{
|
|||||||
|
|
||||||
err = logfileInput.Write(measuredValues)
|
err = logfileInput.Write(measuredValues)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln(err)
|
return err
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func InitCmd(cmd *cobra.Command, cnfFile *string) {
|
return nil
|
||||||
configFile = cnfFile
|
|
||||||
|
|
||||||
cmd.AddCommand(compressionCmd)
|
|
||||||
compressionCmd.Flags().Float64Var(&round, "round", 0, "Round values. The value 0 deactivates the function")
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
package convert
|
package convert
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/storage"
|
"github.com/go-flucky/flucky/pkg/storage"
|
||||||
"github.com/go-flucky/flucky/pkg/storage/logfile"
|
"github.com/go-flucky/flucky/pkg/storage/logfile"
|
||||||
|
|
||||||
@ -11,21 +9,32 @@ import (
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
compression bool
|
compression bool
|
||||||
configFile *string
|
|
||||||
round float64
|
round float64
|
||||||
)
|
)
|
||||||
|
|
||||||
var convertCmd = &cobra.Command{
|
// InitCmd initialize all convert subcommands
|
||||||
|
func InitCmd(cmd *cobra.Command) error {
|
||||||
|
|
||||||
|
convertCmd := &cobra.Command{
|
||||||
Use: "convert",
|
Use: "convert",
|
||||||
Short: "Convert logfiles into other markup language",
|
Short: "Convert logfiles into other markup language",
|
||||||
Args: cobra.ExactArgs(2),
|
Args: cobra.ExactArgs(2),
|
||||||
Example: "flucky convert /var/log/flucky/logfile.json /var/log/flucky/logfile.csv",
|
Example: "flucky convert /var/log/flucky/logfile.json /var/log/flucky/logfile.csv",
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
RunE: run,
|
||||||
|
}
|
||||||
|
|
||||||
|
convertCmd.Flags().BoolVar(&compression, "compression", false, "Compress measured values")
|
||||||
|
convertCmd.Flags().Float64Var(&round, "round", 0, "Round values. The value 0 deactivates the function")
|
||||||
|
cmd.AddCommand(convertCmd)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func run(cmd *cobra.Command, args []string) error {
|
||||||
logfileInput := logfile.New(args[0])
|
logfileInput := logfile.New(args[0])
|
||||||
measuredValues, err := logfileInput.Read()
|
measuredValues, err := logfileInput.Read()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln(err)
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if round != 0 {
|
if round != 0 {
|
||||||
@ -39,17 +48,8 @@ var convertCmd = &cobra.Command{
|
|||||||
logfileOutput := logfile.New(args[1])
|
logfileOutput := logfile.New(args[1])
|
||||||
err = logfileOutput.Write(measuredValues)
|
err = logfileOutput.Write(measuredValues)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln(err)
|
return err
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// InitCmd ...
|
return nil
|
||||||
func InitCmd(cmd *cobra.Command, cnfFile *string) {
|
|
||||||
configFile = cnfFile
|
|
||||||
|
|
||||||
cmd.AddCommand(convertCmd)
|
|
||||||
convertCmd.Flags().BoolVar(&compression, "compression", false, "Compress measured values")
|
|
||||||
convertCmd.Flags().Float64Var(&round, "round", 0, "Round values. The value 0 deactivates the function")
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package daemon
|
package daemon
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/config"
|
"github.com/go-flucky/flucky/pkg/config"
|
||||||
@ -12,33 +13,64 @@ import (
|
|||||||
var (
|
var (
|
||||||
cachedMeasuredValues uint
|
cachedMeasuredValues uint
|
||||||
compression bool
|
compression bool
|
||||||
configFile *string
|
|
||||||
round float64
|
round float64
|
||||||
temperatureUnit string
|
temperatureUnit string
|
||||||
)
|
)
|
||||||
|
|
||||||
var daemonCmd = &cobra.Command{
|
// InitCmd initialize all daemon subcommands
|
||||||
|
func InitCmd(cmd *cobra.Command) error {
|
||||||
|
daemonCmd := &cobra.Command{
|
||||||
Use: "daemon",
|
Use: "daemon",
|
||||||
Short: "Read continuously data from all enabled sensors",
|
Short: "Read continuously data from all enabled sensors",
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Example: "flucky daemon",
|
||||||
// read configuration
|
RunE: run,
|
||||||
cnf, err := config.Read(*configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
logger := logger.NewDefaultLogger(logger.LogLevelDebug)
|
|
||||||
daemon.SetLogger(logger)
|
|
||||||
daemon.Start(cnf, cachedMeasuredValues, compression, round)
|
|
||||||
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func InitCmd(cmd *cobra.Command, cnfFile *string) {
|
|
||||||
configFile = cnfFile
|
|
||||||
|
|
||||||
cmd.AddCommand(daemonCmd)
|
|
||||||
daemonCmd.Flags().BoolVar(&compression, "compression", true, "Compress measured values")
|
daemonCmd.Flags().BoolVar(&compression, "compression", true, "Compress measured values")
|
||||||
daemonCmd.Flags().UintVar(&cachedMeasuredValues, "cached-values", 500, "Number of cached values before saveing into the storage endpoint")
|
daemonCmd.Flags().UintVar(&cachedMeasuredValues, "cached-values", 500, "Number of cached values before saveing into the storage endpoint")
|
||||||
daemonCmd.Flags().Float64Var(&round, "round", 0.5, "Round values. The value 0 deactivates the function")
|
daemonCmd.Flags().Float64Var(&round, "round", 0.5, "Round values. The value 0 deactivates the function")
|
||||||
|
cmd.AddCommand(daemonCmd)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func run(cmd *cobra.Command, args []string) error {
|
||||||
|
configFile, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("No config file defined: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// WARNING: Must set logger for daemon package
|
||||||
|
// logLevel, err := cmd.Flags().GetString("loglevel")
|
||||||
|
// if err != nil {
|
||||||
|
// return fmt.Errorf("No loglevel defined: %v", err)
|
||||||
|
// }
|
||||||
|
|
||||||
|
//flogger := initializeLogger(logLevel)
|
||||||
|
// daemon.SetLogLevel(flogger)
|
||||||
|
|
||||||
|
cnf, err := config.Read(configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return daemon.Start(cnf, cachedMeasuredValues, compression, round)
|
||||||
|
}
|
||||||
|
|
||||||
|
func initializeLogger(logLevel string) logger.Logger {
|
||||||
|
log.Println(logLevel)
|
||||||
|
switch logLevel {
|
||||||
|
case "debug", "DEBUG":
|
||||||
|
return logger.NewDefaultLogger(logger.LogLevelDebug)
|
||||||
|
case "info", "INFO":
|
||||||
|
return logger.NewDefaultLogger(logger.LogLevelInfo)
|
||||||
|
case "warn", "WARN":
|
||||||
|
return logger.NewDefaultLogger(logger.LogLevelWarn)
|
||||||
|
case "error", "ERROR":
|
||||||
|
return logger.NewDefaultLogger(logger.LogLevelError)
|
||||||
|
case "fatal", "FATAL":
|
||||||
|
return logger.NewDefaultLogger(logger.LogLevelFatal)
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,24 +1,133 @@
|
|||||||
package humidity
|
package humidity
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/go-flucky/flucky/pkg/cli"
|
||||||
|
"github.com/go-flucky/flucky/pkg/config"
|
||||||
|
"github.com/go-flucky/flucky/pkg/sensor"
|
||||||
|
"github.com/go-flucky/flucky/pkg/storage"
|
||||||
|
"github.com/go-flucky/flucky/pkg/types"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
compression bool
|
compression bool
|
||||||
configFile *string
|
configFile string
|
||||||
|
save bool
|
||||||
round float64
|
round float64
|
||||||
)
|
)
|
||||||
|
|
||||||
var humidityCmd = &cobra.Command{
|
// InitCmd initialize all humidity subcommands
|
||||||
|
func InitCmd(cmd *cobra.Command) error {
|
||||||
|
humidityCmd := &cobra.Command{
|
||||||
Use: "humidity",
|
Use: "humidity",
|
||||||
Short: "Operates with humidity values",
|
Short: "Operates with humidity values",
|
||||||
}
|
}
|
||||||
|
|
||||||
// Execute a
|
listHumiditiesCmd := &cobra.Command{
|
||||||
func InitCmd(cmd *cobra.Command, cnfFile *string) {
|
Use: "list",
|
||||||
configFile = cnfFile
|
Short: "List humidity values from specified or all sensors",
|
||||||
|
Example: fmt.Sprintf("flucky humidity list"),
|
||||||
|
RunE: listHumidities,
|
||||||
|
}
|
||||||
|
|
||||||
|
readHumiditiesCmd := &cobra.Command{
|
||||||
|
Use: "read",
|
||||||
|
Short: "Read humidity values from specified or all sensors",
|
||||||
|
Example: fmt.Sprintf("flucky humidity read"),
|
||||||
|
RunE: readHumidities,
|
||||||
|
}
|
||||||
|
readHumiditiesCmd.Flags().BoolVar(&save, "save", true, "Save humidities")
|
||||||
|
readHumiditiesCmd.Flags().BoolVar(&compression, "compression", true, "Compress measured with logged temperatures")
|
||||||
|
readHumiditiesCmd.Flags().Float64VarP(&round, "round", "r", 0.25, "Round values. The value 0 deactivates the function")
|
||||||
|
|
||||||
|
humidityCmd.AddCommand(listHumiditiesCmd)
|
||||||
|
humidityCmd.AddCommand(readHumiditiesCmd)
|
||||||
cmd.AddCommand(humidityCmd)
|
cmd.AddCommand(humidityCmd)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func listHumidities(cmd *cobra.Command, args []string) error {
|
||||||
|
|
||||||
|
configFile, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("No config file defined")
|
||||||
|
}
|
||||||
|
|
||||||
|
// read configuration
|
||||||
|
cnf, err := config.Read(configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := context.Background()
|
||||||
|
storageEndpoint, err := cnf.GetStorageEndpointURL()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
measuredValues, err := storage.Read(ctx, storageEndpoint)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
measuredValues = types.SelectMeasuredValues(types.MeasuredValueTypeHumidity, measuredValues)
|
||||||
|
|
||||||
|
cli.PrintMeasuredValues(measuredValues, cnf, os.Stdout)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func readHumidities(cmd *cobra.Command, args []string) error {
|
||||||
|
|
||||||
|
configFile, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("No config file defined")
|
||||||
|
}
|
||||||
|
|
||||||
|
cnf, err := config.Read(configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// fetch all temperature sensors or sensors by args
|
||||||
|
sensors := make([]sensor.Sensor, 0)
|
||||||
|
if len(args) == 0 {
|
||||||
|
sensors = cnf.GetHumiditySensors(config.ENABLED)
|
||||||
|
} else {
|
||||||
|
sensors = cnf.GetHumiditySensorsByName(args)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(sensors) == 0 {
|
||||||
|
return fmt.Errorf("No sensors matched")
|
||||||
|
}
|
||||||
|
|
||||||
|
measuredValues, err := sensor.Read(sensors, types.MeasuredValueTypeHumidity)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
measuredValues = types.SelectMeasuredValues(types.MeasuredValueTypeHumidity, measuredValues)
|
||||||
|
|
||||||
|
cli.PrintMeasuredValues(measuredValues, cnf, os.Stdout)
|
||||||
|
|
||||||
|
if save {
|
||||||
|
storageEndpoint, err := cnf.GetStorageEndpointURL()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
err = storage.Write(ctx, measuredValues, storageEndpoint)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,49 +0,0 @@
|
|||||||
package humidity
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/storage"
|
|
||||||
"github.com/go-flucky/flucky/pkg/types"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/cli"
|
|
||||||
"github.com/go-flucky/flucky/pkg/config"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
var listTemperatureCmd = &cobra.Command{
|
|
||||||
Use: "list",
|
|
||||||
Short: "List humidity values from different or specified sensors by arguments",
|
|
||||||
Example: fmt.Sprintf("flucky humidity logs"),
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
|
|
||||||
// read configuration
|
|
||||||
cnf, err := config.Read(*configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx := context.Background()
|
|
||||||
storageEndpoint, err := cnf.GetStorageEndpointURL()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
measuredValues, err := storage.Read(ctx, storageEndpoint)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
measuredValues = types.SelectMeasuredValues(types.MeasuredValueTypeHumidity, measuredValues)
|
|
||||||
|
|
||||||
cli.PrintMeasuredValues(measuredValues, cnf, os.Stdout)
|
|
||||||
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
humidityCmd.AddCommand(listTemperatureCmd)
|
|
||||||
}
|
|
@ -1,79 +0,0 @@
|
|||||||
package humidity
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/cli"
|
|
||||||
"github.com/go-flucky/flucky/pkg/config"
|
|
||||||
"github.com/go-flucky/flucky/pkg/rgbled"
|
|
||||||
"github.com/go-flucky/flucky/pkg/sensor"
|
|
||||||
"github.com/go-flucky/flucky/pkg/storage"
|
|
||||||
"github.com/go-flucky/flucky/pkg/types"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
var logs bool
|
|
||||||
|
|
||||||
var readHumidityCmd = &cobra.Command{
|
|
||||||
Use: "read",
|
|
||||||
Short: "Reading air pressure values from different or specified sensors by arguments",
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
|
|
||||||
// read configuration
|
|
||||||
cnf, err := config.Read(*configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// fetch all temperature sensors or sensors by args
|
|
||||||
sensors := make([]sensor.Sensor, 0)
|
|
||||||
if len(args) == 0 {
|
|
||||||
sensors = cnf.GetHumiditySensors(config.ENABLED)
|
|
||||||
} else {
|
|
||||||
sensors = cnf.GetHumiditySensorsByName(args)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(sensors) == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
rgbLEDs := cnf.GetRGBLEDs(config.ENABLED)
|
|
||||||
if err := rgbled.Run(rgbLEDs); err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
measuredValues, err := sensor.Read(sensors, types.MeasuredValueTypeTemperature)
|
|
||||||
if err := rgbled.Run(rgbLEDs); err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
measuredValues = types.SelectMeasuredValues(types.MeasuredValueTypeHumidity, measuredValues)
|
|
||||||
|
|
||||||
cli.PrintMeasuredValues(measuredValues, cnf, os.Stdout)
|
|
||||||
|
|
||||||
if logs {
|
|
||||||
storageEndpoint, err := cnf.GetStorageEndpointURL()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx := context.Background()
|
|
||||||
|
|
||||||
err = storage.Write(ctx, measuredValues, storageEndpoint)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
rgbled.Off(rgbLEDs)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
humidityCmd.AddCommand(readHumidityCmd)
|
|
||||||
readHumidityCmd.Flags().BoolVar(&logs, "logs", true, "Log temperature")
|
|
||||||
readHumidityCmd.Flags().BoolVar(&compression, "compression", true, "Compress measured with logged temperatures")
|
|
||||||
readHumidityCmd.Flags().Float64VarP(&round, "round", "r", 0.25, "Round values. The value 0 deactivates the function")
|
|
||||||
}
|
|
@ -1,48 +0,0 @@
|
|||||||
package pressure
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/cli"
|
|
||||||
"github.com/go-flucky/flucky/pkg/config"
|
|
||||||
"github.com/go-flucky/flucky/pkg/storage"
|
|
||||||
"github.com/go-flucky/flucky/pkg/types"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
var listTemperatureCmd = &cobra.Command{
|
|
||||||
Use: "list",
|
|
||||||
Short: "Reading temperature values from different or specified sensors by arguments",
|
|
||||||
Example: fmt.Sprintf("flucky pressure logs"),
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
|
|
||||||
// read configuration
|
|
||||||
cnf, err := config.Read(*configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx := context.Background()
|
|
||||||
storageEndpoint, err := cnf.GetStorageEndpointURL()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
measuredValues, err := storage.Read(ctx, storageEndpoint)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
measuredValues = types.SelectMeasuredValues(types.MeasuredValueTypePressure, measuredValues)
|
|
||||||
|
|
||||||
cli.PrintMeasuredValues(measuredValues, cnf, os.Stdout)
|
|
||||||
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
pressureCmd.AddCommand(listTemperatureCmd)
|
|
||||||
}
|
|
@ -1,27 +1,133 @@
|
|||||||
package pressure
|
package pressure
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/Masterminds/semver"
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/go-flucky/flucky/pkg/cli"
|
||||||
|
"github.com/go-flucky/flucky/pkg/config"
|
||||||
|
"github.com/go-flucky/flucky/pkg/sensor"
|
||||||
|
"github.com/go-flucky/flucky/pkg/storage"
|
||||||
|
"github.com/go-flucky/flucky/pkg/types"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
compression bool
|
compression bool
|
||||||
configFile *string
|
configFile string
|
||||||
|
save bool
|
||||||
round float64
|
round float64
|
||||||
|
|
||||||
version *semver.Version
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var pressureCmd = &cobra.Command{
|
// InitCmd initialize all pressure subcommands
|
||||||
|
func InitCmd(cmd *cobra.Command) error {
|
||||||
|
|
||||||
|
pressureCmd := &cobra.Command{
|
||||||
Use: "pressure",
|
Use: "pressure",
|
||||||
Short: "List air pressure values from different or specified sensors by arguments",
|
Short: "Operates with pressure values",
|
||||||
}
|
}
|
||||||
|
|
||||||
// Execute a
|
listPressuresCmd := &cobra.Command{
|
||||||
func InitCmd(cmd *cobra.Command, cnfFile *string) {
|
Use: "list",
|
||||||
configFile = cnfFile
|
Short: "List pressure values from specified or all sensors",
|
||||||
|
Example: fmt.Sprintf("flucky pressure list"),
|
||||||
|
RunE: listHumidities,
|
||||||
|
}
|
||||||
|
|
||||||
|
readPressuresCmd := &cobra.Command{
|
||||||
|
Use: "read",
|
||||||
|
Short: "Read pressure values from specified or all sensors",
|
||||||
|
Example: fmt.Sprintf("flucky pressure read"),
|
||||||
|
RunE: readPressure,
|
||||||
|
}
|
||||||
|
readPressuresCmd.Flags().BoolVar(&save, "save", true, "Save humidities")
|
||||||
|
readPressuresCmd.Flags().BoolVar(&compression, "compression", true, "Compress measured with logged temperatures")
|
||||||
|
readPressuresCmd.Flags().Float64VarP(&round, "round", "r", 0.25, "Round values. The value 0 deactivates the function")
|
||||||
|
|
||||||
|
pressureCmd.AddCommand(listPressuresCmd)
|
||||||
|
pressureCmd.AddCommand(readPressuresCmd)
|
||||||
cmd.AddCommand(pressureCmd)
|
cmd.AddCommand(pressureCmd)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func listHumidities(cmd *cobra.Command, args []string) error {
|
||||||
|
|
||||||
|
configFile, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("No config file defined")
|
||||||
|
}
|
||||||
|
|
||||||
|
cnf, err := config.Read(configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := context.Background()
|
||||||
|
storageEndpoint, err := cnf.GetStorageEndpointURL()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
measuredValues, err := storage.Read(ctx, storageEndpoint)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
measuredValues = types.SelectMeasuredValues(types.MeasuredValueTypePressure, measuredValues)
|
||||||
|
|
||||||
|
cli.PrintMeasuredValues(measuredValues, cnf, os.Stdout)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func readPressure(cmd *cobra.Command, args []string) error {
|
||||||
|
|
||||||
|
configFile, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("No config file defined")
|
||||||
|
}
|
||||||
|
|
||||||
|
cnf, err := config.Read(configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// fetch all temperature sensors or sensors by args
|
||||||
|
sensors := make([]sensor.Sensor, 0)
|
||||||
|
if len(args) == 0 {
|
||||||
|
sensors = cnf.GetPressureSensors(config.ENABLED)
|
||||||
|
} else {
|
||||||
|
sensors = cnf.GetPressureSensorsByName(args)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(sensors) == 0 {
|
||||||
|
return fmt.Errorf("No sensors matched")
|
||||||
|
}
|
||||||
|
|
||||||
|
measuredValues, err := sensor.Read(sensors, types.MeasuredValueTypePressure)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
measuredValues = types.SelectMeasuredValues(types.MeasuredValueTypePressure, measuredValues)
|
||||||
|
|
||||||
|
cli.PrintMeasuredValues(measuredValues, cnf, os.Stdout)
|
||||||
|
|
||||||
|
if save {
|
||||||
|
storageEndpoint, err := cnf.GetStorageEndpointURL()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
err = storage.Write(ctx, measuredValues, storageEndpoint)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,78 +0,0 @@
|
|||||||
package pressure
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/storage"
|
|
||||||
"github.com/go-flucky/flucky/pkg/types"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/cli"
|
|
||||||
"github.com/go-flucky/flucky/pkg/config"
|
|
||||||
"github.com/go-flucky/flucky/pkg/rgbled"
|
|
||||||
"github.com/go-flucky/flucky/pkg/sensor"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
var logs bool
|
|
||||||
|
|
||||||
var readPressureCmd = &cobra.Command{
|
|
||||||
Use: "read",
|
|
||||||
Short: "Operates with air pressure values",
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
|
|
||||||
// read configuration
|
|
||||||
cnf, err := config.Read(*configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// fetch all temperature sensors or sensors by args
|
|
||||||
sensors := make([]sensor.Sensor, 0)
|
|
||||||
if len(args) == 0 {
|
|
||||||
sensors = cnf.GetPressureSensors(config.ENABLED)
|
|
||||||
} else {
|
|
||||||
sensors = cnf.GetPressureSensorsByName(args)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(sensors) == 0 {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
rgbLEDs := cnf.GetRGBLEDs(config.ENABLED)
|
|
||||||
if err := rgbled.Run(rgbLEDs); err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
measuredValues, err := sensor.Read(sensors, types.MeasuredValueTypePressure)
|
|
||||||
if err := rgbled.Run(rgbLEDs); err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
cli.PrintMeasuredValues(measuredValues, cnf, os.Stdout)
|
|
||||||
|
|
||||||
if logs {
|
|
||||||
storageEndpoint, err := cnf.GetStorageEndpointURL()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx := context.Background()
|
|
||||||
|
|
||||||
err = storage.Write(ctx, measuredValues, storageEndpoint)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
rgbled.Off(rgbLEDs)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
pressureCmd.AddCommand(readPressureCmd)
|
|
||||||
readPressureCmd.Flags().BoolVar(&logs, "logs", true, "Log temperature")
|
|
||||||
readPressureCmd.Flags().BoolVar(&compression, "compression", true, "Compress measured with logged temperatures")
|
|
||||||
readPressureCmd.Flags().Float64VarP(&round, "round", "r", 0.25, "Round values. The value 0 deactivates the function")
|
|
||||||
}
|
|
@ -1,77 +0,0 @@
|
|||||||
package rgbled
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/config"
|
|
||||||
"github.com/go-flucky/flucky/pkg/types"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
var enabled bool
|
|
||||||
var location string
|
|
||||||
|
|
||||||
var addRgbLedCmd = &cobra.Command{
|
|
||||||
Use: "add",
|
|
||||||
Short: "Add a RGB-LED",
|
|
||||||
Aliases: []string{"append"},
|
|
||||||
Args: cobra.ExactArgs(4),
|
|
||||||
Example: fmt.Sprintf(`flucky rgb-led add <name> <gpio-for-blue> <gpio-for-green> <gpio-for-red>
|
|
||||||
flucky rgb-led add my-led GPIO13 GPIO17 GPIO26`),
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
// read configuration
|
|
||||||
cnf, err := config.Read(*configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// determine gpio port
|
|
||||||
gpioBlue, err := types.StringToGPIO(args[1])
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
gpioGreen, err := types.StringToGPIO(args[2])
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
gpioRed, err := types.StringToGPIO(args[3])
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// create new sensor struct
|
|
||||||
rgbLED := &types.RGBLED{
|
|
||||||
RGBLEDName: args[0],
|
|
||||||
RGBLEDLocation: location,
|
|
||||||
RGBLEDEnabled: enabled,
|
|
||||||
ActionMapping: types.DefaultActionMapping,
|
|
||||||
BaseColorsToGPIO: map[types.BaseColor]*types.GPIO{
|
|
||||||
types.BaseColorBlue: &gpioBlue,
|
|
||||||
types.BaseColorGreen: &gpioGreen,
|
|
||||||
types.BaseColorRed: &gpioRed,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
// // add sensor entry to list
|
|
||||||
err = cnf.AddRGBLED(rgbLED)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// save new configuration
|
|
||||||
err = config.Write(cnf, *configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
rgbLedCmd.AddCommand(addRgbLedCmd)
|
|
||||||
|
|
||||||
addRgbLedCmd.Flags().BoolVarP(&enabled, "enabled", "e", true, "Enable Sensor")
|
|
||||||
addRgbLedCmd.Flags().StringVarP(&location, "location", "l", "", "Sensor location")
|
|
||||||
}
|
|
@ -1,42 +0,0 @@
|
|||||||
package rgbled
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/config"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
var disableRgbLedCmd = &cobra.Command{
|
|
||||||
Use: "disable",
|
|
||||||
Short: "Disable a RGB-LED",
|
|
||||||
Args: cobra.ExactArgs(1),
|
|
||||||
Example: `flucky rgb-led disable <name/uuid>
|
|
||||||
flucky rgb-led disable my-led
|
|
||||||
flucky rgb-led disable 9f8abfc5-91f3-480c-a42d-b990b6f89e5d`,
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
|
|
||||||
// read configuration
|
|
||||||
cnf, err := config.Read(*configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// disable sensor entry to list
|
|
||||||
err = cnf.DisableRGBLED(args[0])
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// save new configuration
|
|
||||||
err = config.Write(cnf, *configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
rgbLedCmd.AddCommand(disableRgbLedCmd)
|
|
||||||
}
|
|
@ -1,41 +0,0 @@
|
|||||||
package rgbled
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/config"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
var enableRgbLedCmd = &cobra.Command{
|
|
||||||
Use: "enable",
|
|
||||||
Short: "Enable a RGB-LED",
|
|
||||||
Example: `flucky rgb-led enable <name/uuid>
|
|
||||||
flucky rgb-led enable my-led
|
|
||||||
flucky rgb-led enable 9f8abfc5-91f3-480c-a42d-b990b6f89e5d`,
|
|
||||||
Args: cobra.ExactArgs(1),
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
|
|
||||||
// read configuration
|
|
||||||
cnf, err := config.Read(*configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// disable sensor entry to list
|
|
||||||
err = cnf.EnableRGBLED(args[0])
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// save new configuration
|
|
||||||
err = config.Write(cnf, *configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
rgbLedCmd.AddCommand(enableRgbLedCmd)
|
|
||||||
}
|
|
@ -1,30 +0,0 @@
|
|||||||
package rgbled
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/cli"
|
|
||||||
"github.com/go-flucky/flucky/pkg/config"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
var listRgbLedCmd = &cobra.Command{
|
|
||||||
Use: "list",
|
|
||||||
Short: "List RGB-LEDs",
|
|
||||||
Aliases: []string{"ls"},
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
// read configuration
|
|
||||||
cnf, err := config.Read(*configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// print sensors on stdout
|
|
||||||
cli.PrintRGBLEDs(cnf, os.Stdout)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
rgbLedCmd.AddCommand(listRgbLedCmd)
|
|
||||||
}
|
|
@ -1,41 +0,0 @@
|
|||||||
package rgbled
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/config"
|
|
||||||
"github.com/go-flucky/flucky/pkg/rgbled"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
var offRgbLedCmd = &cobra.Command{
|
|
||||||
Use: "off",
|
|
||||||
Short: "Turn a RGB-LED color off",
|
|
||||||
Example: `flucky rgb-led off <name/uuid> <blue>
|
|
||||||
flucky rgb-led off my-led`,
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
|
|
||||||
// read configuration
|
|
||||||
cnf, err := config.Read(*configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
rgbLEDs := make([]rgbled.RGBLED, 0)
|
|
||||||
if len(args) != 0 {
|
|
||||||
rgbLEDs = cnf.GetRGBLEDsByName(args)
|
|
||||||
} else {
|
|
||||||
rgbLEDs = cnf.GetRGBLEDs(config.ENABLED)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = rgbled.Off(rgbLEDs)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
rgbLedCmd.AddCommand(offRgbLedCmd)
|
|
||||||
}
|
|
@ -1,50 +0,0 @@
|
|||||||
package rgbled
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/config"
|
|
||||||
"github.com/go-flucky/flucky/pkg/rgbled"
|
|
||||||
"github.com/go-flucky/flucky/pkg/types"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
var onRgbLedCmd = &cobra.Command{
|
|
||||||
Use: "on",
|
|
||||||
Short: "Turn a RGB-LED color on",
|
|
||||||
Example: `flucky rgb-led on <names/uuids> <blue/green/purple/red/turquoise/white/yellow>
|
|
||||||
flucky rgb-led on my-led blue
|
|
||||||
flucky rgb-led on my-led my-sweet-led white
|
|
||||||
flucky rgb-led on 1c5b9424-f6e9-4a37-be5c-77e531e94aab red`,
|
|
||||||
Args: cobra.MinimumNArgs(1),
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
|
|
||||||
// read configuration
|
|
||||||
cnf, err := config.Read(*configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
rgbLEDs := make([]rgbled.RGBLED, 0)
|
|
||||||
if len(args) > 1 {
|
|
||||||
rgbLEDs = cnf.GetRGBLEDsByName(args[0 : len(args)-1])
|
|
||||||
} else {
|
|
||||||
rgbLEDs = cnf.GetRGBLEDs(config.ENABLED)
|
|
||||||
}
|
|
||||||
|
|
||||||
color, err := types.StringToLEDColor(args[len(args)-1])
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = rgbled.CustomColor(rgbLEDs, color)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
rgbLedCmd.AddCommand(onRgbLedCmd)
|
|
||||||
}
|
|
@ -1,41 +0,0 @@
|
|||||||
package rgbled
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/config"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
var removeRgbLedCmd = &cobra.Command{
|
|
||||||
Use: "remove",
|
|
||||||
Short: "Remove a RGB-LED",
|
|
||||||
Example: `flucky rgb-led remove <name/uuid>
|
|
||||||
flucky rgb-led remove my-led
|
|
||||||
flucky rgb-led remove 9f8abfc5-91f3-480c-a42d-b990b6f89e5d`,
|
|
||||||
Aliases: []string{"rm"},
|
|
||||||
Args: cobra.ExactArgs(1),
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
// read configuration
|
|
||||||
cnf, err := config.Read(*configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// // add remote entry to list
|
|
||||||
err = cnf.RemoveRGBLED(args[0])
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// save new configuration
|
|
||||||
err = config.Write(cnf, *configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
rgbLedCmd.AddCommand(removeRgbLedCmd)
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
package rgbled
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/config"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
var renameRgbLedCmd = &cobra.Command{
|
|
||||||
Use: "rename",
|
|
||||||
Short: "Rename a RGB-LED",
|
|
||||||
Args: cobra.ExactArgs(2),
|
|
||||||
Example: `flucky rgb-led disable <name/uuid> <new-name>
|
|
||||||
flucky rgb-led disable my-led my-sweet-led
|
|
||||||
flucky rgb-led disable 9f8abfc5-91f3-480c-a42d-b990b6f89e5d my-sweet-led`,
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
// read configuration
|
|
||||||
cnf, err := config.Read(*configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// rename sensor
|
|
||||||
err = cnf.RenameRGBLED(args[0], args[1])
|
|
||||||
if err != nil {
|
|
||||||
log.Println(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// save new configuration
|
|
||||||
err = config.Write(cnf, *configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
rgbLedCmd.AddCommand(renameRgbLedCmd)
|
|
||||||
}
|
|
@ -1,25 +1,347 @@
|
|||||||
package rgbled
|
package rgbled
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
|
||||||
"github.com/Masterminds/semver"
|
"github.com/Masterminds/semver"
|
||||||
|
"github.com/go-flucky/flucky/pkg/cli"
|
||||||
|
"github.com/go-flucky/flucky/pkg/config"
|
||||||
|
"github.com/go-flucky/flucky/pkg/rgbled"
|
||||||
|
"github.com/go-flucky/flucky/pkg/types"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
configFile *string
|
enabled bool
|
||||||
|
location string
|
||||||
version *semver.Version
|
version *semver.Version
|
||||||
)
|
)
|
||||||
|
|
||||||
var rgbLedCmd = &cobra.Command{
|
// InitCmd initialize all rgb-led subcommands
|
||||||
|
func InitCmd(cmd *cobra.Command) error {
|
||||||
|
|
||||||
|
rgbLedCmd := &cobra.Command{
|
||||||
Use: "rgb-led",
|
Use: "rgb-led",
|
||||||
Short: "Manage RGB-LEDs",
|
Short: "Manage RGB-LEDs",
|
||||||
}
|
}
|
||||||
|
|
||||||
// InitCmd da
|
addRGBLEDCmd := &cobra.Command{
|
||||||
func InitCmd(cmd *cobra.Command, cnfFile *string) {
|
Use: "add",
|
||||||
configFile = cnfFile
|
Short: "Add a RGB-LED",
|
||||||
|
Aliases: []string{"append"},
|
||||||
|
Args: cobra.ExactArgs(4),
|
||||||
|
Example: fmt.Sprintf(`flucky rgb-led add <name> <gpio-for-blue> <gpio-for-green> <gpio-for-red>
|
||||||
|
flucky rgb-led add my-led GPIO13 GPIO17 GPIO26`),
|
||||||
|
RunE: addRGBLED,
|
||||||
|
}
|
||||||
|
addRGBLEDCmd.Flags().BoolVarP(&enabled, "enabled", "e", true, "Enable Sensor")
|
||||||
|
addRGBLEDCmd.Flags().StringVarP(&location, "location", "l", "", "Sensor location")
|
||||||
|
|
||||||
|
disableRGBLEDCmd := &cobra.Command{
|
||||||
|
Use: "disable",
|
||||||
|
Short: "Disable a RGB-LED",
|
||||||
|
Args: cobra.ExactArgs(1),
|
||||||
|
Example: `flucky rgb-led disable <name/uuid>
|
||||||
|
flucky rgb-led disable my-led
|
||||||
|
flucky rgb-led disable 9f8abfc5-91f3-480c-a42d-b990b6f89e5d`,
|
||||||
|
RunE: disableRGBLED,
|
||||||
|
}
|
||||||
|
|
||||||
|
enableRGBLEDCmd := &cobra.Command{
|
||||||
|
Use: "enable",
|
||||||
|
Short: "Enable a RGB-LED",
|
||||||
|
Args: cobra.ExactArgs(1),
|
||||||
|
Example: `flucky rgb-led enable <name/uuid>
|
||||||
|
flucky rgb-led enable my-led
|
||||||
|
flucky rgb-led enable 9f8abfc5-91f3-480c-a42d-b990b6f89e5d`,
|
||||||
|
RunE: enableRGBLED,
|
||||||
|
}
|
||||||
|
|
||||||
|
listRGBLEDCmd := &cobra.Command{
|
||||||
|
Use: "list",
|
||||||
|
Short: "List RGB-LEDs",
|
||||||
|
Aliases: []string{"ls"},
|
||||||
|
RunE: listRGBLED,
|
||||||
|
}
|
||||||
|
|
||||||
|
turnOffRGBLEDCmd := &cobra.Command{
|
||||||
|
Use: "off",
|
||||||
|
Short: "Turn a RGB-LED color off",
|
||||||
|
Example: `flucky rgb-led off <name/uuid> <blue>
|
||||||
|
flucky rgb-led off my-led`,
|
||||||
|
RunE: turnOffRGBLED,
|
||||||
|
}
|
||||||
|
|
||||||
|
turnOnRGBLEDCmd := &cobra.Command{
|
||||||
|
Use: "on",
|
||||||
|
Short: "Turn a RGB-LED color on",
|
||||||
|
Example: `flucky rgb-led on <names/uuids> <blue/green/purple/red/turquoise/white/yellow>
|
||||||
|
flucky rgb-led on my-led blue
|
||||||
|
flucky rgb-led on my-led my-sweet-led white
|
||||||
|
flucky rgb-led on 1c5b9424-f6e9-4a37-be5c-77e531e94aab red`,
|
||||||
|
Args: cobra.MinimumNArgs(1),
|
||||||
|
RunE: turnOnRGBLED,
|
||||||
|
}
|
||||||
|
|
||||||
|
removeRGBLEDCmd := &cobra.Command{
|
||||||
|
Use: "remove",
|
||||||
|
Short: "Remove a RGB-LED",
|
||||||
|
Example: `flucky rgb-led remove <name/uuid>
|
||||||
|
flucky rgb-led remove my-led
|
||||||
|
flucky rgb-led remove 9f8abfc5-91f3-480c-a42d-b990b6f89e5d`,
|
||||||
|
Aliases: []string{"rm"},
|
||||||
|
Args: cobra.ExactArgs(1),
|
||||||
|
RunE: removeRGBLED,
|
||||||
|
}
|
||||||
|
|
||||||
|
renameRGBLEDCmd := &cobra.Command{
|
||||||
|
Use: "rename",
|
||||||
|
Short: "Rename a RGB-LED",
|
||||||
|
Args: cobra.ExactArgs(2),
|
||||||
|
Example: `flucky rgb-led disable <name/uuid> <new-name>
|
||||||
|
flucky rgb-led disable my-led my-sweet-led
|
||||||
|
flucky rgb-led disable 9f8abfc5-91f3-480c-a42d-b990b6f89e5d my-sweet-led`,
|
||||||
|
RunE: renameRGBLED,
|
||||||
|
}
|
||||||
|
|
||||||
|
rgbLedCmd.AddCommand(addRGBLEDCmd)
|
||||||
|
rgbLedCmd.AddCommand(disableRGBLEDCmd)
|
||||||
|
rgbLedCmd.AddCommand(enableRGBLEDCmd)
|
||||||
|
rgbLedCmd.AddCommand(listRGBLEDCmd)
|
||||||
|
rgbLedCmd.AddCommand(turnOffRGBLEDCmd)
|
||||||
|
rgbLedCmd.AddCommand(turnOnRGBLEDCmd)
|
||||||
|
rgbLedCmd.AddCommand(removeRGBLEDCmd)
|
||||||
|
rgbLedCmd.AddCommand(renameRGBLEDCmd)
|
||||||
cmd.AddCommand(rgbLedCmd)
|
cmd.AddCommand(rgbLedCmd)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func addRGBLED(cmd *cobra.Command, args []string) error {
|
||||||
|
|
||||||
|
configFile, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("No config file defined")
|
||||||
|
}
|
||||||
|
|
||||||
|
cnf, err := config.Read(configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
gpioBlue, err := types.StringToGPIO(args[1])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
gpioGreen, err := types.StringToGPIO(args[2])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
gpioRed, err := types.StringToGPIO(args[3])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
rgbLED := &types.RGBLED{
|
||||||
|
RGBLEDName: args[0],
|
||||||
|
RGBLEDLocation: location,
|
||||||
|
RGBLEDEnabled: enabled,
|
||||||
|
ActionMapping: types.DefaultActionMapping,
|
||||||
|
BaseColorsToGPIO: map[types.BaseColor]*types.GPIO{
|
||||||
|
types.BaseColorBlue: &gpioBlue,
|
||||||
|
types.BaseColorGreen: &gpioGreen,
|
||||||
|
types.BaseColorRed: &gpioRed,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
err = cnf.AddRGBLED(rgbLED)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = config.Write(cnf, configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func disableRGBLED(cmd *cobra.Command, args []string) error {
|
||||||
|
|
||||||
|
configFile, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("No config file defined")
|
||||||
|
}
|
||||||
|
|
||||||
|
cnf, err := config.Read(configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = cnf.DisableRGBLED(args[0])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = config.Write(cnf, configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func enableRGBLED(cmd *cobra.Command, args []string) error {
|
||||||
|
|
||||||
|
configFile, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("No config file defined")
|
||||||
|
}
|
||||||
|
|
||||||
|
cnf, err := config.Read(configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = cnf.EnableRGBLED(args[0])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = config.Write(cnf, configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func listRGBLED(cmd *cobra.Command, args []string) error {
|
||||||
|
configFile, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("No config file defined")
|
||||||
|
}
|
||||||
|
|
||||||
|
cnf, err := config.Read(configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// print sensors on stdout
|
||||||
|
cli.PrintRGBLEDs(cnf, os.Stdout)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func turnOffRGBLED(cmd *cobra.Command, args []string) error {
|
||||||
|
|
||||||
|
configFile, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("No config file defined")
|
||||||
|
}
|
||||||
|
|
||||||
|
cnf, err := config.Read(configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
rgbLEDs := make([]rgbled.RGBLED, 0)
|
||||||
|
if len(args) != 0 {
|
||||||
|
rgbLEDs = cnf.GetRGBLEDsByName(args)
|
||||||
|
} else {
|
||||||
|
rgbLEDs = cnf.GetRGBLEDs(config.ENABLED)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = rgbled.Off(rgbLEDs)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func turnOnRGBLED(cmd *cobra.Command, args []string) error {
|
||||||
|
|
||||||
|
configFile, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("No config file defined")
|
||||||
|
}
|
||||||
|
|
||||||
|
cnf, err := config.Read(configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
rgbLEDs := make([]rgbled.RGBLED, 0)
|
||||||
|
if len(args) > 1 {
|
||||||
|
rgbLEDs = cnf.GetRGBLEDsByName(args[0 : len(args)-1])
|
||||||
|
} else {
|
||||||
|
rgbLEDs = cnf.GetRGBLEDs(config.ENABLED)
|
||||||
|
}
|
||||||
|
|
||||||
|
color, err := types.StringToLEDColor(args[len(args)-1])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = rgbled.CustomColor(rgbLEDs, color)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeRGBLED(cmd *cobra.Command, args []string) error {
|
||||||
|
|
||||||
|
configFile, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("No config file defined")
|
||||||
|
}
|
||||||
|
|
||||||
|
cnf, err := config.Read(configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = cnf.RemoveRGBLED(args[0])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = config.Write(cnf, configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func renameRGBLED(cmd *cobra.Command, args []string) error {
|
||||||
|
|
||||||
|
configFile, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("No config file defined")
|
||||||
|
}
|
||||||
|
|
||||||
|
cnf, err := config.Read(configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = cnf.RenameRGBLED(args[0], args[1])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = config.Write(cnf, configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
94
cmd/root.go
94
cmd/root.go
@ -2,6 +2,7 @@ package cmd
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log"
|
||||||
"math"
|
"math"
|
||||||
"os"
|
"os"
|
||||||
"time"
|
"time"
|
||||||
@ -17,18 +18,75 @@ import (
|
|||||||
"github.com/go-flucky/flucky/cmd/sensor"
|
"github.com/go-flucky/flucky/cmd/sensor"
|
||||||
"github.com/go-flucky/flucky/cmd/temperature"
|
"github.com/go-flucky/flucky/cmd/temperature"
|
||||||
"github.com/go-flucky/flucky/pkg/types"
|
"github.com/go-flucky/flucky/pkg/types"
|
||||||
|
"github.com/volker-raschek/go-logger/pkg/logger"
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/config"
|
"github.com/go-flucky/flucky/pkg/config"
|
||||||
uuid "github.com/satori/go.uuid"
|
uuid "github.com/satori/go.uuid"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
var configFile string
|
var (
|
||||||
|
configFile string
|
||||||
|
)
|
||||||
|
|
||||||
var rootCmd = &cobra.Command{
|
// Execute a
|
||||||
|
func Execute(version *semver.Version) error {
|
||||||
|
|
||||||
|
rootCmd := &cobra.Command{
|
||||||
Use: "flucky",
|
Use: "flucky",
|
||||||
Short: "flucky - operate with differen sensors, his values and remote servers to synchronize measured values",
|
Short: "flucky - operate with differen sensors, his values and remote servers to synchronize measured values",
|
||||||
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
|
PersistentPreRunE: preRunError,
|
||||||
|
Version: version.String(),
|
||||||
|
}
|
||||||
|
|
||||||
|
logLevel := ""
|
||||||
|
rootCmd.PersistentFlags().StringVar(&configFile, "config", "/etc/flucky/config.json", "Config file")
|
||||||
|
rootCmd.PersistentFlags().StringVar(&logLevel, "loglevel", "info", "Set the Loglevel. Possible values: debug, info, warn, error, fatal")
|
||||||
|
|
||||||
|
subCommands := []func(cmd *cobra.Command) error{
|
||||||
|
completion.InitCmd,
|
||||||
|
compression.InitCmd,
|
||||||
|
convert.InitCmd,
|
||||||
|
daemon.InitCmd,
|
||||||
|
humidity.InitCmd,
|
||||||
|
pressure.InitCmd,
|
||||||
|
rgbled.InitCmd,
|
||||||
|
sensor.InitCmd,
|
||||||
|
temperature.InitCmd,
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, subCommand := range subCommands {
|
||||||
|
if err := subCommand(rootCmd); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err := rootCmd.Execute()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseLogger(logLevel string) logger.Logger {
|
||||||
|
log.Println(logLevel)
|
||||||
|
switch logLevel {
|
||||||
|
case "debug", "DEBUG":
|
||||||
|
return logger.NewDefaultLogger(logger.LogLevelDebug)
|
||||||
|
case "info", "INFO":
|
||||||
|
return logger.NewDefaultLogger(logger.LogLevelInfo)
|
||||||
|
case "warn", "WARN":
|
||||||
|
return logger.NewDefaultLogger(logger.LogLevelWarn)
|
||||||
|
case "error", "ERROR":
|
||||||
|
return logger.NewDefaultLogger(logger.LogLevelError)
|
||||||
|
case "fatal", "FATAL":
|
||||||
|
return logger.NewDefaultLogger(logger.LogLevelFatal)
|
||||||
|
default:
|
||||||
|
return logger.NewDefaultLogger(logger.LogLevelInfo)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func preRunError(cmd *cobra.Command, args []string) error {
|
||||||
|
|
||||||
// check if config file exists
|
// check if config file exists
|
||||||
if _, err := os.Stat(configFile); os.IsNotExist(err) {
|
if _, err := os.Stat(configFile); os.IsNotExist(err) {
|
||||||
@ -39,16 +97,19 @@ var rootCmd = &cobra.Command{
|
|||||||
|
|
||||||
// Time must be truncted for postgres. Postgres currently does not support
|
// Time must be truncted for postgres. Postgres currently does not support
|
||||||
// nanoseconds which is automatically include into the go time object
|
// nanoseconds which is automatically include into the go time object
|
||||||
t := time.Now()
|
postgresTimeStamp := time.Now()
|
||||||
l, _ := time.LoadLocation("Europe/Berlin")
|
location, err := time.LoadLocation("Europe/Berlin")
|
||||||
t = time.Date(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second(), int(math.Round(float64(t.Nanosecond())/1000000)*1000000), l)
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
postgresTimeStamp = time.Date(postgresTimeStamp.Year(), postgresTimeStamp.Month(), postgresTimeStamp.Day(), postgresTimeStamp.Hour(), postgresTimeStamp.Minute(), postgresTimeStamp.Second(), int(math.Round(float64(postgresTimeStamp.Nanosecond())/1000000)*1000000), location)
|
||||||
|
|
||||||
// Default configuration
|
// Default configuration
|
||||||
cnf := config.Configuration{
|
cnf := config.Configuration{
|
||||||
Device: &types.Device{
|
Device: &types.Device{
|
||||||
ID: uuid.NewV4().String(),
|
ID: uuid.NewV4().String(),
|
||||||
Name: hostname,
|
Name: hostname,
|
||||||
CreationDate: t,
|
CreationDate: postgresTimeStamp,
|
||||||
},
|
},
|
||||||
StorageEndpoint: "file:///var/log/flucky/logfile.csv",
|
StorageEndpoint: "file:///var/log/flucky/logfile.csv",
|
||||||
}
|
}
|
||||||
@ -60,23 +121,4 @@ var rootCmd = &cobra.Command{
|
|||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
// Execute a
|
|
||||||
func Execute(version *semver.Version) {
|
|
||||||
rootCmd.Version = version.String()
|
|
||||||
|
|
||||||
rootCmd.PersistentFlags().StringVar(&configFile, "config", "/etc/flucky/config.json", "Config file")
|
|
||||||
|
|
||||||
completion.InitCmd(rootCmd)
|
|
||||||
compression.InitCmd(rootCmd, &configFile)
|
|
||||||
convert.InitCmd(rootCmd, &configFile)
|
|
||||||
daemon.InitCmd(rootCmd, &configFile)
|
|
||||||
humidity.InitCmd(rootCmd, &configFile)
|
|
||||||
pressure.InitCmd(rootCmd, &configFile)
|
|
||||||
rgbled.InitCmd(rootCmd, &configFile)
|
|
||||||
sensor.InitCmd(rootCmd, &configFile)
|
|
||||||
temperature.InitCmd(rootCmd, &configFile)
|
|
||||||
rootCmd.Execute()
|
|
||||||
}
|
}
|
||||||
|
@ -1,104 +0,0 @@
|
|||||||
package sensor
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/config"
|
|
||||||
"github.com/go-flucky/flucky/pkg/types"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
enabled bool
|
|
||||||
gpioIn string
|
|
||||||
i2cAddress uint8
|
|
||||||
i2cBus int
|
|
||||||
location string
|
|
||||||
tickDuration string
|
|
||||||
wireID string
|
|
||||||
)
|
|
||||||
|
|
||||||
var addSensorCmd = &cobra.Command{
|
|
||||||
Use: "add",
|
|
||||||
Short: "Add Sensor",
|
|
||||||
Aliases: []string{"append"},
|
|
||||||
Args: cobra.ExactArgs(2),
|
|
||||||
Example: `flucky sensor add --gpio GPIO14 indoor DHT11
|
|
||||||
flucky sensor add --wire-id 28-011432f0bb3d outdoor DS18B20
|
|
||||||
flucky sensor add --i2c-bus 1 --i2c-address 0x76 wetter-station BME280`,
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
// read configuration
|
|
||||||
cnf, err := config.Read(*configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// determine sensor model
|
|
||||||
sensorModel, err := types.SelectSensorModel(args[1])
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// create new sensor struct
|
|
||||||
sensor := &types.Sensor{
|
|
||||||
Name: args[0],
|
|
||||||
Model: sensorModel,
|
|
||||||
Location: location,
|
|
||||||
Enabled: enabled,
|
|
||||||
TickDuration: tickDuration,
|
|
||||||
}
|
|
||||||
|
|
||||||
// determine gpio port if set
|
|
||||||
if gpioIn != "" &&
|
|
||||||
i2cAddress == 0 &&
|
|
||||||
i2cBus == 0 &&
|
|
||||||
wireID == "" {
|
|
||||||
gpio, err := types.StringToGPIO(gpioIn)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
sensor.GPIONumber = &gpio
|
|
||||||
}
|
|
||||||
|
|
||||||
// set i2c connection settings
|
|
||||||
if gpioIn == "" &&
|
|
||||||
i2cAddress != 0 &&
|
|
||||||
i2cBus != 0 &&
|
|
||||||
wireID == "" {
|
|
||||||
sensor.I2CAddress = &i2cAddress
|
|
||||||
sensor.I2CBus = &i2cBus
|
|
||||||
}
|
|
||||||
|
|
||||||
// set wire connection settings
|
|
||||||
if gpioIn == "" &&
|
|
||||||
i2cAddress == 0 &&
|
|
||||||
i2cBus == 0 &&
|
|
||||||
wireID != "" {
|
|
||||||
sensor.WireID = &wireID
|
|
||||||
}
|
|
||||||
|
|
||||||
// add sensor entry to list
|
|
||||||
err = cnf.AddSensor(sensor)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// save new configuration
|
|
||||||
err = config.Write(cnf, *configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
sensorCmd.AddCommand(addSensorCmd)
|
|
||||||
|
|
||||||
addSensorCmd.Flags().BoolVar(&enabled, "enabled", true, "Enable new sensor")
|
|
||||||
addSensorCmd.Flags().StringVar(&gpioIn, "gpio", "", "Defines the GPIO port")
|
|
||||||
addSensorCmd.Flags().Uint8Var(&i2cAddress, "i2c-address", 0, "Defines the I2C address on the I2C bus")
|
|
||||||
addSensorCmd.Flags().IntVar(&i2cBus, "i2c-bus", 0, "Defines the I2C bus")
|
|
||||||
addSensorCmd.Flags().StringVar(&location, "location", "", "Location of the sensor")
|
|
||||||
addSensorCmd.Flags().StringVar(&tickDuration, "tick-duration", "1m", "Controls how often values should be read from the sensor when running flucky in daemon mode")
|
|
||||||
addSensorCmd.Flags().StringVar(&wireID, "wire-id", "", "Defines the Wire-ID")
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
package sensor
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/config"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
var disableSensorCmd = &cobra.Command{
|
|
||||||
Use: "disable",
|
|
||||||
Short: "Disable Sensor",
|
|
||||||
Args: cobra.ExactArgs(1),
|
|
||||||
Example: "flucky sensor disable outdoor",
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
|
|
||||||
// read configuration
|
|
||||||
cnf, err := config.Read(*configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// disable sensor entry to list
|
|
||||||
err = cnf.DisableSensor(args[0])
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// save new configuration
|
|
||||||
err = config.Write(cnf, *configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
sensorCmd.AddCommand(disableSensorCmd)
|
|
||||||
}
|
|
@ -1,39 +0,0 @@
|
|||||||
package sensor
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/config"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
var enableSensorCmd = &cobra.Command{
|
|
||||||
Use: "enable",
|
|
||||||
Short: "Enable Sensor",
|
|
||||||
Example: "flucky sensor enable outdoor",
|
|
||||||
Args: cobra.ExactArgs(1),
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
|
|
||||||
// read configuration
|
|
||||||
cnf, err := config.Read(*configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// disable sensor entry to list
|
|
||||||
err = cnf.EnableSensor(args[0])
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// save new configuration
|
|
||||||
err = config.Write(cnf, *configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
sensorCmd.AddCommand(enableSensorCmd)
|
|
||||||
}
|
|
@ -1,39 +0,0 @@
|
|||||||
package sensor
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/cli"
|
|
||||||
"github.com/go-flucky/flucky/pkg/config"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
var listSensorCmd = &cobra.Command{
|
|
||||||
Use: "list",
|
|
||||||
Short: "List Sensors",
|
|
||||||
Aliases: []string{"ls"},
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
// read configuration
|
|
||||||
cnf, err := config.Read(*configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// print sensors on stdout
|
|
||||||
err = cli.PrintSensors(cnf, os.Stdout)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// save new configuration
|
|
||||||
err = config.Write(cnf, *configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
sensorCmd.AddCommand(listSensorCmd)
|
|
||||||
}
|
|
@ -1,39 +0,0 @@
|
|||||||
package sensor
|
|
||||||
|
|
||||||
import (
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/config"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
var rmSensorCmd = &cobra.Command{
|
|
||||||
Use: "remove",
|
|
||||||
Short: "Remove Sensor",
|
|
||||||
Example: "flucky sensor rm outdoor",
|
|
||||||
Aliases: []string{"rm"},
|
|
||||||
Args: cobra.ExactArgs(1),
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
// read configuration
|
|
||||||
cnf, err := config.Read(*configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// // add remote entry to list
|
|
||||||
err = cnf.RemoveSensor(args[0])
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// save new configuration
|
|
||||||
err = config.Write(cnf, *configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
sensorCmd.AddCommand(rmSensorCmd)
|
|
||||||
}
|
|
@ -1,39 +0,0 @@
|
|||||||
package sensor
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/config"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
var renameSensorCmd = &cobra.Command{
|
|
||||||
Use: "rename",
|
|
||||||
Short: "Rename Sensor",
|
|
||||||
Args: cobra.ExactArgs(2),
|
|
||||||
Example: fmt.Sprintf("flucky sensor rename indoor outdoor\nflucky sensor rename f98b00ea-a9b2-4e00-924f-113859d0af2d outdoor"),
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
// read configuration
|
|
||||||
cnf, err := config.Read(*configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// rename sensor
|
|
||||||
err = cnf.RenameSensor(args[0], args[1])
|
|
||||||
if err != nil {
|
|
||||||
log.Println(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// save new configuration
|
|
||||||
err = config.Write(cnf, *configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
sensorCmd.AddCommand(renameSensorCmd)
|
|
||||||
}
|
|
@ -1,25 +1,291 @@
|
|||||||
package sensor
|
package sensor
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/Masterminds/semver"
|
"fmt"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/go-flucky/flucky/pkg/cli"
|
||||||
|
"github.com/go-flucky/flucky/pkg/config"
|
||||||
|
"github.com/go-flucky/flucky/pkg/types"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
configFile *string
|
enabled bool
|
||||||
|
gpioIn string
|
||||||
version *semver.Version
|
i2cAddress uint8
|
||||||
|
i2cBus int
|
||||||
|
location string
|
||||||
|
tickDuration string
|
||||||
|
wireID string
|
||||||
)
|
)
|
||||||
|
|
||||||
var sensorCmd = &cobra.Command{
|
// InitCmd initialize all sensor subcommands
|
||||||
|
func InitCmd(cmd *cobra.Command) error {
|
||||||
|
sensorCmd := &cobra.Command{
|
||||||
Use: "sensor",
|
Use: "sensor",
|
||||||
Short: "Manage Sensors",
|
Short: "Manage Sensors",
|
||||||
}
|
}
|
||||||
|
|
||||||
// InitCmd da
|
addSensorCmd := &cobra.Command{
|
||||||
func InitCmd(cmd *cobra.Command, cnfFile *string) {
|
Use: "add",
|
||||||
configFile = cnfFile
|
Short: "Add Sensor",
|
||||||
|
Aliases: []string{"append"},
|
||||||
|
Args: cobra.ExactArgs(2),
|
||||||
|
Example: `flucky sensor add --gpio GPIO14 indoor DHT11
|
||||||
|
flucky sensor add --wire-id 28-011432f0bb3d outdoor DS18B20
|
||||||
|
flucky sensor add --i2c-bus 1 --i2c-address 0x76 wetter-station BME280`,
|
||||||
|
RunE: addSensor,
|
||||||
|
}
|
||||||
|
addSensorCmd.Flags().BoolVar(&enabled, "enabled", true, "Enable new sensor")
|
||||||
|
addSensorCmd.Flags().StringVar(&gpioIn, "gpio", "", "Defines the GPIO port")
|
||||||
|
addSensorCmd.Flags().Uint8Var(&i2cAddress, "i2c-address", 0, "Defines the I2C address on the I2C bus")
|
||||||
|
addSensorCmd.Flags().IntVar(&i2cBus, "i2c-bus", 0, "Defines the I2C bus")
|
||||||
|
addSensorCmd.Flags().StringVar(&location, "location", "", "Location of the sensor")
|
||||||
|
addSensorCmd.Flags().StringVar(&tickDuration, "tick-duration", "1m", "Controls how often values should be read from the sensor when running flucky in daemon mode")
|
||||||
|
addSensorCmd.Flags().StringVar(&wireID, "wire-id", "", "Defines the Wire-ID")
|
||||||
|
|
||||||
|
disableSensorCmd := &cobra.Command{
|
||||||
|
Use: "disable",
|
||||||
|
Short: "Disable Sensor",
|
||||||
|
Args: cobra.ExactArgs(1),
|
||||||
|
Example: "flucky sensor disable outdoor",
|
||||||
|
RunE: deleteSensor,
|
||||||
|
}
|
||||||
|
|
||||||
|
enableSensorCmd := &cobra.Command{
|
||||||
|
Use: "enable",
|
||||||
|
Short: "Enable Sensor",
|
||||||
|
Example: "flucky sensor enable outdoor",
|
||||||
|
Args: cobra.ExactArgs(1),
|
||||||
|
RunE: enableSensor,
|
||||||
|
}
|
||||||
|
|
||||||
|
listSensorCmd := &cobra.Command{
|
||||||
|
Use: "list",
|
||||||
|
Short: "List Sensors",
|
||||||
|
Aliases: []string{"ls"},
|
||||||
|
RunE: listSensors,
|
||||||
|
}
|
||||||
|
|
||||||
|
removeSensorCmd := &cobra.Command{
|
||||||
|
Use: "remove",
|
||||||
|
Short: "Remove Sensor",
|
||||||
|
Aliases: []string{"rm"},
|
||||||
|
Example: "flucky sensor remove outdoor",
|
||||||
|
Args: cobra.ExactArgs(1),
|
||||||
|
RunE: enableSensor,
|
||||||
|
}
|
||||||
|
|
||||||
|
renameSensorCmd := &cobra.Command{
|
||||||
|
Use: "rename",
|
||||||
|
Short: "Rename Sensor",
|
||||||
|
Args: cobra.ExactArgs(2),
|
||||||
|
Example: `flucky sensor rename indoor outdoor
|
||||||
|
flucky sensor rename f98b00ea-a9b2-4e00-924f-113859d0af2d outdoor`,
|
||||||
|
RunE: renameSensor,
|
||||||
|
}
|
||||||
|
|
||||||
|
sensorCmd.AddCommand(addSensorCmd)
|
||||||
|
sensorCmd.AddCommand(disableSensorCmd)
|
||||||
|
sensorCmd.AddCommand(enableSensorCmd)
|
||||||
|
sensorCmd.AddCommand(listSensorCmd)
|
||||||
|
sensorCmd.AddCommand(removeSensorCmd)
|
||||||
|
sensorCmd.AddCommand(renameSensorCmd)
|
||||||
cmd.AddCommand(sensorCmd)
|
cmd.AddCommand(sensorCmd)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func addSensor(cmd *cobra.Command, args []string) error {
|
||||||
|
|
||||||
|
configFile, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("No config file defined")
|
||||||
|
}
|
||||||
|
|
||||||
|
cnf, err := config.Read(configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
sensorModel, err := types.SelectSensorModel(args[1])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
sensor := &types.Sensor{
|
||||||
|
Name: args[0],
|
||||||
|
Model: sensorModel,
|
||||||
|
Location: location,
|
||||||
|
Enabled: enabled,
|
||||||
|
TickDuration: tickDuration,
|
||||||
|
}
|
||||||
|
|
||||||
|
// determine gpio port if set
|
||||||
|
if gpioIn != "" &&
|
||||||
|
i2cAddress == 0 &&
|
||||||
|
i2cBus == 0 &&
|
||||||
|
wireID == "" {
|
||||||
|
gpio, err := types.StringToGPIO(gpioIn)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
sensor.GPIONumber = &gpio
|
||||||
|
}
|
||||||
|
|
||||||
|
// set i2c connection settings
|
||||||
|
if gpioIn == "" &&
|
||||||
|
i2cAddress != 0 &&
|
||||||
|
i2cBus != 0 &&
|
||||||
|
wireID == "" {
|
||||||
|
sensor.I2CAddress = &i2cAddress
|
||||||
|
sensor.I2CBus = &i2cBus
|
||||||
|
}
|
||||||
|
|
||||||
|
// set wire connection settings
|
||||||
|
if gpioIn == "" &&
|
||||||
|
i2cAddress == 0 &&
|
||||||
|
i2cBus == 0 &&
|
||||||
|
wireID != "" {
|
||||||
|
sensor.WireID = &wireID
|
||||||
|
}
|
||||||
|
|
||||||
|
// add sensor entry to list
|
||||||
|
err = cnf.AddSensor(sensor)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// save new configuration
|
||||||
|
err = config.Write(cnf, configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func deleteSensor(cmd *cobra.Command, args []string) error {
|
||||||
|
|
||||||
|
configFile, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("No config file defined")
|
||||||
|
}
|
||||||
|
|
||||||
|
cnf, err := config.Read(configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = cnf.DisableSensor(args[0])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = config.Write(cnf, configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func enableSensor(cmd *cobra.Command, args []string) error {
|
||||||
|
|
||||||
|
configFile, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("No config file defined")
|
||||||
|
}
|
||||||
|
|
||||||
|
cnf, err := config.Read(configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = cnf.EnableSensor(args[0])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = config.Write(cnf, configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func listSensors(cmd *cobra.Command, args []string) error {
|
||||||
|
|
||||||
|
configFile, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("No config file defined")
|
||||||
|
}
|
||||||
|
|
||||||
|
cnf, err := config.Read(configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = cli.PrintSensors(cnf, os.Stdout)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = config.Write(cnf, configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func removeSensor(cmd *cobra.Command, args []string) error {
|
||||||
|
|
||||||
|
configFile, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("No config file defined")
|
||||||
|
}
|
||||||
|
|
||||||
|
cnf, err := config.Read(configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = cnf.RemoveSensor(args[0])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = config.Write(cnf, configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func renameSensor(cmd *cobra.Command, args []string) error {
|
||||||
|
|
||||||
|
configFile, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("No config file defined")
|
||||||
|
}
|
||||||
|
|
||||||
|
cnf, err := config.Read(configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = cnf.RenameSensor(args[0], args[1])
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = config.Write(cnf, configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -1,49 +0,0 @@
|
|||||||
package temperature
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/storage"
|
|
||||||
"github.com/go-flucky/flucky/pkg/types"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/cli"
|
|
||||||
"github.com/go-flucky/flucky/pkg/config"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
var listTemperatureCmd = &cobra.Command{
|
|
||||||
Use: "list",
|
|
||||||
Short: "List temperature values from different or specified sensors by arguments",
|
|
||||||
Example: fmt.Sprintf("flucky temperature logs"),
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
|
|
||||||
// read configuration
|
|
||||||
cnf, err := config.Read(*configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx := context.Background()
|
|
||||||
storageEndpoint, err := cnf.GetStorageEndpointURL()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
measuredValues, err := storage.Read(ctx, storageEndpoint)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
measuredValues = types.SelectMeasuredValues(types.MeasuredValueTypeTemperature, measuredValues)
|
|
||||||
|
|
||||||
cli.PrintMeasuredValues(measuredValues, cnf, os.Stdout)
|
|
||||||
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
temperatureCmd.AddCommand(listTemperatureCmd)
|
|
||||||
}
|
|
@ -1,77 +0,0 @@
|
|||||||
package temperature
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/go-flucky/flucky/pkg/cli"
|
|
||||||
"github.com/go-flucky/flucky/pkg/config"
|
|
||||||
"github.com/go-flucky/flucky/pkg/rgbled"
|
|
||||||
"github.com/go-flucky/flucky/pkg/sensor"
|
|
||||||
"github.com/go-flucky/flucky/pkg/storage"
|
|
||||||
"github.com/go-flucky/flucky/pkg/types"
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
var readTemperatureCmd = &cobra.Command{
|
|
||||||
Use: "read",
|
|
||||||
Short: "Reading temperature values from different or specified sensors by arguments",
|
|
||||||
Example: fmt.Sprintf("flucky temperature read\nflucky temperature read outdoor"),
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
|
|
||||||
// read configuration
|
|
||||||
cnf, err := config.Read(*configFile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// fetch all temperature sensors or sensors by args
|
|
||||||
sensors := make([]sensor.Sensor, 0)
|
|
||||||
if len(args) == 0 {
|
|
||||||
sensors = cnf.GetTemperatureSensors(config.ENABLED)
|
|
||||||
} else {
|
|
||||||
sensors = cnf.GetTemperatureSensorsByName(args)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(sensors) == 0 {
|
|
||||||
log.Fatalln("No sensors found, specified or configured")
|
|
||||||
}
|
|
||||||
|
|
||||||
rgbLEDs := cnf.GetRGBLEDs(config.ENABLED)
|
|
||||||
if err := rgbled.Run(rgbLEDs); err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
measuredValues, err := sensor.Read(sensors, types.MeasuredValueTypeTemperature)
|
|
||||||
if err := rgbled.Run(rgbLEDs); err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
cli.PrintMeasuredValues(measuredValues, cnf, os.Stdout)
|
|
||||||
|
|
||||||
if logs {
|
|
||||||
storageEndpoint, err := cnf.GetStorageEndpointURL()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx := context.Background()
|
|
||||||
|
|
||||||
err = storage.Write(ctx, measuredValues, storageEndpoint)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
rgbled.Off(rgbLEDs)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
temperatureCmd.AddCommand(readTemperatureCmd)
|
|
||||||
readTemperatureCmd.Flags().BoolVar(&logs, "logs", true, "Log temperature")
|
|
||||||
readTemperatureCmd.Flags().BoolVar(&compression, "compression", true, "Compress measured with logged temperatures")
|
|
||||||
readTemperatureCmd.Flags().Float64VarP(&round, "round", "r", 0.25, "Round values. The value 0 deactivates the function")
|
|
||||||
}
|
|
@ -1,31 +1,131 @@
|
|||||||
package temperature
|
package temperature
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"os"
|
||||||
|
|
||||||
"github.com/Masterminds/semver"
|
"github.com/go-flucky/flucky/pkg/cli"
|
||||||
|
"github.com/go-flucky/flucky/pkg/config"
|
||||||
|
"github.com/go-flucky/flucky/pkg/sensor"
|
||||||
|
"github.com/go-flucky/flucky/pkg/storage"
|
||||||
|
"github.com/go-flucky/flucky/pkg/types"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
compression bool
|
compression bool
|
||||||
configFile *string
|
save bool
|
||||||
logs bool
|
|
||||||
round float64
|
round float64
|
||||||
|
|
||||||
version *semver.Version
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var temperatureCmd = &cobra.Command{
|
// InitCmd initialize all temperature subcommands
|
||||||
|
func InitCmd(cmd *cobra.Command) error {
|
||||||
|
|
||||||
|
temperatureCmd := &cobra.Command{
|
||||||
Use: "temperature",
|
Use: "temperature",
|
||||||
Short: "Operates with temperature values",
|
Short: "Operates with temperature values",
|
||||||
Example: fmt.Sprintf("flucky temperature read\nflucky temperature read outdoor"),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// InitCmd initialize the subcommand
|
listTemperaturesCmd := &cobra.Command{
|
||||||
func InitCmd(cmd *cobra.Command, cnfFile *string) {
|
Use: "list",
|
||||||
configFile = cnfFile
|
Short: "List temperature values from specified or all sensors",
|
||||||
|
Example: fmt.Sprintf("flucky temperature list"),
|
||||||
|
RunE: listTemperatures,
|
||||||
|
}
|
||||||
|
|
||||||
|
readTemperatures := &cobra.Command{
|
||||||
|
Use: "read",
|
||||||
|
Short: "Read temperature values from specified or all sensors",
|
||||||
|
Example: fmt.Sprintf("flucky temperature read"),
|
||||||
|
RunE: readTemperature,
|
||||||
|
}
|
||||||
|
readTemperatures.Flags().BoolVar(&save, "save", true, "Save humidities")
|
||||||
|
readTemperatures.Flags().BoolVar(&compression, "compression", true, "Compress measured with logged temperatures")
|
||||||
|
readTemperatures.Flags().Float64VarP(&round, "round", "r", 0.25, "Round values. The value 0 deactivates the function")
|
||||||
|
|
||||||
|
temperatureCmd.AddCommand(listTemperaturesCmd)
|
||||||
|
temperatureCmd.AddCommand(readTemperatures)
|
||||||
cmd.AddCommand(temperatureCmd)
|
cmd.AddCommand(temperatureCmd)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func listTemperatures(cmd *cobra.Command, args []string) error {
|
||||||
|
|
||||||
|
configFile, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("No config file defined")
|
||||||
|
}
|
||||||
|
|
||||||
|
cnf, err := config.Read(configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := context.Background()
|
||||||
|
storageEndpoint, err := cnf.GetStorageEndpointURL()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
measuredValues, err := storage.Read(ctx, storageEndpoint)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
measuredValues = types.SelectMeasuredValues(types.MeasuredValueTypeTemperature, measuredValues)
|
||||||
|
|
||||||
|
cli.PrintMeasuredValues(measuredValues, cnf, os.Stdout)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func readTemperature(cmd *cobra.Command, args []string) error {
|
||||||
|
|
||||||
|
configFile, err := cmd.Flags().GetString("config")
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("No config file defined")
|
||||||
|
}
|
||||||
|
|
||||||
|
cnf, err := config.Read(configFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
sensors := make([]sensor.Sensor, 0)
|
||||||
|
if len(args) == 0 {
|
||||||
|
sensors = cnf.GetTemperatureSensors(config.ENABLED)
|
||||||
|
} else {
|
||||||
|
sensors = cnf.GetTemperatureSensorsByName(args)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(sensors) == 0 {
|
||||||
|
return fmt.Errorf("No sensors matched")
|
||||||
|
}
|
||||||
|
|
||||||
|
measuredValues, err := sensor.Read(sensors, types.MeasuredValueTypeTemperature)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
measuredValues = types.SelectMeasuredValues(types.MeasuredValueTypeTemperature, measuredValues)
|
||||||
|
|
||||||
|
cli.PrintMeasuredValues(measuredValues, cnf, os.Stdout)
|
||||||
|
|
||||||
|
if save {
|
||||||
|
storageEndpoint, err := cnf.GetStorageEndpointURL()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
err = storage.Write(ctx, measuredValues, storageEndpoint)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
5
main.go
5
main.go
@ -19,5 +19,8 @@ func main() {
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd.Execute(sversion)
|
err = cmd.Execute(sversion)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,19 +15,9 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
postgresHost = "markus-pc.trier.cryptic.systems"
|
flogger = logger.NewDefaultLogger(logger.LogLevelDebug)
|
||||||
postgresPort = "5432"
|
|
||||||
postgresDatabase = "postgres"
|
|
||||||
postgresUser = "postgres"
|
|
||||||
postgresPassword = "postgres"
|
|
||||||
|
|
||||||
flogger = logger.NewSilentLogger()
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func SetLogger(logger logger.Logger) {
|
|
||||||
flogger = logger
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start the daemon
|
// Start the daemon
|
||||||
func Start(cnf *config.Configuration, cacheSize uint, compression bool, round float64) error {
|
func Start(cnf *config.Configuration, cacheSize uint, compression bool, round float64) error {
|
||||||
|
|
||||||
@ -59,8 +49,8 @@ func Start(cnf *config.Configuration, cacheSize uint, compression bool, round fl
|
|||||||
measuredValueChannel := make(chan *types.MeasuredValue, 0)
|
measuredValueChannel := make(chan *types.MeasuredValue, 0)
|
||||||
|
|
||||||
// Info
|
// Info
|
||||||
flogger.Info("Use compression: %v", compression)
|
flogger.Debug("Use compression: %v", compression)
|
||||||
flogger.Info("Round: %v", round)
|
flogger.Debug("Round values to: %v", round)
|
||||||
|
|
||||||
// Init semaphoreChannel
|
// Init semaphoreChannel
|
||||||
semaphoreChannels := make(map[string]chan struct{})
|
semaphoreChannels := make(map[string]chan struct{})
|
||||||
@ -77,7 +67,6 @@ func Start(cnf *config.Configuration, cacheSize uint, compression bool, round fl
|
|||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
errorChannel <- fmt.Errorf("Closed context: %v", ctx.Err().Error())
|
|
||||||
return
|
return
|
||||||
case <-semaphoreChannels[sensor.GetID()]:
|
case <-semaphoreChannels[sensor.GetID()]:
|
||||||
measuredValues, err := sensor.Read()
|
measuredValues, err := sensor.Read()
|
||||||
@ -97,7 +86,6 @@ func Start(cnf *config.Configuration, cacheSize uint, compression bool, round fl
|
|||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
errorChannel <- fmt.Errorf("Closed context: %v", ctx.Err().Error())
|
|
||||||
return
|
return
|
||||||
case <-sensor.GetTicker().C:
|
case <-sensor.GetTicker().C:
|
||||||
semaphoreChannels[sensor.GetID()] <- struct{}{}
|
semaphoreChannels[sensor.GetID()] <- struct{}{}
|
||||||
@ -114,7 +102,7 @@ func Start(cnf *config.Configuration, cacheSize uint, compression bool, round fl
|
|||||||
return
|
return
|
||||||
case measuredValue := <-measuredValueChannel:
|
case measuredValue := <-measuredValueChannel:
|
||||||
cache.Add(measuredValue)
|
cache.Add(measuredValue)
|
||||||
debugChannel <- fmt.Sprintf("CacheStore ID %v: %v - %v - %v", cache.Size(), measuredValue.SensorID, measuredValue.ValueType, measuredValue.Value)
|
debugChannel <- fmt.Sprintf("CacheStore ID: %v, Sensor ID: %v, Type: %v, Value: %v", cache.Size(), measuredValue.SensorID, measuredValue.ValueType, measuredValue.Value)
|
||||||
if cache.Size() >= int(cacheSize) {
|
if cache.Size() >= int(cacheSize) {
|
||||||
debugChannel <- fmt.Sprint("Write cache into storage endpoint")
|
debugChannel <- fmt.Sprint("Write cache into storage endpoint")
|
||||||
err := cache.WriteToEndpoint()
|
err := cache.WriteToEndpoint()
|
||||||
|
Loading…
Reference in New Issue
Block a user