Condition if dans YAML

Mon problème

Bonjour,
Je souhaiterais envoyer une valeur vide si j’ai comme variable « None » et sinon, la valeur du sensor.
Avec le code suivant :

{% if is_state("sensor.plex", "None") -%}
  N/A
{%- else -%}
  Lecture en cours {{state_attr('sensor.plex', 'user')}}.
{%- endif %}

J’ai toujours le contenu de {{state_attr(‹ sensor.plex ›, ‹ user ›)}} qui s’affiche.

Merci.

Ma configuration


Home Assistant 2023.10.3
Supervisor 2023.10.0
Operating System 11.0
Interface utilisateur : 20231005.0 - la


Hello essaye ton template dans Outils de dev / Modèle.
Tu verras tout de suite si il marche.

et tu verras que « None » c’est pas bon. Là c’est la chaine de caractère « None » et non pas la valeur None.

Bonjour,
faut enlever les -.

{% if is_state("sensor.plex", "None") %}
  N/A
{% else %}
  Lecture en cours {{state_attr('sensor.plex', 'user')}}
{% endif %}

UN exemple qui marche :

{% if state_attr('switch.solar_optimizer_prise_chargeur_bricolage', 'is_usable') is none %}Non defini
{% else %}
defini
{% endif %}

Salut @lilp

Petite précision avant de mettre au point la template :wink:

Si tu prends le sensor dédié au serveur « plex », tu verras que celui-ci n’a pas vraiment d’attribut « user » :

Ce que j’ai caché est sous une forme « bizarre » du style :

"user" - "type de lecteur" : "contenu en cours de lecture"

Pour que ce soit l’attribut user il aurait fallu qu’il soit sous une forme équivalent à ce que tu vois pour l’icône par exemple.

Bon si tu veux vraiment te baser sur ce sensor, tu peux y arriver avec :

{% if is_state("sensor.plex_sirius", "0") %}
N/A
{% else %}  
{% set user = states.sensor.plex_sirius.attributes | first %}
{{ user.split('-')[0] | trim }}
{% endif %}

plex2

Mais ce n’est pas très flexible et si tu as plusieurs utilisateurs en cours de lecture en même temps tu n’en verras qu’un s’afficher.

A l’inverse si tu veux lister tous les utilisateurs en te basant sur les entités « multiplayer », tu peux utiliser ça :

{% set player = states.media_player
  | selectattr('state', 'in', ['playing', 'paused'])
  | map(attribute='entity_id')
  | select('search', 'plex')
  | join(', ')
%}
{% if player|length > 1 %} 
{% set lst = player.split(', ') %}
{% for player in lst -%}
{% set user = state_attr(player, 'username') %}
{{ user }}
{%- endfor %}
{% endif %}

1 « J'aime »

Merci @Herbs, effectivement, cela fonctionne mieux avec le bout de code fourni. Par contre, cela ne retourne que l’utilisateur qui lit le média. On ne peut pas avoir aussi le titre joué, temps restant…?

PS : Très bons gouts musicaux.

De rien :wink:

Tu peux faire un peu ce que tu veux en jouant avec la template.

Mais faut savoir qu’en fonction du type de contenu les attributs ne sont pas forcement les mêmes.

Exemple sur le titre :

  • Pour les fims le titre correspond à l’attribut media_title
  • Pour les séries ce sera media_series_title

Pour mon dachsboard « mobile » j’ai une carte markdown (pour condenser le visuel) qui affiche :

  • Pour les films et séries :

user > device > contenu

  • Pour la musique lu avec l’app « plexamp » :

user listen music with plexamp

image

Bref je peux te filer le code la template complète (elle est récente et peut-être pas hyper opti) pour exemple :

ma template
{% set player = states.media_player
  | selectattr('state', 'in', ['playing', 'paused'])
  | map(attribute='entity_id')
  | select('search', 'plex')
  | join(', ')
%}
{% if player|length > 1 %} 
{% set lst = player.split(', ') %}
{% for player in lst %}
{% set name = state_attr(player, 'friendly_name') %}
{% set mtitle = state_attr(player, 'media_title') %}
{% set stitle = state_attr(player, 'media_series_title') %}
{% set user = state_attr(player, 'username') %}
{% if "plexamp" not in player %}
{% if stitle == None %}
<ha-icon icon="mdi:plex"></ha-icon> {{ user }} > {{ name }} > {{ mtitle }} ...
{% elif stitle is defined %}
<ha-icon icon="mdi:plex"></ha-icon> {{ user }} > {{ name }} > {{ stitle}} ...
{% endif %}
{% elif "plexamp" in player %}
<ha-icon icon="mdi:plex"></ha-icon> {{ user }} listen music with Plexamp ...
{% endif %}
{% endfor %}
{% else %}
<ha-icon icon="mdi:plex"></ha-icon> Nothing is playing...
{% endif %}

Et si tu sais dire exactement ce que tu veux et que tu donnes un peu plus de détail (utilsation de plexamp ou pas, devices utilisés, etc…) on peut essayer de faire un truc qui colle plus à ton usage :wink:

[EDIT] Bon à savoir, tu as ce genre d’intégration dans HACS :

Qui peuvent aussi faire ce que tu veux, en plus « beau » etc …

image

Comme je disais ma template, c’est juste pour le mobile et afin d’avoir les infos sans fioritures :stuck_out_tongue:

Dans l’idéal, je souhaiterais envoyer l’utilisateur, le titre, le temps restant, heure de fin et le support lorsqu’un média est lancé via Telegram.
Mais aussi afficher les informations sur le dashboard (qui n’est qu’au début).
J’utilise effectivement PlexAmp sur mobile pour la musique, mais aussi les lecteurs webs, et client android (TV) et sur OSMC. Je possède aussi deux servers Plex.

Ok

Ça va demander un peu de réflexion et de mise au point.

Exemple si ton trigger c’est passage de l’état « idle » à « playing », alors si tu écoutes de la musique tu seras notifié à chaque début de « morceau ». Tout ça car ton player va faire :

idle -> lecture piste 1 -> idle -> lecture piste 2 -> idle etc …

Une notif toutes les 3 minutes dans ce cas, ça peut vite devenir « pénible » :wink: .

1 « J'aime »

La notification ne sera que sur le dashboard donc pas de soucis. Pour télégram c’est moi qui lui pose la question, donc pas de soucis non plus de spam puisque je lui demanderais que lorsque j’en aurai besoin.
Via telegram, cela fonctionne correctement


J’ai ajouté les cardes sur le Dashboard. :slight_smile:
À voir pour ajouter le temps restant dans les informations.

1 « J'aime »

Je suis au travail, je peux pas trop t’aider maintenant.

Mais si tu lances une lecture tu verras sûrement les infos dans les outils dev.

Ensuite « juste » à compléter la template.

J’ai trouvé effectivement les valeurs souhaitées via les outils de dev.
J’ai aussi pu travailler sur le format des variables.
Du coup, ma commande télégram fonctionne bien.

Le code en question

{% set player = states.media_player | selectattr('state', 'in', ['playing', 'paused']) | map(attribute='entity_id') | select('search', 'plex') | join(', ') %} {% if player|length > 1 %} {% set lst = player.split(', ') %} {% for player in lst %} {% set name = state_attr(player, 'friendly_name') %} {% set mtitle = state_attr(player, 'media_title') %} {% set stitle = state_attr(player, 'media_series_title') %} {% set format = state_attr(player, 'media_content_type') %} {% set user = state_attr(player, 'username') %} {% set library = state_attr(player, 'media_library_title') %} {% set media_duration = state_attr(player, 'media_duration') %} {% set media_position = state_attr(player, 'media_position') %} {% set artiste = state_attr(player, 'media_artist') %} {% set album_name = state_attr(player, 'media_album_name') %} {% set duree = state_attr(player, 'media_duration') %} {% set  p = state_attr(player, 'media_position') %} {% set tempsrestant = duree|float-p|float %} {% set formatjoue = format|string %} {% if "plexamp" not in player %} {% if "movie" in formatjoue %} {{ user }} regarde: {{ mtitle }} sur {{ name }}. Le film dure: {{ duree | timestamp_custom("%H:%M:%S", 0) }}h, et il reste: {{ tempsrestant | timestamp_custom("%H:%M:%S", 0)  }}h. {% elif "tvshows" in formatjoue %} {{ user }} regarde: {{ stitle }} sur {{ name }}. La série dure: {{ duree | timestamp_custom("%H:%M:%S", 0) }}h, et il reste: {{ tempsrestant | timestamp_custom("%H:%M:%S", 0)  }}h. {% elif "music" in formatjoue %} {{ user }} écoute: {{ mtitle}} de {{ artiste }} sur l'album {{ album_name }}. {% endif %} {% elif "plexamp" in player %} {{ user }} listen music with Plexamp {% endif %} {% endfor %} {% else %} Nothing is playing. {% endif %}

Il m’affiche donc différentes informations (utilisateur, titre, support, durée et temps restant) en fonction du format joué (movie, tvshows, music).

À voir pour intégrer ces informations dans le dashboard avec Minimalistic media card. Et l’ETA.

impec :+1:

Du coup j’ai repris qq idées de ta version pour faire évoluer la mienne :wink:

Nouveau code
{% set player = states.media_player
  | selectattr('state', 'in', ['playing', 'paused'])
  | map(attribute='entity_id')
  | select('search', 'plex')
  | join(', ') %}
{% if player|length > 1 %}
{% set lst = player.split(', ') %}
{% for player in lst -%}
{%- set artist = state_attr(player, 'media_album_artist') %}
{%- set mtitle = state_attr(player, 'media_title') %}
{%- set smtitle = mtitle.split(' (') %}
{%- set stitle = state_attr(player, 'media_series_title') %}
{%- set device = state_attr(player, 'friendly_name') %}
{%- set type = state_attr(player, 'media_content_type') %}
{%- set user = state_attr(player, 'username') %}
{% if "plexamp" not in player %}
{%- if type == 'movie' -%}
<ha-icon icon="mdi:plex"></ha-icon> {{ user }} watch "{{ smtitle[0] }}" on {{ device }} ...
{%- elif type == 'tvshow' -%}
<ha-icon icon="mdi:plex"></ha-icon> {{ user }} watch "{{ stitle }}" on {{ device }} ...
{%- elif type == 'music' -%}
<ha-icon icon="mdi:plex"></ha-icon> {{ user }} listen "{{ artist }}" on {{ device }} ...
{% endif %}
{%- elif "plexamp" in player -%}
<ha-icon icon="mdi:plex"></ha-icon> {{ user }} listen "{{ artist }}" with plexamp ...
{% endif %}
{%- endfor %}
{% else %}
Nothing is playing.
{% endif %}

Ce qui donne :

image

Bref je pense tu peux marquer le sujet comme résolu :wink:

1 « J'aime »

@Herbs comment fais-tu pour avoir cet affichage avec le temps :
image
Je ne trouve pas comment modifier les cartes « Minimalistic media card ».

Salut @lilp

le code :wink: :

type: custom:mini-media-player
entity: media_player.plex_pomme_tv
artwork: cover
info: short
scale: '0.85'
hide:
  volume: true
  power: true
  controls: true
  runtime: false
1 « J'aime »