1
0
mirror of https://github.com/home-assistant/core.git synced 2026-07-06 22:36:33 +01:00

Add network MAC connection to Rain Bird controller (#173672)

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
jasonjhofmann
2026-06-15 23:15:33 -07:00
committed by GitHub
parent 40264992a2
commit f0cefe2f2e
3 changed files with 65 additions and 3 deletions
@@ -13,9 +13,10 @@ from pyrainbird.async_client import (
)
from pyrainbird.data import ModelAndVersion, Schedule
from homeassistant.const import CONF_MAC
from homeassistant.core import HomeAssistant
from homeassistant.helpers.debounce import Debouncer
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.device_registry import CONNECTION_NETWORK_MAC, DeviceInfo
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import DOMAIN, MANUFACTURER, TIMEOUT_SECONDS
@@ -104,13 +105,18 @@ class RainbirdUpdateCoordinator(DataUpdateCoordinator[RainbirdDeviceState]):
"""Return information about the device."""
if self._unique_id is None:
return None
return DeviceInfo(
device_info = DeviceInfo(
name=self.device_name,
identifiers={(DOMAIN, self._unique_id)},
manufacturer=MANUFACTURER,
model=self._model_info.model_name,
sw_version=f"{self._model_info.major}.{self._model_info.minor}",
)
# The unique id is the formatted MAC for current config entries, but was
# historically the serial number, so derive the connection from the MAC.
if mac_address := self.config_entry.data.get(CONF_MAC):
device_info["connections"] = {(CONNECTION_NETWORK_MAC, mac_address)}
return device_info
async def _async_update_data(self) -> RainbirdDeviceState:
"""Fetch data from Rain Bird device."""
@@ -0,0 +1,36 @@
# serializer version: 1
# name: test_device_registry
DeviceRegistryEntrySnapshot({
'area_id': None,
'config_entries': <ANY>,
'config_entries_subentries': <ANY>,
'configuration_url': None,
'connections': set({
tuple(
'mac',
'4c:a1:61:00:11:22',
),
}),
'disabled_by': None,
'entry_type': None,
'hw_version': None,
'id': <ANY>,
'identifiers': set({
tuple(
'rainbird',
'4c:a1:61:00:11:22',
),
}),
'labels': set({
}),
'manufacturer': 'Rain Bird',
'model': 'ESP-TM2',
'model_id': None,
'name': 'Rain Bird Controller',
'name_by_user': None,
'primary_config_entry': <ANY>,
'serial_number': None,
'sw_version': '9.12',
'via_device_id': None,
})
# ---
+21 -1
View File
@@ -2,12 +2,14 @@
from http import HTTPStatus
from typing import Any
from unittest.mock import patch
import pytest
from syrupy.assertion import SnapshotAssertion
from homeassistant.components.rainbird.const import DOMAIN
from homeassistant.config_entries import ConfigEntryState
from homeassistant.const import CONF_MAC
from homeassistant.const import CONF_MAC, Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr, entity_registry as er
@@ -42,6 +44,24 @@ async def test_init_success(
assert config_entry.state is ConfigEntryState.NOT_LOADED
async def test_device_registry(
hass: HomeAssistant,
config_entry: MockConfigEntry,
device_registry: dr.DeviceRegistry,
snapshot: SnapshotAssertion,
) -> None:
"""Test the controller device registry entry, including the network MAC connection."""
# Load a platform so the controller device is registered.
with patch("homeassistant.components.rainbird.PLATFORMS", [Platform.SENSOR]):
await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
device_entry = device_registry.async_get_device(
identifiers={(DOMAIN, MAC_ADDRESS_UNIQUE_ID)}
)
assert device_entry == snapshot
@pytest.mark.parametrize(
("config_entry_data", "responses", "config_entry_state", "config_flow_steps"),
[