Skip to content

Releases: piterkos/HALibrus

v4.2.4 - Wsparcie dla wielu uczniów

Choose a tag to compare

@piterkos piterkos released this 30 Oct 15:31

👥 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ą parametr user_id
  • fetch_data.py - funkcja get_lessons() przekazuje student_id
  • sensor.py - coordinator przekazuje student_id przy pobieraniu lekcji
  • manifest.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

  1. Zaktualizuj PrivPortal API - upewnij się że obsługuje parametr userId
  2. Zaktualizuj HALibrus do v4.2.4
  3. Zrestartuj Home Assistant
  4. 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

Choose a tag to compare

@piterkos piterkos released this 30 Oct 12:04

🎯 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.py nie 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ło False → "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_dict

Teraz:

  • ✅ 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:

  1. Otwórz HACS → Integrations
  2. Znajdź "Librus (Private API)"
  3. Kliknij "Update"
  4. 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:

  1. Sprawdź sensory lekcji - powinny pokazywać dzisiejsze lekcje
  2. Sprawdź atrybuty sensora - data powinna być dzisiejsza
  3. 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 dacie
  • custom_components/librus_private/manifest.json - zaktualizowano wersję do 4.2.3
  • README.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

Choose a tag to compare

@piterkos piterkos released this 30 Oct 09:26

🔍 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: debug

3. 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 w LibrusLessonEntity.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

Choose a tag to compare

@piterkos piterkos released this 29 Oct 23:10

🐛 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ło False

✅ Rozwiązanie

  • Dodano konwersję stringa daty na date object 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

  1. Zaktualizuj integrację przez HACS lub ręcznie
  2. Zrestartuj Home Assistant
  3. Sprawdź sensory - powinny być dostępne i pokazywać lekcje:
    • sensor.lekcja_1_[student_id]
    • sensor.lekcja_2_[student_id]
    • sensor.lekcja_3_[student_id]
    • ...
  4. 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() w LibrusLessonEntity
  • manifest.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

Choose a tag to compare

@piterkos piterkos released this 29 Oct 22:01

🇵🇱 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 → Lekcja
  • Latest Attendance → Ostatnia frekwencja
  • Latest Message → Ostatnia wiadomość
  • Latest grade → Ostatnia ocena
  • Next Homework → Następna praca domowa
  • Next Exam → Następny sprawdzian
  • Lucky Number → Szczęśliwy numerek

Urządzenia (Devices):

  • Timetable → Plan lekcji
  • Tomorrow Timetable → Jutro Plan lekcji
  • Attendance → Frekwencja
  • Messages → Wiadomości
  • Grades → Oceny
  • Homeworks → Prace domowe
  • Exam → Sprawdziany

Atrybuty sensorów:

  • room → sala
  • teacher → nauczyciel
  • time → godzina
  • subject → przedmiot
  • date → data
  • i wiele innych...

Kalendarze:

  • Lessons → Plan lekcji
  • Exams → Sprawdziany
  • Homework → Prace domowe

🔧 Instrukcja aktualizacji

  1. Zaktualizuj integrację przez HACS lub ręcznie
  2. Zrestartuj Home Assistant
  3. ⚠️ Sprawdź Dashboard/Lovelace - nazwy wyświetlane mogły się zmienić
  4. ✅ 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

Choose a tag to compare

@piterkos piterkos released this 26 Oct 22:01

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

Choose a tag to compare

@piterkos piterkos released this 12 Oct 15:20

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

Choose a tag to compare

@piterkos piterkos released this 11 Oct 22:27

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

  1. Update via HACS (Redownload)
  2. Restart Home Assistant
  3. 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

Choose a tag to compare

@piterkos piterkos released this 11 Oct 22:15

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

  1. Update via HACS (Redownload)
  2. Restart Home Assistant
  3. 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

Choose a tag to compare

@piterkos piterkos released this 11 Oct 21:55
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.