Hello
Pour ceux qui comme moi veulent tout faire via cette monstrueuse app … et en attendant qu’une solution soit donnée … j’ai fait cette petite bidouille vite fait pour avoir les logs appli et scénario au travers de JC
- Créer un virtuel nommé ici vLogManage contenant
- une info virtuel de type autre : plugin
- un action virtuel de type liste : listPlugins liée à l’info virtuel plugin
- une info virtuel de type autre : scenario
- un action virtuel de type liste : listScenario liée à l’info virtuel scenario
Ce virtuel va permettre d’avoir la liste des logs des scénarios et plugins et de pouvoir demander à les envoyer par notification à JC
- Créer un scénario schédulé tous les jours pour constituer la liste des logs plugins et scénario nommé ici :
sGetPluginLog
Il s’agit d’un scénario en bloc code PHP
$scenario->setlog('Start build list of plugins / scenario log files');
//Get the list of plugins log file
$listPluginLogFile=explode("\n", shell_exec('ls -l /var/www/html/log/ | awk \'{print $9}\''));
$listPlugins='';
foreach($listPluginLogFile as $plugin){
if (!(IsNullOrEmptyString($plugin))) {
if (strlen($listPlugins) > 0) {
$listPlugins .= ';';
}
$listPlugins .=$plugin .'|' . $plugin;
}
}
$scenario->setlog(' * list active scenario : ' . $listPlugins);
$cmdPluginsList=cmd::byString('#[Infra][vLogManage][listPlugins]#');
$cmdPluginsList->setConfiguration('listValue',$listPlugins);
$cmdPluginsList->save();
//get list of active scenario
$listScenario='';
foreach(scenario::all() as $sc){
if ($sc->getIsActive()) {
if (strlen($listScenario) > 0) {
$listScenario .= ';';
}
$listScenario .= 'scenario' . $sc->getId(). '.log|'.$sc->getName();
}
}
$scenario->setlog(' * list active scenario : ' . $listScenario);
$cmdScenarioList=cmd::byString('#[Infra][vLogManage][listScenario]#');
$cmdScenarioList->setConfiguration('listValue',$listScenario);
$cmdScenarioList->save();
//Refresh list for equipement JC
$eqJC=eqLogic::byString('#[Infra][Jeeconnect Chris]#');
$eqJC->getConfig(true,true);
$scenario->setlog('End build list of plugins / scenario log files');
function IsNullOrEmptyString($str){
return (!isset($str) || trim($str) === '');
}
Une ligne importante est :
//Refresh list for equipement JC
$eqJC=eqLogic::byString('#[Infra][Jeeconnect Chris]#');
$eqJC->getConfig(true,true);
Elle permet le rafraichissement de ton équipement JC
Ne pas oublier de scheduler le script tous les jours à l’heure désirée
A cette étape il est bon de tester le script en appuyant sur executer … le résultat doit être visible dans le virtuel créer précédemment … les 2 commandes select doivents être alimentées . exemple select listPlugins
- Créer le scénario qui va envoyer les logs via notification ici nommé sSendLogsToJC
Il s’agit d’un scénario en bloc code PHP
$tags = $scenario->getTags();
$cmdName = $tags['#cmdName#'];
if (!(IsNullOrEmptyString($cmdName))) {
$logPath='/var/www/html/log/';
$value=executeCommande($cmdName,$scenario);
$valueTitle=$value;
if (stringContains($value,'scenario')) {
$logPath .='scenarioLog/';
$sc=scenario::byId(str_replace('scenario','',$value));
$valueTitle=$sc->getName();
}
$scenario->setLog(' input : ' . $cmdName . '| logs path : ' . $logPath);
$sendMsgKO=true;
$nbLine=40;
while($sendMsgKO) {
$message = shell_exec('tail -n '. $nbLine . ' ' . $logPath . $value);
$content_length=mb_strlen($title . $message,'8bit');
if ($content_length <= 3000) {
$sendMsgKO=false;
}
$nbLine = $nbLine - 1;
}
$title = '<b><u>Log : </u></b>' . $valueTitle;
//chris => met le nom de l equipement JC qui doit recevoir la notification
//Notification => met le nom de la notification que tu veux déclencher
sendJeedomConnectMessage($scenario,'chris','Notification','',$title,$message);
}
$scenario->setlog('End get last line of a plugin log');
function stringContains($string_1, $string_2) {
if ((strtolower($string_1) == strtolower($string_2)) or
(strpos(strtolower($string_1),strtolower($string_2)) !== false ) or
(strpos(strtolower($string_2),strtolower($string_1)) !== false )) {
return true;
} else {
return false;
}
}
function executeCommande($commandName,$scenario=NULL) {
try {
$cmd=cmd::byString('#'.$commandName.'#');
return $cmd->execCmd();
} catch (Exception $e) {
$erreur= $e->getMessage();
$message=$scenario->getHumanName() . ' - erreur : ' . $e->getMessage();
sendJeedomConnectMessage($scenario,'chris','Notification','','Erreur scenario : ' . $scenario->getName(),$message);
throw $e;
}
}
function sendJeedomConnectMessage($scenario,$destinataire,$notificationName,$attachedFile,$title,$message) {
$cmdJC;
foreach(eqLogic::byType('JeedomConnect', true) as $eqLogic) {
if (stringContains($eqLogic->getName(),$destinataire)) {
$arrCmd=$eqLogic->getCmd('action',null,null,null);
foreach($arrCmd as $cmd) {
if (stringContains($cmd->getName(),$notificationName)) {
$cmdJC=$cmd;
break;
}
}
}
if (is_object($cmdJC)) {
break;
}
}
if (is_object($cmdJC)) {
if (is_array($attachedFile)) {
$scenario->setLog('It is an array');
$options = array('title' => $title, 'message'=>str_replace("\n","<br/>",$message),'files'=> $attachedFile);
} else {
$scenario->setLog('It is not an array');
$options = array('title' => $title, 'message'=>str_replace("\n","<br/>",$message),'files'=> array($attachedFile));
}
$scenario->setLog('Options : ' . json_encode($options));
$cmdJC->execCmd($options, $cache=0);
} else {
$scenario->setLog('Aucune commande notification jeedom connect trouvée pour le destinataire : ' . $destinataire . ' et le type de notification : ' . $notificationName);
}
}
function IsNullOrEmptyString($str){
return (!isset($str) || trim($str) === '');
}
- executer le script lorsqu’on click sur une des listes box … retour dans le virtuel … setting de chacune des commandes actions puis onglet configuration puis executer le scenario apres action sur la commande.
Il faut luis passer en paramètre (tag) le nom de l’info associé
Exemple listPlugins
Exemple listScenario
- créer 2 widgets de type liste déroulante sous JC et les associées à l’équipement souhaité
Si tout va bien dans ton app JC mobile, tu as acces à l’ensemble des logs plugins et scenario et qd tu click tu dois recevoir sa log par notif
PS : il s’agit d’un exemple fonctionnel et certainement optimisable … mais ça fait le boulot