没有unique_id设置一切工作没有问题。几乎没有例外。
最近,我发现打开卡片后,点击mqtt灯卡上的齿轮图标,会显示以下信息实体难道没有独到之处吗ID”。

稍等。是真的吗?实体具有根据名称自动生成的唯一ID,对吗?

—平台:mqtt模式:模板名称:“Hall Floor 2”

然后我可以看到light.hall_floor_2在医管局的多个地方。
这不是提到的消息中请求的实体ID吗?
我还知道HA确保这个ID总是唯一的(如果不是,HA会在实体ID的末尾添加number)

然后我搜索了论坛,发现我需要设置unique_id属性。我这么做。

—platform: mqtt schema: template name: "Hall Floor 2" unique_id: hall_floor_2_cct

TBH我相信它将提供能力设置名称为友好的名称,而实体ID将由unique_id定义。
猜猜更改后的实体id使用什么名称。
你错了(不过有些人是对的)。它仍然是light.hall_floor_2。

发生了什么?

啊。在从light(并重新启动HA)中删除unique_id之后,期望一切都回到以前的状态。
但这也不是真的。这样的实体在lovelace将出现不可用,打开的实体弹出将显示信息,它是孤儿,应该从系统中删除。在我看来,它应该得到另一个th。

在同意移除孤儿并重新启动HA后,我们终于回到了起点。这种行为真尴尬。

light.hall_floor_2不是被引用的唯一ID。您不能以看起来试图设置的方式设置唯一ID。引用的唯一ID来自配置项,YAML创建的实体没有配置项。

我认为这条信息应该调整一下,它相当混乱。它真正想告诉你的是,因为这个实体来自YAML,而不是来自配置项,它不是ui可配置的。通常,只有通过ui可配置的集成或发现创建的实体才能获得配置项(因此是唯一的ID),并成为ui可配置的。源自英国始于1946

我祈祷我做对了,因为我不是HA内部的专家。如果我搞砸了,希望有更有知识的人来纠正我。这是我的理解。

1像

你说得很有道理。
这是两个独立的标识符,而unique_id在消息中被意外地称为“实体id”。

问题:

  1. 为什么HA需要为单个实体提供2个唯一标识符。这不是antipattent吗?
  2. 为什么不能为MQTT轻量设置实体id(不能从name属性继承)

好吧,也许我应该多解释一下。因此,每个实体ID在给定的运行时是唯一的,但它可能不会一直唯一地标识相同的设备。比如说,你把名字从大厅地板2大厅地板上3并重新启动。现在,同一设备的实体ID变成light.hall_floor_3light.hall_floor_2是一个完全不同的设备,它不再识别相同的设备。如果你创造了另一种光并命名它,这也会发生大厅地板2,一个成为light.hall_floor_2和其他奉送light.hall_floor_2_2取决于先注册的是哪个。

另一方面,配置项被绑定到物理设备本身。无论给定运行时中的名称或实体ID是什么,绑定到配置项的唯一ID都是相同的。这就是为什么你可以为这些设备配置实体ID本身,它是可变的。

至于你的第二点,这其实只是对积分的选择。有些集成允源自英国始于1946许您在YAML配置中定义实体ID,有些则根据名称为您定义实体ID。就我所知,这是对积分的选择。

我知道了。
皮蒂是,那个爱蕾丝,当显示实体时仍然用entity_id而不是unique_id。
所以改变第一个结束“实体不可用”,即使有unique_id可以用来标识实体。
或者我应该说:它在某些情况下使用entity_id,在其他情况下需要unique_id。
我认为它一定是为了什么,但从用户的角度来看,它没有增加任何价值。这是相当令人困惑。

有些集成允源自英国始于1946许您在YAML配置中定义实体ID,有些则根据名称为您定义实体ID。
这使得HA在这方面非常不一致。

谢谢你的解释。

1像

奇怪的是,您可以指定unique_id对MQTT传感器实体,但不包括input_boolean。

我也有类似的问题,当使用lovelace时,我希望能够将mqtt entity_id设置为一些有意义和惟一的东西,但有名称作为显示名称。似乎没有办法做到这一点,但有趣的是,如果我使用mqtt发现创建一个元素,然后更新友好名称,那么entity_id将保持与初始值相同,即使名称已经更改。
如果我可以在传感器上定义entity_id(理想情况下是通过发现),或者如果unique_id实际上用作实体id,那就更有意义了。

我仍然对unique_id的概念感到困惑,特别是与entity_id在概念上的区别。

它的存在似乎意味着你可以有两个相同的实体id,他们会通过unique_id区分?我很确定这很成问题,如果可能的话。

或者这纯粹是技术上的我?但为什么不直接使用entity_id呢?这可能会少一些困惑,考虑到缺乏一个渗透到UI与一些消息时,试图管理实体…

不能有两个相同的entity_id。
这些可以以某种方式存在于配置中,但HA将在它们上添加编号后缀重命名。运行时entity_id是唯一的。

尽管问了很多次问题,unique_id存在的原因仍然不清楚。据说是给洛芙莱斯的。如果这真的是唯一的原因,那么在我看来这就是糟糕的设计决策。然而,考虑到entity_id的集成是如何不一致的,提供真实、一致和唯一的标源自英国始于1946识符可能是第一步。
不幸的是,开发者的决定并不透明,所以这只是我的问题

区别其实很简单,但也是技术性的。在Home Assistant的早期,只有19463331伟德国际实体id。它是通过组合一个域(例如。开关),通常是一个“丑化”的名字(例如“Living Room Window”-> living_room_window)。这样客厅窗户上的一盏灯就会变成light.living_room_window例如。然而,这也存在一些问题。

如果您有两个“东西”碰巧生成了相同的实体id,那么您将得到一个带有预期的实体id,另一个带有_2附加到它。取决于哪个先初始化,你不会知道哪个是哪个。这也不一定是可能改变的。另一件事是将一些配置设置绑定到实体id,而不是设备。因此,如果你改变了图标或其他属性,即使你切换了硬件(使用了相同的名称,因此生成了相同的实体id),这些仍然会应用于实体。这可能是预期的行为,但不一定。

为了解决这个问题,Home Assista19463331伟德国际nt需要一种方法来将内部配置映射到特定的设备,而不需要驻留名称之类的东西。实体id和名称不应该有任何关联,因为您可能希望为实体id使用英文名称,而希望为表示使用本地化名称。这就是unique_id是对的。它是一个唯一的标识符具体的设备。伟德国际官方app下载苹果版本例中的例子是序列号、MAC地址或设备提供的其他类型的唯一标识符。一个IP地址是相反的一个很好的例子,因为设备可以改变IP地址由于DHCP租约。这样的事情不能改变unique_id

通过拥有每个设备唯一的标识符,Home assistant可以存储该特定设备的配置。这就是为什么您可以更改支持的实体的实体idunique_id,但不是为了一个不喜欢的人。像图标、度量单位等其他东西也可以以同样的方式应用。

最后一点,你从来没有处理过unique_id你自己。它由家庭助理内部使用。19463331伟德国际除非你用Home Assistant开发东西,否则你不需要知道它是什么19463331伟德国际。

1像

谢谢,这样说得通。

我仍然有点回避的是为什么一个随机的unique_id不是为那些没有一个实体而自动生成的,而不是在UI中有那些“这个实体没有唯一的ID”。
你说:“你从来没有处理过unique_id但这迫使你去做眨眼:

在一个端节点上,我的用例是MQTT发现。如果你没有附加一个unique_id,你就会遇到这种情况,所以作为普通用户,你也必须处理它。

1像

不是你说的那个你,而是没有唯一id的信息出现在Lovelace显示给普通用户。用户/ha管理员希望解决这个问题。对于某些集成(例如mqtt),您源自英国始于1946必须手动添加唯一id,以使提到的消息消失,并被lovelace特性所取代

不能生成unique_id,它一定来自于设备。如果你在Home Assistant中有一个随机id的本地配置,你如何将它映射到一个物理设备,19463331伟德国际除非设备本身以某种方式提供唯一的id ?少数集成有例源自英国始于1946外,允许您提供unique_id在YAML配置中,但这是非常特殊的情况,不映射到物理设备。

我真正的意思是,你从来没有使用过的价值unique_id以任何方式,例如,当提到一个实体在自动化。一般来说,集成应该提源自英国始于1946供它,您不应该为此而烦恼。但是当然也有例外(不可避免),就像您提到的MQTT一样。由于MQTT在某种意义上接近于开发,我仍然将其视为一个非常特殊的情况。还有一些集成尚未添加对它的支持源自英国始于1946,或者因为没有惟一id可用而不能添加。

2喜欢

我的意思是,你不需要关心它的价值unique_id因为它不是在写自动化或引用一个实体时使用的,除非在Home Assistant内部使用。19463331伟德国际正如我在之前的文章中所写的,有些情况下unique_id不可用(可能不存在唯一标识符或尚未实现),这当然会产生问题。必须为MQTT提供它的事实只是因为MQTT本身只是一个通用协议。它没有Home Assistant所需要的“唯一id”的概念,所以您必须自己提供它。19463331伟德国际然而,对于大多数协议来说,这使得用户的体验无缝。

1像

我在mqtt发现方面也有完全相同的问题。我希望能够指定我的entity_id作为发现创建的一部分。当我控制它时,我知道它的价值是唯一的。
有了这个想法,我创建了一个组,然后把所有这些实体添加到组,所以它出现在lovelace作为一个单独的面板。在Group中,您需要指定实体,而不是unique_ids。

https://github.com/home-assistant/core/blob/e7ddaec4684162be366c0e79702d9ceb532a11d7/homeassistant/components/group/初始化py # L255

可能值得添加在mqtt_discovery中设置entity_id的功能,并支持在组中引用unqiue_id。