Files
ezcoo-usb-control/pkg/bridge/discovery.go
T

64 lines
1.7 KiB
Go

package bridge
import (
"encoding/json"
"fmt"
"log/slog"
)
func (b *Bridge) publishDiscovery() {
type component struct {
Platform string `json:"p"`
Name string `json:"name"`
UniqueID string `json:"unique_id"`
CommandTopic string `json:"command_topic"`
StateTopic string `json:"state_topic"`
Options []string `json:"options"`
}
type payload struct {
Device struct {
Identifiers []string `json:"identifiers"`
Name string `json:"name"`
Manufacturer string `json:"manufacturer"`
Model string `json:"model"`
} `json:"device"`
Origin map[string]string `json:"origin"`
Availability []map[string]string `json:"availability"`
Components map[string]component `json:"components"`
}
options := make([]string, numInputs)
for i := range options {
options[i] = inputLabel(i + 1)
}
p := payload{
Origin: map[string]string{"name": "ezcoo-usb-control"},
Availability: []map[string]string{{"topic": b.availTopic()}},
Components: make(map[string]component, numOutputs),
}
p.Device.Identifiers = []string{"ezcoo_mx42has_arc"}
p.Device.Name = "EZCOO HDMI Matrix"
p.Device.Manufacturer = "EZCOO"
p.Device.Model = "EZ-MX42HAS-ARC"
for out := 1; out <= numOutputs; out++ {
p.Components[fmt.Sprintf("out%d", out)] = component{
Platform: "select",
Name: fmt.Sprintf("Output %d", out),
UniqueID: fmt.Sprintf("ezcoo_mx42_out%d", out),
CommandTopic: b.cmdTopic(out),
StateTopic: b.stateTopic(out),
Options: options,
}
}
data, err := json.Marshal(p)
if err != nil {
slog.Error("marshal discovery payload", "err", err)
return
}
b.client.Publish(b.discoveryTopic(), 1, true, data)
slog.Info("published HA discovery")
}