{
    "name": "chat gpt action scénario a trou fonctionelle",
    "isActive": "1",
    "group": "Chatgpt",
    "mode": "provoke",
    "schedule": "",
    "trigger": [
        ""
    ],
    "timeout": "0",
    "object_id": null,
    "isVisible": "0",
    "display": {
        "name": ""
    },
    "order": "9999",
    "description": "",
    "configuration": {
        "timeDependency": 0,
        "has_return": 0,
        "logmode": "default",
        "allowMultiInstance": "0",
        "syncmode": "0",
        "timeline::enable": "0",
        "timeline::folder": ""
    },
    "elements": [
        {
            "name": null,
            "type": "action",
            "options": [],
            "order": "0",
            "subElements": [
                {
                    "name": null,
                    "type": "action",
                    "subtype": "action",
                    "options": {
                        "collapse": "0",
                        "enable": "1"
                    },
                    "order": "0",
                    "expressions": [
                        {
                            "type": "action",
                            "subtype": null,
                            "expression": "variable",
                            "options": {
                                "enable": "1",
                                "background": "0",
                                "name": "jeedom_openai_api",
                                "value": "CLEF API OPEN AI"
                            },
                            "order": "0"
                        },
                        {
                            "type": "action",
                            "subtype": null,
                            "expression": "variable",
                            "options": {
                                "enable": "1",
                                "background": "0",
                                "name": "jeedom_piece",
                                "value": "72"
                            },
                            "order": "1"
                        },
                        {
                            "type": "action",
                            "subtype": null,
                            "expression": "variable",
                            "options": {
                                "enable": "1",
                                "background": "0",
                                "name": "jeedom_question",
                                "value": "59100"
                            },
                            "order": "2"
                        },
                        {
                            "type": "action",
                            "subtype": null,
                            "expression": "variable",
                            "options": {
                                "enable": "1",
                                "background": "0",
                                "name": "jeedom_sortie",
                                "value": "59101"
                            },
                            "order": "3"
                        },
                        {
                            "type": "element",
                            "subtype": null,
                            "expression": "4735",
                            "options": [],
                            "order": "4",
                            "element": {
                                "name": null,
                                "type": "code",
                                "options": [],
                                "order": "0",
                                "subElements": [
                                    {
                                        "name": null,
                                        "type": "code",
                                        "subtype": "action",
                                        "options": {
                                            "collapse": "0",
                                            "enable": "1"
                                        },
                                        "order": "0",
                                        "expressions": [
                                            {
                                                "type": "code",
                                                "subtype": null,
                                                "expression": "$scenario->setLog(\"🚀 Début du script Assistant Domotique avec GPT-4o.\");\n\n\/\/ **1️⃣ Vérification de l'environnement PHP**\nerror_reporting(E_ALL);\nini_set('display_errors', 1);\n$scenario->setLog(\"✅ Test : Environnement PHP chargé avec succès.\");\n\n\/\/ **2️⃣ Récupération des variables dynamiques**\nsleep(2); \/\/ Pause pour s'assurer que les variables sont bien disponibles\n\n$openaiApiKey  = scenario::getData(\"jeedom_openai_api\");\n$cmdAskId      = scenario::getData(\"jeedom_question\");\n$pieceId       = scenario::getData(\"jeedom_piece\");\n$cmdReponseId  = scenario::getData(\"jeedom_sortie\");\n\n$scenario->setLog(\"📌 API Key récupérée : \" . (empty($openaiApiKey) ? \"❌ Manquante\" : \"✅ OK\"));\n$scenario->setLog(\"📌 Commande utilisateur ID : \" . (empty($cmdAskId) ? \"❌ Manquante\" : $cmdAskId));\n$scenario->setLog(\"📌 Pièce ID : \" . (empty($pieceId) ? \"❌ Manquante\" : $pieceId));\n$scenario->setLog(\"📌 Commande de réponse ID : \" . (empty($cmdReponseId) ? \"❌ Manquante\" : $cmdReponseId));\n\n\/\/ **📌 Vérification des variables obligatoires**\nif (empty($openaiApiKey) || empty($cmdAskId) || empty($pieceId) || empty($cmdReponseId)) {\n    $scenario->setLog(\"❌ Erreur : Une ou plusieurs variables essentielles sont manquantes.\");\n    exit;\n}\n\n\/\/ **3️⃣ Récupération de la commande utilisateur**\n$cmdAsk = cmd::byId((int)$cmdAskId);\n$questionUtilisateur = (is_object($cmdAsk) && $cmdAsk->execCmd() !== '') ? $cmdAsk->execCmd() : \"\";\n\nif (empty($questionUtilisateur)) {\n    $scenario->setLog(\"⚠️ Aucune commande reçue !\");\n    exit;\n}\n$scenario->setLog(\"📩 Commande utilisateur : $questionUtilisateur\");\n\n\/\/ **4️⃣ Récupération des équipements de la pièce**\n$objet = jeeObject::byId((int)$pieceId);\n\nif (!is_object($objet)) {\n    $scenario->setLog(\"❌ Erreur : Aucun objet trouvé pour l'ID $pieceId.\");\n    exit;\n}\n$scenario->setLog(\"✅ Pièce détectée : \" . $objet->getName());\n\n\/\/ **5️⃣ Récupération des équipements actionnables**\n$equipements = $objet->getEqLogic(true);\n$equipementsActionnables = [];\n\nforeach ($equipements as $equipement) {\n    if ($equipement->getIsEnable() && $equipement->getIsVisible()) {\n        foreach ($equipement->getCmd() as $cmd) {\n            if ($cmd->getIsVisible() == 1 && $cmd->getType() == \"action\") {\n                $equipementsActionnables[] = [\n                    \"nom\" => $equipement->getName(),\n                    \"commande\" => $cmd->getName(),\n                    \"id\" => $cmd->getId()\n                ];\n                $scenario->setLog(\"✅ Équipement actionnable détecté : \" . $equipement->getName() . \" - Commande : \" . $cmd->getName());\n            }\n        }\n    }\n}\n\nif (empty($equipementsActionnables)) {\n    $scenario->setLog(\"❌ Aucun équipement actionnable détecté !\");\n    exit;\n}\n\n\/\/ **6️⃣ Encodage JSON des équipements pour OpenAI**\n$equipementsJson = json_encode($equipementsActionnables, JSON_UNESCAPED_UNICODE);\nif (!$equipementsJson || $equipementsJson == \"null\") {\n    $scenario->setLog(\"❌ Erreur JSON : les équipements ne sont pas envoyés à GPT.\");\n    exit;\n}\n$scenario->setLog(\"📊 Envoi des équipements détectés à GPT : \" . $equipementsJson);\n\n\/\/ **7️⃣ Envoi à GPT-4o**\n$data = [\n    \"model\" => \"gpt-4o\",\n    \"messages\" => [\n        [\"role\" => \"system\", \"content\" => \"Tu es un assistant domotique Jeedom intelligent. Analyse et exécute les demandes en fonction des équipements disponibles.\"],\n        [\"role\" => \"system\", \"content\" => \"Réponds TOUJOURS sous la forme d'un JSON contenant : 'question', 'response', 'id', 'mode' (action ou info).\"],\n        [\"role\" => \"user\", \"content\" => \"Voici les équipements disponibles dans la pièce ID $pieceId : \" . $equipementsJson],\n        [\"role\" => \"user\", \"content\" => \"Commande utilisateur : \" . $questionUtilisateur]\n    ],\n    \"max_tokens\" => 200,\n    \"temperature\" => 0.5\n];\n\n$options = [\n    \"http\" => [\n        \"header\" => \"Content-Type: application\/json\\r\\n\" . \"Authorization: Bearer \" . $openaiApiKey . \"\\r\\n\",\n        \"method\"  => \"POST\",\n        \"content\" => json_encode($data),\n        \"timeout\" => 10\n    ]\n];\n\n$context = stream_context_create($options);\n$response = @file_get_contents(\"https:\/\/api.openai.com\/v1\/chat\/completions\", false, $context);\n\n\/\/ **8️⃣ Vérification de la réponse GPT-4o**\nif ($response === FALSE) {\n    $scenario->setLog(\"❌ Erreur OpenAI : L'API n'a pas répondu.\");\n    exit;\n}\n\n$responseData = json_decode($response, true);\nif (!isset($responseData['choices'][0]['message']['content'])) {\n    $scenario->setLog(\"❌ Réponse OpenAI invalide : \" . print_r($responseData, true));\n    exit;\n}\n\n\/\/ **🔹 Suppression des balises `json` dans la réponse**\n$chatgptResponse = trim($responseData['choices'][0]['message']['content']);\n$chatgptResponse = str_replace([\"```json\", \"```\"], \"\", $chatgptResponse);\n$chatgptResponse = trim($chatgptResponse);\n\n$scenario->setLog(\"✅ Réponse GPT après nettoyage : \" . $chatgptResponse);\n\n\/\/ **9️⃣ Exécution de la commande si action détectée**\n$reponseJson = json_decode($chatgptResponse, true);\n\nif (isset($reponseJson['id']) && $reponseJson['mode'] == \"action\") {\n    $cmdIds = $reponseJson['id'];\n\n    if (is_array($cmdIds)) {\n        foreach ($cmdIds as $cmdId) {\n            $cmd = cmd::byId((int)$cmdId);\n            if (is_object($cmd)) {\n                $cmd->execCmd();\n                $scenario->setLog(\"✅ Exécution de la commande ID $cmdId : \" . $cmd->getHumanName());\n            } else {\n                $scenario->setLog(\"❌ Échec : ID de commande inexistant ($cmdId)\");\n            }\n        }\n    } elseif (is_numeric($cmdIds)) {\n        $cmd = cmd::byId((int)$cmdIds);\n        if (is_object($cmd)) {\n            $cmd->execCmd();\n            $scenario->setLog(\"✅ Exécution de la commande ID $cmdIds : \" . $cmd->getHumanName());\n        } else {\n            $scenario->setLog(\"❌ Échec : ID de commande inexistant ($cmdIds)\");\n        }\n    } else {\n        $scenario->setLog(\"⚠️ Aucun ID valide retourné par GPT.\");\n    }\n}\n\n\/\/ **🔟 Envoi de la réponse dans Jeedom**\n$cmdReponse = cmd::byId((int)$cmdReponseId);\nif (is_object($cmdReponse)) {\n    $cmdReponse->event($reponseJson['response']);\n    $scenario->setLog(\"✅ Réponse envoyée à l'ID $cmdReponseId : \" . $reponseJson['response']);\n} else {\n    $scenario->setLog(\"❌ Erreur : Impossible d'envoyer la réponse (ID $cmdReponseId).\");\n}\n\n\/\/ **🔚 Fin du script**\n$scenario->setLog(\"🔚 Fin du script Assistant Domotique.\");\n",
                                                "options": [],
                                                "order": "0"
                                            }
                                        ]
                                    }
                                ]
                            }
                        }
                    ]
                }
            ]
        }
    ]
}