Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for tracking the zodiac sign."""
2 
3 from __future__ import annotations
4 
5 from homeassistant.components.sensor import SensorDeviceClass, SensorEntity
6 from homeassistant.config_entries import ConfigEntry
7 from homeassistant.core import HomeAssistant
8 from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
9 from homeassistant.helpers.entity_platform import AddEntitiesCallback
10 from homeassistant.util.dt import as_local, utcnow
11 
12 from .const import (
13  ATTR_ELEMENT,
14  ATTR_MODALITY,
15  DEFAULT_NAME,
16  DOMAIN,
17  ELEMENT_AIR,
18  ELEMENT_EARTH,
19  ELEMENT_FIRE,
20  ELEMENT_WATER,
21  MODALITY_CARDINAL,
22  MODALITY_FIXED,
23  MODALITY_MUTABLE,
24  SIGN_AQUARIUS,
25  SIGN_ARIES,
26  SIGN_CANCER,
27  SIGN_CAPRICORN,
28  SIGN_GEMINI,
29  SIGN_LEO,
30  SIGN_LIBRA,
31  SIGN_PISCES,
32  SIGN_SAGITTARIUS,
33  SIGN_SCORPIO,
34  SIGN_TAURUS,
35  SIGN_VIRGO,
36 )
37 
38 ZODIAC_BY_DATE = (
39  (
40  (21, 3),
41  (20, 4),
42  SIGN_ARIES,
43  {
44  ATTR_ELEMENT: ELEMENT_FIRE,
45  ATTR_MODALITY: MODALITY_CARDINAL,
46  },
47  ),
48  (
49  (21, 4),
50  (20, 5),
51  SIGN_TAURUS,
52  {
53  ATTR_ELEMENT: ELEMENT_EARTH,
54  ATTR_MODALITY: MODALITY_FIXED,
55  },
56  ),
57  (
58  (21, 5),
59  (21, 6),
60  SIGN_GEMINI,
61  {
62  ATTR_ELEMENT: ELEMENT_AIR,
63  ATTR_MODALITY: MODALITY_MUTABLE,
64  },
65  ),
66  (
67  (22, 6),
68  (22, 7),
69  SIGN_CANCER,
70  {
71  ATTR_ELEMENT: ELEMENT_WATER,
72  ATTR_MODALITY: MODALITY_CARDINAL,
73  },
74  ),
75  (
76  (23, 7),
77  (22, 8),
78  SIGN_LEO,
79  {
80  ATTR_ELEMENT: ELEMENT_FIRE,
81  ATTR_MODALITY: MODALITY_FIXED,
82  },
83  ),
84  (
85  (23, 8),
86  (21, 9),
87  SIGN_VIRGO,
88  {
89  ATTR_ELEMENT: ELEMENT_EARTH,
90  ATTR_MODALITY: MODALITY_MUTABLE,
91  },
92  ),
93  (
94  (22, 9),
95  (22, 10),
96  SIGN_LIBRA,
97  {
98  ATTR_ELEMENT: ELEMENT_AIR,
99  ATTR_MODALITY: MODALITY_CARDINAL,
100  },
101  ),
102  (
103  (23, 10),
104  (22, 11),
105  SIGN_SCORPIO,
106  {
107  ATTR_ELEMENT: ELEMENT_WATER,
108  ATTR_MODALITY: MODALITY_FIXED,
109  },
110  ),
111  (
112  (23, 11),
113  (21, 12),
114  SIGN_SAGITTARIUS,
115  {
116  ATTR_ELEMENT: ELEMENT_FIRE,
117  ATTR_MODALITY: MODALITY_MUTABLE,
118  },
119  ),
120  (
121  (22, 12),
122  (20, 1),
123  SIGN_CAPRICORN,
124  {
125  ATTR_ELEMENT: ELEMENT_EARTH,
126  ATTR_MODALITY: MODALITY_CARDINAL,
127  },
128  ),
129  (
130  (21, 1),
131  (19, 2),
132  SIGN_AQUARIUS,
133  {
134  ATTR_ELEMENT: ELEMENT_AIR,
135  ATTR_MODALITY: MODALITY_FIXED,
136  },
137  ),
138  (
139  (20, 2),
140  (20, 3),
141  SIGN_PISCES,
142  {
143  ATTR_ELEMENT: ELEMENT_WATER,
144  ATTR_MODALITY: MODALITY_MUTABLE,
145  },
146  ),
147 )
148 
149 
151  hass: HomeAssistant,
152  entry: ConfigEntry,
153  async_add_entities: AddEntitiesCallback,
154 ) -> None:
155  """Initialize the entries."""
156 
157  async_add_entities([ZodiacSensor(entry_id=entry.entry_id)], True)
158 
159 
161  """Representation of a Zodiac sensor."""
162 
163  _attr_name = None
164  _attr_has_entity_name = True
165  _attr_device_class = SensorDeviceClass.ENUM
166  _attr_options = [
167  SIGN_AQUARIUS,
168  SIGN_ARIES,
169  SIGN_CANCER,
170  SIGN_CAPRICORN,
171  SIGN_GEMINI,
172  SIGN_LEO,
173  SIGN_LIBRA,
174  SIGN_PISCES,
175  SIGN_SAGITTARIUS,
176  SIGN_SCORPIO,
177  SIGN_TAURUS,
178  SIGN_VIRGO,
179  ]
180  _attr_translation_key = "sign"
181  _attr_unique_id = DOMAIN
182 
183  def __init__(self, entry_id: str) -> None:
184  """Initialize Zodiac sensor."""
185  self._attr_device_info_attr_device_info = DeviceInfo(
186  name=DEFAULT_NAME,
187  identifiers={(DOMAIN, entry_id)},
188  entry_type=DeviceEntryType.SERVICE,
189  )
190 
191  async def async_update(self) -> None:
192  """Get the time and updates the state."""
193  today = as_local(utcnow()).date()
194 
195  for sign in ZODIAC_BY_DATE:
196  if (today.month == sign[0][1] and today.day >= sign[0][0]) or (
197  today.month == sign[1][1] and today.day <= sign[1][0]
198  ):
199  self._attr_native_value_attr_native_value = sign[2]
200  self._attr_extra_state_attributes_attr_extra_state_attributes = sign[3]
201  break
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:154
dt.datetime as_local(dt.datetime dattim)
Definition: dt.py:157