[WEBHOOK] utilisation domotique

Bonjour à tous,

j’avais deja fait un script en python associé a plexpy pour géré les lumiére de mon home cinema que j’utilise avec plex et un chromecast, le but etait d’eteindre; allumé les lumiéres etc… en fonction des evenements plex… ca marchait mais on etait pas au top de la reactivité…

la je me suis penché sur les webhook (feature premium), pour ceux qui connaissent pas, en gros a chaque action type play, stop, pause, resume, film fini, plex (les serveur public sur internet) envoi un JSON avec toutes les information de l’event. on defini dans plex une URL qui recevra ce JSON et apres on en fait ce qu’on en veut…

donc j’ai biensur créé un fichier PHP, qui receptionne ce JSON, en extrait ce dont j’ai besoin, et declenche (via URL) les bonne action sur ma box domotique en passant par son API.

voila pour la théorie. maintenant en pratique j’ai quelques soucis… notamement sur la generation des webhooks… normalement a chaque evenement sur un des serveur plex relier a mon compte je devrai avoir un JSON d’envoyé… hors ca n’a pas l’air d’etre le cas, hier soir j’avais 3 client en ligne dont un pour moi, malgré des play, pause, play, stop, je n’ai jamais recu de JSON pour mes evenements, par contre mes autres client en générais eux… bizare… pire, une fois tout le monde deconnecté, (plus aucune lecture en cours) lorsque je met un truc en lecture, je recois un JSON qui correspond a une des lectures precedentes de mes autres utilisateurs… donc bref c’est la merde…

est ce que quelqu’un utilise les webhook ? y a t il des limitations ou spécificité un peu obscur ?

si quelqu’un tres à l’aise en anglais voulais m’aider avec le reste de la communauté ca serai cool, j’ai deja posé des question en anglais, mais ca devient un peu pointu et je pense pas reussir a me faire comprendre correctement pour que ca soit utile.

merci d’avance à ceux qui me repondront et bonne fin de journée a tous.

Salut

Avec quel logiciel domotique tu fais ça ? Ici sur mon système Home Assistant il se connecte directement au compte Plex pour gérer les états play/pause (cela marche avec 2/3s de latence !)

Pour les webhooks tu peux partager le code que tu as fait pour tester ici ?

salut,

alors entre temps j’ai avancé…
mon script marche bien je chope bien les event presque instantanement ca c’est cool. par contre je viens de m’apercevoir que avec un navigateur web tout marche nickel , avec un lecteur android aussi… par contre avec un chromecast rien… ca a marché une fois hier… et depuis plus rien…

pour ma domotique je suis sur eedomus, je passe pour l’instant par un serveur qui est sur internet (plusieurs serveur plex source donc forcé de le mettre sur internet)

<?php

$EEDOMUS_IP = '???.???.???.???';  //mettez l adresse IP local de votre eedomus
$EEDOMUS_API_USER = 'XXXXXXXX';   // mettez ici le user API de votre eedomus
$EEDOMUS_API_PASSWORD = 'YYYYYYYYYYYYYYY';   // mettez ici le password API de votre eedomus
$EEDOMUS_PLEX_SCENE_ID = 'XXXXXXX';  //mettez ici le code API de l actionneur
$EEDOMUS_LIGHT_SALON_ID = 'XXXXXXX';  //mettez ici le code API de votre lumiere de salon
$EEDOMUS_LIGHT_HOME_CINEMA_ID = 'XXXXXXX'; //mettez ici le code API de votre lumiere de home cinema
$EEDOMUS_BRIGHTNESS_SALON_ID = 'XXXXXXX'; //mettez ici le code API de votre capteur de luminosite du salon afin de gere la la gestion des lumieres ou non
$CHROMECAST_SALON_UUID = 'XXXXXXX'; //mettez ici l adresse de ip de bvotre chromecast de salon pour faire des filtrages
$CHROMECAST_HOME_CINEMA_UUID = 'XXXXXXX'; //mettez ici l adresse de ip de bvotre chromecast de home cinema pour faire des filtrages
$LAST_MOVIE_PLAY_HC_ID = 'XXXXXXX2'; //mettez ici le code API de l etat virtuel recuperant les derniers lectures
$Value_plex_action = 'RAS';

$plex_webhooks_json = json_decode($_POST["payload"],true);

if ($plex_webhooks_json['Player']['uuid'] == $CHROMECAST_SALON_UUID) {

	// on recupere la valeur du capteur de luminosite pour traitement
	//$BRIGHTNESS=getValue($EEDOMUS_BRIGHTNESS_SALON_ID, $value_text = false)
	$BRIGHT_URL= 'http://api.eedomus.com/get?action=periph.caract&periph_id=' . $EEDOMUS_BRIGHTNESS_SALON_ID . '&api_user=' . $EEDOMUS_API_USER . '&api_secret=' . $EEDOMUS_API_PASSWORD;

	// on recupere l etat de la lumiere du salon pour traitement
	//$LIGHT=getValue($EEDOMUS_LIGHT_SALON_ID, $value_text = false)
	$LIGHT_URL= 'http://api.eedomus.com/get?action=periph.caract&periph_id=' . $EEDOMUS_LIGHT_SALON_ID . '&api_user=' . $EEDOMUS_API_USER . '&api_secret=' . $EEDOMUS_API_PASSWORD;

	//  Initiate curl
	$ch = curl_init();
	// Disable SSL verification
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	// Will return the response, if false it print the response
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	
	// Set the url
	curl_setopt($ch, CURLOPT_URL,$BRIGHT_URL);
	// Execute
	$result=curl_exec($ch);
	$BRIGHTNESS=json_decode($result, true);
	
	unset($result);

	// Set the url
	curl_setopt($ch, CURLOPT_URL,$LIGHT_URL);
	// Execute
	$result=curl_exec($ch);
	$LIGHT=json_decode($result, true);

	// Closing
	curl_close($ch);
	// Will dump a beauty json :3

	# print (lastValue_Light_salon)
	## on execute les actions que si la luminosite est superieur a 100 lux et que la lampe du salon est deja allumee
	if (($BRIGHTNESS['last_value'] < 50) and ($LIGHT['last_value'] > 0)) {

		if ($plex_webhooks_json['event'] == 'media.play') {
			$Value_plex_action = 'Salon_Play';
		}elseif ($plex_webhooks_json['event'] == 'media.pause') {
			$Value_plex_action = 'Salon_Pause';
		}elseif ($plex_webhooks_json['event'] == 'media.resume') {
			$Value_plex_action = 'Salon_Resume';
		}elseif ($plex_webhooks_json['event'] == 'media.stop') {
			$Value_plex_action = 'Salon_Stop';
		}else {
			$Value_plex_action = 'RAS';
		}
	}
	$EEDOMUS_URL = 'https://api.eedomus.com/set?action=periph.value&periph_id=' . $EEDOMUS_PLEX_SCENE_ID . '&value=' . $Value_plex_action . '&api_user=' . $EEDOMUS_API_USER . '&api_secret=' . $EEDOMUS_API_PASSWORD . '&update_only=1';
	$is_ok = http_response($EEDOMUS_URL);
		
	//$result=setValue($EEDOMUS_PLEX_SCENE_ID, $Value_plex_action, $verify_value_list = true, $update_only= false);
}

if ($plex_webhooks_json['Player']['uuid'] == $CHROMECAST_HOME_CINEMA_UUID) {
	if ($plex_webhooks_json['event'] == 'media.play') {
		$Value_plex_action = 'HC_Play';
	}elseif ($plex_webhooks_json['event'] == 'media.pause') {
		$Value_plex_action = 'HC_Pause';
	}elseif ($plex_webhooks_json['event'] == 'media.resume'){
		$Value_plex_action = 'HC_Resume';
	}elseif ($plex_webhooks_json['event'] == 'media.stop'){
		$Value_plex_action = 'HC_Stop';
	}else {
		$Value_plex_action = 'RAS';
	}

	$EEDOMUS_URL = 'https://api.eedomus.com/set?action=periph.value&periph_id=' . $EEDOMUS_PLEX_SCENE_ID . '&value=' . $Value_plex_action . '&api_user=' . $EEDOMUS_API_USER . '&api_secret=' . $EEDOMUS_API_PASSWORD . '&update_only=1';
	$is_ok = http_response($EEDOMUS_URL);

	//$result=setValue($EEDOMUS_PLEX_SCENE_ID, $Value_plex_action, $verify_value_list = true, $update_only= false);
}

// Pour Debugger
function addLogEvent($event)
{
	$filename = "/data/www/killpilot-fr/plex_webhooks.log";
    $time = date("D, d M Y H:i:s");
    $time = "[".$time."] ";
    $event = $time.$event."
";
    file_put_contents($filename, $event, FILE_APPEND);
}

//addLogEvent(print_r($plex_webhooks_json,TRUE));
addLogEvent("value plex action = ". $plex_webhooks_json['event']);
addLogEvent("type de client = ". $plex_webhooks_json['Player']['title']);
addLogEvent("value script action = ". $Value_plex_action);
addLogEvent("value plex webhook player uuid = ".$plex_webhooks_json['Player']['uuid']);
addLogEvent("
");
?>

le code est brouillon pas commenté et tout, donc dsl… je suis pas dev donc y’a surement des maniére beaucoup plus “opti” de faire les choses… je suis prenneur de tout conseil…

donc maintenant reste a comprendre pourquoi je n’ai pas webhook avec mes chromecast… (vu que je n’effectue des actions que quand c’est mes chromecast…

merci de votre aide :smiley:

ps oula la mise en page du code est pas terrible…

ps2 : alors mon apache recoit bien des requêtes pour mes event par contre j’ai une erreur 500… donc y’a un truc qui va pas dans le JSON ou le POST…

1 Like

bon je continu a me repondre ca pourra servir…

mon soucis de l’erreur 500 venait du fait qu’en rentrant dans la boucle d’un de mes chromecast, il y avait une erreur avec le http_response… j’ai donc viré la lib php_curl et j’ai utilisé file_get_contents.

et la ca marche bien… entre mon action et la prise en compte par ma box domotique j’ai environ 3s… sachant que ca fait

serveur plex -> serveur web -> api publique eedomus -> box eedomus.

on est pas mal… je continu les tests. et je posterai mon script ici une fois debug.

1 Like

re bonjour,

voila donc un code qui marche.

contenu du fichier plex_webhook.php

<?php

$EEDOMUS_API_USER = 'xxxxxxxx';   // mettez ici le user API de votre eedomus
$EEDOMUS_API_PASSWORD = 'xxxxxxxxxxxxx';   // mettez ici le password API de votre eedomus
$EEDOMUS_PLEX_SCENE_ID = 'XXXXXX';  //mettez ici le code API de l actionneur
$EEDOMUS_LIGHT_SALON_ID = 'XXXXXX';  //mettez ici le code API de votre lumiere de salon
$EEDOMUS_LIGHT_HOME_CINEMA_ID = 'XXXXXX'; //mettez ici le code API de votre lumiere de home cinema
$EEDOMUS_BRIGHTNESS_SALON_ID = 'XXXXXX'; //mettez ici le code API de votre capteur de luminosite du salon afin de gere la la gestion des lumieres ou non
$CHROMECAST_SALON_UUID = 'yyyyyyyyyyyyyyyyyyyyyyyy'; //mettez ici le code UUID plex de votre chromecast de salon pour faire des filtrages
$CHROMECAST_HOME_CINEMA_UUID = 'yyyyyyyyyyyyyyyyyyyy'; //mettez ici le code UUID plex de votre chromecast de home cinema pour faire des filtrages
$Value_plex_action = 'RAS_default';

// on recupere le JSON posté par plex et on le met dans un tableau associatif PHP
$plex_webhooks_json = json_decode($_POST["payload"],true);

// on verifie si le lecteur correspond au chromecast salon
if ($plex_webhooks_json['Player']['uuid'] == $CHROMECAST_SALON_UUID) {

	// on recupere la valeur du capteur de luminosite pour traitement
	$BRIGHT_URL= 'http://api.eedomus.com/get?action=periph.caract&periph_id=' . $EEDOMUS_BRIGHTNESS_SALON_ID . '&api_user=' . $EEDOMUS_API_USER . '&api_secret=' . $EEDOMUS_API_PASSWORD;
	$BRIGHTNESS=json_decode(utf8_encode(file_get_contents($BRIGHT_URL)),true);

	// on recupere l etat de la lumiere du salon pour traitement
	$LIGHT_URL= 'http://api.eedomus.com/get?action=periph.caract&periph_id=' . $EEDOMUS_LIGHT_SALON_ID . '&api_user=' . $EEDOMUS_API_USER . '&api_secret=' . $EEDOMUS_API_PASSWORD;
	$LIGHT=json_decode(utf8_encode(file_get_contents($LIGHT_URL)),true);

	// on execute les actions que si la luminosite est superieur a 50 lux et que la lampe du salon est deja allumée
	if ($BRIGHTNESS['body']['last_value'] < 50 AND $LIGHT['body']['last_value'] > 0) {

		if ($plex_webhooks_json['event'] == 'media.play') {
			$Value_plex_action = 'Salon_Play';
		}elseif ($plex_webhooks_json['event'] == 'media.pause') {
			$Value_plex_action = 'Salon_Pause';
		}elseif ($plex_webhooks_json['event'] == 'media.resume') {
			$Value_plex_action = 'Salon_Resume';
		}elseif ($plex_webhooks_json['event'] == 'media.stop') {
			$Value_plex_action = 'Salon_Stop';
		}else {
			$Value_plex_action = 'RAS_salon';
		}
	}
	//on envoi a l api eedomus le declenchement de la scene correspondante
	$EEDOMUS_URL = 'https://api.eedomus.com/set?action=periph.value&periph_id=' . $EEDOMUS_PLEX_SCENE_ID . '&value=' . $Value_plex_action . '&api_user=' . $EEDOMUS_API_USER . '&api_secret=' . $EEDOMUS_API_PASSWORD;
	$is_ok = file_get_contents($EEDOMUS_URL);
}

// on verifie si le lecteur correspond au chromecast Home Cinema
if ($plex_webhooks_json['Player']['uuid'] == $CHROMECAST_HOME_CINEMA_UUID) {
	if ($plex_webhooks_json['event'] == 'media.play') {
		$Value_plex_action = 'HC_Play';
	}elseif ($plex_webhooks_json['event'] == 'media.pause') {
		$Value_plex_action = 'HC_Pause';
	}elseif ($plex_webhooks_json['event'] == 'media.resume'){
		$Value_plex_action = 'HC_Resume';
	}elseif ($plex_webhooks_json['event'] == 'media.stop'){
		$Value_plex_action = 'HC_Stop';
	}else {
		$Value_plex_action = 'RAS_HC';
	}

	//on envoi a l api eedomus le declenchement de la scene correspondante
	$EEDOMUS_URL = 'https://api.eedomus.com/set?action=periph.value&periph_id=' . $EEDOMUS_PLEX_SCENE_ID . '&value=' . $Value_plex_action . '&api_user=' . $EEDOMUS_API_USER . '&api_secret=' . $EEDOMUS_API_PASSWORD;
	$is_ok = file_get_contents($EEDOMUS_URL);

}
?>
1 Like