Intégration de l'IA Mistral dans Jeedom

Hello,
Voici un petit tuto pour utiliser l’IA de Mistral dans Jeedom.

TUTO I : Question/Réponse

Ce travail a été inspiré des travaux de @differentman ChatGPT dans Jeedom? - #81 par differentman

1/ Créer un virtuel avec 2 commandes infos et noter leur ID:

2/ Créer un compte sur Mistral puis se rendre sur https://console.mistral.ai/home
J’ai choisi un plan " Expérimentation".

3/ Cliquer sur Clé API pour créer votre clé et notez la.

4/ Télécharger le fichier
IAMistralQR.json.txt (20,6 Ko)

Avant de l’importer, prendre soin de supprimer le .txt du nom du fichier pour avoir une extension en .json.

5/ Importer le scénario
image

Charger le json, sélectionner le Template, remplacer les 2 commandes de valeurs puis appliquer.

Le scénario est composé de 4 parties :
1/ la clé, commande Question, commande Réponse
2/ la liste des capteurs des pièces à Mistral
3/ la liste des capteurs à envoyer à Mistral
4/ le code de gestion

Voilà :slight_smile:

19/07 : ajout de la gestion des capteurs des pièces.
On peut ajouter des capteurs manuellement ET/OU les pièces.

6 « J'aime »

TUTO II : Question/Action

Réservé Merci

salut

Merci pour le taf :slight_smile:

j’ai testé pour le plaisir, même si la limite de mistral avec 50 requetes semaines me semble trop juste

j’ai un erreur d’authentification :

2025-07-18 10:13:07][SCENARIO]  Réponse HTTP reçue : 401
[2025-07-18 10:13:07][SCENARIO]  Réponse Mistral invalide : Array
(
[detail] => Unauthorized
)

j’ai du louper une étape, j’ai bien créé mon compte, récupéré la clé API

Tu as bien mis la clé dans la première variable ?

bien sur :slight_smile:

[2025-07-18 10:13:05][SCENARIO]  Début du script Assistant Domotique avec Mistral AI.
[2025-07-18 10:13:05][SCENARIO]  Test : Environnement PHP chargé avec succès.
[2025-07-18 10:13:07][SCENARIO]  API Key : OK
[2025-07-18 10:13:07][SCENARIO]  Question posée : "quelle est la température extérieur"
[2025-07-18 10:13:07][SCENARIO]  Capteur récupéré : [Météo][Résumé Températures][Extérieur] [ID: 13367] → 19.9°C
[2025-07-18 10:13:07][SCENARIO]  Capteur récupéré : [Météo][Résumé Températures][Pièce de vie] [ID: 13368] → 24.1°C

Dans mistral, tu utilises la clé principale du projet, pas une clé secondaire ?
pas d’autorisation particulière à créé sur leur console ?

Heu oui, c’est la clé ici : Vos clés API - La Plateforme - Mistral AI
Tu as pris quoi comme abonnement ? Abonnement - Admin - Mistral AI
Si besoin, tu me sollicites en privé, on fera un retour ici en public :slight_smile:

1 « J'aime »

Voilà tout s’explique
avec une clé créée ici ca marche
moi j’avais pris la clé principale qu’il affiche au niveau du projet

image

merci :slight_smile:

1 « J'aime »

Concernant l’usage de ce scenario, comment l’exploites tu ?

il faut presque en faire plusieurs, pour les capteurs de températures, un autre pour les ouvertures, …

et comment les lancer par une commande vocale ?

Bonjour,

J’ai aussi quelques questions sur ce sujet qui m’intéresse, et j’en profite un peu (désolé de l’intrusion dans ce fil !) :

  1. dans les deux blocs codes que j’ai importé via le template dans le scénario, j’ai ces lignes qui posent problème :
scenario::setData("jeedom_capteurs", "

et

// 3. Récupération des variables
$apiKeyMistral  = scenario::getData("mistral_api_key");
$jeedomCapteurs = scenario::getData("jeedom_capteurs");
$jeedomQuestionID = scenario::getData("jeedom_question");
$jeedomSortieID = scenario::getData("jeedom_sortie");

J’ai en effet ces deux erreurs qui apparaissent à l’exécution du scénario :

[2025-07-18 11:26:12][SCENARIO] Affectation de la variable jeedom_question => 10893 (10893)
[2025-07-18 11:26:12][SCENARIO] Affectation de la variable jeedom_sortie => 10895 (10895)
[2025-07-18 11:26:12][SCENARIO] Exécution d'un bloc élément : 2138
[2025-07-18 11:26:12][SCENARIO] Exécution d'un bloc élément : 2139
[2025-07-18 11:26:12][SCENARIO] - Exécution du sous-élément de type [action] : code
[2025-07-18 11:26:12][SCENARIO] Exécution d'un bloc code

>>>>> [2025-07-18 11:26:12][SCENARIO] Non-static method scenario::setData() cannot be called statically

[2025-07-18 11:26:12][SCENARIO] Exécution d'un bloc élément : 2140
[2025-07-18 11:26:12][SCENARIO] Exécution d'un bloc élément : 2141
[2025-07-18 11:26:12][SCENARIO] - Exécution du sous-élément de type [action] : code
[2025-07-18 11:26:12][SCENARIO] Exécution d'un bloc code
[2025-07-18 11:26:12][SCENARIO]  Début du script Assistant Domotique avec Mistral AI.
[2025-07-18 11:26:12][SCENARIO]  Test : Environnement PHP chargé avec succès.

>>>>> [2025-07-18 11:26:14][SCENARIO] Non-static method scenario::getData() cannot be called statically

[2025-07-18 11:26:14][SCENARIO] Fin correcte du scénario

Mais si je remplace respectivement dans ces lignes les expressions :
scenario::setData et
scenario::getData

par

$scenario->setData, et
$scenario->getData,

ça fonctionne :

[2025-07-18 11:31:02][SCENARIO] - Exécution du sous-élément de type [action] : code
[2025-07-18 11:31:02][SCENARIO] Exécution d'un bloc code
[2025-07-18 11:31:02][SCENARIO] Exécution d'un bloc élément : 2140
[2025-07-18 11:31:02][SCENARIO] Exécution d'un bloc élément : 2141
[2025-07-18 11:31:02][SCENARIO] - Exécution du sous-élément de type [action] : code
[2025-07-18 11:31:02][SCENARIO] Exécution d'un bloc code
[2025-07-18 11:31:02][SCENARIO]  Début du script Assistant Domotique avec Mistral AI.
[2025-07-18 11:31:02][SCENARIO]  Test : Environnement PHP chargé avec succès.
[2025-07-18 11:31:04][SCENARIO]  API Key : OK
[2025-07-18 11:31:04][SCENARIO]  Question posée : "Quelle est la température de ma chambre ?"
[2025-07-18 11:31:04][SCENARIO]  Capteur récupéré : [Salon][Capteur THP][Température] [ID: 9950] → 29.8°C
[2025-07-18 11:31:04][SCENARIO]  Capteur récupéré : [Chambre parents][Capteur THP][Température] [ID: 6650] → 29.4°C
[2025-07-18 11:31:06][SCENARIO]  Réponse HTTP reçue : 200

>>>> [2025-07-18 11:31:06][SCENARIO]  Réponse envoyée : "La température de votre chambre parents est de 29.4°C." à la commande Quelle est la température de ma chambre ?

[2025-07-18 11:31:06][SCENARIO]  Fin du script Assistant Domotique Mistral AI.
[2025-07-18 11:31:06][SCENARIO] Fin correcte du scénario

Est-ce que j’ai fait quelque chose de travers ?

  1. Sinon même question que @Nemeraud pour la commande vocale…

Pour l’instant je ne l’exploite pas. J’ai propose rapidement ce tuto comme solution de base. Après les gens l’adaptent en fonction de leur besoin.

C’est un choix, ou alors mettre tous les capteurs. Pour mes tests, j’ai mis tous les capteurs de températures et il se débrouille bien.

Je ne me suis pas encore posé sur la question, mais avec Interactions, il y a surement moyen :slight_smile:

@DanielJ
Tu peux me montrer des copies d’écran du scénario stp (en masquant ta clé) ?

Yep, voilà (la version qui fonctionne pour moi) :

Et juste par acquis de conscience (je ne pense pas qu’il y ait un rapport, mais sait-on jamais…), la copie d’écran de mon virtuel :

Désolé, je ne vois pas ce que tu as modifié.

Ok, pardon, voici la copie avec en encadré mes modifs $scenario->setData et $scenario->getData:

Ok, je vais creuser la question

j’ai modifié la partie récupération des équipements pour tous ceux d’un objet

// ** Récupération des équipements de la pièce **
$pieceId = 7;

$objet = jeeObject::byId((int)$pieceId);

if (!is_object($objet)) {
    $scenario->setLog("Erreur : Aucun objet trouvé pour l'ID $pieceId.");
    return; // ou exit; dans certains cas
}
$scenario->setLog("Pièce détectée : " . $objet->getName());

$jeedom_capteurs = "";

$eqLogics = eqLogic::byObjectId($objet->getId());

foreach ($eqLogics as $eqLogic) {
    $cmds = $eqLogic->getCmd('info');

    foreach ($cmds as $cmd) {
        $nomObjet = $objet->getName();
        $nomEquipement = $eqLogic->getName();
        $nomCommande = $cmd->getName();
		if ( $nomEquipement != "Résumé" ) {
        	// Format Jeedom
        	$cmdFormat = "#[" . $nomObjet . "][" . $nomEquipement . "][" . $nomCommande . "]#";

        	// Ajout à la liste
        	if ($jeedom_capteurs != "") { $jeedom_capteurs .= ";"; }
        	$jeedom_capteurs .= $cmdFormat;
        }
    }
}

$scenario->setLog("Capteurs Jeedom : $jeedom_capteurs");

$scenario::setData("jeedom_capteurs", "$jeedom_capteurs");

@DanielJ , ok je viens de comprendre, tu as remplacé :: par →
Tu es sous quelle version de Jeedom ?

@Nemeraud pas mal, j’avais vu ça sur ChatGPT, mais je voudrais faire un truc où on peut lister plusieurs pièces.
Tu veux que je regarde pour l’intégrer à mon code initial ?

Oui, c’est ça…
La dernière version v4.4.19, DB12, et à jour de tout (php, python,…)

c’est juste pour info, chacun peut adapter comme il le souhaite, mes objets jeedom ne sont pas fait en fonctione des pièces mais par fonction alors c’est pratique, mon objet « meteo » contient tous les capteurs température, humidité, … de la maison

ca marche super bien :slight_smile:

image

merci pour ton code

dans l’usage, je pense que je vais basculer vers l’IA Gemini, si je me décidé à le passer en prod

1 « J'aime »

Bonjour,

Si vous êtes abonné chez Free, La version Pro de Mistral est gratuite pendant 1 ans.

2 « J'aime »

@DanielJ Je ne sais pas pourquoi ça coince pour toi…