:pyShelly事件回调如何驱动Home Assistant实体自动生成)
ShellyForHASS源码深度解析上pyShelly事件回调如何驱动Home Assistant实体自动生成【免费下载链接】ShellyForHASSShelly smart home platform for Home Assistant项目地址: https://gitcode.com/gh_mirrors/sh/ShellyForHASSShellyForHASS 是一款免费开源的 Home Assistant 智能家居插件它能自动发现局域网内的所有 Shelly 设备Gen 1 / Plus / Pro零配置地把它们变成 HA 中的开关、灯光、传感器和窗帘实体。本文是源码解析上篇带你读懂它背后的事件驱动架构pyShelly 的事件回调是如何一步步驱动 Home Assistant 实体自动生成的。一、为什么 ShellyForHASS 不需要轮询打开 custom_components/shelly/manifest.json你会看到一个关键声明iot_class: local_push。这意味着 ShellyForHASS 属于本地推送型集成Shelly 设备通过 CoAP、MQTT、mDNS 主动向 Home Assistant 推送状态变化HA 完全不需要定时轮询polling。这正是它响应快的根本原因而实现这一切的核心就是一个第三方库——pyShelly。整个插件的架构可以概括为三层层次角色所在文件通讯层pyShelly 库设备发现、CoAP/MQTT 收发外部依赖manifest.json 中声明pyShelly1.0.4调度层ShellyInstance注册回调、决定创建哪些实体custom_components/shelly/init.py实体层switch/light/sensor/cover 等 HA 平台文件switch.py、sensor.py 等二、启动时刻pyShelly 回调是如何注册的一切从init.py 中的ShellyInstance.start_up()开始。在 第 305-345 行代码做了两件大事1️⃣ 把自身方法挂到 pyShelly 的回调列表上self.pys pys pyShelly(self.hass.loop) pys.cb_block_added.append(self._block_added) # 新设备上线 pys.cb_device_added.append(self._device_added) # 新设备组件继电器/灯光等 pys.cb_device_removed.append(self._device_removed) # 设备下线2️⃣ 启动发现机制pys.start() pys.discover()从此以后每当 pyShelly 通过 CoAP 组播、mDNS 或 MQTT 发现一台新设备就会主动调用上面注册的回调——这就是事件驱动的起点。三、核心分发逻辑device_type 决定实体类型pyShelly 报告的新设备被抽象为block整台设备和device设备上的功能单元。回调_device_added收到 device 后真正的主角登场_async_device_added。它用一张路由表决定设备类型应该变成 HA 里的什么实体pyShelly device_type生成的 HA 实体附加条件RELAYswitch 或 light配置了light_switch或设备本身是灯泡时作为 lightLIGHT/DIMMER/RGBLIGHTlight—ROLLERcover窗帘—POWERMETERsensor功率需在 sensors 配置中启用current_consumptionSWITCHbinary_sensor按键状态需启用switch传感器SENSOR/BINARY_SENSORsensor / binary_sensor—TRVclimate温控器—每一分支最终都调用同一个方法self.add_device(平台名, dev)。四、add_device一个方法打通平台懒加载 信号广播add_device 与 _asyncadd_device 的设计非常巧妙平台懒加载首次向某平台如 switch添加设备时才通过async_forward_entry_setup加载对应的平台文件没用到就不加载信号广播通过async_dispatcher_send(self.hass, shelly_new_ platform, dev, self)发出信号。比如 switch 平台在 switch.py 的 async_setup_entry 中订阅了shelly_new_switch信号收到信号就调用async_add_entities([ShellySwitch(dev, instance)])创建实体。sensor.py 同理订阅shelly_new_sensor。 这种信号 回调的解耦设计让每个平台文件都非常薄只管收到请求 → 实例化实体设备发现逻辑全部集中在__init__.py。五、状态如何实时刷新cb_updated 回调实体创建后状态更新同样靠事件而非轮询。每个实体的基类ShellyDevice在初始化时执行self._dev.cb_updated.append(self._updated)把自己挂到设备回调上当 Shelly 的继电器状态变化无论是手机 App 点击还是物理按键_updated被触发调用schedule_update_ha_state(True)立即刷新 HA 状态所有实体都实现了should_poll返回False彻底告别轮询。更妙的是_updated中还藏着一个动态传感器发现机制当新属性如rssi、uptime首次出现在info_values中且符合你的 sensors 配置时会即时调用add_device(sensor, ...)自动补建传感器——所以 HA 里看到的运行时间、WiFi 信号等传感器是长出来的无需任何配置。六、一图流完整事件链路Shelly设备CoAP/mDNS/MQTT 推送 │ ▼ pyShelly 库解析报文 │ ├─ 新设备 → cb_block_added / cb_device_added │ → ShellyInstance 按 device_type 路由 │ → add_device() → dispatcher 信号 │ → 对应平台创建 switch/light/sensor 实体 ✅ │ └─ 状态变化 → cb_updated 回调 → schedule_update_ha_state() → HA 界面实时更新 ✅七、本篇涉及的关键文件调度核心回调注册、实体路由custom_components/shelly/init.py设备/区块实体基类状态刷新入口custom_components/shelly/device.py、custom_components/shelly/block.py各平台实体实现switch.py、light.py、sensor.py、cover.py、climate.py传感器/属性常量与默认值定义const.py跨网段部署用的 CoAP 代理脚本util/proxy.py小结ShellyForHASS 的精髓在于把设备发现 → 实体创建 → 状态刷新整条链路都建立在 pyShelly 的事件回调之上配合 HA 的 dispatcher 信号实现平台的懒加载与解耦从而做到零配置、实时响应。下篇我们将深入实体基类ShellyDevice的 unique_id 生成、设备注册表device_info与状态属性扩展机制欢迎持续关注。【免费下载链接】ShellyForHASSShelly smart home platform for Home Assistant项目地址: https://gitcode.com/gh_mirrors/sh/ShellyForHASS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考