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

 找回密码
 立即注册
查看: 6450|回复: 9

[基础教程] 【问】MQTT discovery自动发现已经调通,但存在的问题求问大佬

[复制链接]

2

主题

19

帖子

68

积分

注册会员

Rank: 2

积分
68
金钱
49
HASS币
0
发表于 2019-8-5 15:30:34 | 显示全部楼层 |阅读模式
本帖最后由 fuwen0202 于 2019-8-5 16:28 编辑

使用ESP8266让homeassistant已经功能上实现的,但还是发现有着一些奇怪的问题。

MQTT discovery自动发现的configuration存在哪了?可以修改么?在/homeassistant/configuration.yaml中并不会有这些设备。
此外,discovery在关闭hass后再次启动hass --open-ui的时候,在概览中就会消失,但在History中依旧存有这些数据,这些数据会随着ESP的数据包statue的增加,而重复增加homeassistant重启前的最后一组收到的数据。

我的测试方法与结果如下:
ESP设备-ESP-12E:上电后发送一次config包,使得Homeassistant自动发现该设备。之后一直发送state包,来刷新数据
Hassistant服务器:x64的amd服务器,Ubuntu18.04.2_server的系统。python3.6。pip3_9.0.1,mosquitto的broker,sudo pip3 install homeassistant安装。sudo hass --open-ui启动

所以,正常的运行顺序就一定得为先hass --open-ui再让ESP上电。但是我试验了下意外情况。
首先先sudo hass --open-ui运行homeassistant。然后让ESP上电。在homeassistant页面中,数据正常。
当我保持ESP上电一段时候后,关闭homeassistant后重新启动homeassistant,
这个时候因为homeassistant没有收到ESP设备发出的config包(ESP设备只有在上电后发送一次config,没有发送config只发state),
在Homeassistant的概览页面中会找不到这个ESP发送的参数(图标数据都没有)。但是,在history中,会依旧存在Homeassistant在重启之前记录的数据。这些数据被记录在/homeassistant/home-assistant_v2.db中。
最最最有趣的事情发生了。这个时候开始。history中的数据依旧随着我的state包在增加,但增加的数据并不是我state包中的数据,而是在homeassistant重启前收到的最后一个state包中的数据。
简直丧心病狂!
然后,我让ESP设备重启,这时候他会发送congfig包,来让homeassistant识别。这时候history中的数据记录又恢复正常了!又能收到我的state包中的新数据了!在概览页面也能看到图标和数据了。只是在history中,中间多了一大段重复的无效数据。


微信截图_20190805160117.png


你说是数据库的标签,这段时间没收到数据所以自动填充了掉线前的数据,这个我能理解,但为啥概况 里面没有图标?相当于homeassistant在每次启动后收到config都认为是新的设备,但又为啥history又记录在一起了?

所以,自动发现的设备的configuration的yalm文件在哪?所以还是要修改homeassistant的configuration的话,这个自动发现又有何意义?


//---------------------------------------------------------------
此外,在研究Lovelace中,这个homeassistant的文档写的那真是一个屎样

在lovelace中,有一个叫entities的参数是什么意思,里面还有个叫 entity ID的变量,作为MQTT自动发现的设备,这个值是在哪儿找的?,对应的是[size=13.005px]<component>么?





回复

使用道具 举报

2

主题

19

帖子

68

积分

注册会员

Rank: 2

积分
68
金钱
49
HASS币
0
 楼主| 发表于 2019-8-5 16:11:44 | 显示全部楼层
此外,如何在history中把mqtt的多个数据显示在同一个图标中么,这个和mqtt中的参数meansurement有关系么
回复

使用道具 举报

8

主题

2073

帖子

6053

积分

论坛元老

流水无味

Rank: 8Rank: 8

积分
6053
金钱
3980
HASS币
145

灌水之王

发表于 2019-8-5 16:41:45 | 显示全部楼层
调试好了 直接把历史整个数据库干掉  做下白名单或黑名单吧
温湿度等数据单位一样的话就显示在同一个框里了
回复

使用道具 举报

4

主题

159

帖子

1082

积分

论坛技术达人

积分
1082
金钱
908
HASS币
60
发表于 2019-8-5 17:04:19 | 显示全部楼层
关于存在哪里的问题,已注册的实体,含曾经注册过的,都存在 <config dir>/.storage/core.device_registry 以及 core.entity_registry 里面,但这俩文件理论上是不应该手动修改的。MQTT Discovery 硬件删除的方法是向原来的 config topic 里面发送一个空数据,HA 收到后就把它移除了。
关于你说的顺序问题,你可以让 ESP 发一个 retain 的 MQTT Discovery config,这样HA启动好后直接就发现了。或者不想 retain 的话,ESP 定时来发送 config 也不是问题。
这里避免重复注册出多个entity 的关键在于,要在 config 里面设置 unique_id
回复

使用道具 举报

22

主题

656

帖子

4576

积分

版主

Rank: 7Rank: 7Rank: 7

积分
4576
金钱
3905
HASS币
40
发表于 2019-8-5 17:27:25 | 显示全部楼层
RobinVP 发表于 2019-8-5 17:04
关于存在哪里的问题,已注册的实体,含曾经注册过的,都存在 /.storage/core.device_registry 以及 core.en ...

大神解释的很清晰!受教
回复

使用道具 举报

2

主题

19

帖子

68

积分

注册会员

Rank: 2

积分
68
金钱
49
HASS币
0
 楼主| 发表于 2019-8-5 20:22:42 | 显示全部楼层
本帖最后由 fuwen0202 于 2019-8-5 20:40 编辑
RobinVP 发表于 2019-8-5 17:04
关于存在哪里的问题,已注册的实体,含曾经注册过的,都存在 /.storage/core.device_registry 以及 core.en ...

首先是发送config的空的数据确实可以在概况里面删除图标,但数据库里的数据依旧存在。
关于启动顺序,我现在就是次发送state之前再发送一遍config,并不会影响之前已经存在的数据

我看了~/.storage/目录中的core.device_registry 和 core.entity_registry ,但依旧不是很明白
比如我现在是mqtt一个ESP发送4个数据到broker
以下是config包

在 core.entity_registry 与core.config_entries 中
{
    "data": {
        "entities": [
            {
                "config_entry_id": null,
                "device_id": null,
                "disabled_by": null,
                "entity_id": "person.mr_x",
                "name": null,
                "platform": "person",
                "unique_id": "d6f499266f2645239f3c9bc18a231c4a"
            }
        ]
    },
    "key": "core.entity_registry",
    "version": 1
}

{
    "data": {
        "entries": [
            {
                "connection_class": "local_push",
                "data": {
                    "broker": "10.10.2.7",
                    "discovery": true,
                    "port": 1883
                },
                "domain": "mqtt",
                "entry_id": "33af0181c6804a448811269b512232b4",
                "options": {},
                "source": "user",
                "title": "10.10.2.7",
                "version": 1
            }
        ]
    },
    "key": "core.config_entries",
    "version": 1
}

并没有像configuration.yaml中那样的格式来说明mqtt的json组件的含义,里面的entry_id我找到啦。
那么如何根据这个来填写lovelace中的参数呢?
title: My Awesome Home
views:
  - title: 
    cards:
      - type: history-graph
        entities:
          

然后entity的概念我不是很明白,这个文档里讲的也不知所云,。在config里面增加“unique_id”= String(a),a为在lovelace的entities中的entity ID,是这个意思么。
请问有没有例子呀
config数据包的,以及lovelace的指令。


回复

使用道具 举报

2

主题

19

帖子

68

积分

注册会员

Rank: 2

积分
68
金钱
49
HASS币
0
 楼主| 发表于 2019-8-5 20:42:39 | 显示全部楼层
"homeassistant/sensor/T0001_Topic01/config";
'{"name":"T0001_Topic01","unit_of_measurement": "dBm","device_class":"signal_strength","state_topic":"homeassistant/sensor/T0001/state","value_template": "{{ value_json.Topic01}}"}'
"homeassistant/sensor/T0001_Topic02/config"
'{"name":"T0001_Topic02","unit_of_measurement": "°C","device_class":"temperature","state_topic":"homeassistant/sensor/T0001/state","value_template": "{{ value_json.Topic02}}"}'

"homeassistant/sensor/T0001/state"
'{"ID":"T0001","Status":"true","Topic01":"-60","Topic02":"25","Topic03":"40","Topic04":"1200"}'
回复

使用道具 举报

4

主题

159

帖子

1082

积分

论坛技术达人

积分
1082
金钱
908
HASS币
60
发表于 2019-8-5 21:23:58 | 显示全部楼层
fuwen0202 发表于 2019-8-5 20:22
首先是发送config的空的数据确实可以在概况里面删除图标,但数据库里的数据依旧存在。
关于启动顺序,我现 ...

其实HA的官方怎么理解我也不知道,但只说我个人理解和实现
unique_id 这个很好理解,对应一个MQTT Discovery 发现设备的唯一标示。比如 A 设备 unique_id 是 abc,即便后续发过去的 config 中有变化,只要 unique_id 不变还是 abc,HA 会认为它是同一个设备,然后更新它在的config。
.storage/ 下面的两个 registry 文件,顾名思义,里面存放的是实体注册信息。HA中将每个具有 state 的unit 定义为一个 entity。对应于mqtt discovery,设备送过来一次信息后,就在这里注册一下,即便设备消失了,HA也不会立刻移除它,当设备再出现时会依然读取这里面的配置。另外一些integrations 中注册的设备,用户所作出的 customizations 也是存在这里的,而不是 customize.yaml 或其它什么地方。

关于entities 送来的数据,HA 是存在数据库里的。初始设置下是 sqlite 一个文件,在配置目录里可以找到,用sqlite 读取软件可以查看,关于你说的历史数据也在这里面。当然也可以通过更改配置让他存到 mysql/pgsql 等数据库里面。同时根据设置 HA 也会选择性存储/步存储,以及定期清理(或者根本不清理)这里面的数据。详细设置看文档吧 (搜 homeassistant recorder)

最后说 lovelace 里怎么配置。在mqtt discovery 推过来的设备,设置好 name 这个属性,HA 会利用它转换成 entity_id, 比如我传一个二元感应器的name {"name": "my very cool sensor"}, 那么 HA 中这个感应器的 entity_id 就是 binary_sensor.my_very_cool_sensor 。这个转换其实我个人觉得有点迷,但是还好可以在“开发者工具”->“状态”中找到每个实体的 entity_id,用来配置 lovelace 也就足够了。

以上希望能帮到你。
回复

使用道具 举报

2

主题

19

帖子

68

积分

注册会员

Rank: 2

积分
68
金钱
49
HASS币
0
 楼主| 发表于 2019-8-6 01:41:05 | 显示全部楼层
RobinVP 发表于 2019-8-5 21:23
其实HA的官方怎么理解我也不知道,但只说我个人理解和实现
unique_id 这个很好理解,对应一个MQTT Discov ...

谢谢大佬耐心指点。我说下自己的理解,大佬帮忙看一下对不对
,就是说设备A其实有很多个传感器1234,
这个设备A在config的paylod中会一同发送自己的参数“unique_id”:“A”,来规定这个设备A在homeassistant中的entityID(A),
而这个设备A的参数1的entityID,则会根据这个设备A的entityID与config的paylod中的此参数的“name”:“参数1”来定义这个设备A的参数1的entityID(<component>.参数1)
是这样的么?

然后,HomeAssistant会根据设设备A的config来查找.storage/ 下面的两个 registry 文件中是否存在这个设备A的entityID,如果不存在,则添加,并将这个设备A的entityID作为映射设备A的标签。如果文件中存在这个设备A的entityID,则将这个设备A的参数12234继承到这个entityID标签下,将其视作同一个设备。

然后,这个设备A的参数1234的entityID 可以在homeassistant页面中的开发者工具-状态-Current entities中查看.

这个我还有一个问题,比如我的设备A有参数1234,那么在配置的时候就有4条对应的config,在每一条config的payload中,都得加上“unique_id”:“A”,来明确这个参数所属于的设备么?

还有关于config的payload,homeassistant的文档中找不到所有的列表。。。只有在https://www.home-assistant.io/docs/mqtt/discovery/ 中的“支持的缩写::列表中有所提及。这个在其他地方能找到相关的说明么?

之后得到了设备的entityID与参数的entityID后,就可以来配置lovelace了
在ui-lovelace.yaml文件中添加代码 使用 参数的entityID 来表示数据即可咯

回复

使用道具 举报

4

主题

159

帖子

1082

积分

论坛技术达人

积分
1082
金钱
908
HASS币
60
发表于 2019-8-6 09:52:08 | 显示全部楼层
fuwen0202 发表于 2019-8-6 01:41
谢谢大佬耐心指点。我说下自己的理解,大佬帮忙看一下对不对
,就是说设备A其实有很多个传感器1234,
这 ...

怪我没说清楚,unique_id 和 entity_id 没有必然联系。这个只是HA内部试用用来判断是否为同一个设备的。因为同一个设备可能会因为控制软件的升级添加或调整功能之类的,如果没有unique_id,调整前后发送的config 不一样,HA没有可靠的办法判断它是否为同一个设备。对于一个设备有多个传感器,如果每个传感器都希望成为HA里的一个entity,那么每一个都要有 unique_id 而且不要重复。

关于 entity_id,最靠谱的方法就是从 HA 的开发者工具里面去找。我觉得也不用试图去探索 .storage 下面文件的结构,一来我们基本不会直接用这里面的内容,也没有API可以调用,另外一方面HA这种升级频繁的东西保不齐下个版本他就改了。

对于你的问题,其实上面讲 unique_id 时也说了,这里举个例子。比如ESP8266+DHT11,可以测温度湿度,那么传两个 config 给 HA,unique_id 分别为 my_esp8266_temperature,  my_esp8266_humidiy  HA其实并不在乎你一个设备里有多少个传感器,entity 才是它的基本元素。换句话说,你这个设备在HA里会有两个 entity,那么每个entity 都应该有自己的unique_id

关于MQTT Discover 的config,直接参考 HA 文档中对应的 MQTT sensor就行,比如你想做 climate sensor,就去看 mqtt climate 的参数。
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-25 06:56 , Processed in 0.257686 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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