Buttons in HTMLBox

Hallo allerseits,

mir fehlt für folgende Idee ein zielführender Ansatz:

Ich möchte in einer htmlbox mehrere Buttons z.B. mit einem img darstellen, jeder Button soll eine individuelle Aktion auslösen bzw. in irgendeiner Variablen einen auswertbaren Wert setzen.

Wie kann ich das realisieren ?

Grüße,
Tom

Hallo,

schon mal so probiert.

Gruß
hardlog

Krieg ich nicht gebacken. Verstehe auch die Login der Anführungszeichen nicht, habe alle doppelten Anführungszeichen durch " ersetzt, also ein Backslash davor. Sonst war es nicht zu parsen.

Muss da nicht auch irgendwo der Host rein ? Das IPSView läuft ja nicht auf dem Serversystem.

Erschreckend ist, dass ich das vor 3 Jahren wohl mal geschafft habe https://www.symcon.de/forum/threads/27907-JSON-%C3%BCber-Java?p=257820#post257820

Versuche es damit, hatte auch so meine Probleme

<?

 $val = "
  <script type='text/javascript'>
  window.xhrGet=function xhrGet(o) {
      var HTTP = new XMLHttpRequest();
    HTTP.open('GET',o,true);
    HTTP.send(NULL);
  }
  window.xhrPost=function xhrPost(o, data) {
      var HTTP = new XMLHttpRequest();
    HTTP.open('POST',o,true);
    HTTP.send(data);
  }
  window.xhrRPC=function xhrRPC(o, name, params) {
      var HTTP = new XMLHttpRequest();
    HTTP.open('POST',o,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('E-mail:Passwort'));
    HTTP.send(rpc);
  }
  </script>
  <table border=1 width=100%>
  <tr><td height=300>Aktion</td><td></td></tr>
  <tr><td height=30>Alert</td><td onclick=javascript:alert('Huhu!');>Jetzt testen!</td></tr>
  <tr><td height=50>GET Request</td><td onclick=window.xhrGet('/api/','SetValue',[10045 /*[Interne Skripte\JosnRPC\Onklick\Status]*/,true]);>Jetzt testen!</td></tr>
  <tr><td>POST Request</td><td onclick=window.xhrPost('/api/','SetValue',[10045 /*[Interne Skripte\JosnRPC\Onklick\Status]*/,true]);>Jetzt testen!</td></tr>
  <tr><td>RPC Request</td><td onmouseover=window.xhrRPC('/api/','SetValue',[10045 /*[Interne Skripte\JosnRPC\Onklick\Status]*/,true]);>Jetzt testen!</td></tr>
  <tr><td>RPC Request</td><td onclick=window.xhrRPC('/api/','WFC_SwitchPage',[45311 /*[Wohnzimmer]*/,'item1665']);>Jetzt testen!</td></tr>
  </table>
 ";

 SetValue(29478 /*[Interne Skripte\JosnRPC\Onklick\Test]*/, $val);

?>

Es läuft ! Hatte schon fast aufgegeben, da ich dachte, dass es auf IPSView unter nem Androiden gar nicht (mehr) geht. Es geht auch nur mit den RPC Request - keine Ahnung, wofür das „Alert“ und die GET/POST gut sind.

Vielen Dank an Euch !
Tom

Kann ich mit der JSON-RPC Schnittstelle von IP-Symcon auch mehrere Befehle gleichzeitig senden? So wie es in der JSON-RPC 2.0 Spezifikation als batch call angegeben ist.

Kann mir dazu jemand ein Beispiel mit Javascript geben? Ich bekomme das zur Zeit nicht gebacken.

Das ist nicht gleichzeitig :wink:
Das wären ja parallel mehrere TCP Verbindungen, was auf jeden Fall funktioniert.

Der batch call ist nichts anderes als über eine bestehende Verbindung mehrere Befehle sequenziell abzusetzen.
Sparst also ‚nur‘ das auf/abbauen der TCP Verbindung.
Theoretisch sollte es funktionieren, ausprobiert habe ich es noch nicht.
Halte aber auch den Geschwindigkeitsvorteil für vernachlässigbar.
Michael

Ich war der Meinung, dass ich damit mehrere Aufrufe in einem JSON Objekt zusammenfassen und in einer Datenübertragung senden kann. Wenn ich beispielsweise eine eigene Visualisierung baue, dann möchte ich ja ggf. zyklisch auf eine Änderung der dargestellten Variablen abfragen. Die Idee war, diese Abfragen immer zusammen abzuschicken, und dann auch eine Antwort zu erhalten.

Nein, das geht nicht und steht auch so nicht in der Spec.
Für eine eigene Visu wäre das eh der schlechteste Weg alles einzeln abzufragen.
Schau dir dazu die Befehle an, am besten zuerst in der Console von IPS.

Array IPS_GetSnapshot()
Array IPS_GetSnapshotChanges(Integer $LastTimestamp)

Michael

To send several Request objects at the same time, the Client MAY send an Array filled with Request objects.

Schade, dachte damit wäre das möglich. Für die zwei Snapshot Befehle gibt es ja keine Doku, aber ich schau mir die Befehle mal an.

IPS_GetSnapshot liefert mir also eine Momentanaufnahme des gesamten Systems mit allen Variablen?
Welchen timestamp nutze ich dann bei IPS_GetSnapshotChanges für die erste und folgenden Abfragen? Immer den letzten, den das System mir als Antwort geliefert hat? Das scheinen ja keine Unix-Zeitstempel zu sein.

Ah, ich hatte die Klammern am Handy vorhin übersehen, bei den Beispielen :wink:
Zumal meine Erfahrung z.B. bei Kodi gezeigt hat, dass die einfach ohne Array arbeiten und alle JSON-Objekte nacheinander übertragen.
IPS kann es auf jeden Fall nicht:

{"jsonrpc":"2.0","error":{"code":-32600,"message":"Invalid request (object required)"},"id":null}"

Ups :smiley:

Zum Timestamp schau mal hier:
Welcher Weg ist besser: Per SOAP VarUpdate Messages pollen oder PHP-Script mit Events

Michael

Die gleiche Fehlermeldung habe ich bei meinen Versuchen auch bekommen, deshalb habe ich gefragt. Schade, dass das nicht geht. Aber gut, wenn ich das Snapshot zum laufen bekomme ist das wohl die bessere Lösung.

Vielen Dank für die Hilfe!

Ich bekomme das JSON-RPC zeugs einfach nicht zum laufen…

Habe eine HTML Datei auf dem lokalen Windows 10 Rechner, wo auch ein IPS Test-System läuft. Dann eine Javascript Datei, welche in der HTML Datei eingebunden ist. Das ganze läuft nicht in einer HTML-Box, sondern in einer eigenständigen HTML-Datei zum Testen. Ich nutze Google Chrome als Browser.

Schaue ich mir in der Entwickler Konsole unter „Network“ den Verkehr an, so ist die Anfrage in der Konsole erfolgreich. Unter „Response“ kann ich dann auch die JSON Antwort einsehen, inklusive aller Variablen und deren Status. Jedoch bekomme ich auch einen Fehler in der Konsole und der Eventhandler für den readystatechange wird nicht aufgerufen. Dementsprechend kann ich die Daten auch nicht im Skript verarbeiten.

Failed to load http://localhost:3777/api/: No ‚Access-Control-Allow-Origin‘ header is present on the requested resource. Origin ‚null‘ is therefore not allowed access.

Sobald ich einen der beiden Header wieder dazunehme, ist der Status in der Entwicklerkonsole (failed) und ich bekomme im Log folgenden Fehler:

OPTIONS http://localhost:3777/api/ 0 ()

Javascript:

var SYMCON_IP = 'localhost';
var SYMCON_PORT = 3777;
var SYMCON_USER = 'username@mail.com';
var SYMCON_PASS = 'symcon';

window.onload = function() {
	var json = createJsonMessage('IPS_GetSnapshot', [], 0);
	sendData(json);
}

function sendData(json) {
	SOCKET = new XMLHttpRequest();
	
	SOCKET.onreadystatechange = function () {
		if (this.readyState == 4 && this.status == 200) {
			console.log('Response: ' + this.responseText);
		}
	}
	
	SOCKET.open('POST', 'http://' + SYMCON_IP + ':' + SYMCON_PORT + '/api/', true);
	//SOCKET.setRequestHeader('Content-type', 'application/json');
	//SOCKET.setRequestHeader('Authorization', 'Basic ' + btoa(SYMCON_USER+':'+SYMCON_PASS));
	
	console.log('Send JSON: ' + json);
	SOCKET.send(json);
}

function createJsonMessage(command, parameter, id) {
	data = {
		'jsonrpc' : '2.0',
		'id' : id,
		'method' : command,
		'params' : parameter,
	}
	return JSON.stringify(data);
}

Unter http://localhost:3777/api/ bekomme ich folgendes:

{„API“:„0.1“,„IP-Symcon“:„4.4“,„JSON-RPC“:„2.0“}