HomeAssistant自定义组件学习-【二】

#要说的话#

前面把中盛科技的控制器组件写完了。稍稍熟悉了一些HA,现在准备写窗帘控制组件,构想的东西会比较多,估计有些难度,过程会比较长,边写边记录吧!

#设备和场景环境#

使用的是Novo的电机,淘宝链接在【前言】文章中有,轨道应该是佳丽斯的,买电机的时候一起配的。电机提供的是RS485接口,所以需要增加一个RS485的服务器,我选用的是“亿佰特”的网口转RS485的模块,型号是NA111-A(使用220V电源供电,就避免了再加一个模块)统一放置在机柜那里,把原来的网络拿两路出来(蓝色和棕色组)作为485的线路,保留100M的网线功能。远端使用的是多功能的面板,带2+3的电源插口和8+4的网络口,网络口刚好可以分成百兆网和485接口。

#组件思路#

流程:选择Novo组件-->选择485设备类型-->发现485设备-->(可选:配置485设备)

-->通过485连接Novo设备-->配置Novo设备地址(需要按SET按钮)-->设置电机转向

-->设置开合范围-->完成配置

思路:

  1. 1、选择组件后,提供界面选择使用的485设备类型,使用下拉框给用户选择;
  2. 2、依据选择的485设备类型触发对应的自发现流程,并列出发现的485设备;
  3. 3、用户点击选择485设备,组件建立与485设备的链接,并显示通讯正常;
  4. 4、组件通过485设备向Novo电机发送查询命令,有返回则说明链路建立成功;
  5. 5、由于是并联了多个Novo电机,所以会返回多个查询回复,所以只能轮循查询,需要提供界面配置的Novo电机地址和通道;
  6. 6、点击485设备条目进行配置,配置界面自动生成Novo电机地址和通道,点击提交,然后到Novo电机上按下相应配置按钮,完成Novo电机的地址配置(电机正反转两次),该条目移至已经配置好的列表;
  7. 7、在已经配置好地址的列表里点击Novo电机,进入到电机的配置:可以配置电机转向、窗帘开合范围,检查开、合是否正确,都正确无误后完成配置(后续版本再做)。
  8. #代码实现#

  9. 通过命令:
  10. python3 -m script.scaffold integration

    初始化组件代码。添加discover方法:

  11. 
    def ebyte_discover(ip_address: str | None = None) -> dict[str, EbyteConfig]:
        """亿佰特-发现设备方法."""
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
        sock.bind(("", BROADCAST_SRC_PORT))
        sock.settimeout(2)
        found_devices: dict[str, EbyteConfig] = {}
        if ip_address is None:
            addrs = enum_all_broadcast()
        else:
            addrs = [ip_address]
        for addr in addrs:
            try:
                sock.sendto(BROADCAST_MSG, (addr, BROADCAST_PORT))
            except Exception:  # noqa: BLE001
                _LOGGER.warning(f"Can't access network {addr}")  # noqa: G004
        while True:
            try:
                data, addr = sock.recvfrom(512)
                # 返回:fd 06 54 14 a7 dc 74 16 03 01
                # 返回:fd 06 54 14 a7 dc 72 83 03 01
                # 分析:fd 06 为帧头
                #       54 14 a7 dc 74 16 为MAC地址
                #       03 01 为帧尾
                 mac = ebyte_get_mac(data)
                if len(mac[0]) > 6:
                    found_devices[mac[0]] = EbyteConfig(
                        mac[0], "Ebyte_RS485", mac[0], addr[0], 0
                    )
                    found_devices[mac[0]].set_mac_bytes(mac[1])
    
            except TimeoutError:
                break
            except OSError as e:
                _LOGGER.error(f"Socket error: {e!r}")  # noqa: G004
        if len(found_devices) > 0:
            # 查询相关信息
            for conf in found_devices.values():
                bts: bytearray = QUERY_CMD_FORMAT.copy()
                for i in range(len(conf.mac_bytes)):
                    bts[i + QUERY_CMD_FORMAT_MAC_IDX] = conf.mac_bytes[i]
                # 获取名称、版本号和序列号
                bts[QUERY_CMD_FORMAT_CMD_IDX] = 0x05
                sock.sendto(bts, (conf.base_ip, BROADCAST_PORT))
                res = sock.recv(1024)
                mac = ebyte_get_mac(res)[0]
                if mac in found_devices:
                    found_devices[mac].load_data(res)
                # 获取网络配置
                bts[QUERY_CMD_FORMAT_CMD_IDX] = 0x00
                sock.sendto(bts, (conf.base_ip, BROADCAST
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值