Somfy-Developer / Somfy-TaHoma-Developer-Mode

A collection of requests to use a local API with Somfy TaHoma gateways
147 stars 12 forks source link

commande #75

Closed BBenoit45 closed 2 years ago

BBenoit45 commented 2 years ago

bonjour

j'ai créé un script pour eedomus. Je réussis à lire la position d'un volet roulant mais pas à envoyer une commande !!

extrait du code : $result = httpQuery('https://192.168.2.92:8443/enduser-mobile-web/1/enduserAPI/setup/devices/io%3A%2F%2F2005-9054-2840%2F6716603/states', 'GET', NULL, NULL, $header, true);

    echo "\n"."\n";
    $tabl=sdk_json_decode($result);
    echo 'valeur : '.$tabl[2][value];
    echo "\n"."\n";

  $commands_str[] = '{"name":"close","parameters":["50"]}';
  $actions[] = '{"deviceURL":"io%3A%2F%2F2005-9054-2840%2F6716603","commands":['.implode($commands_str,',').']}';
  $json = '{"label":"eedomus command","actions":['.implode($actions, ',').']}';

    $header = array('accept: application/json','Content-Type: application/json','Authorization: Bearer '.$tok);
    $result = httpQuery('https://192.168.2.92:8443/enduser-mobile-web/1/enduserAPI/exec/apply', 'POST', $json, NULL, $header, true);
    var_dump(sdk_json_decode($result));

$result = httpQuery('https://192.168.2.92:8443/enduser-mobile-web/1/enduserAPI/setup/devices/io%3A%2F%2F2005-9054-2840%2F6716603/states', 'GET', NULL, NULL, $header, true);
    echo "\n"."\n";
    $tabl=sdk_json_decode($result);
    echo 'valeur : '.$tabl[2][value];      

message lors de l'exécution :

valeur : 23

array(2) { ["error"]=> string(21) "Processing exception." ["errorCode"]=> string(17) "UNSPECIFIED_ERROR" }

valeur : 23

Paramètres du volet : array(11) { ["deviceURL"]=> string(30) "io:\/\/2005-9054-2840\/6716603" ["available"]=> bool(true) ["synced"]=> bool(true) ["type"]=> int(1) ["states"]=> array(6) { [0]=> array(3) { ["type"]=> int(3) ["name"]=> string(16) "core:StatusState" ["value"]=> string(9) "available" } [1]=> array(3) { ["type"]=> int(3) ["name"]=> string(14) "core:NameState" ["value"]=> string(14) "Roller shutter" } [2]=> array(3) { ["type"]=> int(1) ["name"]=> string(17) "core:ClosureState" ["value"]=> int(25) } [3]=> array(3) { ["type"]=> int(3) ["name"]=> string(20) "core:OpenClosedState" ["value"]=> string(4) "open" } [4]=> array(3) { ["type"]=> int(3) ["name"]=> string(27) "core:DiscreteRSSILevelState" ["value"]=> string(4) "good" } [5]=> array(3) { ["type"]=> int(1) ["name"]=> string(19) "core:RSSILevelState" ["value"]=> int(100) } } ["label"]=> string(5) "VELUX" ["subsystemId"]=> int(0) ["attributes"]=> array(2) { [0]=> array(3) { ["type"]=> int(3) ["name"]=> string(21) "core:FirmwareRevision" ["value"]=> string(20) "0000000000000000ED01" } [1]=> array(3) { ["type"]=> int(3) ["name"]=> string(17) "core:Manufacturer" ["value"]=> string(5) "VELUX" } } ["enabled"]=> bool(true) ["controllableName"]=> string(32) "io:RollerShutterVeluxIOComponent" ["definition"]=> array(6) { ["states"]=> array(8) { [0]=> array(1) { ["name"]=> string(27) "core:DiscreteRSSILevelState" } [1]=> array(1) { ["name"]=> string(19) "core:RSSILevelState" } [2]=> array(1) { ["name"]=> string(14) "core:NameState" } [3]=> array(1) { ["name"]=> string(16) "core:StatusState" } [4]=> array(1) { ["name"]=> string(17) "core:ClosureState" } [5]=> array(1) { ["name"]=> string(20) "core:OpenClosedState" } [6]=> array(1) { ["name"]=> string(28) "core:Memorized1PositionState" } [7]=> array(1) { ["name"]=> string(25) "core:SecuredPositionState" } } ["widgetName"]=> string(31) "PositionableTiltedRollerShutter" ["attributes"]=> array(2) { [0]=> array(1) { ["name"]=> string(21) "core:FirmwareRevision" } [1]=> array(1) { ["name"]=> string(17) "core:Manufacturer" } } ["uiClass"]=> string(13) "RollerShutter" ["commands"]=> array(24) { [0]=> array(2) { ["commandName"]=> string(4) "stop" ["nparams"]=> int(0) } [1]=> array(3) { ["nparams"]=> int(1) ["commandName"]=> string(13) "setDeployment" ["paramsSig"]=> string(2) "p1" } [2]=> array(3) { ["nparams"]=> int(1) ["commandName"]=> string(19) "delayedStopIdentify" ["paramsSig"]=> string(2) "p1" } [3]=> array(2) { ["commandName"]=> string(25) "refreshMemorized1Position" ["nparams"]=> int(0) } [4]=> array(2) { ["commandName"]=> string(4) "open" ["nparams"]=> int(0) } [5]=> array(2) { ["commandName"]=> string(26) "unpairAllOneWayControllers" ["nparams"]=> int(0) } [6]=> array(3) { ["nparams"]=> int(1) ["commandName"]=> string(14) "setConfigState" ["paramsSig"]=> string(2) "p1" } [7]=> array(3) { ["nparams"]=> int(1) ["commandName"]=> string(20) "pairOneWayController" ["paramsSig"]=> string(6) "p1,p2" } [8]=> array(2) { ["commandName"]=> string(13) "startIdentify" ["nparams"]=> int(0) } [9]=> array(2) { ["commandName"]=> string(12) "stopIdentify" ["nparams"]=> int(0) } [10]=> array(3) { ["nparams"]=> int(1) ["commandName"]=> string(4) "wink" ["paramsSig"]=> string(2) "p1" } [11]=> array(3) { ["nparams"]=> int(1) ["commandName"]=> string(22) "unpairOneWayController" ["paramsSig"]=> string(6) "p1,p2" } [12]=> array(3) { ["nparams"]=> int(1) ["commandName"]=> string(18) "setSecuredPosition" ["paramsSig"]=> string(2) "p1" } [13]=> array(3) { ["nparams"]=> int(1) ["commandName"]=> string(15) "advancedRefresh" ["paramsSig"]=> string(6) "p1,*p2" } [14]=> array(2) { ["commandName"]=> string(2) "up" ["nparams"]=> int(0) } [15]=> array(2) { ["commandName"]=> string(7) "getName" ["nparams"]=> int(0) } [16]=> array(2) { ["commandName"]=> string(5) "close" ["nparams"]=> int(0) } [17]=> array(3) { ["nparams"]=> int(1) ["commandName"]=> string(7) "setName" ["paramsSig"]=> string(2) "p1" } [18]=> array(2) { ["commandName"]=> string(8) "identify" ["nparams"]=> int(0) } [19]=> array(3) { ["nparams"]=> int(1) ["commandName"]=> string(11) "setPosition" ["paramsSig"]=> string(2) "p1" } [20]=> array(2) { ["commandName"]=> string(4) "down" ["nparams"]=> int(0) } [21]=> array(3) { ["nparams"]=> int(1) ["commandName"]=> string(10) "setClosure" ["paramsSig"]=> string(2) "p1" } [22]=> array(2) { ["commandName"]=> string(2) "my" ["nparams"]=> int(0) } [23]=> array(3) { ["nparams"]=> int(1) ["commandName"]=> string(21) "setMemorized1Position" ["paramsSig"]=> string(2) "p1" } } ["type"]=> string(8) "ACTUATOR" } }

une idée ? Merci d'avance.

BuBuaBu commented 2 years ago

Bonjour,

La commande close n'accepte pas de paramètre. Elle permet de fermer complètement le volet. Pour une ouverture à 50%, il faut utiliser la commande setClosure qui prend un paramètre (ici 50 ou tout autre % voulu).

BBenoit45 commented 2 years ago

bonjour

j'ai bien essayé mais ça ne change rien. Le problème est ailleurs !!!

L'erreur n'est pas documentée. Est-ce que ça pourrait être un problème de syntaxe ?

BuBuaBu commented 2 years ago

La deviceUrl ne doit pas être urlencodé dans la body de la request post. "deviceURL":"io%3A%2F%2F2005-9054-2840%2F6716603" devrait être "deviceURL":"io://2005-9054-2840/6716603"

BBenoit45 commented 2 years ago

bonjour

j'avance mais toujours une erreur

extrait code

$commands_str[] = '{"name": "setClosure","parameters": ["50"]}'; $actions[] = '{"commands": ['.implode($commands_str,',').'],"deviceURL": "io:\/\/2005-9054-2840\/6716603"}'; $json = '{"label": "eedomus command","actions": ['.implode($actions, ',').']}'; $header = array('accept: application/json', 'Content-Type: application/json', 'Authorization: Bearer ' .$tok); $result = httpQuery('https://192.168.2.92:8443/enduser-mobile-web/1/enduserAPI/exec/apply','POST', http_build_query($json), NULL, $header,true);

avec l'erreur

array(2) { ["error"]=> string(88) "Bad parameters. ("wrong type of iteration, expecting string iterator, got nil iterator")" ["errorCode"]=> string(17) "INVALID_PARAMETER" }

Une nouvelle brillante idée ??

adriweb commented 2 years ago

pourquoi ecrire du json a la main alors qu'il existe json_encode qui evitera les erreurs ?

BuBuaBu commented 2 years ago

@BBenoit45 La commande setClosure prend un paramètre de type integer. il faut donc écrire "parameters": [50]

BBenoit45 commented 2 years ago

bonjour

au final , j'ai supprimé le 'http_build_query' puisque $data était déjà sous forme json

cela donne $commands_str[] = '{"name": "setClosure","parameters": ["100"]}'; $actions[] = '{"commands": ['.implode($commands_str,',').'],"deviceURL": "io:\/\/2005-9054-2840\/6716603"}'; $json = '{"label": "eedomus command","actions": ['.implode($actions, ',').']}';

$header = array('accept: application/json', 'Content-Type: application/json', 'Authorization: Bearer ' .$tok);
$result = httpQuery('https://192.168.2.92:8443/enduser-mobile-web/1/enduserAPI/exec/apply','POST', $json, NULL, $header,true);
var_dump(sdk_json_decode($result));

Pour le paramètre integer, "100" fonctionne apparemment également sous forme de string......mystère

Merci pour votre aide

BBenoit45 commented 2 years ago

Je clos cette demande.

ericfilippi commented 1 year ago

Bonjour @BBenoit45,

Je suis le développeur du plugin somfy sous eedomus et je bloque ausssi sur exec/apply.

As-tu pu résoudre ton problème ?

Eric

BBenoit45 commented 1 year ago

bonjour

j'avais un problème de format de variable

ci-dessous mon fichier qui gère un volet roulant

Bonne réception

<?

$api_url = 'https://ha101-1.overkiz.com/enduser-mobile-web/enduserAPI/';

//$action = getArg('action', false);

$tok = loadvariable('TOK'); echo 'TOK :'.":".loadvariable('TOK')."\n";

if (empty($tok)) { echo 'Obtention TOKEN'."\n"; // ** connexion serveur Somfy

$header = array('Content-Type: application/x-www-form-urlencoded');
$data = array ('userId' => 'userID', 'userPassword' => 'userPASSWORD');
$result = httpQuery($api_url.'login','POST',http_build_query($data),NULL,NULL,true);

//var_dump(sdk_json_decode($result));

// ******************   demande Token
echo 'Demande TOKEN'."\n";
$result = httpQuery($api_url.'config/codeSOMFY/local/tokens/generate','GET',http_build_query($data),NULL,$header,true);
    //var_dump(sdk_json_decode($result));
$tabl = sdk_json_decode($result);
$tok = $tabl[token];
echo '     Token : '.$tok."\n";
// ******************   activation Token
echo 'Activation TOKEN'."\n"."\n";
$data = '{"label" : "Toto token", "token" : "'.$tok.'" , "scope" : "devmode"}' ;
$result = httpQuery($api_url.'config/codeSOMFY/local/tokens','POST',$data,NULL,array('Content-Type: application/json'),true);

//var_dump(sdk_json_decode($result));

saveVariable ('TOK',$tok);

echo 'TOK neuf :'.(getArg('TOK', false)).":".loadvariable('TOK')."\n";
}

$header = array('Content-Type: application/x-www-form-urlencoded');
$data = array ('userId' => 'userID', 'userPassword' => 'userPASSWORD');
$result = httpQuery($api_url.'login','POST',http_build_query($data),NULL,NULL,true);

$result = httpQuery($api_url.'config/codeSOMFY/local/tokens/devmode','GET',NULL,NULL,array('Content-Type: application/json'),true);
echo 'devmode : ';
var_dump(sdk_json_decode($result));
echo "\n";

// ** lecture position Velux echo 'Lecture'."\n"."\n"; $header = array('accept: application/json', 'Authorization: Bearer '.$tok); $result = httpQuery('https://192.168.XXX.XXX:PORT/enduser-mobile-web/1/enduserAPI/setup/devices/io%3A%2F%2FcodeSOMFY%2F6716603/states','GET',NULL,NULL,$header,true); $tabl=sdk_json_decode($result); echo 'Ouverture : '.$tabl[2][value]."\n"."\n";

// ** envoi commande ouverture à 50% echo 'Commande'."\n"."\n";

$commands_str[] = '{"name": "setClosure","parameters": ["100"]}';
$actions[] = '{"commands": ['.implode($commands_str,',').'],"deviceURL": "io:\/\/codeSOMFY\/6716603"}';
$json = '{"label": "eedomus command","actions": ['.implode($actions, ',').']}';

$header = array('accept: application/json', 'Content-Type: application/json', 'Authorization: Bearer ' .$tok);
$result = httpQuery('https://192.168.XXX.XXX:PORT/enduser-mobile-web/1/enduserAPI/exec/apply','POST', $json, NULL, $header,true);
var_dump(sdk_json_decode($result));
echo "\n";

// ** lecture position Velux echo 'Lecture'."\n"."\n"; $header = array('accept: application/json', 'Authorization: Bearer '.$tok); $result = httpQuery('https://192.168.XXX.XXX:PORT/enduser-mobile-web/1/enduserAPI/setup/devices/io%3A%2F%2FcodeSOMFY%2F6716603/states','GET',NULL,NULL,$header,true); $tabl=sdk_json_decode($result); echo 'Fermeture : '.$tabl[2][value]."\n"."\n";

?>

BBenoit45 commented 1 year ago

ci-joint copie d'écran Capture d’écran 2023-02-07 à 07 19 30

ericfilippi commented 1 year ago

Merci !

Ton code m'a permis de trouver une erreur dans mes données de test. C'est corrigé. ça marche parfaitement.

Juste pour mon info personnelle ... tu as développé ton propre script pour piloter ton volet roulant. pourquoi ne pas utiliser le plugin somfy que l'on a mis sur le store eedomus ? Les fonctionnalités ne te conviennent pas ?

Encore un grand merci pour ton aide !

Eric

BBenoit45 commented 1 year ago

Bonjour

le plugin utilise le cloud. régulièrement les serveurs chez somfy bloquaient mon accès sans véritables explications. A priori, trop de connexions même après avoir limité les accès !! alors dès que j'ai eu connaissance de l'api locale, j'ai codé. Un volet, ça va. Lorsque le plugin utilisera l'api locale, je testerai sans problème.

Cordialement

Benoît