Darstellung Variablenprofil in Webfront

Guten Abend zusammen

Ich möchte meinen Sony-TV via Webfront steuern. Nach einigem Ärger über die fehlende Dokumentation von Sony habe ich das auch hinbekommen.

Auf dem Bild unten sieht man den jetzgen Zustand: Die Variable TVRemote hat ein eigenes Variablenprofil erhalten mit den entsprechenden Werten rechts daneben. Soweit so gut. Funktioniert sogar wie gewünscht, klicke ich einen Wert an, wird der entsprechende Befehl via Netzwerk an den TV gesendet und umgesetzt…

Nur ist das ganze optisch nicht sehr ansprechend. Gibt es eine Möglichkeit die Werte im Variablenprofil in der Webfront-Darstellung irgendwie zu formatieren und gruppiert anzuzeigen ? Irgendwie steht ich da gerade auf dem Schlauch …

Gruss Letraz

Hallo,

teile doch einfach die Aktionen auf einzelne Variablen mit jeweils eigenem Profil auf …

PS: zeige mir doch bitte mal die Skripte - ich möchte meinen Bravia auch irgendwie „remoten“ - was bisher auch mangels Doku stagnierte. Vielleicht gibt es dann sogar „Synergien“ :wink:

LG Tom

… natürlich ! Das könnte die Lösung sein, einfach die Aktionen aufteilen … ich sagte ja, ich steh auf dem Schlauch … :slight_smile: 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). :confused:

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

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).

Moin Letraz…

ändere mal folgenden Teil im 1.Skript. Das ist ein noch ein „echo“ drin welches nicht „ausgeklammert“ ist.

 

//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);
  }
?>

Gruß,
Peter

Hallo Peter

Soo einfach ist die Lösung dann doch nicht. Ich hatte ja geschrieben das Problem tritt auch auf, wenn man die debug-echos weglässt… Der Befehl

$data = curl_exec($ch);

erzeugt diese Ausgabe ungefragt …

Des Rätsels Lösung war schlussendlich ein genaueres Lesen der PHP-curl-Dokumentation:

PHP-Dok.png

Folgende Zeile als weitere Curl-Option hat das Problem daher nun beseitigt:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

Nun berühre ich das Touchpanel im Wohnzimmer und sehe die Reaktion nur auf dem TV :slight_smile: Wenn ich nun auch noch das Einschaltproblem hinkriege läuft alles wie gewünscht. TV Steuerung via Touchpanel dank :loveips:

Gruss Letraz

Hallo.

Laufen die Scripte auch auf anderen Sony-TVs? Möchte mit den kdl-32w705b zulegen. Da Samsung mit der H-Serie das Protokoll geändert hat, ist dass eine Alternative. Es geht mir eigentlich nur um das Ausschalten per Lan.

Hallo.

Laufen die Scripte auch auf anderen Sony-TVs? Möchte mit den kdl-32w705b zulegen. Da Samsung mit der H-Serie das Protokoll geändert hat, ist dass eine Alternative. Es geht mir eigentlich nur um das Ausschalten per Lan.

@letraz: Wo hast du die Codes für die Tasten her?

Hallo hrahlers
In meinem Post steht:

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.

Ich könnte mir vorstellen, dass es mit deinem Wunschmodell funktioniert. Aber genau weisst du es erst, wenn du es probiert hast …

Die sog. IRCC-Codes habe ich irgendwo im Netz gefunden. Die genaue Quelle weiss ich nicht mehr. Google hilft da gerne weiter …

Gruss letraz

PS: Wenn man offiziell bei Sony nach den IP-Steuermöglichkeiten der Geräte fragt lautet die Antwort, dass man Sony-TV’s nicht per IP-Verbindung steuern kann … nun, wie man sieht es geht trotzdem :slight_smile: