ChatGPT dans Jeedom?

Salut à tous et un énorme merci pour le travail effectué notamment @fwehrle , je me suis bien éclaté avec vos codes, du coup, je me suis dit autant en faire un scénario à trou pour aider les boulets comme moi qui en chie à comprendre le code, du coup, j’ai bossé avec chat gpt, car il est concerné le machin non ?
J’ai fait deux scénarios, un pour les appels ou je pose une question et où il devra répondre par un texte et un deuxième pour les actions, extrêmement fortement inspirés de vos modèles.

Création d’un virtuel
Tout d’abord, je crée un virtuel a adapté pour les 2 scénarios Celon vos besoins :

Scénario question - réponse

Créer bloc action et mettre tout ce qui suit dedans :
Créer 3 variables :


puis un bloc code :
scenario::setData("jeedom_capteurs", "#[Virtuel Température][Etage - Température][Température]#;#[Virtuel Température][Salon bas - Température][Température]#");

Penser a remplacer les devices que vous voulez fournir à chat gpt par exemple dans mon cas : #[Virtuel Température][Etage - Température][Température]#;#[Virtuel Température][Salon bas - Température][Température]#
Un second bloc code :

$scenario->setLog("🚀 Début du script Assistant Domotique avec GPT-4o.");

// **1️⃣ Vérification de l'environnement PHP**
error_reporting(E_ALL);
ini_set('display_errors', 1);
$scenario->setLog("✅ Test : Environnement PHP chargé avec succès.");

// **2️⃣ Pause pour éviter le bug de récupération des variables Jeedom**
sleep(2);

// **3️⃣ Récupération des variables Jeedom**
$apiKeyGPT = scenario::getData("jeedom_openai_api");
$jeedomCapteurs = scenario::getData("jeedom_capteurs");  // Liste des capteurs sous forme Jeedom
$jeedomQuestion = scenario::getData("jeedom_question");  // Question de l'utilisateur
$jeedomSortieID = scenario::getData("jeedom_sortie");    // Commande où envoyer la réponse

// **4️⃣ Vérification des valeurs**
if (empty($apiKeyGPT) || empty($jeedomCapteurs) || empty($jeedomQuestion) || empty($jeedomSortieID)) {
    $scenario->setLog("❌ Erreur : Une ou plusieurs variables essentielles sont manquantes.");
    exit;
}

// **📌 Log des variables récupérées pour débogage**
$scenario->setLog("📌 API Key : ✅ OK");
$scenario->setLog("📌 Capteurs Jeedom : $jeedomCapteurs");
$scenario->setLog("📌 Question posée : \"$jeedomQuestion\"");
$scenario->setLog("📌 ID de la sortie : $jeedomSortieID");

// **5️⃣ Extraction des données Jeedom**
$capteursArray = explode(";", $jeedomCapteurs);
$capteursData = [];

foreach ($capteursArray as $capteur) {
    $cmd = cmd::byString(trim($capteur));
    if (is_object($cmd) && $cmd->execCmd() !== '') {
        $valeur = $cmd->execCmd();
        $scenario->setLog("✅ Capteur récupéré : {$cmd->getHumanName()} → $valeur");
        $capteursData[] = ["nom" => $cmd->getHumanName(), "valeur" => $valeur];
    } else {
        $scenario->setLog("⚠️ Capteur introuvable ou valeur vide : $capteur");
    }
}

if (empty($capteursData)) {
    $scenario->setLog("❌ Erreur : Aucune donnée récupérée de Jeedom.");
    exit;
}

// **6️⃣ Reformulation explicite du prompt pour OpenAI**
$prompt = "Tu es un assistant domotique Jeedom qui analyse les relevés des capteurs et répond aux questions de l'utilisateur.\n\n";

$prompt .= "**📊 Capteurs détectés et relevés actuels :**\n";
foreach ($capteursData as $data) {
    $prompt .= "- **{$data['nom']}** : {$data['valeur']}°C\n";
}

$prompt .= "\n⚠️ **Attention : Certains nombres dans la question peuvent être des identifiants et ne sont pas des capteurs.**\n";
$prompt .= "Tu dois ignorer tout chiffre qui ne correspond pas à un relevé de capteur.\n\n";

$prompt .= "**💡 Question posée par l'utilisateur :** \"$jeedomQuestion\"\n\n";
$prompt .= "**Ta mission :**\n";
$prompt .= "- Compare les relevés des capteurs.\n";
$prompt .= "- Réponds en **UNE seule phrase claire et directe**.\n";
$prompt .= "- Donne **l'information essentielle** sans analyser des nombres inutiles.\n\n";
$prompt .= "**Exemple de réponse correcte :**\n";
$prompt .= "- \"Le salon est l'endroit le plus chaud avec 19.8°C.\"\n";
$prompt .= "- \"Aucun relevé ne permet de répondre précisément à cette question.\"\n";

$prompt .= "\n**Réponds maintenant :**";


$scenario->setLog("📩 Envoi du prompt à OpenAI...");

// **7️⃣ Préparation de la requête OpenAI**
$data = [
    "model" => "gpt-4o",
    "messages" => [
        ["role" => "system", "content" => "Tu es un assistant domotique qui analyse les relevés des capteurs et réponds aux questions de manière directe et pertinente."],
        ["role" => "user", "content" => $prompt]
    ],
    "max_tokens" => 200,
    "temperature" => 0.6
];

$jsonPayload = json_encode($data, JSON_UNESCAPED_UNICODE);
if ($jsonPayload === false) {
    $scenario->setLog("❌ Erreur : JSON mal formé avant envoi à OpenAI.");
    exit;
}

// **8️⃣ Envoi à OpenAI**
$openaiUrl = "https://api.openai.com/v1/chat/completions";

$options = [
    "http" => [
        "header" => "Content-Type: application/json\r\n" . "Authorization: Bearer " . $apiKeyGPT . "\r\n",
        "method"  => "POST",
        "content" => $jsonPayload,
        "timeout" => 10
    ]
];

$context = stream_context_create($options);
$response = @file_get_contents($openaiUrl, false, $context);

// **9️⃣ Gestion de la réponse OpenAI**
$chatgptResponse = "Erreur : Aucune réponse générée.";
if ($response !== FALSE) {
    $responseData = json_decode($response, true);
    if (isset($responseData['choices'][0]['message']['content'])) {
        $chatgptResponse = trim($responseData['choices'][0]['message']['content']);
    } else {
        $scenario->setLog("❌ Réponse OpenAI invalide : " . print_r($responseData, true));
    }
} else {
    $scenario->setLog("❌ Erreur OpenAI : L'API n'a pas répondu.");
    exit;
}

// **🔟 Envoi de la réponse vers Jeedom**
$cmdSortie = cmd::byId($jeedomSortieID);
if (is_object($cmdSortie)) {
    $cmdSortie->event($chatgptResponse);
    $scenario->setLog("✅ Réponse envoyée à l'action message ID $jeedomSortieID : $chatgptResponse");
} else {
    $scenario->setLog("⚠️ Erreur : Commande ID $jeedomSortieID introuvable.");
}

// **🔚 Fin du script**
$scenario->setLog("🔚 Fin du script Assistant Domotique.");

Coté mode d’emploi :
:dart: Comment utiliser ce scénario ?

jeedom_capteurs = par exemple : #[Virtuel][Salon][Température]#;#[Divers][Meteo][Condition]#
jeedom_openai_api = ta clé API OpenAI
jeedom_question = ID de ta question
jeedom_sortie = ID du message où afficher la réponse

1 « J'aime »