You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hue V2 API场景召回及指定区域激活场景技术咨询

Philips Hue V2 API 场景定向激活方案

问题背景

已获取Philips Hue V2 API的场景ID,但需实现仅在指定群组(group)或区域(zone)激活同名称场景的操作,目前不清楚对应的API调用机制。

核心实现逻辑

Hue V2 API中,激活场景需通过POST请求到clip/v2/resource/scene端点,在请求Payload中同时指定:

  • 目标场景的ID
  • 要激活场景的目标区域/群组的ID(rid)和类型(rtype,如zone或room)

通过这种方式,即可精准控制场景在指定区域生效,避免同名称场景在多个区域被触发。

完整代码实现

import requests
import json
import urllib3

# 禁用自签名证书的SSL警告
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

class HueAPI:
    def __init__(self):
        self.base_url = "https://你的Hue桥接器IP"
        self.headers = {
            "User-Agent": "HTTPBot/2024.1.3",
            "hue-application-key": "你的Hue应用密钥"
        }

    def resource_route(self, endpoint):
        """构建并返回指定端点的完整URL"""
        return f"{self.base_url}/{endpoint}"

    def get_data(self, url):
        """从指定URL获取数据"""
        try:
            response = requests.get(url, headers=self.headers, verify=False)
            response.raise_for_status()
            return response.json()
        except requests.exceptions.RequestException as e:
            print(f"数据获取失败: {e}")
            return None

    def get_zone_id(self, zone_name):
        """根据区域名称获取对应的区域ID和类型"""
        url = self.resource_route("clip/v2/resource/zone")
        json_data = self.get_data(url)
        if json_data:
            for item in json_data.get('data', []):
                if item['metadata']['name'] == zone_name:
                    return item['id'], item['type']
        return None, None

    def get_scene_id(self, scene_name):
        """根据场景名称获取对应的场景ID"""
        url = self.resource_route("clip/v2/resource/scene")
        json_data = self.get_data(url)
        if json_data:
            for item in json_data.get('data', []):
                if item['metadata']['name'] == scene_name:
                    print(json.dumps(item, indent=4))
                    return item['id']
        return None

    def post_scene_data(self, resource_name, scene_name, action):
        """发送场景激活请求"""
        action_bool = action.lower() == "on"
        resource_id, resource_type = self.get_zone_id(resource_name)
        scene_id = self.get_scene_id(scene_name)

        if resource_id and scene_id:
            scene_payload = {
                "data": [{
                    "type": "scene",
                    "id": scene_id,
                    "actions": [
                        {
                            "target": {
                                "rid": resource_id,
                                "rtype": resource_type
                            },
                            "action": {
                                "on": {
                                    "on": action_bool
                                }
                            }
                        }
                    ]
                }]
            }

            url = self.resource_route("clip/v2/resource/scene")
            print(self.headers)
            print(url)
            try:
                response = requests.post(url, headers=self.headers, verify=False, json=scene_payload)
                response.raise_for_status()
                return response.json()
            except requests.exceptions.RequestException as e:
                print(f"请求发送失败: {e}")
                return None
        else:
            print("未找到指定的资源或场景ID")
            return None

关键说明

  1. 参数替换:使用前需将self.base_url替换为你的Hue桥接器IP,hue-application-key替换为已授权的应用密钥
  2. 场景筛选优化:若同名称场景存在于多个区域,当前get_scene_id方法仅返回第一个匹配项,可根据场景数据中关联的group字段进一步筛选,确保获取对应区域的场景ID
  3. SSL验证:代码中关闭了SSL警告,生产环境建议使用合法证书并开启验证

内容的提问来源于stack exchange,提问作者Keo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:45:17