Add capability to display updated firmware versions in Home Assistant ()

* add firmware version update

* incoperate review feedback
pull/140937/head^2
jukrebs 2025-03-19 16:51:39 +01:00 committed by GitHub
parent 6b9c1e17e0
commit 2c9eb288e3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 70 additions and 1 deletions
homeassistant/components/iometer
tests/components/iometer

View File

@ -8,6 +8,7 @@ from iometer import IOmeterClient, IOmeterConnectionError, Reading, Status
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import DOMAIN
@ -31,6 +32,7 @@ class IOMeterCoordinator(DataUpdateCoordinator[IOmeterData]):
config_entry: IOmeterConfigEntry
client: IOmeterClient
current_fw_version: str = ""
def __init__(
self,
@ -58,4 +60,17 @@ class IOMeterCoordinator(DataUpdateCoordinator[IOmeterData]):
except IOmeterConnectionError as error:
raise UpdateFailed(f"Error communicating with IOmeter: {error}") from error
fw_version = f"{status.device.core.version}/{status.device.bridge.version}"
if self.current_fw_version and fw_version != self.current_fw_version:
device_registry = dr.async_get(self.hass)
device_entry = device_registry.async_get_device(
identifiers={(DOMAIN, status.device.id)}
)
assert device_entry
device_registry.async_update_device(
device_entry.id,
sw_version=fw_version,
)
self.current_fw_version = fw_version
return IOmeterData(reading=reading, status=status)

View File

@ -20,5 +20,5 @@ class IOmeterEntity(CoordinatorEntity[IOMeterCoordinator]):
identifiers={(DOMAIN, status.device.id)},
manufacturer="IOmeter GmbH",
model="IOmeter",
sw_version=f"{status.device.core.version}/{status.device.bridge.version}",
sw_version=coordinator.current_fw_version,
)

View File

@ -1 +1,13 @@
"""Tests for the IOmeter integration."""
from homeassistant.core import HomeAssistant
from tests.common import MockConfigEntry
async def setup_integration(hass: HomeAssistant, config_entry: MockConfigEntry) -> None:
"""Fixture for setting up the component."""
config_entry.add_to_hass(hass)
await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()

View File

@ -0,0 +1,42 @@
"""Tests for the AirGradient integration."""
from datetime import timedelta
from unittest.mock import AsyncMock
from freezegun.api import FrozenDateTimeFactory
from homeassistant.components.iometer.const import DOMAIN
from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr
from . import setup_integration
from tests.common import MockConfigEntry, async_fire_time_changed
async def test_new_firmware_version(
hass: HomeAssistant,
mock_iometer_client: AsyncMock,
mock_config_entry: MockConfigEntry,
device_registry: dr.DeviceRegistry,
freezer: FrozenDateTimeFactory,
) -> None:
"""Test device registry integration."""
await setup_integration(hass, mock_config_entry)
device_entry = device_registry.async_get_device(
identifiers={(DOMAIN, mock_config_entry.unique_id)}
)
assert device_entry is not None
assert device_entry.sw_version == "build-58/build-65"
mock_iometer_client.get_current_status.return_value.device.core.version = "build-62"
mock_iometer_client.get_current_status.return_value.device.bridge.version = (
"build-69"
)
freezer.tick(timedelta(minutes=1))
async_fire_time_changed(hass)
await hass.async_block_till_done()
device_entry = device_registry.async_get_device(
identifiers={(DOMAIN, mock_config_entry.unique_id)}
)
assert device_entry is not None
assert device_entry.sw_version == "build-62/build-69"