Tags : Jeedom / Jeedomconnect / GPS
Contexte :
Ca fait un moment que je récupère mes coordonnées GPS grâce à l’application Jeedomconnect. Je m’en sers essentiellemnt car j’ai une petite tête, et … je me souviens pas toujours où je me suis garré. Alors voici ce que je faisias jusqu’à présent.
Présentation :
C’est donc grâce à Jeedomconnect, JC pour les intimes, et l ‘application Automalt que je fais ma petite tambouille.
En effet, je récupère par la commande POSITION, les coordonnées GPS, latitude et longitude. Automalt me permet de connaitre le moment ou est déconnecté le bluetooth du téléphone à ma voiture. Ce déclenchement lance, par ULR, le scénario suivant :
Scénario déclenché alors envoyer par message discord la position GPS. Ce qui donnait : « Nico s’est garré à cette position : -17.4857463,-149.8152137,15 »
c’était pas trés folichont.
La révélation :
Et puis je suis tombé sur l’article du confrère Loic :
Et se fut la révélation, eh oui ! si je faisait interpreter les coordonnées à Chat GPT, peut être ce serait plus fun !
Alors j’ai essayé, mais malheuresement Chat GPT n’arrive pas à le faire et invente une adresse farfellue.
FIN.
Les recherches :
Et bien, si chat GPT n’y arrives pas, pourquoi ne pas lui demander comment faire ? c’est ce que j’ai fait, je vous passe les différents prompts et échanges, tests… que j’ai pu faire. Voici la solution.
Le scénario de récupération
// Récupérer les coordonnées depuis un seul ID de capteur
$cmd = cmd::byId(17832); // Remplace 17832 par l'ID réel de ta commande GPS
if (!$cmd) {
$scenario->setLog("⚠ ID du capteur GPS invalide !");
return;
}
$gps_raw = $cmd->execCmd(); // Exécute la commande pour récupérer la valeur
// Vérifier si les données sont valides
if (!$gps_raw) {
$scenario->setLog("⚠ Aucune donnée GPS reçue !");
return;
}
// Décoder les coordonnées (format attendu : "lat,lon" ou "lat|lon")
if (strpos($gps_raw, ',') !== false) {
list($lat, $lon) = explode(',', $gps_raw);
} elseif (strpos($gps_raw, '|') !== false) {
list($lat, $lon) = explode('|', $gps_raw);
} else {
$scenario->setLog("⚠ Format des données GPS inconnu !");
return;
}
// Construire l'URL de l'API OpenStreetMap
$url = "https://nominatim.openstreetmap.org/reverse?format=json&lat=$lat&lon=$lon";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Jeedom");
$response = curl_exec($ch);
curl_close($ch);
// Décoder la réponse JSON
$data = json_decode($response, true);
$adresse_complete = $data['display_name'] ?? 'Adresse introuvable';
// Limiter l'adresse à trois éléments séparés par des virgules
if ($adresse_complete !== 'Adresse introuvable') {
$elements_adresse = explode(',', $adresse_complete);
$adresse = implode(',', array_slice($elements_adresse, 0, 3)); // Garder seulement les 3 premiers éléments
} else {
$adresse = $adresse_complete;
}
// Afficher et stocker l'adresse
$scenario->setLog("Adresse trouvée : " . $adresse);
$scenario->setData("adresse_gps", $adresse);
Vous avez remarqué qu’il vous faut passer par le site pour Utiliser l’API OpenStreetMap (Nominatim)
https://nominatim.openstreetmap.org/ui/search.html
🔹 Explication :
✅ Le capteur renvoie un format « lat,lon » ou « lat|lon » → Le script extrait les deux valeurs.
✅ Requête HTTP vers OpenStreetMap pour récupérer l’adresse.
✅ Affichage dans les logs et stockage de l’adresse dans une variable Jeedom (adresse_gps
).
✅ Correction de la récupération des coordonnées (cmd::byId(17832)->execCmd()
).
✅ Ajout d’une vérification si l’ID du capteur est valide.
✅ Format flexible (fonctionne avec lat,lon
ou lat|lon
).
✅ Stockage de l’adresse dans Jeedom (adresse_gps
).
📍 Localisation actuelle : variable(adresse_gps) , pour un 2eme cas n’oubliez pas de changer la variable dans le code.
Le scénario avec Chat GPS ..T
code + les 2 bloc actions suivants = Scénario 1 « Auto position »
Donc je lance le scénario Chat GPS = scénario Chat GPS
voici les premiers blocs :
Suivi du code tiré de l’article de Loic,
$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.");
Et enfin le dernier code où l’on récupères donc le message :
Conclusion : Chat GPS
et voici le résultat quand je me gare quelque part :
Voila donc l’amélioration sur ma domotique, et un exemple de ce qu’on peut faire avec les coordonnées GPS.
Ah oui au fait, je fais parti des 1% d’utilisateurs de Jeedom avec un soucis MYSQL et je ne peux lire les émoticônes en PHP, c’est pour cela qu’il n’y en a pas dans mes codes.