Write the sun's and the forecast's times, and the top bar's, for the screens' 12 or 24-hour clock
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -16,6 +16,7 @@ from datetime import datetime, time
|
||||
|
||||
import tile_icons
|
||||
from core import HEADER_BUILTIN, HEADER_CONTENTS, HEADER_MAX_ITEMS, HEADER_MIN_FIRMWARE, HEADER_SHOWS, epoch, header_items, local_clock, short, state_word
|
||||
import i18n
|
||||
from i18n import TRANSLATIONS, screen_number, screen_t, t
|
||||
|
||||
# Characters the top bar's text font carries on both boards (`sublabel_big` in the profiles;
|
||||
@@ -183,6 +184,8 @@ def value(entity, state, entry=None, units=None, tz=None, words=None):
|
||||
if domain == 'sun':
|
||||
# The next event: sunset while the sun is up, sunrise while it is down.
|
||||
clock = local_clock(attrs.get('next_setting' if raw == 'above_horizon' else 'next_rising'), tz)
|
||||
if clock:
|
||||
clock = i18n.screen_clock(int(clock[:2]), int(clock[3:]))
|
||||
return (clock or state_text(raw) or raw), None
|
||||
if domain == 'weather':
|
||||
temperature = numeric(attrs.get('temperature'))
|
||||
@@ -204,9 +207,10 @@ def value(entity, state, entry=None, units=None, tz=None, words=None):
|
||||
moment = datetime.fromisoformat(raw) if attrs.get('has_date') else datetime.combine(datetime.min, time.fromisoformat(raw))
|
||||
except ValueError:
|
||||
return raw, None
|
||||
# A time of day as the screens' clock writes it (Settings -> Language & region, app 0.2.90).
|
||||
if attrs.get('has_date') and attrs.get('has_time'):
|
||||
return f'{short_date(moment)} {moment:%H:%M}', None
|
||||
return (short_date(moment) if attrs.get('has_date') else f'{moment:%H:%M}'), None
|
||||
return f'{short_date(moment)} {i18n.screen_clock(moment.hour, moment.minute)}', None
|
||||
return (short_date(moment) if attrs.get('has_date') else i18n.screen_clock(moment.hour, moment.minute)), None
|
||||
if domain == 'sensor' and attrs.get('device_class') == 'timestamp':
|
||||
return (None, epoch(raw)) if epoch(raw) else (raw, None)
|
||||
if domain == 'sensor' and attrs.get('device_class') == 'date':
|
||||
|
||||
@@ -171,11 +171,11 @@ def shown(value):
|
||||
|
||||
# The screens' language and number format (Settings -> Language & region), for the words the app sends to the screens
|
||||
# itself: tile names, the top bar, the history card. The manager keeps it current (Manager.language_changed).
|
||||
SCREENS = {'language': 'en', 'numbers': 'point'}
|
||||
SCREENS = {'language': 'en', 'numbers': 'point', 'clock_24h': True}
|
||||
|
||||
|
||||
def set_screens(language, numbers):
|
||||
SCREENS.update(language=language, numbers=numbers)
|
||||
def set_screens(language, numbers, clock_24h=True):
|
||||
SCREENS.update(language=language, numbers=numbers, clock_24h=clock_24h)
|
||||
|
||||
|
||||
def screen_t(key, **params):
|
||||
@@ -184,6 +184,14 @@ def screen_t(key, **params):
|
||||
return _render(key, SCREENS['language'], params)
|
||||
|
||||
|
||||
def screen_clock(hour, minute):
|
||||
"""A time of day as the screens write it: "07:30" on 24 hours, "7:30 AM" on 12, in the language's day periods."""
|
||||
if SCREENS.get('clock_24h', True):
|
||||
return f'{hour:02d}:{minute:02d}'
|
||||
period = TRANSLATIONS.text('screen.time.am' if hour < 12 else 'screen.time.pm', SCREENS['language'])
|
||||
return f'{hour % 12 or 12}:{minute:02d} {period}'
|
||||
|
||||
|
||||
def screen_number(text):
|
||||
"""A number as Home Assistant sends it, written as the screens write numbers ("1.234,5" in Dutch)."""
|
||||
return format_number(text, SCREENS['numbers'])
|
||||
@@ -251,9 +259,6 @@ class Region:
|
||||
'clock': self.clock, 'clock_effective': '24' if self.clock_24h() else '12',
|
||||
'numbers': self.numbers, 'numbers_effective': self.number_style()}
|
||||
|
||||
def screen_text(self, key, **params):
|
||||
"""A `screen` or `addon` text in the screens' language, for what the app itself sends to them."""
|
||||
return self.tr.text(key, self.language(), **params)
|
||||
|
||||
|
||||
def format_number(text, style):
|
||||
|
||||
@@ -572,7 +572,7 @@ class Manager:
|
||||
self.ha.language_of = self.region.language
|
||||
self.ha.on_config = self.language_changed
|
||||
self.pin_clock = False
|
||||
i18n.set_screens(self.region.language(), self.region.number_style())
|
||||
i18n.set_screens(self.region.language(), self.region.number_style(), self.region.clock_24h())
|
||||
self.skill_dir = claude_skill.skill_dir()
|
||||
self._registry_source, self._registry_index = None, {}
|
||||
self._items_source, self._items = None, []
|
||||
@@ -1153,7 +1153,7 @@ class Manager:
|
||||
if known and all(state == 'off' for state in known):
|
||||
self.region.clock = '12'
|
||||
self.region.save()
|
||||
i18n.set_screens(self.region.language(), self.region.number_style())
|
||||
i18n.set_screens(self.region.language(), self.region.number_style(), self.region.clock_24h())
|
||||
self.ha.services_changed.set()
|
||||
self.sent.clear()
|
||||
self.write_languages()
|
||||
|
||||
Reference in New Issue
Block a user