. */ /* * ***************************Includes********************************* */ require_once dirname(__FILE__) . '/../../../../core/php/core.inc.php'; class myhomescs extends eqLogic { /* * *************************Attributs****************************** */ /* * ***********************Methode static*************************** */ public static function dependancy_info() { $return = array(); $return['log'] = 'myhomescs.update'; $return['progress_file'] = '/tmp/dependancy_myhomescs_in_progress'; if (exec('sudo dpkg --get-selections | grep python-requests | grep install | wc -l') != 0) { $return['state'] = 'ok'; } else { $return['state'] = 'nok'; } return $return; } public static function dependancy_install() { log::remove('myhomescs.update'); $cmd = 'sudo /bin/bash ' . dirname(__FILE__) . '/../../ressources/install.sh'; $cmd .= ' >> ' . log::getPathToLog('myhomescs.update') . ' 2>&1 &'; exec($cmd); } public static function deamon_info() { $return = array(); $return['log'] = 'myhomescs.debug'; $return['state'] = 'nok'; $pid_file = '/tmp/myhomescs.pid'; if (file_exists($pid_file)) { if (posix_getsid(trim(file_get_contents($pid_file)))) { $return['state'] = 'ok'; } else { shell_exec('sudo rm -rf ' . $pid_file . ' 2>&1 > /dev/null;rm -rf ' . $pid_file . ' 2>&1 > /dev/null;'); } } $return['launchable'] = 'ok'; return $return; } public static function deamon_start($_debug = false) { self::deamon_stop(); $deamon_info = self::deamon_info(); if ($deamon_info['launchable'] != 'ok') { throw new Exception(__('Veuillez vérifier la configuration', __FILE__)); } log::remove('myhomescs'); $myhomescs_path = realpath(dirname(__FILE__) . '/../../ressources/myhomescscmd'); if (file_exists('/tmp/config_myhomescs.xml')) { unlink('/tmp/config_myhomescs.xml'); } $enable_logging = (config::byKey('enableLogging', 'myhomescs', 0) == 1) ? 'yes' : 'no'; if (file_exists(log::getPathToLog('myhomescsd') . '.message')) { unlink(log::getPathToLog('myhomescsd') . '.message'); } if (!file_exists(log::getPathToLog('myhomescsd') . '.message')) { touch(log::getPathToLog('myhomescsd') . '.message'); } $result = exec($cmd . ' >> ' . log::getPathToLog('myhomescsd') . ' 2>&1 &'); $replace_config = array( '#pid_path#' => '/tmp/myhomescs.pid', '#trigger_url#' => network::getNetworkAccess('internal', 'proto:127.0.0.1:port:comp') . '/plugins/myhomescs/core/php/jeemyhomescs.php', '#apikey#' => config::byKey('api'), '#enable_log#' => $enable_logging, '#log_path#' => log::getPathToLog('myhomescsd'), '#f454host#' => config::byKey('f454host', 'myhomescs'), '#f454portevent#' => config::byKey('f454portevent', 'myhomescs', 20000), '#f454portcmd#' => config::byKey('f454portcmd', 'myhomescs', 20000), '#sockethost#' => config::byKey('sockethost', 'myhomescs','127.0.0.1'), '#socketport#' => config::byKey('socketport', 'myhomescs', 55005), ); $config = template_replace($replace_config, file_get_contents($myhomescs_path . '/config_tmpl.xml')); file_put_contents('/tmp/config_myhomescs.xml', $config); chmod('/tmp/config_myhomescs.xml', 0777); if (!file_exists('/tmp/config_myhomescs.xml')) { throw new Exception(__('Impossible de créer : ', __FILE__) . '/tmp/config_myhomescs.xml'); } $cmd = '/usr/bin/python ' . $myhomescs_path . '/myhomescsevent.py -l -o /tmp/config_myhomescs.xml'; if (log::getLogLevel('myhomescs')=='100') { $cmd .= ' -D'; } log::add('myhomescs', 'info', 'Lancement démon myhomescsevent : ' . $cmd); $result = exec($cmd . ' >> ' . log::getPathToLog('myhomescsd') . ' 2>&1 &'); if (strpos(strtolower($result), 'error') !== false || strpos(strtolower($result), 'traceback') !== false) { log::add('myhomescsd', 'error', $result); return false; } $i = 0; while ($i < 30) { $deamon_info = self::deamon_info(); if ($deamon_info['state'] == 'ok') { break; } sleep(1); $i++; } if ($i >= 30) { log::add('myhomescsd', 'error', 'Impossible de lancer le démon myhomescs, vérifiez le log myhomescsd', 'unableStartDeamon'); return false; } message::removeAll('myhomescsd', 'unableStartDeamon'); log::add('myhomescs', 'info', 'Démon Myhomeevent lancé'); return true; } public static function deamon_stop() { $pid_file = '/tmp/myhomescs.pid'; if (file_exists($pid_file)) { $pid = intval(trim(file_get_contents($pid_file))); system::kill($pid); } system::fuserk(config::byKey('socketport', 'myhomescs', 55005)); } public static function readSocket($socket){ $out = $recv = ''; $buffersize = 1460; do { if ($out != '' && $recv != '') break; $recv = ''; $recv = socket_read($socket,$buffersize); if ($recv != '') $out .= $recv; } while (strlen($recv)==$buffersize); //echo $out; return $out; } public static function writeSocket($socket,$txt){ socket_write($socket, $txt, strlen($txt)); return myhomescs::readSocket($socket); } public static function send_trame($trames) { if (!is_array($trames)) { //log::add('myhomescs','debug','Single trame string'); $trames = array($trames); } //log::add('myhomescs','debug','Send trames '.implode(", ",$trames)); $hostname = config::byKey('f454host', 'myhomescs'); $port = config::byKey('f454portcmd', 'myhomescs', 20000); $ACK = '*#*1##'; $NACK = '*#*0##'; $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket === false) {log::add('myhomescs','debug', "socket_create() a échoué : raison : " . socket_strerror(socket_last_error($socket)));} $result = socket_connect($socket, $hostname, $port); if ($result === false) {log::add('myhomescs','debug', "socket_connect($hostname, $port) a échoué : raison : ($result) " . socket_strerror(socket_last_error($socket)));} if(myhomescs::readSocket($socket)==$ACK){//1er ACK de connexion if(myhomescs::writeSocket($socket, '*99*9##')==$ACK){ //Login accepté foreach ($trames as $trame) { $response = myhomescs::writeSocket($socket,$trame); //On balance la commande au socket log::add ('myhomescs','info',"Envoi depuis Jeedom : $trame : $response"); } }else{ log::add ('myhomescs','debug',"Pb login"); } } else{log::add('myhomescs','debug', "Socket did not ACK connection");} log::add ('myhomescs','debug',"Fermeture du socket..."); socket_shutdown($socket); socket_close($socket); } public static function createFromDef($_def) { if (config::byKey('autoDiscoverEqLogic', 'myhomescs') == 0) { return false; } $banId = explode(' ', config::byKey('banmyhomescsId', 'myhomescs')); if (in_array($_def['A'].$_def['PL'], $banId)) { return false; } //faire requete pour connaitre le type if (!isset($_def['A']) || !isset($_def['PL']) || !isset($_def['type']) || !isset($_def['media']) || $_def['A']=="NULL" || $_def['PL']=="NULL" || $_def['type']=="NULL" || $_def['media']=="NULL") { log::add('myhomescs', 'error', 'Information manquante pour ajouter l\'équipement : ' . print_r($_def, true)); return false; } $myhomescs = myhomescs::byLogicalId($_def['A'].$_def['PL'], 'myhomescs'); if (!is_object($myhomescs)) { $eqLogic = new myhomescs(); $eqLogic->setName($_def['A'].$_def['PL']); } $eqLogic->setLogicalId($_def['A'].$_def['PL']); $eqLogic->setEqType_name('myhomescs'); $eqLogic->setIsEnable(1); $eqLogic->setIsVisible(1); $eqLogic->setConfiguration('media', $_def['media']); if ($_def['type'] == "light" || $_def['type'] == "automatism" || $_def['type'] == "security" || $_def['type'] == "heating" ) { $eqLogic->setCategory($_def['type'], 1); } else { $eqLogic->setCategory('default', 1); } $eqLogic->save(); return $eqLogic; } public static function devicesParameters($_device = '') { $path = dirname(__FILE__) . '/../config/devices'; if (isset($_device) && $_device != '') { $files = ls($path, $_device . '.json', false, array('files', 'quiet')); if (count($files) == 1) { try { $content = file_get_contents($path . '/' . $files[0]); if (is_json($content)) { $deviceConfiguration = json_decode($content, true); return $deviceConfiguration[$_device]; } return array(); } catch (Exception $e) { return array(); } } } $files = ls($path, '*.json', false, array('files', 'quiet')); $return = array(); foreach ($files as $file) { try { $content = file_get_contents($path . '/' . $file); if (is_json($content)) { $return += json_decode($content, true); } } catch (Exception $e) { } } if (isset($_device) && $_device != '') { if (isset($return[$_device])) { return $return[$_device]; } return array(); } return $return; } public static function decrypt_trame($trame) { /* // FONCTION : DECRYPTAGE D'UNE TRAME AU FORMAT LISIBLE // PARAMS : $trame=string // RETURN : array( "trame" => string, "mode" => string, "media" => 'string', "format" => 'string', "type" => 'string', "value" => string, "dimension" => string, "param" => string, "A" => string, "PL" => string, "date" => timestamp //Exemple array( "trame" => *2*2*#653565653##, "media" => CPL, "mode" => multicast, "format" => BUS_COMMAND, "type" => 2, (automation) Who "value" => 2 , (Move Down) What "dimension" => string, "param" => string, "A" => string, "PL" => string, "date" => timestamp */ //$def = new myhomescs_def(); $ret_trame = array( "trame" => $trame, "format" => 'UNKNOWN', "mode" => 'UNKNOWN', "media" => 'SCS', "type" => 'UNKNOWN', "value" => NULL, "dimension" => NULL, "param" => NULL, "A" => NULL, "PL" => NULL, "date" => date("Y-m-d H:i:s", time()) ); //on teste le format de la trame foreach (myhomescs_def::OWN_TRAME as $command => $command_reg) { //si on trouve un format valide de trame if (preg_match($command_reg, $ret_trame['trame'], $decode_trame)) { $who = NULL; $what = NULL; $where = NULL; $dimension = NULL; $val = NULL; //on teste le type de la trame switch ($command){ case 'STATUS_REQUEST': $who = $decode_trame[1]; $where = $decode_trame[2]; break; case 'DIMENSION_REQUEST': $who = $decode_trame[1]; $where = $decode_trame[2]; $dimension = $decode_trame[3]; break; case 'BUS_COMMAND': case 'STATUS_RESPONSE': $who = $decode_trame[1]; list($what, $param) = explode("#", $decode_trame[2]); $where = $decode_trame[3]; break; case 'DIMENSION_REQUEST_RESPONSE': case 'DIMENSION_SET': $who = $decode_trame[1]; $where = $decode_trame[2]; $dimension = $decode_trame[3]; $val = $decode_trame[4]; break; case 'ACK': case 'NACK': case 'BUS_EVENT': break; } //On sauvegarde le format $ret_trame["format"] = $command; //On test le type de la trame foreach (myhomescs_def::OWN_TRAME_DEFINITION as $key => $trame_format) { if ($key == $who) { $ret_trame["type"] = $trame_format['TYPE']; //On recherche s'il existe les value/dimension/param dans la trame if (!is_null($what) && (isset($trame_format[$what]) || isset($trame_format[$what.'_']))) { if (isset($trame_format[$what])) { $ret_trame["value"] = $trame_format[$what]; } elseif (isset($trame_format[$what.'_'])) { $ret_trame["value"] = $trame_format[$what.'_']; } if (!is_null($param) && sizeof($param) > 0) { $ret_trame["param"] = $param; } } if (!is_null($dimension)) { $param = NULL; if (strpos($dimension, '#') !== false) { $param = explode("#", $dimension); $dimension = array_shift($param); } if (isset($trame_format['DIMENSION'][$dimension])) { $ret_trame["dimension"] = $trame_format['DIMENSION'][$dimension]; } elseif (isset($trame_format['DIMENSION'][$dimension.'_'])) { $ret_trame["dimension"] = $trame_format['DIMENSION'][$dimension.'_']; } $ret_trame["param"] = $param; $ret_trame["value"] = $val; } } } //ON RECUPE L'ID $group = (substr($where, 0, 1) == "#" ? "#" : ""); preg_match(myhomescs_def::OWN_WHERE_DEFINITION, $where, $match); if (strlen($match[1]) > 1) { $ret_trame["mode"] = myhomescs_def::OWN_COMMUNICATION_DEFINITION[""]; $where = $group.$match[1]; } elseif (strlen($match[2]) > 1) { $ret_trame["mode"] = myhomescs_def::OWN_COMMUNICATION_DEFINITION[$match[1]]; $where = $group.$match[2]; } if (isset($where)) { $ret_trame["A"] = myhomescsCmd::getIdMyhomescs($where, $who); $ret_trame["PL"] = myhomescsCmd::getUnitMyhomescs($where, $who); } else { $ret_trame["A"] = NULL; $ret_trame["PL"] = NULL; } break; } } return $ret_trame; } public static function updateStatus($decrypted_trame) { switch ($decrypted_trame['type']) { case 'light': //CAS DES LUMIERES log::add('myhomescs','debug',"Update Status Light"); myhomescs::updateStatusLight($decrypted_trame); break; case 'automatism': //CAS DES VOLETS log::add('myhomescs','debug',"Update Status Automatism"); myhomescs::updateStatusShutter($decrypted_trame); break; case 'heating': //CAS DE LA THERMOREGULATION log::add('myhomescs','debug',"Update Status Chauffage"); //myhomescs::updateStatusConfort($decrypted_trame); break; case 'Alarm': //CAS DE L'ALARME log::add('myhomescs','debug',"Update Status Alarm"); myhomescs::updateStatusAlarm($decrypted_trame); break; case 'Auxiliary': //CAS DES INFORMATIONS AUXILIAIRES log::add('myhomescs','debug',"Update Status Auxiliary"); myhomescs::updateStatusAuxiliary($decrypted_trame); break; case 'energy': //CAS DE L'ENERGIE log::add('myhomescs','debug',"Update Status Energy"); myhomescs::updateStatusEnergy($decrypted_trame); break; case 'Management': //CAS DU MANAGEMENT log::add('myhomescs','debug',"Update Status Management"); myhomescs::updateStatusManagement($decrypted_trame); break; case 'cenplus-drycontact': //CAS DES CEN PLUS ET CONTACTS SECS if (strpos($decrypted_trame['value'], "PRESS") !== false) { log::add('myhomescs','debug',"Update Status CEN+"); myhomescs::updateStatusCENPlus($decrypted_trame); break; }elseif ($decrypted_trame['value'] == "ON" || $decrypted_trame['value'] == "OFF") { log::add('myhomescs','debug',"Update Dry Contact"); myhomescs::updateStatusDryContact($decrypted_trame); break; } default: //ON NE S'EST PAS DE QUOI IL S'AGIT, ON QUITTE log::add ('myhomescs','error',"Unknown type or status: ".$decrypted_trame['type']); } return; } public static function updateStatusAuxiliary($decrypted_trame) { /* // FONCTION : MISE A JOUR DU STATUS auxiliaires // PARAMS : $decrypted_trame = array( "trame" => string, "format" => 'string', "type" => 'string', "value" => string, "dimension" => string, "param" => string, "A" => string, "PL" => string,) */ //Creation des variables utiles //$myhomescs = myhomescs::byLogicalId($decrypted_trame["A"].$decrypted_trame["PL"], 'myhomescs'); $myhomescs = myhomescs::byLogicalId('AUX'.$decrypted_trame["PL"], 'myhomescs'); $family = $myhomescs->getConfiguration('family'); //$device_type = explode('::', $myhomescs->getConfiguration('device')); //$deviceType = $device_type[0]; //On recupere la date de l'action //$date = strtotime($decrypted_trame["date"]); log::add('myhomescs','debug',"LogicalID : ".$decrypted_trame["A"].$decrypted_trame["PL"]." date : ".$date." family : ".$family); switch ($decrypted_trame["value"]) { case 'ON': $Auxiliarystatus = 1; break; case 'OFF': $Auxiliarystatus = 0; break; default: log::add('myhomescs','error', "Unknown Auxiliary : ".$decrypted_trame["value"]); break; } $myhomescs->checkAndUpdateCmd('Auxiliarystatus', $Auxiliarystatus); log::add('myhomescs','debug',"mise a jour du status : ".$Auxiliarystatus."\n"); } public static function updateStatusAlarm($decrypted_trame) { /* // FONCTION : MISE A JOUR ALARME //Romdev // PARAMS : $decrypted_trame = array( "trame" => string, "format" => 'string', "type" => 'string', "value" => string, "dimension" => string, "param" => string, "A" => string, "PL" => string,) */ $myhomescs = myhomescs::byLogicalId($decrypted_trame["A"].$decrypted_trame["PL"], 'myhomescs'); $family = $myhomescs->getConfiguration('family'); $date = strtotime($decrypted_trame["date"]); $Zone = $decrypted_trame["PL"]; log::add('myhomescs','debug',"LogicalID : ".$decrypted_trame["A"].$decrypted_trame["PL"]." date : ".$date." family : ".$family); switch ($decrypted_trame["value"]) { case 'ACTIVE': $ZONE = 1; $myhomescs->checkAndUpdateCmd('ZONE', $ZONE); break; case 'NON ACTIVE': $ZONE = 0; $myhomescs->checkAndUpdateCmd('ZONE', $ZONE); break; case 'INTRUSION': $STATUS_ZONE = 'INTRUSION'; $myhomescs->checkAndUpdateCmd('STATUS_ZONE', $STATUS_ZONE); break; case 'ANTI PANIC': $STATUS_ZONE = 'ANTI PANIC'; $myhomescs->checkAndUpdateCmd('STATUS_ZONE', $STATUS_ZONE); break; case 'TECHNIQUE': $STATUS_ZONE = 'TECHNIQUE'; $myhomescs->checkAndUpdateCmd('STATUS_TECH', $STATUS_ZONE); break; } // Dans le cas des Trames de la centrale if ($decrypted_trame["PL"] == '' or $decrypted_trame["PL"] == '00') { log::add('myhomescs','debug',"Centrale"); $myhomescs = myhomescs::byLogicalId('00', 'myhomescs'); switch ($decrypted_trame["value"]) { case 'DESENCLENCHEE': $ALARME = 0; $myhomescs->checkAndUpdateCmd('ALARME', $ALARME); break; case 'ENCLENCHEE': $ALARME = 1; $myhomescs->checkAndUpdateCmd('ALARME', $ALARME); break; case 'ACTIF': $STATUS_SYSTEME = 'ACTIF'; $myhomescs->checkAndUpdateCmd('STATUS_SYSTEME', $STATUS_SYSTEME); break; case 'EN MAINTENANCE': $STATUS_SYSTEME = 'EN MAINTENANCE'; $myhomescs->checkAndUpdateCmd('STATUS_SYSTEME', $STATUS_SYSTEME); break; case 'BATTERIE DEFAUT': $BATTERIE = 0; $myhomescs->checkAndUpdateCmd('BATTERIE', $BATTERIE); break; case 'BATTERIE OK': $BATTERIE = 1; $myhomescs->checkAndUpdateCmd('BATTERIE', $BATTERIE); break; case 'BATTERIE KO': $BATTERIE = 0; $myhomescs->checkAndUpdateCmd('BATTERIE', $BATTERIE); break; case 'PAS DE RESEAU': $ALIMENTATION = 0; $myhomescs->checkAndUpdateCmd('ALIMENTATION', $ALIMENTATION); break; case 'RESEAU OK': $ALIMENTATION = 1; $myhomescs->checkAndUpdateCmd('ALIMENTATION', $ALIMENTATION); break; default: log::add('myhomescs','error', "Unknown centrale status : ".$decrypted_trame["value"]); break; } } $logMessage = ($decrypted_trame["param"] == 0) ? "Request response for Zone $zone, status: " : "Event for Dry contact $zone, status: "; $logMessage .= $decrypted_trame["value"]; log::add('myhomescs','debug',$logMessage); } public static function updateStatusDryContact($decrypted_trame) { /* // FONCTION : MISE A JOUR CEN PLUS // PARAMS : $decrypted_trame = array( "trame" => string, "format" => 'string', "type" => 'string', "value" => string, "dimension" => string, "param" => string, "A" => string, "PL" => string,) */ $myhomescs = myhomescs::byLogicalId($decrypted_trame["A"].$decrypted_trame["PL"], 'myhomescs'); $family = $myhomescs->getConfiguration('family'); $date = strtotime($decrypted_trame["date"]); log::add('myhomescs','debug',"LogicalID : ".$decrypted_trame["A"].$decrypted_trame["PL"]." date : ".$date." family : ".$family); $contactNumber = $decrypted_trame["PL"]; switch ($decrypted_trame["value"]) { case 'ON': $status = 1; break; case 'OFF': $status = 0; break; default: log::add('myhomescs','error', "Unknown dry contact status : ".$decrypted_trame["value"]); $status = 0; break; } $logMessage = ($decrypted_trame["param"] == 0) ? "Request response for Dry contact $contactNumber, status: " : "Event for Dry contact $contactNumber, status: "; $logMessage .= $decrypted_trame["value"]; $myhomescs->checkAndUpdateCmd('status', $status); log::add('myhomescs','debug',$logMessage); } public static function updateStatusCENPlus($decrypted_trame) { /* // FONCTION : MISE A JOUR CEN PLUS // PARAMS : $decrypted_trame = array( "trame" => string, "format" => 'string', "type" => 'string', "value" => string, "dimension" => string, "param" => string, "A" => string, "PL" => string,) */ $myhomescs = myhomescs::byLogicalId($decrypted_trame["A"].$decrypted_trame["PL"], 'myhomescs'); $family = $myhomescs->getConfiguration('family'); $date = strtotime($decrypted_trame["date"]); log::add('myhomescs','debug',"LogicalID : ".$decrypted_trame["A"].$decrypted_trame["PL"]." date : ".$date." family : ".$family); $pushButton = $decrypted_trame["param"]; $cenNumber = $decrypted_trame["PL"]; $action = $decrypted_trame["value"]; $myhomescs->checkAndUpdateCmd($pushButton, $action); log::add('myhomescs','debug',"Pushbutton ".$pushButton." -> ".$action); } public static function updateStatusEnergy($decrypted_trame) { /* // FONCTION : MISE A JOUR ENERGIE // PARAMS : $decrypted_trame = array( "trame" => string, "format" => 'string', "type" => 'string', "value" => string, "dimension" => string, "param" => string, "A" => string, "PL" => string,) */ //Creation des variables utiles $myhomescs = myhomescs::byLogicalId($decrypted_trame["A"].$decrypted_trame["PL"], 'myhomescs'); $family = $myhomescs->getConfiguration('family'); $device_type = explode('::', $myhomescs->getConfiguration('device')); $deviceType = $device_type[0]; //On recupere la date de l'action $date = strtotime($decrypted_trame["date"]); $dimension = $decrypted_trame["dimension"]; //recuperation du unit principale de sauvegarde des status log::add('myhomescs','debug',"LogicalID : ".$decrypted_trame["A"].$decrypted_trame["PL"]." date : ".$date." family : ".$family); if ($dimension == 'ACTIVE_POWER') { $myhomescspower = $myhomescs->getCmd('info', 'power'); $power = $decrypted_trame["value"]; log::add('myhomescs', 'debug', "Dimension POWER"); log::add('myhomescs', 'debug', "Retour d'état puissance instantanée\n"); log::add('myhomescs', 'debug', "Valeur = $power\n"); $myhomescspower->setConfiguration('updatedate',NULL); $myhomescspower->setConfiguration('returnStateValue',$power); $myhomescspower->setConfiguration('returnStateTime',NULL); $myhomescspower->event($power); $myhomescspower->save(); } elseif ($dimension == 'PARTIAL_DAY_TOTAL') { $myhomescsconsumption = $myhomescs->getCmd('info', 'consumption'); $consumption = $decrypted_trame["value"]; log::add('myhomescs', 'debug', "Dimension PARTIAL_DAY_TOTAL"); log::add('myhomescs', 'debug', "Cumul de consomation pour la journée en cours\n"); log::add('myhomescs', 'debug', "Valeur = $consumption\n"); $myhomescsconsumption->setConfiguration('updatedate',NULL); $myhomescsconsumption->setConfiguration('returnStateValue',$consumption); $myhomescsconsumption->setConfiguration('returnStateTime',NULL); $myhomescsconsumption->event($consumption); $myhomescsconsumption->save(); } elseif ($dimension == 'HOURLY_TOTALIZER') { $myhomescsconsumptionhistory = $myhomescs->getCmd('info', 'consumption_history'); list($tag, $consumption_history) = explode("*", $decrypted_trame["value"]); $param = $decrypted_trame["param"]; array_push($param,$tag); //On ignore l'heure 25 qui est le cumul de la journée if ($param[2] != 25) { $record_hour = $param[2] - 1; $now = new DateTime; $consumption_history_date = DateTime::createFromFormat("Y-m-d H:i:s", $now->format("Y-").$param[0]."-".$param[1]." ".$record_hour.":00:00"); if ($consumption_history_date > $now) { $consumption_history_date->modify('-1 year'); } log::add('myhomescs', 'debug', "Dimension HOURLY_TOTALIZER"); log::add('myhomescs', 'debug', "Cumul de consomation historique pour ".$consumption_history_date->format("Y-m-d H:i:s")." : ".$consumption_history." Wh.\n"); $myhomescsconsumptionhistory->addHistoryValue($consumption_history,$_datetime = $consumption_history_date->format("Y-m-d H:i:s")); } } } public static function updateStatusManagement($decrypted_trame) { /* // FONCTION : MISE A JOUR Management // Romdev // PARAMS : $decrypted_trame = array( "trame" => string, "format" => 'string', "type" => 'string', "value" => string, "dimension" => string, "param" => string, "A" => string, "PL" => string,) */ //Creation des variables utiles $myhomescs = myhomescs::byLogicalId("WEBSERVER", 'myhomescs'); $family = $myhomescs->getConfiguration('family'); $device_type = explode('::', $myhomescs->getConfiguration('device')); $deviceType = $device_type[0]; //On recupere la date de l'action $date = strtotime($decrypted_trame["date"]); $dimension = $decrypted_trame["dimension"]; //recuperation du unit principale de sauvegarde des status log::add('myhomescs','debug',"LogicalID : ".$decrypted_trame["A"].$decrypted_trame["PL"]." date : ".$date." family : ".$family); if ($dimension == 'TIME') { $TIME = explode("*", $decrypted_trame["value"]); $myhomescs->checkAndUpdateCmd('TIME', $TIME[0].":".$TIME[1].":".$TIME[2]." - GMT+".$TIME[3]); log::add('myhomescs', 'debug', "Status mis à jour TIME : " .$TIME[0].":".$TIME[1].":".$TIME[2]." - GMT+".$TIME[3]); $myhomescs->save(); } elseif ($dimension == 'DATE') { $DATE = explode("*", $decrypted_trame["value"]); $myhomescs->checkAndUpdateCmd('DATE', $DATE[1]."/".$DATE[2]."/".$DATE[3]." - Jour".$DATE[0]."/7"); log::add('myhomescs', 'debug', "Status mis à jour DATE : " .$DATE[1]."/".$DATE[2]."/".$DATE[3]." - Jour".$DATE[0]."/7"); $myhomescs->save(); } elseif ($dimension == 'IP') { $IP = explode("*", $decrypted_trame["value"]); $myhomescs->checkAndUpdateCmd('IP', $IP[0].".".$IP[1].".".$IP[2].".".$IP[3]); log::add('myhomescs', 'debug', "Status mis à jour IP : " .$IP[0].".".$IP[1].".".$IP[2].".".$IP[3]); $myhomescs->save(); } elseif ($dimension == 'NETMASK') { $NETMASK = explode("*", $decrypted_trame["value"]); $myhomescs->checkAndUpdateCmd('NETMASK', $NETMASK[0].".".$NETMASK[1].".".$NETMASK[2].".".$NETMASK[3]); log::add('myhomescs', 'debug', "Status mis à jour NETMASK : " .$NETMASK[0].".".$NETMASK[1].".".$NETMASK[2].".".$NETMASK[3]); $myhomescs->save(); } elseif ($dimension == 'MAC ADDRESS') { $MACADDRESS = explode("*", $decrypted_trame["value"]); $myhomescs->checkAndUpdateCmd('MAC ADDRESS', $MACADDRESS[0].".".$MACADDRESS[1].".".$MACADDRESS[2].".".$MACADDRESS[3].".".$MACADDRESS[4].".".$MACADDRESS[5]); log::add('myhomescs', 'debug', "Status mis à jour MAC ADDRESS : " .$MACADDRESS[0].".".$MACADDRESS[1].".".$MACADDRESS[2].".".$MACADDRESS[3].".".$MACADDRESS[4].".".$MACADDRESS[5]); $myhomescs->save(); } elseif ($dimension == 'MODEL') { $MODEL= $decrypted_trame["value"]; $myhomescs->checkAndUpdateCmd('MODEL', $MODEL); log::add('myhomescs', 'debug', "Status mis à jour MODEL : " .$MODEL); $myhomescs->save(); } elseif ($dimension == 'FIRMWARE') { $FIRMWARE = explode("*", $decrypted_trame["value"]); $myhomescs->checkAndUpdateCmd('FIRMWARE', $FIRMWARE[0].".".$FIRMWARE[1].".".$FIRMWARE[2]); log::add('myhomescs', 'debug', "Status mis à jour FIRMWARE : " .$FIRMWARE[0].".".$FIRMWARE[1].".".$FIRMWARE[2]); $myhomescs->save(); } elseif ($dimension == 'UPTIME') { $UPTIME = explode("*", $decrypted_trame["value"]); $myhomescs->checkAndUpdateCmd('UPTIME', $UPTIME[0]."d".$UPTIME[1]."h".$UPTIME[2]."m".$UPTIME[3]."s"); log::add('myhomescs', 'debug', "Status mis à jour UPTIME : " .$UPTIME[0]."d".$UPTIME[1]."h".$UPTIME[2]."m".$UPTIME[3]."s"); $myhomescs->save(); } elseif ($dimension == 'DATE AND TIME') { $DAT = explode("*", $decrypted_trame["value"]); $myhomescs->checkAndUpdateCmd('DATE AND TIME', $DAT[0].":".$DAT[1].":".$DAT[2]." - GMT+".$DAT[3]." - Jour".$DAT[4]."/7 - ".$DAT[5]."/".$DAT[6]."/".$DAT[7]); log::add('myhomescs', 'debug', "Status mis à jour DATE AND TIME : " .$DAT[0].":".$DAT[1].":".$DAT[2]." - GMT+".$DAT[3]." - Jour".$DAT[4]."/7 - ".$DAT[5]."/".$DAT[6]."/".$DAT[7]); $myhomescs->save(); } elseif ($dimension == 'KERNEL') { $KERNEL= explode("*", $decrypted_trame["value"]); $myhomescs->checkAndUpdateCmd('KERNEL', $KERNEL[0].".".$KERNEL[1].".".$KERNEL[2]); log::add('myhomescs', 'debug', "Status mis à jour KERNEL : " .$KERNEL[0].".".$KERNEL[1].".".$KERNEL[2]); $myhomescs->save(); } elseif ($dimension == 'DISTRIBUTION VERSION') { $DV= explode("*", $decrypted_trame["value"]); $myhomescs->checkAndUpdateCmd('DISTRIBUTION VERSION', $DV[0].".".$DV[1].".".$DV[2]); log::add('myhomescs', 'debug', "Status mis à jour DISTRIBUTION VERSION : " .$DV[0].".".$DV[1].".".$DV[2]); $myhomescs->save(); } } public static function updateStatusLight($decrypted_trame) { /* // FONCTION : MISE A JOUR DU STATUS DES LIGHTS // PARAMS : $decrypted_trame = array( "trame" => string, "format" => 'string', "type" => 'string', "value" => string, "dimension" => string, "param" => string, "A" => string, "PL" => string,) */ //Creation des variables utiles $myhomescs = myhomescs::byLogicalId($decrypted_trame["A"].$decrypted_trame["PL"], 'myhomescs'); $family = $myhomescs->getConfiguration('family'); $device_type = explode('::', $myhomescs->getConfiguration('device')); $deviceType = $device_type[0]; //On recupere la date de l'action $date = strtotime($decrypted_trame["date"]); //recuperation du unit principale de sauvegarde des status //$myhomescscmd = $myhomescs->getCmd('info', 'status'); $myhomescscmdnum = $myhomescs->getCmd('info', 'statusnum'); $status = NULL; $statusnum = NULL; log::add('myhomescs','debug',"LogicalID : ".$decrypted_trame["A"].$decrypted_trame["PL"]." date : ".$date." family : ".$family); //Allumage if ($decrypted_trame["value"] == 'ON') { $status = 'ON'; if($deviceType == 'Switch'){ $statusnum = 99; }else{ $statusnum = 100; } if ($family == 'DIMMER') { log::add('myhomescs','debug',"family type = DIMMER, Check Light Status"); $Lightstatus="*#1*".$decrypted_trame["A"].$decrypted_trame["PL"]."##"; sleep(4); myhomescs::send_trame($Lightstatus); } } //Extinction else if ($decrypted_trame["value"] == 'OFF') { $status = 'OFF'; $statusnum = 0; } else if ($decrypted_trame["value"] === NULL || $decrypted_trame["value"] === 'NULL') { $status = 'ON'; $statusnum = $decrypted_trame["value"]; } else { $status = 'ON'; $statusnum = $decrypted_trame["value"]*10; } //on n'a pas trouve le nouveau status, erreur dans la trame ? if ($statusnum === NULL || $statusnum === 'NULL') { if($decrypted_trame["dimension"] == 'GET_SET_DIMMMING_AND_SPEED'){ if($decrypted_trame["param"] != NULL){ $numVal = substr($decrypted_trame["param"],0,3); $status = 'ON'; $statusnum = ($numVal-100); }else{ return; } }else{ return; } } log::add('myhomescs','debug',"mise a jour du status : ".$statusnum."\n"); //$myhomescscmd->event($status); $myhomescscmdnum->event($statusnum); } public static function updateStatusShutter($decrypted_trame) { /* // FONCTION : MISE A JOUR DU STATUS DES VOLETS // PARAMS : $decrypted_trame = array( "trame" => string, "format" => 'string', "type" => 'string', "value" => string, "dimension" => string, "param" => string, "A" => string, "PL" => string,) */ //Creation des variables utiles $myhomescs = myhomescs::byLogicalId($decrypted_trame["A"].$decrypted_trame["PL"], 'myhomescs'); $device_type = explode('::', $myhomescs->getConfiguration('device')); $sousdevice = $device_type[1]; //On recupere la date de l'action et on ajoute le temps du relais interne $date = strtotime($decrypted_trame["date"]); //recuperation du derniere etat connu ET des possibilites $myhomescscmd = $myhomescs->getCmd('info', 'status'); $duree_cmd = $myhomescscmd->getConfiguration('DureeCmd'); $last_status = $myhomescscmd->execCmd(null,2); $myhomescscmdnum = $myhomescs->getCmd('info', 'statusnum'); $updatedate=$myhomescscmd->getConfiguration('updatedate'); log::add('myhomescs','debug',' last : '.$last_status.' Sous_device : '.$sousdevice. ' duréecmd : '.$duree_cmd.' id cmd : '.$myhomescscmd->getId() . " date : ".$date); //on test s'il faut faire un update des statuts if ($decrypted_trame["value"] == 'MOVE_UP' || $decrypted_trame["value"] == 'MOVE_DOWN' || $decrypted_trame["value"] == 'MOVE_STOP' || $decrypted_trame["value"] == 'UP_ADVANCED' || $decrypted_trame["value"] == 'DOWN_ADVANCED' || $decrypted_trame["value"] == 'STOP_ADVANCED') { $value = $decrypted_trame["value"]; //Il ne s'agit pas d'une mise à jour } elseif (!is_null($decrypted_trame["dimension"])) { $dimension = $decrypted_trame["dimension"]; } //gestion des temps ouverture/fermeture en fonction de la date if (is_numeric($duree_cmd)) { $move_time = $duree_cmd; } else { $move_time = 30; } //mise a jour en fonction du mouvement demande log::add('myhomescs','debug',' sousdevice : '.$sousdevice.' LogicalID : '.$decrypted_trame["A"].$decrypted_trame["PL"]. " updatedate : ".$updatedate); if ($sousdevice =='00') { //Si il s'agit d'un bouton normal log::add('myhomescs', 'debug', " Bouton normal \n"); if ($value == 'MOVE_UP') { log::add('myhomescs', 'debug', "Action MOVE_UP"); //Si le volet est en train de monter if ($last_status == 'UP') { $status = 'UP'; $new_pos= ($move_time - ($updatedate - $date))/$move_time*100; $statusnum = round($new_pos); if ($new_pos >= 100) { $status = 'OPEN'; $statusnum = 100; $myhomescscmd->setConfiguration('updatedate',NULL); $myhomescscmd->setConfiguration('returnStateValue',NULL); $myhomescscmd->setConfiguration('returnStateTime',NULL); $myhomescscmdnum->setConfiguration('updatedate',NULL); $myhomescscmdnum->setConfiguration('returnStateValue',NULL); $myhomescscmdnum->setConfiguration('returnStateTime',NULL); } //Si le volet est deja en haut } elseif ($last_status == '100' || $last_status == 'OPEN') { $status = 'OPEN'; $statusnum = 100; //Si le volet change de sens } elseif ($last_status == 'DOWN') { $status = 'UP'; $new_pos = ($move_time - ($updatedate - $date))/$move_time*100; $statusnum = round(100-$new_pos); if ((100-$new_pos) <= 0) { $statusnum = 0; $myhomescscmd->setConfiguration('updatedate',NULL); $myhomescscmd->setConfiguration('returnStateValue',NULL); $myhomescscmd->setConfiguration('returnStateTime',NULL); $myhomescscmdnum->setConfiguration('updatedate',NULL); $myhomescscmdnum->setConfiguration('returnStateValue',NULL); $myhomescscmdnum->setConfiguration('returnStateTime',NULL); } $sec=date("s"); if ($updatedate<$date) { $myhomescscmd->setConfiguration('updatedate',NULL); $myhomescscmdnum->setConfiguration('updatedate',NULL); $myhomescscmd->save(); $myhomescscmdnum->save(); $updatedate=0; } $move_time = round($new_pos/100*$move_time); $move_time_quotient = floor($move_time/60); log::add('myhomescs', 'debug', " Move time : ".$move_time); $myhomescscmd->setConfiguration('updatedate',$date+$move_time); $myhomescscmd->setConfiguration('returnStateValue','OPEN'); $myhomescscmdnum->setConfiguration('updatedate',$date+$move_time); $myhomescscmdnum->setConfiguration('returnStateValue',100); $nextupdate= 1+$move_time_quotient; $myhomescscmd->setConfiguration('returnStateTime',$nextupdate); $myhomescscmdnum->setConfiguration('returnStateTime',$nextupdate); //Si le volet est en position intermediaire ou completement ferme } elseif (is_numeric($last_status) || $last_status == 'CLOSED') { if ($last_status == 'CLOSED') { $last_status = 0; } $status = 'UP'; $statusnum = $last_status; $sec=date("s"); log::add('myhomescs', 'debug', "Point ".$status); $move_time = $move_time - ($last_status/100*$move_time); $move_time_quotient = floor($move_time/60); log::add('myhomescs', 'debug', " Move time : ".$move_time); $myhomescscmd->setConfiguration('updatedate',$date+$move_time); $myhomescscmd->setConfiguration('returnStateValue','OPEN'); $myhomescscmdnum->setConfiguration('updatedate',$date+$move_time); $myhomescscmdnum->setConfiguration('returnStateValue',100); $nextupdate= 1+$move_time_quotient; $myhomescscmd->setConfiguration('returnStateTime',$nextupdate); $myhomescscmdnum->setConfiguration('returnStateTime',$nextupdate); } else { $status = 'OPEN'; $statusnum = 100; } } elseif ($value == 'MOVE_DOWN') { log::add('myhomescs', 'debug', "Action move_DOWN"); //Si le volet est en train de descendre if ($last_status == 'DOWN') { $status = 'DOWN'; $new_pos= ($move_time - ($updatedate - $date))/$move_time*100; $statusnum = round(100-$new_pos); if ((100-$new_pos) <= 0) { $status = 'CLOSED'; $statusnum = 0; $myhomescscmd->setConfiguration('updatedate',NULL); $myhomescscmd->setConfiguration('returnStateValue',NULL); $myhomescscmd->setConfiguration('returnStateTime',NULL); $myhomescscmdnum->setConfiguration('updatedate',NULL); $myhomescscmdnum->setConfiguration('returnStateValue',NULL); $myhomescscmdnum->setConfiguration('returnStateTime',NULL); } //Si le volet est deja en bas } elseif ($last_statusnum == '0' || $last_status == 'CLOSED') { $status = 'CLOSED'; $statusnum = 0; log::add('myhomescs', 'debug', "last_status : $last_status, status : ".$status); //Si le volet change de sens } elseif ($last_status == 'UP') { $status = 'DOWN'; $new_pos = ($move_time - ($updatedate - $date))/$move_time*100; $statusnum = round($new_pos); if (($new_pos) >= 100) { $statusnum = 100; $myhomescscmd->setConfiguration('updatedate',NULL); $myhomescscmd->setConfiguration('returnStateValue',NULL); $myhomescscmd->setConfiguration('returnStateTime',NULL); $myhomescscmdnum->setConfiguration('updatedate',NULL); $myhomescscmdnum->setConfiguration('returnStateValue',NULL); $myhomescscmdnum->setConfiguration('returnStateTime',NULL); } $sec=date("s"); $updatedate=$myhomescscmd->getConfiguration('updatedate'); if ($updatedate<$date) { $myhomescscmd->setConfiguration('updatedate',NULL); $myhomescscmdnum->setConfiguration('updatedate',NULL); $myhomescscmd->save(); $myhomescscmdnum->save(); $updatedate=0; } $move_time = round($new_pos/100*$move_time); log::add('myhomescs', 'debug', " Move time : ".$move_time." New_pos : ".$new_pos); $move_time_quotient = floor($move_time/60); log::add('myhomescs', 'debug', " Move time : ".$move_time); $myhomescscmd->setConfiguration('updatedate',$date+$move_time); $myhomescscmd->setConfiguration('returnStateValue','CLOSED'); $myhomescscmdnum->setConfiguration('updatedate',$date+$move_time); $myhomescscmdnum->setConfiguration('returnStateValue',0); $nextupdate= 1+$move_time_quotient; $myhomescscmd->setConfiguration('returnStateTime',$nextupdate); $myhomescscmdnum->setConfiguration('returnStateTime',$nextupdate); log::add('myhomescs', 'debug', " Move time : ".$move_time); //Si le volet est arrete en position intermediaire ou completement ouvert } elseif (is_numeric($last_status) || $last_status == 'OPEN') { if ($last_status == 'OPEN') { $last_status = 100; } $status = 'DOWN'; $statusnum = $last_status; $sec=date("s"); log::add('myhomescs', 'debug', "Point ".$status."sec : ".$sec."movetime : ".$move_time); $move_time = ($last_status/100*$move_time); $move_time_quotient = floor($move_time/60); log::add('myhomescs', 'debug', " Move time : ".$move_time); $myhomescscmd->setConfiguration('updatedate',$date+$move_time); $myhomescscmd->setConfiguration('returnStateValue','CLOSED'); $myhomescscmdnum->setConfiguration('updatedate',$date+$move_time); $myhomescscmdnum->setConfiguration('returnStateValue',0); $nextupdate= 1+$move_time_quotient; $myhomescscmd->setConfiguration('returnStateTime',$nextupdate); $myhomescscmdnum->setConfiguration('returnStateTime',$nextupdate); log::add('myhomescs', 'debug', " Move time : ".$move_time); } else { $status = 'CLOSED'; $statusnum = 0; } } elseif ($value == 'MOVE_STOP') { log::add('myhomescs', 'debug', "Action move_STOP"); //Par defaut on dit que le volet est arrete et donc à son ancienne position $status = $last_status; log::add('myhomescs','debug',"mise a jour du status : ".$statusnum."\n"); if (!is_numeric($laststatus)) { $statusnum = $status; } if ($status == 'OPEN') { $statusnum = 100; } log::add('myhomescs', 'debug', "last_status : $last_status, status : ".$status); $updatedate=$myhomescscmd->getConfiguration('updatedate'); //Si le volet est deja en mouvement if (!is_numeric($last_status) && (isset($updatedate))) { $new_pos = ($move_time - ($updatedate - $date))/$move_time*100; log::add('myhomescs', 'debug', " updatedate : ".$updatedate." Newpos : ".$new_pos); if ($last_status == 'UP') { $status = round($new_pos); $statusnum = round($new_pos); log::add('myhomescs', 'debug', "last_status : Up, status : ".$status); log::add('myhomescs', 'debug', "last_status : $last_statusnum, status : ".$statusnum); $myhomescscmd->setConfiguration('returnStateValue',$status); $myhomescscmd->setConfiguration('returnStateTime',1); $myhomescscmdnum->setConfiguration('returnStateValue',$statusnum); $myhomescscmdnum->setConfiguration('returnStateTime',1); } elseif ($last_status == 'DOWN') { $status = round(100 - $new_pos); $statusnum = round(100 - $new_pos); log::add('myhomescs', 'debug', "last_status : Down, status : ".$status); $myhomescscmd->setConfiguration('returnStateValue',$status); $myhomescscmd->setConfiguration('returnStateTime',1); $myhomescscmdnum->setConfiguration('returnStateValue',$statusnum); $myhomescscmdnum->setConfiguration('returnStateTime',1); } if (($status <= 0) && ($updatedate <> 0)) { $status = 'CLOSED'; $last_status = 'CLOSED'; $statusnum = 0; $myhomescscmd->setConfiguration('updatedate',NULL); $myhomescscmd->setConfiguration('returnStateValue','CLOSED'); $myhomescscmd->setConfiguration('returnStateTime',NULL); $myhomescscmdnum->setConfiguration('updatedate',NULL); $myhomescscmdnum->setConfiguration('returnStateValue',0); $myhomescscmdnum->setConfiguration('returnStateTime',NULL); $myhomescscmd->save(); $myhomescscmdnum->save(); } elseif (($status >= 100) && ($updatedate <> 0)) { $status = 'OPEN'; $last_status = 'OPEN'; $statusnum = 100; $myhomescscmd->setConfiguration('updatedate',NULL); $myhomescscmd->setConfiguration('returnStateValue','OPEN'); $myhomescscmd->setConfiguration('returnStateTime',NULL); $myhomescscmdnum->setConfiguration('updatedate',NULL); $myhomescscmdnum->setConfiguration('returnStateValue',100); $myhomescscmdnum->setConfiguration('returnStateTime',NULL); } } } $myhomescscmd->save(); $myhomescscmdnum->save(); } elseif ($sousdevice == '01') { //Si il s'agit d'un bouton inversé log::add('myhomescs', 'debug', "Bouton Inversé ...\n"); if ($value == 'MOVE_UP') { log::add('myhomescs', 'debug', "Action move_UP"); //Si le volet est en train de descendre if ($last_status == 'DOWN') { $status = 'DOWN'; $new_pos= ($move_time - ($updatedate - $date))/$move_time*100; $statusnum = round(100-$new_pos); if ((100-$new_pos) <= 0) { $status = 'CLOSED'; $statusnum = 0; $myhomescscmd->setConfiguration('updatedate',NULL); $myhomescscmd->setConfiguration('returnStateValue',NULL); $myhomescscmd->setConfiguration('returnStateTime',NULL); $myhomescscmdnum->setConfiguration('updatedate',NULL); $myhomescscmdnum->setConfiguration('returnStateValue',NULL); $myhomescscmdnum->setConfiguration('returnStateTime',NULL); } //Si le volet est deja en bas } elseif ($last_status == '0' || $last_status == 'CLOSED') { $status = 'CLOSED'; $statusnum = 0; //Si le volet change de sens } elseif ($last_status == 'UP') { $status = 'DOWN'; $new_pos = ($move_time - ($updatedate - $date))/$move_time*100; $statusnum = round($new_pos); if (($new_pos) >= 100) { $statusnum = 100; $myhomescscmd->setConfiguration('updatedate',NULL); $myhomescscmd->setConfiguration('returnStateValue',NULL); $myhomescscmd->setConfiguration('returnStateTime',NULL); $myhomescscmdnum->setConfiguration('updatedate',NULL); $myhomescscmdnum->setConfiguration('returnStateValue',NULL); $myhomescscmdnum->setConfiguration('returnStateTime',NULL); } $sec=date("s"); $updatedate=$myhomescscmd->getConfiguration('updatedate'); if ($updatedate<$date) { $myhomescscmd->setConfiguration('updatedate',NULL); $myhomescscmdnum->setConfiguration('updatedate',NULL); $myhomescscmd->save(); $myhomescscmdnum->save(); $updatedate=0; } $move_time = round($new_pos/100*$move_time); log::add('myhomescs', 'debug', " Move time : ".$move_time." New_pos : ".$new_pos); $move_time_quotient = floor($move_time/60); log::add('myhomescs', 'debug', " Move time : ".$move_time); $myhomescscmd->setConfiguration('updatedate',$date+$move_time); $myhomescscmd->setConfiguration('returnStateValue','CLOSED'); $myhomescscmdnum->setConfiguration('updatedate',$date+$move_time); $myhomescscmdnum->setConfiguration('returnStateValue',0); $nextupdate= 1+$move_time_quotient; $myhomescscmd->setConfiguration('returnStateTime',$nextupdate); $myhomescscmdnum->setConfiguration('returnStateTime',$nextupdate); log::add('myhomescs', 'debug', " Move time : ".$move_time); //Si le volet est en position intermediaire ou completement ouvert } elseif (is_numeric($last_status) || $last_status == 'OPEN') { if ($last_status == 'OPEN') { $last_status = 100; } $status = 'DOWN'; $statusnum = $last_status; $sec=date("s"); log::add('myhomescs', 'debug', "Point ".$status."sec : ".$sec."movetime : ".$move_time); $move_time = ($last_status/100*$move_time); $move_time_quotient = floor($move_time/60); log::add('myhomescs', 'debug', " Move time : ".$move_time); $myhomescscmd->setConfiguration('updatedate',$date+$move_time); $myhomescscmd->setConfiguration('returnStateValue','CLOSED'); $myhomescscmdnum->setConfiguration('updatedate',$date+$move_time); $myhomescscmdnum->setConfiguration('returnStateValue',0); $nextupdate= 1+$move_time_quotient; $myhomescscmd->setConfiguration('returnStateTime',$nextupdate); $myhomescscmdnum->setConfiguration('returnStateTime',$nextupdate); log::add('myhomescs', 'debug', " Move time : ".$move_time); } else { $status = 'CLOSED'; $statusnum = 0; } } elseif ($value == 'MOVE_DOWN') { log::add('myhomescs', 'debug', "Action move_DOWN"); //Si le volet est en train de monter if ($last_status == 'UP') { $status = 'UP'; $new_pos= ($move_time - ($updatedate - $date))/$move_time*100; $statusnum = round($new_pos); if ($new_pos >= 100) { $status = 'OPEN'; $statusnum = 100; $myhomescscmd->setConfiguration('updatedate',NULL); $myhomescscmd->setConfiguration('returnStateValue',NULL); $myhomescscmd->setConfiguration('returnStateTime',NULL); $myhomescscmdnum->setConfiguration('updatedate',NULL); $myhomescscmdnum->setConfiguration('returnStateValue',NULL); $myhomescscmdnum->setConfiguration('returnStateTime',NULL); } //Si le volet est deja en haut } elseif ($last_status == '100' || $last_status == 'OPEN') { $status = 'OPEN'; $statusnum = 100; //Si le volet change de sens } elseif ($last_status == 'DOWN') { $status = 'UP'; $new_pos = ($move_time - ($updatedate - $date))/$move_time*100; $statusnum = round(100-$new_pos); if ((100-$new_pos) <= 0) { $statusnum = 0; $myhomescscmd->setConfiguration('updatedate',NULL); $myhomescscmd->setConfiguration('returnStateValue',NULL); $myhomescscmd->setConfiguration('returnStateTime',NULL); $myhomescscmdnum->setConfiguration('updatedate',NULL); $myhomescscmdnum->setConfiguration('returnStateValue',NULL); $myhomescscmdnum->setConfiguration('returnStateTime',NULL); } $sec=date("s"); $updatedate=$myhomescscmd->getConfiguration('updatedate'); if ($updatedate<$date) { $myhomescscmd->setConfiguration('updatedate',NULL); $myhomescscmdnum->setConfiguration('updatedate',NULL); $myhomescscmd->save(); $myhomescscmdnum->save(); $updatedate=0; } $move_time = round($new_pos/100*$move_time); $move_time_quotient = floor($move_time/60); log::add('myhomescs', 'debug', " Move time : ".$move_time); $myhomescscmd->setConfiguration('updatedate',$date+$move_time); $myhomescscmd->setConfiguration('returnStateValue','OPEN'); $myhomescscmdnum->setConfiguration('updatedate',$date+$move_time); $myhomescscmdnum->setConfiguration('returnStateValue',100); $nextupdate= 1+$move_time_quotient; $myhomescscmd->setConfiguration('returnStateTime',$nextupdate); $myhomescscmdnum->setConfiguration('returnStateTime',$nextupdate); //Si le volet est arrete en position intermediaire ou completement fermé } elseif (is_numeric($last_status) || $last_status == 'CLOSED') { if ($last_status == 'CLOSED') { $last_status = 0; } $status = 'UP'; $statusnum = $last_status; $sec=date("s"); log::add('myhomescs', 'debug', "Point ".$status); $move_time = $move_time - ($last_status/100*$move_time); $move_time_quotient = floor($move_time/60); log::add('myhomescs', 'debug', " Move time : ".$move_time); $myhomescscmd->setConfiguration('updatedate',$date+$move_time); $myhomescscmd->setConfiguration('returnStateValue','OPEN'); $myhomescscmdnum->setConfiguration('updatedate',$date+$move_time); $myhomescscmdnum->setConfiguration('returnStateValue',100); $nextupdate= 1+$move_time_quotient; $myhomescscmd->setConfiguration('returnStateTime',$nextupdate); $myhomescscmdnum->setConfiguration('returnStateTime',$nextupdate); } } elseif ($value == 'MOVE_STOP') { log::add('myhomescs', 'debug', "Action move_STOP"); //Par defaut on dit que le volet est arrete et donc à son ancienne position $status = $last_status; $updatedate=$myhomescscmd->getConfiguration('updatedate'); //Si le volet est deja en mouvement if (!is_numeric($last_status) && isset($updatedate)) { $new_pos = ($move_time - ($updatedate - $date))/$move_time*100; log::add('myhomescs', 'debug', " updatedate : ".$updatedate." Newpos : ".$new_pos); if ($last_status == 'UP') { $status = round($new_pos); $statusnum = round($new_pos); log::add('myhomescs', 'debug', "last_status : Up, status : ".$status); $myhomescscmd->setConfiguration('returnStateValue',$status); $myhomescscmd->setConfiguration('returnStateTime',1); $myhomescscmdnum->setConfiguration('returnStateValue',$statusnum); $myhomescscmdnum->setConfiguration('returnStateTime',1); } elseif ($last_status == 'DOWN') { $status = round(100 - $new_pos); $statusnum = round(100 - $new_pos); log::add('myhomescs', 'debug', "last_status : Down, status : ".$status); $myhomescscmd->setConfiguration('returnStateValue',$status); $myhomescscmd->setConfiguration('returnStateTime',1); $myhomescscmdnum->setConfiguration('returnStateValue',$statusnum); $myhomescscmdnum->setConfiguration('returnStateTime',1); } if ($status <= 0) { $status = 'CLOSED'; $statusnum = 0; $myhomescscmd->setConfiguration('updatedate',NULL); $myhomescscmd->setConfiguration('returnStateValue',NULL); $myhomescscmd->setConfiguration('returnStateTime',NULL); $myhomescscmdnum->setConfiguration('updatedate',NULL); $myhomescscmdnum->setConfiguration('returnStateValue',NULL); $myhomescscmdnum->setConfiguration('returnStateTime',NULL); } elseif ($status >= 100) { $status = 'OPEN'; $statusnum = 100; $myhomescscmd->setConfiguration('updatedate',NULL); $myhomescscmd->setConfiguration('returnStateValue',NULL); $myhomescscmd->setConfiguration('returnStateTime',NULL); $myhomescscmdnum->setConfiguration('updatedate',NULL); $myhomescscmdnum->setConfiguration('returnStateValue',NULL); $myhomescscmdnum->setConfiguration('returnStateTime',NULL); } } else { $status = 'OPEN'; $statusnum = 100; } } $myhomescscmd->save(); $myhomescscmdnum->save(); } //mise a jour simple du bouton if ($dimension == 'SHUTTER_STATUS') { log::add('myhomescs', 'debug', "Information SHUTTER_STATUS"); log::add('myhomescs', 'debug', "Retour d'état volet avancé ".$decrypted_trame["value"]."\n"); $values = explode("*", $decrypted_trame["value"]); if ($values[0] == '10') { $statusnum = $values[1]; log::add('myhomescs', 'debug', "Valeur = $statusnum\n"); $status = ($statusnum > 0) ? 'OPEN' : 'CLOSED'; log::add('myhonmescs', 'debug', "Status = $status\n"); } $myhomescscmd->setConfiguration('updatedate',NULL); $myhomescscmd->setConfiguration('returnStateValue',$status); $myhomescscmd->setConfiguration('returnStateTime',NULL); $myhomescscmdnum->setConfiguration('updatedate',NULL); $myhomescscmdnum->setConfiguration('returnStateValue',$statusnum); $myhomescscmdnum->setConfiguration('returnStateTime',NULL); $myhomescscmd->save(); $myhomescscmdnum->save(); } log::add('myhomescs','debug',"mise a jour du status : ".$status."\n"); $myhomescscmd->event($status); $myhomescscmdnum->event($statusnum); } /* * *********************Methode d'instance************************* */ public function postSave() { if ($this->getConfiguration('applyDevice') != $this->getConfiguration('device')) { $this->applyModuleConfiguration(); } } public function applyModuleConfiguration() { $this->setConfiguration('applyDevice', $this->getConfiguration('device')); $this->save(); if ($this->getConfiguration('device') == '') { return true; } $device_type = explode('::', $this->getConfiguration('device')); $deviceref = $device_type[0]; $subtype = $device_type[1]; $device = self::devicesParameters($deviceref); if (!is_array($device)) { return true; } if (isset($device['configuration'])) { foreach ($device['configuration'] as $key => $value) { $this->setConfiguration($key, $value); $this->save(); } } if (!isset($device['subtype'][$subtype])) { if (count($device['subtype']) != 1) { return true; } $device = reset($device['subtype']); } else { $device = $device['subtype'][$subtype]; } if (isset($device['category'])) { foreach ($device['category'] as $key => $value) { $this->setCategory($key, $value); } } $cmd_order = 0; $link_cmds = array(); $link_actions = array(); foreach ($device['commands'] as $command) { $cmd = null; foreach ($this->getCmd() as $liste_cmd) { if ($liste_cmd->getLogicalId() == $command['logicalId']) { if ($liste_cmd->getConfiguration('unit') == $command['configuration']['unit']) { $cmd = $liste_cmd; break; } } } try { if ($cmd == null || !is_object($cmd)) { $cmd = new myhomescsCmd(); $cmd->setOrder($cmd_order); $cmd->setEqLogic_id($this->getId()); } else { $command['name'] = $cmd->getName(); } utils::a2o($cmd, $command); $cmd->save(); if (isset($command['value'])) { $link_cmds[$cmd->getId()] = $command['value']; } if (isset($command['configuration']) && isset($command['configuration']['updateCmdId'])) { $link_actions[$cmd->getId()] = $command['configuration']['updateCmdId']; } $cmd_order++; } catch (Exception $exc) { } } if (count($link_cmds) > 0) { foreach ($this->getCmd() as $eqLogic_cmd) { foreach ($link_cmds as $cmd_id => $link_cmd) { if ($link_cmd == $eqLogic_cmd->getName()) { $cmd = cmd::byId($cmd_id); if (is_object($cmd)) { $cmd->setValue($eqLogic_cmd->getId()); $cmd->save(); } } } } } if (count($link_actions) > 0) { foreach ($this->getCmd() as $eqLogic_cmd) { foreach ($link_actions as $cmd_id => $link_action) { if ($link_action == $eqLogic_cmd->getName()) { $cmd = cmd::byId($cmd_id); if (is_object($cmd)) { $cmd->setConfiguration('updateCmdId', $eqLogic_cmd->getId()); $cmd->save(); } } } } } $this->save(); } /* * **********************Getteur Setteur*************************** */ } class myhomescsCmd extends cmd { /* * *************************Attributs****************************** */ /* * ***********************Methode static*************************** */ public static function calc_myhomescs_to_light($myhomescs_value) { /* // FONCTION : CALCUL UNE VALEUR MYHOMESCS DE LUMIERE EN POURCENTAGE // PARAMS : $myhomescs_value => string // RETOURNE : LA VALEUR EN POURCENTAGE */ // Augmentation if ($myhomescs_value < 128) { $percent = $myhomescs_value; // Diminution } else { $percent = $myhomescs_value - 256; } return $percent; } public static function calc_myhomescs_to_time($myhomescs_value) { /* // FONCTION : CALCUL UNE VALEUR MYHOMESCS D'UNE TEMPORISATION // PARAMS : $myhomescs_value => string // RETOURNE : LA VALEUR EN SECONDES */ $time = $myhomescs_value / 5; //On arrondi à la seconde supérieure $time = round($time, 0, PHP_ROUND_HALF_UP); return $time; } public static function calc_myhomescs_to_temp($myhomescs_value1, $myhomescs_value2) { /* // FONCTION : CALCUL UNE VALEUR MYHOMESCS DECOMPOSE DE TEMPERATTURE EN UNE VALEUR ENTIERE // PARAMS : $myhomescs_value1 => string, $myhomescs_value2 => string // RETOURNE : LA VALEUR EN POURCENTAGE */ //TODO : Corriger pour les valeur negative $value = ($myhomescs_value1*256)+$myhomescs_value2; return $value; } public static function myhomescsId_to_ownId($id, $unit) { /* // FONCTION : TRANSFORME UN A ET UN PL MYHOMESCS EN UN ID OPENWEBNET // PARAMS : $id=string|int,$unit=string|int // RETURN : $ownId=int */ $ownId = $id.$unit; return ($ownId); } public static function getIdMyhomescs($own_id, $who = NULL) { /* // FONCTION : RECUPERATION Du A MYHOMESCS DANS UN ID OPENWEBNET // PARAMS : $own_id=string|int // RETURN : $Id=int */ if ($who == 18 && substr($own_id, 0, 1) == 5) { $Id = "E5"; } elseif ($who == 25 && substr($own_id, 0, 1) == 3) { $Id = "D3"; } elseif ($who == 25 && substr($own_id, 0, 1) == 2) { $Id = "C2"; } elseif (substr($own_id, 0, 1) == "#") { $Id = "#"; } else { $wherelen=strlen ($own_id); $Id = substr($own_id, 0, 2); if ($Id != 00 && $Id != 10) { if ($wherelen==4) { $Id = substr($own_id, 0, 2); } else { $Id = substr($own_id, 0, 1); } } else { $Id = substr($own_id, 0, 2); } } return ($Id); } public static function getUnitMyhomescs($own_id, $who = NULL) { /* // FONCTION : RECUPERATION DU PL MYHOMESCS DANS UN ID OPENWEBNET // PARAMS : $own_id=string|int // RETURN : $Unit=int */ if ($who == 18 && substr($own_id, 0, 1) == 5) { $Unit = substr($own_id, 1); } elseif ($who == 25 && substr($own_id, 0, 1) == 2) { $Unit = substr($own_id, 1); } elseif (substr($own_id, 0, 1) == "#") { $Unit = substr($own_id, 1); } else { $wherelen=strlen ($own_id); $Id = substr($own_id, 0, 2); if ($Id != 00 && $Id != 10) { if ($wherelen==4) { $Unit = substr($own_id, -2); } else { $Unit = substr($own_id, -1); } } else { $Unit = substr($own_id, -2); } } return ($Unit); } /* * *********************Methode d'instance************************* */ public function execute($_options = null) { if ($this->getType() != 'action' || $this->getEqlogic()->getConfiguration('family') == 'CENPLUS') { return; } $logicalId = $this->getEqlogic()->getLogicalId(); $internallyCodedValues = array("D", "E"); $value = trim(str_ireplace("#WHERE#", str_ireplace($internallyCodedValues, "", $logicalId), $this->getLogicalId())); $slider_divider = $this->getEqlogic()->getConfiguration('family') == 'LIGHTING' ? 10 : 1; if (stripos($value, "#WHO#") !== false){ foreach ($this->getEqlogic()->getCategory() as $key => $enabled) { if ($enabled==1) {$category=$key;} } switch ($category) { case 'light': $who = '1'; $slider_divider = 10; break; case 'automatism': $who = '2'; break; case 'heating': $who = '4'; break; case 'security': $who = '5'; break; case 'energy': $who = '18'; break; default: $who = NULL; log::add ('myhomescs','error',"Cannot decode #WHO# if Category is 'other'"); } $value = trim(str_ireplace("#WHO#", $who, $value)); } switch ($this->getSubType()) { case 'slider': log::add ('myhomescs','debug','slider : '.$_options['slider']); $value = str_ireplace('#SLIDER#', strtoupper(intval($_options['slider']/$slider_divider)), $value); break; case 'color': $value = str_ireplace('#COLOR#', $_options['color'], $value); break; } $values = explode('&&', $value); myhomescs::send_trame($values); return TRUE; } } class myhomescs_def { //Definition des differentes trames MyHomescs possibles const OWN_TRAME = array( 'ACK' => "/^\*#\*1##$/",// *#*1## 'NACK' => "/^\*#\*0##$/",// *#*0## 'BUS_EVENT' => "/^\*(\d+)\*(1000#\d*)\*(\d*#*\d*)\**##$/",// *WHO*1000#WHAT*WHERE## 'BUS_COMMAND' => "/^\*(\d+)\*(\d*#*\d*)\*(\d*#*\d*)\**##$/",// *WHO*WHAT*WHERE## 'STATUS_REQUEST' => "/^\*#(\d+)\*(\d+#*\d*)##$/",// *#WHO*WHERE 'STATUS_RESPONSE' => "/^\*#(\d+)\*(\d+)\*(\d+#*\d*)##$/",// *#WHO*WHAT*WHERE## 'DIMENSION_REQUEST' => "/^\*#(\d+)\*(\d*#*\d*)\*(\d+)##$/",// *#WHO*WHERE*DIMENSION## 'DIMENSION_SET' => "/^\*#(\d+)\*(\d*#*\d*)\*#(\d*)\*([\d*\**]+)##$/",// *#WHO*WHERE*#DIMENSION*VAL1*VALn## 'DIMENSION_REQUEST_RESPONSE' => "/^\*#(\d+)\*(\d*#*\d*)\*(\d+(?:#\d+)*)\*([\d*\**\d*]+)##$/"//*#WHO*WHERE*DIMENSION*VAL1*VALn## ); //Definition des differents type de contenu d'une trame const OWN_TRAME_DEFINITION = array( "0" => array( "TYPE" => "scene", "1" => "EXECUTE_SCENARIO_1", "2" => "EXECUTE_SCENARIO_2", "3" => "EXECUTE_SCENARIO_3", "4" => "EXECUTE_SCENARIO_4", "5" => "EXECUTE_SCENARIO_5", "6" => "EXECUTE_SCENARIO_6", "7" => "EXECUTE_SCENARIO_7", "8" => "EXECUTE_SCENARIO_8", "9" => "EXECUTE_SCENARIO_9", "10" => "EXECUTE_SCENARIO_10", "11" => "EXECUTE_SCENARIO_11", "12" => "EXECUTE_SCENARIO_12", "13" => "EXECUTE_SCENARIO_13", "14" => "EXECUTE_SCENARIO_14", "15" => "EXECUTE_SCENARIO_15", "16" => "EXECUTE_SCENARIO_16", "17" => "EXECUTE_SCENARIO_17", "18" => "EXECUTE_SCENARIO_18", "19" => "EXECUTE_SCENARIO_19", "20" => "EXECUTE_SCENARIO_20", "21" => "EXECUTE_SCENARIO_21", "22" => "EXECUTE_SCENARIO_22", "23" => "EXECUTE_SCENARIO_23", "24" => "EXECUTE_SCENARIO_24", "25" => "EXECUTE_SCENARIO_25", "26" => "EXECUTE_SCENARIO_26", "27" => "EXECUTE_SCENARIO_27", "28" => "EXECUTE_SCENARIO_28", "29" => "EXECUTE_SCENARIO_29", "30" => "EXECUTE_SCENARIO_30", "31" => "EXECUTE_SCENARIO_31", "32" => "EXECUTE_SCENARIO_32", "40#" => "START_RECORDING_SCENARIO", "41#" => "END_RECORDING_SCENARIO", "42" => "ERASE_ALL_SCENARIO", "42#" => "ERASE_SCENARIO", "45" => "UNAVAILABLE_SCENARIOS_CENTRAL_UNIT", "46" => "MEMORY_FULL_OF_SCENARIOS_CENTRAL_UNIT" ), //0 Scenarios "1" => array( "TYPE" => "light", "0" => "OFF", "0#" => "OFF_AT_X_SPEED", "1" => "ON", "1#" => "ON_AT_X_SPEED", "2" => "2", "3" => "3", "4" => "4", "5" => "5", "6" => "6", "7" => "7", "8" => "8", "9" => "9", "10" => "10", "DIMENSION" => array( "_" => "LIGHT_STATUS_REQUEST", "1_" => "GET_SET_DIMMMING_AND_SPEED" ) ), //1 light "2" => array( "TYPE" => "automatism", "12" => "DOWN_ADVANCED", "11" => "UP_ADVANCED", "10" => "STOP_ADVANCED", "2" => "MOVE_DOWN", "1" => "MOVE_UP", "0" => "MOVE_STOP", "DIMENSION" => array( "10" => "SHUTTER_STATUS", "11" => "GOTO_LEVEL" ) ), //2 shutter "5" => array( "TYPE" => "Alarm", //Centrale "0" => "EN MAINTENANCE", "1" => "ACTIF", "8" => "ENCLENCHEE", "9" => "DESENCLENCHEE", "4" => "BATTERIE DEFAUT", "5" => "BATTERIE OK", "10" => "BATTERIE KO", "6" => "PAS DE RESEAU", "7" => "RESEAU OK", //Zones "11" => "ACTIVE", "18" => "NON ACTIVE", "15" => "INTRUSION", "16" => "SABOTAGE", "17" => "ANTI PANIC", "12" => "TECHNIQUE", ), //5 Alarm // Romdev "9" => array( "TYPE" => "Auxiliary", "0" => "OFF", "1" => "ON", ), //9 Auxiliary "13" => array( "TYPE" => "Management", "DIMENSION" => array( "0" => "TIME", "1" => "DATE", "10" => "IP", "11" => "NETMASK", "12" => "MAC ADDRESS", "15" => "MODEL", "16" => "FIRMWARE", "19" => "UPTIME", "22" => "DATE AND TIME", "23" => "KERNEL", "24" => "DISTRIBUTION VERSION", ) ), //13 Management "18" => array( "TYPE" => "energy", "DIMENSION" => array( "54" => "PARTIAL_DAY_TOTAL", "113" => "ACTIVE_POWER", "511" => "HOURLY_TOTALIZER" ) ), //18 Energy "25" => array( "TYPE" => "cenplus-drycontact", "21" => "SHORT_PRESS", "22" => "START_LONG_PRESS", "23" => "CONTINUED_LONG_PRESS", "24" => "END_LONG_PRESS", "31" => "ON", "32" => "OFF" ) //25 CEN Plus ); //Definition de la partie WHERE d'une trame const OWN_WHERE_DEFINITION = "/(\d+)?#*(\d+)?#*(\d*)$/"; //Definition des differents media const OWN_COMMUNICATION_DEFINITION = array( "" => "UNICAST", "0" => "BROADCAST", "1" => "MULTICAST" ); } ?>