From 26058bf92289acdee0f5c920729061d5f911c60c Mon Sep 17 00:00:00 2001 From: Jan Bouwhuis Date: Tue, 16 Jan 2024 14:02:34 +0100 Subject: [PATCH] Add serial_number attribute to MQTT device properties (#108105) --- homeassistant/components/mqtt/abbreviations.py | 1 + homeassistant/components/mqtt/const.py | 3 +++ homeassistant/components/mqtt/mixins.py | 6 ++++++ tests/components/mqtt/test_common.py | 2 ++ tests/components/mqtt/test_device_trigger.py | 5 +++++ tests/components/mqtt/test_init.py | 2 ++ tests/components/mqtt/test_tag.py | 5 +++++ 7 files changed, 24 insertions(+) diff --git a/homeassistant/components/mqtt/abbreviations.py b/homeassistant/components/mqtt/abbreviations.py index 524448e02a8..5fadf6ba590 100644 --- a/homeassistant/components/mqtt/abbreviations.py +++ b/homeassistant/components/mqtt/abbreviations.py @@ -271,6 +271,7 @@ DEVICE_ABBREVIATIONS = { "hw": "hw_version", "sw": "sw_version", "sa": "suggested_area", + "sn": "serial_number", } ORIGIN_ABBREVIATIONS = { diff --git a/homeassistant/components/mqtt/const.py b/homeassistant/components/mqtt/const.py index 304877695c3..fba2f13937e 100644 --- a/homeassistant/components/mqtt/const.py +++ b/homeassistant/components/mqtt/const.py @@ -1,4 +1,5 @@ """Constants used by multiple MQTT modules.""" + from homeassistant.const import CONF_PAYLOAD, Platform ATTR_DISCOVERY_HASH = "discovery_hash" @@ -7,6 +8,7 @@ ATTR_DISCOVERY_TOPIC = "discovery_topic" ATTR_PAYLOAD = "payload" ATTR_QOS = "qos" ATTR_RETAIN = "retain" +ATTR_SERIAL_NUMBER = "serial_number" ATTR_TOPIC = "topic" CONF_AVAILABILITY = "availability" @@ -73,6 +75,7 @@ CONF_CONNECTIONS = "connections" CONF_MANUFACTURER = "manufacturer" CONF_HW_VERSION = "hw_version" CONF_SW_VERSION = "sw_version" +CONF_SERIAL_NUMBER = "serial_number" CONF_VIA_DEVICE = "via_device" CONF_DEPRECATED_VIA_HUB = "via_hub" CONF_SUGGESTED_AREA = "suggested_area" diff --git a/homeassistant/components/mqtt/mixins.py b/homeassistant/components/mqtt/mixins.py index 1cb12930b5a..4c7837a7a2b 100644 --- a/homeassistant/components/mqtt/mixins.py +++ b/homeassistant/components/mqtt/mixins.py @@ -17,6 +17,7 @@ from homeassistant.const import ( ATTR_MANUFACTURER, ATTR_MODEL, ATTR_NAME, + ATTR_SERIAL_NUMBER, ATTR_SUGGESTED_AREA, ATTR_SW_VERSION, ATTR_VIA_DEVICE, @@ -82,6 +83,7 @@ from .const import ( CONF_ORIGIN, CONF_QOS, CONF_SCHEMA, + CONF_SERIAL_NUMBER, CONF_SUGGESTED_AREA, CONF_SW_VERSION, CONF_TOPIC, @@ -220,6 +222,7 @@ MQTT_ENTITY_DEVICE_INFO_SCHEMA = vol.All( vol.Optional(CONF_MODEL): cv.string, vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_HW_VERSION): cv.string, + vol.Optional(CONF_SERIAL_NUMBER): cv.string, vol.Optional(CONF_SW_VERSION): cv.string, vol.Optional(CONF_VIA_DEVICE): cv.string, vol.Optional(CONF_SUGGESTED_AREA): cv.string, @@ -1103,6 +1106,9 @@ def device_info_from_specifications( if CONF_HW_VERSION in specifications: info[ATTR_HW_VERSION] = specifications[CONF_HW_VERSION] + if CONF_SERIAL_NUMBER in specifications: + info[ATTR_SERIAL_NUMBER] = specifications[CONF_SERIAL_NUMBER] + if CONF_SW_VERSION in specifications: info[ATTR_SW_VERSION] = specifications[CONF_SW_VERSION] diff --git a/tests/components/mqtt/test_common.py b/tests/components/mqtt/test_common.py index cb5ff53d7e9..54b0f7f3506 100644 --- a/tests/components/mqtt/test_common.py +++ b/tests/components/mqtt/test_common.py @@ -43,6 +43,7 @@ DEFAULT_CONFIG_DEVICE_INFO_ID = { "name": "Beer", "model": "Glass", "hw_version": "rev1", + "serial_number": "1234deadbeef", "sw_version": "0.1-beta", "suggested_area": "default_area", "configuration_url": "http://example.com", @@ -54,6 +55,7 @@ DEFAULT_CONFIG_DEVICE_INFO_MAC = { "name": "Beer", "model": "Glass", "hw_version": "rev1", + "serial_number": "1234deadbeef", "sw_version": "0.1-beta", "suggested_area": "default_area", "configuration_url": "http://example.com", diff --git a/tests/components/mqtt/test_device_trigger.py b/tests/components/mqtt/test_device_trigger.py index 90360bf7e3f..fffb9e57f84 100644 --- a/tests/components/mqtt/test_device_trigger.py +++ b/tests/components/mqtt/test_device_trigger.py @@ -992,6 +992,7 @@ async def test_entity_device_info_with_connection( "name": "Beer", "model": "Glass", "hw_version": "rev1", + "serial_number": "1234deadbeef", "sw_version": "0.1-beta", }, } @@ -1008,6 +1009,7 @@ async def test_entity_device_info_with_connection( assert device.name == "Beer" assert device.model == "Glass" assert device.hw_version == "rev1" + assert device.serial_number == "1234deadbeef" assert device.sw_version == "0.1-beta" @@ -1031,6 +1033,7 @@ async def test_entity_device_info_with_identifier( "name": "Beer", "model": "Glass", "hw_version": "rev1", + "serial_number": "1234deadbeef", "sw_version": "0.1-beta", }, } @@ -1045,6 +1048,7 @@ async def test_entity_device_info_with_identifier( assert device.name == "Beer" assert device.model == "Glass" assert device.hw_version == "rev1" + assert device.serial_number == "1234deadbeef" assert device.sw_version == "0.1-beta" @@ -1067,6 +1071,7 @@ async def test_entity_device_info_update( "manufacturer": "Whatever", "name": "Beer", "model": "Glass", + "serial_number": "1234deadbeef", "sw_version": "0.1-beta", }, } diff --git a/tests/components/mqtt/test_init.py b/tests/components/mqtt/test_init.py index 3d7b349712e..5bd41da057c 100644 --- a/tests/components/mqtt/test_init.py +++ b/tests/components/mqtt/test_init.py @@ -804,6 +804,7 @@ def test_entity_device_info_schema() -> None: "manufacturer": "Whatever", "name": "Beer", "model": "Glass", + "serial_number": "1234deadbeef", "sw_version": "0.1-beta", "configuration_url": "http://example.com", } @@ -819,6 +820,7 @@ def test_entity_device_info_schema() -> None: "manufacturer": "Whatever", "name": "Beer", "model": "Glass", + "serial_number": "1234deadbeef", "sw_version": "0.1-beta", "via_device": "test-hub", "configuration_url": "http://example.com", diff --git a/tests/components/mqtt/test_tag.py b/tests/components/mqtt/test_tag.py index 0476c880b1a..cee7880cf1c 100644 --- a/tests/components/mqtt/test_tag.py +++ b/tests/components/mqtt/test_tag.py @@ -460,6 +460,7 @@ async def test_entity_device_info_with_connection( "name": "Beer", "model": "Glass", "hw_version": "rev1", + "serial_number": "1234deadbeef", "sw_version": "0.1-beta", }, } @@ -476,6 +477,7 @@ async def test_entity_device_info_with_connection( assert device.name == "Beer" assert device.model == "Glass" assert device.hw_version == "rev1" + assert device.serial_number == "1234deadbeef" assert device.sw_version == "0.1-beta" @@ -496,6 +498,7 @@ async def test_entity_device_info_with_identifier( "name": "Beer", "model": "Glass", "hw_version": "rev1", + "serial_number": "1234deadbeef", "sw_version": "0.1-beta", }, } @@ -510,6 +513,7 @@ async def test_entity_device_info_with_identifier( assert device.name == "Beer" assert device.model == "Glass" assert device.hw_version == "rev1" + assert device.serial_number == "1234deadbeef" assert device.sw_version == "0.1-beta" @@ -529,6 +533,7 @@ async def test_entity_device_info_update( "manufacturer": "Whatever", "name": "Beer", "model": "Glass", + "serial_number": "1234deadbeef", "sw_version": "0.1-beta", }, }