{
    "name": "Scénario a trou Chat GPT 4o fonctionnelle",
    "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_question",
                                "value": "59098"
                            },
                            "order": "1"
                        },
                        {
                            "type": "action",
                            "subtype": null,
                            "expression": "variable",
                            "options": {
                                "enable": "1",
                                "background": "0",
                                "name": "jeedom_sortie",
                                "value": "59099"
                            },
                            "order": "2"
                        },
                        {
                            "type": "element",
                            "subtype": null,
                            "expression": "4732",
                            "options": [],
                            "order": "3",
                            "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::setData(\"jeedom_capteurs\", \"#[Virtuel Température][Etage - Température][Température]#;#[Virtuel Température][Salon bas - Température][Température]#\");\n",
                                                "options": [],
                                                "order": "0"
                                            }
                                        ]
                                    }
                                ]
                            }
                        },
                        {
                            "type": "element",
                            "subtype": null,
                            "expression": "4733",
                            "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️⃣ Pause pour éviter le bug de récupération des variables Jeedom**\nsleep(2);\n\n\/\/ **3️⃣ Récupération des variables Jeedom**\n$apiKeyGPT = scenario::getData(\"jeedom_openai_api\");\n$jeedomCapteurs = scenario::getData(\"jeedom_capteurs\");  \/\/ Liste des capteurs sous forme Jeedom\n$jeedomQuestion = scenario::getData(\"jeedom_question\");  \/\/ Question de l'utilisateur\n$jeedomSortieID = scenario::getData(\"jeedom_sortie\");    \/\/ Commande où envoyer la réponse\n\n\/\/ **4️⃣ Vérification des valeurs**\nif (empty($apiKeyGPT) || empty($jeedomCapteurs) || empty($jeedomQuestion) || empty($jeedomSortieID)) {\n    $scenario->setLog(\"❌ Erreur : Une ou plusieurs variables essentielles sont manquantes.\");\n    exit;\n}\n\n\/\/ **📌 Log des variables récupérées pour débogage**\n$scenario->setLog(\"📌 API Key : ✅ OK\");\n$scenario->setLog(\"📌 Capteurs Jeedom : $jeedomCapteurs\");\n$scenario->setLog(\"📌 Question posée : \\\"$jeedomQuestion\\\"\");\n$scenario->setLog(\"📌 ID de la sortie : $jeedomSortieID\");\n\n\/\/ **5️⃣ Extraction des données Jeedom**\n$capteursArray = explode(\";\", $jeedomCapteurs);\n$capteursData = [];\n\nforeach ($capteursArray as $capteur) {\n    $cmd = cmd::byString(trim($capteur));\n    if (is_object($cmd) && $cmd->execCmd() !== '') {\n        $valeur = $cmd->execCmd();\n        $scenario->setLog(\"✅ Capteur récupéré : {$cmd->getHumanName()} → $valeur\");\n        $capteursData[] = [\"nom\" => $cmd->getHumanName(), \"valeur\" => $valeur];\n    } else {\n        $scenario->setLog(\"⚠️ Capteur introuvable ou valeur vide : $capteur\");\n    }\n}\n\nif (empty($capteursData)) {\n    $scenario->setLog(\"❌ Erreur : Aucune donnée récupérée de Jeedom.\");\n    exit;\n}\n\n\/\/ **6️⃣ Reformulation explicite du prompt pour OpenAI**\n$prompt = \"Tu es un assistant domotique Jeedom qui analyse les relevés des capteurs et répond aux questions de l'utilisateur.\\n\\n\";\n\n$prompt .= \"**📊 Capteurs détectés et relevés actuels :**\\n\";\nforeach ($capteursData as $data) {\n    $prompt .= \"- **{$data['nom']}** : {$data['valeur']}°C\\n\";\n}\n\n$prompt .= \"\\n⚠️ **Attention : Certains nombres dans la question peuvent être des identifiants et ne sont pas des capteurs.**\\n\";\n$prompt .= \"Tu dois ignorer tout chiffre qui ne correspond pas à un relevé de capteur.\\n\\n\";\n\n$prompt .= \"**💡 Question posée par l'utilisateur :** \\\"$jeedomQuestion\\\"\\n\\n\";\n$prompt .= \"**Ta mission :**\\n\";\n$prompt .= \"- Compare les relevés des capteurs.\\n\";\n$prompt .= \"- Réponds en **UNE seule phrase claire et directe**.\\n\";\n$prompt .= \"- Donne **l'information essentielle** sans analyser des nombres inutiles.\\n\\n\";\n$prompt .= \"**Exemple de réponse correcte :**\\n\";\n$prompt .= \"- \\\"Le salon est l'endroit le plus chaud avec 19.8°C.\\\"\\n\";\n$prompt .= \"- \\\"Aucun relevé ne permet de répondre précisément à cette question.\\\"\\n\";\n\n$prompt .= \"\\n**Réponds maintenant :**\";\n\n\n$scenario->setLog(\"📩 Envoi du prompt à OpenAI...\");\n\n\/\/ **7️⃣ Préparation de la requête OpenAI**\n$data = [\n    \"model\" => \"gpt-4o\",\n    \"messages\" => [\n        [\"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.\"],\n        [\"role\" => \"user\", \"content\" => $prompt]\n    ],\n    \"max_tokens\" => 200,\n    \"temperature\" => 0.6\n];\n\n$jsonPayload = json_encode($data, JSON_UNESCAPED_UNICODE);\nif ($jsonPayload === false) {\n    $scenario->setLog(\"❌ Erreur : JSON mal formé avant envoi à OpenAI.\");\n    exit;\n}\n\n\/\/ **8️⃣ Envoi à OpenAI**\n$openaiUrl = \"https:\/\/api.openai.com\/v1\/chat\/completions\";\n\n$options = [\n    \"http\" => [\n        \"header\" => \"Content-Type: application\/json\\r\\n\" . \"Authorization: Bearer \" . $apiKeyGPT . \"\\r\\n\",\n        \"method\"  => \"POST\",\n        \"content\" => $jsonPayload,\n        \"timeout\" => 10\n    ]\n];\n\n$context = stream_context_create($options);\n$response = @file_get_contents($openaiUrl, false, $context);\n\n\/\/ **9️⃣ Gestion de la réponse OpenAI**\n$chatgptResponse = \"Erreur : Aucune réponse générée.\";\nif ($response !== FALSE) {\n    $responseData = json_decode($response, true);\n    if (isset($responseData['choices'][0]['message']['content'])) {\n        $chatgptResponse = trim($responseData['choices'][0]['message']['content']);\n    } else {\n        $scenario->setLog(\"❌ Réponse OpenAI invalide : \" . print_r($responseData, true));\n    }\n} else {\n    $scenario->setLog(\"❌ Erreur OpenAI : L'API n'a pas répondu.\");\n    exit;\n}\n\n\/\/ **🔟 Envoi de la réponse vers Jeedom**\n$cmdSortie = cmd::byId($jeedomSortieID);\nif (is_object($cmdSortie)) {\n    $cmdSortie->event($chatgptResponse);\n    $scenario->setLog(\"✅ Réponse envoyée à l'action message ID $jeedomSortieID : $chatgptResponse\");\n} else {\n    $scenario->setLog(\"⚠️ Erreur : Commande ID $jeedomSortieID introuvable.\");\n}\n\n\/\/ **🔚 Fin du script**\n$scenario->setLog(\"🔚 Fin du script Assistant Domotique.\");\n",
                                                "options": [],
                                                "order": "0"
                                            }
                                        ]
                                    }
                                ]
                            }
                        }
                    ]
                }
            ]
        }
    ]
}