『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
楼主: tjsyk

[技术探讨] 小米人在传感器如何接入HA?

[复制链接]

9

主题

242

帖子

1277

积分

金牌会员

Rank: 6Rank: 6

积分
1277
金钱
1035
HASS币
0
发表于 2024-6-9 15:34:29 | 显示全部楼层
gz234748157 发表于 2024-5-24 16:24
昨天我已经提交PR到Xiaomi Gateway 3并合并了,你可以用master的代码

大佬能请教一下替换哪个文件吗?是不是得手动替换文件啊
还是得重新安装gateway3啊。
没看到哪里有选择版本的,只有一个重新安装。
回复

使用道具 举报

1

主题

15

帖子

237

积分

中级会员

Rank: 3Rank: 3

积分
237
金钱
222
HASS币
0
发表于 2024-6-11 11:29:55 | 显示全部楼层
PerryLayne 发表于 2024-6-9 15:34
大佬能请教一下替换哪个文件吗?是不是得手动替换文件啊
还是得重新安装gateway3啊。
没看到哪里有选择版 ...

用master版是说gateway3的github仓库现在只是合并了我的代码,但是还没打包发布新的版本号,所以在作者发布新版之前就想用上,就要在gateway3的仓库里clone master分支的最新代码下来,替换你custom_components里的xiaomi_gateway3文件夹。

既然问到了这个问题,那我还是推荐你用方式二

方式二:在config文件夹(也就是跟custom_components同一层的文件夹),创建一个xiaomi_gateway3.py,然后保存以下代码:
from custom_components.xiaomi_gateway3.core.devices import *

DEVICES = [{
    18051: ["Xiaomi", "Occupancy Sensor", "XMOSB01XS", "xiaomi.sensor_occupy.03"],
    "spec": [
        # main sensors
        BoolConv("occupancy", "binary_sensor", mi="2.p.1078"),#Tested
        BaseConv("illuminance", "sensor", mi="2.p.1005"),#Tested
        # other sensors
        BaseConv("battery", "sensor", mi="3.p.1003"),

    ],
}] + DEVICES

然后重启HA。
回复

使用道具 举报

9

主题

242

帖子

1277

积分

金牌会员

Rank: 6Rank: 6

积分
1277
金钱
1035
HASS币
0
发表于 2024-6-11 22:34:30 | 显示全部楼层
gz234748157 发表于 2024-6-11 11:29
用master版是说gateway3的github仓库现在只是合并了我的代码,但是还没打包发布新的版本号,所以在作者发 ...

感谢强大而又热心的大佬,可以用了。

请问大佬自己添加这种设备在哪能找到教程之类的吗?

因为我看E20门锁始终没有,我想自己尝试添加一下
回复

使用道具 举报

26

主题

261

帖子

1445

积分

金牌会员

Rank: 6Rank: 6

积分
1445
金钱
1184
HASS币
0
发表于 2024-6-12 13:16:40 | 显示全部楼层
gz234748157 发表于 2024-6-11 11:29
用master版是说gateway3的github仓库现在只是合并了我的代码,但是还没打包发布新的版本号,所以在作者发 ...

原来为了解决墙壁插座的功率上报问题,已经创建了一个 xiaomi_gateway3.py 文件,内容如下:

from custom_components.xiaomi_gateway3.core.devices import *

DEVICES = [{
    3083: ["Xiaomi", "Electrical Outlet", "ZNCZ01ZM"],
    "spec": [
        Converter("outlet", "switch", mi="2.p.1"),
        MathConv("power", "sensor", mi="3.p.1", multiply=0.01),
        Converter("led", "switch", mi="4.p.1", enabled=False),
        BoolConv("enable-upload-power", "switch", mi="6.p.1"),
        Converter("power_protect", "switch", mi="7.p.1", enabled=False),
        MathConv("power_value", "number", mi="7.p.2", multiply=0.01,
                 min=0, max=1638400, enabled=False),
    ],
}] + DEVICES


请教您方式二这段代码,是直接添加在原文件末尾就可以对吗?
回复

使用道具 举报

1

主题

15

帖子

237

积分

中级会员

Rank: 3Rank: 3

积分
237
金钱
222
HASS币
0
发表于 2024-6-12 14:13:13 | 显示全部楼层
zyling 发表于 2024-6-12 13:16
原来为了解决墙壁插座的功率上报问题,已经创建了一个 xiaomi_gateway3.py 文件,内容如下:

from custo ...

方式二的原理是在gateway3项目本身支持的设备基础上,自行添加额外的设备和设备特性识别。

写法一,更好维护,以后只需要在大括号里新增设备支持的条目就好了。
from custom_components.xiaomi_gateway3.core.devices import *

DEVICES = [{
    3083: ["Xiaomi", "Electrical Outlet", "ZNCZ01ZM"],
    "spec": [
        Converter("outlet", "switch", mi="2.p.1"),
        MathConv("power", "sensor", mi="3.p.1", multiply=0.01),
        Converter("led", "switch", mi="4.p.1", enabled=False),
        BoolConv("enable-upload-power", "switch", mi="6.p.1"),
        Converter("power_protect", "switch", mi="7.p.1", enabled=False),
        MathConv("power_value", "number", mi="7.p.2", multiply=0.01,
                 min=0, max=1638400, enabled=False),
    ],
    18051: ["Xiaomi", "Occupancy Sensor", "XMOSB01XS", "xiaomi.sensor_occupy.03"],
    "spec": [
        # main sensors
        BoolConv("occupancy", "binary_sensor", mi="2.p.1078"),#Tested
        BaseConv("illuminance", "sensor", mi="2.p.1005"),#Tested
        # other sensors
        BaseConv("battery", "sensor", mi="3.p.1003"),

    ],
}] + DEVICES


写法二,直接粗暴。
from custom_components.xiaomi_gateway3.core.devices import *

DEVICES = [{
    3083: ["Xiaomi", "Electrical Outlet", "ZNCZ01ZM"],
    "spec": [
        Converter("outlet", "switch", mi="2.p.1"),
        MathConv("power", "sensor", mi="3.p.1", multiply=0.01),
        Converter("led", "switch", mi="4.p.1", enabled=False),
        BoolConv("enable-upload-power", "switch", mi="6.p.1"),
        Converter("power_protect", "switch", mi="7.p.1", enabled=False),
        MathConv("power_value", "number", mi="7.p.2", multiply=0.01,
                 min=0, max=1638400, enabled=False),
    ],
}] + DEVICES

DEVICES = [{
    18051: ["Xiaomi", "Occupancy Sensor", "XMOSB01XS", "xiaomi.sensor_occupy.03"],
    "spec": [
        # main sensors
        BoolConv("occupancy", "binary_sensor", mi="2.p.1078"),#Tested
        BaseConv("illuminance", "sensor", mi="2.p.1005"),#Tested
        # other sensors
        BaseConv("battery", "sensor", mi="3.p.1003"),

    ],
}] + DEVICES


两种写法的意义都是在custom_components/xiaomi_gateway3/core/devices.py里面的DEVICES变量的基础上添加额外的识别支持。当你了解了python语法之后,理解起来就不难了
回复

使用道具 举报

26

主题

261

帖子

1445

积分

金牌会员

Rank: 6Rank: 6

积分
1445
金钱
1184
HASS币
0
发表于 2024-6-12 14:33:05 | 显示全部楼层
gz234748157 发表于 2024-6-12 14:13
方式二的原理是在gateway3项目本身支持的设备基础上,自行添加额外的设备和设备特性识别。

写法一,更好 ...

谢谢解答。按写法一修改了,重启HA后,gateway3集成有错误提示:

此错误来自自定义集成。
日志记录器: custom_components.xiaomi_gateway3.core
来源: custom_components/xiaomi_gateway3/core/device.py:20
集成: Xiaomi Gateway 3 (文档, 问题)
首次出现: 14:30:34 (1 次总计出现)
上次记录: 14:30:34

Can't load external converters
Traceback (most recent call last):
  File "/config/custom_components/xiaomi_gateway3/core/device.py", line 20, in <module>
    from xiaomi_gateway3 import DEVICES  # loading external converters
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/xiaomi_gateway3.py", line 7, in <module>
    Converter("outlet", "switch", mi="2.p.1"),
    ^^^^^^^^^
NameError: name 'Converter' is not defined. Did you mean: 'ZConverter'?



这是出什么问题呢?
回复

使用道具 举报

1

主题

15

帖子

237

积分

中级会员

Rank: 3Rank: 3

积分
237
金钱
222
HASS币
0
发表于 2024-6-12 15:04:37 | 显示全部楼层
zyling 发表于 2024-6-12 14:33
谢谢解答。按写法一修改了,重启HA后,gateway3集成有错误提示:

此错误来自自定义集成。

刚才没留意你原有的代码,Converter这个写法好像是已经废弃了,试试改成BaseConv
这样:
from custom_components.xiaomi_gateway3.core.devices import *

DEVICES = [{
    3083: ["Xiaomi", "Electrical Outlet", "ZNCZ01ZM"],
    "spec": [
        BaseConv("outlet", "switch", mi="2.p.1"),
        MathConv("power", "sensor", mi="3.p.1", multiply=0.01),
        BaseConv("led", "switch", mi="4.p.1", enabled=False),
        BoolConv("enable-upload-power", "switch", mi="6.p.1"),
        BaseConv("power_protect", "switch", mi="7.p.1", enabled=False),
        MathConv("power_value", "number", mi="7.p.2", multiply=0.01,
                 min=0, max=1638400, enabled=False),
    ],
    18051: ["Xiaomi", "Occupancy Sensor", "XMOSB01XS", "xiaomi.sensor_occupy.03"],
    "spec": [
        # main sensors
        BoolConv("occupancy", "binary_sensor", mi="2.p.1078"),#Tested
        BaseConv("illuminance", "sensor", mi="2.p.1005"),#Tested
        # other sensors
        BaseConv("battery", "sensor", mi="3.p.1003"),

    ],
}] + DEVICES
回复

使用道具 举报

26

主题

261

帖子

1445

积分

金牌会员

Rank: 6Rank: 6

积分
1445
金钱
1184
HASS币
0
发表于 2024-6-12 15:41:37 | 显示全部楼层
gz234748157 发表于 2024-6-12 15:04
刚才没留意你原有的代码,Converter这个写法好像是已经废弃了,试试改成BaseConv
这样:
...

谢谢,,改成BaseConv 了,重启还是有错

日志记录器: custom_components.xiaomi_gateway3.core
来源: custom_components/xiaomi_gateway3/core/device.py:20
集成: Xiaomi Gateway 3 (文档, 问题)
首次出现: 15:36:47 (1 次总计出现)
上次记录: 15:36:47

Can't load external converters
Traceback (most recent call last):
  File "/config/custom_components/xiaomi_gateway3/core/device.py", line 20, in <module>
    from xiaomi_gateway3 import DEVICES  # loading external converters
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/xiaomi_gateway3.py", line 9, in <module>
    BaseConv("led", "switch", mi="4.p.1", enabled=False),
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: BaseConv.__init__() got an unexpected keyword argument 'enabled'
回复

使用道具 举报

1

主题

15

帖子

237

积分

中级会员

Rank: 3Rank: 3

积分
237
金钱
222
HASS币
0
发表于 2024-6-12 17:30:12 | 显示全部楼层
zyling 发表于 2024-6-12 15:41
谢谢,,改成BaseConv 了,重启还是有错

日志记录器: custom_components.xiaomi_gateway3.core
from custom_components.xiaomi_gateway3.core.devices import *

DEVICES = [{
    3083: ["Xiaomi", "Electrical Outlet", "ZNCZ01ZM"],
    "spec": [
        BaseConv("outlet", "switch", mi="2.p.1"),
        MathConv("power", "sensor", mi="3.p.1", multiply=0.01),
        BaseConv("led", "switch", mi="4.p.1"), 
        BoolConv("enable-upload-power", "switch", mi="6.p.1"),
        BaseConv("power_protect", "switch", mi="7.p.1", entity=ENTITY_CONFIG),
        MathConv("power_value", "number", mi="7.p.2", multiply=0.01, min=0, max=163840000, entity=ENTITY_CONFIG),
    ],
    18051: ["Xiaomi", "Occupancy Sensor", "XMOSB01XS", "xiaomi.sensor_occupy.03"],
    "spec": [
        # main sensors
        BoolConv("occupancy", "binary_sensor", mi="2.p.1078"),#Tested
        BaseConv("illuminance", "sensor", mi="2.p.1005"),#Tested
        # other sensors
        BaseConv("battery", "sensor", mi="3.p.1003"),

    ],
}] + DEVICES

我再改了一下,这是参考custom_components/xiaomi_gateway3/core/devices.py里面写的,里面其实有支持你这个设备了。可能你原有写法现在已经不支持了所以才会报错。
你也可以进去这个文件里参考一下,在devices.py里搜索ZNCZ01ZM就能找到了。
回复

使用道具 举报

1

主题

15

帖子

237

积分

中级会员

Rank: 3Rank: 3

积分
237
金钱
222
HASS币
0
发表于 2024-6-12 18:29:09 | 显示全部楼层
PerryLayne 发表于 2024-6-11 22:34
感谢强大而又热心的大佬,可以用了。

请问大佬自己添加这种设备在哪能找到教程之类的吗?

有空我开个帖子介绍一下~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-9-8 10:16 , Processed in 0.092922 second(s), 30 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表