mirror of
https://github.com/home-assistant/core.git
synced 2025-07-13 08:17:08 +00:00
Add reset_energy_counter service to Homematic IP Cloud (#30256)
* Add reset_energy_counter service to Homematic IP Cloud * Fix isort * Register service as admin service
This commit is contained in:
parent
1d1aa06d05
commit
a4c830b5e4
@ -3,6 +3,7 @@ import logging
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
|
from homematicip.aio.device import AsyncSwitchMeasuring
|
||||||
from homematicip.aio.group import AsyncHeatingGroup
|
from homematicip.aio.group import AsyncHeatingGroup
|
||||||
from homematicip.aio.home import AsyncHome
|
from homematicip.aio.home import AsyncHome
|
||||||
from homematicip.base.helpers import handle_config
|
from homematicip.base.helpers import handle_config
|
||||||
@ -47,6 +48,7 @@ SERVICE_ACTIVATE_VACATION = "activate_vacation"
|
|||||||
SERVICE_DEACTIVATE_ECO_MODE = "deactivate_eco_mode"
|
SERVICE_DEACTIVATE_ECO_MODE = "deactivate_eco_mode"
|
||||||
SERVICE_DEACTIVATE_VACATION = "deactivate_vacation"
|
SERVICE_DEACTIVATE_VACATION = "deactivate_vacation"
|
||||||
SERVICE_DUMP_HAP_CONFIG = "dump_hap_config"
|
SERVICE_DUMP_HAP_CONFIG = "dump_hap_config"
|
||||||
|
SERVICE_RESET_ENERGY_COUNTER = "reset_energy_counter"
|
||||||
SERVICE_SET_ACTIVE_CLIMATE_PROFILE = "set_active_climate_profile"
|
SERVICE_SET_ACTIVE_CLIMATE_PROFILE = "set_active_climate_profile"
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.Schema(
|
CONFIG_SCHEMA = vol.Schema(
|
||||||
@ -116,6 +118,10 @@ SCHEMA_DUMP_HAP_CONFIG = vol.Schema(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
SCHEMA_RESET_ENERGY_COUNTER = vol.Schema(
|
||||||
|
{vol.Required(ATTR_ENTITY_ID): comp_entity_ids}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
async def async_setup(hass: HomeAssistantType, config: ConfigType) -> bool:
|
async def async_setup(hass: HomeAssistantType, config: ConfigType) -> bool:
|
||||||
"""Set up the HomematicIP Cloud component."""
|
"""Set up the HomematicIP Cloud component."""
|
||||||
@ -245,7 +251,7 @@ async def async_setup(hass: HomeAssistantType, config: ConfigType) -> bool:
|
|||||||
if entity_id_list != "all":
|
if entity_id_list != "all":
|
||||||
for entity_id in entity_id_list:
|
for entity_id in entity_id_list:
|
||||||
group = hap.hmip_device_by_entity_id.get(entity_id)
|
group = hap.hmip_device_by_entity_id.get(entity_id)
|
||||||
if group:
|
if group and isinstance(group, AsyncHeatingGroup):
|
||||||
await group.set_active_profile(climate_profile_index)
|
await group.set_active_profile(climate_profile_index)
|
||||||
else:
|
else:
|
||||||
for group in hap.home.groups:
|
for group in hap.home.groups:
|
||||||
@ -289,6 +295,28 @@ async def async_setup(hass: HomeAssistantType, config: ConfigType) -> bool:
|
|||||||
schema=SCHEMA_DUMP_HAP_CONFIG,
|
schema=SCHEMA_DUMP_HAP_CONFIG,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
async def _async_reset_energy_counter(service):
|
||||||
|
"""Service to reset the energy counter."""
|
||||||
|
entity_id_list = service.data[ATTR_ENTITY_ID]
|
||||||
|
|
||||||
|
for hap in hass.data[DOMAIN].values():
|
||||||
|
if entity_id_list != "all":
|
||||||
|
for entity_id in entity_id_list:
|
||||||
|
device = hap.hmip_device_by_entity_id.get(entity_id)
|
||||||
|
if device and isinstance(device, AsyncSwitchMeasuring):
|
||||||
|
await device.reset_energy_counter()
|
||||||
|
else:
|
||||||
|
for device in hap.home.devices:
|
||||||
|
if isinstance(device, AsyncSwitchMeasuring):
|
||||||
|
await device.reset_energy_counter()
|
||||||
|
|
||||||
|
hass.helpers.service.async_register_admin_service(
|
||||||
|
DOMAIN,
|
||||||
|
SERVICE_RESET_ENERGY_COUNTER,
|
||||||
|
_async_reset_energy_counter,
|
||||||
|
schema=SCHEMA_RESET_ENERGY_COUNTER,
|
||||||
|
)
|
||||||
|
|
||||||
def _get_home(hapid: str) -> Optional[AsyncHome]:
|
def _get_home(hapid: str) -> Optional[AsyncHome]:
|
||||||
"""Return a HmIP home."""
|
"""Return a HmIP home."""
|
||||||
hap = hass.data[DOMAIN].get(hapid)
|
hap = hass.data[DOMAIN].get(hapid)
|
||||||
|
@ -69,3 +69,10 @@ dump_hap_config:
|
|||||||
anonymize:
|
anonymize:
|
||||||
description: (Default is True) Should the Configuration be anonymized?
|
description: (Default is True) Should the Configuration be anonymized?
|
||||||
example: True
|
example: True
|
||||||
|
|
||||||
|
reset_energy_counter:
|
||||||
|
description: Reset the energy counter of a measuring entity.
|
||||||
|
fields:
|
||||||
|
entity_id:
|
||||||
|
description: The ID of the measuring entity. Use 'all' keyword to reset all energy counters.
|
||||||
|
example: switch.livingroom
|
||||||
|
@ -130,3 +130,30 @@ async def test_hap_with_name(hass, mock_connection, hmip_config_entry):
|
|||||||
assert hmip_device
|
assert hmip_device
|
||||||
assert ha_state.state == STATE_ON
|
assert ha_state.state == STATE_ON
|
||||||
assert ha_state.attributes["friendly_name"] == entity_name
|
assert ha_state.attributes["friendly_name"] == entity_name
|
||||||
|
|
||||||
|
|
||||||
|
async def test_hmip_reset_energy_counter_services(hass, mock_hap_with_service):
|
||||||
|
"""Test reset_energy_counter service."""
|
||||||
|
entity_id = "switch.pc"
|
||||||
|
entity_name = "Pc"
|
||||||
|
device_model = "HMIP-PSM"
|
||||||
|
|
||||||
|
ha_state, hmip_device = get_and_check_entity_basics(
|
||||||
|
hass, mock_hap_with_service, entity_id, entity_name, device_model
|
||||||
|
)
|
||||||
|
assert ha_state
|
||||||
|
|
||||||
|
await hass.services.async_call(
|
||||||
|
"homematicip_cloud",
|
||||||
|
"reset_energy_counter",
|
||||||
|
{"entity_id": "switch.pc"},
|
||||||
|
blocking=True,
|
||||||
|
)
|
||||||
|
assert hmip_device.mock_calls[-1][0] == "reset_energy_counter"
|
||||||
|
assert len(hmip_device._connection.mock_calls) == 2 # pylint: disable=W0212
|
||||||
|
|
||||||
|
await hass.services.async_call(
|
||||||
|
"homematicip_cloud", "reset_energy_counter", {"entity_id": "all"}, blocking=True
|
||||||
|
)
|
||||||
|
assert hmip_device.mock_calls[-1][0] == "reset_energy_counter"
|
||||||
|
assert len(hmip_device._connection.mock_calls) == 12 # pylint: disable=W0212
|
||||||
|
Loading…
x
Reference in New Issue
Block a user