Remove resources selection from Nut config flow (#59450)

* Remove resources selection from Nut config flow

* Code clean-up

* Requested changes

* Apply suggestions from code review

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
This commit is contained in:
ollo69 2021-11-10 13:49:05 +01:00 committed by GitHub
parent c03fdd5da6
commit 6cba03aa4a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 149 additions and 210 deletions

View File

@ -37,13 +37,11 @@ _LOGGER = logging.getLogger(__name__)
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Set up Network UPS Tools (NUT) from a config entry.""" """Set up Network UPS Tools (NUT) from a config entry."""
# strip out the stale options CONF_RESOURCES # strip out the stale setting CONF_RESOURCES from data & options
if CONF_RESOURCES in entry.options: if CONF_RESOURCES in entry.data:
new_data = {**entry.data, CONF_RESOURCES: entry.options[CONF_RESOURCES]} new_data = {k: v for k, v in entry.data.items() if k != CONF_RESOURCES}
new_options = {k: v for k, v in entry.options.items() if k != CONF_RESOURCES} new_opts = {k: v for k, v in entry.options.items() if k != CONF_RESOURCES}
hass.config_entries.async_update_entry( hass.config_entries.async_update_entry(entry, data=new_data, options=new_opts)
entry, data=new_data, options=new_options
)
config = entry.data config = entry.data
host = config[CONF_HOST] host = config[CONF_HOST]
@ -79,7 +77,6 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
_LOGGER.debug("NUT Sensors Available: %s", status) _LOGGER.debug("NUT Sensors Available: %s", status)
undo_listener = entry.add_update_listener(_async_update_listener) undo_listener = entry.add_update_listener(_async_update_listener)
unique_id = _unique_id_from_status(status) unique_id = _unique_id_from_status(status)
if unique_id is None: if unique_id is None:
unique_id = entry.entry_id unique_id = entry.entry_id
@ -91,7 +88,6 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
PYNUT_UNIQUE_ID: unique_id, PYNUT_UNIQUE_ID: unique_id,
UNDO_UPDATE_LISTENER: undo_listener, UNDO_UPDATE_LISTENER: undo_listener,
} }
hass.config_entries.async_setup_platforms(entry, PLATFORMS) hass.config_entries.async_setup_platforms(entry, PLATFORMS)
return True return True

View File

@ -10,23 +10,13 @@ from homeassistant.const import (
CONF_HOST, CONF_HOST,
CONF_PASSWORD, CONF_PASSWORD,
CONF_PORT, CONF_PORT,
CONF_RESOURCES,
CONF_SCAN_INTERVAL, CONF_SCAN_INTERVAL,
CONF_USERNAME, CONF_USERNAME,
) )
from homeassistant.core import callback from homeassistant.core import callback
import homeassistant.helpers.config_validation as cv
from . import PyNUTData from . import PyNUTData
from .const import ( from .const import DEFAULT_HOST, DEFAULT_PORT, DEFAULT_SCAN_INTERVAL, DOMAIN
DEFAULT_HOST,
DEFAULT_PORT,
DEFAULT_SCAN_INTERVAL,
DOMAIN,
KEY_STATUS,
KEY_STATUS_DISPLAY,
SENSOR_TYPES,
)
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -48,27 +38,6 @@ def _base_schema(discovery_info):
return vol.Schema(base_schema) return vol.Schema(base_schema)
def _resource_schema_base(available_resources, selected_resources):
"""Resource selection schema."""
known_available_resources = {
sensor_id: sensor_desc.name
for sensor_id, sensor_desc in SENSOR_TYPES.items()
if sensor_id in available_resources
}
if KEY_STATUS in known_available_resources:
known_available_resources[KEY_STATUS_DISPLAY] = SENSOR_TYPES[
KEY_STATUS_DISPLAY
].name
return {
vol.Required(CONF_RESOURCES, default=selected_resources): cv.multi_select(
known_available_resources
)
}
def _ups_schema(ups_list): def _ups_schema(ups_list):
"""UPS selection schema.""" """UPS selection schema."""
return vol.Schema({vol.Required(CONF_ALIAS): vol.In(ups_list)}) return vol.Schema({vol.Required(CONF_ALIAS): vol.In(ups_list)})
@ -112,7 +81,6 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
def __init__(self): def __init__(self):
"""Initialize the nut config flow.""" """Initialize the nut config flow."""
self.nut_config = {} self.nut_config = {}
self.available_resources = {}
self.discovery_info = {} self.discovery_info = {}
self.ups_list = None self.ups_list = None
self.title = None self.title = None
@ -148,8 +116,8 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
if self._host_port_alias_already_configured(self.nut_config): if self._host_port_alias_already_configured(self.nut_config):
return self.async_abort(reason="already_configured") return self.async_abort(reason="already_configured")
self.available_resources.update(info["available_resources"]) title = _format_host_port_alias(self.nut_config)
return await self.async_step_resources() return self.async_create_entry(title=title, data=self.nut_config)
return self.async_show_form( return self.async_show_form(
step_id="user", data_schema=_base_schema(self.discovery_info), errors=errors step_id="user", data_schema=_base_schema(self.discovery_info), errors=errors
@ -163,10 +131,10 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
self.nut_config.update(user_input) self.nut_config.update(user_input)
if self._host_port_alias_already_configured(self.nut_config): if self._host_port_alias_already_configured(self.nut_config):
return self.async_abort(reason="already_configured") return self.async_abort(reason="already_configured")
info, errors = await self._async_validate_or_error(self.nut_config) _, errors = await self._async_validate_or_error(self.nut_config)
if not errors: if not errors:
self.available_resources.update(info["available_resources"]) title = _format_host_port_alias(self.nut_config)
return await self.async_step_resources() return self.async_create_entry(title=title, data=self.nut_config)
return self.async_show_form( return self.async_show_form(
step_id="ups", step_id="ups",
@ -174,20 +142,6 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
errors=errors, errors=errors,
) )
async def async_step_resources(self, user_input=None):
"""Handle the picking the resources."""
if user_input is None:
return self.async_show_form(
step_id="resources",
data_schema=vol.Schema(
_resource_schema_base(self.available_resources, [])
),
)
self.nut_config.update(user_input)
title = _format_host_port_alias(self.nut_config)
return self.async_create_entry(title=title, data=self.nut_config)
def _host_port_alias_already_configured(self, user_input): def _host_port_alias_already_configured(self, user_input):
"""See if we already have a nut entry matching user input configured.""" """See if we already have a nut entry matching user input configured."""
existing_host_port_aliases = { existing_host_port_aliases = {

View File

@ -68,6 +68,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
device_class=DEVICE_CLASS_TEMPERATURE, device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT, state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ups.load": SensorEntityDescription( "ups.load": SensorEntityDescription(
key="ups.load", key="ups.load",
@ -82,12 +83,14 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=PERCENTAGE, native_unit_of_measurement=PERCENTAGE,
icon="mdi:gauge", icon="mdi:gauge",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ups.id": SensorEntityDescription( "ups.id": SensorEntityDescription(
key="ups.id", key="ups.id",
name="System identifier", name="System identifier",
icon="mdi:information-outline", icon="mdi:information-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ups.delay.start": SensorEntityDescription( "ups.delay.start": SensorEntityDescription(
key="ups.delay.start", key="ups.delay.start",
@ -95,6 +98,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=TIME_SECONDS, native_unit_of_measurement=TIME_SECONDS,
icon="mdi:timer-outline", icon="mdi:timer-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ups.delay.reboot": SensorEntityDescription( "ups.delay.reboot": SensorEntityDescription(
key="ups.delay.reboot", key="ups.delay.reboot",
@ -102,6 +106,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=TIME_SECONDS, native_unit_of_measurement=TIME_SECONDS,
icon="mdi:timer-outline", icon="mdi:timer-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ups.delay.shutdown": SensorEntityDescription( "ups.delay.shutdown": SensorEntityDescription(
key="ups.delay.shutdown", key="ups.delay.shutdown",
@ -109,6 +114,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=TIME_SECONDS, native_unit_of_measurement=TIME_SECONDS,
icon="mdi:timer-outline", icon="mdi:timer-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ups.timer.start": SensorEntityDescription( "ups.timer.start": SensorEntityDescription(
key="ups.timer.start", key="ups.timer.start",
@ -116,6 +122,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=TIME_SECONDS, native_unit_of_measurement=TIME_SECONDS,
icon="mdi:timer-outline", icon="mdi:timer-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ups.timer.reboot": SensorEntityDescription( "ups.timer.reboot": SensorEntityDescription(
key="ups.timer.reboot", key="ups.timer.reboot",
@ -123,6 +130,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=TIME_SECONDS, native_unit_of_measurement=TIME_SECONDS,
icon="mdi:timer-outline", icon="mdi:timer-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ups.timer.shutdown": SensorEntityDescription( "ups.timer.shutdown": SensorEntityDescription(
key="ups.timer.shutdown", key="ups.timer.shutdown",
@ -130,6 +138,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=TIME_SECONDS, native_unit_of_measurement=TIME_SECONDS,
icon="mdi:timer-outline", icon="mdi:timer-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ups.test.interval": SensorEntityDescription( "ups.test.interval": SensorEntityDescription(
key="ups.test.interval", key="ups.test.interval",
@ -137,30 +146,35 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=TIME_SECONDS, native_unit_of_measurement=TIME_SECONDS,
icon="mdi:timer-outline", icon="mdi:timer-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ups.test.result": SensorEntityDescription( "ups.test.result": SensorEntityDescription(
key="ups.test.result", key="ups.test.result",
name="Self-Test Result", name="Self-Test Result",
icon="mdi:information-outline", icon="mdi:information-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ups.test.date": SensorEntityDescription( "ups.test.date": SensorEntityDescription(
key="ups.test.date", key="ups.test.date",
name="Self-Test Date", name="Self-Test Date",
icon="mdi:calendar", icon="mdi:calendar",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ups.display.language": SensorEntityDescription( "ups.display.language": SensorEntityDescription(
key="ups.display.language", key="ups.display.language",
name="Language", name="Language",
icon="mdi:information-outline", icon="mdi:information-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ups.contacts": SensorEntityDescription( "ups.contacts": SensorEntityDescription(
key="ups.contacts", key="ups.contacts",
name="External Contacts", name="External Contacts",
icon="mdi:information-outline", icon="mdi:information-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ups.efficiency": SensorEntityDescription( "ups.efficiency": SensorEntityDescription(
key="ups.efficiency", key="ups.efficiency",
@ -169,6 +183,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
icon="mdi:gauge", icon="mdi:gauge",
state_class=STATE_CLASS_MEASUREMENT, state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ups.power": SensorEntityDescription( "ups.power": SensorEntityDescription(
key="ups.power", key="ups.power",
@ -177,6 +192,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
icon="mdi:flash", icon="mdi:flash",
state_class=STATE_CLASS_MEASUREMENT, state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ups.power.nominal": SensorEntityDescription( "ups.power.nominal": SensorEntityDescription(
key="ups.power.nominal", key="ups.power.nominal",
@ -184,6 +200,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=POWER_VOLT_AMPERE, native_unit_of_measurement=POWER_VOLT_AMPERE,
icon="mdi:flash", icon="mdi:flash",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ups.realpower": SensorEntityDescription( "ups.realpower": SensorEntityDescription(
key="ups.realpower", key="ups.realpower",
@ -192,6 +209,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
device_class=DEVICE_CLASS_POWER, device_class=DEVICE_CLASS_POWER,
state_class=STATE_CLASS_MEASUREMENT, state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ups.realpower.nominal": SensorEntityDescription( "ups.realpower.nominal": SensorEntityDescription(
key="ups.realpower.nominal", key="ups.realpower.nominal",
@ -199,48 +217,56 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=POWER_WATT, native_unit_of_measurement=POWER_WATT,
device_class=DEVICE_CLASS_POWER, device_class=DEVICE_CLASS_POWER,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ups.beeper.status": SensorEntityDescription( "ups.beeper.status": SensorEntityDescription(
key="ups.beeper.status", key="ups.beeper.status",
name="Beeper Status", name="Beeper Status",
icon="mdi:information-outline", icon="mdi:information-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ups.type": SensorEntityDescription( "ups.type": SensorEntityDescription(
key="ups.type", key="ups.type",
name="UPS Type", name="UPS Type",
icon="mdi:information-outline", icon="mdi:information-outline",
entity_category=ENTITY_CATEGORY_SYSTEM, entity_category=ENTITY_CATEGORY_SYSTEM,
entity_registry_enabled_default=False,
), ),
"ups.watchdog.status": SensorEntityDescription( "ups.watchdog.status": SensorEntityDescription(
key="ups.watchdog.status", key="ups.watchdog.status",
name="Watchdog Status", name="Watchdog Status",
icon="mdi:information-outline", icon="mdi:information-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ups.start.auto": SensorEntityDescription( "ups.start.auto": SensorEntityDescription(
key="ups.start.auto", key="ups.start.auto",
name="Start on AC", name="Start on AC",
icon="mdi:information-outline", icon="mdi:information-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ups.start.battery": SensorEntityDescription( "ups.start.battery": SensorEntityDescription(
key="ups.start.battery", key="ups.start.battery",
name="Start on Battery", name="Start on Battery",
icon="mdi:information-outline", icon="mdi:information-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ups.start.reboot": SensorEntityDescription( "ups.start.reboot": SensorEntityDescription(
key="ups.start.reboot", key="ups.start.reboot",
name="Reboot on Battery", name="Reboot on Battery",
icon="mdi:information-outline", icon="mdi:information-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ups.shutdown": SensorEntityDescription( "ups.shutdown": SensorEntityDescription(
key="ups.shutdown", key="ups.shutdown",
name="Shutdown Ability", name="Shutdown Ability",
icon="mdi:information-outline", icon="mdi:information-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"battery.charge": SensorEntityDescription( "battery.charge": SensorEntityDescription(
key="battery.charge", key="battery.charge",
@ -255,6 +281,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=PERCENTAGE, native_unit_of_measurement=PERCENTAGE,
icon="mdi:gauge", icon="mdi:gauge",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"battery.charge.restart": SensorEntityDescription( "battery.charge.restart": SensorEntityDescription(
key="battery.charge.restart", key="battery.charge.restart",
@ -262,6 +289,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=PERCENTAGE, native_unit_of_measurement=PERCENTAGE,
icon="mdi:gauge", icon="mdi:gauge",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"battery.charge.warning": SensorEntityDescription( "battery.charge.warning": SensorEntityDescription(
key="battery.charge.warning", key="battery.charge.warning",
@ -269,6 +297,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=PERCENTAGE, native_unit_of_measurement=PERCENTAGE,
icon="mdi:gauge", icon="mdi:gauge",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"battery.charger.status": SensorEntityDescription( "battery.charger.status": SensorEntityDescription(
key="battery.charger.status", key="battery.charger.status",
@ -282,6 +311,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
device_class=DEVICE_CLASS_VOLTAGE, device_class=DEVICE_CLASS_VOLTAGE,
state_class=STATE_CLASS_MEASUREMENT, state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"battery.voltage.nominal": SensorEntityDescription( "battery.voltage.nominal": SensorEntityDescription(
key="battery.voltage.nominal", key="battery.voltage.nominal",
@ -289,6 +319,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=ELECTRIC_POTENTIAL_VOLT, native_unit_of_measurement=ELECTRIC_POTENTIAL_VOLT,
device_class=DEVICE_CLASS_VOLTAGE, device_class=DEVICE_CLASS_VOLTAGE,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"battery.voltage.low": SensorEntityDescription( "battery.voltage.low": SensorEntityDescription(
key="battery.voltage.low", key="battery.voltage.low",
@ -296,6 +327,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=ELECTRIC_POTENTIAL_VOLT, native_unit_of_measurement=ELECTRIC_POTENTIAL_VOLT,
device_class=DEVICE_CLASS_VOLTAGE, device_class=DEVICE_CLASS_VOLTAGE,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"battery.voltage.high": SensorEntityDescription( "battery.voltage.high": SensorEntityDescription(
key="battery.voltage.high", key="battery.voltage.high",
@ -303,6 +335,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=ELECTRIC_POTENTIAL_VOLT, native_unit_of_measurement=ELECTRIC_POTENTIAL_VOLT,
device_class=DEVICE_CLASS_VOLTAGE, device_class=DEVICE_CLASS_VOLTAGE,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"battery.capacity": SensorEntityDescription( "battery.capacity": SensorEntityDescription(
key="battery.capacity", key="battery.capacity",
@ -310,6 +343,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement="Ah", native_unit_of_measurement="Ah",
icon="mdi:flash", icon="mdi:flash",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"battery.current": SensorEntityDescription( "battery.current": SensorEntityDescription(
key="battery.current", key="battery.current",
@ -318,6 +352,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
icon="mdi:flash", icon="mdi:flash",
state_class=STATE_CLASS_MEASUREMENT, state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"battery.current.total": SensorEntityDescription( "battery.current.total": SensorEntityDescription(
key="battery.current.total", key="battery.current.total",
@ -325,6 +360,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=ELECTRIC_CURRENT_AMPERE, native_unit_of_measurement=ELECTRIC_CURRENT_AMPERE,
icon="mdi:flash", icon="mdi:flash",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"battery.temperature": SensorEntityDescription( "battery.temperature": SensorEntityDescription(
key="battery.temperature", key="battery.temperature",
@ -333,6 +369,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
device_class=DEVICE_CLASS_TEMPERATURE, device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT, state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"battery.runtime": SensorEntityDescription( "battery.runtime": SensorEntityDescription(
key="battery.runtime", key="battery.runtime",
@ -340,6 +377,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=TIME_SECONDS, native_unit_of_measurement=TIME_SECONDS,
icon="mdi:timer-outline", icon="mdi:timer-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"battery.runtime.low": SensorEntityDescription( "battery.runtime.low": SensorEntityDescription(
key="battery.runtime.low", key="battery.runtime.low",
@ -347,6 +385,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=TIME_SECONDS, native_unit_of_measurement=TIME_SECONDS,
icon="mdi:timer-outline", icon="mdi:timer-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"battery.runtime.restart": SensorEntityDescription( "battery.runtime.restart": SensorEntityDescription(
key="battery.runtime.restart", key="battery.runtime.restart",
@ -354,48 +393,56 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=TIME_SECONDS, native_unit_of_measurement=TIME_SECONDS,
icon="mdi:timer-outline", icon="mdi:timer-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"battery.alarm.threshold": SensorEntityDescription( "battery.alarm.threshold": SensorEntityDescription(
key="battery.alarm.threshold", key="battery.alarm.threshold",
name="Battery Alarm Threshold", name="Battery Alarm Threshold",
icon="mdi:information-outline", icon="mdi:information-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"battery.date": SensorEntityDescription( "battery.date": SensorEntityDescription(
key="battery.date", key="battery.date",
name="Battery Date", name="Battery Date",
icon="mdi:calendar", icon="mdi:calendar",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"battery.mfr.date": SensorEntityDescription( "battery.mfr.date": SensorEntityDescription(
key="battery.mfr.date", key="battery.mfr.date",
name="Battery Manuf. Date", name="Battery Manuf. Date",
icon="mdi:calendar", icon="mdi:calendar",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"battery.packs": SensorEntityDescription( "battery.packs": SensorEntityDescription(
key="battery.packs", key="battery.packs",
name="Number of Batteries", name="Number of Batteries",
icon="mdi:information-outline", icon="mdi:information-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"battery.packs.bad": SensorEntityDescription( "battery.packs.bad": SensorEntityDescription(
key="battery.packs.bad", key="battery.packs.bad",
name="Number of Bad Batteries", name="Number of Bad Batteries",
icon="mdi:information-outline", icon="mdi:information-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"battery.type": SensorEntityDescription( "battery.type": SensorEntityDescription(
key="battery.type", key="battery.type",
name="Battery Chemistry", name="Battery Chemistry",
icon="mdi:information-outline", icon="mdi:information-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"input.sensitivity": SensorEntityDescription( "input.sensitivity": SensorEntityDescription(
key="input.sensitivity", key="input.sensitivity",
name="Input Power Sensitivity", name="Input Power Sensitivity",
icon="mdi:information-outline", icon="mdi:information-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"input.transfer.low": SensorEntityDescription( "input.transfer.low": SensorEntityDescription(
key="input.transfer.low", key="input.transfer.low",
@ -403,6 +450,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=ELECTRIC_POTENTIAL_VOLT, native_unit_of_measurement=ELECTRIC_POTENTIAL_VOLT,
device_class=DEVICE_CLASS_VOLTAGE, device_class=DEVICE_CLASS_VOLTAGE,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"input.transfer.high": SensorEntityDescription( "input.transfer.high": SensorEntityDescription(
key="input.transfer.high", key="input.transfer.high",
@ -410,12 +458,14 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=ELECTRIC_POTENTIAL_VOLT, native_unit_of_measurement=ELECTRIC_POTENTIAL_VOLT,
device_class=DEVICE_CLASS_VOLTAGE, device_class=DEVICE_CLASS_VOLTAGE,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"input.transfer.reason": SensorEntityDescription( "input.transfer.reason": SensorEntityDescription(
key="input.transfer.reason", key="input.transfer.reason",
name="Voltage Transfer Reason", name="Voltage Transfer Reason",
icon="mdi:information-outline", icon="mdi:information-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"input.voltage": SensorEntityDescription( "input.voltage": SensorEntityDescription(
key="input.voltage", key="input.voltage",
@ -430,6 +480,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=ELECTRIC_POTENTIAL_VOLT, native_unit_of_measurement=ELECTRIC_POTENTIAL_VOLT,
device_class=DEVICE_CLASS_VOLTAGE, device_class=DEVICE_CLASS_VOLTAGE,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"input.frequency": SensorEntityDescription( "input.frequency": SensorEntityDescription(
key="input.frequency", key="input.frequency",
@ -438,6 +489,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
icon="mdi:flash", icon="mdi:flash",
state_class=STATE_CLASS_MEASUREMENT, state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"input.frequency.nominal": SensorEntityDescription( "input.frequency.nominal": SensorEntityDescription(
key="input.frequency.nominal", key="input.frequency.nominal",
@ -445,12 +497,14 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=FREQUENCY_HERTZ, native_unit_of_measurement=FREQUENCY_HERTZ,
icon="mdi:flash", icon="mdi:flash",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"input.frequency.status": SensorEntityDescription( "input.frequency.status": SensorEntityDescription(
key="input.frequency.status", key="input.frequency.status",
name="Input Frequency Status", name="Input Frequency Status",
icon="mdi:information-outline", icon="mdi:information-outline",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"output.current": SensorEntityDescription( "output.current": SensorEntityDescription(
key="output.current", key="output.current",
@ -459,6 +513,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
icon="mdi:flash", icon="mdi:flash",
state_class=STATE_CLASS_MEASUREMENT, state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"output.current.nominal": SensorEntityDescription( "output.current.nominal": SensorEntityDescription(
key="output.current.nominal", key="output.current.nominal",
@ -466,6 +521,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=ELECTRIC_CURRENT_AMPERE, native_unit_of_measurement=ELECTRIC_CURRENT_AMPERE,
icon="mdi:flash", icon="mdi:flash",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"output.voltage": SensorEntityDescription( "output.voltage": SensorEntityDescription(
key="output.voltage", key="output.voltage",
@ -480,6 +536,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=ELECTRIC_POTENTIAL_VOLT, native_unit_of_measurement=ELECTRIC_POTENTIAL_VOLT,
device_class=DEVICE_CLASS_VOLTAGE, device_class=DEVICE_CLASS_VOLTAGE,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"output.frequency": SensorEntityDescription( "output.frequency": SensorEntityDescription(
key="output.frequency", key="output.frequency",
@ -488,6 +545,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
icon="mdi:flash", icon="mdi:flash",
state_class=STATE_CLASS_MEASUREMENT, state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"output.frequency.nominal": SensorEntityDescription( "output.frequency.nominal": SensorEntityDescription(
key="output.frequency.nominal", key="output.frequency.nominal",
@ -495,6 +553,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
native_unit_of_measurement=FREQUENCY_HERTZ, native_unit_of_measurement=FREQUENCY_HERTZ,
icon="mdi:flash", icon="mdi:flash",
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ambient.humidity": SensorEntityDescription( "ambient.humidity": SensorEntityDescription(
key="ambient.humidity", key="ambient.humidity",
@ -503,6 +562,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
device_class=DEVICE_CLASS_HUMIDITY, device_class=DEVICE_CLASS_HUMIDITY,
state_class=STATE_CLASS_MEASUREMENT, state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"ambient.temperature": SensorEntityDescription( "ambient.temperature": SensorEntityDescription(
key="ambient.temperature", key="ambient.temperature",
@ -511,6 +571,7 @@ SENSOR_TYPES: Final[dict[str, SensorEntityDescription]] = {
device_class=DEVICE_CLASS_TEMPERATURE, device_class=DEVICE_CLASS_TEMPERATURE,
state_class=STATE_CLASS_MEASUREMENT, state_class=STATE_CLASS_MEASUREMENT,
entity_category=ENTITY_CATEGORY_DIAGNOSTIC, entity_category=ENTITY_CATEGORY_DIAGNOSTIC,
entity_registry_enabled_default=False,
), ),
"watts": SensorEntityDescription( "watts": SensorEntityDescription(
key="watts", key="watts",

View File

@ -5,7 +5,7 @@ import logging
from homeassistant.components.nut import PyNUTData from homeassistant.components.nut import PyNUTData
from homeassistant.components.sensor import SensorEntity, SensorEntityDescription from homeassistant.components.sensor import SensorEntity, SensorEntityDescription
from homeassistant.const import CONF_RESOURCES, STATE_UNKNOWN from homeassistant.const import STATE_UNKNOWN
from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.update_coordinator import ( from homeassistant.helpers.update_coordinator import (
CoordinatorEntity, CoordinatorEntity,
@ -35,9 +35,6 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
unique_id = pynut_data[PYNUT_UNIQUE_ID] unique_id = pynut_data[PYNUT_UNIQUE_ID]
status = coordinator.data status = coordinator.data
enabled_resources = [
resource.lower() for resource in config_entry.data[CONF_RESOURCES]
]
resources = [sensor_id for sensor_id in SENSOR_TYPES if sensor_id in status] resources = [sensor_id for sensor_id in SENSOR_TYPES if sensor_id in status]
# Display status is a special case that falls back to the status value # Display status is a special case that falls back to the status value
# of the UPS instead. # of the UPS instead.
@ -50,7 +47,6 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
SENSOR_TYPES[sensor_type], SENSOR_TYPES[sensor_type],
data, data,
unique_id, unique_id,
sensor_type in enabled_resources,
) )
for sensor_type in resources for sensor_type in resources
] ]
@ -67,14 +63,12 @@ class NUTSensor(CoordinatorEntity, SensorEntity):
sensor_description: SensorEntityDescription, sensor_description: SensorEntityDescription,
data: PyNUTData, data: PyNUTData,
unique_id: str, unique_id: str,
enabled_default: bool,
) -> None: ) -> None:
"""Initialize the sensor.""" """Initialize the sensor."""
super().__init__(coordinator) super().__init__(coordinator)
self.entity_description = sensor_description self.entity_description = sensor_description
device_name = data.name.title() device_name = data.name.title()
self._attr_entity_registry_enabled_default = enabled_default
self._attr_name = f"{device_name} {sensor_description.name}" self._attr_name = f"{device_name} {sensor_description.name}"
self._attr_unique_id = f"{unique_id}_{sensor_description.key}" self._attr_unique_id = f"{unique_id}_{sensor_description.key}"
self._attr_device_info = DeviceInfo( self._attr_device_info = DeviceInfo(

View File

@ -16,12 +16,6 @@
"alias": "Alias", "alias": "Alias",
"resources": "Resources" "resources": "Resources"
} }
},
"resources": {
"title": "Choose the Resources to Monitor",
"data": {
"resources": "Resources"
}
} }
}, },
"error": { "error": {

View File

@ -1,19 +1,14 @@
{ {
"config": { "config": {
"abort": { "abort": {
"already_configured": "Device is already configured" "already_configured": "Device is already configured",
"resources_not_available": "No known resources found"
}, },
"error": { "error": {
"cannot_connect": "Failed to connect", "cannot_connect": "Failed to connect",
"unknown": "Unexpected error" "unknown": "Unexpected error"
}, },
"step": { "step": {
"resources": {
"data": {
"resources": "Resources"
},
"title": "Choose the Resources to Monitor"
},
"ups": { "ups": {
"data": { "data": {
"alias": "Alias", "alias": "Alias",
@ -33,17 +28,11 @@
} }
}, },
"options": { "options": {
"error": {
"cannot_connect": "Failed to connect",
"unknown": "Unexpected error"
},
"step": { "step": {
"init": { "init": {
"data": { "data": {
"resources": "Resources",
"scan_interval": "Scan Interval (seconds)" "scan_interval": "Scan Interval (seconds)"
}, }
"description": "Choose Sensor Resources."
} }
} }
} }

View File

@ -44,18 +44,6 @@ async def test_form_zeroconf(hass):
list_vars={"battery.voltage": "voltage", "ups.status": "OL"}, list_ups=["ups1"] list_vars={"battery.voltage": "voltage", "ups.status": "OL"}, list_ups=["ups1"]
) )
with patch(
"homeassistant.components.nut.PyNUTClient",
return_value=mock_pynut,
):
result2 = await hass.config_entries.flow.async_configure(
result["flow_id"],
{CONF_USERNAME: "test-username", CONF_PASSWORD: "test-password"},
)
assert result2["step_id"] == "resources"
assert result2["type"] == data_entry_flow.RESULT_TYPE_FORM
with patch( with patch(
"homeassistant.components.nut.PyNUTClient", "homeassistant.components.nut.PyNUTClient",
return_value=mock_pynut, return_value=mock_pynut,
@ -63,22 +51,21 @@ async def test_form_zeroconf(hass):
"homeassistant.components.nut.async_setup_entry", "homeassistant.components.nut.async_setup_entry",
return_value=True, return_value=True,
) as mock_setup_entry: ) as mock_setup_entry:
result3 = await hass.config_entries.flow.async_configure( result2 = await hass.config_entries.flow.async_configure(
result2["flow_id"], result["flow_id"],
{CONF_RESOURCES: ["battery.voltage", "ups.status", "ups.status.display"]}, {CONF_USERNAME: "test-username", CONF_PASSWORD: "test-password"},
) )
await hass.async_block_till_done() await hass.async_block_till_done()
assert result3["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY assert result2["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
assert result3["title"] == "192.168.1.5:1234" assert result2["title"] == "192.168.1.5:1234"
assert result3["data"] == { assert result2["data"] == {
CONF_HOST: "192.168.1.5", CONF_HOST: "192.168.1.5",
CONF_PASSWORD: "test-password", CONF_PASSWORD: "test-password",
CONF_PORT: 1234, CONF_PORT: 1234,
CONF_RESOURCES: ["battery.voltage", "ups.status", "ups.status.display"],
CONF_USERNAME: "test-username", CONF_USERNAME: "test-username",
} }
assert result3["result"].unique_id is None assert result2["result"].unique_id is None
assert len(mock_setup_entry.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1
@ -98,7 +85,10 @@ async def test_form_user_one_ups(hass):
with patch( with patch(
"homeassistant.components.nut.PyNUTClient", "homeassistant.components.nut.PyNUTClient",
return_value=mock_pynut, return_value=mock_pynut,
): ), patch(
"homeassistant.components.nut.async_setup_entry",
return_value=True,
) as mock_setup_entry:
result2 = await hass.config_entries.flow.async_configure( result2 = await hass.config_entries.flow.async_configure(
result["flow_id"], result["flow_id"],
{ {
@ -108,30 +98,14 @@ async def test_form_user_one_ups(hass):
CONF_PORT: 2222, CONF_PORT: 2222,
}, },
) )
assert result2["step_id"] == "resources"
assert result2["type"] == data_entry_flow.RESULT_TYPE_FORM
with patch(
"homeassistant.components.nut.PyNUTClient",
return_value=mock_pynut,
), patch(
"homeassistant.components.nut.async_setup_entry",
return_value=True,
) as mock_setup_entry:
result3 = await hass.config_entries.flow.async_configure(
result2["flow_id"],
{CONF_RESOURCES: ["battery.voltage", "ups.status", "ups.status.display"]},
)
await hass.async_block_till_done() await hass.async_block_till_done()
assert result3["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY assert result2["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
assert result3["title"] == "1.1.1.1:2222" assert result2["title"] == "1.1.1.1:2222"
assert result3["data"] == { assert result2["data"] == {
CONF_HOST: "1.1.1.1", CONF_HOST: "1.1.1.1",
CONF_PASSWORD: "test-password", CONF_PASSWORD: "test-password",
CONF_PORT: 2222, CONF_PORT: 2222,
CONF_RESOURCES: ["battery.voltage", "ups.status", "ups.status.display"],
CONF_USERNAME: "test-username", CONF_USERNAME: "test-username",
} }
assert len(mock_setup_entry.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1
@ -175,18 +149,6 @@ async def test_form_user_multiple_ups(hass):
assert result2["step_id"] == "ups" assert result2["step_id"] == "ups"
assert result2["type"] == data_entry_flow.RESULT_TYPE_FORM assert result2["type"] == data_entry_flow.RESULT_TYPE_FORM
with patch(
"homeassistant.components.nut.PyNUTClient",
return_value=mock_pynut,
):
result3 = await hass.config_entries.flow.async_configure(
result2["flow_id"],
{CONF_ALIAS: "ups2"},
)
assert result3["step_id"] == "resources"
assert result3["type"] == data_entry_flow.RESULT_TYPE_FORM
with patch( with patch(
"homeassistant.components.nut.PyNUTClient", "homeassistant.components.nut.PyNUTClient",
return_value=mock_pynut, return_value=mock_pynut,
@ -194,20 +156,19 @@ async def test_form_user_multiple_ups(hass):
"homeassistant.components.nut.async_setup_entry", "homeassistant.components.nut.async_setup_entry",
return_value=True, return_value=True,
) as mock_setup_entry: ) as mock_setup_entry:
result4 = await hass.config_entries.flow.async_configure( result3 = await hass.config_entries.flow.async_configure(
result3["flow_id"], result2["flow_id"],
{CONF_RESOURCES: ["battery.voltage"]}, {CONF_ALIAS: "ups2"},
) )
await hass.async_block_till_done() await hass.async_block_till_done()
assert result4["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY assert result3["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
assert result4["title"] == "ups2@1.1.1.1:2222" assert result3["title"] == "ups2@1.1.1.1:2222"
assert result4["data"] == { assert result3["data"] == {
CONF_HOST: "1.1.1.1", CONF_HOST: "1.1.1.1",
CONF_PASSWORD: "test-password", CONF_PASSWORD: "test-password",
CONF_ALIAS: "ups2", CONF_ALIAS: "ups2",
CONF_PORT: 2222, CONF_PORT: 2222,
CONF_RESOURCES: ["battery.voltage"],
CONF_USERNAME: "test-username", CONF_USERNAME: "test-username",
} }
assert len(mock_setup_entry.mock_calls) == 2 assert len(mock_setup_entry.mock_calls) == 2
@ -234,7 +195,10 @@ async def test_form_user_one_ups_with_ignored_entry(hass):
with patch( with patch(
"homeassistant.components.nut.PyNUTClient", "homeassistant.components.nut.PyNUTClient",
return_value=mock_pynut, return_value=mock_pynut,
): ), patch(
"homeassistant.components.nut.async_setup_entry",
return_value=True,
) as mock_setup_entry:
result2 = await hass.config_entries.flow.async_configure( result2 = await hass.config_entries.flow.async_configure(
result["flow_id"], result["flow_id"],
{ {
@ -244,30 +208,14 @@ async def test_form_user_one_ups_with_ignored_entry(hass):
CONF_PORT: 2222, CONF_PORT: 2222,
}, },
) )
assert result2["step_id"] == "resources"
assert result2["type"] == data_entry_flow.RESULT_TYPE_FORM
with patch(
"homeassistant.components.nut.PyNUTClient",
return_value=mock_pynut,
), patch(
"homeassistant.components.nut.async_setup_entry",
return_value=True,
) as mock_setup_entry:
result3 = await hass.config_entries.flow.async_configure(
result2["flow_id"],
{CONF_RESOURCES: ["battery.voltage", "ups.status", "ups.status.display"]},
)
await hass.async_block_till_done() await hass.async_block_till_done()
assert result3["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY assert result2["type"] == data_entry_flow.RESULT_TYPE_CREATE_ENTRY
assert result3["title"] == "1.1.1.1:2222" assert result2["title"] == "1.1.1.1:2222"
assert result3["data"] == { assert result2["data"] == {
CONF_HOST: "1.1.1.1", CONF_HOST: "1.1.1.1",
CONF_PASSWORD: "test-password", CONF_PASSWORD: "test-password",
CONF_PORT: 2222, CONF_PORT: 2222,
CONF_RESOURCES: ["battery.voltage", "ups.status", "ups.status.display"],
CONF_USERNAME: "test-username", CONF_USERNAME: "test-username",
} }
assert len(mock_setup_entry.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1

View File

@ -3,7 +3,7 @@ from unittest.mock import patch
from homeassistant.components.nut.const import DOMAIN from homeassistant.components.nut.const import DOMAIN
from homeassistant.config_entries import ConfigEntryState from homeassistant.config_entries import ConfigEntryState
from homeassistant.const import CONF_HOST, CONF_PORT, CONF_RESOURCES, STATE_UNAVAILABLE from homeassistant.const import CONF_HOST, CONF_PORT, STATE_UNAVAILABLE
from .util import _get_mock_pynutclient from .util import _get_mock_pynutclient
@ -14,11 +14,7 @@ async def test_async_setup_entry(hass):
"""Test a successful setup entry.""" """Test a successful setup entry."""
entry = MockConfigEntry( entry = MockConfigEntry(
domain=DOMAIN, domain=DOMAIN,
data={ data={CONF_HOST: "mock", CONF_PORT: "mock"},
CONF_HOST: "mock",
CONF_PORT: "mock",
CONF_RESOURCES: ["ups.status"],
},
) )
entry.add_to_hass(hass) entry.add_to_hass(hass)
@ -52,11 +48,7 @@ async def test_config_not_ready(hass):
"""Test for setup failure if connection to broker is missing.""" """Test for setup failure if connection to broker is missing."""
entry = MockConfigEntry( entry = MockConfigEntry(
domain=DOMAIN, domain=DOMAIN,
data={ data={CONF_HOST: "mock", CONF_PORT: "mock"},
CONF_HOST: "mock",
CONF_PORT: "mock",
CONF_RESOURCES: ["ups.status"],
},
) )
entry.add_to_hass(hass) entry.add_to_hass(hass)

View File

@ -20,7 +20,7 @@ from tests.common import MockConfigEntry
async def test_pr3000rt2u(hass): async def test_pr3000rt2u(hass):
"""Test creation of PR3000RT2U sensors.""" """Test creation of PR3000RT2U sensors."""
await async_init_integration(hass, "PR3000RT2U", ["battery.charge"]) await async_init_integration(hass, "PR3000RT2U")
registry = er.async_get(hass) registry = er.async_get(hass)
entry = registry.async_get("sensor.ups1_battery_charge") entry = registry.async_get("sensor.ups1_battery_charge")
assert entry assert entry
@ -44,7 +44,7 @@ async def test_pr3000rt2u(hass):
async def test_cp1350c(hass): async def test_cp1350c(hass):
"""Test creation of CP1350C sensors.""" """Test creation of CP1350C sensors."""
config_entry = await async_init_integration(hass, "CP1350C", ["battery.charge"]) config_entry = await async_init_integration(hass, "CP1350C")
registry = er.async_get(hass) registry = er.async_get(hass)
entry = registry.async_get("sensor.ups1_battery_charge") entry = registry.async_get("sensor.ups1_battery_charge")
@ -69,7 +69,7 @@ async def test_cp1350c(hass):
async def test_5e850i(hass): async def test_5e850i(hass):
"""Test creation of 5E850I sensors.""" """Test creation of 5E850I sensors."""
config_entry = await async_init_integration(hass, "5E850I", ["battery.charge"]) config_entry = await async_init_integration(hass, "5E850I")
registry = er.async_get(hass) registry = er.async_get(hass)
entry = registry.async_get("sensor.ups1_battery_charge") entry = registry.async_get("sensor.ups1_battery_charge")
assert entry assert entry
@ -93,7 +93,7 @@ async def test_5e850i(hass):
async def test_5e650i(hass): async def test_5e650i(hass):
"""Test creation of 5E650I sensors.""" """Test creation of 5E650I sensors."""
config_entry = await async_init_integration(hass, "5E650I", ["battery.charge"]) config_entry = await async_init_integration(hass, "5E650I")
registry = er.async_get(hass) registry = er.async_get(hass)
entry = registry.async_get("sensor.ups1_battery_charge") entry = registry.async_get("sensor.ups1_battery_charge")
assert entry assert entry
@ -117,7 +117,7 @@ async def test_5e650i(hass):
async def test_backupsses600m1(hass): async def test_backupsses600m1(hass):
"""Test creation of BACKUPSES600M1 sensors.""" """Test creation of BACKUPSES600M1 sensors."""
await async_init_integration(hass, "BACKUPSES600M1", ["battery.charge"]) await async_init_integration(hass, "BACKUPSES600M1")
registry = er.async_get(hass) registry = er.async_get(hass)
entry = registry.async_get("sensor.ups1_battery_charge") entry = registry.async_get("sensor.ups1_battery_charge")
assert entry assert entry
@ -144,9 +144,7 @@ async def test_backupsses600m1(hass):
async def test_cp1500pfclcd(hass): async def test_cp1500pfclcd(hass):
"""Test creation of CP1500PFCLCD sensors.""" """Test creation of CP1500PFCLCD sensors."""
config_entry = await async_init_integration( config_entry = await async_init_integration(hass, "CP1500PFCLCD")
hass, "CP1500PFCLCD", ["battery.charge"]
)
registry = er.async_get(hass) registry = er.async_get(hass)
entry = registry.async_get("sensor.ups1_battery_charge") entry = registry.async_get("sensor.ups1_battery_charge")
assert entry assert entry
@ -170,7 +168,7 @@ async def test_cp1500pfclcd(hass):
async def test_dl650elcd(hass): async def test_dl650elcd(hass):
"""Test creation of DL650ELCD sensors.""" """Test creation of DL650ELCD sensors."""
config_entry = await async_init_integration(hass, "DL650ELCD", ["battery.charge"]) config_entry = await async_init_integration(hass, "DL650ELCD")
registry = er.async_get(hass) registry = er.async_get(hass)
entry = registry.async_get("sensor.ups1_battery_charge") entry = registry.async_get("sensor.ups1_battery_charge")
assert entry assert entry
@ -194,7 +192,7 @@ async def test_dl650elcd(hass):
async def test_blazer_usb(hass): async def test_blazer_usb(hass):
"""Test creation of blazer_usb sensors.""" """Test creation of blazer_usb sensors."""
config_entry = await async_init_integration(hass, "blazer_usb", ["battery.charge"]) config_entry = await async_init_integration(hass, "blazer_usb")
registry = er.async_get(hass) registry = er.async_get(hass)
entry = registry.async_get("sensor.ups1_battery_charge") entry = registry.async_get("sensor.ups1_battery_charge")
assert entry assert entry
@ -219,11 +217,7 @@ async def test_state_sensors(hass):
"""Test creation of status display sensors.""" """Test creation of status display sensors."""
entry = MockConfigEntry( entry = MockConfigEntry(
domain=DOMAIN, domain=DOMAIN,
data={ data={CONF_HOST: "mock", CONF_PORT: "mock"},
CONF_HOST: "mock",
CONF_PORT: "mock",
CONF_RESOURCES: ["ups.status", "ups.status.display"],
},
) )
entry.add_to_hass(hass) entry.add_to_hass(hass)
@ -248,11 +242,7 @@ async def test_unknown_state_sensors(hass):
"""Test creation of unknown status display sensors.""" """Test creation of unknown status display sensors."""
entry = MockConfigEntry( entry = MockConfigEntry(
domain=DOMAIN, domain=DOMAIN,
data={ data={CONF_HOST: "mock", CONF_PORT: "mock"},
CONF_HOST: "mock",
CONF_PORT: "mock",
CONF_RESOURCES: ["ups.status", "ups.status.display"],
},
) )
entry.add_to_hass(hass) entry.add_to_hass(hass)
@ -275,12 +265,34 @@ async def test_unknown_state_sensors(hass):
async def test_stale_options(hass): async def test_stale_options(hass):
"""Test creation of sensors with stale options to remove.""" """Test creation of sensors with stale options to remove."""
config_entry = MockConfigEntry(
config_entry = await async_init_integration( domain=DOMAIN,
hass, "blazer_usb", ["battery.charge"], True data={
CONF_HOST: "mock",
CONF_PORT: "mock",
CONF_RESOURCES: ["battery.charge"],
},
options={CONF_RESOURCES: ["battery.charge"]},
) )
registry = er.async_get(hass) config_entry.add_to_hass(hass)
entry = registry.async_get("sensor.ups1_battery_charge")
assert entry mock_pynut = _get_mock_pynutclient(
assert entry.unique_id == f"{config_entry.entry_id}_battery.charge" list_ups={"ups1": "UPS 1"}, list_vars={"battery.charge": "10"}
assert config_entry.options == {} )
with patch(
"homeassistant.components.nut.PyNUTClient",
return_value=mock_pynut,
):
await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
registry = er.async_get(hass)
entry = registry.async_get("sensor.ups1_battery_charge")
assert entry
assert entry.unique_id == f"{config_entry.entry_id}_battery.charge"
assert CONF_RESOURCES not in config_entry.data
assert config_entry.options == {}
state = hass.states.get("sensor.ups1_battery_charge")
assert state.state == "10"

View File

@ -4,7 +4,7 @@ import json
from unittest.mock import MagicMock, patch from unittest.mock import MagicMock, patch
from homeassistant.components.nut.const import DOMAIN from homeassistant.components.nut.const import DOMAIN
from homeassistant.const import CONF_HOST, CONF_PORT, CONF_RESOURCES from homeassistant.const import CONF_HOST, CONF_PORT
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from tests.common import MockConfigEntry, load_fixture from tests.common import MockConfigEntry, load_fixture
@ -18,7 +18,7 @@ def _get_mock_pynutclient(list_vars=None, list_ups=None):
async def async_init_integration( async def async_init_integration(
hass: HomeAssistant, ups_fixture: str, resources: list, add_options: bool = False hass: HomeAssistant, ups_fixture: str
) -> MockConfigEntry: ) -> MockConfigEntry:
"""Set up the nexia integration in Home Assistant.""" """Set up the nexia integration in Home Assistant."""
@ -33,8 +33,7 @@ async def async_init_integration(
): ):
entry = MockConfigEntry( entry = MockConfigEntry(
domain=DOMAIN, domain=DOMAIN,
data={CONF_HOST: "mock", CONF_PORT: "mock", CONF_RESOURCES: resources}, data={CONF_HOST: "mock", CONF_PORT: "mock"},
options={CONF_RESOURCES: resources} if add_options else {},
) )
entry.add_to_hass(hass) entry.add_to_hass(hass)