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 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,

View File

@ -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"
}

View File

@ -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}

View File

@ -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

View File

@ -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

View File

@ -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,
),
},
)
}

View File

@ -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"
)