GET/POST/JSON-RPC Requests direkt aus HTMLBoxen senden

Falls ihr direkt die IP-Symcon JSON-RPC-API aus dem WebFront/der HTMLBox ansprechend wollt, gibt es hier Kommentarlos ein Code-Snippsel.

Als Beispiel wird durch einen Klick auf eine Tabellenzelle direkt per WFC_SwitchPage eine Seite angesprungen.

Funktioniert im Internet Explorer leider nicht!


<?

 $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(\"mail@domain.de:fernzugriffpw\"));
    HTTP.send(rpc);
  }
  </script>
  <table border=1 width=100%>
  <tr><td>Aktion</td><td></td></tr>
  <tr><td>Alert</td><td onclick=javascript:alert('Huhu!');>Jetzt testen!</td></tr>
  <tr><td>GET Request</td><td onclick=window.xhrGet('/api/');>Jetzt testen!</td></tr>
  <tr><td>POST Request</td><td onclick=window.xhrPost('/api/','asdas=asdasd');>Jetzt testen!</td></tr>
  <tr><td>RPC Request</td><td onclick=window.xhrRPC('/api/','WFC_SwitchPage',[37603,\"dwd\"]);>Jetzt testen!</td></tr>
  </table>
 ";

 SetValue(37174 /*[HTMLBoxTest]*/, $val);

?>

paresy

Hallo paresy,

ich schon wieder … ich verwende dieses Beispiel bisher unter 3.4 ohne Probleme um IPS im Browser „anzusprechen“. Funktionierte bisher ohne Probleme. Nach Update auf die 4.0 geht es nicht mehr. Was hat sich in diesem Bereich geändert bei der 4.0er? Was müsste ich ändern?

Grüsse,
Marcus

Eben gerade mit Chrome ausprobiert. Läuft einwandfrei.

Schau mal im Browser in die Entwicklertools… Dort gibt es bestimmt mehr Infos. Kann gut sein, dass dein Browserhersteller was geändert hat und es dir erst jetzt im Zuge der 4.0 Tests auffällt :slight_smile:

paresy

Komisch, da gab es keine Änderung … iPhone mit IOS und Apple Browser … nix spezielles … :slight_smile:

Vielleicht sehe ich bei mir den Wald vor lauter Bäumen net?

Hallo paresy,

hast Du noch einen Tip. Habe es nochmals geprüft - unter 3.4 - geht unter 4.0 geht es nicht - identische Scripte. Ich finde aber nicht wirklich was …

Grüsse,
MaLu

Zeig doch mal was du hast… immer dieses Rätselraten :wink:
Michael

Ja, hast ja recht hatte Probleme beim hinzufügen … mal was aus einem anderen Thread geklaut … kann es das sein … also auf den ersten Post bezogen ? Bin schon wieder auf 3.4 - deswegen Trockenübungsfrage.

Moin moin.

Bei mir sieht das so aus (und arbeitet fleißig):

:3777/api/"
Probier doch mal.

Gruß
lueralba

So Nall Chan, :wink: - ich zeige mal was ich habe :smiley: -

An alle, was mag an dem unterstehen Auszug (halte es hier kurz und knackig - die if´s usw. erspare ich Euch aber es tut auch in reduzierter Form net) IPS 4.0 net? (Ja, user und pw sind mit korrekten Werten im echten Skript drin).

Danke und Grüsse,
MaLu



$oncolor ='<span style="color:rgb(13%,70%,67%)">';
$offcolor ='<span style="color:rgb(49%,99%,0%)">';


 $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(\"user:pw\"));
    HTTP.send(rpc);
  }
  </script>
  <table border=1 width=100% cellspacing=0 cellpadding=30>
  <tr><td>Alarm</td><td onclick=window.xhrRPC('/api/','SetValue',[15812,\"FALSE\"]);>$oncolor AN</td><td></td></tr>
  <tr><td>Alarm</td><td onclick=window.xhrRPC('/api/','SetValue',[15812,\"TRUE\"]);>$offcolor AUS</td><td></td></tr>
  </table>
 ";

 SetValue(17976 /*[HTML Web Front Steuerung\Alarm\Alarm An Aus String]*/, $val);

?>

So auf den ersten Blick von unterwegs, ohne es am Rechner zu testen…
Warum stehen true und false da in " ?
Das ist doch kein String. IPS 4 ist bei Json sehr penibel.
Und wenn du nur xhrRPC nutzt, dann wirf die anderen Funktionen doch raus. Paresy hat drei verschiedene Funktionen vorgestellt, aber du nutzt ja nur eine.
Michael

Hallo Nall Chan,

Naja ich dachte und so funktioniert es auch :slight_smile: ,
wenn ich TRUE nehme brauch ich doch die " - ich kann die " weglassen wenn ich für TRUE eine 1 nehme.

Was meint denn nun empfindlich? Weniger robust - IPS 4 scheint ja eine Mimose zu sein … ich sag nur mal Stichwort www reader. Egal.

Hast Du oder jemand noch einen Tip für mich?

Danke und Grüsse,
MaLu

Von welches Datentyp ist denn deine Variable 15812? Sofern es Boolean ist, hat Michael Recht, dass du true/false ohne " nutzen müsstest, um das Problem zu lösen :slight_smile:

paresy

Hallo paresy,

ich blicks irgendwie net …:smiley: - Ja, ist Boolean

Unter 3.4 - geht nur folgendes - HTML ist „klickbar“ und die Variable wird korrekt aktualisiert.

mit True oder False MUSS ich " nehmen sonst geht´s net
mit 1 oder 0 MUSS ich " ohne " " nehmen sonst geht´s net

Was Ihr also empfehlt … True oder False ohne " --> geht nicht mal unter 3.4

Unter 4.0 - aktuelle Version - geht keine der unter 3.4 funktionierenden Varianten.

Danke und Grüsse,
MaLu

Schreib mal bitte false und true ohne " (Ganz wichtig: Kleinschreibung. Nur kleingeschrieben ist es valides JSON)

Das sollte dann korrekt unter der 3.4 und 4.0 laufen :slight_smile:

paresy

Hallo paresy,

false und true sind nun klein … und es geht immer noch nicht unter 4.0. Habe aber weitere Aspekte aufgetan.

SetValueBoolean sollte ja wie Setvalue mit den genannten Bedingungen funktionieren -
unter 3.4 geht aber „nur“ Setvalue - bei Änderung auf SetValueBoolean funktioniert es auch nicht mehr.

So nun habe ich das ganze mal mit einer Integer probiert. Hier gehen alle Kombinationen und alles wie erwartet unter 3.4 und 4.0.

z.B. und weitere…

<td onclick=window.xhrRPC(’/api/’,‚SetValueInteger‘,[16368,2014]);>$bcolor 2014</td><td></td>
<td onclick=window.xhrRPC(’/api/’,‚SetValue‘,[16368,„2014“]);>$bcolor 2014</td><td></td>

Ich meine da ein SetValueBoolean nicht mal unter 3.4 geht aber ein SetValue ist ja schon das unerwartet, oder?

Is es einfach ein spezifisches Problem mit der Boolean?

Danke und Grüsse,
MaLu

Läuft hier prima. Code anbei:


  <tr><td>RPC Request</td><td onclick=window.xhrRPC('/api/','SetValue',[22437,true]);>Jetzt TRUE!</td></tr>
  <tr><td>RPC Request</td><td onclick=window.xhrRPC('/api/','SetValue',[22437,false]);>Jetzt FALSE!</td></tr>

paresy

Hi,

ich hab seit gestern ein ähnliches (?) Problem. Bzw. ich bin nicht sicher ob das in die selbe Kategorie gehört.
Ich versuch aus einer HTMLbox mit

<img valign='right' style='cursor:pointer;' height='15' src='/user/graph.gif' onclick='window.xhrGet=function xhrGet(o) {var HTTP = new XMLHttpRequest();HTTP.open(\"GET\",o.url,true);HTTP. send();};window.xhrGet({ url: \"user/Button.php?ts=\" + (new Date()).getTime() + \"&ScriptID=".$_IPS['SELF']."&do=GRAPHpraxisVorJahrLINK\" });' ></img>

Buttons abzufragen. Ging bist gestern. Habe gestern den Compatibilitätsmodus deaktivert, weil ich dachte ich alle Altlasten abgearbeitet zu haben, offensichtlich jedoch nicht. Wenn der Comp.-Modus aus ist gehts nicht, wieder einschalten gehts?!
Ist das das selbe Problem, wenn nicht bin ich dennoch an Hilfe interessiert?

Gruß
hardlog

Anderes Problem. Schau mal in der Entwicklerkonsole nach Fehlermeldungen.

paresy

Und/Oder mal die Button.php hier zeigen.
Michael

@paresy Danke für den Code oben - nun geht es final mit der 131 und dem Code. Grüsse MaLu

zu Post #16.

@paresy: Die Console gibt keine Fehlermeldung an!

Ich erzeuge in einem Script eine htmlBox mit u.a. folgender Zeile:


$html="....
<td span style='font-size:90%;color:black'><img valign='right' style='cursor:pointer;' height='15' src='/user/graph.gif' onclick='window.xhrGet=function xhrGet(o) {var HTTP = new XMLHttpRequest();HTTP.open(\"GET\",o.url,true);HTTP. send();};window.xhrGet({ url: \"user/Button.php?ts=\" + (new Date()).getTime() + \"&ScriptID=".$_IPS['SELF']."&do=GRAPHpraxisVorJahrLINK\" });' ></img></td>
....";
Setvalue(12345,$html);

Im WF ist eine Tabbelle mit einem Button in Form eine gif’s (hier graph.gif). Bei anklicken im WF wird das script Button.php aufgerufen:

<?php
$ScriptID = $_GET['ScriptID'];
$Action   = $_GET['do'];

if ($ScriptID > 0)
{
    IPS_RunScriptWaitEx((int)$ScriptID, array('action' => $Action) );
}
?>

Der Aufruf findet auch statt. Anschließend wird das urspungsscript (in dem die html-Zeile erzeugt wurde) aufgerufen und die Variable (array) $action ausgewertet.


switch ($_IPS['SENDER']) // hier werden eventuelle ONCLICK-Ereignisse aus der Tabelle heraus (WF) abgefrag und weitergeleitet
{
   case 'RunScript':
        switch (@$action)
        {
      		case 'PREISLINK': // Auf Einstellungsseite für Strompreise springen
						WFC_SwitchPage(46366 /*[WebFront]*/,"Strom");
        			break;
				case 'GRAPHwp12MOSLINK': //
				      IPS_RunScript(27169 /*[Gebäude\Technik L\Stromverbrauch\Stromverbrauchsdaten\Verbrauchsdaten anzeigen\Diagramm letzte 12 Monate WP]*/);
        			break;
				case 'GRAPHwpVorJahrLINK': //
				      IPS_RunScript(14086 /*[Gebäude\Technik L\Stromverbrauch\Stromverbrauchsdaten\Verbrauchsdaten anzeigen\Diagramm Vorjahr WP]*/ );
        			break;
				case 'GRAPHpraxis12MOSLINK': //
				      IPS_RunScript(56037 /*[Gebäude\Technik L\Stromverbrauch\Stromverbrauchsdaten\Verbrauchsdaten anzeigen\Diagramm letzte 12 Monate Praxis]*/ );
        			break;
				case 'GRAPHpraxisVorJahrLINK': //
				      IPS_RunScript(29464 /*[Gebäude\Technik L\Stromverbrauch\Stromverbrauchsdaten\Verbrauchsdaten anzeigen\Diagramm Vorjahr Praxis]*/ );
        			break;
				case 'GRAPHallesOwp12MOSLINK': //
				      IPS_RunScript(23505 /*[Gebäude\Technik L\Stromverbrauch\Stromverbrauchsdaten\Verbrauchsdaten anzeigen\Diagramm letzte 12 Monate alles ohne WP]*/ );
        			break;
				case 'GRAPHallesOwpLJLINK': //
				      IPS_RunScript(56238 /*[Gebäude\Technik L\Stromverbrauch\Stromverbrauchsdaten\Verbrauchsdaten anzeigen\Diagramm Vorjahr Alles ohne WP]*/  );
        			break;
			}
	break;
}

Dieses Array liefert aber nichts mehr zurück seit dem ich den Compatibilitätsmodus abgeschaltet habe (wenn ich ihn wieder aktiviere gehts wieder…)

Hat jemand ne Idee?

Gruß
hardlog