ChatGPT dans Jeedom?

Scénario question-action

On crée un bloc actionpuis on met tout ce qui suit dedans
Créer 4 variables :


puis on crée un 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️⃣ Récupération des variables dynamiques**
sleep(2); // Pause pour s'assurer que les variables sont bien disponibles

$openaiApiKey  = scenario::getData("jeedom_openai_api");
$cmdAskId      = scenario::getData("jeedom_question");
$pieceId       = scenario::getData("jeedom_piece");
$cmdReponseId  = scenario::getData("jeedom_sortie");

$scenario->setLog("📌 API Key récupérée : " . (empty($openaiApiKey) ? "❌ Manquante" : "✅ OK"));
$scenario->setLog("📌 Commande utilisateur ID : " . (empty($cmdAskId) ? "❌ Manquante" : $cmdAskId));
$scenario->setLog("📌 Pièce ID : " . (empty($pieceId) ? "❌ Manquante" : $pieceId));
$scenario->setLog("📌 Commande de réponse ID : " . (empty($cmdReponseId) ? "❌ Manquante" : $cmdReponseId));

// **📌 Vérification des variables obligatoires**
if (empty($openaiApiKey) || empty($cmdAskId) || empty($pieceId) || empty($cmdReponseId)) {
    $scenario->setLog("❌ Erreur : Une ou plusieurs variables essentielles sont manquantes.");
    exit;
}

// **3️⃣ Récupération de la commande utilisateur**
$cmdAsk = cmd::byId((int)$cmdAskId);
$questionUtilisateur = (is_object($cmdAsk) && $cmdAsk->execCmd() !== '') ? $cmdAsk->execCmd() : "";

if (empty($questionUtilisateur)) {
    $scenario->setLog("⚠️ Aucune commande reçue !");
    exit;
}
$scenario->setLog("📩 Commande utilisateur : $questionUtilisateur");

// **4️⃣ Récupération des équipements de la pièce**
$objet = jeeObject::byId((int)$pieceId);

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

// **5️⃣ Récupération des équipements actionnables**
$equipements = $objet->getEqLogic(true);
$equipementsActionnables = [];

foreach ($equipements as $equipement) {
    if ($equipement->getIsEnable() && $equipement->getIsVisible()) {
        foreach ($equipement->getCmd() as $cmd) {
            if ($cmd->getIsVisible() == 1 && $cmd->getType() == "action") {
                $equipementsActionnables[] = [
                    "nom" => $equipement->getName(),
                    "commande" => $cmd->getName(),
                    "id" => $cmd->getId()
                ];
                $scenario->setLog("✅ Équipement actionnable détecté : " . $equipement->getName() . " - Commande : " . $cmd->getName());
            }
        }
    }
}

if (empty($equipementsActionnables)) {
    $scenario->setLog("❌ Aucun équipement actionnable détecté !");
    exit;
}

// **6️⃣ Encodage JSON des équipements pour OpenAI**
$equipementsJson = json_encode($equipementsActionnables, JSON_UNESCAPED_UNICODE);
if (!$equipementsJson || $equipementsJson == "null") {
    $scenario->setLog("❌ Erreur JSON : les équipements ne sont pas envoyés à GPT.");
    exit;
}
$scenario->setLog("📊 Envoi des équipements détectés à GPT : " . $equipementsJson);

// **7️⃣ Envoi à GPT-4o**
$data = [
    "model" => "gpt-4o",
    "messages" => [
        ["role" => "system", "content" => "Tu es un assistant domotique Jeedom intelligent. Analyse et exécute les demandes en fonction des équipements disponibles."],
        ["role" => "system", "content" => "Réponds TOUJOURS sous la forme d'un JSON contenant : 'question', 'response', 'id', 'mode' (action ou info)."],
        ["role" => "user", "content" => "Voici les équipements disponibles dans la pièce ID $pieceId : " . $equipementsJson],
        ["role" => "user", "content" => "Commande utilisateur : " . $questionUtilisateur]
    ],
    "max_tokens" => 200,
    "temperature" => 0.5
];

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

$context = stream_context_create($options);
$response = @file_get_contents("https://api.openai.com/v1/chat/completions", false, $context);

// **8️⃣ Vérification de la réponse GPT-4o**
if ($response === FALSE) {
    $scenario->setLog("❌ Erreur OpenAI : L'API n'a pas répondu.");
    exit;
}

$responseData = json_decode($response, true);
if (!isset($responseData['choices'][0]['message']['content'])) {
    $scenario->setLog("❌ Réponse OpenAI invalide : " . print_r($responseData, true));
    exit;
}

// **🔹 Suppression des balises `json` dans la réponse**
$chatgptResponse = trim($responseData['choices'][0]['message']['content']);
$chatgptResponse = str_replace(["```json", "```"], "", $chatgptResponse);
$chatgptResponse = trim($chatgptResponse);

$scenario->setLog("✅ Réponse GPT après nettoyage : " . $chatgptResponse);

// **9️⃣ Exécution de la commande si action détectée**
$reponseJson = json_decode($chatgptResponse, true);

if (isset($reponseJson['id']) && $reponseJson['mode'] == "action") {
    $cmdIds = $reponseJson['id'];

    if (is_array($cmdIds)) {
        foreach ($cmdIds as $cmdId) {
            $cmd = cmd::byId((int)$cmdId);
            if (is_object($cmd)) {
                $cmd->execCmd();
                $scenario->setLog("✅ Exécution de la commande ID $cmdId : " . $cmd->getHumanName());
            } else {
                $scenario->setLog("❌ Échec : ID de commande inexistant ($cmdId)");
            }
        }
    } elseif (is_numeric($cmdIds)) {
        $cmd = cmd::byId((int)$cmdIds);
        if (is_object($cmd)) {
            $cmd->execCmd();
            $scenario->setLog("✅ Exécution de la commande ID $cmdIds : " . $cmd->getHumanName());
        } else {
            $scenario->setLog("❌ Échec : ID de commande inexistant ($cmdIds)");
        }
    } else {
        $scenario->setLog("⚠️ Aucun ID valide retourné par GPT.");
    }
}

// **🔟 Envoi de la réponse dans Jeedom**
$cmdReponse = cmd::byId((int)$cmdReponseId);
if (is_object($cmdReponse)) {
    $cmdReponse->event($reponseJson['response']);
    $scenario->setLog("✅ Réponse envoyée à l'ID $cmdReponseId : " . $reponseJson['response']);
} else {
    $scenario->setLog("❌ Erreur : Impossible d'envoyer la réponse (ID $cmdReponseId).");
}

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

Mode d’emploi

:dart: Comment utiliser ce scénario d’action ?

  • jeedom_openai_api = Ta clé API OpenAI
  • jeedom_commande = ID de la commande utilisateur (ex: question posée via un assistant vocal ou une interaction)
  • jeedom_piece = ID de la pièce Jeedom contenant les équipements à contrôler
  • jeedom_sortie = ID du message où afficher la réponse