Hello
Dsl pour le temps mais j’avais pas trop de temps à accorder à ce sujet et surtout j’avais pas accès au spa de mon amis pour tester …
J’ai tout fait en mode scenario …
J’ai crée 2 scripts python que j’ai positionné dan /var/www/html/plugins/script/data
Le zip contenant les 2 scripts à renommer en .zip et à extraire
apiGeckoJeedom.txt (4,6 Ko)
En fonction de comment vous les intégrer sur votre jeedom il faudra leur donner le droit d’exécution et peut etre faire une conversion doc2unix
chmod +x sur chacun des scripts
doc2unix sur chacun des scripts
Apres tout se passe côté scénario
Premier scénario nommé : sGetSpasStateForAllSpa
Il permet de récupérer toutes les infos de tous va spa gecko et va tout stocker dans une variable nommé ListSpaIdentifier
$scenario->setLog('Start script discover and get state for all spa');
$aListSpaIdentifier=array();
exec('python3 /var/www/html/plugins/script/data/gecko_api_getState.py', $output, $retval);
$scenario->setLog("Returned status $retval");
foreach($output as $line){
if ((strtolower('ResponseState') == strtolower($line)) or
(strpos(strtolower('ResponseState'),strtolower($line)) !== false ) or
(strpos(strtolower($line),strtolower('ResponseState')) !== false )) {
$jsonResponse=explode('|',$line)[1];
$aResponse=json_decode($jsonResponse, true);
if (sizeof($aResponse) > 0) {
$scenario->setLog(json_encode($aResponse));
$scenario->setData('ListSpaIdentifier',json_encode($aResponse));
}
}
}
$scenario->setLog('End script discover and get state for all spa');
Il vous faut alors le scheduler toutes les 5/10 minutes à votre convenance
Second scénario nommé : sCreateUpdateCmdSpa
Celui va se charger de crée automatiquement le virtuel et les commandes associées … mais également de mettre à jour les données.
Il vous faut modifier en début de script l’id de l’objet parent pour spécifier l’emplacement du virtuel … ici objet jardin avec l’id 1
$scenario->setLog('Start script create / update virtual and cmd for a spa gecko');
//parent id -> jardin
$parentID=1;
$resp= $scenario->getData(str_replace(array('#','variable(',')'),array(''),$scenario->getRealTrigger()));
$resp= $scenario->getData('ListSpaIdentifier');
$scenario->setLog(' -> ' . json_encode($resp));
if (array_key_exists('spas', $resp)) {
foreach($resp['spas'] as $spa) {
$scenario->setLog($spa['name'] . ' -> ' . $spa['id']);
$aResp=createVirtual($scenario,$parentId,$spa['name'],$spa['id']);
//create raw data
createCmd($scenario,$aResp[0],$aResp[1],'raw_data_'.$spa['id'],'info','other','','','',json_encode($spa),false,'','','','');
if (array_key_exists('cmds', $spa)) {
foreach($spa['cmds'] as $cmd) {
$scenario->setLog(' - ' . $cmd['name'] . ' -> ' . json_encode($cmd));
createCmds($scenario,$cmd,$aResp);
}
}
}
}
$scenario->setLog('End script get state for spa');
function createCmds($scenario,$cmd,$virtual) {
switch (true) {
case stristr($cmd['name'],'water_care'):
createCmd($scenario,$virtual[0],$virtual[1],$cmd['name'],'info','numeric','','','',$cmd['state'],true,'','',$cmd['stateList'],'');
if (array_key_exists('stateList', $cmd)) {
$i=0;
foreach($cmd['stateList'] as $state) {
createCmd($scenario,$virtual[0],$virtual[1],$cmd['name'].'_'.$state,'action','other','','','','',false,$cmd['name'],$i,'','');
$i++;
}
}
break;
case stristr($cmd['name'],'lights'):
createCmd($scenario,$virtual[0],$virtual[1],$cmd['name'],'info','binary','','','',($cmd['state']==1?'1':'0'),true,'','',$cmd['stateList'],'');
if (array_key_exists('stateList', $cmd)) {
foreach($cmd['stateList'] as $state) {
createCmd($scenario,$virtual[0],$virtual[1],$cmd['name'].'_'.$state,'action','other','','','','',false,$cmd['name'],$state,'','');
}
}
break;
case stristr($cmd['name'],'water_heater'):
createCmd($scenario,$virtual[0],$virtual[1],$cmd['name'],'info','numeric',$cmd['unit'],$cmd['max_temp'],$cmd['min_temp'],$cmd['current_temp'],true,'','','','');
createCmd($scenario,$virtual[0],$virtual[1],'current_operation','info','string','','','',$cmd['current_operation'],true,'','','','');
$cmdTarget=createCmd($scenario,$virtual[0],$virtual[1],'target_temperature','info','numeric',$cmd['unit'],'','',$cmd['target_temperature'],true,'','','','');
createCmd($scenario,$virtual[0],$virtual[1],$cmd['name'].'_set_temperature','action','slider',$cmd['unit'],$cmd['max_temp'],$cmd['min_temp'],'',false,'target_temperature','','',$cmdTarget->getId());
break;
case stristr($cmd['name'],'pumps'):
createCmd($scenario,$virtual[0],$virtual[1],$cmd['name'],'info','string','','','',$cmd['mode'],true,'','',$cmd['stateList'],'');
if (array_key_exists('stateList', $cmd)) {
foreach($cmd['stateList'] as $state) {
createCmd($scenario,$virtual[0],$virtual[1],$cmd['name'].'_'.$state,'action','other','','','','',false,$cmd['name'],$state,'','');
}
}
break;
case stristr($cmd['name'],'sensor'):
createCmd($scenario,$virtual[0],$virtual[1],$cmd['name'].'_'.$cmd['label'],'info','string','','','',$cmd['state'] ? 'true' : 'false',true,'','',$cmd['stateList'],'');
if (array_key_exists('stateList', $cmd)) {
foreach($cmd['stateList'] as $state) {
createCmd($scenario,$virtual[0],$virtual[1],$cmd['name'].'_'.$state,'action','other','','','','',false,$cmd['name'].'_'.$cmd['label'],$state,'','');
}
}
break;
default:
$scenario->setLog('Cmd not manage : ' . $cmd['name'],true,'');
break;
}
}
function createVirtual($scenario,$parentID,$virtualName,$virtualLogicalId) {
$scenario->setLog(" * Function createVirtual Start");
$scenario->setLog(" - params : $parentID");
$virtual = eqLogic::byLogicalId($virtualLogicalId, 'virtual');
if (!is_object($virtual)) {
$scenario->setLog(" - Logic Equipment not exist $virtualName ==> need to create with parent id $parentID ");
$virtual = new virtual();
$virtual->setName($virtualName);
$virtual->setLogicalId($virtualLogicalId);
$virtual->setEqType_name('virtual');
$virtual->setObject_id($parentID);
$virtual->setIsEnable(1);
$virtual->setIsVisible(1);
$virtual->save();
}
$vId=$virtual->getId();
return array($virtual,$vId);
}
function createCmd($scenario,$virtual,$virtualId,$cmdName,$type,$subtype,$unit,$maxValue,$minValue,$value,$historized,$infoName,$infoValue,$listValue,$idLinkedValue) {
$scenario->setLog(" * Function createCmd Start -> " . $cmdName . ' value : ' .$value);
$virtuelCmd=$virtual->getCmd(null, $cmdName);
if (!is_object($virtuelCmd)) {
$scenario->setLog(" - cmd do not exist ==> need to create it");
$virtuelCmd = new virtualCmd();
$virtuelCmd->setName($cmdName);
$virtuelCmd->setEqLogic_id($virtualId);
$virtuelCmd->setLogicalId($cmdName);
$virtuelCmd->setType($type);
//$virtuelCmd->setSubType('numeric');
$virtuelCmd->setSubType($subtype);
$virtuelCmd->setIsHistorized($historized);
}
if ($unit != '') {
$virtuelCmd->setUnite($unit);
}
if ($maxValue != '') {
$virtuelCmd->setConfiguration("maxValue",$maxValue);
}
if ($minValue != '') {
$virtuelCmd->setConfiguration("minValue", $minValue);
}
if ($infoName !='') {
$virtuelCmd->setConfiguration("infoName", $infoName);
}
if ($infoValue != '') {
$virtuelCmd->setConfiguration("value",$infoValue);
}
if ($listValue !='') {
$virtuelCmd->setConfiguration("listValue",$listValue);
}
if ($idLinkedValue != '') {
$scenario->setLog('Id linked value : ' . $idLinkedValue);
$virtuelCmd->setConfiguration("infoId",$idLinkedValue);
$virtuelCmd->setValue($idLinkedValue);
}
if ($value != '') {
$scenario->setLog(" - update value => " . $value);
$virtual->checkAndUpdateCmd($cmdName, $value);
}
$virtuelCmd->save();
return $virtuelCmd;
}
Ce scénario devra être provoqué par le changement de valeur de la variable ListSpaIdentifier
#variable(ListSpaIdentifier)#
Troisième scénario permet de gérer les actions : sSpaActions
$scenario->setLog('Start script for lauching action on Gecko spa');
$trigger=$scenario->getRealTrigger();
$scenario->setLog(' - trigger : ' . json_encode($trigger));
$cmd=cmd::byId(str_replace(array('#'),array(''),$trigger));
if (is_object($cmd)) {
$scenario->setLog(' - cmd : ' . $cmd->getName());
//$isSameValue=isSameValue($scenario,$cmd);
$spaInfo=getSpaId($scenario, $cmd);
$scenario->setLog(' => spa id : ' . $spaInfo['id'] . '| same value : ' . $isSameValue);
if ($spaInfo['id'] != '' && !$isSameValue) {
$respAction=getAction($scenario,$cmd);
if ($respAction!='') {
$scenario->setLog(' -> call gecko api :' . $respAction['cmd'] . '|'. $respAction['index'] . '|' . $respAction['action']);
$pythonCmd='python3 /var/www/html/plugins/script/data/gecko_api_actions.py \'' . $spaInfo['name'] . '\' ' . $spaInfo['id'] . ' ' . $respAction['cmd'] . ' ' . $respAction['index'] . ' ' .$respAction['action'];
$scenario->setLog('Exec python command : ' . $pythonCmd);
exec($pythonCmd, $output, $retval);
$scenario->setLog(' -> respone status : '. $retval);
foreach($output as $line){
$scenario->setLog($line);
if ((strtolower('ResponseState') == strtolower($line)) or
(strpos(strtolower('ResponseState'),strtolower($line)) !== false ) or
(strpos(strtolower($line),strtolower('ResponseState')) !== false )) {
$jsonResponse=explode('|',$line)[1];
$aResponse=json_decode($jsonResponse, true);
if (sizeof($aResponse) > 0) {
$scenario->setLog(json_encode($aResponse));
$scenario->setData('ListSpaIdentifier',json_encode($aResponse));
}
}
}
}
}
}
$scenario->setLog('End script for lauching action on Gecko spa');
function isSameValue($scenario,$cmd) {
return ($cmd->execCmd() == $cmd->getLastValue());
}
function getSpaId($scenario, $cmd){
$parentId=$cmd->getEqLogic_id();
$scenario->setLog(' - parent id : ' . $parentId);
$eqParent=eqLogic::byId($parentId);
foreach($eqParent->getCmd() as $cmdEq) {
if (stristr($cmdEq->getName(),'raw_data')) {
return array('name'=>$eqParent->getName(), 'id'=>str_replace(array('raw_data_'),array(''),$cmdEq->getName()));
break;
}
}
}
function getAction($scenario,$cmd) {
$cmdName=$cmd->getName();
$value=($cmd->execCmd() == '' ? '0' : $cmd->execCmd());
$scenario->setLog(__FUNCTION__ . ':' . $cmdName . '|'.$value);
$splitCmd=explode('_',$cmdName);
switch (true) {
case stristr($cmdName,'pump'):
return array('cmd' => $splitCmd[0], 'index' => $splitCmd[1], 'action'=>$value);
break;
case stristr($cmdName,'light'):
return array('cmd' => $splitCmd[0], 'index' => $splitCmd[1], 'action'=>$value);
break;
case stristr($cmdName,'water_care'):
//get index of asked value
$listValue=$cmd->getConfiguration('listValue');
$i=0;
foreach($listValue as $paramValue) {
$scenario->setLog($paramValue . ' vs ' . $value);
//if ($paramValue == $value) {
if ($i == $value) {
return array('cmd' => 'water_care', 'index' => '0', 'action'=>'\'' .$paramValue . '\'');
break;
}
$i++;
}
break;
case stristr($cmdName,'target_temperature'):
case stristr($cmdName,'water_heater_set_temperature'):
return array('cmd' => 'target_temperature', 'index' => 0, 'action'=>$value);
break;
default:
return '';
break;
}
}
Il doit avoir comme déclencheur les actions vous voulez réaliser
ici : lampe, pompe et température de l’eau
Vous allez avoir un virtuel avec cette tête là
Hésitez pas si vous avez des soucis ou questions
@chris94440
Ps : il faut compter environs 10/15 secondes entre la demande d’une action et la réponse de l’api … alors soyez patient