Crée Json via webhook

Bonjour,

J’ai une imprimante 3d qui fonctionne avec un système de détection d’erreur par IA
Le site s’appel octoeverywhere.

On peux envoyer un webhook, je le fait via cette url

https://***********.eu.jeedom.link/core/api/jeeApi.php?apikey=****************&type=cmd&id=457088

Cela fonctionne, en utilisant un virtuel
mais je ne peux pas faire la différence entre les EventType
Pour ça il me faudrait le Json

J’aurais voulu récupérer et examiner ce fichier Json.

Mais franchement j’ai éplucher beaucoup de sujet et je ne comprend pas comment on génère ce Json pour pouvoir d’examiner via le plugin script.

Merci a vous

Salut,

A ma connaissance, l’api http native de jeedom ne sait pas examiner des data envoyées en POST.
La seule façon native de passer des paramètres à Jeedom c’est de les avoir dans l’URL.

Tu n’a pas la possibilité dans ton outil de mettre une URL différente en fonction de l’event qu’elle doit envoyer ?

Non. Justement

On peut utiliser un seul webhook.
Et ensuite on doit pouvoir lire quel est l’event qui l’a déclenché

Ok bah dans ce cas, je pense que tu peux faire un petit script en php (par exemple) qui va prendre le JSON en entrée et en fonction des cas de figure va faire des appels à Jeedom via l’api http.

A partir de la avec du case ou des if tu peux passer le paramètre qui va bien à l’event que tu envoi à jeedom.

J’utilise jeedom depuis des années et fait pas mal de choses deja.

Mais là j’ai bien peur que ca soit bien au dessus de mes compétences :pleading_face:

Bof, c’est pas si complexe que ça :wink:

Et c’est pas directement du jeedom la pour le coup, c’est un peu de développement.

J’ai demandé à une gentille IA de me pondre un squelette ça ressemblerait à ça :

<?php
// Vérifie que la requête est bien en POST
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    echo json_encode(['error' => 'Méthode non autorisée. Utilisez POST.']);
    exit;
}

// Lit le corps de la requête
$input = file_get_contents('php://input');
$data = json_decode($input, true);

// Vérifie que le paramètre DurationSec est présent
if (!isset($data['DurationSec'])) {
    http_response_code(400);
    echo json_encode(['error' => 'Le paramètre "DurationSec" est requis.']);
    exit;
}

// Prépare l'URL cible avec le paramètre GET
$baseUrl = 'https://example.com/api'; // Remplace par ton URL cible
$duration = urlencode($data['DurationSec']);
$targetUrl = $baseUrl . '?DurationSec=' . $duration;

// Effectue la requête GET
$ch = curl_init($targetUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);

$response = curl_exec($ch);
$error = curl_error($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

curl_close($ch);

// Retourne le résultat
header('Content-Type: application/json');
echo json_encode([
    'requested_url' => $targetUrl,
    'status' => $httpCode,
    'error' => $error ?: null,
    'response' => $response ?: null
]);

Avec cette base, le script va récupérer le paramètre DurationSec qu’il reçoit dans un JSON et l’envoyer à une URL que tu peux paramétrer pour pousser ça à un virtuel dans jeedom.

C’est un peu de taff mais pas la mort non plus :wink:

Bon pour blinder un peu la sécurité ça serait bien de vérifier en tout premier la SecretKey et de tout arrêter (die) si elle n’est pas celle que tu attends.

L’avantage avec les IA, c’est qu’il suffit de demander …

<?php
// Clé secrète attendue
$expectedSecret = 'MaSuperCleSecrete123'; // À personnaliser

// Vérifie que la requête est bien en POST
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    echo json_encode(['error' => 'Méthode non autorisée. Utilisez POST.']);
    exit;
}

// Lit le corps de la requête
$input = file_get_contents('php://input');
$data = json_decode($input, true);

// Vérifie que SecretKey est présent et correct
if (!isset($data['SecretKey']) || $data['SecretKey'] !== $expectedSecret) {
    http_response_code(403);
    echo json_encode(['error' => 'Accès refusé. Clé secrète invalide.']);
    exit;
}

// Vérifie que DurationSec est présent
if (!isset($data['DurationSec'])) {
    http_response_code(400);
    echo json_encode(['error' => 'Le paramètre "DurationSec" est requis.']);
    exit;
}

// Prépare l'URL cible avec le paramètre GET
$baseUrl = 'https://example.com/api'; // Remplace par ton URL cible
$duration = urlencode($data['DurationSec']);
$targetUrl = $baseUrl . '?DurationSec=' . $duration;

// Effectue la requête GET
$ch = curl_init($targetUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);

$response = curl_exec($ch);
$error = curl_error($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

curl_close($ch);

// Retourne le résultat
header('Content-Type: application/json');
echo json_encode([
    'requested_url' => $targetUrl,
    'status' => $httpCode,
    'error' => $error ?: null,
    'response' => $response ?: null
]);

En effet j’ai pas.le réflex ia.
J’ai demandé.
Il m’a pondu ça

Objectif

➡️ Quand OctoEverywhere envoie un event (comme PrintStarted, PrintComplete, etc.), Jeedom le reçoit via un script PHP créé dans le plugin Script.
Tu pourras ensuite utiliser ces événements pour lancer des actions Jeedom (notification, scénario, etc.).


---

🧩 1. Créer le script dans Jeedom

1. Va dans Plugins > Programmation > Script


2. Clique sur + Ajouter un script


3. Donne-lui un nom, par exemple :

Webhook OctoEverywhere


4. Type de script : Autre


5. Type de requête : POST


6. Coche Activer et Visible


7. Dans la zone “Code du script”, mets ceci :




---

📄 Exemple de code PHP (à mettre dans le script Jeedom)

<?php
// Ce script sera appelé par OctoEverywhere quand un événement survient

$rawData = file_get_contents("php://input");
$data = json_decode($rawData, true);

// Log pour debug (dans /var/www/html/log/script.log)
log::add('octoeverywhere', 'debug', 'Webhook reçu : ' . $rawData);

if ($data === null) {
    echo "Invalid JSON";
    return;
}

$eventType = $data['eventType'] ?? 'unknown';
$payload = $data['payload'] ?? [];

// Exemple : on crée des commandes virtuelles pour stocker ces infos
$cmdEvent = cmd::byString("#[Maison][OctoEverywhere][Dernier event]#");
if (is_object($cmdEvent)) {
    $cmdEvent->event($eventType);
}

$cmdFile = cmd::byString("#[Maison][OctoEverywhere][Nom du fichier]#");
if (is_object($cmdFile)) {
    $cmdFile->event($payload['fileName'] ?? '');
}

// Tu peux aussi déclencher un scénario en fonction de l’événement :
if ($eventType === 'PrintComplete') {
    scenario::start('Octo_Print_Finish');
}

echo "OK";


---

⚙️ 2. Créer les commandes virtuelles associées

Pour visualiser ou utiliser les infos dans Jeedom :

1. Crée un équipement virtuel nommé OctoEverywhere (via le plugin Virtuel).


2. Ajoute des commandes info :

Dernier event

Nom du fichier

(optionnel : Durée, État, etc.)



3. Note bien le chemin Jeedom de chaque commande (exemple : #[Maison][OctoEverywhere][Dernier event]#).




---

🔗 3. Configurer OctoEverywhere

1. Va dans ton tableau de bord OctoEverywhere → Notifications / Webhooks


2. Ajoute l’URL de ton script Jeedom, par exemple :

https://tondomainejeedom.com/plugins/script/core/php/script.php?exec=Webhook%20OctoEverywhere


3. Sélectionne les événements que tu veux recevoir (PrintStarted, PrintComplete, etc.)




---

🧠 Astuce

Tu peux déclencher un scénario Jeedom selon les types d’événements reçus.
Par exemple :

Événement OctoEverywhere	Scénario Jeedom déclenché

PrintStarted	Allumer les LEDs de l’imprimante
PrintComplete	Envoyer une notif Telegram
PrintFailed	Alerte sonore + push



---

✅ En résumé

✅ Crée un script Jeedom (type POST)

✅ Mets le code PHP ci-dessus

✅ Ajoute l’URL dans OctoEverywhere

✅ Optionnel : lie les infos à un virtuel + scénarios



---

Souhaites-tu que je te prépare le script complet prêt à copier-coller dans Jeedom + le modèle du virtuel associé (avec les commandes déjà prévues) ?
Je peux te le générer directement.

Flippant :scream: