Integracja Home Assistant z systemem Librus Synergia, umożliwiająca monitorowanie ocen, wiadomości i innych danych szkolnych.
- 📊 Monitoring ocen - wszystkie oceny ze wszystkich przedmiotów
- 📈 Statystyki - średnie ocen, liczba ocen, trend
- 📧 Wiadomości - najnowsze wiadomości z dziennika
- 🔔 Powiadomienia - automatyczne powiadomienia o nowych ocenach/wiadomościach
- 🏠 Dashboard - piękne karty w Home Assistant
Integracja tworzy następujące sensory:
| Sensor | Opis | Wartość |
|---|---|---|
sensor.librus_uczen |
Informacje o uczniu (klasa, wychowawca, szkoła) | imię i nazwisko |
sensor.librus_szczesliwy_numerek |
Szczęśliwy numerek dnia | numer |
sensor.librus_oceny |
Wszystkie oceny bieżącego semestru | liczba ocen |
sensor.librus_srednia_ocen |
Globalna średnia ze wszystkich przedmiotów | float (wykres 📈) |
sensor.librus_wiadomosci |
Ostatnie 5 wiadomości z pełną treścią | liczba nieprzeczytanych |
sensor.librus_<przedmiot> |
Oceny z danego przedmiotu (np. sensor.librus_matematyka) |
lista ocen: "4, 3+, 5" |
sensor.librus_srednia_<przedmiot> |
Średnia z danego przedmiotu (np. sensor.librus_srednia_matematyka) |
float (wykres 📈) |
Sensory średnich mają state_class: measurement — HA automatycznie rysuje dla nich wykres historyczny po kliknięciu w encję.
Kliknij poniższy przycisk, aby automatycznie dodać repozytorium do HACS z właściwą kategorią:
Lub ręcznie:
- Otwórz HACS w Home Assistant
- Kliknij trzy kropki (⋮) w prawym górnym rogu
- Wybierz "Custom repositories"
- W polu URL wpisz dokładnie:
https://github.com/LukMaverick/LibrusSynergiaHA
⚠️ Bez.gitna końcu! - W polu Category wybierz:
Integration
⚠️ NIE wybieraj "AppDaemon", "Plugin" ani żadnej innej opcji! - Kliknij ADD
- Znajdź "Librus Synergia HA" na liście i zainstaluj
- Restartuj Home Assistant
Uwaga: Błąd "is not a valid app repository" pojawia się, gdy w kroku 5 zostanie wybrana nieprawidłowa kategoria (np. "AppDaemon"). Upewnij się, że wybrano Integration.
- Skopiuj folder
custom_components/librus_apixdoconfig/custom_components/ - Restartuj Home Assistant
- Idź do Konfiguracja > Integracje > Dodaj integrację
- Wyszukaj "Librus APIX"
- W Home Assistant: Konfiguracja > Integracje > Dodaj integrację
- Wyszukaj "Librus APIX"
- Podaj swoje dane logowania do Librus Synergia:
- Login/Username: Twój login do Librus
- Hasło: Twoje hasło do Librus
- Kliknij "Prześlij"
Projekt zawiera local środowisko testowe z Docker:
# Uruchom środowisko testowe
docker-compose up -d
# Home Assistant dostępny pod: http://localhost:8123
# Code Server dostępny pod: http://localhost:8443 (hasło: homeassistant)type: entities
title: "📚 Oceny Librus"
entities:
- entity: sensor.librus_srednia_ocen
name: "Globalna średnia"
- entity: sensor.librus_oceny
name: "Liczba ocen"
- entity: sensor.librus_szczesliwy_numerek
name: "Szczęśliwy numerek"Wymagane: Mushroom Cards zainstalowane przez HACS.
- Idź do Developer Tools → States
- Wyszukaj
wiadomosci - Skopiuj pełną nazwę encji (np.
sensor.wiadomosci) - Zamień
sensor.wiadomosciponiżej na swoją nazwę
type: vertical-stack
cards:
- type: custom:mushroom-title-card
title: 📬 Wiadomości Librus
subtitle: >
{% set n = state_attr('sensor.wiadomosci', 'liczba_nieprzeczytanych') %}
{% if n > 0 %}{{ n }} nieprzeczytanych{% else %}Wszystkie przeczytane{% endif %}
- type: custom:mushroom-template-card
primary: >
{{ state_attr('sensor.wiadomosci', 'wiadomosci')[0].temat | default('brak') }}
secondary: >
{{ state_attr('sensor.wiadomosci', 'wiadomosci')[0].nadawca | default('') }}
· {{ state_attr('sensor.wiadomosci', 'wiadomosci')[0].data | default('') }}
icon: mdi:message-text
icon_color: >
{% if state_attr('sensor.wiadomosci', 'wiadomosci')[0].nieprzeczytana %}red{% else %}grey{% endif %}
badge_icon: >
{% if state_attr('sensor.wiadomosci', 'wiadomosci')[0].ma_zalacznik %}mdi:paperclip{% endif %}
- type: custom:mushroom-template-card
primary: >
{{ state_attr('sensor.wiadomosci', 'wiadomosci')[1].temat | default('brak') }}
secondary: >
{{ state_attr('sensor.wiadomosci', 'wiadomosci')[1].nadawca | default('') }}
· {{ state_attr('sensor.wiadomosci', 'wiadomosci')[1].data | default('') }}
icon: mdi:message-text
icon_color: >
{% if state_attr('sensor.wiadomosci', 'wiadomosci')[1].nieprzeczytana %}red{% else %}grey{% endif %}
badge_icon: >
{% if state_attr('sensor.wiadomosci', 'wiadomosci')[1].ma_zalacznik %}mdi:paperclip{% endif %}
- type: custom:mushroom-template-card
primary: >
{{ state_attr('sensor.wiadomosci', 'wiadomosci')[2].temat | default('brak') }}
secondary: >
{{ state_attr('sensor.wiadomosci', 'wiadomosci')[2].nadawca | default('') }}
· {{ state_attr('sensor.wiadomosci', 'wiadomosci')[2].data | default('') }}
icon: mdi:message-text
icon_color: >
{% if state_attr('sensor.wiadomosci', 'wiadomosci')[2].nieprzeczytana %}red{% else %}grey{% endif %}
badge_icon: >
{% if state_attr('sensor.wiadomosci', 'wiadomosci')[2].ma_zalacznik %}mdi:paperclip{% endif %}
- type: custom:mushroom-template-card
primary: >
{{ state_attr('sensor.wiadomosci', 'wiadomosci')[3].temat | default('brak') }}
secondary: >
{{ state_attr('sensor.wiadomosci', 'wiadomosci')[3].nadawca | default('') }}
· {{ state_attr('sensor.wiadomosci', 'wiadomosci')[3].data | default('') }}
icon: mdi:message-text
icon_color: >
{% if state_attr('sensor.wiadomosci', 'wiadomosci')[3].nieprzeczytana %}red{% else %}grey{% endif %}
badge_icon: >
{% if state_attr('sensor.wiadomosci', 'wiadomosci')[3].ma_zalacznik %}mdi:paperclip{% endif %}
- type: custom:mushroom-template-card
primary: >
{{ state_attr('sensor.wiadomosci', 'wiadomosci')[4].temat | default('brak') }}
secondary: >
{{ state_attr('sensor.wiadomosci', 'wiadomosci')[4].nadawca | default('') }}
· {{ state_attr('sensor.wiadomosci', 'wiadomosci')[4].data | default('') }}
icon: mdi:message-text
icon_color: >
{% if state_attr('sensor.wiadomosci', 'wiadomosci')[4].nieprzeczytana %}red{% else %}grey{% endif %}
badge_icon: >
{% if state_attr('sensor.wiadomosci', 'wiadomosci')[4].ma_zalacznik %}mdi:paperclip{% endif %}Legenda ikon:
- 🔴 czerwona = nieprzeczytana
- ⚫ szara = przeczytana
- 📎 badge = ma załącznik
Znajdź nazwę encji w Developer Tools → States (szukaj
terminarz).
type: markdown
title: 📅 Terminarz
content: >
{% set zdarzenia = state_attr('sensor.librus_imie_nazwisko_terminarz',
'zdarzenia') %} {% if zdarzenia %} | Data | Dzień | Typ | Przedmiot | Opis |
|------|-------|-----|-----------|------|
{% for z in zdarzenia %} | **{{ z.data }}** | {{ z.tydzien }} | {{ z.tytul }}
| {{ z.przedmiot }} | {{ z.szczegoly.Opis if z.szczegoly.Opis != 'unknown'
else '' }} |
{% endfor %} {% else %} Brak nadchodzących zdarzeń. {% endif %}type: markdown
title: 📝 Sprawdziany i klasówki
content: >
{% set zdarzenia = state_attr('sensor.librus_imie_nazwisko_terminarz',
'zdarzenia') %} {% set typy_testow = ['Sprawdzian', 'Kartkówka', 'Klasówka',
'Praca klasowa'] %} {% set sprawdziany = zdarzenia | selectattr('tytul', 'in',
typy_testow) | list %} {% if sprawdziany %} | Data | Dzień | Typ | Przedmiot |
Opis |
|------|-------|-----|-----------|------|
{% for z in sprawdziany %} | **{{ z.data }}** | {{ z.tydzien }} | {{ z.tytul
}} | {{ z.przedmiot }} | {{ z.szczegoly.Opis if z.szczegoly.Opis != 'unknown'
else '' }} |
{% endfor %} {% else %} Brak nadchodzących zdarzeń. {% endif %}type: gauge
entity: sensor.librus_srednia_matematyka
name: "Matematyka - średnia"
min: 1
max: 6
severity:
green: 4.5
yellow: 3
red: 0Integracja wysyła zdarzenia Home Assistant gdy pojawi się nowa wiadomość lub ocena. Zdarzenia są wykrywane przy każdym odświeżeniu (co 2h). Pierwsze uruchomienie tylko zapamiętuje stan — nie wysyła duplikatów.
Test bez czekania: Idź do Developer Tools → Events, Event type:
librus_apix_nowa_wiadomosc, Event data jak poniżej i kliknij Fire Event.
Zdarzenie: librus_apix_nowa_wiadomosc
Dostępne dane: nadawca, temat, data, ma_zalacznik
Uwaga: Treść wiadomości nie jest pobierana celowo — aby nie oznaczać wiadomości jako przeczytanych w Librusie.
automation:
- alias: "Librus - nowa wiadomosc"
trigger:
- platform: event
event_type: librus_apix_nowa_wiadomosc
action:
- service: notify.mobile_app_NAZWA_TWOJEGO_TELEFONU
data:
title: "📬 Librus: nowa wiadomość"
message: >-
{% set msg = state_attr('sensor.librus_IMIE_NAZWISKO_wiadomosci', 'wiadomosci')
| selectattr('nieprzeczytana', 'equalto', true) | list | first | default({}) %}
Od: {{ msg.nadawca | default('nieznany') }}
Temat: {{ msg.temat | default('brak') }}Uwaga: Zamień
sensor.librus_IMIE_NAZWISKO_wiadomoscina nazwę swojego sensora widoczną w Developer Tools → States.
Zdarzenie: librus_apix_nowa_ocena
Dostępne dane: przedmiot, ocena, data, kategoria, nauczyciel
automation:
- alias: "Librus - nowa ocena"
trigger:
platform: event
event_type: librus_apix_nowa_ocena
action:
- service: notify.mobile_app_NAZWA_TWOJEGO_TELEFONU
data:
title: "🎓 Librus: nowa ocena {{ trigger.event.data.ocena }}"
message: >-
{{ trigger.event.data.przedmiot }}
Ocena: {{ trigger.event.data.ocena }}
Kategoria: {{ trigger.event.data.kategoria }}
Nauczyciel: {{ trigger.event.data.nauczyciel }}Gdzie znaleźć nazwę telefonu? HA → Settings → Devices & Services → Mobile App → nazwa urządzenia (np.
notify.mobile_app_samsung_galaxy_s24)
- Python 3.9+
- Home Assistant 2023.1+
- librus-apix library
# Klonuj repozytorium
git clone https://github.com/twoje-username/librus-ha-integration
cd librus-ha-integration
# Uruchom środowisko testowe
docker-compose up -d
# Edytuj kod w Code Server (http://localhost:8443)pytest tests/Aby włączyć szczegółowe logi, dodaj do configuration.yaml:
logger:
logs:
custom_components.librus_apix: debug- Nie udostępniaj swoich danych logowania!
- Dane są przechowywane lokalnie w Home Assistant
- Komunikacja z Librus odbywa się przez bezpieczne API
- Hasła są zaszyfrowane w konfiguracji
Jeśli znajdziesz błąd:
- Włącz logi debug (patrz wyżej)
- Skopiuj logi z błędem
- Utwórz issue na GitHub z:
- Opisem problemu
- Krokami do reprodukcji
- Logami (usuń dane osobowe!)
MIT License - patrz LICENSE
Pull requesty są mile widziane! Sprawdź CONTRIBUTING.md
Specjalne podziękowania dla KB za wsparcie i pomoc w rozwoju projektu.
Stworzono na bazie biblioteki librus-apix
⭐ Jeśli podoba Ci się projekt, zostaw gwiazdkę na GitHub!
Jeśli integracja jest dla Ciebie przydatna, możesz postawić kawę 😊