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
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