Les séances de votre cinéma dans Home Assistant : un capteur, une carte et une notification

Du YAML, sans intégration personnalisée : un capteur récupère les séances du jour, une carte Markdown liste celles qui restent avec les liens de réservation, et une automatisation dit à 17 h ce qui passe ce soir.

5 min de lecture

Sur cette page
  1. Ce qu’il vous faut
  2. 1.La clé dans secrets.yaml
  3. 2.Le capteur
  4. 3.La carte du tableau de bord
  5. 4.Une notification quand il y a une séance ce soir
  6. Quota
  7. Variantes

Votre Home Assistant connaît déjà la météo, les lumières et le jour des poubelles. Ce tutoriel lui apprend le programme du cinéma du quartier : un capteur qui garde les séances du jour, une carte du tableau de bord qui liste celles qui restent avec leurs liens de réservation, et une notification à 17 h quand il y a quelque chose ce soir. Tout est du YAML collé dans Home Assistant ; pas d’intégration personnalisée, pas de HACS, pas de module complémentaire.

Aujourd’hui au Champo

Affreux, sales et méchants
15:40 VOST · 19:55 VOST

Safe
15:45 VOST

LA MAISON AU PIED DU ROC
20:00 VOST

Ce qu’il vous faut

  • Home Assistant 2024.10 ou plus récent, avec accès à configuration.yaml (module File editor ou Studio Code Server, ou SSH). Ce tutoriel a tourné sur Home Assistant 2026.11.
  • Une clé API Cinéma : créez un compte gratuit, confirmez votre adresse e-mail, puis créez une clé depuis le tableau de bord. Le forfait gratuit donne 100 requêtes par semaine ; cette installation en consomme environ 42.
  • Le slug du cinéma. Cherchez-le par son nom :
Terminal
curl "https://api.api-cinema.com/v1/cinemas?q=champo" -H "Authorization: Bearer ac_live_…"

La réponse donne "slug": "le-champo-paris-5e-arrondissement". N’importe quel cinéma de l’API marche : France, États-Unis, Australie.

La clé dans secrets.yaml

Home Assistant garde les mots de passe hors de la configuration, dans secrets.yaml, à côté de configuration.yaml. Ajoutez une ligne, avec le mot Bearer, une espace, puis votre clé :

secrets.yaml
api_cinema_auth: Bearer ac_live_…

Le capteur

Deux blocs vont dans configuration.yaml. Le premier est un rest_command : une requête HTTP nommée que Home Assistant sait lancer, ici les séances d’un cinéma pour aujourd’hui, avec le film de chaque séance (include=movie). Le second est un capteur template qui lance cette requête au démarrage de Home Assistant puis toutes les quatre heures, et garde une liste courte des séances du jour : heure, film, version, lien de réservation.

configuration.yaml
rest_command:
  cinema_seances:
    url: 'https://api.api-cinema.com/v1/cinemas/le-champo-paris-5e-arrondissement/showtimes?date={{ now().date() }}&include=movie&limit=1000'
    headers:
      Authorization: !secret api_cinema_auth
    timeout: 20

template:
  - triggers:
      - trigger: homeassistant
        event: start
      - trigger: time_pattern
        hours: /4
        minutes: 1
    actions:
      - action: rest_command.cinema_seances
        response_variable: reponse
        continue_on_error: true
    sensor:
      - name: Cinéma aujourd’hui
        unique_id: cinema_aujourdhui
        icon: mdi:filmstrip
        unit_of_measurement: séances
        state: >
          {% if reponse is defined and reponse.status == 200 %}
            {{ reponse.content.data | count }}
          {% else %}
            {{ this.state }}
          {% endif %}
        attributes:
          seances: >
            {% if reponse is defined and reponse.status == 200 %}
              {% set ns = namespace(liste=[]) %}
              {% for s in reponse.content.data %}
                {% set ns.liste = ns.liste + [{
                  'heure': s.startsAt[11:16],
                  'film': s.movie.title,
                  'version': s.version if s.format == '2D' else s.version ~ ' ' ~ s.format,
                  'url': s.bookingUrl
                }] %}
              {% endfor %}
              {{ ns.liste }}
            {% else %}
              {{ this.attributes.seances | default([]) }}
            {% endif %}

Remplacez le slug de l’URL par celui de votre cinéma. Si votre configuration.yaml a déjà une clé template:, ajoutez l’élément - triggers: sous celle qui existe au lieu d’écrire un second template:.

Quelques détails qui comptent :

  • date={{ now().date() }} demande toute la journée, à l’heure locale du cinéma. Le déclencheur passe à 00:01, 04:01, 08:01… : la liste bascule sur le nouveau jour juste après minuit.
  • Le capteur ne se vide jamais. Quand la requête échoue (pas de réseau, mauvaise clé, 429 quand le quota de la semaine est épuisé), l’action n’arrête pas le template (continue_on_error) et l’état comme la liste gardent leurs dernières valeurs (this.state, this.attributes). Home Assistant écrit l’erreur dans son journal.
  • startsAt est l’heure affichée au cinéma : startsAt[11:16] donne l’heure du billet (19:55), sans conversion de fuseau.

Vérifiez la configuration (Outils de développement › YAML › Vérifier la configuration), puis redémarrez Home Assistant. Dans Outils de développement › États, sensor.cinema_aujourdhui affiche le nombre de séances du jour, et son attribut seances la liste :

seances:
  - heure: "15:40"
    film: Affreux, sales et méchants
    version: VOST
    url: https://www.cinema-lechampo.com/film.html#/media/574?showId=34629
  - heure: "15:45"
    film: Safe
    ...

La carte du tableau de bord

Modifiez un tableau de bord, Ajouter une carte › Markdown, passez dans l’éditeur de code et collez ceci. Le template regroupe par film les séances qui restent, met en tête le film dont la séance est la plus proche, et fait de chaque heure un lien vers la page de réservation du cinéma :

Carte Markdown
type: markdown
title: Aujourd’hui au Champo
content: |
  {% set restantes = state_attr('sensor.cinema_aujourdhui', 'seances') | default([], true)
     | selectattr('heure', '>=', now().strftime('%H:%M')) | list %}
  {% for film, seances in restantes | groupby('film') | sort(attribute='list.0.heure') %}
  **{{ film }}**
  {% for s in seances %}{{ '[' ~ s.heure ~ '](' ~ s.url ~ ')' if s.url else s.heure }} {{ s.version }}{{ ' · ' if not loop.last }}{% endfor %}

  {% else %}
  Plus rien aujourd’hui.
  {% endfor %}

La carte se recalcule seule chaque minute, parce que le template utilise now() : une séance disparaît dès qu’elle a commencé, sans nouvelle requête à l’API. Gardez content: | avec la barre verticale : avec >, YAML replie les lignes et les films se suivent sur une seule.

Une notification quand il y a une séance ce soir

Paramètres › Automatisations › Créer une automatisation › Créer une nouvelle automatisation, puis ⋮ › Modifier en YAML, et collez :

Automatisation
alias: Ce soir au cinéma
triggers:
  - trigger: time
    at: '17:00:00'
variables:
  soiree: >
    {{ state_attr('sensor.cinema_aujourdhui', 'seances') | default([], true)
       | selectattr('heure', '>=', '18:00') | list }}
conditions:
  - condition: template
    value_template: '{{ soiree | count > 0 }}'
actions:
  - action: persistent_notification.create
    data:
      title: Ce soir au Champo
      message: |
        {% for film, seances in soiree | groupby('film') | sort(attribute='list.0.heure') -%}
        - {{ film }} : {{ seances | map(attribute='heure') | join(', ') }}
        {% endfor %}

À 17 h, si au moins une séance commence à 18 h ou plus tard, une notification apparaît dans Home Assistant :

Ce soir au Champo
- Affreux, sales et méchants : 19:55
- LA MAISON AU PIED DU ROC : 20:00
- Rendez-vous avec la peur : 22:05

Pas de séance ce soir, pas de notification. Pour la recevoir sur le téléphone, remplacez l’action par celle de l’application Companion, notify.mobile_app_<votre_telephone>, avec les mêmes title et message. L’automatisation lit le capteur et n’envoie aucune requête elle-même ; ⋮ › Exécuter les actions la teste à toute heure.

Quota

Le capteur envoie une requête au démarrage de Home Assistant et une toutes les quatre heures : six par jour, environ 42 par semaine, quel que soit le nombre de cartes et d’automatisations qui le lisent. Le forfait gratuit le couvre, redémarrages compris. Un hours: /2 double la note ; restez au-dessus de deux heures avec le forfait gratuit.

Variantes

  • Plusieurs cinémas. Copiez le rest_command et l’élément - triggers: sous un autre nom (cinema_seances_2, Cinéma aujourd’hui 2), et pointez une deuxième carte sur sensor.cinema_aujourdhui_2. Chaque cinéma ajoute 42 requêtes par semaine.
  • Tous les cinémas d’une ville. Prenez https://api.api-cinema.com/v1/showtimes?city=Lyon&date={{ now().date() }}&include=movie,cinema&limit=1000, ajoutez 'cinema': s.cinema.name à chaque élément de la liste, et affichez-le dans la carte à côté de l’heure. Lyon compte environ 400 séances par jour : voyez le point suivant.
  • La VO seulement. Ajoutez &version=VOST (ou VO) à l’URL ; ou gardez l’URL et filtrez dans la carte avec | selectattr('version', 'search', 'VO').
  • Un multiplexe. Un cinéma à 150 séances par jour donne une liste plus grosse que les 16 Ko que Home Assistant garde dans son historique : il écrit un avertissement et enregistre l’état sans la liste, et la carte continue de marcher. Pour le faire taire, excluez le capteur de l’enregistreur (recorder: exclude: entities: [sensor.cinema_aujourdhui]).

Tous les paramètres et champs sont dans la documentation. Pour le même programme en mail quotidien, voyez la newsletter n8n ; pour demander « qu’est-ce qui passe ce soir ? » à un assistant, le serveur MCP répond depuis Claude ou Cursor.