Repository navigation
Releases: piterkos/HALibrus
Release list
v4.2.4 - Wsparcie dla wielu uczniów
👥 Wsparcie dla wielu uczniów - Filtrowanie po userId
Ta wersja naprawia krytyczny problem z mieszaniem danych gdy do Home Assistant dodanych jest wielu uczniów.
✨ Co zostało dodane
Filtrowanie danych po userId:
- ✅ Wszystkie endpointy API otrzymują teraz parametr
userId - ✅ Dane są prawidłowo filtrowane dla każdego ucznia osobno
- ✅ Możesz bezpiecznie dodać wielu uczniów do Home Assistant
- ✅ Każdy uczeń widzi tylko swoje dane (lekcje, oceny, frekwencję, etc.)
🔧 Zmiany techniczne
Zaktualizowane pliki:
librus_client.py- wszystkie metody API otrzymują parametruser_idfetch_data.py- funkcjaget_lessons()przekazujestudent_idsensor.py- coordinator przekazujestudent_idprzy pobieraniu lekcjimanifest.json- wersja zaktualizowana do 4.2.4
Zmienione metody API:
get_lessons(user_id=...)get_changed_lessons(user_id=...)get_attendance(user_id=...)get_grades(user_id=...)get_homework(user_id=...)get_exams(user_id=...)
🛡️ Wymagania
WAŻNE: Ta wersja wymaga zaktualizowanego PrivPortal API, które obsługuje parametr userId we wszystkich endpointach:
/api/mobile/lessons?userId=XXX/api/mobile/lessons/changes?userId=XXX/api/mobile/attendance?userId=XXX/api/mobile/grades?userId=XXX/api/mobile/homework?userId=XXX/api/mobile/exams?userId=XXX
Jeśli Twoje API nie obsługuje jeszcze parametru userId, sensory będą działać (parametr jest opcjonalny), ale dane mogą być mieszane przy wielu uczniach.
📋 Instrukcja aktualizacji
- Zaktualizuj PrivPortal API - upewnij się że obsługuje parametr
userId - Zaktualizuj HALibrus do v4.2.4
- Zrestartuj Home Assistant
- Sprawdź czy każdy uczeń widzi tylko swoje dane
🐛 Naprawiony problem
Przed:
Użytkownik dodaje ucznia #1 → działa ✅
Użytkownik dodaje ucznia #2 → dane mieszają się ❌
Lekcje ucznia #1 pokazują dane ucznia #2 ❌
Po (v4.2.4):
Użytkownik dodaje ucznia #1 → działa ✅
Użytkownik dodaje ucznia #2 → działa ✅
Każdy uczeń widzi tylko swoje dane ✅
📝 Historia zmian
v4.2.4 (2025-10-30):
- ✅ Dodano filtrowanie po userId
- 👥 Wsparcie dla wielu uczniów
- 🔧 Zaktualizowano całą ścieżkę wywołań API
v4.2.3 (2025-10-30):
- 🐛 Naprawiono wyświetlanie lekcji z przyszłych dat
v4.2.2 (2025-10-29):
- 🔍 Dodano debug logging
v4.2.1 (2025-10-29):
- 🐛 Naprawiono porównywanie dat
v4.2.0 (2025-10-29):
- 🇵🇱 Pełna polonizacja
Pełna dokumentacja: https://github.com/piterkos/HALibrus
Zgłaszanie problemów: https://github.com/piterkos/HALibrus/issues
🤖 Generated with Claude Code
v4.2.3 - Naprawa krytyczna: Filtrowanie lekcji po dacie
🎯 NAPRAWA KRYTYCZNA - Wymagana aktualizacja!
Ta wersja naprawia krytyczny błąd powodujący wyświetlanie lekcji z przyszłych dat zamiast dzisiejszych.
🐛 Problem który został naprawiony
Objawy:
- Wszystkie sensory lekcji pokazują "niedostępny" (unavailable)
- Lekcje 9-10 pokazują "-" (co jest OK gdy nie ma tylu lekcji)
- Logi pokazują daty z 2026 roku (czerwiec 2026) zamiast dzisiejszej daty
Przyczyna:
- API zwraca lekcje na cały rok szkolny (2025-2026, setki lekcji)
- Kod w
fetch_data.pynie filtrował po dacie - W rezultacie dla każdej pozycji (1, 2, 3...) brał OSTATNIĄ znalezioną lekcję
- Ostatnie lekcje w bazie były z czerwca 2026
- Sensory pokazywały dane z przyszłości →
available()zwracałoFalse→ "niedostępny"
✅ Co zostało naprawione
Dodano filtrowanie lekcji po dacie w fetch_data.py (linie 103-122):
# Only add lessons for the requested date (date_from)
lesson_date_str = temp_dict.get("date")
if lesson_date_str and date_from:
# Convert lesson date to date object for comparison
if isinstance(lesson_date_str, str):
try:
lesson_date = datetime.datetime.strptime(lesson_date_str, "%Y-%m-%d").date()
except (ValueError, TypeError):
lesson_date = None
elif isinstance(lesson_date_str, datetime.date):
lesson_date = lesson_date_str
else:
lesson_date = None
# Only add if date matches date_from
if lesson_date == date_from:
dict_ans[f"lesson_{lesson_position}"] = temp_dictTeraz:
- ✅ Kod filtruje lekcje tylko dla żądanej daty (
date_from) - ✅ Sensory "dzisiaj" pokazują lekcje z dzisiejszej daty
- ✅ Sensory "jutro" pokazują lekcje z jutrzejszej daty
- ✅ Wszystko działa poprawnie!
📋 Jak zaktualizować
Przez HACS:
- Otwórz HACS → Integrations
- Znajdź "Librus (Private API)"
- Kliknij "Update"
- Zrestartuj Home Assistant
Ręcznie:
cd /config/custom_components/librus_private
git pull
# Zrestartuj Home Assistant🧪 Jak sprawdzić czy działa
Po aktualizacji i restarcie:
- Sprawdź sensory lekcji - powinny pokazywać dzisiejsze lekcje
- Sprawdź atrybuty sensora - data powinna być dzisiejsza
- Logi debug powinny pokazywać:
Lesson 1: lesson_date_str = 2025-10-30 Lesson 1 (today): 2025-10-30 == 2025-10-30 -> True
📝 Zmiany techniczne
Zmienione pliki:
custom_components/librus_private/fetch_data.py- dodano filtrowanie lekcji po daciecustom_components/librus_private/manifest.json- zaktualizowano wersję do 4.2.3README.md- aktualizacja changelog
🙏 Podziękowania
Dziękuję za cierpliwość podczas debugowania tego problemu. Logi debug z wersji 4.2.2 pomogły zidentyfikować problem!
Pełna dokumentacja: https://github.com/piterkos/HALibrus
Zgłaszanie problemów: https://github.com/piterkos/HALibrus/issues
v4.2.2 - Debug version z rozbudowanym logowaniem
🔍 Wersja debug - Diagnostyka problemu z niedostępnymi sensorami
Ta wersja zawiera rozbudowane logowanie aby zdiagnozować problem z niedostępnymi sensorami lekcji.
🔍 Co zostało dodane
Szczegółowe logi w metodzie available():
- Status
coordinator.last_update_success - Obecność
coordinator.data - Typ i wartość
lesson_date_str - Wynik konwersji daty (string → date object)
- Wynik porównania dat (
lesson_date == today) - Końcowy wynik
available()(True/False)
📋 Instrukcja debugowania
1. Zaktualizuj integrację do v4.2.2
2. Włącz debug logging w configuration.yaml:
logger:
default: info
logs:
custom_components.librus_private: debug3. Zrestartuj Home Assistant
4. Sprawdź logi (Settings → System → Logs)
Poszukaj wpisów typu:
Lesson 1: lesson_date_str = 2025-10-29, type = <class 'str'>, today = 2025-10-29
Lesson 1: Converted to date object: 2025-10-29
Lesson 1 (today): 2025-10-29 == 2025-10-29 -> True
Lub:
Lesson 1: coordinator.last_update_success = False
Lesson 1: coordinator.data is None
Lesson 1: Error accessing data: 'lessons'
5. Prześlij logi do zgłoszenia issue
⚠️ Uwaga
To jest wersja debug - generuje dużo logów. Po zdiagnozowaniu problemu wróć do stabilnej wersji lub wyłącz debug logging.
🐛 Znany problem
Sensory lekcji nadal wyświetlają się jako "niedostępne". Ta wersja ma pomóc zdiagnozować przyczynę.
📝 Zmiany techniczne
Zmienione pliki:
sensor.py- dodano rozbudowane logowanie wLibrusLessonEntity.available()manifest.json- zaktualizowano wersję do 4.2.2
Pełna dokumentacja: https://github.com/piterkos/HALibrus
Zgłaszanie problemów: https://github.com/piterkos/HALibrus/issues
v4.2.1 - Naprawa dostępności sensorów lekcji
🐛 Poprawka błędu - Niedostępne sensory lekcji
Ta wersja naprawia krytyczny błąd powodujący, że wszystkie sensory lekcji wyświetlały się jako niedostępne.
🐛 Naprawiony błąd
Problem:
- Wszystkie sensory lekcji (Lekcja 1, Lekcja 2, ..., Lekcja 8) wyświetlały "niedostępne" (unavailable)
- Pomimo że API zwracało poprawne dane, sensory nie były dostępne
- Kalendarze były puste
Przyczyna:
- Metoda
available()w sensorze porównywała string z date object lesson_date="2025-10-29"(string)today=date(2025, 10, 29)(date object)- Porównanie
"2025-10-29" == date(2025, 10, 29)zawsze zwracałoFalse
✅ Rozwiązanie
- Dodano konwersję stringa daty na
dateobject przed porównaniem - Dodano obsługę błędów parsowania daty
- Dodano sprawdzenie typu (string vs date object)
🔧 Szczegóły techniczne
Zmieniony kod w sensor.py:
# PRZED (błędne):
lesson_date = self.coordinator.data[...]["date"]
return lesson_date == today
# PO (poprawne):
lesson_date_str = self.coordinator.data[...]["date"]
if isinstance(lesson_date_str, str):
lesson_date = datetime.strptime(lesson_date_str, "%Y-%m-%d").date()
elif isinstance(lesson_date_str, datetime.date):
lesson_date = lesson_date_str
return lesson_date == today📋 Instrukcja aktualizacji
- Zaktualizuj integrację przez HACS lub ręcznie
- Zrestartuj Home Assistant
- Sprawdź sensory - powinny być dostępne i pokazywać lekcje:
sensor.lekcja_1_[student_id]sensor.lekcja_2_[student_id]sensor.lekcja_3_[student_id]- ...
- Sprawdź kalendarz - lekcje powinny się wyświetlać
⚠️ Ważne
- Zachowano kompatybilność z poprzednią wersją 4.2.0
- Nie wymaga rekonfiguracji integracji
- Entity ID pozostają bez zmian
- Historia jest zachowana
📝 Pełny changelog
Zmienione pliki:
sensor.py- poprawiono metodęavailable()wLibrusLessonEntitymanifest.json- zaktualizowano wersję do 4.2.1
Pełna dokumentacja: https://github.com/piterkos/HALibrus
Zgłaszanie problemów: https://github.com/piterkos/HALibrus/issues
v4.2.0 - Polonizacja interfejsu użytkownika
🇵🇱 Pełna polonizacja interfejsu użytkownika
Ta wersja wprowadza kompletne tłumaczenie wszystkich elementów interfejsu na język polski.
✨ Nowe funkcje
Wszystkie elementy po polsku:
- 📊 Nazwy sensorów przetłumaczone
- 🏠 Nazwy urządzeń (devices) po polsku
- 📝 Atrybuty sensorów z polskimi nazwami
- 📅 Kalendarze z polskimi nazwami
📋 Szczegółowa lista zmian
Sensory:
Lesson→LekcjaLatest Attendance→Ostatnia frekwencjaLatest Message→Ostatnia wiadomośćLatest grade→Ostatnia ocenaNext Homework→Następna praca domowaNext Exam→Następny sprawdzianLucky Number→Szczęśliwy numerek
Urządzenia (Devices):
Timetable→Plan lekcjiTomorrow Timetable→Jutro Plan lekcjiAttendance→FrekwencjaMessages→WiadomościGrades→OcenyHomeworks→Prace domoweExam→Sprawdziany
Atrybuty sensorów:
room→salateacher→nauczycieltime→godzinasubject→przedmiotdate→data- i wiele innych...
Kalendarze:
Lessons→Plan lekcjiExams→SprawdzianyHomework→Prace domowe
🔧 Instrukcja aktualizacji
- Zaktualizuj integrację przez HACS lub ręcznie
- Zrestartuj Home Assistant
⚠️ Sprawdź Dashboard/Lovelace - nazwy wyświetlane mogły się zmienić- ✅ Entity ID pozostają bez zmian - historia i automacje działają
⚠️ Ważne informacje
- Kompatybilność: Zachowano
unique_id- historia danych i automacje zachowane - Entity ID: Nie zmieniają się (np.
sensor.lesson_1_123456) - Friendly names: Zmieniają się na polskie (wyświetlane nazwy)
- Dashboard: Może wymagać aktualizacji jeśli używasz hardcoded nazw
🆕 Co dalej?
Po aktualizacji wszystkie elementy będą wyświetlane po polsku, zachowując pełną kompatybilność z poprzednimi wersjami.
📝 Pełny changelog
Wszystkie zmiany dostępne w commicie: c416187
Pełna dokumentacja: https://github.com/piterkos/HALibrus
Zgłaszanie problemów: https://github.com/piterkos/HALibrus/issues
v4.1.4 - Poprawki kompatybilności z PrivPortal API
Poprawki
Naprawiono wszystkie endpointy do poprawnej współpracy z LibrusMobileController:
Wiadomości (Messages)
- Dodano obsługę parametru student_id (wymagany dla wielu uczniów)
- Poprawiono parsowanie dat z sent_date na strukturę date z ISO datetime
- Dodano konwersję date_time na timestamp
Szczęśliwy numerek (Lucky Number)
- Poprawiono parsowanie struktury obiektu date zamiast stringa
Frekwencja (Attendance)
- Poprawiono nazwy pól: date zamiast date_modified
Oceny (Grades)
- Poprawiono nazwy pól: category, eacher, date zamiast column, eacher_created, date_created
- Poprawiono parsowanie opisu z grade.description
Zadania domowe (Homework)
- Poprawiono nazwę pola: eacher zamiast creator
Sprawdziany (Exams)
- Poprawiono nazwy pól: date, content, eacher zamiast deadline, opic, creator
- Poprawiono parsowanie ype z obiektu na string ( ype.name)
Wynik
Wszystkie zmiany zapewniają pełną kompatybilność ze strukturą danych zwracaną przez PrivPortal API (LibrusMobileController).
Instalacja
Aktualizacja przez HACS lub ręczne skopiowanie folderu custom_components/librus_private do katalogu Home Assistant.
v4.1.3 - Messages API with userId parameter
Changes in v4.1.3
API Changes
- Changed get_messages() to use userId parameter instead of �ox
- Automatic fallback to selected student's ID if userId not provided
- Better integration with backend API
Details
- librus_client.py: Updated LibrusClient.get_messages() and LibrusData.get_messages()
- Parameters: �ox: str user_id: Optional[int]
- Backend: Compatible with PrivPortal API changes
Technical
- Validates student selection before fetching messages
- Uses student['pupil']['id'] for API requests
- Maintains backward compatibility for existing code
Installation
Update via HACS or manually download the latest version.
Full Changelog: v4.1.2...v4.1.3
v4.1.2 - Calendar Parsing Fixes
Calendar Parsing Bug Fixes
This release fixes critical parsing errors in calendar entities that caused TypeError and KeyError exceptions.
Fixed Issues
KeyError: 'start' in Lessons Calendar (Line 233)
- Fixed missing 'start' and 'end' keys in lesson events
- Now properly constructs datetime objects from 'date' and 'time' fields
- Parses time.from and time.to to create proper start/end datetimes
TypeError: strptime() argument 1 must be str, not datetime.date (Line 335)
- Fixed TypeError when 'date' field is already a date object
- Added isinstance() checks for both str and date types
- Handles both string dates and date objects gracefully
All Calendar Entities
- Added try-except blocks to handle malformed data
- Added logging for debugging parsing failures
- Skips invalid events instead of crashing
Installation
- Update via HACS (Redownload)
- Restart Home Assistant
- Calendar entities should now load without errors
Technical Details
Files Modified:
- calendar.py - Fixed all three async_get_events implementations
Error Messages Resolved:
- KeyError: 'start'
- TypeError: strptime() argument 1 must be str, not datetime.date
- Error handling request from 192.168.70.7
All calendar entities (Lessons, Exams, Homework) should now work correctly!
v4.1.1 - Critical Bug Fixes
Critical Bug Fixes
This release fixes critical errors that prevented calendar entities from loading and caused crashes in lessons fetching.
Fixed Issues
Calendar Entities (TypeError)
- Fixed TypeError: 'coroutine' object is not subscriptable in calendar.py
- Changed event property from async to synchronous implementation
- Added _create_calendar_event() method to each calendar entity subclass
- Calendar entities now properly load without errors
Lessons Fetching (AttributeError)
- Fixed AttributeError when accessing changes.type and changes.id
- Changed from object notation to dict notation throughout changes handling
- Fixed lesson.time.position to use time.get('position')
- Now properly handles None and dict types for changes data
Installation
- Update via HACS (Redownload)
- Restart Home Assistant
- Calendar entities and lesson sensors should now work correctly
Technical Details
Files Modified:
- calendar.py - Fixed async event property, added synchronous event handling
- fetch_data.py - Fixed object notation in changes handling (lines 69-95)
Error Messages Resolved:
- RuntimeWarning: coroutine LibrusLessonsCalendarEntity.async_get_events was never awaited
- TypeError: coroutine object is not subscriptable
- AttributeError: dict object has no attribute type
- Error adding entity calendar.jan_kowalski_lessons_lessons
All calendar and lesson entities should now load properly!
v4.1.0
Version 4.1.0 - Complete API refactoring Major Changes: - Completely refactored fetch_data.py to use LibrusClient API - Removed all references to non-existent client.data API - Changed from async iterator pattern to list iteration - Converted object notation to dict access throughout - Added proper error handling and date parsing - Fixed all coordinators to properly fetch data This version should now display all ~30-40 sensors correctly.