Jeedom Assistant AI (un peu d'IA dans Jeedom)

Hello,

Ca fait un petit moment que j’utilise une IA pour interagir avec Jeedom (pour l’instant via Telegram, mais je me tâte a remonter un assistant vocal), et j’ai récemment remis les mains dans mon code suite à la découverte de l’ajout du contexte dans les API de chatGPT (OpenAI Assistant).

Ca m’a permis ENFIN, d’avoir des discussions claire avec jeedom puisqu’il garde maintenant en mémoire ce que je lui dit.
Mais comme on a rien sans rien, j’ai finalement laissé tombé OpenAI Assistant (car un peu lent), pour utiliser le chat normal, mais en gérant le contexte coté client (dans jeedom donc).

Avantage : on peut utiliser d’autres moteurs, comme Mistral, sans soucis.

Bref, le code du scenario est ici : GitHub - fwehrle/JeedomAssistant
Il suffit de tout coller dans un dossier jeedomAssistant dans le plugin script (ou ailleurs), via l’éditeur de fichiers.
Et de copier le contenu du fichier codeScenario_Notification IA.php (sans les balises <?php et ?> qui ne servent qu’a mon editeur) dans un bloc code dans un scénario appelé soit par telegram, soit par un autre scénario.

Tous le parametrage et le choix du provider IA se fait dans le scenario.
La clé API se met dans une variable (ou pas), et pour ce qui est du moteur, perso, Mistral est plus rapide qu’openAI (chatGPT)
Pensez a indiquer aussi votre scénario de retour de notification (celui qui renvois la réponse à telegram par ex), en adaptant les tag.

Niveau fonctionnalité, j’ai pour l’instant :

  • gestion de la mémoire par profile (dans le cas ou plusieurs personnes discutent avec l’IA)
  • gestion du temps max de mise en mémoire (pour ne conserver l’historique qu’une heure par ex. pour optimiser la vitesse de réponse)
  • réponse aux questions sur les états des équipements de la maison
  • Envoi des infos de la maison pièce par pièce en fonction de la question (rapidité ++ et token --)
  • action sur des commandes (désactivable), pour l’instant, tout les binaires, volets, lumières et portes
  • envoi des images des camera et analyse des images (avec compression)
  • filtre des équipements et commandes par pièces
  • Prompt paramétrable dans le fichier jeedomAssistant, dans la méthode createAssistantConfig

Voila, vous pouvez en faire ce que vous voulez :slight_smile:
Et si vous avez des idées, je suis preneur…
Dans une prochaine version, je brancherais surement toutes les notifications de la maison sur ce scénario, pour des réponses plus sympa.
En dans un future proche, on pourrait même imaginer que l’IA reçoive des notifs de la maison, agisse en conséquence, et nous prévienne :wink:

Franck

8 « J'aime »

Hello

Le code pour le scénario ne peut pas être utilisé en l’état.
En effet il contient des émoticônes que jeedom n’accepte pas

Hello,
Ah? Intéressant. Merci pour l’info.
Je passe mon temps améliorer ce code et a le copier coller dans mon scenario, et mon jeedom n’a rien dit.
Je vais voir si ça n’est pas un problème de conversion depuis GitHub.
Tu le récupère comment? C’est peut-être un problème de copier coller depuis GitHub?

Quel est le problème exactement?
Je viens de copier le code du scénario directement depuis la page gitHub dans un bloc code, et les emoji ne posent pas de problème.

PS : tu as bien pensé a enlever les balises php de début et de fin que j’ai laissé pour la coloration syntaxique de mon éditeur externe (<?php et ?> ) ?

Oui.

J’ai été obligé de supprimer certains icone
Les croix vertes et rouges passent à la sauvegarde. mais pas les autres

je viens de télécharger le nouveau projet

Je vois des caractères incorrects dans ta copie d’écran. C’est très étrange, je n’ai pas ces soucis.
Tu télécharge les fichiers comment?

Effectivement.
Sur la capture, c’est en passant par l’editeur de Synology

je viens de refaire avec un editeur (Phonix code).
mais obligé quand meme de supprimer certain icon pour sauvegarder

Ok, c’est surement ca. Pourquoi ne pas passer par l’éditeur de fichier de jeedom?
Mais je pense a un truc : tu me montres le code du scenario. Celui-la, tu copie colle directement depuis la page du scenario, non?
GitHub :

Bloc code du scénario :


Et pour les 2 fichiers, passes par l’editeur de jeedom : Reglage : system : editeur de fichiers

1 « J'aime »

la clé API Mistral est a saisir uniquement dans le bloc code codeScenario_Notification IA

Dans les deux autres fichiers
AIChat.class.php
jeedomAssistant.class.php

il faut faire des modifications également concernant Mistral ou GPT ?

Dans mon exemple, c’est le scenario qui va chercher la clé dans une variable de jeedom là :
$aiApiKey = $scenario->getData('MISTRAL_API_KEY'); //Token API

Mais tu peux très bien la chercher ailleurs, voir la mettre en dur , même si c’est pas conseiller.
$aiApiKey = "xxxxxxxxxxxxx"; //Token API

Toute la config, le prompt, les pieces et commandes, l’id du scenario de notification retour, etc… se passe dans le code du scenario.
Tu n’as absolument pas besoin de modifier les 2 fichiers de classe. Ce qu’ils contiennent sont des valeurs par défaut dans le cas ou tu n’as pas spécifier de valeurs lors de l’appel dans le scenario

Non, si tu veux utiliser chatGPT a la place de Mistral, tu as juste, dans le code du scenario, a commenter les lignes de Mistral (en les préfixant par //) , et décommenter celles d’OpenAI (en enlevant les // au début :

// OpenAI :
// $aiApiKey = $scenario->getData('OPENAI_API_KEY'); //Token API
// $aiBaseUrl = "https://api.openai.com/v1"; //URL de base de l'API OpenAI
// $aiModel = "gpt-4o-mini";
// $aiModelVision = "gpt-4o-mini"; // 'gpt-4o-mini' ou 'gpt-4o', 'gpt-4-turbo' (OpenAI avec vision)

// Mistral :
$aiApiKey = $scenario->getData('MISTRAL_API_KEY'); //Token API
$aiBaseUrl = "https://api.mistral.ai/v1"; //URL de base de l'API Mistral
$aiModel = "mistral-small-latest"; // mistral-small-2506 : léger et rapide /magistral-small-2509 : équilibré et puissant
$aiModelVision = "pixtral-12b"; // Vision : mistral-small-2506 ou pixtral-large-latest (avec vision) / pixtral-12b-2409 (vision uniquement)

Après, tu peux aussi plus simplement renseigner les 4 variables :

$aiApiKey = « xxx »; //Token API
$aiBaseUrl = « xxx »; //URL de base de l’API (de chatGPT ou Mistral)
$aiModel = « xxx »; // le nom de code du model openAI ou Mistral a utiliser (attention, les couts varient)
$aiModelVision = « xxx »; idem, mais c’est le modele a utiliser juste pour la reconnaissance d’image

Désolé si c’était pas très clair

Pour le scenario de notification, il faut juste qu’il traite les tag que je lui passe. Au pire, tu en créé un juste pour ca, vide, et tu regarde ce qui passe dans les logs. Tu as ensuite juste a traiter les tags et les passer a ta commande de notification (j’utilise telegram)

Si j’utilise mistral il faut bien que je modifie cela ?

Non, comme je le disais, ce sont juste les valeurs par defaut (qui utilisent effectivement openAI) dans le seul cas ou tu instancie la classe SANS passer la config en paramètre. Mais le code du scénario que je fournie passe bien une config complète, que tu dois adapter dans le scénario.

Mais merci pour la remarque, je vais uniformiser voir ne pas mettre de valeurs par défaut si cela peut etre source d’incompréhension.

Edit : j’ai poussé une version 3.02 ou j’ai complètement supprimé les réferences a openAI et Mistral dans les valeurs par défaut des 2 classes.

1 « J'aime »

Pour le scenario de la réponse.
On récupère quelles variables ou tags ?

en tout cas ca marche
25-11-09 16:42:08][SCENARIO] - Exécution du sous-élément de type [action] : code
[2025-11-09 16:42:08][SCENARIO] Exécution d’un bloc code
[2025-11-09 16:42:08][SCENARIO] Question de Didier: La lumiere est allumée ?
[2025-11-09 16:42:09][SCENARIO] Réponse: Bonjour Didier,
Je ne trouve pas d’information sur l’état de la lumière dans le salon.
Peux-tu me préciser de quelle lumière tu parles ?
[2025-11-09 16:42:09][SCENARIO] Pièce(s): salon
[2025-11-09 16:42:09][SCENARIO] Confiance: low
[2025-11-09 16:42:09][SCENARIO] Fin correcte du scénario

1 « J'aime »
        $tags['#profile#'] = $profile; //Nom du user (comme envoyé au scenario IA)
        $tags['#msg#'] = $message; //Le texte du message réponse de l'ia
        $tags['#command#'] = $command; //l'id de la commande d'envoi telegram (telle que passée en entrée au scénario IA

Les pieces doivent correspondrent à tes noms de pieces dans jeedom

Pour débugguer, tu peux activer les logs que tu pourra lire dans la section logs de jeedom : scenario_execution

   'debug' => false, //Affichage des logs de débuggage dans le log scenario_execution
    'debug_eq' => false, //Affichage de la liste des équipements chargés
    'debug_eq_detail' => false, //Affichage du détail des équipements chargés
    'debug_dont_run_action' => false //Ne pas exécuter les actions (mode test)

Penses aussi a adpater cette section a ta config dans jeedom :


    // Pièces à inclure dans les infos a envoyer à l'IA
    'pieces_inclus' => [
        "Maison", "Jardin", "Piscine", "Consos", "Entrée", "Salon", "Salle à manger", "Cuisine", "Garage",
        "Demi Niveau", "Bibliothèque", "Salle de bain", "Chambre Parents", "Bureau", "Etage", "Chambre yyy", "Chambre xxx"
    ],

    // Équipements à exclure dans les infos a envoyer à l'IA
    'equipements_exclus' => [
        "Prise", "Volets", "Résumé", "Dodo", "Eteindre", "Météo Strasbourg", "Pollens", "Caméra Tablette Salon"
    ],

    // Catégories d'actions autorisées à l'IA : "light", "opening", "heating","security","energy","automatism","multimedia","default"
    'eq_action_inclus_categories' => ["light", "opening", "heating", "security"],

    // Commandes à exclure
    'eq_cmd_exclus' => ["Rafraichir", "binaire", "Thumbnail"],
1 « J'aime »

Y’a plus qu’à faire un plugin pour Monsieur et Madame tout le monde :blush: :blush:

image

2 « J'aime »