… natürlich ! Das könnte die Lösung sein, einfach die Aktionen aufteilen … ich sagte ja, ich steh auf dem Schlauch …
werde ich ausprobieren. Danke für den Tipp !
Die Scripte sind eigentlich relativ simpel (ist im Nachhinein immer so) und noch im Entwicklerstatus. Da kann man noch einiges optimieren. Ganz nach dem Motto „Form follows function“ …
Die TV-Remote.php sieht wie folgt aus (darauf verweise ich bei der „eigenen Aktion“ im Variablenprofil)
<?
//IP-Adressen definieren
$iptv = "192.168.17.222";
//URL definieren
$url = "http://".$iptv."/sony/IRCC"; //bsp. http://10.10.10.10/sony/IRCC
//XML-Grundstrukturen
$xml_string_start = '<?xml version="1.0"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:X_SendIRCC xmlns:u="urn:schemas-sony-com:service:IRCC:1">';
$xml_string_end = '</u:X_SendIRCC></s:Body></s:Envelope>';
//Befehle von WebFront
if($IPS_SENDER == "WebFront")
{
$key_pressed = $IPS_VALUE; //Übergabe der gedrückten Taste aus Webfront
}
//Befehl senden (wenn auf manuell Ausführen geklickt wurde)
if($_IPS['SENDER'] == 'Execute')
{
$key_pressed = 17; //Aktion definieren, beim direkten Ausführen des Scriptes
}
/* Befehle
-------------
*/
switch($key_pressed) {
case 0: //Taste 0
$IRCC_command = '<IRCCCode>AAAAAQAAAAEAAAAJAw==</IRCCCode>';
break;
case 1: //Taste 1
$IRCC_command = '<IRCCCode>AAAAAQAAAAEAAAAAAw==</IRCCCode>';
break;
case 2: //Taste 2
$IRCC_command = '<IRCCCode>AAAAAQAAAAEAAAABAw==</IRCCCode>';
break;
case 3: //Taste 3
$IRCC_command = '<IRCCCode>AAAAAQAAAAEAAAACAw==</IRCCCode>';
break;
case 4: //Taste 4
$IRCC_command = '<IRCCCode>AAAAAQAAAAEAAAADAw==</IRCCCode>';
break;
case 5: //Taste 5
$IRCC_command = '<IRCCCode>AAAAAQAAAAEAAAAEAw==</IRCCCode>';
break;
case 6: //Taste 6
$IRCC_command = '<IRCCCode>AAAAAQAAAAEAAAAFAw==</IRCCCode>';
break;
case 7: //Taste 7
$IRCC_command = '<IRCCCode>AAAAAQAAAAEAAAAGAw==</IRCCCode>';
break;
case 8: //Taste 8
$IRCC_command = '<IRCCCode>AAAAAQAAAAEAAAAHAw==</IRCCCode>';
break;
case 9: //Taste 9
$IRCC_command = '<IRCCCode>AAAAAQAAAAEAAAAIAw==</IRCCCode>';
break;
case 10: //Taste 10
$IRCC_command = '<IRCCCode>AAAAAgAAAJcAAAAMAw==</IRCCCode>';
break;
case 11: //Power On
//Wake on LAN verwenden
IPS_RunScript (31695 /*[Tools\TV-Remote\wakeTVonLAN.php]*/ );
exit;
break;
case 12: //Power Off
$IRCC_command = '<IRCCCode>AAAAAQAAAAEAAAAvAw==</IRCCCode>';
break;
case 13: //Kanal hoch
$IRCC_command = '<IRCCCode>AAAAAQAAAAEAAAAQAw==</IRCCCode>';
break;
case 14: //Kanal runter
$IRCC_command = '<IRCCCode>AAAAAQAAAAEAAAARAw==</IRCCCode>';
break;
case 15: //Lauter
$IRCC_command = '<IRCCCode>AAAAAQAAAAEAAAASAw==</IRCCCode>';
break;
case 16: //Leiser
$IRCC_command = '<IRCCCode>AAAAAQAAAAEAAAATAw==</IRCCCode>';
break;
case 17: //Mute toggle
$IRCC_command = '<IRCCCode>AAAAAQAAAAEAAAAUAw==</IRCCCode>';
break;
}
//Header definieren
$header = stream_context_create (array (
'http' => array (
'header' => "User-Agent: IPS-Script/1.0
".
"Content-Type: text/xml; charset=UTF-8
".
"Cache-Control: no-cache
".
"Pragma: no-cache
".
'SOAPACTION: "urn:schemas-sony-com:service:IRCC:1#X_SendIRCC"
'.
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
".
"Accept-Encoding: gzip, deflate
".
"Connection: close
",
)
));
//Befehl zusammensetzen
$xml_command = $xml_string_start;
$xml_command .= $IRCC_command;
$xml_command .= $xml_string_end;
//Senden vorbereiten
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
//curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_command);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, 2);
//Befehl senden
$data = curl_exec($ch);
echo "Data: ".$data."
";
if (curl_errno($ch))
{
print "Returncode: ".curl_errno($ch)."
<br>";
}
else
{
//echo "Kommando erfolgreich ausgeführt";
curl_close($ch);
}
?>
Die Datei wakeTVonLAN.php hat folgenden Inhalt (leider funktioniert WakeonLAN nur, wenn der TV nicht im Tiefschlaf ist → nach dem Ausschalten kann man ihn damit wieder einschalten, aber sobald er ein paar Minuten aus ist, gibt das Webinterface des TV keine Antwort mehr). Der Script ist keine Eigenleistung von mir, die Quelle ist aber leider nicht mehr bekannt.
<?php
$mac = 'xx:xx:xx:xx:xx:xx'; //MAC Adresse
$ip = 'udp://192.168.17.222'; //IP-Adresse
function wakeup($mac_addr,$router_addr) {
if ($fp = fsockopen($router_addr, 9, $errno, $errstr, 4)) {
//erlaubte Zeichen:
$hexchars = array("0","1","2","3","4","5","6","7","8","9",
"A","B","C","D","E","F",
"a","b","c","d","e","f"
);
// 6 "volle" bytes (Also mit Wert 255 bzw. FF in hexadezimal)
$data = "\xFF\xFF\xFF\xFF\xFF\xFF";
$hexmac = "";
// Jetzt werden unntige zeichen in der mac-adresse
// entfern (also z.B. die bindestriche usw.)
for ($i = 0; $i < strlen($mac_addr); $i++) {
if (!in_array(substr($mac_addr, $i, 1), $hexchars)) {
$mac_addr = str_replace(substr($mac_addr, $i, 1), "",
$mac_addr);
}
}
for ($i = 0; $i < 12; $i += 2) {
$hexmac .= chr(hexdec(substr($mac_addr, $i, 2)));
}
// Hexadresse wird 16mal hintereinandergeschrieben
for ($i = 0; $i < 16; $i++) {
$data .= $hexmac;
}
fputs($fp, $data);
fclose($fp);
echo 'MagicPaket wurde verschickt';
return true;
}
Else {
echo "<b>Warnung: $errno</b> $errstr<br>";
return false;
}
}
wakeup($mac, $ip);
?>
Ein Schönheitsfehler hat das Ganze noch. Im Webfront wird bei jedem Tastendruck immer der XML-Befehl angezeigt und muss weggeklickt werden. Irgendwo habe ich wohl noch etwas übersehen (auch wenn man die debug-echos weglässt). 
Last but not least: Die Scripts funktionieren bei mir auf einem Sony KDL-47W805A mit Softwarestand PKG4.430EUA. Andere Geräte konnte ich aus Mangel an Verfügbarkeit nicht testen.
Gruss Letraz