noolite-cli.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package main
  2. import (
  3. "errors"
  4. "flag"
  5. "fmt"
  6. "github.com/dedkovd/noolite"
  7. "net/http"
  8. "strings"
  9. "strconv"
  10. )
  11. func sendCommand(command string, channel, value, r, g, b int) error {
  12. if channel == -1 {
  13. return errors.New("Channel was not set")
  14. }
  15. if command == "" {
  16. return errors.New("Command was not set")
  17. }
  18. n, err := noolite.DefaultNooliteAdapter()
  19. if err != nil {
  20. return err
  21. }
  22. defer n.Close()
  23. if command == "set" {
  24. if value != 0 {
  25. return n.SetBrightnesValue(channel, value)
  26. } else if r != 0 || g != 0 || b != 0 {
  27. return n.SetBrightnesValues(channel, r, g, b)
  28. } else {
  29. return errors.New("Need some value")
  30. }
  31. } else {
  32. commands := map[string]func(int) error{
  33. "on": n.On,
  34. "off": n.Off,
  35. "switch": n.Switch,
  36. "decraseBrightnes": n.DecraseBrightnes,
  37. "incraseBrightnes": n.IncraseBrightnes,
  38. "invertBrightnes": n.InvertBrightnes,
  39. }
  40. cmd, ok := commands[command]
  41. if !ok {
  42. return errors.New("Command not found")
  43. }
  44. return cmd(channel)
  45. }
  46. }
  47. func parseParams(path string) (string, int, int, int, int, int) {
  48. params := strings.Split(path, "/")[1:]
  49. command := ""
  50. channel := -1
  51. value := 0
  52. r := 0
  53. g := 0
  54. b := 0
  55. command = params[0]
  56. if len(params) > 1 {
  57. channel, _ = strconv.Atoi(params[1])
  58. }
  59. if len(params) > 2 {
  60. value, _ = strconv.Atoi(params[2])
  61. }
  62. if len(params) == 5 {
  63. value = 0
  64. r, _ = strconv.Atoi(params[2])
  65. g, _ = strconv.Atoi(params[3])
  66. b, _ = strconv.Atoi(params[4])
  67. }
  68. return command, channel, value, r, g, b
  69. }
  70. func main() {
  71. channel := flag.Int("channel", -1, "Noolite adapter channel")
  72. command := flag.String("command", "", "Command")
  73. value := flag.Int("val", 0, "Set value")
  74. red := flag.Int("r", 0, "Red channel")
  75. green := flag.Int("g", 0, "Green channel")
  76. blue := flag.Int("b", 0, "Blue channel")
  77. http_port := flag.Int("p", -1, "Http port")
  78. flag.Parse()
  79. if *http_port < 0 {
  80. err := sendCommand(*command, *channel, *value, *red, *green, *blue)
  81. if err != nil {
  82. panic(err)
  83. }
  84. } else {
  85. http.HandleFunc("/noolite/", func(w http.ResponseWriter, r *http.Request) {
  86. command, channel, value, r, g, b := parseParams(r.URL.Path[1:])
  87. fmt.Fprintf(w, "Command: %q\n", command)
  88. fmt.Fprintf(w, "Channel: %d\n", channel)
  89. err := sendCommand(command, channel, value, r, g, b)
  90. if err != nil {
  91. fmt.Fprintf(w, "Error: %q\n", err)
  92. }
  93. })
  94. panic(http.ListenAndServe(fmt.Sprintf(":%d", *http_port), nil))
  95. }
  96. }