Plan du planificateur HC ; dialogue avec le conseiller dans HA ; arbitre encadre (question a choix fermes, liste blanche)

This commit is contained in:
Tallagrand Thierry
2026-10-08 07:26:14 +02:00
parent b25770736f
commit dea9c88530
16 changed files with 1114 additions and 3 deletions

View File

@@ -270,9 +270,57 @@ views:
<small>Tout est gardé en base (`revue_constat`, `revue_piste`, avec les pistes écartées et leur motif) pour rejouer le conseiller plus tard et mesurer s'il progresse.</small>
- type: markdown
title: Dialoguer avec le conseiller
title: ⚖️ Arbitrage (cas non prévus par les règles)
content: |
Pour l'instant, le dialogue passe par **OpenClaw** (WhatsApp ou vocal) : « qu'est-ce qui a cloché hier ? » — il lit la revue et les pistes ci-dessus, et présente les pistes comme des avis.
{% set a = states.sensor.evcs_arbitrage %}
{% if a is none or a.state == 'aucun' %}
Aucune question en attente.{% if a is not none and a.attributes.dernier_cas %} Dernier arbitrage : {{ a.attributes.dernier_cas }} ({{ a.attributes.derniere_issue }}).{% endif %}
{% else %}
{% if a.state == 'question' %}❓ **Question envoyée par WhatsApp**{% else %}✅ **Réponse reçue**{% endif %} (depuis {{ as_timestamp(a.attributes.depuis) | timestamp_custom('%H:%M') if a.attributes.depuis else '?' }})
{{ a.attributes.question }}
{% for c in a.attributes.choix | default([]) %}
**{{ c.cle }}.** {{ c.libelle }}<br>
{% endfor %}
{% if a.state == 'repondu' %}
Réponse : **{{ a.attributes.reponse }}** → {{ a.attributes.application }}
{% endif %}
{% endif %}
<small>Le code détecte la situation et propose des choix fermés ; seul l'ordre du choix retenu est appliqué (liste blanche). Appliquer : {{ states('input_boolean.evcs_arbitrage_enabled') }}.</small>
- type: entities
entities:
- entity: input_boolean.evcs_arbitrage_enabled
name: Arbitrage — appliquer ma réponse
- type: entities
title: 💬 Poser une question au conseiller
entities:
- entity: input_text.evcs_conseiller_question
name: Ta question (Entrée pour envoyer)
- type: markdown
content: |
{% set r = states.sensor.evcs_conseiller_reponse %}
{% set q = states('input_text.evcs_conseiller_question') %}
{% if r is none %}
Pas encore de réponse. Écris une question ci-dessus : le conseiller répond en une à deux minutes (il lit l'état du système, la revue du jour et ses pistes).
{% else %}
{% set en_attente = (as_timestamp(states.input_text.evcs_conseiller_question.last_changed) | int(0)) > (r.attributes.question_at | int(0)) %}
{% if en_attente %}⏳ **Question en cours de traitement…** (« {{ q }} »)
---
{% endif %}
**Question** ({{ r.state }}) : _{{ r.attributes.question }}_
{% if r.attributes.avertissement %}⚠️ **{{ r.attributes.avertissement }}**
{% endif %}
{{ r.attributes.reponse }}
<small>{% if r.attributes.source == 'openrouter' %}☁️ Réponse d'**OpenRouter** (cloud, secours : la Spark n'a pas répondu){% else %}🏠 Réponse du modèle local de la **Spark** ({{ r.attributes.modele }}){% endif %} · le conseiller explique, il ne commande rien.</small>
{% endif %}
<small>Aussi par **OpenClaw** (WhatsApp ou vocal) : « qu'est-ce qui a cloché hier ? »</small>
- type: entities
entities: