Squezebox (LMS) Script recupération heure reveil

Tags: #<Tag:0x00007fa7acd70658>

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
image

avec comme argument d+1
image

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

Salut !

C’est top ! J’utilise une Squeezebox en réveil depuis un certain temps, et ça m’embêtait de ne pas pouvoir exploiter les données de réveil pour programmer différents scénario (passage des radiateurs en mode confort 1h avant par exemple).

Comment mets tu en place ce script s’il te plait ? Aurais tu plus de détail ?

Ce serait top que les infos du réveil soient intégrées par défaut dans le plugin…

excellent!!!

j’ai fait l’inverse de mon coté: réveil géré par jeedom qui declenche LMS.
du coup je conditionne le réveil sur la présence, les jours fériés… par exemple.

je vais me pencher là dessus pour voir les avantages par rapport à ma solution :slight_smile:

Bonjour @y4ourt

pour mettre en place ce script utilise le pluging script (doc)
tu crées un nouveau script de type info et tu copie le code dedans
puis une foi le script creer tu lui met les argument comme décrit dans mon premier poste adresse ip du serveur, adresse mac de la radio , mode

il faudra executer la commande Refresh avant réinterroger l’info dans un scenario

@Yogui Ok c’est noté je vais regarder cela. Je te ferai un retour, pas de souci :relaxed:

@Poumi Ca m’intéresse aussi ! Comment tu gères de façon ergonomique un réveil dans Jeedom ?

salut,

avantage pour moi :
si jeedom plante ton reveil marche encore
plus facile a gère tu peux modifier l’heure de ton reveil sans utiliser un pc ou un téléphone portable
waf pour la partie reveil

1 J'aime

Chez moi c’est virtuels, scénarios et widgets.
Mais il me semble que quelqu’un a fait un plugin depuis.