Json RPC - Récupération et Modification de Variable

Bonjour à Tous,

Dans un premier temps, désolé mais je n’ai pas vraiment su classifier ce type de question. Si un modérateur pouvait me le dire, ce serait cool. Merci.

Voici donc ma question est en rapport avec le Json RPC (API).
Après avoir lu plusieurs fois la doc sur l’API Json, je n’arrive pas à générer correctement mon Json pour récupérer et modifier correctement une Variable.

Le contexte :
J’ai créé une variable « MaVariable » en passant par le menu « Outils → Variables ».
J’ai donc rempli ma variable avec une valeur, prenons « Oui ».
Je voudrais récupérer et modifier cette valeur de « MaVariable » avec l’API JsonRPC.
J’ai bien trouvé un exemple en API HTTP ( http://#IP_JEEDOM#/core/api/jeeApi.php?apikey=#APIKEY#&type=variable&name=#NAME#&value=VALUE), mais je n’ai pas trouvé d’exemple pour générer correctement mon Json même après avoir lu la documentation API JsonRPC qui reste un peu confuse et très succincte pour moi.

Est-ce que quelqu’un pourrait me donner un exemple de Json pour récupérer ma variable « MaVariable » et un exemple pour la modifier ?

Merci à tous.

Bonjour,

donc vous parlez de cette api: https://doc.jeedom.com/fr_FR/core/4.4/jsonrpc_api#API%20JSON%20datastore%20(variable) ?

si oui, montrez ce que vous avez déjà, ca sera plus simple de démarrer de quelque chose

Merci Mips pour votre réponse ! :slight_smile:

Oui c’est bien cette API.

Pour le moment, de mes déductions, j’ai :

{
"jsonrpc":"2.0",
"method":"datastore::byTypeLinkIdKey",
"params"{
"apikey" : "…mon API Key…",
"type" : "variable",
"name" : "MaVariable"
},
"id" : "1"
}

(Désolé je n’arrive pas à mettre les tabulations dans le texte)

En réponse j’ai :

{
"jsonrpc" : "2.0",
"id" : "1",
"result" : [ ]
}

Salut

Donné votre json en utilisant le bouton </> Texte préformaté pour le formatage des json…

Merci Tonio16.
Même si je n’ai pas d’exemple, j’apprends à me servir de l’interface. :joy:

{
"jsonrpc":"2.0",
"method":"datastore::byTypeLinkIdKey",
"params"{
     "apikey" : "…mon API Key…",
     "type" : "variable",
     "name" : "MaVariable"
},
"id" : "1"
}

Il manque un : après « params »
Il y a des testeurs json sur le web pour trouver ce type d’erreurs.

{
"jsonrpc":"2.0",
"method":"datastore::byTypeLinkIdKey",
"params":{
     "apikey" : "…mon API Key…",
     "type" : "variable",
     "name" : "MaVariable"
},
"id" : "1"
}

Oui effectivement, c’est une erreur de recopie.
Mon Json est bien avec les « : »

Cela ne change donc pas le problème.
Je n’ai pas le retour de la valeur de ma variable « MaVariable ». :slight_smile: :wink:

Ok, pourquoi de type variable? C’est une fonction propre aux variables ai j’ai bien compris donc je trouve étonnant de le remettre.

Antoine

Je ne sais pas…
Disons que j’ai trouvé, dans la doc, qu’il fallait mettre un « type ».
Toujours dans la doc, il est noté entre parenthèses le cas d’un scénario avec : " "type" : "scenario" ". J’ai donc essayé avec « variable ».
Et puis, aussi, parce que je me suis référé également à l’API Http qui utilise " type=variable ", ce qui n’est pas une bonne idée effectivement.
Je vais donc essayé sans utiliser le « type ».

Essai : c’est identique.

Je me pose aussi la question s’il faut utiliser « name » ou une autre clef.
Toujours dans l’API Htpp, il est utilisé " name=MaVariable "

Je me pose plein de question sur l’utilisation de cette méthode : est-ce que la doc est bien faite ? est-ce que la doc est suffisante ?, Est-ce que la doc parle bien de la récupération ou modification d’une variable créée dans l’interface ? etc…

Donc si quelqu’un a aussi une idée sur la manière de récupérer et modifier une variable dans le cadre général (API JsonRPC), cela serait intéressant.

si l’on s’en réfère au code du core, c’est bon ce que tu fais …

pour lire :
&name=var_nom&type=variable
pour écrire :
&name=var_nom&value='blabla'&type=variable

a priori value doit être passé vide ou pas (si j’en crois la fonction init()), pour lire la valeur, sinon s’il est non vide, il est stocké sous la rubrique ‹ scenario ›.
du coup comment fait-on pour l’effacer? je ne sais pas car avec cet accès tu ne peux pas écrire de valeur vide. le test va renvoyer comme si c’est vide.

voilà l’extrait de code du core :

if ($type == 'variable') {
			log::add('api', 'debug', __('Demande API pour les variables', __FILE__));
			if (init('value') == '') {
				$dataStore = dataStore::byTypeLinkIdKey('scenario', -1, trim(init('name')));
				if (is_object($dataStore)) {
					echo $dataStore->getValue();
				}
			} else {
				$dataStore = new dataStore();
				$dataStore->setKey(trim(init('name')));
				$dataStore->setValue(init('value'));
				$dataStore->setType('scenario');
				$dataStore->setLink_id(-1);
				$dataStore->save();
			}
			die();
		}

Tu parles de l’api http alors que la question porte sur json rpc

Bonsoir,

Oui, je suis d’accord avec toi.
Plus précisément :

  • si value est vide ou inexistante, alors nous sommes en mode lecture.
  • Si value est remplie on passe en mode écriture et la valeur est stockée.

Il en ressort pas moins que même si nous mettons « variable », la lecture et le stockage se fait sous « scenario » → pas clair.

Peu importe, je ne vais pas m’étendre sur le sujet car ce n’est pas trop la question puisque lorsque j’utilise l’API HTTP, tout fonctionne correctement et je peux écrire ou modifier la variable en question.

Mais lorsque j’utilise l’API JsonRPC cela ne fonctionne pas.
J’ai proposé une structure Json que j’ai faite en fonction de l’URL donnée en exemple pour l’API HTTP mais manifestement ma Structure Json ne fonctionne pas.
D’où ma question finalement de savoir si quelqu’un aurait une structure Json valable pour récupérer et modifier les variables.

Merci Neurall

Oui tout à fait Mips, la question porte sur la structure Json (API JsonRPC) et non sur l’API HTTP qui fonctionne correctement. :slight_smile:

Bonjour,

Dans la méthod jsonrpc, il est utilisé la fonction byTypeLinkIdKey, il manque donc le params :

"linkId": -1

et le type est bien « scenario » :

"type": "scenario"

et pour le nom, il faut utiliser key :

"key": "MaVariable"


1 « J'aime »

Bonjour Phpvarious

Merci pour cette réponse et je vais de suite faire des essais.
Je reviens ici pour vous dire ce qu’il en est.

Merci

Juste une petite question concernant votre réponse :

Vous me dites :

Dans la méthod jsonrpc, il est utilisé la fonction byTypeLinkIdKey, il manque donc le params : "link_id": -1

Et je vois dans le code :

$jsonrpc->makeSuccess(utils::o2a(dataStore::byTypeLinkIdKey($params[‹ type ›], $params[‹ linkId ›], $params[‹ key ›])));

Faut-il donc utiliser « link_id » ou « linkId » ?

Ceci dit je vais essayer les deux.
Merci

J’ai fait les essais et j’espère que cela sera utile à d’autres.

La solution finale a donc été donnée par Phpvarious avec une petite précision : il faut bien utiliser « linkId » (l’avant dernière lettre est un i majuscule)

Voici donc la structure Json qu’il faut appeler :

{
"jsonrpc": "2.0",
"method": "datastore::byTypeLinkIdKey",
"params": {
     "apikey" : "…mon API Key…",
     "type" : "scenario",
     "linkId": -1,
     "key" : "MaVariable"
},
"id" : "1"
}

et voici la réponse reçue sera sous cette structure Json :

{
"jsonrpc":"2.0",
"id":"1",
"result":{
     "id":1,
     "type":"scenario",
     "link_id":-1,
     "key":"MaVariable",
     "value":"Valeur_Variable"
}
}

Pour modifier la variable, c’est :

{
"jsonrpc": "2.0",
"method": "datastore::save",
"params": {
     "apikey" : "…mon API Key…",
     "type" : "scenario",
     "linkId" : -1,
     "key" : "MaVariable",
     "value" : "Nouvelle_Valeur"
},
"id" : "1"
}

Voilà…

Effectivement, mauvais copier/coller :wink:

1 « J'aime »