updateInfo(); } } // --- Login corrigé --- public static function login($force = false) { if (cache::exist('blueswim::credentials') && !$force) { log::add('blueswim', 'debug', "Utilisation du cache d'authentification"); self::$_credentials = unserialize(cache::byKey('blueswim::credentials')->getValue()); return self::$_credentials; } $email = config::byKey('EMAIL', 'blueswim'); $pass = config::byKey('PASSWORD', 'blueswim'); log::add('blueswim', 'debug', "Tentative d'authentification"); $request_http = new com_http('https://api.riiotlabs.com/prod/user/login', array( 'post' => json_encode(array("email" => $email, "password" => $pass)), 'header' => array('Content-Type: application/json') )); try { $response = $request_http->exec(); } catch (Exception $e) { log::add('blueswim', 'error', "Impossible de s'identifier : " . $e->getMessage()); return false; } $secrets = json_decode($response, true); if (!isset($secrets["credentials"]["access_key"]) || !isset($secrets["credentials"]["secret_key"]) || !isset($secrets["credentials"]["session_token"])) { log::add('blueswim', 'error', "Impossible de s'identifier"); return false; } self::$_credentials = new Credentials( $secrets["credentials"]["access_key"], $secrets["credentials"]["secret_key"], $secrets["credentials"]["session_token"] ); cache::set('blueswim::credentials', serialize(self::$_credentials)); log::add('blueswim', 'info', "Authentification réussie"); return self::$_credentials; } // --- Appel AWS signé via com_http --- private static function awsCall($method, $url) { $credentials = self::login(); if ($credentials === false) return false; $s4 = new SignatureV4("execute-api", 'eu-west-1'); $request = new Request($method, $url); // Signer la requête $signed = $s4->signRequest($request, $credentials); // Récupérer les headers signés $headers = []; foreach ($signed->getHeaders() as $k => $v) { $headers[] = $k . ': ' . implode(', ', $v); } // Exécuter la requête avec com_http $http = new com_http($url, ['header' => $headers]); try { $response = $http->exec(); } catch (Exception $e) { log::add('blueswim', 'error', "Erreur AWS call: ".$e->getMessage()); return false; } return json_decode($response, true); } // --- Synchronisation --- public static function sync() { $blues_list = []; $swimming_pools = self::awsCall('GET', "https://api.riiotlabs.com/prod/swimming_pool?deleted=false"); if ($swimming_pools === false) return false; foreach ($swimming_pools["data"] as $pool) { $blues = self::awsCall('GET', "https://api.riiotlabs.com/prod/swimming_pool/".$pool["swimming_pool_id"]."/blue"); if ($blues === false) continue; foreach ($blues["data"] as $blue) { $blueId = $pool["name"]."-".$blue["blue_device_serial"]; $obj_blue = blueswim::byLogicalId($blueId, 'blueswim'); if (!is_object($obj_blue)) { $eqLogic = new blueswim(); $eqLogic->setName($blueId); $eqLogic->setLogicalId($blueId); $eqLogic->setEqType_name("blueswim"); $eqLogic->setConfiguration('device', $blue["blue_device"]["hw_type"] == "go" ? ($blue["blue_device"]["contract_servicePlan"]=="plus"?'bluego_premium':'bluego'):'blueplus'); $eqLogic->setConfiguration('contrat',$blue["blue_device"]["contract_servicePlan"]); $eqLogic->setConfiguration('firmware',$blue["blue_device"]["fw_version_psoc"]); $eqLogic->setConfiguration('swimming_pool_id',$pool["swimming_pool_id"]); $eqLogic->setConfiguration('blue_serial',$blue["blue_device_serial"]); $eqLogic->setStatus('lastCommunication',strtotime($blue["blue_device"]["last_measure_message"])); $eqLogic->setIsEnable(1); $eqLogic->setIsVisible(1); $eqLogic->save(); $blues_list[] = $eqLogic; log::add('blueswim', 'info', "Ajout d'un équipement: ".$blueId); } } } return $blues_list; } // --- updateInfo, postSave, preInsert, etc. restent identiques --- } class blueswimCmd extends cmd { public function execute($_options = array()) { if ($this->getLogicalId() == 'refresh') { blueswim::updateInfo($this->getEqLogic_Id()); } } }