97 lines
2.9 KiB
Go
97 lines
2.9 KiB
Go
|
|
package homeassistantutil
|
||
|
|
|
||
|
|
import (
|
||
|
|
"bytes"
|
||
|
|
"encoding/json"
|
||
|
|
"fmt"
|
||
|
|
"log/slog"
|
||
|
|
"net/http"
|
||
|
|
"time"
|
||
|
|
|
||
|
|
"github.com/spf13/viper"
|
||
|
|
)
|
||
|
|
|
||
|
|
const (
|
||
|
|
ipField string = "homeassistant.ip"
|
||
|
|
portField string = "homeassistant.port"
|
||
|
|
authTokenField string = "homeassistant.authToken"
|
||
|
|
webhookPath string = "/api/webhook/"
|
||
|
|
sensorPath string = "/api/states/"
|
||
|
|
)
|
||
|
|
|
||
|
|
type HttpSensor struct {
|
||
|
|
EntityId string `json:"entity_id"`
|
||
|
|
State string `json:"state"`
|
||
|
|
Attributes interface{} `json:"attributes"`
|
||
|
|
}
|
||
|
|
|
||
|
|
type WebhookBody interface{}
|
||
|
|
|
||
|
|
func TriggerWebhook(webhookId string, body WebhookBody) {
|
||
|
|
if viper.InConfig(ipField) &&
|
||
|
|
viper.InConfig(portField) &&
|
||
|
|
viper.InConfig(authTokenField) {
|
||
|
|
url := fmt.Sprintf("http://%s:%s%s%s", viper.GetString(ipField), viper.GetString(portField), webhookPath, webhookId)
|
||
|
|
payload, err := json.Marshal(body)
|
||
|
|
if err != nil {
|
||
|
|
slog.Warn(fmt.Sprintln("TriggerWebhook Error marshalling", err))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
req, err := http.NewRequest("POST", url, bytes.NewBuffer(payload))
|
||
|
|
if err != nil {
|
||
|
|
slog.Warn(fmt.Sprintln("TriggerWebhook Error creating request", err))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
req.Header.Set("Content-Type", "application/json")
|
||
|
|
req.Header.Set("Authorization", "Bearer "+viper.GetString(authTokenField))
|
||
|
|
client := &http.Client{
|
||
|
|
Timeout: time.Second * 1,
|
||
|
|
}
|
||
|
|
go func() {
|
||
|
|
resp, err := client.Do(req)
|
||
|
|
if err != nil {
|
||
|
|
slog.Warn(fmt.Sprintln("TriggerWebhook Error sending request", err))
|
||
|
|
}
|
||
|
|
if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated {
|
||
|
|
slog.Warn(fmt.Sprintln("TriggerWebhook Unexpected response status", resp.StatusCode))
|
||
|
|
}
|
||
|
|
defer resp.Body.Close()
|
||
|
|
}()
|
||
|
|
} else {
|
||
|
|
slog.Warn("TriggerWebhook Home Assistant IP, port, or token not found in config file")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func PublishSensor(sensor HttpSensor) {
|
||
|
|
if viper.InConfig(ipField) &&
|
||
|
|
viper.InConfig(portField) &&
|
||
|
|
viper.InConfig(authTokenField) {
|
||
|
|
url := fmt.Sprintf("http://%s:%s%s%s", viper.GetString(ipField), viper.GetString(portField), sensorPath, sensor.EntityId)
|
||
|
|
payload, err := json.Marshal(sensor)
|
||
|
|
if err != nil {
|
||
|
|
slog.Warn(fmt.Sprintln("PublishSensor Error marshalling", err))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
req, err := http.NewRequest("POST", url, bytes.NewBuffer(payload))
|
||
|
|
if err != nil {
|
||
|
|
slog.Warn(fmt.Sprintln("PublishSensor Error creating request", err))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
req.Header.Set("Content-Type", "application/json")
|
||
|
|
req.Header.Set("Authorization", "Bearer "+viper.GetString(authTokenField))
|
||
|
|
client := &http.Client{
|
||
|
|
Timeout: time.Second * 1,
|
||
|
|
}
|
||
|
|
resp, err := client.Do(req)
|
||
|
|
if err != nil {
|
||
|
|
slog.Warn(fmt.Sprintln("PublishSensor Error sending request", err))
|
||
|
|
}
|
||
|
|
if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated {
|
||
|
|
slog.Warn(fmt.Sprintln("PublishSensor Unexpected response status", resp.StatusCode))
|
||
|
|
}
|
||
|
|
defer resp.Body.Close()
|
||
|
|
} else {
|
||
|
|
slog.Warn("PublishSensor Home Assistant IP, port, or token not found in config file")
|
||
|
|
}
|
||
|
|
}
|