Walczę już jakiś czas nad stworzeniem karty informującej kto z użytkowników co aktualnie ogląda z mojego serwer Plex. Jako integrację wykorzystuję Tautulli. Ma to być karta warunkowa która wyświetla się gdy encja Tautulli Watching jest większa od zera (liczba aktualnie oglądających).
Jeśli tak jest wyświetlam trzy encje dla aktualnie oglądającego użytkownika:
state
full_title
progres
Poniżej kod mojej karty:
type: markdown
content: >2-
{% set users = ['maja_zawiasa', 'marcin_zawiasa']
%}
{% set active_user_found = false %}
{% for user in users %}
{% set state = states('sensor.' + user + '_state') %}
{% set title = states('sensor.' + user + '_full_title') %}
{% set progress = states('sensor.' + user + '_progress') %}
{% if state != 'unknown' %}
{% set active_user_found = true %}
**{{ user.replace('_', ' ').title() }}:** {{ title }} ({{ state }} {{ progress }}%)
{% endif %}
{% endfor %}
title: "Plex - aktualnie ogląda:"
Niby wszytko wygląda ok gdy aktualnie ogląda jeden użytkownik:
Jednak problem pojawią się gdy aktualnie ogląda dwóch lub więcej - tylko pierwszy jest poprawnie formatowany, reszta się rozjeżdża:
Minęło 12h, nikt nie odpowiedział
Pozwoliłem sobie zamieścić odpowiedz od GPT
Błąd wynika z tego, jak generujesz tekst w pętli. W twoim kodzie Markdown nie obsługuje wielu linii dobrze w przypadku bardziej złożonych struktur, takich jak for.
type: markdown
title: "Plex - aktualnie ogląda:"
content: >-
{% set users = ['maja_zawiasa', 'marcin_zawiasa'] %}
{% set active_user_found = false %}
{% for user in users %}
{% set state = states('sensor.' + user + '_state') %}
{% set title = states('sensor.' + user + '_full_title') %}
{% set progress = states('sensor.' + user + '_progress') %}
{% if state != 'unknown' %}
{% if not active_user_found %}
{% set active_user_found = true %}
**{{ user.replace('_', ' ').title() }}:** {{ title }} ({{ state }} {{ progress }}%)
{% else %}
\n**{{ user.replace('_', ' ').title() }}:** {{ title }} ({{ state }} {{ progress }}%)
{% endif %}
{% endif %}
{% endfor %}
Co zostało zmienione?
Separator nowej linii (\n)
Dodałem separator nowej linii przed kolejnymi użytkownikami, aby zapewnić poprawne formatowanie Markdown, gdy więcej niż jeden użytkownik ogląda coś równocześnie.
Sprawdzenie pierwszego użytkownika (not active_user_found)
Sprawdzam, czy jest to pierwszy aktywny użytkownik, aby uniknąć niepotrzebnego dodawania nowej linii.
Optymalizacja pętli
Wszystkie użytkownicy są sprawdzani, a ich dane są odpowiednio dodawane w formacie Markdown.
Markdown i Jinja
Zapewniłem, że Markdown jest kompatybilny z dynamicznie generowaną treścią w pętli.
Wynik
Gdy nikt nie ogląda, karta będzie pusta.
Gdy jeden użytkownik ogląda, wyświetli się jego nazwa, tytuł oraz postęp.
Gdy więcej użytkowników ogląda, lista będzie formatowana poprawnie z nową linią dla każdego użytkownika.
Od ChataGPT zacząłem Wykorzystałem darmowy, dzienny limit a mimo to nie potrafił mi przedstawić działającej wersji. Dlatego przychodzę do prawdziwych specjalistów