You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* Refactor Bakalari timetable calendar coordinator-backed
Replace per-entity API client with BakalariCoordinator. Calendar
entities read timetable data from the coordinator's shared snapshot,
rebuild their event cache on coordinator updates, and request
coordinator refreshes instead of performing direct HTTP calls. Move
timetable conversion and utility helpers into the calendar module.
* Refactor Bakalari integration to separate coordinators
- Split original coordinator into three: marks, messages, and timetable
- Introduce ChildrenIndex class as a shared source of truth for children
- Update async_setup_entry to create and register all three coordinators
- Modify calendar entity to use timetable coordinator and cache events
from coordinator data
- Add messages-specific coordinator with independent update interval and
seen-message tracking
- Add timetable-specific coordinator with independent longer update
interval
- Adapt sensors, entities, websocket commands, and services to use the
new coordinators
- Remove direct API calls from calendar and sensors; data comes from
coordinators
- Add ChildrenIndex for consistent child handling across coordinators
and entities
- Update tests to use the new coordinators and children indexing classes
* Annotate marks and messages as new; add events and services
- Add `is_new` flag to marks and messages with in-memory per-child cache
- Fire `bakalari_new_mark` and `bakalari_new_message` events on new
items
- Introduce services to mark marks/messages as seen and refresh data
- Add WebSocket API support for marks, messages, and timetable queries
- Document sensors, attributes, API, and example automations in README
- Simplify marks coordinator by removing unused legacy code and
variables
- Update sensors to rely directly on main coordinators without legacy
resolvers
* Bump version of API
* Fix version in const.py
* Add service to sign all marks for a child
Added service call for frontend to support singnign marks. Added
api_call to API for singing marks.
* Rename sign_all_marks methods to async_sign_marks for consistency
* Refactor Bakalari setup to improve structure and concurrency
- Split async_setup_entry into smaller helper functions for devices,
services, and WebSocket registration - Run initial coordinator refreshes
concurrently using asyncio.gather - Use a single SW_VERSION constant for
software version info - Clean up coordinator and entity code to reflect
new version handling
* Rename sign_all_marks to async_sign_marks and update service handler
accordingly
* Refresh marks coordinator after signing marks
* Bump API version to 0.9.0
* Update README, update CHANGELOG
@@ -14,17 +14,6 @@ Custom komponenta pro Home Assistant, založená na [async-bakalari-api3](https:
14
14
- původní senzor `all_marks` již drží jen metadata pro Lovelace kartu
15
15
- obsah metadat a co lze z tohoto senzoru získat viz níže.
16
16
17
-
Od verze 1.1.0 jsou již senzory migrovány pod `DeviceRegistry`
18
-
- nově je každé dítě jako separátní `DeviceRegistry` (zařízení v HUBu) s jednotlivými senzory
19
-
-`uid` senzoru se nezměnilo, ale změnil se název senzoru - nyní dědí jméno z `DeviceRegistry`
20
-
- nově jsou tedy názvy senzorů takto: `sensor.<device_name>_<sensor_name>`
21
-
- kde `<device_name>` je jméno dítěte + škola
22
-
-`friendly_name` je složen z `<sensor_name> - <short_name>`, tedy např. `Rozvrh - Jan`
23
-
24
-
- staré senzory se již neaktualizují a nebudou generovány při odebrání a znovupřidání integrace.
25
-
26
-
## ⚠️ ***Po aktualizaci na verzi 1.1.0+ je tedy nutné změnit názvy senzorů v kartách v Lovelace***
27
-
28
17
## Instalace (HACS)
29
18
30
19
1. V HACS → **Integrations** → menu (⋮) → **Custom repositories**
@@ -44,7 +33,9 @@ Od verze 1.1.0 jsou již senzory migrovány pod `DeviceRegistry`
44
33
- tento senzor stahuje rozvrh na aktuální týden +- 7 dní
45
34
46
35
- Známky
47
-
- každý předmět má nyní svůj vlastní senzro
36
+
- každý předmět má nyní svůj vlastní senzor
37
+
- lze podepisovat známky - buď jednotlivě u každé známky nebo hromadně v záhlaví Lovelace karty\
38
+
u nepodepsné známky se zobrazí ikona podpisu, která je proklikávací.
48
39
- původní senzor `all_marks` udržuje pouze metadata pro Lovelace kartu
49
40
- ze školního serveru se již stahují všechny známky, zrušen limit 30 posledních
50
41
- známky jsou agregované per-předmět a per-child
@@ -81,6 +72,135 @@ summary:
81
72
total_non_point_marks: "105"
82
73
```
83
74
75
+
## Anotované známky (is_new) a události
76
+
77
+
- Každá známka je při zpracování anotovaná příznakem `is_new`. Ten je `true`, pokud kombinace (dítě, id známky) ještě nebyla v interní cache integrace.
78
+
- Tento příznak používají senzory pro výpočet počtu nových známek a agregace po předmětech.
79
+
- Cache „seen“ je in-memory. Po restartu HA se nově načtené známky dočasně považují za nové, dokud je integrace nevyhodnotí a neodpálí události. Pokud potřebuješ trvalé chování přes restarty, je vhodné použít automatizace (viz níže) a/nebo budoucí perzistenci.
80
+
81
+
### Událost `bakalari_new_mark`
82
+
83
+
- Při objevení nové známky integrace vyvolá událost `bakalari_new_mark` na Event Busu.
84
+
- Payload obsahuje atributy známky dle Bakalářů (např. `id`, `date`, `subject_id`, `subject_abbr`, `subject_name`, `caption`, `theme`, `mark_text`, `is_points`, …).
85
+
86
+
### Příklad automatizace (oznámení o nové známce)
87
+
88
+
```yaml
89
+
alias: Bakaláři – nová známka (notifikace)
90
+
description: Odeslat push notifikaci při nové známce
91
+
mode: parallel
92
+
trigger:
93
+
- platform: event
94
+
event_type: bakalari_new_mark
95
+
condition: []
96
+
action:
97
+
- service: notify.mobile_app_telefon
98
+
data:
99
+
title: "Nová známka – {{ trigger.event.data.subject_abbr or trigger.event.data.subject_name }}"
- Známky: klíč `scan_interval` (sekundy), výchozí 900 s. Probíhá s jitterem ±10 % kvůli omezení špiček.
197
+
- Zprávy: klíč `scan_interval_messages` (sekundy), výchozí 3600 s. Také s jitterem ±10 %.
198
+
- Rozvrh: klíč `scan_interval_timetable` (sekundy), výchozí 21600 s (6 h). Také s jitterem ±10 %.
199
+
200
+
Poznámky:
201
+
- Intervaly se aplikují per koordinátor. Pokud nejsou klíče v options přítomné, použijí se výchozí hodnoty.
202
+
- Po ručním volání služeb `refresh*` se naplánuje další cyklus opět podle intervalu.
203
+
84
204
## Karty pro Lovelace jsou nyní instalovány přes HACS ve vlastím [repozitáři](https://github.com/schizza/bakalari-ha-frontend).
85
205
86
206
- v HACS přidej repozitář `https://github.com/schizza/bakalari-ha-frontend`
@@ -90,14 +210,97 @@ summary:
90
210
- Zprávy `type: custom:bakalari-messages-card`
91
211
- více informací o kartách najdete v [repozitáři](https://github.com/schizza/bakalari-ha-frontend)
92
212
213
+
## Přehled senzorů a atributů
214
+
215
+
Níže je stručný přehled vytvářených entit a jejich stavů/atributů.
216
+
217
+
- Nové známky – `sensor.Nové známky - <dítě>`
218
+
- Stav: počet nových známek (počítá se podle příznaku is_new u každé známky)
219
+
- Atributy:
220
+
- `child_key`: identifikátor dítěte
221
+
- `recent`: posledních několik známek (každá položka nese alespoň: `id`, `date`, `subject_id`, `subject_abbr`, `subject_name`, `caption`, `theme`, `mark_text` nebo `points_text`, `is_points`, případně `weight/coef/coefficient`, a hlavně `is_new`)
222
+
- `total_marks_cached`: kolik známek je právě v cache koordinátoru
223
+
224
+
- Poslední známka – `sensor.Poslední známka - <dítě>`
225
+
- Stav: krátký text „<předmět> <známka>“, např. „M 1“
226
+
- Atributy:
227
+
- `child_key`: identifikátor dítěte
228
+
- `last`: poslední známka (stejná struktura položky jako výše)
229
+
230
+
- Známky podle předmětu – `sensor.Známky <ABBR> - <dítě>` (dynamicky generované per předmět)
231
+
- Stav: počet známek v daném předmětu
232
+
- Atributy:
233
+
- `child_key`: identifikátor dítěte
234
+
- `subject_key`: interní klíč předmětu (id nebo zkratka či jméno)
- Zobrazuje jednotlivé hodiny v daném období (aktuální týden, +1 a -1 týden)
262
+
- Vlastnosti událostí: `start`, `end`, `summary` (předmět), `description` (učitel, skupiny, téma, změny), `location` (učebna)
263
+
264
+
Poznámky:
265
+
- Každá známka i zpráva je anotovaná příznakem `is_new` (in-memory per dítě). Po restartu HA se nové položky mohou dočasně chovat jako „nové“, dokud proběhne první diff.
266
+
- Pro potlačení „novosti“ lze použít služby `bakalari.mark_as_seen` a `bakalari.mark_message_as_seen` (viz výše).
267
+
268
+
## Datové modely v koordinátorech
269
+
270
+
Tyto struktury najdeš v `coordinator.data`. Klíče jsou stabilní API pro senzory, frontend karty a automatizace.
- `school_year`: `{ start: ISO date, end_exclusive: ISO date }`
278
+
- `last_sync_ok`: boolean
279
+
- Položka `mark` typicky obsahuje: `id`, `date`, `subject_id`, `subject_abbr`, `subject_name`, `caption`, `theme`, `mark_text` nebo `points_text`, `is_points`, případně `weight/coef/coefficient`, a v anotované větvi navíc `is_new`.
280
+
281
+
- Koordinátor zpráv (Komens)
282
+
- `messages_by_child`: mapování `child_key` → `list[message]` – každá zpráva má `is_new`
283
+
- `last_sync_ok`: boolean
284
+
- Položka `message` je slovník dle API (např. `id`/`message_id`, `title`/`subject`, `date`/`created`, `preview`, `from`, `to`, …) + `is_new`.
- `permanent_timetable_by_child`: mapování `child_key` → „permanentní“ rozvrh (pokud škola poskytuje)
289
+
- `timetable_window_dates`: mapování `child_key` → `list[ISO date]` – jaké dny byly načteny
290
+
- `last_sync_ok`: boolean
291
+
292
+
Doporučení:
293
+
- Pro zobrazování použij `marks_by_child` (již obsahuje `is_new`), pro odvozování novinek v automatizacích se spolehni na události `bakalari_new_mark` a `bakalari_new_message`.
294
+
- Per-předmět agregace a další statistiky pro senzory poskytuje helper `aggregate_marks_for_child` a jsou k dispozici v atributech senzorů dle výše uvedeného přehledu.
0 commit comments