Closed BBenoit45 closed 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).
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 ?
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"
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 ??
pourquoi ecrire du json a la main alors qu'il existe json_encode
qui evitera les erreurs ?
@BBenoit45 La commande setClosure
prend un paramètre de type integer.
il faut donc écrire "parameters": [50]
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
Je clos cette demande.
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
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";
?>
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
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
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);
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.