]> git.giacomolli.uk - onehouse/blobdiff - driver/alamo/gateway.go
Poll and command shared Alamo thermostats
[onehouse] / driver / alamo / gateway.go
index 1bf0074beb154fee54a1d51927f54c18ae33deed..2f3da3bcf96daa76ca8baa83437844c84f232f62 100644 (file)
@@ -33,23 +33,6 @@ func (g *gateway) status(ctx context.Context) ([]State, error) {
        return states, nil
 }
 
        return states, nil
 }
 
-func (g *gateway) action(ctx context.Context, mac string, action Action) (State, error) {
-       err := g.wait(ctx)
-       if err != nil {
-               return State{}, fmt.Errorf("wait for action slot: %w", err)
-       }
-
-       ctx, cancel := context.WithTimeout(ctx, gatewayExchangeTimeout)
-       defer cancel()
-
-       state, err := g.client.Action(ctx, mac, action)
-       if err != nil {
-               return State{}, fmt.Errorf("exchange gateway action: %w", err)
-       }
-
-       return state, nil
-}
-
 func (g *gateway) wait(ctx context.Context) error {
        err := ctx.Err()
        if err != nil {
 func (g *gateway) wait(ctx context.Context) error {
        err := ctx.Err()
        if err != nil {
@@ -73,7 +56,29 @@ func (g *gateway) wait(ctx context.Context) error {
                return err
        }
 
                return err
        }
 
+       deadline, exists := ctx.Deadline()
+       if exists && !time.Now().Before(deadline) {
+               return context.DeadlineExceeded
+       }
+
        g.nextStart = time.Now().Add(gatewayRequestInterval)
 
        return nil
 }
        g.nextStart = time.Now().Add(gatewayRequestInterval)
 
        return nil
 }
+
+func (g *gateway) action(ctx context.Context, mac string, action Action) (State, error) {
+       err := g.wait(ctx)
+       if err != nil {
+               return State{}, fmt.Errorf("wait for action slot: %w", err)
+       }
+
+       ctx, cancel := context.WithTimeout(ctx, gatewayExchangeTimeout)
+       defer cancel()
+
+       state, err := g.client.Action(ctx, mac, action)
+       if err != nil {
+               return State{}, fmt.Errorf("exchange gateway action: %w", err)
+       }
+
+       return state, nil
+}