Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add AsusWrt temperature sensors provided by http protocol #105692

Merged
merged 1 commit into from Dec 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 2 additions & 1 deletion homeassistant/components/asuswrt/bridge.py
Expand Up @@ -41,6 +41,7 @@
SENSORS_LOAD_AVG,
SENSORS_RATES,
SENSORS_TEMPERATURES,
SENSORS_TEMPERATURES_LEGACY,
)

SENSORS_TYPE_BYTES = "sensors_bytes"
Expand Down Expand Up @@ -277,7 +278,7 @@ async def async_get_available_sensors(self) -> dict[str, dict[str, Any]]:
async def _get_available_temperature_sensors(self) -> list[str]:
"""Check which temperature information is available on the router."""
availability = await self._api.async_find_temperature_commands()
return [SENSORS_TEMPERATURES[i] for i in range(3) if availability[i]]
return [SENSORS_TEMPERATURES_LEGACY[i] for i in range(3) if availability[i]]

@handle_errors_and_zip((IndexError, OSError, ValueError), SENSORS_BYTES)
async def _get_bytes(self) -> Any:
Expand Down
3 changes: 2 additions & 1 deletion homeassistant/components/asuswrt/const.py
Expand Up @@ -30,4 +30,5 @@
SENSORS_CONNECTED_DEVICE = ["sensor_connected_device"]
SENSORS_LOAD_AVG = ["sensor_load_avg1", "sensor_load_avg5", "sensor_load_avg15"]
SENSORS_RATES = ["sensor_rx_rates", "sensor_tx_rates"]
SENSORS_TEMPERATURES = ["2.4GHz", "5.0GHz", "CPU"]
SENSORS_TEMPERATURES_LEGACY = ["2.4GHz", "5.0GHz", "CPU"]
SENSORS_TEMPERATURES = [*SENSORS_TEMPERATURES_LEGACY, "5.0GHz_2", "6.0GHz"]
20 changes: 20 additions & 0 deletions homeassistant/components/asuswrt/sensor.py
Expand Up @@ -156,6 +156,26 @@ class AsusWrtSensorEntityDescription(SensorEntityDescription):
entity_registry_enabled_default=False,
suggested_display_precision=1,
),
AsusWrtSensorEntityDescription(
key=SENSORS_TEMPERATURES[3],
translation_key="5ghz_2_temperature",
state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.TEMPERATURE,
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
entity_category=EntityCategory.DIAGNOSTIC,
entity_registry_enabled_default=False,
suggested_display_precision=1,
),
AsusWrtSensorEntityDescription(
key=SENSORS_TEMPERATURES[4],
translation_key="6ghz_temperature",
state_class=SensorStateClass.MEASUREMENT,
device_class=SensorDeviceClass.TEMPERATURE,
native_unit_of_measurement=UnitOfTemperature.CELSIUS,
entity_category=EntityCategory.DIAGNOSTIC,
entity_registry_enabled_default=False,
suggested_display_precision=1,
),
)


Expand Down
6 changes: 6 additions & 0 deletions homeassistant/components/asuswrt/strings.json
Expand Up @@ -82,6 +82,12 @@
},
"cpu_temperature": {
"name": "CPU Temperature"
},
"5ghz_2_temperature": {
"name": "5GHz Temperature (Radio 2)"
},
"6ghz_temperature": {
"name": "6GHz Temperature"
}
}
},
Expand Down
12 changes: 6 additions & 6 deletions tests/components/asuswrt/conftest.py
Expand Up @@ -20,8 +20,8 @@
MOCK_CURRENT_TRANSFER_RATES_HTTP = dict(enumerate(MOCK_CURRENT_TRANSFER_RATES))
MOCK_LOAD_AVG_HTTP = {"load_avg_1": 1.1, "load_avg_5": 1.2, "load_avg_15": 1.3}
MOCK_LOAD_AVG = list(MOCK_LOAD_AVG_HTTP.values())
MOCK_TEMPERATURES_HTTP = {"2.4GHz": 40.2, "CPU": 71.2}
MOCK_TEMPERATURES = {**MOCK_TEMPERATURES_HTTP, "5.0GHz": 0}
MOCK_TEMPERATURES = {"2.4GHz": 40.2, "5.0GHz": 0, "CPU": 71.2}
MOCK_TEMPERATURES_HTTP = {**MOCK_TEMPERATURES, "5.0GHz_2": 40.3, "6.0GHz": 40.4}


@pytest.fixture(name="patch_setup_entry")
Expand Down Expand Up @@ -118,9 +118,9 @@ def mock_controller_connect_http(mock_devices_http):
MOCK_CURRENT_TRANSFER_RATES_HTTP
)
service_mock.return_value.async_get_loadavg.return_value = MOCK_LOAD_AVG_HTTP
service_mock.return_value.async_get_temperatures.return_value = (
MOCK_TEMPERATURES_HTTP
)
service_mock.return_value.async_get_temperatures.return_value = {
k: v for k, v in MOCK_TEMPERATURES_HTTP.items() if k != "5.0GHz"
}
yield service_mock


Expand All @@ -140,6 +140,6 @@ def mock_controller_connect_http_sens_detect():
"""Mock a successful sensor detection using http library."""
with patch(
f"{ASUSWRT_BASE}.bridge.AsusWrtHttpBridge._get_available_temperature_sensors",
return_value=[*MOCK_TEMPERATURES],
return_value=[*MOCK_TEMPERATURES_HTTP],
) as mock_sens_detect:
yield mock_sens_detect
34 changes: 24 additions & 10 deletions tests/components/asuswrt/test_sensor.py
Expand Up @@ -12,6 +12,7 @@
SENSORS_LOAD_AVG,
SENSORS_RATES,
SENSORS_TEMPERATURES,
SENSORS_TEMPERATURES_LEGACY,
)
from homeassistant.components.device_tracker import CONF_CONSIDER_HOME
from homeassistant.config_entries import ConfigEntryState
Expand Down Expand Up @@ -39,7 +40,7 @@

SENSORS_DEFAULT = [*SENSORS_BYTES, *SENSORS_RATES]

SENSORS_ALL_LEGACY = [*SENSORS_DEFAULT, *SENSORS_LOAD_AVG, *SENSORS_TEMPERATURES]
SENSORS_ALL_LEGACY = [*SENSORS_DEFAULT, *SENSORS_LOAD_AVG, *SENSORS_TEMPERATURES_LEGACY]
SENSORS_ALL_HTTP = [*SENSORS_DEFAULT, *SENSORS_LOAD_AVG, *SENSORS_TEMPERATURES]


Expand Down Expand Up @@ -242,11 +243,13 @@ async def test_temperature_sensors_http_fail(
assert not hass.states.get(f"{sensor_prefix}_2_4ghz")
assert not hass.states.get(f"{sensor_prefix}_5_0ghz")
assert not hass.states.get(f"{sensor_prefix}_cpu")
assert not hass.states.get(f"{sensor_prefix}_5_0ghz_2")
assert not hass.states.get(f"{sensor_prefix}_6_0ghz")


async def _test_temperature_sensors(hass: HomeAssistant, config) -> None:
async def _test_temperature_sensors(hass: HomeAssistant, config, sensors) -> str:
"""Test creating a AsusWRT temperature sensors."""
config_entry, sensor_prefix = _setup_entry(hass, config, SENSORS_TEMPERATURES)
config_entry, sensor_prefix = _setup_entry(hass, config, sensors)
config_entry.add_to_hass(hass)

# initial devices setup
Expand All @@ -255,20 +258,31 @@ async def _test_temperature_sensors(hass: HomeAssistant, config) -> None:
async_fire_time_changed(hass, utcnow() + timedelta(seconds=30))
await hass.async_block_till_done()

# assert temperature sensor available
assert hass.states.get(f"{sensor_prefix}_2_4ghz").state == "40.2"
assert not hass.states.get(f"{sensor_prefix}_5_0ghz")
assert hass.states.get(f"{sensor_prefix}_cpu").state == "71.2"
return sensor_prefix


async def test_temperature_sensors_legacy(hass: HomeAssistant, connect_legacy) -> None:
"""Test creating a AsusWRT temperature sensors."""
await _test_temperature_sensors(hass, CONFIG_DATA_TELNET)
sensor_prefix = await _test_temperature_sensors(
hass, CONFIG_DATA_TELNET, SENSORS_TEMPERATURES_LEGACY
)
# assert temperature sensor available
assert hass.states.get(f"{sensor_prefix}_2_4ghz").state == "40.2"
assert hass.states.get(f"{sensor_prefix}_cpu").state == "71.2"
assert not hass.states.get(f"{sensor_prefix}_5_0ghz")


async def test_temperature_sensors_http(hass: HomeAssistant, connect_http) -> None:
"""Test creating a AsusWRT temperature sensors."""
await _test_temperature_sensors(hass, CONFIG_DATA_HTTP)
sensor_prefix = await _test_temperature_sensors(
hass, CONFIG_DATA_HTTP, SENSORS_TEMPERATURES
)
# assert temperature sensor available
assert hass.states.get(f"{sensor_prefix}_2_4ghz").state == "40.2"
assert hass.states.get(f"{sensor_prefix}_cpu").state == "71.2"
assert hass.states.get(f"{sensor_prefix}_5_0ghz_2").state == "40.3"
assert hass.states.get(f"{sensor_prefix}_6_0ghz").state == "40.4"
assert not hass.states.get(f"{sensor_prefix}_5_0ghz")


@pytest.mark.parametrize(
Expand Down Expand Up @@ -416,7 +430,7 @@ async def test_decorator_errors(
hass: HomeAssistant, connect_legacy, mock_available_temps
) -> None:
"""Test AsusWRT sensors are unavailable on decorator type check error."""
sensors = [*SENSORS_BYTES, *SENSORS_TEMPERATURES]
sensors = [*SENSORS_BYTES, *SENSORS_TEMPERATURES_LEGACY]
config_entry, sensor_prefix = _setup_entry(hass, CONFIG_DATA_TELNET, sensors)
config_entry.add_to_hass(hass)

Expand Down