diff --git a/homeassistant/components/oncue/entity.py b/homeassistant/components/oncue/entity.py index ea0d4e14f1f..40ca21edf96 100644 --- a/homeassistant/components/oncue/entity.py +++ b/homeassistant/components/oncue/entity.py @@ -3,6 +3,7 @@ from __future__ import annotations from aiooncue import OncueDevice, OncueSensor +from homeassistant.helpers import device_registry as dr from homeassistant.helpers.entity import DeviceInfo, Entity, EntityDescription from homeassistant.helpers.update_coordinator import ( CoordinatorEntity, @@ -29,8 +30,10 @@ class OncueEntity(CoordinatorEntity, Entity): self._device_id = device_id self._attr_unique_id = f"{device_id}_{description.key}" self._attr_name = f"{device.name} {sensor.display_name}" + mac_address_hex = hex(int(device.sensors["MacAddress"].value))[2:] self._attr_device_info = DeviceInfo( identifiers={(DOMAIN, device_id)}, + connections={(dr.CONNECTION_NETWORK_MAC, mac_address_hex)}, name=device.name, hw_version=device.hardware_version, sw_version=device.sensors["FirmwareVersion"].display_value, diff --git a/homeassistant/components/oncue/manifest.json b/homeassistant/components/oncue/manifest.json index 96b8453c1b7..1b3548296ee 100644 --- a/homeassistant/components/oncue/manifest.json +++ b/homeassistant/components/oncue/manifest.json @@ -3,7 +3,7 @@ "name": "Oncue by Kohler", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/oncue", - "requirements": ["aiooncue==0.3.0"], + "requirements": ["aiooncue==0.3.2"], "codeowners": ["@bdraco"], "iot_class": "cloud_polling" } diff --git a/homeassistant/components/oncue/sensor.py b/homeassistant/components/oncue/sensor.py index 53f6c4647e6..84802d67d10 100644 --- a/homeassistant/components/oncue/sensor.py +++ b/homeassistant/components/oncue/sensor.py @@ -11,7 +11,9 @@ from homeassistant.components.sensor import ( ) from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( + ELECTRIC_CURRENT_AMPERE, ELECTRIC_POTENTIAL_VOLT, + ENERGY_KILO_WATT_HOUR, FREQUENCY_HERTZ, PERCENTAGE, POWER_WATT, @@ -38,6 +40,11 @@ SENSOR_TYPES: tuple[SensorEntityDescription, ...] = ( icon="mdi:speedometer", entity_category=EntityCategory.DIAGNOSTIC, ), + SensorEntityDescription( + key="EngineTargetSpeed", + icon="mdi:speedometer", + entity_category=EntityCategory.DIAGNOSTIC, + ), SensorEntityDescription( key="EngineOilPressure", native_unit_of_measurement=PRESSURE_PSI, @@ -113,6 +120,11 @@ SENSOR_TYPES: tuple[SensorEntityDescription, ...] = ( icon="mdi:hours-24", entity_category=EntityCategory.DIAGNOSTIC, ), + SensorEntityDescription( + key="EngineTotalRunTimeLoaded", + icon="mdi:hours-24", + entity_category=EntityCategory.DIAGNOSTIC, + ), SensorEntityDescription(key="AtsContactorPosition", icon="mdi:electric-switch"), SensorEntityDescription( key="IPAddress", @@ -124,6 +136,38 @@ SENSOR_TYPES: tuple[SensorEntityDescription, ...] = ( icon="mdi:server-network", entity_category=EntityCategory.DIAGNOSTIC, ), + SensorEntityDescription( + key="Source1VoltageAverageLineToLine", + native_unit_of_measurement=ELECTRIC_POTENTIAL_VOLT, + device_class=SensorDeviceClass.VOLTAGE, + state_class=SensorStateClass.MEASUREMENT, + entity_category=EntityCategory.DIAGNOSTIC, + ), + SensorEntityDescription( + key="Source2VoltageAverageLineToLine", + native_unit_of_measurement=ELECTRIC_POTENTIAL_VOLT, + device_class=SensorDeviceClass.VOLTAGE, + state_class=SensorStateClass.MEASUREMENT, + entity_category=EntityCategory.DIAGNOSTIC, + ), + SensorEntityDescription( + key="GensetTotalEnergy", + native_unit_of_measurement=ENERGY_KILO_WATT_HOUR, + device_class=SensorDeviceClass.ENERGY, + state_class=SensorStateClass.TOTAL_INCREASING, + ), + SensorEntityDescription( + key="EngineTotalNumberOfStarts", + icon="mdi:engine", + entity_category=EntityCategory.DIAGNOSTIC, + ), + SensorEntityDescription( + key="GeneratorCurrentAverage", + native_unit_of_measurement=ELECTRIC_CURRENT_AMPERE, + device_class=SensorDeviceClass.CURRENT, + state_class=SensorStateClass.MEASUREMENT, + entity_category=EntityCategory.DIAGNOSTIC, + ), ) SENSOR_MAP = {description.key: description for description in SENSOR_TYPES} diff --git a/requirements_all.txt b/requirements_all.txt index 225cac41acd..6d4e0cc6040 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -233,7 +233,7 @@ aionotify==0.2.0 aionotion==3.0.2 # homeassistant.components.oncue -aiooncue==0.3.0 +aiooncue==0.3.2 # homeassistant.components.acmeda aiopulse==0.4.3 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index a8cef6d3343..c489ea01363 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -165,7 +165,7 @@ aionanoleaf==0.1.1 aionotion==3.0.2 # homeassistant.components.oncue -aiooncue==0.3.0 +aiooncue==0.3.2 # homeassistant.components.acmeda aiopulse==0.4.3 diff --git a/tests/components/oncue/__init__.py b/tests/components/oncue/__init__.py index 5acacfdb732..48492a19933 100644 --- a/tests/components/oncue/__init__.py +++ b/tests/components/oncue/__init__.py @@ -40,6 +40,13 @@ MOCK_ASYNC_FETCH_ALL = { display_value="0 R/min", unit="R/min", ), + "EngineTargetSpeed": OncueSensor( + name="EngineTargetSpeed", + display_name="Engine Target Speed", + value="0", + display_value="0 R/min", + unit="R/min", + ), "EngineOilPressure": OncueSensor( name="EngineOilPressure", display_name="Engine Oil Pressure", @@ -57,8 +64,8 @@ MOCK_ASYNC_FETCH_ALL = { "BatteryVoltage": OncueSensor( name="BatteryVoltage", display_name="Battery Voltage", - value="13.5", - display_value="13.5 V", + value="13.4", + display_value="13.4 V", unit="V", ), "LubeOilTemperature": OncueSensor( @@ -71,15 +78,15 @@ MOCK_ASYNC_FETCH_ALL = { "GensetControllerTemperature": OncueSensor( name="GensetControllerTemperature", display_name="Generator Controller Temperature", - value=100.4, - display_value="100.4 F", + value=84.2, + display_value="84.2 F", unit="F", ), "EngineCompartmentTemperature": OncueSensor( name="EngineCompartmentTemperature", display_name="Engine Compartment Temperature", - value=84.2, - display_value="84.2 F", + value=62.6, + display_value="62.6 F", unit="F", ), "GeneratorTrueTotalPower": OncueSensor( @@ -96,6 +103,13 @@ MOCK_ASYNC_FETCH_ALL = { display_value="0 %", unit="%", ), + "GeneratorVoltageAB": OncueSensor( + name="GeneratorVoltageAB", + display_name="Generator Voltage AB", + value="0.0", + display_value="0.0 V", + unit="V", + ), "GeneratorVoltageAverageLineToLine": OncueSensor( name="GeneratorVoltageAverageLineToLine", display_name="Generator Voltage Average Line To Line", @@ -103,6 +117,13 @@ MOCK_ASYNC_FETCH_ALL = { display_value="0.0 V", unit="V", ), + "GeneratorCurrentAverage": OncueSensor( + name="GeneratorCurrentAverage", + display_name="Generator Current Average", + value="0.0", + display_value="0.0 A", + unit="A", + ), "GeneratorFrequency": OncueSensor( name="GeneratorFrequency", display_name="Generator Frequency", @@ -124,6 +145,13 @@ MOCK_ASYNC_FETCH_ALL = { display_value="Off", unit=None, ), + "GensetControllerSerialNumber": OncueSensor( + name="GensetControllerSerialNumber", + display_name="Generator Controller Serial Number", + value="-1", + display_value="-1", + unit=None, + ), "GensetModelNumberSelect": OncueSensor( name="GensetModelNumberSelect", display_name="Genset Model Number Select", @@ -134,15 +162,15 @@ MOCK_ASYNC_FETCH_ALL = { "GensetControllerClockTime": OncueSensor( name="GensetControllerClockTime", display_name="Generator Controller Clock Time", - value="2022-01-01 17:20:52", - display_value="2022-01-01 17:20:52", + value="2022-01-13 18:08:13", + display_value="2022-01-13 18:08:13", unit=None, ), "GensetControllerTotalOperationTime": OncueSensor( name="GensetControllerTotalOperationTime", display_name="Generator Controller Total Operation Time", - value="16482.0", - display_value="16482.0 h", + value="16770.8", + display_value="16770.8 h", unit="h", ), "EngineTotalRunTime": OncueSensor( @@ -152,6 +180,27 @@ MOCK_ASYNC_FETCH_ALL = { display_value="28.1 h", unit="h", ), + "EngineTotalRunTimeLoaded": OncueSensor( + name="EngineTotalRunTimeLoaded", + display_name="Engine Total Run Time Loaded", + value="5.5", + display_value="5.5 h", + unit="h", + ), + "EngineTotalNumberOfStarts": OncueSensor( + name="EngineTotalNumberOfStarts", + display_name="Engine Total Number Of Starts", + value="101", + display_value="101", + unit=None, + ), + "GensetTotalEnergy": OncueSensor( + name="GensetTotalEnergy", + display_name="Genset Total Energy", + value="1.2022309E7", + display_value="1.2022309E7 kWh", + unit="kWh", + ), "AtsContactorPosition": OncueSensor( name="AtsContactorPosition", display_name="Ats Contactor Position", @@ -159,6 +208,27 @@ MOCK_ASYNC_FETCH_ALL = { display_value="Source1", unit=None, ), + "AtsSourcesAvailable": OncueSensor( + name="AtsSourcesAvailable", + display_name="Ats Sources Available", + value="Source1", + display_value="Source1", + unit=None, + ), + "Source1VoltageAverageLineToLine": OncueSensor( + name="Source1VoltageAverageLineToLine", + display_name="Source1 Voltage Average Line To Line", + value="253.5", + display_value="253.5 V", + unit="V", + ), + "Source2VoltageAverageLineToLine": OncueSensor( + name="Source2VoltageAverageLineToLine", + display_name="Source2 Voltage Average Line To Line", + value="0.0", + display_value="0.0 V", + unit="V", + ), "IPAddress": OncueSensor( name="IPAddress", display_name="IP Address", @@ -166,6 +236,13 @@ MOCK_ASYNC_FETCH_ALL = { display_value="1.2.3.4:1026", unit=None, ), + "MacAddress": OncueSensor( + name="MacAddress", + display_name="Mac Address", + value="221157033710592", + display_value="221157033710592", + unit=None, + ), "ConnectedServerIPAddress": OncueSensor( name="ConnectedServerIPAddress", display_name="Connected Server IP Address", @@ -180,6 +257,13 @@ MOCK_ASYNC_FETCH_ALL = { display_value="True", unit=None, ), + "SerialNumber": OncueSensor( + name="SerialNumber", + display_name="Serial Number", + value="1073879692", + display_value="1073879692", + unit=None, + ), }, ) } diff --git a/tests/components/oncue/test_sensor.py b/tests/components/oncue/test_sensor.py index f24f0ae628e..5fe8b807c1b 100644 --- a/tests/components/oncue/test_sensor.py +++ b/tests/components/oncue/test_sensor.py @@ -26,7 +26,7 @@ async def test_sensors(hass: HomeAssistant) -> None: await hass.async_block_till_done() assert config_entry.state == ConfigEntryState.LOADED - assert len(hass.states.async_all("sensor")) == 18 + assert len(hass.states.async_all("sensor")) == 25 assert hass.states.get("sensor.my_generator_latest_firmware").state == "2.0.6" assert hass.states.get("sensor.my_generator_engine_speed").state == "0" @@ -37,18 +37,18 @@ async def test_sensors(hass: HomeAssistant) -> None: hass.states.get("sensor.my_generator_engine_coolant_temperature").state == "0" ) - assert hass.states.get("sensor.my_generator_battery_voltage").state == "13.5" + assert hass.states.get("sensor.my_generator_battery_voltage").state == "13.4" assert hass.states.get("sensor.my_generator_lube_oil_temperature").state == "0" assert ( hass.states.get("sensor.my_generator_generator_controller_temperature").state - == "38.0" + == "29.0" ) assert ( hass.states.get("sensor.my_generator_engine_compartment_temperature").state - == "29.0" + == "17.0" ) assert ( @@ -77,7 +77,7 @@ async def test_sensors(hass: HomeAssistant) -> None: hass.states.get( "sensor.my_generator_generator_controller_total_operation_time" ).state - == "16482.0" + == "16770.8" ) assert hass.states.get("sensor.my_generator_engine_total_run_time").state == "28.1" @@ -92,3 +92,36 @@ async def test_sensors(hass: HomeAssistant) -> None: hass.states.get("sensor.my_generator_connected_server_ip_address").state == "40.117.195.28" ) + + assert hass.states.get("sensor.my_generator_engine_target_speed").state == "0" + + assert ( + hass.states.get("sensor.my_generator_engine_total_run_time_loaded").state + == "5.5" + ) + + assert ( + hass.states.get( + "sensor.my_generator_source1_voltage_average_line_to_line" + ).state + == "253.5" + ) + + assert ( + hass.states.get( + "sensor.my_generator_source2_voltage_average_line_to_line" + ).state + == "0.0" + ) + + assert ( + hass.states.get("sensor.my_generator_genset_total_energy").state + == "1.2022309E7" + ) + assert ( + hass.states.get("sensor.my_generator_engine_total_number_of_starts").state + == "101" + ) + assert ( + hass.states.get("sensor.my_generator_generator_current_average").state == "0.0" + )