Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions homeassistant/components/nut/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
DEFAULT_HOST,
DEFAULT_PORT,
DEFAULT_SCAN_INTERVAL,
KEY_STATUS,
KEY_STATUS_DISPLAY,
SENSOR_NAME,
SENSOR_TYPES,
)
Expand Down Expand Up @@ -53,6 +55,11 @@ def _resource_schema_base(available_resources, selected_resources):
if sensor_id in available_resources
}

if KEY_STATUS in known_available_resources:
known_available_resources[KEY_STATUS_DISPLAY] = SENSOR_TYPES[
KEY_STATUS_DISPLAY
][SENSOR_NAME]

return {
vol.Required(CONF_RESOURCES, default=selected_resources): cv.multi_select(
known_available_resources
Expand Down
17 changes: 13 additions & 4 deletions tests/components/nut/test_config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ async def test_form_user_one_ups(hass):
assert result["errors"] == {}

mock_pynut = _get_mock_pynutclient(
list_vars={"battery.voltage": "voltage"}, list_ups=["ups1"]
list_vars={"battery.voltage": "voltage", "ups.status": "OL"}, list_ups=["ups1"]
)

with patch(
Expand All @@ -54,7 +54,8 @@ async def test_form_user_one_ups(hass):
"homeassistant.components.nut.async_setup_entry", return_value=True,
) as mock_setup_entry:
result3 = await hass.config_entries.flow.async_configure(
result2["flow_id"], {"resources": ["battery.voltage"]},
result2["flow_id"],
{"resources": ["battery.voltage", "ups.status", "ups.status.display"]},
)

assert result3["type"] == "create_entry"
Expand All @@ -63,7 +64,7 @@ async def test_form_user_one_ups(hass):
"host": "1.1.1.1",
"password": "test-password",
"port": 2222,
"resources": ["battery.voltage"],
"resources": ["battery.voltage", "ups.status", "ups.status.display"],
"username": "test-username",
}
await hass.async_block_till_done()
Expand All @@ -74,6 +75,14 @@ async def test_form_user_one_ups(hass):
async def test_form_user_multiple_ups(hass):
"""Test we get the form."""
await setup.async_setup_component(hass, "persistent_notification", {})

config_entry = MockConfigEntry(
domain=DOMAIN,
data={"host": "2.2.2.2", "port": 123, "resources": ["battery.charge"]},
options={CONF_RESOURCES: ["battery.charge"]},
)
config_entry.add_to_hass(hass)

result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": config_entries.SOURCE_USER}
)
Expand Down Expand Up @@ -134,7 +143,7 @@ async def test_form_user_multiple_ups(hass):
}
await hass.async_block_till_done()
assert len(mock_setup.mock_calls) == 1
assert len(mock_setup_entry.mock_calls) == 1
assert len(mock_setup_entry.mock_calls) == 2


async def test_form_import(hass):
Expand Down
75 changes: 75 additions & 0 deletions tests/components/nut/test_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,31 @@ async def test_5e850i(hass):
)


async def test_5e650i(hass):
"""Test creation of 5E650I sensors."""

await async_init_integration(hass, "5E650I", ["battery.charge"])
registry = await hass.helpers.entity_registry.async_get_registry()
entry = registry.async_get("sensor.ups1_battery_charge")
# No unique id, no registry entry
assert not entry

state = hass.states.get("sensor.ups1_battery_charge")
assert state.state == "100"

expected_attributes = {
"device_class": "battery",
"friendly_name": "Ups1 Battery Charge",
"state": "Online Battery Charging",
"unit_of_measurement": "%",
}
# Only test for a subset of attributes in case
# HA changes the implementation and a new one appears
assert all(
state.attributes[key] == expected_attributes[key] for key in expected_attributes
)


async def test_backupsses600m1(hass):
"""Test creation of BACKUPSES600M1 sensors."""

Expand Down Expand Up @@ -132,3 +157,53 @@ async def test_cp1500pfclcd(hass):
assert all(
state.attributes[key] == expected_attributes[key] for key in expected_attributes
)


async def test_dl650elcd(hass):
"""Test creation of DL650ELCD sensors."""

await async_init_integration(hass, "DL650ELCD", ["battery.charge"])
registry = await hass.helpers.entity_registry.async_get_registry()
entry = registry.async_get("sensor.ups1_battery_charge")
# No unique id, no registry entry
assert not entry

state = hass.states.get("sensor.ups1_battery_charge")
assert state.state == "100"

expected_attributes = {
"device_class": "battery",
"friendly_name": "Ups1 Battery Charge",
"state": "Online",
"unit_of_measurement": UNIT_PERCENTAGE,
}
# Only test for a subset of attributes in case
# HA changes the implementation and a new one appears
assert all(
state.attributes[key] == expected_attributes[key] for key in expected_attributes
)


async def test_blazer_usb(hass):
"""Test creation of blazer_usb sensors."""

await async_init_integration(hass, "blazer_usb", ["battery.charge"])
registry = await hass.helpers.entity_registry.async_get_registry()
entry = registry.async_get("sensor.ups1_battery_charge")
# No unique id, no registry entry
assert not entry

state = hass.states.get("sensor.ups1_battery_charge")
assert state.state == "100"

expected_attributes = {
"device_class": "battery",
"friendly_name": "Ups1 Battery Charge",
"state": "Online",
"unit_of_measurement": UNIT_PERCENTAGE,
}
# Only test for a subset of attributes in case
# HA changes the implementation and a new one appears
assert all(
state.attributes[key] == expected_attributes[key] for key in expected_attributes
)
36 changes: 36 additions & 0 deletions tests/fixtures/nut/5E650I.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{
"driver.version.internal" : "0.38",
"outlet.switchable" : "no",
"driver.parameter.port" : "auto",
"device.model" : "5E 650i",
"ups.model" : "5E 650i",
"driver.parameter.pollfreq" : "30",
"ups.timer.shutdown" : "-1",
"ups.productid" : "ffff",
"ups.load" : "28",
"ups.delay.shutdown" : "20",
"ups.power.nominal" : "650",
"output.voltage.nominal" : "230",
"outlet.1.status" : "on",
"battery.type" : "PbAc",
"driver.version.data" : "MGE HID 1.33",
"ups.vendorid" : "0463",
"driver.parameter.pollinterval" : "5",
"ups.status" : "OL CHRG",
"driver.version" : "DSM6-2-2-24922-broadwell-fmp-repack-24922-190507",
"ups.firmware" : "03.08.0018",
"ups.start.battery" : "yes",
"output.frequency.nominal" : "50",
"battery.charge" : "100",
"outlet.id" : "1",
"output.frequency" : "49.9",
"driver.name" : "usbhid-ups",
"battery.runtime" : "1032",
"input.voltage" : "239.0",
"ups.beeper.status" : "enabled",
"device.mfr" : "EATON",
"device.type" : "ups",
"ups.mfr" : "EATON",
"output.voltage" : "238.0",
"outlet.desc" : "Main Outlet"
}
39 changes: 39 additions & 0 deletions tests/fixtures/nut/DL650ELCD.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
{
"ups.delay.shutdown" : "20",
"battery.charge.warning" : "20",
"battery.runtime.low" : "300",
"device.type" : "ups",
"ups.load" : "33",
"driver.parameter.port" : "auto",
"driver.name" : "usbhid-ups",
"input.transfer.high" : "0",
"ups.mfr" : "CPS",
"ups.test.result" : "No test initiated",
"output.voltage" : "229.0",
"ups.vendorid" : "0764",
"ups.realpower.nominal" : "360",
"device.model" : "DL650ELCD",
"battery.voltage.nominal" : "12",
"battery.type" : "PbAcid",
"ups.model" : "DL650ELCD",
"ups.beeper.status" : "enabled",
"driver.version.data" : "CyberPower HID 0.3",
"device.mfr" : "CPS",
"driver.parameter.pollinterval" : "5",
"ups.status" : "OL",
"battery.mfr.date" : "CPS",
"battery.charge.low" : "10",
"input.voltage" : "230.0",
"driver.version" : "SDS5-2-2015Q1branch-5619-150904",
"input.transfer.low" : "0",
"driver.parameter.pollfreq" : "30",
"driver.version.internal" : "0.38",
"ups.productid" : "0501",
"ups.timer.shutdown" : "-60",
"input.voltage.nominal" : "230",
"battery.voltage" : "9.1",
"battery.charge" : "100",
"ups.timer.start" : "-60",
"battery.runtime" : "850",
"ups.delay.start" : "30"
}
28 changes: 28 additions & 0 deletions tests/fixtures/nut/blazer_usb.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"input.voltage.fault" : "228.4",
"ups.status" : "OL",
"ups.productid" : "0000",
"ups.beeper.status" : "enabled",
"input.current.nominal" : "4.0",
"driver.name" : "blazer_usb",
"input.voltage" : "228.4",
"battery.voltage.low" : "20.80",
"battery.charge" : "100",
"driver.version.internal" : "0.11",
"input.frequency.nominal" : "50",
"battery.voltage.high" : "26.00",
"driver.parameter.port" : "auto",
"ups.type" : "offline / line interactive",
"driver.parameter.pollinterval" : "5",
"device.type" : "ups",
"output.voltage" : "228.4",
"input.frequency" : "50.1",
"input.voltage.nominal" : "230",
"ups.delay.shutdown" : "30",
"battery.voltage.nominal" : "24.0",
"ups.load" : "7",
"driver.version" : "DSM6-2-2-24922-broadwell-fmp-repack-24922-190507",
"ups.vendorid" : "0001",
"battery.voltage" : "27.00",
"ups.delay.start" : "180"
}