mirror of
https://github.com/home-assistant/core.git
synced 2025-07-29 08:07:45 +00:00
Add pan/tilt features to tplink integration (#133829)
This commit is contained in:
parent
0f18f128fd
commit
ebcb478f52
@ -50,6 +50,18 @@ BUTTON_DESCRIPTIONS: Final = [
|
|||||||
key="reboot",
|
key="reboot",
|
||||||
device_class=ButtonDeviceClass.RESTART,
|
device_class=ButtonDeviceClass.RESTART,
|
||||||
),
|
),
|
||||||
|
TPLinkButtonEntityDescription(
|
||||||
|
key="pan_left",
|
||||||
|
),
|
||||||
|
TPLinkButtonEntityDescription(
|
||||||
|
key="pan_right",
|
||||||
|
),
|
||||||
|
TPLinkButtonEntityDescription(
|
||||||
|
key="tilt_up",
|
||||||
|
),
|
||||||
|
TPLinkButtonEntityDescription(
|
||||||
|
key="tilt_down",
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
BUTTON_DESCRIPTIONS_MAP = {desc.key: desc for desc in BUTTON_DESCRIPTIONS}
|
BUTTON_DESCRIPTIONS_MAP = {desc.key: desc for desc in BUTTON_DESCRIPTIONS}
|
||||||
|
@ -73,13 +73,6 @@ EXCLUDED_FEATURES = {
|
|||||||
"check_latest_firmware",
|
"check_latest_firmware",
|
||||||
# siren
|
# siren
|
||||||
"alarm",
|
"alarm",
|
||||||
# camera
|
|
||||||
"pan_left",
|
|
||||||
"pan_right",
|
|
||||||
"pan_step",
|
|
||||||
"tilt_up",
|
|
||||||
"tilt_down",
|
|
||||||
"tilt_step",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -20,6 +20,18 @@
|
|||||||
},
|
},
|
||||||
"stop_alarm": {
|
"stop_alarm": {
|
||||||
"default": "mdi:bell-cancel"
|
"default": "mdi:bell-cancel"
|
||||||
|
},
|
||||||
|
"pan_left": {
|
||||||
|
"default": "mdi:chevron-left"
|
||||||
|
},
|
||||||
|
"pan_right": {
|
||||||
|
"default": "mdi:chevron-right"
|
||||||
|
},
|
||||||
|
"tilt_up": {
|
||||||
|
"default": "mdi:chevron-up"
|
||||||
|
},
|
||||||
|
"tilt_down": {
|
||||||
|
"default": "mdi:chevron-down"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"select": {
|
"select": {
|
||||||
@ -117,6 +129,12 @@
|
|||||||
},
|
},
|
||||||
"target_temperature": {
|
"target_temperature": {
|
||||||
"default": "mdi:thermometer"
|
"default": "mdi:thermometer"
|
||||||
|
},
|
||||||
|
"pan_step": {
|
||||||
|
"default": "mdi:unfold-more-vertical"
|
||||||
|
},
|
||||||
|
"tilt_step": {
|
||||||
|
"default": "mdi:unfold-more-horizontal"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -51,6 +51,14 @@ NUMBER_DESCRIPTIONS: Final = (
|
|||||||
key="temperature_offset",
|
key="temperature_offset",
|
||||||
mode=NumberMode.BOX,
|
mode=NumberMode.BOX,
|
||||||
),
|
),
|
||||||
|
TPLinkNumberEntityDescription(
|
||||||
|
key="pan_step",
|
||||||
|
mode=NumberMode.BOX,
|
||||||
|
),
|
||||||
|
TPLinkNumberEntityDescription(
|
||||||
|
key="tilt_step",
|
||||||
|
mode=NumberMode.BOX,
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
NUMBER_DESCRIPTIONS_MAP = {desc.key: desc for desc in NUMBER_DESCRIPTIONS}
|
NUMBER_DESCRIPTIONS_MAP = {desc.key: desc for desc in NUMBER_DESCRIPTIONS}
|
||||||
|
@ -120,6 +120,18 @@
|
|||||||
},
|
},
|
||||||
"stop_alarm": {
|
"stop_alarm": {
|
||||||
"name": "Stop alarm"
|
"name": "Stop alarm"
|
||||||
|
},
|
||||||
|
"pan_left": {
|
||||||
|
"name": "Pan left"
|
||||||
|
},
|
||||||
|
"pan_right": {
|
||||||
|
"name": "Pan right"
|
||||||
|
},
|
||||||
|
"tilt_up": {
|
||||||
|
"name": "Tilt up"
|
||||||
|
},
|
||||||
|
"tilt_down": {
|
||||||
|
"name": "Tilt down"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"camera": {
|
"camera": {
|
||||||
@ -235,6 +247,12 @@
|
|||||||
},
|
},
|
||||||
"temperature_offset": {
|
"temperature_offset": {
|
||||||
"name": "Temperature offset"
|
"name": "Temperature offset"
|
||||||
|
},
|
||||||
|
"pan_step": {
|
||||||
|
"name": "Pan degrees"
|
||||||
|
},
|
||||||
|
"tilt_step": {
|
||||||
|
"name": "Tilt degrees"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -1,4 +1,96 @@
|
|||||||
# serializer version: 1
|
# serializer version: 1
|
||||||
|
# name: test_states[button.my_device_pan_left-entry]
|
||||||
|
EntityRegistryEntrySnapshot({
|
||||||
|
'aliases': set({
|
||||||
|
}),
|
||||||
|
'area_id': None,
|
||||||
|
'capabilities': None,
|
||||||
|
'config_entry_id': <ANY>,
|
||||||
|
'device_class': None,
|
||||||
|
'device_id': <ANY>,
|
||||||
|
'disabled_by': None,
|
||||||
|
'domain': 'button',
|
||||||
|
'entity_category': <EntityCategory.CONFIG: 'config'>,
|
||||||
|
'entity_id': 'button.my_device_pan_left',
|
||||||
|
'has_entity_name': True,
|
||||||
|
'hidden_by': None,
|
||||||
|
'icon': None,
|
||||||
|
'id': <ANY>,
|
||||||
|
'labels': set({
|
||||||
|
}),
|
||||||
|
'name': None,
|
||||||
|
'options': dict({
|
||||||
|
}),
|
||||||
|
'original_device_class': None,
|
||||||
|
'original_icon': None,
|
||||||
|
'original_name': 'Pan left',
|
||||||
|
'platform': 'tplink',
|
||||||
|
'previous_unique_id': None,
|
||||||
|
'supported_features': 0,
|
||||||
|
'translation_key': 'pan_left',
|
||||||
|
'unique_id': '123456789ABCDEFGH_pan_left',
|
||||||
|
'unit_of_measurement': None,
|
||||||
|
})
|
||||||
|
# ---
|
||||||
|
# name: test_states[button.my_device_pan_left-state]
|
||||||
|
StateSnapshot({
|
||||||
|
'attributes': ReadOnlyDict({
|
||||||
|
'friendly_name': 'my_device Pan left',
|
||||||
|
}),
|
||||||
|
'context': <ANY>,
|
||||||
|
'entity_id': 'button.my_device_pan_left',
|
||||||
|
'last_changed': <ANY>,
|
||||||
|
'last_reported': <ANY>,
|
||||||
|
'last_updated': <ANY>,
|
||||||
|
'state': 'unknown',
|
||||||
|
})
|
||||||
|
# ---
|
||||||
|
# name: test_states[button.my_device_pan_right-entry]
|
||||||
|
EntityRegistryEntrySnapshot({
|
||||||
|
'aliases': set({
|
||||||
|
}),
|
||||||
|
'area_id': None,
|
||||||
|
'capabilities': None,
|
||||||
|
'config_entry_id': <ANY>,
|
||||||
|
'device_class': None,
|
||||||
|
'device_id': <ANY>,
|
||||||
|
'disabled_by': None,
|
||||||
|
'domain': 'button',
|
||||||
|
'entity_category': <EntityCategory.CONFIG: 'config'>,
|
||||||
|
'entity_id': 'button.my_device_pan_right',
|
||||||
|
'has_entity_name': True,
|
||||||
|
'hidden_by': None,
|
||||||
|
'icon': None,
|
||||||
|
'id': <ANY>,
|
||||||
|
'labels': set({
|
||||||
|
}),
|
||||||
|
'name': None,
|
||||||
|
'options': dict({
|
||||||
|
}),
|
||||||
|
'original_device_class': None,
|
||||||
|
'original_icon': None,
|
||||||
|
'original_name': 'Pan right',
|
||||||
|
'platform': 'tplink',
|
||||||
|
'previous_unique_id': None,
|
||||||
|
'supported_features': 0,
|
||||||
|
'translation_key': 'pan_right',
|
||||||
|
'unique_id': '123456789ABCDEFGH_pan_right',
|
||||||
|
'unit_of_measurement': None,
|
||||||
|
})
|
||||||
|
# ---
|
||||||
|
# name: test_states[button.my_device_pan_right-state]
|
||||||
|
StateSnapshot({
|
||||||
|
'attributes': ReadOnlyDict({
|
||||||
|
'friendly_name': 'my_device Pan right',
|
||||||
|
}),
|
||||||
|
'context': <ANY>,
|
||||||
|
'entity_id': 'button.my_device_pan_right',
|
||||||
|
'last_changed': <ANY>,
|
||||||
|
'last_reported': <ANY>,
|
||||||
|
'last_updated': <ANY>,
|
||||||
|
'state': 'unknown',
|
||||||
|
})
|
||||||
|
# ---
|
||||||
# name: test_states[button.my_device_restart-entry]
|
# name: test_states[button.my_device_restart-entry]
|
||||||
EntityRegistryEntrySnapshot({
|
EntityRegistryEntrySnapshot({
|
||||||
'aliases': set({
|
'aliases': set({
|
||||||
@ -124,6 +216,98 @@
|
|||||||
'state': 'unknown',
|
'state': 'unknown',
|
||||||
})
|
})
|
||||||
# ---
|
# ---
|
||||||
|
# name: test_states[button.my_device_tilt_down-entry]
|
||||||
|
EntityRegistryEntrySnapshot({
|
||||||
|
'aliases': set({
|
||||||
|
}),
|
||||||
|
'area_id': None,
|
||||||
|
'capabilities': None,
|
||||||
|
'config_entry_id': <ANY>,
|
||||||
|
'device_class': None,
|
||||||
|
'device_id': <ANY>,
|
||||||
|
'disabled_by': None,
|
||||||
|
'domain': 'button',
|
||||||
|
'entity_category': <EntityCategory.CONFIG: 'config'>,
|
||||||
|
'entity_id': 'button.my_device_tilt_down',
|
||||||
|
'has_entity_name': True,
|
||||||
|
'hidden_by': None,
|
||||||
|
'icon': None,
|
||||||
|
'id': <ANY>,
|
||||||
|
'labels': set({
|
||||||
|
}),
|
||||||
|
'name': None,
|
||||||
|
'options': dict({
|
||||||
|
}),
|
||||||
|
'original_device_class': None,
|
||||||
|
'original_icon': None,
|
||||||
|
'original_name': 'Tilt down',
|
||||||
|
'platform': 'tplink',
|
||||||
|
'previous_unique_id': None,
|
||||||
|
'supported_features': 0,
|
||||||
|
'translation_key': 'tilt_down',
|
||||||
|
'unique_id': '123456789ABCDEFGH_tilt_down',
|
||||||
|
'unit_of_measurement': None,
|
||||||
|
})
|
||||||
|
# ---
|
||||||
|
# name: test_states[button.my_device_tilt_down-state]
|
||||||
|
StateSnapshot({
|
||||||
|
'attributes': ReadOnlyDict({
|
||||||
|
'friendly_name': 'my_device Tilt down',
|
||||||
|
}),
|
||||||
|
'context': <ANY>,
|
||||||
|
'entity_id': 'button.my_device_tilt_down',
|
||||||
|
'last_changed': <ANY>,
|
||||||
|
'last_reported': <ANY>,
|
||||||
|
'last_updated': <ANY>,
|
||||||
|
'state': 'unknown',
|
||||||
|
})
|
||||||
|
# ---
|
||||||
|
# name: test_states[button.my_device_tilt_up-entry]
|
||||||
|
EntityRegistryEntrySnapshot({
|
||||||
|
'aliases': set({
|
||||||
|
}),
|
||||||
|
'area_id': None,
|
||||||
|
'capabilities': None,
|
||||||
|
'config_entry_id': <ANY>,
|
||||||
|
'device_class': None,
|
||||||
|
'device_id': <ANY>,
|
||||||
|
'disabled_by': None,
|
||||||
|
'domain': 'button',
|
||||||
|
'entity_category': <EntityCategory.CONFIG: 'config'>,
|
||||||
|
'entity_id': 'button.my_device_tilt_up',
|
||||||
|
'has_entity_name': True,
|
||||||
|
'hidden_by': None,
|
||||||
|
'icon': None,
|
||||||
|
'id': <ANY>,
|
||||||
|
'labels': set({
|
||||||
|
}),
|
||||||
|
'name': None,
|
||||||
|
'options': dict({
|
||||||
|
}),
|
||||||
|
'original_device_class': None,
|
||||||
|
'original_icon': None,
|
||||||
|
'original_name': 'Tilt up',
|
||||||
|
'platform': 'tplink',
|
||||||
|
'previous_unique_id': None,
|
||||||
|
'supported_features': 0,
|
||||||
|
'translation_key': 'tilt_up',
|
||||||
|
'unique_id': '123456789ABCDEFGH_tilt_up',
|
||||||
|
'unit_of_measurement': None,
|
||||||
|
})
|
||||||
|
# ---
|
||||||
|
# name: test_states[button.my_device_tilt_up-state]
|
||||||
|
StateSnapshot({
|
||||||
|
'attributes': ReadOnlyDict({
|
||||||
|
'friendly_name': 'my_device Tilt up',
|
||||||
|
}),
|
||||||
|
'context': <ANY>,
|
||||||
|
'entity_id': 'button.my_device_tilt_up',
|
||||||
|
'last_changed': <ANY>,
|
||||||
|
'last_reported': <ANY>,
|
||||||
|
'last_updated': <ANY>,
|
||||||
|
'state': 'unknown',
|
||||||
|
})
|
||||||
|
# ---
|
||||||
# name: test_states[my_device-entry]
|
# name: test_states[my_device-entry]
|
||||||
DeviceRegistryEntrySnapshot({
|
DeviceRegistryEntrySnapshot({
|
||||||
'area_id': None,
|
'area_id': None,
|
||||||
|
@ -35,6 +35,61 @@
|
|||||||
'via_device_id': None,
|
'via_device_id': None,
|
||||||
})
|
})
|
||||||
# ---
|
# ---
|
||||||
|
# name: test_states[number.my_device_pan_degrees-entry]
|
||||||
|
EntityRegistryEntrySnapshot({
|
||||||
|
'aliases': set({
|
||||||
|
}),
|
||||||
|
'area_id': None,
|
||||||
|
'capabilities': dict({
|
||||||
|
'max': 65536,
|
||||||
|
'min': 0,
|
||||||
|
'mode': <NumberMode.BOX: 'box'>,
|
||||||
|
'step': 1.0,
|
||||||
|
}),
|
||||||
|
'config_entry_id': <ANY>,
|
||||||
|
'device_class': None,
|
||||||
|
'device_id': <ANY>,
|
||||||
|
'disabled_by': None,
|
||||||
|
'domain': 'number',
|
||||||
|
'entity_category': <EntityCategory.CONFIG: 'config'>,
|
||||||
|
'entity_id': 'number.my_device_pan_degrees',
|
||||||
|
'has_entity_name': True,
|
||||||
|
'hidden_by': None,
|
||||||
|
'icon': None,
|
||||||
|
'id': <ANY>,
|
||||||
|
'labels': set({
|
||||||
|
}),
|
||||||
|
'name': None,
|
||||||
|
'options': dict({
|
||||||
|
}),
|
||||||
|
'original_device_class': None,
|
||||||
|
'original_icon': None,
|
||||||
|
'original_name': 'Pan degrees',
|
||||||
|
'platform': 'tplink',
|
||||||
|
'previous_unique_id': None,
|
||||||
|
'supported_features': 0,
|
||||||
|
'translation_key': 'pan_step',
|
||||||
|
'unique_id': '123456789ABCDEFGH_pan_step',
|
||||||
|
'unit_of_measurement': None,
|
||||||
|
})
|
||||||
|
# ---
|
||||||
|
# name: test_states[number.my_device_pan_degrees-state]
|
||||||
|
StateSnapshot({
|
||||||
|
'attributes': ReadOnlyDict({
|
||||||
|
'friendly_name': 'my_device Pan degrees',
|
||||||
|
'max': 65536,
|
||||||
|
'min': 0,
|
||||||
|
'mode': <NumberMode.BOX: 'box'>,
|
||||||
|
'step': 1.0,
|
||||||
|
}),
|
||||||
|
'context': <ANY>,
|
||||||
|
'entity_id': 'number.my_device_pan_degrees',
|
||||||
|
'last_changed': <ANY>,
|
||||||
|
'last_reported': <ANY>,
|
||||||
|
'last_updated': <ANY>,
|
||||||
|
'state': '10',
|
||||||
|
})
|
||||||
|
# ---
|
||||||
# name: test_states[number.my_device_smooth_off-entry]
|
# name: test_states[number.my_device_smooth_off-entry]
|
||||||
EntityRegistryEntrySnapshot({
|
EntityRegistryEntrySnapshot({
|
||||||
'aliases': set({
|
'aliases': set({
|
||||||
@ -200,6 +255,61 @@
|
|||||||
'state': 'False',
|
'state': 'False',
|
||||||
})
|
})
|
||||||
# ---
|
# ---
|
||||||
|
# name: test_states[number.my_device_tilt_degrees-entry]
|
||||||
|
EntityRegistryEntrySnapshot({
|
||||||
|
'aliases': set({
|
||||||
|
}),
|
||||||
|
'area_id': None,
|
||||||
|
'capabilities': dict({
|
||||||
|
'max': 65536,
|
||||||
|
'min': 0,
|
||||||
|
'mode': <NumberMode.BOX: 'box'>,
|
||||||
|
'step': 1.0,
|
||||||
|
}),
|
||||||
|
'config_entry_id': <ANY>,
|
||||||
|
'device_class': None,
|
||||||
|
'device_id': <ANY>,
|
||||||
|
'disabled_by': None,
|
||||||
|
'domain': 'number',
|
||||||
|
'entity_category': <EntityCategory.CONFIG: 'config'>,
|
||||||
|
'entity_id': 'number.my_device_tilt_degrees',
|
||||||
|
'has_entity_name': True,
|
||||||
|
'hidden_by': None,
|
||||||
|
'icon': None,
|
||||||
|
'id': <ANY>,
|
||||||
|
'labels': set({
|
||||||
|
}),
|
||||||
|
'name': None,
|
||||||
|
'options': dict({
|
||||||
|
}),
|
||||||
|
'original_device_class': None,
|
||||||
|
'original_icon': None,
|
||||||
|
'original_name': 'Tilt degrees',
|
||||||
|
'platform': 'tplink',
|
||||||
|
'previous_unique_id': None,
|
||||||
|
'supported_features': 0,
|
||||||
|
'translation_key': 'tilt_step',
|
||||||
|
'unique_id': '123456789ABCDEFGH_tilt_step',
|
||||||
|
'unit_of_measurement': None,
|
||||||
|
})
|
||||||
|
# ---
|
||||||
|
# name: test_states[number.my_device_tilt_degrees-state]
|
||||||
|
StateSnapshot({
|
||||||
|
'attributes': ReadOnlyDict({
|
||||||
|
'friendly_name': 'my_device Tilt degrees',
|
||||||
|
'max': 65536,
|
||||||
|
'min': 0,
|
||||||
|
'mode': <NumberMode.BOX: 'box'>,
|
||||||
|
'step': 1.0,
|
||||||
|
}),
|
||||||
|
'context': <ANY>,
|
||||||
|
'entity_id': 'number.my_device_tilt_degrees',
|
||||||
|
'last_changed': <ANY>,
|
||||||
|
'last_reported': <ANY>,
|
||||||
|
'last_updated': <ANY>,
|
||||||
|
'state': '10',
|
||||||
|
})
|
||||||
|
# ---
|
||||||
# name: test_states[number.my_device_turn_off_in-entry]
|
# name: test_states[number.my_device_turn_off_in-entry]
|
||||||
EntityRegistryEntrySnapshot({
|
EntityRegistryEntrySnapshot({
|
||||||
'aliases': set({
|
'aliases': set({
|
||||||
|
Loading…
x
Reference in New Issue
Block a user