Bonjour,
j’ai fait un petit script qui se connecte au serveur LMS pour recupére l’heure de reveil de ma Squezebox.
voici le script
<?php
require_once dirname(__FILE__) .'/../../../core/php/core.inc.php';
$LogFile = 'Script_SqueezeboxReveil';
$debug = TRUE;
$timeToSend = 32000;
$reveil=array();
$logtype = 'debug' ; // Jeedom debug mode
if ($debug=== TRUE){
$logtype = 'alert' ; // Jeedom alert mode force write inside log
}
//adresse IP du serveur LMS
if (isset($argv[1])) {
$address =$argv[1];
}else{
log::add($LogFile, 'alert', "Mauvaise config addresse ip serveur LMS" );
exit;
}
if (isset($argv[2])) {
$mac =$argv[2];
}else{
log::add($LogFile, 'alert', "Mauvaise config addresse mac" );
exit;
}
// Jour ou jour +1
if (isset($argv[3])) {
$mode = $argv[3];
}else{
log::add($LogFile, 'alert', "Pas de mode selectionné" );
exit;
}
// Port du service LMS
if (isset($argv[4])) {
$service_port =$argv[4]; // 9090;
}else{
log::add($LogFile, 'alert', "Passage au port par defaut 9090" );
$service_port = 9090;
}
log::add($LogFile, $logtype, "----------------------------------------------------------------------" );
error_reporting(E_ALL);
// Crée un socket TCP/IP
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
log::add($LogFile, $logtype, "socket_create() a échoué : raison : " .socket_strerror(socket_last_error()) );
} else {
log::add($LogFile, $logtype, "Socket OK");
}
// Connexion
log::add($LogFile, $logtype, "Essai de connexion à '$address' sur le port '$service_port'...");
$result = socket_connect($socket, $address, $service_port);
if ($socket === false) {
log::add($LogFile, $logtype, "socket_connect() a échoué : raison : ($result) " . socket_strerror(socket_last_error($socket)));
} else {
log::add($LogFile, $logtype, "Connection Socket OK");
}
// Requettes pour savour si les alarmes sont actives
$in = "$mac playerpref alarmsEnabled ? \n"; // Toute les alarmes
//$in = "$mac alarms 0 15 filter:enabled \n"; //Seulement les alarmes actives
$out = '';
log::add($LogFile, $logtype, "Envoi de la requête $in ...");
socket_write($socket, $in, strlen($in));
log::add($LogFile, $logtype, "Requete envoyé OK");
//log::add($LogFile, $logtype, "Lire la réponse : ");
$out = str_replace ('%2C',',',str_replace ('%2F','/',str_replace ('%3A',':',socket_read($socket, 2048))));
log::add($LogFile, $logtype, 'Resultat : ' .$out);
// convertie le résultat en tableau
$AlarmsEnabled = explode(" ", $out);
/*
for($i = 0; $i < count($AlarmsEnabled); ++$i) {
log::add($LogFile, $logtype, "Resultat Array $i : " .($AlarmsEnabled[$i]));
}
*/
// Si les alarmes sont desactivées pas la peine de continuer
if(intval($AlarmsEnabled[3]) === 1){
// requete pour l'état des alarmes
$in = "$mac alarms 0 15 filter:all \n"; // Toute les alarmes
//$in = "$mac alarms 0 15 filter:enabled \n"; //Seulement les alarmes actives
$out = '';
log::add($LogFile, $logtype, "Envoi de la requête $in ...");
socket_write($socket, $in, strlen($in));
log::add($LogFile, $logtype, "Requete envoyé OK");
//log::add($LogFile, $logtype, "Lire la réponse : ");
$out = str_replace ('%2C',',',str_replace ('%2F','/',str_replace ('%3A',':',socket_read($socket, 2048))));
log::add($LogFile, $logtype, 'Resultat : ' .$out);
// convertie le résultat en tableau
$ValueArray = explode(" ", $out);
/*
for($i = 0; $i < count($ValueArray); ++$i) {
log::add($LogFile, $logtype, "Resultat Array $i : " .($ValueArray[$i]));
}
*/
//recherche position de l'id du reveil
$needle = 'id:';
$PositionId = array_keys(array_filter($ValueArray, function($var) use ($needle){
return strpos($var, $needle) !== false;
}));
//recupère les valeurs des reveils
for($i = 0; $i < count($PositionId); ++$i) {
// log::add($LogFile, $logtype, "Resultat PositionId $i : " .($PositionId[$i]));
$actualdow = explode(":", $ValueArray[$PositionId[$i] +1]);
$actualenabled = explode(":", $ValueArray[$PositionId[$i] +2]);
$actualrepeat = explode(":", $ValueArray[$PositionId[$i] +3]);
$actualtime = explode(":", $ValueArray[$PositionId[$i] +4]);
$reveil[$i]= array('dow' => $actualdow[1],'enabled' => $actualenabled[1],'time' => gmdate("Hi", $actualtime[1]) ) ;
}
$day1 = intval (date('w')) +1 > 6 ? 0 : intval (date('w')) +1 ;
for($i = 0; $i < count($reveil); ++$i) {
log::add($LogFile, $logtype, "Resultat reveil $i dow : " .$reveil[$i]['dow'] . " enabled : " .$reveil[$i]['enabled'] . " time : " .$reveil[$i]['time']);
// regarde si le reveil est actif aujourd'hui
if ($reveil[$i]['enabled'] === '1' and strpos($reveil[$i]['dow'], date('w')) !== false and $mode ==='d') { //
// Slectionne l'heure du reveil
if ($timeToSend < $reveil[$i]['time'] or $timeToSend === 32000){
$timeToSend = $reveil[$i]['time'] ;
}
// regarde si le reveil est actif demain
}elseif ($reveil[$i]['enabled'] === '1' and strpos($reveil[$i]['dow'], strval($day1)) !== false and $mode ==='d+1') {
if ($timeToSend < $reveil[$i]['time'] or $timeToSend === 32000){
$timeToSend = $reveil[$i]['time'] ;
}
}
}
}
// retourne la valeur
echo $timeToSend;
log::add($LogFile, $logtype, "Valeur renvoyée : " .$timeToSend);
//Ferme le socket
log::add($LogFile, $logtype, "Fermeture du socket...");
socket_close($socket);
log::add($LogFile, $logtype, "Socket fermé");
?>
Utilisation :
il faut passer au moins 3 arguments au scrript, dans l’ordre Adresse IP du serveur LMS, Adresse mac de la radio, le mode d ou d+1 et le port du serveur LMS (ce dernier est facultatif par defaut le script utilise le port 9090 qui est le pro CLI par defaut de LMS).
voici un example d’appel du scrip
avec comme argument d
avec comme argument d+1
Retour du script
-Avec l’argument d :
avec cet argument le script retourne l’heure au format hhmm (utilisable dans les scenarios) du dernier reveil de la journée ou 32000 si aucun reveil n’est actif pour ce jour ou si les reveils sont completement eteinds
j’utilise ce mode pour ouvrir mes volets X min apres mon reveil, mais on peu directement utiliser la valeur.
-Avec l’argument d+1 :
avec cet argument le script retour l’heure au format hhmm (utilisable dans les scenarios) du dernier reveil du lendemain ou 32000 si aucun reveil n’est actif pour ce jour ou si les reveils sont completement eteinds
j’utilise ce mode pour m’envoyer un message les soirs de semaine pour m’avertir si aucun reveil n’est allumé pour le lendemain et me donner l’heure
n’hesitez pas à me faire un retour ou à poser vos questions