IPS-Befehle von einer HTML-Seite starten

Hier kommt ein richtiges Goodie! Ich habe eine Möglichkeit ausgelotet, um jegliche IPS-Befehle in eine beliebige HTML-Seite zu integrieren. Ich denke, diese Anleitung könnte für den einen oder anderen vonnutzen sein.

Meine Lösung verwendet eine vereinfachte Schnittstelle zu AJAX namens jquery. Dazu ist notwendig, jquery in die HTML-Seite einzubinden. Das geht mit folgendem Code:


<script src="js/jquery-1.7.1.js"></script>
<script type="text/javascript"> 
function GenericAction($IpsCommand) {
	 $.get('ControlInstance.php', { action: $IpsCommand, instance: "23616" }, function(data) {
  $('.result').html(data);
  //alert('GenericAction was performed' + data);
});
} 
   </script> 

Server-seitig muss dann folgendes Skript mit dem Filename ControlInstance.php hinterlegt werden:


<?php 
if(isset($_GET['action'])  )
    { 
        $action = $_GET['action'];
		echo chr(13)."'".$action."'". "wird gleich ausgeführt".chr(13);
		eval($action); 
    } 

echo "ausgeführt!".chr(13);
?> 


Es wird dann auf der jeweiligen HTML-Seite ein Button eingerichtet, welches die IPS-Funktion auslösen soll:


<input type="button" class="LargeButton" 
                	onclick="GenericAction('FS20_SwitchMode (23616, true);')" value="Deckenleuchte AN"  />

Im obigen Fall soll ein Licht angehen (Instanz 23616), welches durch FS20 kontrolliert wird.

Diese Lösung funktioniert prima für mich, und erweitert die Möglichkeiten des IPS-Einsatzes erheblich. Ich bin aber kein Programmierer, und würde mich freuen über jegliche Kritik/Anregung/Vereinfachung/Verbesserungsvorschlag etc. Ein kleines Caveat ist z.B., dass die Funktion „eval()“ unter PHPlern offenbar verpönt ist („eval is evil“) da ein gewisses Sicherheitsrisiko entsteht. Für mich ist dieses Risiko überschaubar, aber man sollte sich dessen bewusst sein.

mit bestem Gruss
AAG

hätte gern ein icon auf dem iphone homescreen zum öffnen der Tür… das müsste damit doch gehen oder gibt’s andere Lösungen?

Habe leider kein Eifon (bin bei Ice Cream Sandwich), aber alles was Ajax versteht sollte eigentlich gehen.:wink:

Coole Sache
Eben probiert funktioniert einwandfrei.
Vorher muss aber noch jquery.js aus dem Internet geladen werden.
Habs auch mit dem iPhone probiert - geht.
Script zum sofortigen ausfuehren ohne Button zu druecken

<head>
<script src="js/jquery-1.7.1.js"></script>
<script type="text/javascript"> 
function GenericAction($IpsCommand) 
  {
  $.get('ControlInstance.php', { action: $IpsCommand, instance: "23616" }, function(data) {
  $('.result').html(data);
  });
  } 
</script>    
</head>
<body onload="GenericAction('SetValueInteger (24888, 1007);')">                   	
</body>   

Ja stimmt, sorry! Oder einfach die jquery-site verlinken:


 <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js>

Eine Frage: in welchen Pfaden muß was/welche Datei stehen?
Im Webfront-Ordner?
Gruß Helmut

Ich hab alles im Webfront/user

ich setze die PHP-Skripte lieber in ein Verzeichnis, welches vom Web aus nicht zugänglich ist - aus Sicherheitsüberlegungen heraus. Bringt aber wahrscheinlich sowieso nicht viel.

Ich verwende einen ähnlichen Code, aber folgende mahnenden Worte seien gesagt:

Du unterläufst damit jegliche IPS-Sicherheitsregeln (Passwortschutz von Webfront usw.) und jeder der Zugriff auf dein Netz hat kann damit dein IPS steuern. Außerdem kann er damit auch mehr tun, z.B. deine Festplatte löschen (oder was man halt sonst so per PHP-Befehl machen kann), denn das PHP wird auf dem IPS-Server ausgeführt und der hat recht weitreichende Möglichkeiten…

Fürs iPhone ist das total durch die Brust ins Auge. Da reicht dieser Code vollkommen aus:


SetValueInteger (24888, 1007);

einfach als „Schaltmich.php“ abgespeichert in z.B. Webfront/User und per iPhone aufrufen. FERTIG.

Hagbard: Du hast 100% recht, und Deine mahnenden Worte sollten von jedem Leser beherzigt werden! So wie der Skript dargelegt ist, sollte er auf keinen Fall in einer öffentlichen Webseite eingefügt werden.

Es ist aber nicht so, dass dieses Problem nicht gelöst werden kann! In meinem Falle sind die entsprechenden Webseiten nur über ein Apache-Reverse Proxy erreichbar, welches die einzige Aufgabe hat, Sicherheit zu gewähren. Letzteres läuft derzeit mit basic authentication und SSL (als nächstes will ich Digest Authentication einführen; ein erster Versuch war jedoch nicht zielführend).

In der Tat! Jquery ermöglicht, Buttons zu schalten ohne dass die ganze Seite gleich wieder geladen wird. Wenn man keine Buttons will/braucht, dann brauchts auch kein jquery!

Es gibt noch etwasy, was mir nicht gelungen ist. Gerne würde ich den Zustand einer Variable in einer Website darstellen - so wie das auch in Webfront geschieht.

Ich habe verstanden, dass dazu ein Ajax-Poll nötig ist, so dass die Webseite z.B. alle 10 Sekunden die Variable abfragt und allenfalls ändert - ohne dass gleich die ganze Seite wieder geladen wird. Hagbart: hättest Du vielleicht ein Code-Snippet für mich dazu??? :wink:

Den reinen Wert kriegst du per einfachem

 return  IPS_GetValue (VariablenID);

das kannst du so oft abrufen wie du lustig bist, wenns der einzige Wert ist geht das auch schnell…

… soll es so aufbereitet werden, wie im Webfront, also ggf. mit Profil-Anpassung usw. musst du etwas mehr ins PHP klimpern…

Vielen dank! Ich meinte zwar etwas anderes - aber ich hatte mich nicht eindeutig ausgedruckt.

Mein gegenwärtiges Hindernis ist, dass ich nicht weiss, wie ich eine IPS-Variable auf einer Webseite regelmässig updaten kann, ohne jedesmal die ganze Seite neu zu laden. Das geht offenbar nur mit Ajax/jquery, ähnlich zu dem obigen Skript für die Buttons.

Hallo,

ich suche nach einer solchen Lösung.

Nur: Die Website wird von einem anderen System (das zwar zufällig auf demselben REchner wie IPS läuft, aber eben vielleicht auch mal woanders) „angeboten“ (dynamische Webseite und daher auch authentifiziert etc.).

Frage also:

Was muss auf eine - nennen wir es für dieses Beispiel „externe“ Webesite eingebaut werden, um an IPS (z.B. an einen UDP Socket) einen (oneway, fire&forget) Befehl, oder sagen wir „String“ (wie´der dann interpretiert wird ist ne andere Sache, er soll aber im Socket ankommen) absetzen zu können?

jwka

Hallo,

da ich nach jedem Strohhalm greife, der mir evtl. ermöglicht, durch den Klick auf einen Button im WF eine IPS-Funktion bzw. ein IPS-Script auszuführen, hatte ich auch diese Variante versucht. Geht leider auch nicht! Die Buttons werden erstellt, lassen sich aber nicht klicken! Passiert rein gar nichts. Noch nicht einmal eine kleine Bewegung beim Klicken.

Was habe ich gemacht?

Unter webfront\user das File ControlInstance.php mit diesem Inhalt erstellt:

<?php 
if(isset($_GET['action'])  )
    { 
        $action = $_GET['action'];
        echo chr(13)."'".$action."'". "wird gleich ausgeführt".chr(13);
        eval($action); 
    } 

echo "ausgeführt!".chr(13);
?> 

Dann im IPS ein neues Script angelegt:

<?

// -----------------------------------------------------------------------------
// html-Code erstellen

//$str ='<script src="js/jquery-1.8.2.js"></script>';
$str = '<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>';

$str .= '<script type="text/javascript">';
$str .= 'function GenericAction($IpsCommand) {
	 $.get(\'ControlInstance.php\', { action: $IpsCommand, instance: "17111" }, function(data) {
  $(\'.result\').html(data);
  //alert(\'GenericAction was performed\' + data);
});
}</script>';


$str .= "<table width='90%' align='center'>";
$str .= '<tr>';
$str .= '<td align="center">';
$str .= '<input type="button" name="aktiv" class="LargeButton" onclick="GenericAction(\'SetValue(17111, true);\')" value="Schalter EIN" />';

$str .= '<td align="center">';
$str .= '<input type="button" name="deaktiv" class="LargeButton" onclick="GenericAction(\'SetValue (17111, false);\')" value="Schalter AUS"  />';

$str .= '</td>';
$str .= '</tr>';


$str .= '</table>';

//html in Variable schreiben zum Anzeigen im WF als ~HTMLBox
SetValue (49886 /*[Scripte\jquery\HTML-Box]*/, $str);
?>

Zusätzlich zur String-Variablen (49886) habe ich eine Boolean-Var (17111) angelegt. Diese soll durch die beiden Button umgeschaltet werden.

Also: Was mache ich hier falsch?

wf.JPG

Hallo Andreas,

hatte da einmal ein Miniskript für einen Forumskollegen gebastelt.

Anleitung in panik_haupt.ips.php beachten.

Ist zwar nicht mit Buttons sondern mit Grafiken aber vielleicht hilft es Dir auf die Sprünge.

Panik.rar (15 KB)

Hallo Werner,

komme erst jetzt dazu.
Feine Sache - geht. Habe mal auf Button umgestellt - alles Bestens. Danke!

Nun würde ich gern damit IPS-Befehle absetzen wollen, z.B. Licht schalten. Der Befehl dazu muss dann ja in der Variable $do1 bzw. $do2 eingebracht werden. Nur wie sorge ich nach Übergabe an der für dessen Ausführung? Derzeit wird übergebene Text angezeigt. Aber wie führe ich den Befehl aus, der per $action übergeben wird?

Anstatt der WFC_SendNotification baust Du dir entweder dort die Befehle deiner Wahl hin oder machst einen Skriptaufruf via IPS_RunScript(Ex)

case 'panik1':                    
  // Hier die Aktionen für Panik-Knopf 1                     
  WFC_SendNotification($id_wfc, "PANIK", $action, "Information", 5);                
break;                
case 'panik2':                    
  // Hier die Aktionen für Panik-Knopf 1                    
  WFC_SendNotification($id_wfc, "PANIK", $action, "Information", 5);                
break;

Steht ja eigentlich auch in den Kommentaren :wink:

Hallo Werner,

da habe ich mich wohl undeutig ausgedrückt.:confused:

Ich meinte, wenn der Inhalt von $action folgender íst:

HM_WriteValueBoolean(12345, "STATE", false);

Wie kann ich dann den Inhalt von $action als IPS-Befehl ausführen, so dass es dann thoretisch so aussieht:

case 'panik1':                    
  // Hier die Aktionen für Panik-Knopf 1 
  HM_WriteValueBoolean(12345, "STATE", false);                    
  WFC_SendNotification($id_wfc, "PANIK", $action, "Information", 5);                
break;                
case 'panik2':                    
  // Hier die Aktionen für Panik-Knopf 2
  HM_WriteValueBoolean(54321, "STATE", true);                   
  WFC_SendNotification($id_wfc, "PANIK", $action, "Information", 5);                
break;  

Also in $action wird ein kompletter IPS-Befehl bzw. Anweisung übergeben und soll dann an dieser Stelle ausgeführt werden.

EDIT: Mir fällt gerade ein, ob man zur Laufzeit ein neues Sript erstellen lassen kann, als dessen Inhalt den Wert aus $action einfügt und das Script dann ausführen lässt. Anschließend das Script wieder löschen. Quasi nur als temporäres Dasein. Somit enthält $action den Inahlt dieses Scriptes. Man wäre flexibel (könnte also unterschiedliche Befehle z.B. für das Lichtschalten unterbringen HM oder FS20 oder W&T oder …) und … Ich werde diesen Gedanken mal angehen. Nun aber erstmal in die Heia.

Hagbard235
Den reinen Wert kriegst du per einfachem

PHP-Code:
return IPS_GetValue (VariablenID);

Wo genau füge ich diesen „return“-Code ein. Das schreiben von Variablen klappt. Würde jetzt aber noch gerne den Status von Variablen lesen. Habe z.B. zwei Bilder „Light_on.png“ und „Light_off.png“. Diese will ich dann, auf meiner HTML-Seite, je nach Status von einer bestimmten Variablen anzeigen.
Das heißt:
Variable=False ==> Bild=„Light_off.png“
Variable=True ==> Bild=„Light_on.png“

Kann mir da einer auf die Sprünge helfen? Bin noch nicht so Fit in PHP und HTML, alles so bischen „Learning by doing“

Gruß
Martin