Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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"
}