#要说的话#
因为自己其他事情,小半年没有更新HomeAssistant自定义组件内容了,这次把一个7合一的空气质量传感器实现了,硬件搭建还是使用的亿佰特的RS485模块+M702(RS485版)传感器,这次有几点更新:
- 把亿佰特模块独立出来了;
- 把实体数据放到设备里;
- 亿佰特模块和传感器代码传到优快云,大家可以下载;
硬件的淘宝链接:
亿佰特模块(NA111):商品详情
传感器模块(M702):商品详情
亿佰特模块有个遗憾的地方,就是没有5V的电源输出,我另外配了一个电源模块给M702供电。
#组件思路#
在亿佰特模块中进行设备的发现,模块的IP、端口配置,并使用json文件把信息保存在系统中;
在传感器模块中选择亿佰特模块中配置的设备,然后两者关联起来,
#具体实现#
亿佰特模块的发现功能在上一篇文章《HomeAssistant自定义组件学习-二》中有说明。本次只是需要把发现的设备模块给其他模块进行调用,这里我采用的是通过json配置文件进行数据配置的传递。json文件的操作方法同样在前几章中有实现,感兴趣的可以翻一下我之前的文章,或者直接下载我上传的资源,下载地址附后面。
设备模块的占用冲突,在json文件里增加used信息,其他模块选择设备时检查used字段,防止占用冲突,实现代码在传感器模块的config_flow.py中。
async def async_step_user(
self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult:
"""Handle the initial step."""
errors: dict[str, str] = {}
ent_data: dict[str, Any] = {}
if self._device_manager is None:
self._device_manager = EbyteDeviceManager(self.hass)
if user_input is not None:
# 如果有用户输入,则处理输入的信息
if CONFIG_USER_INPUT_EBYTE_DEVICE in user_input:
# 保存选择通讯设备,
mac: str = user_input[CONFIG_USER_INPUT_EBYTE_DEVICE]
name: str = user_input[CONF_NAME]
sd: EbyteDeviceInfo = self._device_manager.get_device_by_mac(mac)
if sd is not None:
ent_data[CONF_NAME] = name
ent_data[CONF_HOST] = sd.Ip
ent_data[CONF_PORT] = sd.Port
ent_data[CONF_MAC] = sd.MAC
dp: map[str, Any] = {}
dp[CONF_HOST] = sd.Ip
dp[CONF_MAC] = sd.MAC
dp[CONF_NAME] = name
dp[CONF_HOST] = sd.Ip
ret: ConfigFlowResult = self.async_create_entry(
title=f"AirQuality[{sd.Ip}]",
description="This is a air quality device!",
description_placeholders=dp,
options=dp,
data=ent_data,
)
# 标识选择的设备已经使用
sd.set_used(True)
sd.set_device_name(name)
sd.save_config()
return ret
_LOGGER.error(f"EbyteDeviceIn

最低0.47元/天 解锁文章
2408

被折叠的 条评论
为什么被折叠?



