Add energy and additional sensors to oncue (#64097)

- The genset total energy can now be added to the energy dashboard
This commit is contained in:
J. Nick Koston 2022-01-14 13:36:29 -10:00 committed by GitHub
parent b273c37d2b
commit 8f8ea5b102
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 182 additions and 18 deletions

View File

@ -3,6 +3,7 @@ from __future__ import annotations
from aiooncue import OncueDevice, OncueSensor from aiooncue import OncueDevice, OncueSensor
from homeassistant.helpers import device_registry as dr
from homeassistant.helpers.entity import DeviceInfo, Entity, EntityDescription from homeassistant.helpers.entity import DeviceInfo, Entity, EntityDescription
from homeassistant.helpers.update_coordinator import ( from homeassistant.helpers.update_coordinator import (
CoordinatorEntity, CoordinatorEntity,
@ -29,8 +30,10 @@ class OncueEntity(CoordinatorEntity, Entity):
self._device_id = device_id self._device_id = device_id
self._attr_unique_id = f"{device_id}_{description.key}" self._attr_unique_id = f"{device_id}_{description.key}"
self._attr_name = f"{device.name} {sensor.display_name}" self._attr_name = f"{device.name} {sensor.display_name}"
mac_address_hex = hex(int(device.sensors["MacAddress"].value))[2:]
self._attr_device_info = DeviceInfo( self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, device_id)}, identifiers={(DOMAIN, device_id)},
connections={(dr.CONNECTION_NETWORK_MAC, mac_address_hex)},
name=device.name, name=device.name,
hw_version=device.hardware_version, hw_version=device.hardware_version,
sw_version=device.sensors["FirmwareVersion"].display_value, sw_version=device.sensors["FirmwareVersion"].display_value,

View File

@ -3,7 +3,7 @@
"name": "Oncue by Kohler", "name": "Oncue by Kohler",
"config_flow": true, "config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/oncue", "documentation": "https://www.home-assistant.io/integrations/oncue",
"requirements": ["aiooncue==0.3.0"], "requirements": ["aiooncue==0.3.2"],
"codeowners": ["@bdraco"], "codeowners": ["@bdraco"],
"iot_class": "cloud_polling" "iot_class": "cloud_polling"
} }

View File

@ -11,7 +11,9 @@ from homeassistant.components.sensor import (
) )
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import ( from homeassistant.const import (
ELECTRIC_CURRENT_AMPERE,
ELECTRIC_POTENTIAL_VOLT, ELECTRIC_POTENTIAL_VOLT,
ENERGY_KILO_WATT_HOUR,
FREQUENCY_HERTZ, FREQUENCY_HERTZ,
PERCENTAGE, PERCENTAGE,
POWER_WATT, POWER_WATT,
@ -38,6 +40,11 @@ SENSOR_TYPES: tuple[SensorEntityDescription, ...] = (
icon="mdi:speedometer", icon="mdi:speedometer",
entity_category=EntityCategory.DIAGNOSTIC, entity_category=EntityCategory.DIAGNOSTIC,
), ),
SensorEntityDescription(
key="EngineTargetSpeed",
icon="mdi:speedometer",
entity_category=EntityCategory.DIAGNOSTIC,
),
SensorEntityDescription( SensorEntityDescription(
key="EngineOilPressure", key="EngineOilPressure",
native_unit_of_measurement=PRESSURE_PSI, native_unit_of_measurement=PRESSURE_PSI,
@ -113,6 +120,11 @@ SENSOR_TYPES: tuple[SensorEntityDescription, ...] = (
icon="mdi:hours-24", icon="mdi:hours-24",
entity_category=EntityCategory.DIAGNOSTIC, entity_category=EntityCategory.DIAGNOSTIC,
), ),
SensorEntityDescription(
key="EngineTotalRunTimeLoaded",
icon="mdi:hours-24",
entity_category=EntityCategory.DIAGNOSTIC,
),
SensorEntityDescription(key="AtsContactorPosition", icon="mdi:electric-switch"), SensorEntityDescription(key="AtsContactorPosition", icon="mdi:electric-switch"),
SensorEntityDescription( SensorEntityDescription(
key="IPAddress", key="IPAddress",
@ -124,6 +136,38 @@ SENSOR_TYPES: tuple[SensorEntityDescription, ...] = (
icon="mdi:server-network", icon="mdi:server-network",
entity_category=EntityCategory.DIAGNOSTIC, 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} SENSOR_MAP = {description.key: description for description in SENSOR_TYPES}

View File

@ -233,7 +233,7 @@ aionotify==0.2.0
aionotion==3.0.2 aionotion==3.0.2
# homeassistant.components.oncue # homeassistant.components.oncue
aiooncue==0.3.0 aiooncue==0.3.2
# homeassistant.components.acmeda # homeassistant.components.acmeda
aiopulse==0.4.3 aiopulse==0.4.3

View File

@ -165,7 +165,7 @@ aionanoleaf==0.1.1
aionotion==3.0.2 aionotion==3.0.2
# homeassistant.components.oncue # homeassistant.components.oncue
aiooncue==0.3.0 aiooncue==0.3.2
# homeassistant.components.acmeda # homeassistant.components.acmeda
aiopulse==0.4.3 aiopulse==0.4.3

View File

@ -40,6 +40,13 @@ MOCK_ASYNC_FETCH_ALL = {
display_value="0 R/min", display_value="0 R/min",
unit="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( "EngineOilPressure": OncueSensor(
name="EngineOilPressure", name="EngineOilPressure",
display_name="Engine Oil Pressure", display_name="Engine Oil Pressure",
@ -57,8 +64,8 @@ MOCK_ASYNC_FETCH_ALL = {
"BatteryVoltage": OncueSensor( "BatteryVoltage": OncueSensor(
name="BatteryVoltage", name="BatteryVoltage",
display_name="Battery Voltage", display_name="Battery Voltage",
value="13.5", value="13.4",
display_value="13.5 V", display_value="13.4 V",
unit="V", unit="V",
), ),
"LubeOilTemperature": OncueSensor( "LubeOilTemperature": OncueSensor(
@ -71,15 +78,15 @@ MOCK_ASYNC_FETCH_ALL = {
"GensetControllerTemperature": OncueSensor( "GensetControllerTemperature": OncueSensor(
name="GensetControllerTemperature", name="GensetControllerTemperature",
display_name="Generator Controller Temperature", display_name="Generator Controller Temperature",
value=100.4, value=84.2,
display_value="100.4 F", display_value="84.2 F",
unit="F", unit="F",
), ),
"EngineCompartmentTemperature": OncueSensor( "EngineCompartmentTemperature": OncueSensor(
name="EngineCompartmentTemperature", name="EngineCompartmentTemperature",
display_name="Engine Compartment Temperature", display_name="Engine Compartment Temperature",
value=84.2, value=62.6,
display_value="84.2 F", display_value="62.6 F",
unit="F", unit="F",
), ),
"GeneratorTrueTotalPower": OncueSensor( "GeneratorTrueTotalPower": OncueSensor(
@ -96,6 +103,13 @@ MOCK_ASYNC_FETCH_ALL = {
display_value="0 %", display_value="0 %",
unit="%", unit="%",
), ),
"GeneratorVoltageAB": OncueSensor(
name="GeneratorVoltageAB",
display_name="Generator Voltage AB",
value="0.0",
display_value="0.0 V",
unit="V",
),
"GeneratorVoltageAverageLineToLine": OncueSensor( "GeneratorVoltageAverageLineToLine": OncueSensor(
name="GeneratorVoltageAverageLineToLine", name="GeneratorVoltageAverageLineToLine",
display_name="Generator Voltage Average Line To Line", display_name="Generator Voltage Average Line To Line",
@ -103,6 +117,13 @@ MOCK_ASYNC_FETCH_ALL = {
display_value="0.0 V", display_value="0.0 V",
unit="V", unit="V",
), ),
"GeneratorCurrentAverage": OncueSensor(
name="GeneratorCurrentAverage",
display_name="Generator Current Average",
value="0.0",
display_value="0.0 A",
unit="A",
),
"GeneratorFrequency": OncueSensor( "GeneratorFrequency": OncueSensor(
name="GeneratorFrequency", name="GeneratorFrequency",
display_name="Generator Frequency", display_name="Generator Frequency",
@ -124,6 +145,13 @@ MOCK_ASYNC_FETCH_ALL = {
display_value="Off", display_value="Off",
unit=None, unit=None,
), ),
"GensetControllerSerialNumber": OncueSensor(
name="GensetControllerSerialNumber",
display_name="Generator Controller Serial Number",
value="-1",
display_value="-1",
unit=None,
),
"GensetModelNumberSelect": OncueSensor( "GensetModelNumberSelect": OncueSensor(
name="GensetModelNumberSelect", name="GensetModelNumberSelect",
display_name="Genset Model Number Select", display_name="Genset Model Number Select",
@ -134,15 +162,15 @@ MOCK_ASYNC_FETCH_ALL = {
"GensetControllerClockTime": OncueSensor( "GensetControllerClockTime": OncueSensor(
name="GensetControllerClockTime", name="GensetControllerClockTime",
display_name="Generator Controller Clock Time", display_name="Generator Controller Clock Time",
value="2022-01-01 17:20:52", value="2022-01-13 18:08:13",
display_value="2022-01-01 17:20:52", display_value="2022-01-13 18:08:13",
unit=None, unit=None,
), ),
"GensetControllerTotalOperationTime": OncueSensor( "GensetControllerTotalOperationTime": OncueSensor(
name="GensetControllerTotalOperationTime", name="GensetControllerTotalOperationTime",
display_name="Generator Controller Total Operation Time", display_name="Generator Controller Total Operation Time",
value="16482.0", value="16770.8",
display_value="16482.0 h", display_value="16770.8 h",
unit="h", unit="h",
), ),
"EngineTotalRunTime": OncueSensor( "EngineTotalRunTime": OncueSensor(
@ -152,6 +180,27 @@ MOCK_ASYNC_FETCH_ALL = {
display_value="28.1 h", display_value="28.1 h",
unit="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( "AtsContactorPosition": OncueSensor(
name="AtsContactorPosition", name="AtsContactorPosition",
display_name="Ats Contactor Position", display_name="Ats Contactor Position",
@ -159,6 +208,27 @@ MOCK_ASYNC_FETCH_ALL = {
display_value="Source1", display_value="Source1",
unit=None, 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( "IPAddress": OncueSensor(
name="IPAddress", name="IPAddress",
display_name="IP Address", display_name="IP Address",
@ -166,6 +236,13 @@ MOCK_ASYNC_FETCH_ALL = {
display_value="1.2.3.4:1026", display_value="1.2.3.4:1026",
unit=None, unit=None,
), ),
"MacAddress": OncueSensor(
name="MacAddress",
display_name="Mac Address",
value="221157033710592",
display_value="221157033710592",
unit=None,
),
"ConnectedServerIPAddress": OncueSensor( "ConnectedServerIPAddress": OncueSensor(
name="ConnectedServerIPAddress", name="ConnectedServerIPAddress",
display_name="Connected Server IP Address", display_name="Connected Server IP Address",
@ -180,6 +257,13 @@ MOCK_ASYNC_FETCH_ALL = {
display_value="True", display_value="True",
unit=None, unit=None,
), ),
"SerialNumber": OncueSensor(
name="SerialNumber",
display_name="Serial Number",
value="1073879692",
display_value="1073879692",
unit=None,
),
}, },
) )
} }

View File

@ -26,7 +26,7 @@ async def test_sensors(hass: HomeAssistant) -> None:
await hass.async_block_till_done() await hass.async_block_till_done()
assert config_entry.state == ConfigEntryState.LOADED 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_latest_firmware").state == "2.0.6"
assert hass.states.get("sensor.my_generator_engine_speed").state == "0" 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" 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_lube_oil_temperature").state == "0"
assert ( assert (
hass.states.get("sensor.my_generator_generator_controller_temperature").state hass.states.get("sensor.my_generator_generator_controller_temperature").state
== "38.0" == "29.0"
) )
assert ( assert (
hass.states.get("sensor.my_generator_engine_compartment_temperature").state hass.states.get("sensor.my_generator_engine_compartment_temperature").state
== "29.0" == "17.0"
) )
assert ( assert (
@ -77,7 +77,7 @@ async def test_sensors(hass: HomeAssistant) -> None:
hass.states.get( hass.states.get(
"sensor.my_generator_generator_controller_total_operation_time" "sensor.my_generator_generator_controller_total_operation_time"
).state ).state
== "16482.0" == "16770.8"
) )
assert hass.states.get("sensor.my_generator_engine_total_run_time").state == "28.1" 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 hass.states.get("sensor.my_generator_connected_server_ip_address").state
== "40.117.195.28" == "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"
)