parent
633e7e90ac
commit
a4a5057b0b
|
@ -4,7 +4,10 @@ from __future__ import annotations
|
|||
from astral import moon
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.components.sensor import PLATFORM_SCHEMA, SensorEntity
|
||||
from homeassistant.components.sensor import (
|
||||
PLATFORM_SCHEMA as PARENT_PLATFORM_SCHEMA,
|
||||
SensorEntity,
|
||||
)
|
||||
from homeassistant.const import CONF_NAME
|
||||
from homeassistant.core import HomeAssistant
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
|
@ -34,7 +37,7 @@ MOON_ICONS = {
|
|||
STATE_WAXING_GIBBOUS: "mdi:moon-waxing-gibbous",
|
||||
}
|
||||
|
||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
|
||||
PLATFORM_SCHEMA = PARENT_PLATFORM_SCHEMA.extend(
|
||||
{vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string}
|
||||
)
|
||||
|
||||
|
@ -46,7 +49,7 @@ async def async_setup_platform(
|
|||
discovery_info: DiscoveryInfoType | None = None,
|
||||
) -> None:
|
||||
"""Set up the Moon sensor."""
|
||||
name = config.get(CONF_NAME)
|
||||
name: str = config[CONF_NAME]
|
||||
|
||||
async_add_entities([MoonSensor(name)], True)
|
||||
|
||||
|
@ -54,46 +57,32 @@ async def async_setup_platform(
|
|||
class MoonSensor(SensorEntity):
|
||||
"""Representation of a Moon sensor."""
|
||||
|
||||
def __init__(self, name):
|
||||
_attr_device_class = "moon__phase"
|
||||
|
||||
def __init__(self, name: str) -> None:
|
||||
"""Initialize the moon sensor."""
|
||||
self._name = name
|
||||
self._state = None
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
"""Return the name of the entity."""
|
||||
return self._name
|
||||
|
||||
@property
|
||||
def device_class(self):
|
||||
"""Return the device class of the entity."""
|
||||
return "moon__phase"
|
||||
|
||||
@property
|
||||
def native_value(self):
|
||||
"""Return the state of the device."""
|
||||
if self._state < 0.5 or self._state > 27.5:
|
||||
return STATE_NEW_MOON
|
||||
if self._state < 6.5:
|
||||
return STATE_WAXING_CRESCENT
|
||||
if self._state < 7.5:
|
||||
return STATE_FIRST_QUARTER
|
||||
if self._state < 13.5:
|
||||
return STATE_WAXING_GIBBOUS
|
||||
if self._state < 14.5:
|
||||
return STATE_FULL_MOON
|
||||
if self._state < 20.5:
|
||||
return STATE_WANING_GIBBOUS
|
||||
if self._state < 21.5:
|
||||
return STATE_LAST_QUARTER
|
||||
return STATE_WANING_CRESCENT
|
||||
|
||||
@property
|
||||
def icon(self):
|
||||
"""Icon to use in the frontend, if any."""
|
||||
return MOON_ICONS.get(self.state)
|
||||
self._attr_name = name
|
||||
|
||||
async def async_update(self):
|
||||
"""Get the time and updates the states."""
|
||||
today = dt_util.as_local(dt_util.utcnow()).date()
|
||||
self._state = moon.phase(today)
|
||||
state = moon.phase(today)
|
||||
|
||||
if state < 0.5 or state > 27.5:
|
||||
self._attr_native_value = STATE_NEW_MOON
|
||||
elif state < 6.5:
|
||||
self._attr_native_value = STATE_WAXING_CRESCENT
|
||||
elif state < 7.5:
|
||||
self._attr_native_value = STATE_FIRST_QUARTER
|
||||
elif state < 13.5:
|
||||
self._attr_native_value = STATE_WAXING_GIBBOUS
|
||||
elif state < 14.5:
|
||||
self._attr_native_value = STATE_FULL_MOON
|
||||
elif state < 20.5:
|
||||
self._attr_native_value = STATE_WANING_GIBBOUS
|
||||
elif state < 21.5:
|
||||
self._attr_native_value = STATE_LAST_QUARTER
|
||||
else:
|
||||
self._attr_native_value = STATE_WANING_CRESCENT
|
||||
|
||||
self._attr_icon = MOON_ICONS.get(self._attr_native_value)
|
||||
|
|
|
@ -1,56 +1,66 @@
|
|||
"""The test for the moon sensor platform."""
|
||||
from datetime import datetime
|
||||
from __future__ import annotations
|
||||
|
||||
from unittest.mock import patch
|
||||
|
||||
import pytest
|
||||
|
||||
from homeassistant.components.homeassistant import (
|
||||
DOMAIN as HA_DOMAIN,
|
||||
SERVICE_UPDATE_ENTITY,
|
||||
)
|
||||
from homeassistant.components.moon.sensor import (
|
||||
MOON_ICONS,
|
||||
STATE_FIRST_QUARTER,
|
||||
STATE_FULL_MOON,
|
||||
STATE_LAST_QUARTER,
|
||||
STATE_NEW_MOON,
|
||||
STATE_WANING_CRESCENT,
|
||||
STATE_WANING_GIBBOUS,
|
||||
STATE_WAXING_CRESCENT,
|
||||
STATE_WAXING_GIBBOUS,
|
||||
)
|
||||
from homeassistant.const import ATTR_ENTITY_ID
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.setup import async_setup_component
|
||||
import homeassistant.util.dt as dt_util
|
||||
|
||||
DAY1 = datetime(2017, 1, 1, 1, tzinfo=dt_util.UTC)
|
||||
DAY2 = datetime(2017, 1, 18, 1, tzinfo=dt_util.UTC)
|
||||
|
||||
|
||||
async def test_moon_day1(hass):
|
||||
@pytest.mark.parametrize(
|
||||
"moon_value,native_value,icon",
|
||||
[
|
||||
(0, STATE_NEW_MOON, MOON_ICONS[STATE_NEW_MOON]),
|
||||
(5, STATE_WAXING_CRESCENT, MOON_ICONS[STATE_WAXING_CRESCENT]),
|
||||
(7, STATE_FIRST_QUARTER, MOON_ICONS[STATE_FIRST_QUARTER]),
|
||||
(12, STATE_WAXING_GIBBOUS, MOON_ICONS[STATE_WAXING_GIBBOUS]),
|
||||
(14.3, STATE_FULL_MOON, MOON_ICONS[STATE_FULL_MOON]),
|
||||
(20.1, STATE_WANING_GIBBOUS, MOON_ICONS[STATE_WANING_GIBBOUS]),
|
||||
(20.8, STATE_LAST_QUARTER, MOON_ICONS[STATE_LAST_QUARTER]),
|
||||
(23, STATE_WANING_CRESCENT, MOON_ICONS[STATE_WANING_CRESCENT]),
|
||||
],
|
||||
)
|
||||
async def test_moon_day(
|
||||
hass: HomeAssistant, moon_value: float, native_value: str, icon: str
|
||||
) -> None:
|
||||
"""Test the Moon sensor."""
|
||||
config = {"sensor": {"platform": "moon", "name": "moon_day1"}}
|
||||
config = {"sensor": {"platform": "moon"}}
|
||||
|
||||
await async_setup_component(hass, HA_DOMAIN, {})
|
||||
assert await async_setup_component(hass, "sensor", config)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert hass.states.get("sensor.moon_day1")
|
||||
assert hass.states.get("sensor.moon")
|
||||
|
||||
with patch(
|
||||
"homeassistant.components.moon.sensor.dt_util.utcnow", return_value=DAY1
|
||||
"homeassistant.components.moon.sensor.moon.phase", return_value=moon_value
|
||||
):
|
||||
await async_update_entity(hass, "sensor.moon_day1")
|
||||
await async_update_entity(hass, "sensor.moon")
|
||||
|
||||
assert hass.states.get("sensor.moon_day1").state == "waxing_crescent"
|
||||
state = hass.states.get("sensor.moon")
|
||||
assert state.state == native_value
|
||||
assert state.attributes["icon"] == icon
|
||||
|
||||
|
||||
async def test_moon_day2(hass):
|
||||
"""Test the Moon sensor."""
|
||||
config = {"sensor": {"platform": "moon", "name": "moon_day2"}}
|
||||
|
||||
await async_setup_component(hass, HA_DOMAIN, {})
|
||||
assert await async_setup_component(hass, "sensor", config)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
assert hass.states.get("sensor.moon_day2")
|
||||
|
||||
with patch(
|
||||
"homeassistant.components.moon.sensor.dt_util.utcnow", return_value=DAY2
|
||||
):
|
||||
await async_update_entity(hass, "sensor.moon_day2")
|
||||
|
||||
assert hass.states.get("sensor.moon_day2").state == "waning_gibbous"
|
||||
|
||||
|
||||
async def async_update_entity(hass, entity_id):
|
||||
async def async_update_entity(hass: HomeAssistant, entity_id: str) -> None:
|
||||
"""Run an update action for an entity."""
|
||||
await hass.services.async_call(
|
||||
HA_DOMAIN,
|
||||
|
|
Loading…
Reference in New Issue