Slight refactor and set color temperature when turning the light on
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
6d04e89f37
commit
da299f57cd
103
main.go
103
main.go
|
@ -14,22 +14,44 @@ import (
|
||||||
"github.com/kelvins/sunrisesunset"
|
"github.com/kelvins/sunrisesunset"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Location struct {
|
// @TODO Make this environment variables
|
||||||
Type string `json:"_type"`
|
// SETTINGS
|
||||||
|
// Group id of the lights in the living room
|
||||||
|
const groupId = 1
|
||||||
|
// The color temperature to use for the lights
|
||||||
|
// @TODO Not sure how this is calulcated
|
||||||
|
const Temperature uint16 = 366
|
||||||
|
|
||||||
|
// All the different message types
|
||||||
|
type Type string
|
||||||
|
const (
|
||||||
|
Beacon Type = "beacon"
|
||||||
|
Card = "card"
|
||||||
|
Cmd = "cmd"
|
||||||
|
Configuration = "configuration"
|
||||||
|
Encrypted = "encrypted"
|
||||||
|
Location = "location"
|
||||||
|
Lwt = "lwt"
|
||||||
|
Steps = "steps"
|
||||||
|
Transition = "transition"
|
||||||
|
Waypoint = "waypoint"
|
||||||
|
Waypoints = "waypoints"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Struct for parsing message type
|
||||||
|
type Identifier struct {
|
||||||
|
Type Type `json:"_type"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Struct with all the data from location messages
|
||||||
|
type LocationData struct {
|
||||||
Longitude float32 `json:"lon"`
|
Longitude float32 `json:"lon"`
|
||||||
Latitude float32 `json:"lat"`
|
Latitude float32 `json:"lat"`
|
||||||
Altitude int `json:"alt"`
|
Altitude int `json:"alt"`
|
||||||
InRegions []string `json:"inregions"`
|
InRegions []string `json:"inregions"`
|
||||||
}
|
}
|
||||||
|
|
||||||
var defaultHandler MQTT.MessageHandler = func(client MQTT.Client, msg MQTT.Message) {
|
// Get the time of the next sunrise and sunset
|
||||||
fmt.Printf("TOPIC: %s\n", msg.Topic())
|
|
||||||
fmt.Printf("MSG: %s\n", msg.Payload())
|
|
||||||
}
|
|
||||||
|
|
||||||
const groupId = 1
|
|
||||||
const brightness = 100
|
|
||||||
|
|
||||||
func getNextSunriseSunset() (time.Time, time.Time) {
|
func getNextSunriseSunset() (time.Time, time.Time) {
|
||||||
p := sunrisesunset.Parameters{
|
p := sunrisesunset.Parameters{
|
||||||
Latitude: 51.9808334,
|
Latitude: 51.9808334,
|
||||||
|
@ -61,6 +83,7 @@ func getNextSunriseSunset() (time.Time, time.Time) {
|
||||||
return sunrise, sunset
|
return sunrise, sunset
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if it is currently daytime
|
||||||
func isDay() bool {
|
func isDay() bool {
|
||||||
p := sunrisesunset.Parameters{
|
p := sunrisesunset.Parameters{
|
||||||
Latitude: 51.9808334,
|
Latitude: 51.9808334,
|
||||||
|
@ -76,6 +99,7 @@ func isDay() bool {
|
||||||
return time.Now().After(sunrise) && time.Now().Before(sunset)
|
return time.Now().After(sunrise) && time.Now().Before(sunset)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Turn off all the lights attached to the bridge
|
||||||
func allLightsOff(bridge *huego.Bridge) {
|
func allLightsOff(bridge *huego.Bridge) {
|
||||||
lights, _ := bridge.GetLights()
|
lights, _ := bridge.GetLights()
|
||||||
for _, l := range lights {
|
for _, l := range lights {
|
||||||
|
@ -83,6 +107,39 @@ func allLightsOff(bridge *huego.Bridge) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This is the default message handler, it just prints out the topic and message
|
||||||
|
var defaultHandler MQTT.MessageHandler = func(client MQTT.Client, msg MQTT.Message) {
|
||||||
|
fmt.Printf("TOPIC: %s\n", msg.Topic())
|
||||||
|
fmt.Printf("MSG: %s\n", msg.Payload())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handler got owntrack/+/+
|
||||||
|
func locationHandler(home chan bool) func(MQTT.Client, MQTT.Message) {
|
||||||
|
return func(client MQTT.Client, msg MQTT.Message) {
|
||||||
|
// Check the type of the MQTT message
|
||||||
|
var identifier Identifier
|
||||||
|
json.Unmarshal(msg.Payload(), &identifier)
|
||||||
|
if identifier.Type != Location {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Marshall all the location data
|
||||||
|
var location LocationData
|
||||||
|
json.Unmarshal(msg.Payload(), &location)
|
||||||
|
|
||||||
|
fmt.Println(location)
|
||||||
|
temp := false
|
||||||
|
for _, region := range location.InRegions {
|
||||||
|
if region == "home" {
|
||||||
|
temp = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println(temp)
|
||||||
|
|
||||||
|
home <- temp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
_ = godotenv.Load()
|
_ = godotenv.Load()
|
||||||
|
|
||||||
|
@ -125,29 +182,7 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
home := make(chan bool, 1)
|
home := make(chan bool, 1)
|
||||||
var locationHandler MQTT.MessageHandler = func(client MQTT.Client, msg MQTT.Message) {
|
if token := c.Subscribe("owntracks/mqtt/apollo", 0, locationHandler(home)); token.Wait() && token.Error() != nil {
|
||||||
var location Location
|
|
||||||
json.Unmarshal(msg.Payload(), &location)
|
|
||||||
|
|
||||||
// Make sure that the message we get is a location update
|
|
||||||
// @TODO Find a more elegant way of doing this
|
|
||||||
if location.Type != "location" {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println(location)
|
|
||||||
temp := false
|
|
||||||
for _, region := range location.InRegions {
|
|
||||||
if region == "home" {
|
|
||||||
temp = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fmt.Println(temp)
|
|
||||||
|
|
||||||
home <- temp
|
|
||||||
}
|
|
||||||
|
|
||||||
if token := c.Subscribe("owntracks/mqtt/apollo", 0, locationHandler); token.Wait() && token.Error() != nil {
|
|
||||||
fmt.Println(token.Error())
|
fmt.Println(token.Error())
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
@ -181,6 +216,7 @@ events:
|
||||||
if !isDay() {
|
if !isDay() {
|
||||||
fmt.Println("\tTurning on lights in the living room")
|
fmt.Println("\tTurning on lights in the living room")
|
||||||
livingRoom.Bri(0xff)
|
livingRoom.Bri(0xff)
|
||||||
|
livingRoom.Ct(Temperature)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Stop the ticker in case it is running
|
// Stop the ticker in case it is running
|
||||||
|
@ -205,6 +241,7 @@ events:
|
||||||
fmt.Println("\tGradually turning on lights in the living room")
|
fmt.Println("\tGradually turning on lights in the living room")
|
||||||
// Start the ticker to gradually turn on the living room lights
|
// Start the ticker to gradually turn on the living room lights
|
||||||
ticker.Reset(1200 * time.Millisecond)
|
ticker.Reset(1200 * time.Millisecond)
|
||||||
|
livingRoom.Ct(Temperature)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set new timer
|
// Set new timer
|
||||||
|
|
Reference in New Issue
Block a user