diff --git a/gateway.go b/gateway.go index 4b5de729cc7aef27c437d679b6484d12a3b7db2d..b64f45430a64a7e99a7cb91bc78c2522dafa7bae 100644 --- a/gateway.go +++ b/gateway.go @@ -30,11 +30,21 @@ func (gw *Gateway) GetZDevice(name string) *Z2MDevice { } func (gw *Gateway) AddZDevice(zDev *Z2MDevice) { + for _, xDev := range zDev.XAALDevices { + dev := xDev.getXAALDevice() + slog.Debug("Adding device", "dev", dev.String()) + gw.Engine.AddDevice(dev) + } gw.Devices[zDev.FriendlyName] = zDev zDev.Gateway = gw } func (gw *Gateway) RemoveZDevice(zDev *Z2MDevice) { + for _, xDev := range zDev.XAALDevices { + dev := xDev.getXAALDevice() + slog.Debug("Removing device", "dev", dev.String()) + gw.Engine.RemoveDevice(dev) + } zDev.Gateway = nil delete(gw.Devices, zDev.FriendlyName) } @@ -72,20 +82,37 @@ func (gw *Gateway) mqttPublishHander(client mqtt.Client, msg mqtt.Message) { // if they don't exist func (gw *Gateway) jsonParseDevices(msg mqtt.Message) { var devices []Z2MDevice + slog.Debug("Parsing devices") err := json.Unmarshal(msg.Payload(), &devices) if err != nil { slog.Error("Error decoding JSON", "err", err) } + // search for new devices for _, zDev := range devices { known := gw.GetZDevice(zDev.FriendlyName) if known != nil { continue } + slog.Debug("Found new device", "name", zDev.FriendlyName) zDev.Dump() zDev.setupXAALDevices(gw) gw.AddZDevice(&zDev) zDev.Sync() // zDev.Available() } + // search for deleted devices + for _, zDev := range gw.GetZDevices() { + found := false + for _, dev := range devices { + if dev.FriendlyName == zDev.FriendlyName { + found = true + break + } + } + if !found { + slog.Debug("Device removed", "name", zDev.FriendlyName) + gw.RemoveZDevice(zDev) + } + } } diff --git a/z2m.go b/z2m.go index a9667f0a635a7e969baee0ea160b97b2cd5c3727..ce60d87084e66afd5d1d9b91ff3dac3090ec0a60 100644 --- a/z2m.go +++ b/z2m.go @@ -125,7 +125,6 @@ func (zDev *Z2MDevice) setupXAALDevices(gw *Gateway) { zDev.XAALDevices = append(zDev.XAALDevices, dev) xaalDev := dev.getXAALDevice() xaalDev.GroupID = grpAdd - gw.Engine.AddDevice(xaalDev) } } }