From c4b391db66599a4b0e0821a7a406acede8603d0c Mon Sep 17 00:00:00 2001 From: Gisle Aune Date: Thu, 31 Aug 2023 20:25:26 +0200 Subject: [PATCH] add forgetting devices to hue2 (untested yolo-deploy). --- internal/drivers/hue2/bridge.go | 11 +++++++++++ internal/drivers/hue2/client.go | 32 ++++++++++++++++++++++++++++++++ internal/drivers/hue2/driver.go | 4 ++++ 3 files changed, 47 insertions(+) diff --git a/internal/drivers/hue2/bridge.go b/internal/drivers/hue2/bridge.go index e14edef..16e5dad 100644 --- a/internal/drivers/hue2/bridge.go +++ b/internal/drivers/hue2/bridge.go @@ -619,3 +619,14 @@ func (b *Bridge) SearchDevices(ctx context.Context, timeout time.Duration) ([]mo // Return said devices. return newDevices, nil } + +func (b *Bridge) Forget(ctx context.Context, device models.Device) error { + b.mu.Lock() + resource := b.resources[device.InternalID] + b.mu.Unlock() + if resource == nil || resource.LegacyID == "" { + return errors.New("resource not found") + } + + return b.client.legacyDelete(ctx, resource.LegacyID, nil) +} diff --git a/internal/drivers/hue2/client.go b/internal/drivers/hue2/client.go index e666d41..48a55b9 100644 --- a/internal/drivers/hue2/client.go +++ b/internal/drivers/hue2/client.go @@ -305,6 +305,38 @@ func (c *Client) legacyPost(ctx context.Context, resource string, body interface return json.NewDecoder(res.Body).Decode(target) } +func (c *Client) legacyDelete(ctx context.Context, resource string, target interface{}) error { + select { + case <-ctx.Done(): + return ctx.Err() + case <-c.ch: + defer func() { + c.ch <- struct{}{} + }() + } + + if c.token != "" { + resource = c.token + "/" + resource + } + + req, err := http.NewRequest("DELETE", fmt.Sprintf("http://%s/api/%s", c.host, resource), nil) + if err != nil { + return err + } + + res, err := httpClient.Do(req.WithContext(ctx)) + if err != nil { + return err + } + defer res.Body.Close() + + if target == nil { + return nil + } + + return json.NewDecoder(res.Body).Decode(target) +} + func reqBody(body interface{}) (io.Reader, error) { if body == nil { return nil, nil diff --git a/internal/drivers/hue2/driver.go b/internal/drivers/hue2/driver.go index e509967..2bcb3f2 100644 --- a/internal/drivers/hue2/driver.go +++ b/internal/drivers/hue2/driver.go @@ -100,6 +100,10 @@ func (d *Driver) Run(ctx context.Context, bridge models.Bridge, ch chan<- models return d.ensureBridge(bridge).Run(ctx, ch) } +func (d *Driver) ForgetDevice(ctx context.Context, bridge models.Bridge, device models.Device) error { + return d.ensureBridge(bridge).Forget(ctx, device) +} + func (d *Driver) ensureBridge(info models.Bridge) *Bridge { d.mu.Lock() for _, bridge := range d.bridges {