Ist die Verbindung über die JSON-RPC-Schnittstelle bidirektional?

Hallo,
ich will in einem C#-Programm über die JSON-RPC-Schnittstelle in IP-Symcon einen Z-Wave-Schalter ein- und ausschalten. Bisher habe ich keine Erfahrung mit der JSON-RPC-Schnittstelle.
Ist die Verbindung über die JSON-RPC-Schnittstelle bidirektional?
Erhalte ich im C# eine Rückmeldung, wenn ich den Z-Wave-Schalter auf true oder false setze?
Wenn ja, gibt es ein Beispiel?

Alexander

Hallo Alexander,

die Anfrage ist bidirektional und jeder Aufruf wird bestätigt.

Hier mal ein Javascript-Ausschnitt, wie so ein Aufruf möglich ist:



// Build request object
let RPCrequest = {
    jsonrpc: '2.0',
    method: method, // Name of the method, e.g., 'SetValue'
    params: params, // All parameters in array, e.g., [ 12345, 23 ] for SetValue
    id: id                    // Any ID for a call, will respond with the same ID
};

// Configure the request
let httpRequest = new XMLHttpRequest();
httpRequest.open('POST', context.url);
httpRequest.setRequestHeader('Content-Type', 'application/json');
if (context.password != '') {
    let credentials = window.btoa(context.username + ":" + context.password);
    httpRequest.setRequestHeader('Authorization', 'Basic ' + credentials);
}
httpRequest.onreadystatechange = function () {
    if (this.readyState != 4) return;

    let response = JSON.parse(this.responseText);
    // Do something with response
}

httpRequest.send(JSON.stringify(RPCrequest));

Einiges mag wohl Javascript spezifisch sein, aber man erkennt:

  • Anfrage per HTML POST mit Credentials
  • Antwort kommt als JSON

Ich hoffe das hilft

Hier gibt es auch noch Beispiele für cURL: Datenaustausch — IP-Symcon :: Automatisierungssoftware

In C# sollte dies ebenfalls problemlos möglich sein.

paresy

Hallo,
Danke für die Hilfe. Die Beispiele werde ich testen.

Alexander

Moin in die Runde,

ich würde gerne mal auf das Schwarmwissen zugreifen :slight_smile:

Ich komme hier schon seid ein paar Tagen nicht wirklich weiter. Ich bin dabei mein Wecker etwas zu erneuern und auf ein neues Script zu stellen. Weil sich ein paar Sachen schon gut bewährt haben würde ich diese gerne erneut mit JavaScript umsetzen. Dazu habe ich das obere Beispiel genutzt. Soweit so gut - ich sende eine Anfrage und bekomme eine Antwort.

Leider funktioniert das nicht mit weiteren Variablen die ich aktualisieren möchte. Und ich sehe / finde den Fehler nicht. Es wären bei mir so 5 Variablen die ich gerne pollen würde um sie mit Javascript auszuwerten.

Hätte jemand eine Anregung bzw. was mache ich falsch …

Bei einer Einzelnen Variablen geht das, soweit ich bei der zweiten Variable den Status abfrage passen die Zustände nicht mehr …

Danke,
Grüße

Thomas


<?

// https://www.symcon.de/forum/threads/38632-Ist-die-Verbindung-%C3%BCber-die-JSON-RPC-Schnittstelle-bidirektional?highlight=HTTP.setRequestHeader%28+Authorization

$ausgabe = '<html>
<head>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<meta http-equiv="cache-control" content="no-cache">

<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">

	
<script type="text/javascript">

	let username = "user@domain.tld";
	let password = "**********";
	
	function updateIPS(){
		id_wecker_zustand = 	25381 /*[Scripte\Wecker\Schlafzimmer\Wecker Zustand]*/;
		id_wecker_schlummern = 	56669 /*[Scripte\Wecker\Schlafzimmer\Wecker Schlummern]*/;

		var wecker_value = updateRPC("GetValue", [id_wecker_zustand]);

				// Wecker
				if(wecker_value == false) {
					var wecker_inhalt = "<img src=\"/user/wecker/icons/wecker-aus.png\" onclick=window.updateRPC(\"SetValue\",[id_wecker_zustand,true]);>";
				}
				else {
					var wecker_inhalt = "<img src=\"/user/wecker/icons/wecker-an.png\" onclick=window.updateRPC(\"SetValue\",[id_wecker_zustand,false]);>";
				}
			alert("Wecker: " + wecker_value);
				document.getElementById("wecker").innerHTML = wecker_inhalt;
				
				
//		var schlummern_value = updateRPC("GetValue", [id_wecker_schlummern]);

//				// Schlummern
//				if(schlummern_value == false) {
//					var schlummern_inhalt = "<img src=\"/user/wecker/icons/schlummern.png\" onclick=window.updateRPC(\"SetValue\",[id_wecker_schlummern,true]);>";
//				}
//				else {
//					var schlummern_inhalt = "<img src=\"/user/wecker/icons/tagesablauf.png\" onclick=window.updateRPC(\"SetValue\",[id_wecker_schlummern,false]);>";
//				}
//			alert("Schlummern: " + schlummern_value);
//				document.getElementById("schlummern").innerHTML = schlummern_inhalt;



		window.setTimeout("updateIPS()", 8000);
	
	}
	
	window.setTimeout("updateIPS()", 1000);

	function updateRPC(name, params) {
		
		var HTTP = new XMLHttpRequest();
		HTTP.open("POST","/api/",true);
			var rpc = JSON.stringify({"jsonrpc":"2.0", "method":name, "params":params, "id":0});
		HTTP.setRequestHeader("Content-type", "application/json");
		HTTP.setRequestHeader("Authorization", "Basic " + btoa(username + ":" + password));
		HTTP.send(rpc);

			HTTP.onreadystatechange = function() {
						if (this.readyState == 4 && this.status == 200) {
							let json = JSON.parse(this.responseText);
							
					id = JSON.parse(params);
				alert("HTTP: " + id + " " + json.result);
							objekt_value = json.result;
							}
						}
	
			return window.objekt_value;
		
	}


</script>

<style>

	html, body {
		width: 640px;
		height: 360px;

		background-color: #000000;
		color: #ffffff;
		margin: 0px;
		padding: 0px;
		font-family: Arial, Helvetica, sans-serif;
		overflow: hidden;

		document.body.scroll = "no";
		document.body.style.overflow = "hidden";
		document.height = window.innerHeight;

		document.body.addEventListener("touchmove", function(e){ e.preventDefault(); });
	}

</style>




</head>

<body>

	<div id="wecker" class="wecker"></div>
	<div id="schlummern" class="schlummern"></div>


</body>
</html>

';


echo $ausgabe;