mirror of
https://github.com/home-assistant/core.git
synced 2025-12-20 14:58:50 +00:00
Compare commits
9 Commits
add_numeri
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
14cb8af9fe | ||
|
|
74ae0f8297 | ||
|
|
3050a5c896 | ||
|
|
9f886e66c7 | ||
|
|
3c752d4516 | ||
|
|
e4bfdf5b30 | ||
|
|
3e43424a73 | ||
|
|
0db9dcfd1c | ||
|
|
5b5850224a |
2
CODEOWNERS
generated
2
CODEOWNERS
generated
@@ -794,6 +794,8 @@ build.json @home-assistant/supervisor
|
||||
/tests/components/intellifire/ @jeeftor
|
||||
/homeassistant/components/intent/ @home-assistant/core @synesthesiam @arturpragacz
|
||||
/tests/components/intent/ @home-assistant/core @synesthesiam @arturpragacz
|
||||
/homeassistant/components/intent_script/ @arturpragacz
|
||||
/tests/components/intent_script/ @arturpragacz
|
||||
/homeassistant/components/intesishome/ @jnimmo
|
||||
/homeassistant/components/iometer/ @jukrebs
|
||||
/tests/components/iometer/ @jukrebs
|
||||
|
||||
@@ -30,5 +30,5 @@
|
||||
"integration_type": "hub",
|
||||
"iot_class": "cloud_push",
|
||||
"loggers": ["pubnub", "yalexs"],
|
||||
"requirements": ["yalexs==9.2.0", "yalexs-ble==3.2.2"]
|
||||
"requirements": ["yalexs==9.2.0", "yalexs-ble==3.2.4"]
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ async def async_register_dynalite_frontend(hass: HomeAssistant):
|
||||
frontend_url_path=DOMAIN,
|
||||
config_panel_domain=DOMAIN,
|
||||
webcomponent_name="dynalite-panel",
|
||||
module_url=f"{URL_BASE}/entrypoint-{build_id}.js",
|
||||
module_url=f"{URL_BASE}/entrypoint.{build_id}.js",
|
||||
embed_iframe=True,
|
||||
require_admin=True,
|
||||
)
|
||||
|
||||
@@ -70,6 +70,16 @@ async def async_setup_entry(hass: HomeAssistant, entry: HikvisionConfigEntry) ->
|
||||
device_type=device_type,
|
||||
)
|
||||
|
||||
# For NVRs or devices with no detected events, try to fetch events from ISAPI
|
||||
if device_type == "NVR" or not camera.current_event_states:
|
||||
|
||||
def fetch_and_inject_nvr_events() -> None:
|
||||
"""Fetch and inject NVR events in a single executor job."""
|
||||
if nvr_events := camera.get_event_triggers(None):
|
||||
camera.inject_events(nvr_events)
|
||||
|
||||
await hass.async_add_executor_job(fetch_and_inject_nvr_events)
|
||||
|
||||
# Start the event stream
|
||||
await hass.async_add_executor_job(camera.start_stream)
|
||||
|
||||
|
||||
@@ -107,7 +107,7 @@ async def async_register_insteon_frontend(hass: HomeAssistant):
|
||||
frontend_url_path=DOMAIN,
|
||||
webcomponent_name="insteon-frontend",
|
||||
config_panel_domain=DOMAIN,
|
||||
module_url=f"{URL_BASE}/entrypoint-{build_id}.js",
|
||||
module_url=f"{URL_BASE}/entrypoint.{build_id}.js",
|
||||
embed_iframe=True,
|
||||
require_admin=True,
|
||||
)
|
||||
|
||||
@@ -282,6 +282,8 @@ async def websocket_reset_properties(
|
||||
notify_device_not_found(connection, msg, INSTEON_DEVICE_NOT_FOUND)
|
||||
return
|
||||
|
||||
for prop in device.configuration.values():
|
||||
prop.new_value = None
|
||||
for prop in device.operating_flags:
|
||||
device.operating_flags[prop].new_value = None
|
||||
for prop in device.properties:
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
"loggers": ["pyinsteon", "pypubsub"],
|
||||
"requirements": [
|
||||
"pyinsteon==1.6.4",
|
||||
"insteon-frontend-home-assistant==0.5.0"
|
||||
"insteon-frontend-home-assistant==0.6.0"
|
||||
],
|
||||
"single_config_entry": true,
|
||||
"usb": [
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"domain": "intent_script",
|
||||
"name": "Intent Script",
|
||||
"codeowners": [],
|
||||
"codeowners": ["@arturpragacz"],
|
||||
"documentation": "https://www.home-assistant.io/integrations/intent_script",
|
||||
"quality_scale": "internal"
|
||||
}
|
||||
|
||||
@@ -187,7 +187,7 @@
|
||||
"8_005": "[%key:component::knx::config_panel::dpt::options::8_002%]",
|
||||
"8_006": "[%key:component::knx::config_panel::dpt::options::8_002%]",
|
||||
"8_007": "[%key:component::knx::config_panel::dpt::options::8_002%]",
|
||||
"8_010": "Percent (-327,68 … 327,67)",
|
||||
"8_010": "Percent (-327.68 … 327.67)",
|
||||
"8_011": "Rotation angle",
|
||||
"8_012": "Length (Altitude)",
|
||||
"9": "Generic 2-byte floating point",
|
||||
@@ -1061,7 +1061,7 @@
|
||||
"name": "[%key:component::knx::services::send::fields::address::name%]"
|
||||
},
|
||||
"attribute": {
|
||||
"description": "Attribute of the entity that shall be sent to the KNX bus. If not set the state will be sent. Eg. for a light the state is eigther “on” or “off” - with attribute you can expose its “brightness”.",
|
||||
"description": "Attribute of the entity that shall be sent to the KNX bus. If not set, the state will be sent. Eg. for a light the state is either “on” or “off” - with attribute you can expose its “brightness”.",
|
||||
"name": "Entity attribute"
|
||||
},
|
||||
"default": {
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
"codeowners": ["@adrianmo"],
|
||||
"config_flow": true,
|
||||
"documentation": "https://www.home-assistant.io/integrations/meteoclimatic",
|
||||
"integration_type": "service",
|
||||
"iot_class": "cloud_polling",
|
||||
"loggers": ["meteoclimatic"],
|
||||
"requirements": ["pymeteoclimatic==0.1.0"]
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
"codeowners": ["@MrHarcombe", "@avee87"],
|
||||
"config_flow": true,
|
||||
"documentation": "https://www.home-assistant.io/integrations/metoffice",
|
||||
"integration_type": "service",
|
||||
"iot_class": "cloud_polling",
|
||||
"loggers": ["datapoint"],
|
||||
"requirements": ["datapoint==0.12.1"]
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
"integration_type": "hub",
|
||||
"iot_class": "local_push",
|
||||
"loggers": ["uiprotect", "unifi_discovery"],
|
||||
"quality_scale": "platinum",
|
||||
"requirements": ["uiprotect==7.33.2", "unifi-discovery==1.2.0"],
|
||||
"ssdp": [
|
||||
{
|
||||
|
||||
68
homeassistant/components/unifiprotect/quality_scale.yaml
Normal file
68
homeassistant/components/unifiprotect/quality_scale.yaml
Normal file
@@ -0,0 +1,68 @@
|
||||
rules:
|
||||
# Bronze
|
||||
action-setup: done
|
||||
appropriate-polling:
|
||||
status: exempt
|
||||
comment: Integration is push-based using WebSockets (iot_class local_push).
|
||||
brands: done
|
||||
common-modules: done
|
||||
config-flow-test-coverage: done
|
||||
config-flow: done
|
||||
dependency-transparency: done
|
||||
docs-actions: done
|
||||
docs-high-level-description: done
|
||||
docs-installation-instructions: done
|
||||
docs-removal-instructions: done
|
||||
entity-event-setup: done
|
||||
entity-unique-id: done
|
||||
has-entity-name: done
|
||||
runtime-data: done
|
||||
test-before-configure: done
|
||||
test-before-setup: done
|
||||
unique-config-entry: done
|
||||
|
||||
# Silver
|
||||
action-exceptions: done
|
||||
config-entry-unloading: done
|
||||
docs-configuration-parameters: done
|
||||
docs-installation-parameters: done
|
||||
entity-unavailable: done
|
||||
integration-owner: done
|
||||
log-when-unavailable: done
|
||||
parallel-updates: done
|
||||
reauthentication-flow: done
|
||||
test-coverage:
|
||||
status: done
|
||||
comment: Diagnostics tests could use snapshot testing.
|
||||
|
||||
# Gold
|
||||
devices: done
|
||||
diagnostics: done
|
||||
discovery-update-info: done
|
||||
discovery: done
|
||||
docs-data-update: done
|
||||
docs-examples: done
|
||||
docs-known-limitations: done
|
||||
docs-supported-devices: done
|
||||
docs-supported-functions: done
|
||||
docs-troubleshooting: done
|
||||
docs-use-cases: done
|
||||
dynamic-devices: done
|
||||
entity-category: done
|
||||
entity-device-class:
|
||||
status: done
|
||||
comment: "Planned improvement: remove doorbell occupancy binary sensor and keep the event sensor after a solution for https://github.com/home-assistant/core/issues/145941 is available."
|
||||
entity-disabled-by-default: done
|
||||
entity-translations:
|
||||
status: done
|
||||
comment: "Planned improvement: camera insecure is not translated but will be dropped soon with public api migration"
|
||||
exception-translations: done
|
||||
icon-translations: done
|
||||
reconfiguration-flow: done
|
||||
repair-issues: done
|
||||
stale-devices: done
|
||||
|
||||
# Platinum
|
||||
async-dependency: done
|
||||
inject-websession: done
|
||||
strict-typing: done
|
||||
@@ -48,37 +48,37 @@ _KEY_LIGHT_MOTION = "light_motion"
|
||||
PARALLEL_UPDATES = 0
|
||||
|
||||
HDR_MODES = [
|
||||
{"id": "always", "name": "Always On"},
|
||||
{"id": "off", "name": "Always Off"},
|
||||
{"id": "auto", "name": "Auto"},
|
||||
{"id": "always", "name": "always"},
|
||||
{"id": "off", "name": "off"},
|
||||
{"id": "auto", "name": "auto"},
|
||||
]
|
||||
|
||||
INFRARED_MODES = [
|
||||
{"id": IRLEDMode.AUTO.value, "name": "Auto"},
|
||||
{"id": IRLEDMode.ON.value, "name": "Always Enable"},
|
||||
{"id": IRLEDMode.AUTO_NO_LED.value, "name": "Auto (Filter Only, no LED's)"},
|
||||
{"id": IRLEDMode.CUSTOM.value, "name": "Auto (Custom Lux)"},
|
||||
{"id": IRLEDMode.OFF.value, "name": "Always Disable"},
|
||||
{"id": IRLEDMode.AUTO.value, "name": "auto"},
|
||||
{"id": IRLEDMode.ON.value, "name": "on"},
|
||||
{"id": IRLEDMode.AUTO_NO_LED.value, "name": "auto_filter_only"},
|
||||
{"id": IRLEDMode.CUSTOM.value, "name": "custom"},
|
||||
{"id": IRLEDMode.OFF.value, "name": "off"},
|
||||
]
|
||||
|
||||
CHIME_TYPES = [
|
||||
{"id": ChimeType.NONE.value, "name": "None"},
|
||||
{"id": ChimeType.MECHANICAL.value, "name": "Mechanical"},
|
||||
{"id": ChimeType.DIGITAL.value, "name": "Digital"},
|
||||
{"id": ChimeType.NONE.value, "name": "none"},
|
||||
{"id": ChimeType.MECHANICAL.value, "name": "mechanical"},
|
||||
{"id": ChimeType.DIGITAL.value, "name": "digital"},
|
||||
]
|
||||
|
||||
MOUNT_TYPES = [
|
||||
{"id": MountType.NONE.value, "name": "None"},
|
||||
{"id": MountType.DOOR.value, "name": "Door"},
|
||||
{"id": MountType.WINDOW.value, "name": "Window"},
|
||||
{"id": MountType.GARAGE.value, "name": "Garage"},
|
||||
{"id": MountType.LEAK.value, "name": "Leak"},
|
||||
{"id": MountType.NONE.value, "name": MountType.NONE.value},
|
||||
{"id": MountType.DOOR.value, "name": MountType.DOOR.value},
|
||||
{"id": MountType.WINDOW.value, "name": MountType.WINDOW.value},
|
||||
{"id": MountType.GARAGE.value, "name": MountType.GARAGE.value},
|
||||
{"id": MountType.LEAK.value, "name": MountType.LEAK.value},
|
||||
]
|
||||
|
||||
LIGHT_MODE_MOTION = "On Motion - Always"
|
||||
LIGHT_MODE_MOTION_DARK = "On Motion - When Dark"
|
||||
LIGHT_MODE_DARK = "When Dark"
|
||||
LIGHT_MODE_OFF = "Manual"
|
||||
LIGHT_MODE_MOTION = "motion"
|
||||
LIGHT_MODE_MOTION_DARK = "motion_dark"
|
||||
LIGHT_MODE_DARK = "when_dark"
|
||||
LIGHT_MODE_OFF = "manual"
|
||||
LIGHT_MODES = [LIGHT_MODE_MOTION, LIGHT_MODE_DARK, LIGHT_MODE_OFF]
|
||||
|
||||
LIGHT_MODE_TO_SETTINGS = {
|
||||
@@ -93,13 +93,13 @@ LIGHT_MODE_TO_SETTINGS = {
|
||||
|
||||
MOTION_MODE_TO_LIGHT_MODE = [
|
||||
{"id": LightModeType.MOTION.value, "name": LIGHT_MODE_MOTION},
|
||||
{"id": f"{LightModeType.MOTION.value}Dark", "name": LIGHT_MODE_MOTION_DARK},
|
||||
{"id": f"{LightModeType.MOTION.value}_dark", "name": LIGHT_MODE_MOTION_DARK},
|
||||
{"id": LightModeType.WHEN_DARK.value, "name": LIGHT_MODE_DARK},
|
||||
{"id": LightModeType.MANUAL.value, "name": LIGHT_MODE_OFF},
|
||||
]
|
||||
|
||||
DEVICE_RECORDING_MODES = [
|
||||
{"id": mode.value, "name": mode.value.title()} for mode in list(RecordingMode)
|
||||
{"id": mode.value, "name": mode.value} for mode in list(RecordingMode)
|
||||
]
|
||||
|
||||
|
||||
|
||||
@@ -350,31 +350,68 @@
|
||||
},
|
||||
"select": {
|
||||
"chime_type": {
|
||||
"name": "Chime type"
|
||||
"name": "Chime type",
|
||||
"state": {
|
||||
"digital": "Digital",
|
||||
"mechanical": "Mechanical",
|
||||
"none": "[%key:common::state::off%]"
|
||||
}
|
||||
},
|
||||
"doorbell_text": {
|
||||
"name": "Doorbell text"
|
||||
},
|
||||
"hdr_mode": {
|
||||
"name": "[%key:component::unifiprotect::entity::binary_sensor::hdr_mode::name%]"
|
||||
"name": "[%key:component::unifiprotect::entity::binary_sensor::hdr_mode::name%]",
|
||||
"state": {
|
||||
"always": "Always on",
|
||||
"auto": "Auto",
|
||||
"off": "Always off"
|
||||
}
|
||||
},
|
||||
"infrared_mode": {
|
||||
"name": "Infrared mode"
|
||||
"name": "Infrared mode",
|
||||
"state": {
|
||||
"auto": "Auto",
|
||||
"auto_filter_only": "Auto (filter only, no LEDs)",
|
||||
"custom": "Auto (custom lux)",
|
||||
"off": "Always disable",
|
||||
"on": "Always enable"
|
||||
}
|
||||
},
|
||||
"light_mode": {
|
||||
"name": "Light mode"
|
||||
"name": "Light mode",
|
||||
"state": {
|
||||
"manual": "Manual",
|
||||
"motion": "On motion - always",
|
||||
"motion_dark": "On motion - when dark",
|
||||
"when_dark": "When dark"
|
||||
}
|
||||
},
|
||||
"liveview": {
|
||||
"name": "Liveview"
|
||||
},
|
||||
"mount_type": {
|
||||
"name": "Mount type"
|
||||
"name": "Mount type",
|
||||
"state": {
|
||||
"door": "Door",
|
||||
"garage": "Garage",
|
||||
"leak": "Leak",
|
||||
"none": "[%key:common::state::off%]",
|
||||
"window": "Window"
|
||||
}
|
||||
},
|
||||
"paired_camera": {
|
||||
"name": "Paired camera"
|
||||
},
|
||||
"recording_mode": {
|
||||
"name": "Recording mode"
|
||||
"name": "Recording mode",
|
||||
"state": {
|
||||
"adaptive": "Adaptive",
|
||||
"always": "Always",
|
||||
"detections": "Detections",
|
||||
"never": "Never",
|
||||
"schedule": "Schedule"
|
||||
}
|
||||
}
|
||||
},
|
||||
"sensor": {
|
||||
|
||||
@@ -104,7 +104,7 @@ def async_get_light_motion_current(obj: Light) -> str:
|
||||
obj.light_mode_settings.mode is LightModeType.MOTION
|
||||
and obj.light_mode_settings.enable_at is LightModeEnableType.DARK
|
||||
):
|
||||
return f"{LightModeType.MOTION.value}Dark"
|
||||
return f"{LightModeType.MOTION.value}_dark"
|
||||
return obj.light_mode_settings.mode.value
|
||||
|
||||
|
||||
|
||||
@@ -13,5 +13,5 @@
|
||||
"documentation": "https://www.home-assistant.io/integrations/yale",
|
||||
"iot_class": "cloud_push",
|
||||
"loggers": ["socketio", "engineio", "yalexs"],
|
||||
"requirements": ["yalexs==9.2.0", "yalexs-ble==3.2.2"]
|
||||
"requirements": ["yalexs==9.2.0", "yalexs-ble==3.2.4"]
|
||||
}
|
||||
|
||||
@@ -12,5 +12,5 @@
|
||||
"dependencies": ["bluetooth_adapters"],
|
||||
"documentation": "https://www.home-assistant.io/integrations/yalexs_ble",
|
||||
"iot_class": "local_push",
|
||||
"requirements": ["yalexs-ble==3.2.2"]
|
||||
"requirements": ["yalexs-ble==3.2.4"]
|
||||
}
|
||||
|
||||
@@ -3956,13 +3956,13 @@
|
||||
},
|
||||
"meteoclimatic": {
|
||||
"name": "Meteoclimatic",
|
||||
"integration_type": "hub",
|
||||
"integration_type": "service",
|
||||
"config_flow": true,
|
||||
"iot_class": "cloud_polling"
|
||||
},
|
||||
"metoffice": {
|
||||
"name": "Met Office",
|
||||
"integration_type": "hub",
|
||||
"integration_type": "service",
|
||||
"config_flow": true,
|
||||
"iot_class": "cloud_polling"
|
||||
},
|
||||
|
||||
4
requirements_all.txt
generated
4
requirements_all.txt
generated
@@ -1291,7 +1291,7 @@ influxdb==5.3.1
|
||||
inkbird-ble==1.1.1
|
||||
|
||||
# homeassistant.components.insteon
|
||||
insteon-frontend-home-assistant==0.5.0
|
||||
insteon-frontend-home-assistant==0.6.0
|
||||
|
||||
# homeassistant.components.intellifire
|
||||
intellifire4py==4.2.1
|
||||
@@ -3224,7 +3224,7 @@ yalesmartalarmclient==0.4.3
|
||||
# homeassistant.components.august
|
||||
# homeassistant.components.yale
|
||||
# homeassistant.components.yalexs_ble
|
||||
yalexs-ble==3.2.2
|
||||
yalexs-ble==3.2.4
|
||||
|
||||
# homeassistant.components.august
|
||||
# homeassistant.components.yale
|
||||
|
||||
4
requirements_test_all.txt
generated
4
requirements_test_all.txt
generated
@@ -1137,7 +1137,7 @@ influxdb==5.3.1
|
||||
inkbird-ble==1.1.1
|
||||
|
||||
# homeassistant.components.insteon
|
||||
insteon-frontend-home-assistant==0.5.0
|
||||
insteon-frontend-home-assistant==0.6.0
|
||||
|
||||
# homeassistant.components.intellifire
|
||||
intellifire4py==4.2.1
|
||||
@@ -2691,7 +2691,7 @@ yalesmartalarmclient==0.4.3
|
||||
# homeassistant.components.august
|
||||
# homeassistant.components.yale
|
||||
# homeassistant.components.yalexs_ble
|
||||
yalexs-ble==3.2.2
|
||||
yalexs-ble==3.2.4
|
||||
|
||||
# homeassistant.components.august
|
||||
# homeassistant.components.yale
|
||||
|
||||
@@ -1008,7 +1008,6 @@ INTEGRATIONS_WITHOUT_QUALITY_SCALE_FILE = [
|
||||
"unifi",
|
||||
"unifi_direct",
|
||||
"unifiled",
|
||||
"unifiprotect",
|
||||
"universal",
|
||||
"upb",
|
||||
"upc_connect",
|
||||
@@ -2032,7 +2031,6 @@ INTEGRATIONS_WITHOUT_SCALE = [
|
||||
"unifi",
|
||||
"unifi_direct",
|
||||
"unifiled",
|
||||
"unifiprotect",
|
||||
"universal",
|
||||
"upb",
|
||||
"upc_connect",
|
||||
|
||||
@@ -82,9 +82,20 @@ def mock_hikcamera() -> Generator[MagicMock]:
|
||||
None,
|
||||
"2024-01-01T00:00:00Z",
|
||||
)
|
||||
camera.get_event_triggers.return_value = {}
|
||||
yield hikcamera_mock
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_hik_nvr(mock_hikcamera: MagicMock) -> MagicMock:
|
||||
"""Return a mocked HikCamera configured as an NVR."""
|
||||
camera = mock_hikcamera.return_value
|
||||
camera.get_type = "NVR"
|
||||
camera.current_event_states = {}
|
||||
camera.get_event_triggers.return_value = {"Motion": [1, 2]}
|
||||
return mock_hikcamera
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
async def init_integration(
|
||||
hass: HomeAssistant, mock_config_entry: MockConfigEntry, mock_hikcamera: MagicMock
|
||||
|
||||
@@ -89,3 +89,16 @@ async def test_setup_entry_no_device_id(
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert mock_config_entry.state is ConfigEntryState.SETUP_RETRY
|
||||
|
||||
|
||||
async def test_setup_entry_nvr_fetches_events(
|
||||
hass: HomeAssistant,
|
||||
mock_config_entry: MockConfigEntry,
|
||||
mock_hik_nvr: MagicMock,
|
||||
) -> None:
|
||||
"""Test setup fetches NVR events for NVR devices."""
|
||||
await setup_integration(hass, mock_config_entry)
|
||||
|
||||
assert mock_config_entry.state is ConfigEntryState.LOADED
|
||||
mock_hik_nvr.return_value.get_event_triggers.assert_called_once()
|
||||
mock_hik_nvr.return_value.inject_events.assert_called_once()
|
||||
|
||||
@@ -95,7 +95,7 @@ async def test_select_setup_light(
|
||||
await init_entry(hass, ufp, [light])
|
||||
assert_entity_counts(hass, Platform.SELECT, 2, 2)
|
||||
|
||||
expected_values = ("On Motion - When Dark", "Not Paired")
|
||||
expected_values = ("motion_dark", "Not Paired")
|
||||
|
||||
for index, description in enumerate(LIGHT_SELECTS):
|
||||
unique_id, entity_id = await ids_from_device_description(
|
||||
@@ -153,11 +153,11 @@ async def test_select_setup_camera_all(
|
||||
assert_entity_counts(hass, Platform.SELECT, 5, 5)
|
||||
|
||||
expected_values = (
|
||||
"Always",
|
||||
"Auto",
|
||||
"always",
|
||||
"auto",
|
||||
"Default Message (Welcome)",
|
||||
"None",
|
||||
"Always Off",
|
||||
"none",
|
||||
"off",
|
||||
)
|
||||
|
||||
for index, description in enumerate(CAMERA_SELECTS):
|
||||
@@ -186,7 +186,7 @@ async def test_select_setup_camera_none(
|
||||
await init_entry(hass, ufp, [camera])
|
||||
assert_entity_counts(hass, Platform.SELECT, 2, 2)
|
||||
|
||||
expected_values = ("Always", "Auto", "Default Message (Welcome)")
|
||||
expected_values = ("always", "auto", "Default Message (Welcome)")
|
||||
|
||||
for index, description in enumerate(CAMERA_SELECTS):
|
||||
if index == 2:
|
||||
@@ -403,7 +403,7 @@ async def test_select_set_option_camera_recording(
|
||||
await hass.services.async_call(
|
||||
"select",
|
||||
"select_option",
|
||||
{ATTR_ENTITY_ID: entity_id, ATTR_OPTION: "Never"},
|
||||
{ATTR_ENTITY_ID: entity_id, ATTR_OPTION: "never"},
|
||||
blocking=True,
|
||||
)
|
||||
|
||||
@@ -428,7 +428,7 @@ async def test_select_set_option_camera_ir(
|
||||
await hass.services.async_call(
|
||||
"select",
|
||||
"select_option",
|
||||
{ATTR_ENTITY_ID: entity_id, ATTR_OPTION: "Always Enable"},
|
||||
{ATTR_ENTITY_ID: entity_id, ATTR_OPTION: "on"},
|
||||
blocking=True,
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user