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
2 changes: 1 addition & 1 deletion homeassistant/components/ring/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,11 @@

PLATFORMS = [
Platform.BINARY_SENSOR,
Platform.BUTTON,
Platform.LIGHT,
Platform.SENSOR,
Platform.SWITCH,
Platform.CAMERA,
Platform.SIREN,
]


Expand Down
65 changes: 0 additions & 65 deletions homeassistant/components/ring/button.py

This file was deleted.

51 changes: 51 additions & 0 deletions homeassistant/components/ring/siren.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
"""This component provides HA Siren support for Ring Chimes."""
import logging
from typing import Any

from ring_doorbell.const import CHIME_TEST_SOUND_KINDS, KIND_DING

from homeassistant.components.siren import ATTR_TONE, SirenEntity, SirenEntityFeature
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from . import DOMAIN
from .entity import RingEntityMixin

_LOGGER = logging.getLogger(__name__)


async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Create the sirens for the Ring devices."""
devices = hass.data[DOMAIN][config_entry.entry_id]["devices"]
sirens = []

for device in devices["chimes"]:
sirens.append(RingChimeSiren(config_entry, device))

async_add_entities(sirens)


class RingChimeSiren(RingEntityMixin, SirenEntity):
"""Creates a siren to play the test chimes of a Chime device."""

def __init__(self, config_entry: ConfigEntry, device) -> None:
"""Initialize a Ring Chime siren."""
super().__init__(config_entry.entry_id, device)
# Entity class attributes
self._attr_name = f"{self._device.name} Siren"
self._attr_unique_id = f"{self._device.id}-siren"
self._attr_available_tones = CHIME_TEST_SOUND_KINDS
self._attr_supported_features = (
SirenEntityFeature.TURN_ON | SirenEntityFeature.TONES
)

def turn_on(self, **kwargs: Any) -> None:
"""Play the test sound on a Ring Chime device."""
tone = kwargs.get(ATTR_TONE) or KIND_DING

self._device.test_sound(kind=tone)
55 changes: 0 additions & 55 deletions tests/components/ring/test_button.py

This file was deleted.

132 changes: 132 additions & 0 deletions tests/components/ring/test_siren.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
"""The tests for the Ring button platform."""

from homeassistant.const import Platform
from homeassistant.helpers import entity_registry as er

from .common import setup_platform


async def test_entity_registry(hass, requests_mock):
"""Tests that the devices are registered in the entity registry."""
await setup_platform(hass, Platform.SIREN)
entity_registry = er.async_get(hass)

entry = entity_registry.async_get("siren.downstairs_siren")
assert entry.unique_id == "123456-siren"


async def test_sirens_report_correctly(hass, requests_mock):
"""Tests that the initial state of a device that should be on is correct."""
await setup_platform(hass, Platform.SIREN)

state = hass.states.get("siren.downstairs_siren")
assert state.attributes.get("friendly_name") == "Downstairs Siren"
assert state.state == "unknown"


async def test_default_ding_chime_can_be_played(hass, requests_mock):
"""Tests the play chime request is sent correctly."""
await setup_platform(hass, Platform.SIREN)

# Mocks the response for playing a test sound
requests_mock.post(
"https://api.ring.com/clients_api/chimes/123456/play_sound",
text="SUCCESS",
)
await hass.services.async_call(
"siren",
"turn_on",
{"entity_id": "siren.downstairs_siren"},
blocking=True,
)

await hass.async_block_till_done()

assert requests_mock.request_history[-1].url.startswith(
"https://api.ring.com/clients_api/chimes/123456/play_sound?"
)
assert "kind=ding" in requests_mock.request_history[-1].url

state = hass.states.get("siren.downstairs_siren")
assert state.state == "unknown"


async def test_toggle_plays_default_chime(hass, requests_mock):
"""Tests the play chime request is sent correctly when toggled."""
await setup_platform(hass, Platform.SIREN)

# Mocks the response for playing a test sound
requests_mock.post(
"https://api.ring.com/clients_api/chimes/123456/play_sound",
text="SUCCESS",
)
await hass.services.async_call(
"siren",
"toggle",
{"entity_id": "siren.downstairs_siren"},
blocking=True,
)

await hass.async_block_till_done()

assert requests_mock.request_history[-1].url.startswith(
"https://api.ring.com/clients_api/chimes/123456/play_sound?"
)
assert "kind=ding" in requests_mock.request_history[-1].url

state = hass.states.get("siren.downstairs_siren")
assert state.state == "unknown"


async def test_explicit_ding_chime_can_be_played(hass, requests_mock):
"""Tests the play chime request is sent correctly."""
await setup_platform(hass, Platform.SIREN)

# Mocks the response for playing a test sound
requests_mock.post(
"https://api.ring.com/clients_api/chimes/123456/play_sound",
text="SUCCESS",
)
await hass.services.async_call(
"siren",
"turn_on",
{"entity_id": "siren.downstairs_siren", "tone": "ding"},
blocking=True,
)

await hass.async_block_till_done()

assert requests_mock.request_history[-1].url.startswith(
"https://api.ring.com/clients_api/chimes/123456/play_sound?"
)
assert "kind=ding" in requests_mock.request_history[-1].url

state = hass.states.get("siren.downstairs_siren")
assert state.state == "unknown"


async def test_motion_chime_can_be_played(hass, requests_mock):
"""Tests the play chime request is sent correctly."""
await setup_platform(hass, Platform.SIREN)

# Mocks the response for playing a test sound
requests_mock.post(
"https://api.ring.com/clients_api/chimes/123456/play_sound",
text="SUCCESS",
)
await hass.services.async_call(
"siren",
"turn_on",
{"entity_id": "siren.downstairs_siren", "tone": "motion"},
blocking=True,
)

await hass.async_block_till_done()

assert requests_mock.request_history[-1].url.startswith(
"https://api.ring.com/clients_api/chimes/123456/play_sound?"
)
assert "kind=motion" in requests_mock.request_history[-1].url

state = hass.states.get("siren.downstairs_siren")
assert state.state == "unknown"