Gestion de cave à vin intelligente

Non je n’ai pas de lien, c’est un crédit gratuit pour tous les services cloud de Google, ça apparaît bien dans mon résumé des facturations comme crédit gratuit dispo, a coté de mes 0,02€ depensés (et offerts) pour tout mon debug du package.
J’avoue que les flux de token sont plutôt obscurs (notamment concernant les limites de gratuité), j’ai mis des alertes budget dans l’espace client Google pour savoir quand je dépense 20cts et 50cts, je verrai bien si ça arrive un jour !
J’imagine qu’à mesure que l’utilisation des ia se généralise, les limites de token gratuits augmenteront, ou qu’on pourra avoir des abonnements gratuits a moyen terme pour certains LLM.
D’où l’intérêt de pouvoir switcher d’ia facilement dans le package !

super taff bravo, juste une ptit coquille dans le fichier :carte_priorites_apogees.yaml {%- endfor -%}
merci encore

1 « J'aime »

a tu une idee , pour quoi mon dessin ne s’actualise pas automatiquement

Changement d’ IA :

Comme pour gemini ce rendre sur ce lien https://platform.openai.com/api-keys ,
Cliquer sur « Create new secret key » et copié la clé
Dans Ha ajouter l’intégration OpenAi , collé la clé si vous avez le choix du modèle prendre « gpt-4o »

Dans paramètres de l’assistant , ajouter un agent de conversation type OpenAI : " IA OpenAI – cave"

Modification du yaml pour chaque automatisation concerné

Pour « IA - Accord Mets Expert V2 »

- action: conversation.process
        data:
          agent_id: conversation.ia_openai_cave
          text: >-
             Agis comme un sommelier expert. Ta réponse doit être uniquement un dictionnaire JSON pur.
             MA CAVE :
             {% set vins = state_attr('sensor.cave_a_vin_supersensor', 'vins') %}
             {%- for key, info in vins.items() if info.nombre_bouteilles | int > 0 -%}
               - {{ info.nom.valeur }} ({{ info.annee.valeur }}),
             {%- endfor %}
             ANALYSE POUR LE PLAT : "{{ states('input_text.v2_plat_du_jour') }}"
             ANNÉE ACTUELLE : {{ now().year }}
             STRUCTURE : {"choix": "Nom + Année", "raison": "Explication détaillée", "service": "Carafe/Température"}
        response_variable: accord_result
      - if:
          - condition: template
            value_template: "{{ accord_result.response.speech.plain.speech is defined and accord_result.response.speech.plain.speech | length > 20 }}"
        then:
          - variables:
              res: "{{ accord_result.response.speech.plain.speech | replace('```json', '') | replace('```', '') | trim | from_json }}"

Pour « IA - Audit Stratégique Cave Synthétique »

- action: conversation.process
        data:
          agent_id: conversation.ia_openai_cave
          text: >-
            Agis en sommelier conseil. Analyse ma cave (Année {{ now().year }}) :
            {% set vins = state_attr('sensor.cave_a_vin_supersensor', 'vins') %}
            {%- for key, info in vins.items() if info.nombre_bouteilles | int > 0 -%}
              - {{ info.appellation.valeur }}, {{ info.couleur.valeur }}, Apogée: {{ info.apogee.valeur }}
            {%- endfor %}
            CONSIGNES :
            1. Analyse globale uniquement (couleurs et maturité).
            2. Propose exactement 5 vins sous le seuil de {{ states('input_number.v2_budget_max_achat') }}€, avec l'intervalle de millesimes a viser pour equilibrer la cave.
            3. Région prioritaire : {{ states('input_select.v2_priorite_region') }}.
            FORMAT JSON OBLIGATOIRE : 
            {
              "bilan": "Une phrase synthétique.",
              "achats": "\n1. [Nom] ([Appellation]) - [Couleur] - [Prix] - [Nombre de bouteilles a viser] : [Utilité]\n2. [Vin 2]...\n3. [Vin 3]...\n4. [Vin 4]...\n5. [Vin 5]..."
            }
        response_variable: audit_result
      - if:
          - condition: template
            value_template: >
              {{ audit_result.response.speech.plain.speech is defined
                 and audit_result.response.speech.plain.speech | length > 20 }}
        then:
          - event: EVENT_AUDIT_IA_REUSSI
            event_data:
              conseils: >
                {% set res = audit_result.response.speech.plain.speech | replace('```json', '') | replace('```', '') | trim | from_json %}
                **Bilan :** {{ res.bilan }}
                **Suggestions (<{{ states('input_number.v2_budget_max_achat') }}€) :**
                {{ res.achats }}

Pour « IA - Aide à l’Achat Comparatrice »

- action: conversation.process
        data:
          agent_id: conversation.ia_openai_cave
          text: >-
            Expert en vin, analyse ce projet d'achat : {{ states('input_text.v2_vin_convoite') }}.
            MA CAVE ACTUELLE :
            {% set vins = state_attr('sensor.cave_a_vin_supersensor', 'vins') %}
            {%- for key, info in vins.items() if info.nombre_bouteilles | int > 0 -%}
              - {{ info.appellation.valeur }}, {{ info.couleur.valeur }}, Apogée: {{ info.apogee.valeur }}
            {%- endfor %}
            MISSIONS SUPPLÉMENTAIRES :
            1. PRIX : Estime un prix d'achat conseillé (moyenne du marché actuel).
            2. MILLÉSIME : En fonction de ma cave, quel millésime de ce vin devrais-je viser ?
            RÉPONSE JSON STRICTE :
            {
              "ressemblance": "Vin proche en cave + pourquoi",
              "pertinence": "Doublon ou manque ? (court)",
              "prix_conseille": "X € (basé sur [source])",
              "millesime_vise": "Année + raison stratégique",
              "verdict": "ACHAT VALIDÉ ou DÉCONSEILLÉ + raison + nombre de bouteilles a viser
            }
        response_variable: opportunite_result
      - if:
          - condition: template
            value_template: "{{ opportunite_result.response.speech.plain.speech is defined }}"
        then:
          - event: EVENT_OPPORTUNITE_IA_REUSSI
            event_data:
              analyse: >
                {% set res = opportunite_result.response.speech.plain.speech | replace('```json', '') | replace('```', '') | trim | from_json %}
                **🔍 Ressemblance :** {{ res.ressemblance }}
                **⚖️ Analyse :** {{ res.pertinence }}
                **💰 Prix conseillé :** {{ res.prix_conseille }}
                **📅 Millésime à viser :** {{ res.millesime_vise }}
                **🚀 Verdict :** {{ res.verdict }}

On redémarre ou on recharge la config est c’est tout bon.

Bien sur comme pour Gemini, il y a un max de Token ,
il faut donc allez sur https://platform.openai.com/settings/organization/billing/overview
rentrer son mode de paiement et definir les limites comme suit c’est largement suffisant.

1 « J'aime »

La visu ne s’actualise pas toute seule, a chaque modif (ou pour la mise en surbrillance accord mets vin) il faut mettre a jour avec le bouton affiché juste au dessus de la cave dans le rendu html. Je ne sais pas pourquoi mais chez moi je dois cliquer 2 fois dessus pour que les modifs apparaissent.

Il peut aussi y avoir un soucis de cache html persistant, fais un refresh du cache (ou vide le cache de l’app mobile).

Hormis la mise a jour, la visu marche chez toi ? Tu pourrais mettre une capture que je vois le rendu chez quelq’un d’autre ?

Super, merci, je vais regarder dans le jours a venir pour laisser le choix de l’IA dans le package.


c’est ca que tu veux voir ?

1 « J'aime »

Oui c’est parfait merci ! J’ai ajouté le système de placement des clayettes sans le tester chez moi, et apparemment ça marche !

Salut et bravo pour le job !

Perso j’ai du raté quelque chose car la visu de la cave ne se fait pas.


Je voulais repartir de zéro mais je n’ai pas trouver comment tout reinitialiser !
Par ailleurs ou sont stokées les données ?

Pour la visu, tu peux essayer quelques trucs avant de recommencer l’instal :

  • lance manuellement le shell update_cave_html de génération dans les actions des options de developpement
  • vide le cache de ton navigateur
  • change l’URL de la page html appelée dans la carte du dashboard, en ajoutant ?v1 pour forcer le chargement : /local/www/cave/mon_casier.html?v1
  • lance la page html directement dans ton navigateur sans passer par ha, pour voir si elle a été générée en local, avec l’adresse : http(s)://ton_ip_ha/local/cave/mon_casier.html

Pour tout réinitialiser, supprime juste les 2 packages yaml copiés et les fichiers de la visu, et redémarre HA : toutes les entités auront été supprimées. En sachant qu’en entités de stockage des données il n’y a que le supersensor du stock et le json de la visu.

Merci. Pour info c’est quoi un supersensor ?

C’est le sensor qui stocke toute ta base de données de la cave : sensor.cave_a_vin_supersensor

Il est un peu particulier car toutes les entrées de la cave sont stockées dans ses attributs.

voici le retour de l’update_cave…


j’ai vérifié que le token était bien identique dans les 4 fichiers. Le supersensor a l’air correct mais le fichier /homeassistant/www/cave/mon_casier.html n’est pas créé.
Une idée pour aller + loin ?

Oui je vois plusieurs choses avec cette erreur, les scripts ne communiquent pas avec ton HA.

  1. verifie que ton token longue durée est valide et bien entré

  2. les scripts communiquent en http avec HA, si tu es en https il peut y avoir des soucis. Tu peux essayer de modifier dans le script generate_cave.py l’URL_BASE en mettant ton ip locale de HA a la place de localhost, d’abord en conservant http puis si ça ne marche pas en mettant le https. Redémarre HA après chaque modif. Si ça marche il faudra faire pareil pour les autres scripts.

Si ça ne marche pas ça devrait changer les messages d’erreur.

Courage , le tuto est … perfectible ;p mais a force de batailler ca a fini par marché ,aide toi de gemini pour suive les etapes

Dis moi là où ça manque d’infos et ce qu’il manquait, je compléterai.

J’avais laissé les "" autour du token…
donc ça progresse :wink:

Les " sont bien a laisser. Par contre si il y a un espace introduit dedans ça ne marchera pas.

J’ai ajouté sur le github une modif du package de base, qui ajoute à la base de données des vins en retour du prompt Gemini un accord mets/vins général (viande rouge, fromage, desserts etc…) et un profil arômatique en %.
Ca permet de faire des beaux graphes, notamment avec apex charts pour comparer visuellement les vins en termes d’aromes.

J’ai ajouté la carte apex et la modification du package/dashboard d’origine sur le github.
Par contre ça modifie les attributs du supersensor en ajoutant des lignes a chaque nouvelle entrée de vin, donc pour completer les attributs des vins deja existants dans votre cave je vous invite a :

  1. ajouter un nouveau vin apres avoir mis a jour le package
  2. copier l’etat de votre sensor dans les outils de developpement, et le coller dans gemini ou autres et demander a remplir les memes champs dans les entrées précédentes que votre dernier ajout, puis à remplacer l’etat de votre supersensor par celui modifié par l’IA.

J’ai un progressé durant le WE malgré des comportements un peu bizarres, par exemple, la visu des bouteilles s’est enfin manifestée tout d’un coup sans que je fasse quelque chose…
Une chose que je note est qu’il manque de feedbacks quand on exécute une fonction, du moins c’est mon impression ou alors il faut s’habituer à des temps de réponse importants.
Actuellement j’ai l’IA qui parait bloquée malgré un reboot de la MV et vidage de cache.


De plus les seuils IA ne paraissent pas dépassés…