diff --git a/homeassistant/components/aussie_broadband/__init__.py b/homeassistant/components/aussie_broadband/__init__.py index 45ae6f90e6d..af2969f6f7a 100644 --- a/homeassistant/components/aussie_broadband/__init__.py +++ b/homeassistant/components/aussie_broadband/__init__.py @@ -5,14 +5,15 @@ from datetime import timedelta import logging from aiohttp import ClientError -from aussiebb.asyncio import AussieBB, AuthenticationException +from aussiebb.asyncio import AussieBB +from aussiebb.exceptions import AuthenticationException, UnrecognisedServiceType from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, Platform from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady from homeassistant.helpers.aiohttp_client import async_get_clientsession -from homeassistant.helpers.update_coordinator import DataUpdateCoordinator +from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed from .const import CONF_SERVICES, DEFAULT_UPDATE_INTERVAL, DOMAIN, SERVICE_ID @@ -44,7 +45,12 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: # Create an appropriate refresh function def update_data_factory(service_id): async def async_update_data(): - return await client.get_usage(service_id) + try: + return await client.get_usage(service_id) + except UnrecognisedServiceType as err: + raise UpdateFailed( + f"Service {service_id} of type '{services[service_id]['type']}' was unrecognised" + ) from err return async_update_data diff --git a/homeassistant/components/aussie_broadband/manifest.json b/homeassistant/components/aussie_broadband/manifest.json index fcec645127f..5476371f755 100644 --- a/homeassistant/components/aussie_broadband/manifest.json +++ b/homeassistant/components/aussie_broadband/manifest.json @@ -4,12 +4,14 @@ "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/aussie_broadband", "requirements": [ - "pyaussiebb==0.0.9" + "pyaussiebb==0.0.11" ], "codeowners": [ "@nickw444", "@Bre77" ], "iot_class": "cloud_polling", - "loggers": ["aussiebb"] + "loggers": [ + "aussiebb" + ] } \ No newline at end of file diff --git a/homeassistant/components/aussie_broadband/sensor.py b/homeassistant/components/aussie_broadband/sensor.py index 2ce8aaca9c4..04c1cff97b5 100644 --- a/homeassistant/components/aussie_broadband/sensor.py +++ b/homeassistant/components/aussie_broadband/sensor.py @@ -143,7 +143,7 @@ class AussieBroadandSensorEntity(CoordinatorEntity, SensorEntity): def native_value(self): """Return the state of the sensor.""" if self.entity_description.key == "internet": - return self.coordinator.data[self.entity_description.key]["kbytes"] + return self.coordinator.data[self.entity_description.key].get("kbytes") if self.entity_description.key in ("national", "mobile", "sms"): - return self.coordinator.data[self.entity_description.key]["calls"] + return self.coordinator.data[self.entity_description.key].get("calls") return self.coordinator.data[self.entity_description.key] diff --git a/requirements_all.txt b/requirements_all.txt index 4ed3c2ea7e0..8453c327c2f 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1407,7 +1407,7 @@ pyatome==0.1.1 pyatv==0.10.0 # homeassistant.components.aussie_broadband -pyaussiebb==0.0.9 +pyaussiebb==0.0.11 # homeassistant.components.balboa pybalboa==0.13 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 3b90ad19913..d1d53c75756 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -887,7 +887,7 @@ pyatmo==6.2.4 pyatv==0.10.0 # homeassistant.components.aussie_broadband -pyaussiebb==0.0.9 +pyaussiebb==0.0.11 # homeassistant.components.balboa pybalboa==0.13 diff --git a/tests/components/aussie_broadband/common.py b/tests/components/aussie_broadband/common.py index abb4bce042d..abb99355ef3 100644 --- a/tests/components/aussie_broadband/common.py +++ b/tests/components/aussie_broadband/common.py @@ -5,7 +5,7 @@ from homeassistant.components.aussie_broadband.const import ( CONF_SERVICES, DOMAIN as AUSSIE_BROADBAND_DOMAIN, ) -from homeassistant.const import CONF_PASSWORD, CONF_SCAN_INTERVAL, CONF_USERNAME +from homeassistant.const import CONF_PASSWORD, CONF_USERNAME from tests.common import MockConfigEntry @@ -22,6 +22,12 @@ FAKE_SERVICES = [ "type": "PhoneMobile", "name": "Mobile", }, + { + "service_id": "23456789", + "description": "Fake ABB VOIP Service", + "type": "VOIP", + "name": "VOIP", + }, ] FAKE_DATA = { @@ -30,12 +36,16 @@ FAKE_DATA = { } -async def setup_platform(hass, platforms=[], side_effect=None, usage={}): +async def setup_platform( + hass, platforms=[], side_effect=None, usage={}, usage_effect=None +): """Set up the Aussie Broadband platform.""" mock_entry = MockConfigEntry( domain=AUSSIE_BROADBAND_DOMAIN, data=FAKE_DATA, - options={CONF_SERVICES: ["12345678", "87654321"], CONF_SCAN_INTERVAL: 30}, + options={ + CONF_SERVICES: ["12345678", "87654321", "23456789", "98765432"], + }, ) mock_entry.add_to_hass(hass) @@ -50,7 +60,9 @@ async def setup_platform(hass, platforms=[], side_effect=None, usage={}): return_value=FAKE_SERVICES, side_effect=side_effect, ), patch( - "aussiebb.asyncio.AussieBB.get_usage", return_value=usage + "aussiebb.asyncio.AussieBB.get_usage", + return_value=usage, + side_effect=usage_effect, ): await hass.config_entries.async_setup(mock_entry.entry_id) await hass.async_block_till_done() diff --git a/tests/components/aussie_broadband/test_init.py b/tests/components/aussie_broadband/test_init.py index 9e31aa9b737..9e2e0b7cccc 100644 --- a/tests/components/aussie_broadband/test_init.py +++ b/tests/components/aussie_broadband/test_init.py @@ -2,7 +2,7 @@ from unittest.mock import patch from aiohttp import ClientConnectionError -from aussiebb.asyncio import AuthenticationException +from aussiebb.exceptions import AuthenticationException, UnrecognisedServiceType from homeassistant import data_entry_flow from homeassistant.config_entries import ConfigEntryState @@ -33,3 +33,9 @@ async def test_net_failure(hass: HomeAssistant) -> None: """Test init with a network failure.""" entry = await setup_platform(hass, side_effect=ClientConnectionError()) assert entry.state is ConfigEntryState.SETUP_RETRY + + +async def test_service_failure(hass: HomeAssistant) -> None: + """Test init with a invalid service.""" + entry = await setup_platform(hass, usage_effect=UnrecognisedServiceType()) + assert entry.state is ConfigEntryState.SETUP_RETRY diff --git a/tests/components/aussie_broadband/test_sensor.py b/tests/components/aussie_broadband/test_sensor.py index 30fac808a27..c99c52d5c86 100644 --- a/tests/components/aussie_broadband/test_sensor.py +++ b/tests/components/aussie_broadband/test_sensor.py @@ -1,5 +1,6 @@ """Aussie Broadband sensor platform tests.""" from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN +from homeassistant.const import STATE_UNKNOWN from .common import setup_platform @@ -24,6 +25,19 @@ MOCK_MOBILE_USAGE = { "historical": [], } +MOCK_VOIP_USAGE = { + "national": {"calls": 1, "cost": 0}, + "mobile": {"calls": 2, "cost": 0}, + "international": {"calls": 3, "cost": 0}, + "sms": {}, + "internet": {}, + "voicemail": {"calls": 6, "cost": 0}, + "other": {"calls": 7, "cost": 0}, + "daysTotal": 31, + "daysRemaining": 30, + "historical": [], +} + async def test_nbn_sensor_states(hass): """Tests that the sensors are correct.""" @@ -48,3 +62,13 @@ async def test_phone_sensor_states(hass): assert hass.states.get("sensor.mobile_data_used").state == "512" assert hass.states.get("sensor.mobile_billing_cycle_length").state == "31" assert hass.states.get("sensor.mobile_billing_cycle_remaining").state == "30" + + +async def test_voip_sensor_states(hass): + """Tests that the sensors are correct.""" + + await setup_platform(hass, [SENSOR_DOMAIN], usage=MOCK_VOIP_USAGE) + + assert hass.states.get("sensor.mobile_national_calls").state == "1" + assert hass.states.get("sensor.mobile_sms_sent").state == STATE_UNKNOWN + assert hass.states.get("sensor.mobile_data_used").state == STATE_UNKNOWN