mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 21:27:38 +00:00
Add AsusWrt temperature sensors provided by http protocol (#105692)
This commit is contained in:
parent
8778763a3e
commit
ee25cb2616
@ -41,6 +41,7 @@ from .const import (
|
|||||||
SENSORS_LOAD_AVG,
|
SENSORS_LOAD_AVG,
|
||||||
SENSORS_RATES,
|
SENSORS_RATES,
|
||||||
SENSORS_TEMPERATURES,
|
SENSORS_TEMPERATURES,
|
||||||
|
SENSORS_TEMPERATURES_LEGACY,
|
||||||
)
|
)
|
||||||
|
|
||||||
SENSORS_TYPE_BYTES = "sensors_bytes"
|
SENSORS_TYPE_BYTES = "sensors_bytes"
|
||||||
@ -277,7 +278,7 @@ class AsusWrtLegacyBridge(AsusWrtBridge):
|
|||||||
async def _get_available_temperature_sensors(self) -> list[str]:
|
async def _get_available_temperature_sensors(self) -> list[str]:
|
||||||
"""Check which temperature information is available on the router."""
|
"""Check which temperature information is available on the router."""
|
||||||
availability = await self._api.async_find_temperature_commands()
|
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)
|
@handle_errors_and_zip((IndexError, OSError, ValueError), SENSORS_BYTES)
|
||||||
async def _get_bytes(self) -> Any:
|
async def _get_bytes(self) -> Any:
|
||||||
|
@ -30,4 +30,5 @@ SENSORS_BYTES = ["sensor_rx_bytes", "sensor_tx_bytes"]
|
|||||||
SENSORS_CONNECTED_DEVICE = ["sensor_connected_device"]
|
SENSORS_CONNECTED_DEVICE = ["sensor_connected_device"]
|
||||||
SENSORS_LOAD_AVG = ["sensor_load_avg1", "sensor_load_avg5", "sensor_load_avg15"]
|
SENSORS_LOAD_AVG = ["sensor_load_avg1", "sensor_load_avg5", "sensor_load_avg15"]
|
||||||
SENSORS_RATES = ["sensor_rx_rates", "sensor_tx_rates"]
|
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"]
|
||||||
|
@ -156,6 +156,26 @@ CONNECTION_SENSORS: tuple[AsusWrtSensorEntityDescription, ...] = (
|
|||||||
entity_registry_enabled_default=False,
|
entity_registry_enabled_default=False,
|
||||||
suggested_display_precision=1,
|
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,
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -82,6 +82,12 @@
|
|||||||
},
|
},
|
||||||
"cpu_temperature": {
|
"cpu_temperature": {
|
||||||
"name": "CPU Temperature"
|
"name": "CPU Temperature"
|
||||||
|
},
|
||||||
|
"5ghz_2_temperature": {
|
||||||
|
"name": "5GHz Temperature (Radio 2)"
|
||||||
|
},
|
||||||
|
"6ghz_temperature": {
|
||||||
|
"name": "6GHz Temperature"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -20,8 +20,8 @@ MOCK_CURRENT_TRANSFER_RATES = 20000000, 10000000
|
|||||||
MOCK_CURRENT_TRANSFER_RATES_HTTP = dict(enumerate(MOCK_CURRENT_TRANSFER_RATES))
|
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_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_LOAD_AVG = list(MOCK_LOAD_AVG_HTTP.values())
|
||||||
MOCK_TEMPERATURES_HTTP = {"2.4GHz": 40.2, "CPU": 71.2}
|
MOCK_TEMPERATURES = {"2.4GHz": 40.2, "5.0GHz": 0, "CPU": 71.2}
|
||||||
MOCK_TEMPERATURES = {**MOCK_TEMPERATURES_HTTP, "5.0GHz": 0}
|
MOCK_TEMPERATURES_HTTP = {**MOCK_TEMPERATURES, "5.0GHz_2": 40.3, "6.0GHz": 40.4}
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(name="patch_setup_entry")
|
@pytest.fixture(name="patch_setup_entry")
|
||||||
@ -118,9 +118,9 @@ def mock_controller_connect_http(mock_devices_http):
|
|||||||
MOCK_CURRENT_TRANSFER_RATES_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_loadavg.return_value = MOCK_LOAD_AVG_HTTP
|
||||||
service_mock.return_value.async_get_temperatures.return_value = (
|
service_mock.return_value.async_get_temperatures.return_value = {
|
||||||
MOCK_TEMPERATURES_HTTP
|
k: v for k, v in MOCK_TEMPERATURES_HTTP.items() if k != "5.0GHz"
|
||||||
)
|
}
|
||||||
yield service_mock
|
yield service_mock
|
||||||
|
|
||||||
|
|
||||||
@ -140,6 +140,6 @@ def mock_controller_connect_http_sens_detect():
|
|||||||
"""Mock a successful sensor detection using http library."""
|
"""Mock a successful sensor detection using http library."""
|
||||||
with patch(
|
with patch(
|
||||||
f"{ASUSWRT_BASE}.bridge.AsusWrtHttpBridge._get_available_temperature_sensors",
|
f"{ASUSWRT_BASE}.bridge.AsusWrtHttpBridge._get_available_temperature_sensors",
|
||||||
return_value=[*MOCK_TEMPERATURES],
|
return_value=[*MOCK_TEMPERATURES_HTTP],
|
||||||
) as mock_sens_detect:
|
) as mock_sens_detect:
|
||||||
yield mock_sens_detect
|
yield mock_sens_detect
|
||||||
|
@ -12,6 +12,7 @@ from homeassistant.components.asuswrt.const import (
|
|||||||
SENSORS_LOAD_AVG,
|
SENSORS_LOAD_AVG,
|
||||||
SENSORS_RATES,
|
SENSORS_RATES,
|
||||||
SENSORS_TEMPERATURES,
|
SENSORS_TEMPERATURES,
|
||||||
|
SENSORS_TEMPERATURES_LEGACY,
|
||||||
)
|
)
|
||||||
from homeassistant.components.device_tracker import CONF_CONSIDER_HOME
|
from homeassistant.components.device_tracker import CONF_CONSIDER_HOME
|
||||||
from homeassistant.config_entries import ConfigEntryState
|
from homeassistant.config_entries import ConfigEntryState
|
||||||
@ -39,7 +40,7 @@ from tests.common import MockConfigEntry, async_fire_time_changed
|
|||||||
|
|
||||||
SENSORS_DEFAULT = [*SENSORS_BYTES, *SENSORS_RATES]
|
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]
|
SENSORS_ALL_HTTP = [*SENSORS_DEFAULT, *SENSORS_LOAD_AVG, *SENSORS_TEMPERATURES]
|
||||||
|
|
||||||
|
|
||||||
@ -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}_2_4ghz")
|
||||||
assert not hass.states.get(f"{sensor_prefix}_5_0ghz")
|
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}_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."""
|
"""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)
|
config_entry.add_to_hass(hass)
|
||||||
|
|
||||||
# initial devices setup
|
# initial devices setup
|
||||||
@ -255,20 +258,31 @@ async def _test_temperature_sensors(hass: HomeAssistant, config) -> None:
|
|||||||
async_fire_time_changed(hass, utcnow() + timedelta(seconds=30))
|
async_fire_time_changed(hass, utcnow() + timedelta(seconds=30))
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
# assert temperature sensor available
|
return sensor_prefix
|
||||||
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"
|
|
||||||
|
|
||||||
|
|
||||||
async def test_temperature_sensors_legacy(hass: HomeAssistant, connect_legacy) -> None:
|
async def test_temperature_sensors_legacy(hass: HomeAssistant, connect_legacy) -> None:
|
||||||
"""Test creating a AsusWRT temperature sensors."""
|
"""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:
|
async def test_temperature_sensors_http(hass: HomeAssistant, connect_http) -> None:
|
||||||
"""Test creating a AsusWRT temperature sensors."""
|
"""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(
|
@pytest.mark.parametrize(
|
||||||
@ -416,7 +430,7 @@ async def test_decorator_errors(
|
|||||||
hass: HomeAssistant, connect_legacy, mock_available_temps
|
hass: HomeAssistant, connect_legacy, mock_available_temps
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Test AsusWRT sensors are unavailable on decorator type check error."""
|
"""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, sensor_prefix = _setup_entry(hass, CONFIG_DATA_TELNET, sensors)
|
||||||
config_entry.add_to_hass(hass)
|
config_entry.add_to_hass(hass)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user