ChatGPT dans Jeedom?

Bonjour,

Il suffit de modifier le script comme cela :
image

Et d’ajouter ta variable ici : (juste besoin d’un espace)

et voilà !
David

1 « J'aime »

Bonjour,

Merci à toi, j’avais mal compris l’utilisation du paramètre sur la la notice du plugin. :blush:
Sur le coup j’ai utilisé le script dans un scénario afin de faciliter l’interconnexion avec les équipements Jeedom

Bonjour, merci pour le script :+1:.

Quels sont tes cas d’usage dans jeedom du coup ?

Il faudrait voir comment on pourrait intégrer la connaissance de Jeedom dans les IA. Faire un lien juste pour poser des questions, je dirais que ça n’a d’utilité, il y a des applications plus spécialisées pour cette tâche.
L’idée pourrait améliorer les interactions, avec des réponses toute bête, « Combien de lampes sont actuellement allumée ? », « L’alarme est-t-elle actif ? », « Quelle est la météo du jour ? »

Pour l’instant, j’imagine qu’on pourrait faire un gros scénario et balancer une grosse variable à l’IA pour enrichir sa connaissance à chaque changement d’état, genre « L’état de l’alarme est actif », « La lumière est allumée dans le salon »… On réduirait énormément les interactions dans Jeedom.

Bonjour, pour le moment, cela me sert améliorer mes textes prononcé lors de lancement de certains scénarios, comme le matin au lever ou le soir au coucher pour avoir quelque chose de plus sympathique.

Il y a un script plus facile à mettre en œuvre ici:

Bonjour,

Tu pourrais détailler un peu plus le "améliorer mes textes " stp ?
Un petit exemple stp ?

Merci

Bonsoir,
Par exemple le matin quand je lance le scénario bonjour je demande à ChatGpt:

Fait moi une synthèse familière de c’est informations: bonjour la température sera au minimum de #valeur# degrés et au maximum de #valeur# degrés. Il prévois #valeur# mm de pluie aujourd’hui. Je vous souhaite une bonne journée.

Et il me répond par exemple:
« Salut ! Grosse chaleur aujourd’hui : entre 16°C et 39°C, et pas de pluie en vue. Profite bien de ta journée ! »

Que j’envoie en TTS sur mes HomePod

1 « J'aime »

Merci beaucoup pour ton partage. J’ai adapté ton scenario en code, et ça marche parfaitement, à un détail près !

La réponse que me donne chatgpt comprendre parfois des émoticones :

Et ceux-ci sont mal interprétés quand il s’agit de les stocker dans une variable (car la requête SQL correspondante plante) :

[2024-11-25 15:41:48][SCENARIO] Affectation de la variable nest_parle => Bonjour ! Aujourd'hui, la météo a décidé de nous offrir une séance de danse sous une pluie modérée. Avec une température qui flirte entre 9,5°C et 18,6°C, c'est le moment idéal pour sortir vos plus beaux parapluies. Allez, mettons un peu de swing dans cette journée grise et faisons comme Gene Kelly : chantons sous la pluie ! Belle journée à tous ! 🌧️☔💃🎶 (Bonjour ! Aujourd'hui, la météo a décidé de nous offrir une séance de danse sous une pluie modérée. Avec une température qui flirte entre 9,5°C et 18,6°C, c'est le moment idéal pour sortir vos plus beaux parapluies. Allez, mettons un peu de swing dans cette journée grise et faisons comme Gene Kelly : chantons sous la pluie ! Belle journée à tous ! 🌧️☔💃🎶)
[2024-11-25 15:41:48][SCENARIO] [MySQL] Error code : 22007 (1366). Incorrect string value: '\xF0\x9F\x8C\xA7\xEF\xB8...' for column `jeedom`.`dataStore`.`value` at row 1  : UPDATE `dataStore` SET `id` = :id, `type` = :type, `link_id` = :link_id, `key` = :key, `value` = :value WHERE id = :id

J’ai bien tenté de filtrer la réponse avec cette méthode dans le code de mon bloc scenario, mais cela ne suffit pas toujours :

function remove_emoji($string)
{
    // Match Enclosed Alphanumeric Supplement
    $regex_alphanumeric = '/[\x{1F100}-\x{1F1FF}]/u';
    $clear_string = preg_replace($regex_alphanumeric, '', $string);

    // Match Miscellaneous Symbols and Pictographs
    $regex_symbols = '/[\x{1F300}-\x{1F5FF}]/u';
    $clear_string = preg_replace($regex_symbols, '', $clear_string);

    // Match Emoticons
    $regex_emoticons = '/[\x{1F600}-\x{1F64F}]/u';
    $clear_string = preg_replace($regex_emoticons, '', $clear_string);

    // Match Transport And Map Symbols
    $regex_transport = '/[\x{1F680}-\x{1F6FF}]/u';
    $clear_string = preg_replace($regex_transport, '', $clear_string);
    
    // Match Supplemental Symbols and Pictographs
    $regex_supplemental = '/[\x{1F900}-\x{1F9FF}]/u';
    $clear_string = preg_replace($regex_supplemental, '', $clear_string);

    // Match Miscellaneous Symbols
    $regex_misc = '/[\x{2600}-\x{26FF}]/u';
    $clear_string = preg_replace($regex_misc, '', $clear_string);

    // Match Dingbats
    $regex_dingbats = '/[\x{2700}-\x{27BF}]/u';
    $clear_string = preg_replace($regex_dingbats, '', $clear_string);

    return $clear_string;
}

Avez-vous rencontré ce problème ? Comment puis-je définitivement m’en séparer ?

PS : J’ai tenté un prompt lui demandant explicitement d’éviter des émoticones dans sa réponse, mais il continue d’en insérer…

Bonjour,

essaye comme cela:

$data = [
    "model" => "gpt-3.5-turbo",
    "messages" => [
        ["role" => "system", "content" => "Tu es un assistant pour la domotique Jeedom."],
        ["role" => "system", "content" => "Répondre avec un maximum de 500 caractères."],
        ["role" => "system", "content" => "Remplace les points dans les valeurs par des virgules."],    
        ["role" => "system", "content" => "Et interdiction d'utiliser des emojis ou caractéres spéciaux."],

Ok merci pour le tips.
J’ai trouvé une astuce avec ça :

$chatgptResponse = preg_replace('/[^\p{L}\p{N}\p{P}\s]+/u', '', $chatgptResponse);

Qui ne garde que les lettres, chiffres, ponctuations et espaces. Ca a l’air de bien marcher, et bien moins compliqué que la grande fonction qui filtre spécifiquement les émoticones, et qui continuera d’être incomplète au fur et à mesure d’ajout de nouveaux émoticones dans la base…

Aussi, rien à voir :
J’ai repris ton code du scenraio dans le topic Intégration Etat équipement dans un Script PHP - #12 par ngm47
J’y ai remplacé toute la partie appel API de jeedom (qui set la valeur de l’équipement info réponse) par un simple

$cmdId = 6997;
cmd::byId($cmdId)->event($chatgptResponse);

Y’a-t-il une raison particulière au fait que tu passes par le mécanisme de l’api jeedom au lieu de setter directement l’équipement avec la lib php jeedom ?

Juste pas très fort en code…
Tu peux me montrer ton code complet ?

Voilà le code et son fonctionnement :

Ce scenario prend en entrée un tag « phrase » qui contient des données séparées par des points virgules, qui servent au prompt (pour fabriquer une phrase de type « bonjour » le matin).
Je l’appelle de cette manière dans un autre scenario dans lequel je récupère toutes les données (météo, température, pollens, agenda etc) :

Ensuite, mon scenario chatgpt récupère le tag #phrase# (dans lequel j’ai aggrégé toutes mes données) et le file en prompte à l’api openAI.
Ensuite je filtre la réponse de tout émoticone, puis je re stocke à la fois la réponse dans un tag #reponse# du scenario et dans la commande info de l’équipement 6997 (tout à la fin).

La réponse est donc utilisable à la suite du bloc code dans le tag #reponse#, et à la fois dans la valeur de mon équipement info :

Voici le code complet :

$openaiApiKey = 'xxxxxxxxxxxx';

$tags = $scenario->getTags();
$prompt = trim($tags['#phrase#']);

$scenario->setLog("Message récupéré de Jeedom : $prompt\n");

// Envoi de la requête à l'API OpenAI
$openaiUrl = "https://api.openai.com/v1/chat/completions";
$data = [
    "model" => "gpt-4o",
    "messages" => [
        ["role" => "system", "content" => "Tu es un assistant pour la domotique Jeedom."],
        ["role" => "system", "content" => "Transforme les données (séparées par point virgule) en une phrase pour annoncer une bonne journée, dictée par un assistant domotique. Tu peux inclure un peu d'humour ou de la joie à ta convenance selon le contenu sans aller dans l'excès. Répondre avec un maximum de 500 caractères."],
        ["role" => "user", "content" => $prompt]
    ],
    "max_tokens" => 200,
    "temperature" => 0.6
];

// Configuration de la requête HTTP pour OpenAI
$options = [
    "http" => [
        "header" => "Content-Type: application/json\r\n" .
                    "Authorization: Bearer " . $openaiApiKey . "\r\n",
        "method"  => "POST",
        "content" => json_encode($data)
    ]
];

$context = stream_context_create($options);
$response = file_get_contents($openaiUrl, false, $context);

if ($response === FALSE) {
    echo "Erreur lors de la requête à l'API OpenAI.";
    exit;
}

// Traitement de la réponse
$responseData = json_decode($response, true);
if (isset($responseData['choices'][0]['message']['content'])) {
    $chatgptResponse = trim($responseData['choices'][0]['message']['content']);
    echo "Réponse de ChatGPT : $chatgptResponse\n";
} else {
    echo "Erreur : Aucune réponse valide reçue de ChatGPT.";
    exit;
}

$chatgptResponse = preg_replace('/[^\p{L}\p{N}\p{P}\s]+/u', '', $chatgptResponse);
$cmd = cmd::byString(6997);
$cmd->event($chatgptResponse);
$tags['#reponse#'] = $chatgptResponse;
$scenario->setTags($tags);
1 « J'aime »

Merci :smiling_face:

Les requêtes de GPT 40 ne sont pas plus chère?

Aucune idée, je vais aller voir :sweat_smile:

Alors pour GPT4o :

$2.50 / 1M input tokens
$10.00 / 1M output tokens

Pour gpt-3.5-turbo-0301 :

$1.50 / 1M tokens
$2.00 / 1M tokens

Donc oui c’est plus cher. Après je pense que vu l’utilisation que je vais en faire, je pense que la différence sera limitée (je pense pas dépasser 5 ou 6$ sur une année). Après il est aussi vrai que pour faire une demande simple que je fait, gpt3.5 suffirait amplement…
Aujourd’hui, j’ai fait 40 requêtes (pour les tests) avec 7500 tokens générés, j’en suis à 0.04$… J’ai la marge…

Même si je m’amuse à GPTifier toutes mes phrases jeedom qui sortent sur mes enceintes, j’arrive péniblement à 10 phrases par jours (dont la plupart seront dans le cache), soit environ 4000 requêtes par an. Si je fais la règle de trois avec ce que j’ai généré aujourdh’ui, j’arrive péniblement à 4$. Même s’il fallait mettre 10$ par an, je trouve ça honnête.

Au delà du coût, on commence à entrevoir la puissance de l’AI dans notre domotique, et plus encore, son accessibilité.
On va pouvoir commencer à re-réfléchir complètement notre façon de penser et de coder notre domotique (notamment la remontée d’info, l’analyse de données, la prise de décision etc).

On peut par exemple imaginer fournir en quasi temps réel (genre toutes les 5min) des données à chatgpt entrainé, pour qu’il nous alerte ou nous informe de quelque chose (une baisse de température anormale, une porte laissée ouverte, avertir d’une gelée la nuit ou bien une lumière restée allumée anormalement longtemps). Il suffirait de remonter sa réponse pour la traiter comme bon nous semble.
Après c’est un peu donner la main à l’IA, faudra doser son rôle dans notre domotique, mais les possibilité vont devenir ouf !

1 « J'aime »

Merci pour ce début d’intégration très prometteur.
Je l’ai testé, et le premier truc que l’on aimerait faire, c’est pouvoir donner un grand nombre d’infos provenant de jeedom a chatGPT, pour qu’il puisse lui-même trouver le contexte en fonction de la question.
Si il faut lui donner les températures pour qu’il nous les redonne d’une autre manière, ca n’a que peu d’interet passé le coté fun du truc.
J’aimerai pouvoir lui demander le temps qu’il fait, les lumieres allumées dans tel piece, etc… SANS avoir a lui envoyer l’info precise. Et comme il ne peut pas interroger notre jeedom, il faut bien lui passer toutes les infos.
Mon idée : y’a-t-il une API jeedom pour récupérer l’integralité des infos des equipements d’une vue, par exemple? Et on la formaterait en json pour voir ce que chatGPT en comprend.

Petit texte d’analyse du json renvoyé par view.ajax.php lors de l’ouverture d’une vue :

Plus qu’a coder l’appel d’une vue dans le scenario et le stockage et l’envoi d’un fichier json (le contenu est trop volumineux pour être envoyé directement apparemment, en tout cas depuis le prompt en ligne)

Alors je me suis posé la même question, et on a naturellement le même besoin et la même envie : tout lui balancer et réfléchir pour nous. Dans le monde idéal, on aurait plus qu’un seul scenario qui envoie tout à OpenAI, et lui nous réponds si une info est à connaître (une lumière laissée allumée ou un frigo resté ouvert depuis trop longtemps) sans lui demander spécifiquement laquelle.

Plusieurs problèmes cependant :

  • Le coût : L’api se base sur le nombre de tokens (sorte d’unité de mesure de la complexité de la demande à comprendre ou de la réponse à générer) pour calculer le coût de chaque appel. Lui donner l’intégralité des données domotiques serait beaucoup trop couteux. Qui plus est devoir lui envoyer très régulièrement (chaque minute ?) pour avoir une bonne réactivité. Dans le monde parfait, il faudrait lui envoyer en temps réel, car nos scenarios sont en temps réels (ils sont déclenchés par évènement, donc instantanément dès qu’une donnée bouge).
  • Les appels api ne gardent pas en mémoire les contextes des précédant appels. Donc il faut « tout lui re-expliquer » à chaque fois dans le prompt (et donc conso de token en sus)

Néanmoins, l’interface OpenAPI possède un mécanisme de « fine-tuning » dans lequel il est possible d’orienter ou d’améliorer la manière dont l’IA répond en fonction des paramètres de fine-tuning. Je n’ai pas encore regardé en profondeur ce point là, mais il y a sûrement pas mal de trucs à y faire pour améliorer l’intégration dans un système domotique comme jeedom.

Je pense qu’on va voir fleurir d’ici pas longtemps toute sorte de plugins avec l’intégration de l’IA via les différentes plateforme API qui existent aujourd’hui, et avec lesquels on pourra faire des choses de plus en plus puissantes.
J’imagine qu’il sera même possible de créer un modèle spécifique à la domotique, avec des formats de données attendus avec lesquels l’IA sera capable de tout gérer grâce à son modèle spécifiquement entrainé pour.

Bref le début de l’ère IA pour la domotique arrive…

Dans mon idée, je pensais plutot ajouter le json complet à chaque demande/question. Pas question de lui envoyer une demande toute les minutes. Ca serait seulement sur intervention humaine. Donc max quelques dizaines de questions par jours. J’ai mis 10$ pour tester et voir ce que ca consomme.
En attendant, je galère pour trouver comment récupérer le json d’une vue (avec valeurs) avec les classes jeedom, comme le fait l’appel http view.ajax.php, si qq l’a deja fait, je suis preneur