Verstärker Pioneer VSX-920 per Lan steuern

Achtung Update:

Hier die Möglichkeit den Pioneer VSX-920 (vermutlich auch die höheren Modelle) per LAN Zugriff zu steuern.

Da ich schon mal gemeckert habe, das mich das zusammen suchen von Code Schnipsel gestört hat, wollte ich versuchen es geringfügig besser zu machen. Hoffe es ist mir gelungen.

An dieser Stelle @IPS Team:
Dingender Feature Request: Export und Import von Objekten. Sicher als Code Generator wegen der ID Generierung aber das würde hier sicher noch mehr PHP Module ergeben.

Es gibt 3 Scripte:

  1. Script in IPS anlegen und den Inhalt von „PioneerAVR_Install.isp.php“ einfügen .
  2. Im Script die Zeile mit $IP_HOST=„192.168.0.48“ anpassen und die IP Adresse des Pioneer eingeben. Anschließend das Script ausführen.
  3. Es wird „hoffentlich“ alles angelegt. Dabei auch zwei Scripte unter der angelegten Instanz
  4. Die Inhalte der Scripte „PioneerAVR_Const.ips.php“ und „PioneerAVR.ips.php“ in die vorab angelegten Hüllen einfügen, also Copy und Paste.
  5. Instanz dahin verschieben wo man sie haben will und dann den angelegten Socket starten.

FERTIG.

PioneerAVR_Install.isp.php

<?
<?

$IP_HOST="192.168.0.48";
/* //was für Module gibt es?
foreach(IPS_GetModuleList() as $guid)
{
	$module = IPS_GetModule($guid);
	echo $module['ModuleName']." = ".$guid."
";
}
	 */

	$object = IPS_GetObject($IPS_SELF);
	$parentID = $object['ParentID'];

	// dummy instanz erstellen
	$ID_INSTANZ= IPS_CREATEINSTANCE("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
	IPS_SetParent($ID_INSTANZ, $parentID);
	IPS_SETName($ID_INSTANZ,"AV Reciever");

	// cutter instanz erstellen
	$ID_INSTANZ_CUTTER= IPS_CREATEINSTANCE("{AC6C6E74-C797-40B3-BA82-F135D941D1A2}");
	IPS_SETName($ID_INSTANZ_CUTTER,"AV_CUTTER");

	// registervariable instanz erstellen
	$ID_INSTANZ_REGISTER= IPS_CREATEINSTANCE("{F3855B3C-7CD6-47CA-97AB-E66D346C037F}");
	IPS_SetParent($ID_INSTANZ_REGISTER, $ID_INSTANZ);
	IPS_SETName($ID_INSTANZ_REGISTER,"AV_REGISTER");

	// client socket instanz erstellen
	$ID_INSTANZ_SOCKET= IPS_CREATEINSTANCE("{3CFF0FD9-E306-41DB-9B5A-9D06D38576C3}");
	IPS_SETName($ID_INSTANZ_SOCKET,"AV_SOCKET");
	CSCK_SetHost($ID_INSTANZ_SOCKET,$IP_HOST);
   CSCK_SetPort($ID_INSTANZ_SOCKET,8102);

	 //dummy pioneer script anlegen in das dann der inhalt einkopiert werden muss
	$ID_PIONEER_SCRIPT= CreateScriptByName("PioneerAVR", $ID_INSTANZ, "<?\r\r?>", false);
	 //dummy pioneer script für konstanten anlegen in das dann der inhalt einkopiert werden muss
	$ID_PIONEER_SCRIPT_CONF= CreateScriptByName("PioneerAVR_Const", $ID_INSTANZ, "<?\r\r?>", true);

	// timer der das script zykisch aufruft für power in abfrage
	$ID_EVENT = IPS_CreateEvent (1);
	IPS_SetEventCyclic($ID_EVENT, 2, 1, 0, 0, 2, 1);   //Jeden Tag jede Minute
	IPS_SetParent($ID_EVENT, $ID_PIONEER_SCRIPT);
	IPS_SetEventActive($ID_EVENT, true);  // Aktivert Ereignis
	
	// cutter,socket und register einrichten
	IPS_ConnectInstance($ID_INSTANZ_REGISTER, $ID_INSTANZ_CUTTER);
	RegVar_SetRXObjectID($ID_INSTANZ_REGISTER, $ID_PIONEER_SCRIPT);
	Cutter_SetParseType($ID_INSTANZ_CUTTER, 0);
	Cutter_SetRightCutChar($ID_INSTANZ_CUTTER, "
");
	IPS_ConnectInstance($ID_INSTANZ_CUTTER, $ID_INSTANZ_SOCKET);
	
	IPS_ApplyChanges($ID_INSTANZ_SOCKET);
	IPS_ApplyChanges($ID_INSTANZ_CUTTER);
	IPS_ApplyChanges($ID_INSTANZ_REGISTER);


	// eigene profile anlegen, dafür das vorhandene löschen
	IPS_DeleteVariableProfile("AVR_VOLUME");
	IPS_CreateVariableProfile ("AVR_VOLUME", 1 );
	IPS_SetVariableProfileText ("AVR_VOLUME", "", "%" );
	IPS_SetVariableProfileValues ("AVR_VOLUME", 0, 161 , 1 );
	IPS_SetVariableProfileIcon("AVR_VOLUME", "Speaker");

	// eigene profile anlegen, dafür das vorhandene löschen
	IPS_DeleteVariableProfile("AVR_LISTENINGMODE");
	IPS_CreateVariableProfile ("AVR_LISTENINGMODE", 1 );
   IPS_SetVariableProfileAssociation("AVR_LISTENINGMODE", 0, "Auto/ALC/Direct", "");
 	IPS_SetVariableProfileAssociation("AVR_LISTENINGMODE", 1, "Stereo", "");
 	IPS_SetVariableProfileAssociation("AVR_LISTENINGMODE", 2, "Standard", "");
 	IPS_SetVariableProfileAssociation("AVR_LISTENINGMODE", 3, "Adv. Surround", "");

	// eigene profile anlegen, dafür das vorhandene löschen
	// TODO: anpassen falls mehr funktionen gewünscht sind.
	IPS_DeleteVariableProfile("AVR_FUNCTION");
	IPS_CreateVariableProfile ("AVR_FUNCTION", 1 );
   IPS_SetVariableProfileAssociation("AVR_FUNCTION", 0, "DIVERES", "");
 	IPS_SetVariableProfileAssociation("AVR_FUNCTION", 2, "Tuner", "");
 	IPS_SetVariableProfileAssociation("AVR_FUNCTION", 10, "Video 1", "");
 	IPS_SetVariableProfileAssociation("AVR_FUNCTION", 17, "iPod", "");
 	IPS_SetVariableProfileAssociation("AVR_FUNCTION", 19, "HDMI 1", "");
 	IPS_SetVariableProfileAssociation("AVR_FUNCTION", 26, "Internetradio", "");
 	IPS_SetVariableProfileIcon("AVR_FUNCTION", "Shutter");
 	
	// power
	$VarID_Power= IPS_CreateVariable(0);
	// instanz zufügen
	IPS_SetParent($VarID_Power, $ID_INSTANZ);
	// Namen setzen
	IPS_SetName($VarID_Power, "Power");
	// profil nutzen
	IPS_SetVariableCustomProfile($VarID_Power, "~Switch");
	// aktion, script zuweisen
	IPS_SetVariableCustomAction($VarID_Power, $ID_PIONEER_SCRIPT);
	// reihenfolge setzen
	IPS_SetPosition($VarID_Power, 1);

	// display string
	$VarID_Display= IPS_CreateVariable(3);
	// instanz zufügen
	IPS_SetParent($VarID_Display, $ID_INSTANZ);
	// Namen setzen
	IPS_SetName($VarID_Display, "Display");
	// profil nutzen
	IPS_SetVariableCustomProfile($VarID_Display, "~String");
	// kein aktion, script zuweisen
	// reihenfolge setzen
	IPS_SetPosition($VarID_Display, 2);
	// icon zuweisen
 	IPS_SetIcon($VarID_Display, "Information");
	
	// lautstärke
	$VarID_Vol= IPS_CreateVariable(1);
	// instanz zufügen
	IPS_SetParent($VarID_Vol, $ID_INSTANZ);
	// Namen setzen
	IPS_SetName($VarID_Vol, "Lautstärke");
	// eigenes profil nutzen
	IPS_SetVariableCustomProfile($VarID_Vol, "AVR_VOLUME");
	// aktion, script zuweisen
	IPS_SetVariableCustomAction($VarID_Vol, $ID_PIONEER_SCRIPT);
	// reihenfolge setzen
	IPS_SetPosition($VarID_Vol, 3);

	// mute
	$VarID_Mute= IPS_CreateVariable(0);
	// instanz zufügen
	IPS_SetParent($VarID_Mute, $ID_INSTANZ);
	// Namen setzen
	IPS_SetName($VarID_Mute, "Mute");
	// profil nutzen
	IPS_SetVariableCustomProfile($VarID_Mute, "~Switch");
	// aktion, script zuweisen
	IPS_SetVariableCustomAction($VarID_Mute, $ID_PIONEER_SCRIPT);
	// reihenfolge setzen
	IPS_SetPosition($VarID_Mute, 4);

	// funktion
	$VarID_Fkt= IPS_CreateVariable(1);
	// instanz zufügen
	IPS_SetParent($VarID_Fkt, $ID_INSTANZ);
	// Namen setzen
	IPS_SetName($VarID_Fkt, "Funktion");
	// eigenes profil nutzen
	IPS_SetVariableCustomProfile($VarID_Fkt, "AVR_FUNCTION");
	// aktion, script zuweisen
	IPS_SetVariableCustomAction($VarID_Fkt, $ID_PIONEER_SCRIPT);
	// reihenfolge setzen
	IPS_SetPosition($VarID_Fkt, 5);

	// active listening mode
	$VarID_ALM= IPS_CreateVariable(3);
	// instanz zufügen
	IPS_SetParent($VarID_ALM, $ID_INSTANZ);
	// Namen setzen
	IPS_SetName($VarID_ALM, "Active Listening Mode");
	// profil nutzen
	IPS_SetVariableCustomProfile($VarID_ALM, "~String");
	// kein aktion, script zuweisen
	// reihenfolge setzen
	IPS_SetPosition($VarID_ALM, 6);
	// icon zuweisen
 	IPS_SetIcon($VarID_ALM, "Distance");

	// listening mode
	$VarID_LM= IPS_CreateVariable(1);
	// instanz zufügen
	IPS_SetParent($VarID_LM, $ID_INSTANZ);
	// Namen setzen
	IPS_SetName($VarID_LM, "Listening Mode");
	// eigenes profil nutzen
	IPS_SetVariableCustomProfile($VarID_LM, "AVR_LISTENINGMODE");
	// aktion, script zuweisen
	IPS_SetVariableCustomAction($VarID_LM, $ID_PIONEER_SCRIPT);
	// reihenfolge setzen
	IPS_SetPosition($VarID_LM, 7);

 	//ID des Webfront ermitteln
	$ID_WebFront = @IPS_GetObjectIDByName("WebFront Configurator", 0);

	 // pioneer script für variablen anlegen in das dann der inhalt einkopiert werden muss
	$SText="<?\r";
	$SText.="// statusvariablen des verstärkers\r";
	$SText.="define (\"ID_POWER\", ".$VarID_Power.");\r";
	$SText.="define (\"ID_DISPLAY\", ".$VarID_Display.");\r";
	$SText.="define (\"ID_MUTE\", ".$VarID_Mute.");\r";
	$SText.="define (\"ID_VOL\", ".$VarID_Vol.");\r";
	$SText.="define (\"ID_FUNCTION\", ".$VarID_Fkt.");\r";
	$SText.="define (\"ID_LISTENING_MODE\", ".$VarID_ALM.");\r";
	$SText.="define (\"ID_CHANGE_LISTENING_MODE\", ".$VarID_LM.");\r";
	//$SText.="// IP des Verstärkers\r";
	$SText.="\$IP_DEVICE=\"".$IP_HOST."\";\r";
	$SText.="// statusvariablen webfront und socket\r";
	$SText.="define (\"ID_SOCKET\", ".$ID_INSTANZ_SOCKET.");\r";
	$SText.="define (\"ID_WEBFRONT\", ".$ID_WebFront.");\r";
	$SText.="?>\r";

	$ID_PIONEER_SCRIPT_VARS= CreateScriptByName("PioneerAVR_Vars", $ID_INSTANZ, $SText, true);




	// Funktion zum erstellen eines Scripts
	//
	// Parameter:
	// ScriptNAME 	= Name wie das Script im Objektbaum heissen soll
	// ParentID    = Objekt ID unter der das Script untergehangen wird
	// ScriptTEXT  = Inhalt der Scriptdatei
	// FileFlag    = Kennzeichnung 0=Der Dateiname im script Ordner entspricht der generierten ObjektID
	//               1=Als Dateiname wird ScriptNAME genutzt. Damit sind definierte includes möglich
	function CreateScriptByName($ScriptNAME, $ParentID, $ScriptTEXT, $FileFlag)

	 {
	 global $IPS_SELF;
	 $ScriptID = @IPS_GetScriptIDByName($ScriptNAME, $ParentID);
	 if ($ScriptID == 0){
	  $ScriptID = IPS_CreateScript(0);
	  IPS_SetName($ScriptID, $ScriptNAME);
	  IPS_SetParent($ScriptID, $ParentID);
	  IPS_SetInfo($ScriptID, "This script was created by: #$IPS_SELF#");
		if ($FileFlag==false)
		{
	  		$filename=$ScriptID;
	  	}
	  	else
	   {
	      $filename=$ScriptNAME;
		}
	  $fh = fopen(IPS_GetKernelDir()."scripts\\".$filename.".ips.php", 'w') or die("can't open file");
	  fwrite($fh, $ScriptTEXT);
	  fclose($fh);
	  $ScriptPath = $filename.".ips.php";     //Skriptdatei

	  IPS_SetScriptFile($ScriptID, $ScriptPath);
	  IPS_SetHidden($ScriptID, true);
	  IPS_SetPosition($ScriptID, 98);
	 }
	return $ScriptID;
	}

?>
?>

PioneerAVR_Const.ips.php

<?

// funktionen ggf umbenenen falls diese auch im gerät umbenannt wurden
$function_list = array(
0 => "DIVERSE",
4 => "DVD",
25 => "BD",
5 => "TV/SAT",
15 => "DVR/BDR",
10 => "XBOX",
94 => "VIDEO 2",
19 => "PS3",
95 => "HDMI 2",
96 => "HDMI 3",
17 => "iPod/USB",
1 => "CD",
97 => "CD-R/TAPE",
2 => "TUNER",
26 => "INTERNET RADIO",
33 => "ADAPTER PORT"
);

// listening modes
$listening = array(
"0001" => "STEREO",
"0002" => "F.S.SURR FOCUS",
"0003" => "F.S.SURR WIDE",
"0004" => "RETRIEVER AIR",
"0101" => "DOLBY PLIIx MOVIE",
"0102" => "DOLBY PLII MOVIE",
"0103" => "DOLBY PLIIx MUSIC",
"0104" => "DOLBY PLII MUSIC",
"0105" => "DOLBY PLIIx GAME",
"0106" => "DOLBY PLII GAME",
"0107" => "DOLBY PRO LOGIC",
"0108" => "Neo:6 CINEMA",
"0109" => "Neo:6 MUSIC",
"010a" => "XM HD Surround",
"010b" => "NEURAL SURR",
"010c" => "",
"010d" => "DOLBY PLIIz HEIGHT",
"010e" => "WIDE SURR MOV",
"010f" => "WIDE SURR MUS",
"0201" => "ACTION",
"0202" => "DRAMA",
"0203" => "SCI-FI",
"0204" => "MONO FILM",
"0205" => "ENT.SHOW",
"0206" => "EXPANDED",
"0207" => "TV SURROUND",
"0208" => "ADVANCED GAME",
"0209" => "SPORTS",
"020a" => "CLASSICAL",
"020b" => "ROCK/POP",
"020c" => "UNPLUGGED",
"020d" => "EXT.STEREO",
"020e" => "PHONES SURR",
"0301" => "DOLBY PLIIx MV +THX",
"0302" => "DOLBY PLII MV +THX",
"0303" => "DOLBY PL +THX CIN",
"0304" => "Neo:6 CIN +THX",
"0305" => "THX CINEMA",
"0306" => "DOLBY PLIIx MS +THX",
"0307" => "DOLBY PLII MS +THX",
"0308" => "DOLBY PL +THX MS",
"0309" => "Neo:6 MUS +THX",
"030a" => "THX MUSIC",
"030b" => "DOLBY PLIIx GM +THX",
"030c" => "DOLBY PLII GM +THX",
"030d" => "DOLBY PL +THX GM",
"030e" => "THX ULTRA2 GM",
"030f" => "THX SELCT2 GM",
"0310" => "THX GAMES",
"0311" => "DOLBY PLIIz +THX MV",
"0312" => "DOLBY PLIIz +THX MU",
"0313" => "DOLBY PLIIz +THX GM",
"0401" => "STEREO",
"0402" => "DOLBY PLII MOVIE",
"0403" => "DOLBY PLIIx MOVIE",
"0404" => "Neo:6 CINEMA",
"0405" => "",
"0406" => "DOLBY DIGITAL EX",
"0407" => "DOLBY PLIIx MOVIE",
"0408" => "DTS+Neo:6",
"0409" => "ES MATRIX",
"040a" => "ES DISCRETE",
"040b" => "DTS-ES 7.1",
"040c" => "XM HD Surround",
"040d" => "NEURAL SURR",
"040e" => "RETRIEVER AIR",
"0501" => "STEREO",
"0502" => "DOLBY PLII MOVIE",
"0503" => "DOLBY PLIIx MOVIE",
"0504" => "Neo:6 CINEMA",
"0505" => "",
"0506" => "DOLBY DIGITAL EX",
"0507" => "DOLBY PLIIx MOVIE",
"0508" => "DTS+Neo:6",
"0509" => "ES MATRIX",
"050a" => "ES DISCRETE",
"050b" => "DTS-ES 7.1",
"050c" => "XM HD Surround",
"050d" => "NEURAL SURR",
"050e" => "RETRIEVER AIR",
"0601" => "STEREO",
"0602" => "DOLBY PLII MOVIE",
"0603" => "DOLBY PLIIx MOVIE",
"0604" => "Neo:6 CINEMA",
"0605" => "",
"0606" => "DOLBY DIGITAL EX",
"0607" => "DOLBY PLIIx MOVIE",
"0608" => "",
"0609" => "ES MATRIX",
"060a" => "ES DISCRETE",
"060b" => "DTS-ES 7.1",
"0701" => "",
"0702" => "DOLBY PLII MOVIE",
"0703" => "DOLBY PLIIx MOVIE",
"0704" => "Neo:6 CINEMA",
"0705" => "",
"0706" => "DOLBY DIGITAL EX",
"0707" => "DOLBY PLIIx MOVIE",
"0708" => "",
"0709" => "ES MATRIX",
"070a" => "ES DISCRETE",
"070b" => "DTS-ES 7.1",
"0881" => "OPTIMUM",
"0e01" => "HDMI THROUGH",
"0f01" => "MULTI CH IN",
"1101" => "DOLBY PLIIx MOVIE",
"1102" => "DOLBY PLIIx MUSIC",
"1103" => "DOLBY DIGITAL EX",
"1104" => "",
"1105" => "ES MATRIX",
"1106" => "ES DISCRETE",
"1107" => "DTS-ES 7.1",
"1108" => "",
"1109" => "DOLBY PLIIz HEIGHT",
"110a" => "WIDE SURR MOV",
"110b" => "WIDE SURR MUS",
"1301" => "THX Surr EX",
"1302" => "Neo:6 +THX CIN",
"1303" => "ES MTRX+THX CN",
"1304" => "ES DISC+THX CN",
"1305" => "ES 7.1+THX CIN",
"1306" => "DOLBY PLIIx MV +THX",
"1307" => "THX ULTRA2 CIN",
"1308" => "THX SELCT2 CIN",
"1309" => "THX CINEMA",
"130a" => "Neo:6 +THX MS",
"130b" => "ES MTRX+THX MS",
"130c" => "ES DISC+THX MS",
"130d" => "ES 7.1 +THX MS",
"130e" => "DOLBY PLIIx MS +THX",
"130f" => "THX ULTRA2 MS",
"1310" => "THX SELCT2 MS",
"1311" => "THX MUSIC",
"1312" => "Neo:6 +THX GM",
"1313" => "ES MTRX+THX GM",
"1314" => "ES DISC+THX GM",
"1315" => "ES 7.1 +THX GM",
"1316" => "DOLBY EX +THX GM",
"1317" => "THX ULTRA2 GM",
"1318" => "THX SELCT2 GM",
"1319" => "THX GAMES",
"131a" => "DOLBY PLIIz +THX MV",
"131b" => "DOLBY PLIIz +THX MU",
"131c" => "DOLBY PLIIz +THX GM",
)
?>

PioneerAVR.ips.php

<?
include "PioneerAVR_Const.ips.php";
include "PioneerAVR_Vars.ips.php";

// Name des variablenprofils für den funtionsschalter
$VAR_PROFILE_FUNCTION="AV_Function";

// ab hier braucht nichts geändert zu werden

// aufruf per register variable, script oder webfront?
if($IPS_SENDER == "RegisterVariable") {
	// daten aus dem cutter aufruf registervariable
	$data=$IPS_VALUE;
	//echo $data ;

	// lange zeile? dann war es die display anzeige
	if (strlen($data) ==32 )
	{
		// display
		$display = hex2str($data);
		//echo $display;

		// display variable updaten
		SetValueString(ID_DISPLAY, $display);

		// solange daten kommen ist das gerät an. aber dann jedesmal die power variable updaten und prüfen ist zu langsam
	}
	else
	{
	   // befehl bzw. antwort parsen
      echo $data ;
      // funktionen gibt es mit drei und zwei zeichen
      $lv_fkt2 = substr($data,0,2);  // funktion ersten 2 zeichen
      $lv_val2 = substr($data,2,4);  // value die letzten zeichen
      $lv_fkt3 = substr($data,0,3);  // funktion ersten 3 zeichen
      $lv_val3 = substr($data,3,3);  // value die letzten zeichen

		// lautstärke
		if ($lv_fkt3=="VOL")
    	{
    	   // umrechnung des wertes in dB quelle: pioneer javascript
    	   // echo (($lv_val3-161)*0.5)."dB";

			// verstärker anzeige in dB. Rückgabe aber als Integer einfach als Prozent übernehmen
			// nur bei veränderung aktualisieren
			if (GetValue(ID_VOL) != $lv_val3)
			{
				SetValue(ID_VOL,$lv_val3);
			}
		}

		// mute
		if ($lv_fkt3=="MUT")
	  	{
	  	   // mute ändern nur wenn die variable nicht aktuell ist
			if($lv_val3=="1" && GetValue(ID_MUTE)==true)
			{
				SetValue(ID_MUTE,false);	// mute off
			}
			if($lv_val3=="0" && GetValue(ID_MUTE)==false)
			{
				SetValue(ID_MUTE,true);    // mute on
			}
		}
		// funktion (eingänge)
		if ($lv_fkt2=="FN")
	  	{
	  	   // funktion ändern nur wenn die variable nicht aktuell ist
			if (GetValue(ID_FUNCTION) != $lv_val2)
			{
				// liste der gültigen funktionen
				if ($lv_val2==26 || $lv_val2==19 || $lv_val2==17 || $lv_val2==10 || $lv_val2==2)
				{
			   	SetValue(ID_FUNCTION,$lv_val2);    // funktion setzen
			   	echo"set ".$lv_fkt2." to ".$lv_val2.$function_list[0];
			   	// beschriftung des feldes ändern iweder auf default
			   	IPS_SetVariableProfileAssociation($VAR_PROFILE_FUNCTION,0,$function_list[0],"");
					// TODO: bei änderung webfront refreshen
					// TODO: bei betätigen im webfront wird nicht der default aktualisiert
               WFC_Reload(ID_WEBFRONT);
				}
		 		else
		 		{
		 		   echo "integer".(integer)$lv_val2;
		 		   SetValue(ID_FUNCTION,0);    // funktion =0 also diverses für die keine schaltfläche hinterlegt sind. bzw nicht gebraucht werden.
		 		   // beschriftung des feldes ändern
		 		   IPS_SetVariableProfileAssociation($VAR_PROFILE_FUNCTION,0,$function_list[(integer)$lv_val2],"");
               // TODO: bei änderung webfront refreshen
					WFC_Reload(ID_WEBFRONT);
		 		}

		 	}
		}
		// listening mode
		if ($lv_fkt2=="LM")
		{
			echo "Listening Mode".$lv_val2;
		   SetValue(ID_LISTENING_MODE,$listening[$lv_val2]);    //
 		}
	}
}
if($IPS_SENDER == "WebFront") {

	// aktion per webfront
	// power schalter
	if ($IPS_VARIABLE==ID_POWER)
	{
	   // je nach zustand ausschalten. einschalten geht nicht über lan!
	   if ($IPS_VALUE == true)
	   {
	      // wenn der pioneer eingeschaltet ist und dann vom netz getrennt wird und danach wieder strom bekommt
	      // behält er den letzten zustand. fazit: schaltbare steckdose
	      // nachteil: dann ggf. einschalten über die fernbedienung nicht mehr möglich
	      //
	      // wenn auf true gewechelt, dann kein wechsel vornehmen da einschalten nicht möglich
	   	//SetValue($ID_POWER, false);
	   }
	   else
		{
			$ret = sendCommand("PF");     		/// ausschaltbefehl
	   	SetValue(ID_POWER, $IPS_VALUE);     // varaible für power off setzen
	   	SetValue(ID_DISPLAY, "");           // bei aus das diplay löschen
	   	avOff();										// variablen + schalter ausblenden
	   }

	}

	// TODO: display schalter zur statusabfrage
	if ($IPS_VARIABLE==ID_DISPLAY)
	{
		$ret = sendCommand("STS");     // Display Status abfrage, ergebnis wird nach und nach angezeigt
 	}

	// mute schalter
	if ($IPS_VARIABLE==ID_MUTE)
	{
	   // je nach zustand ausschalten. einschalten geht nicht über lan!
	   if ($IPS_VALUE == true)
	   {
			$ret = sendCommand("MO");     // mute on
	   	SetValue(ID_MUTE, $IPS_VALUE);
	   }
	   else
		{
			$ret = sendCommand("MF");     // mute off
	   	SetValue(ID_MUTE, $IPS_VALUE);
	   }

	}

	// lautstärke schalter
	if ($IPS_VARIABLE==ID_VOL)
	{
	   //echo $IPS_VALUE."VL";
	   if (GetValue(ID_VOL) != $IPS_VALUE )
	   {
	      // Werte von 0 bis 161(voll aufgedreht)
	      // so muss auch das profil der volumen variablen angelegt sein.
			$ret = sendCommand($IPS_VALUE."VL");     // vol direkt setzen
	   	SetValue(ID_VOL, $IPS_VALUE);
	   }
	}

	// funktions schalter
	if ($IPS_VARIABLE==ID_FUNCTION)
	{
	   //echo $IPS_VALUE."FN";
	   if (GetValue(ID_FUNCTION) != $IPS_VALUE )
	   {
	      // einstelige zahlen mit 0 voranstellen
	      $tmp_val = substr("0".$IPS_VALUE,-2);
			$ret = sendCommand($tmp_val."FN");     // Funktion direkt setzen
	   	SetValue(ID_FUNCTION, $tmp_val);
	   }
	}

	// listening mode schalter
	if ($IPS_VARIABLE==ID_CHANGE_LISTENING_MODE)
	{
	   	//echo "Value ".$IPS_VALUE;
			if ($IPS_VALUE=="0")
	      {
	         $ret = sendCommand("0005SR");     // auto cycle
	      }
       	else if ($IPS_VALUE=="1")
	      {
	         $ret = sendCommand("0001SR");     // STEREO cycle
	      }
	      else if ($IPS_VALUE=="2")
	      {
	         $ret = sendCommand("0010SR");     // Standard cycle
	      }
	      else if ($IPS_VALUE=="3")
	      {
	         $ret = sendCommand("0100SR");     // Adv. Surround cycle
	      }
	      // einstelige zahlen mit 0 voranstellen
	      //$tmp_val = substr("0".$IPS_VALUE,-2);
			//$ret = sendCommand($tmp_val."FN");     // Funktion direkt setzen
	   	SetValue(ID_CHANGE_LISTENING_MODE, $IPS_VALUE);


	}

}

// zeitliche events abfragen
if($IPS_SENDER == "TimerEvent") {

	// aktion per timer (hearth beat script)

	// Socket prüfung funktioniert nicht. daher die ping variante
	// hearthbeat für power on
	if (Sys_Ping($IP_DEVICE, 1000) )
   {
   	// gerät eingeschaltet, aber variable nicht erneut setzen wenn schon on
   	if (GetValue(ID_POWER)==false)
  		{
   		SetValue(ID_POWER,true);
			avOn();		// variablen, schalter ausblenden

			// prüfkommando nur beim einschalten absenden
			// regelmäßige prüfung nicht notwendig da bei fernbedienungsaktionen die anworten empfangen werden
			$ret = sendCommand("?V");     // welche lautstärke
			$ret = sendCommand("?M");     // mute
			$ret = sendCommand("?F");     // funktion
			$ret = sendCommand("?L");     // listening mode
		}
   }
  	else
 	{
   	// gerät ausgeschaltet, aber variable nicht erneut setzen wenn schon off
   	if (GetValue(ID_POWER)==true)
  		{
		 	// beschriftung der funktion wieder auf default ändern
		 	IPS_SetVariableProfileAssociation($VAR_PROFILE_FUNCTION,0,$function_list[0],"");

   		SetValue(ID_POWER,false);
			avOff();		// variablen, schalter ausblenden
   	}
   }


}

// funktion um die hexzeile vom reciever in ascii zu decodieren
function hex2str($hex)
{
	// die ersten  zeichen gehören zur funktionsart
	$hex = substr($hex,4,strlen($hex) - 4);

	//echo $hex;

	// TODO: for schleife ist eigentlich zu langsam, gibt es was besseres?
	$str="";
	for($i=0;$i<strlen($hex);$i+=2)
	{
		$str.=chr(hexdec(substr($hex,$i,2)));
	}
	return $str;
}

function sendCommand($com)
{
	$feedback= CSCK_SendText(ID_SOCKET /*[Client Socket]*/, $com.chr(13));

	return $feedback;
}

// av reciver on - also bedienelemente sichtbar machen
function avOn()
{
	// power wurde nicht ausgeblendet
	IPS_SetHidden(ID_MUTE, false);
	IPS_SetHidden(ID_VOL, false);
	IPS_SetHidden(ID_FUNCTION, false);
	IPS_SetHidden(ID_LISTENING_MODE, false);
	IPS_SetHidden(ID_DISPLAY, false);
	IPS_SetHidden(ID_CHANGE_LISTENING_MODE, false);
	// webfront aktualisieren
	WFC_Reload(ID_WEBFRONT);
	//echo "refresh on";
}

// av reciver off - also bedienelemente ausblenden, dadurch kein exception handling im script
function avOff()
{
	// power bleibt immer sichtbar damit bleibt es beim zusammenklappen im webfront (oder falls mal einschalten geht)
   IPS_SetHidden(ID_MUTE, true);
	IPS_SetHidden(ID_VOL, true);
	IPS_SetHidden(ID_FUNCTION, true);
	IPS_SetHidden(ID_LISTENING_MODE, true);
	IPS_SetHidden(ID_DISPLAY, true);
	IPS_SetHidden(ID_LISTENING_MODE, true);
	IPS_SetHidden(ID_CHANGE_LISTENING_MODE, true);
	// webfront aktualisieren
	WFC_Reload(ID_WEBFRONT);
	//echo "refresh off";
}

?>

Ist sicher noch nicht perfekt. Feedback erwünscht.

Hi,
habs mit meinem Pioneer 1020K probiert,
Volume Regler, on-off, Display funktionert perfekt super skript.
Könntest du noch ein paar nähere Erklärungen für die Funktionen angeben
wie ich welche Quellen(TV / HDMI 3 usw.) im Webfont sichbar machen kann.
Hast du auch was finden können um mit definitiven Werten die Webradiosender umzuschalten ?
Aber jetzt schon mal ein super script.
Danke Vielmals
Matthias

Um mehr Funktionen zu erhalten müssen die Zusätzlichen Werte in das Install Script aufgenommern werden. Da steht schon ein TODO drin

..
	// eigene profile anlegen, dafür das vorhandene löschen
	// TODO: anpassen falls mehr funktionen gewünscht sind.
	IPS_DeleteVariableProfile("AVR_FUNCTION");
	IPS_CreateVariableProfile ("AVR_FUNCTION", 1 );
    IPS_SetVariableProfileAssociation("AVR_FUNCTION", 0, "DIVERES", "");
 	IPS_SetVariableProfileAssociation("AVR_FUNCTION", 2, "Tuner", "");
 	IPS_SetVariableProfileAssociation("AVR_FUNCTION", 10, "Video 1", "");
 	IPS_SetVariableProfileAssociation("AVR_FUNCTION", 17, "iPod", "");
 	IPS_SetVariableProfileAssociation("AVR_FUNCTION", 19, "HDMI 1", "");
 	IPS_SetVariableProfileAssociation("AVR_FUNCTION", 26, "Internetradio", "");
 	IPS_SetVariableProfileIcon("AVR_FUNCTION", "Shutter");
 	
..

Die passenden Werte sind in der Config Datei.

..
0 => "DIVERSE",
4 => "DVD",
25 => "BD",
5 => "TV/SAT",
15 => "DVR/BDR",
10 => "XBOX",
94 => "VIDEO 2",
19 => "PS3",
95 => "HDMI 2",
96 => "HDMI 3",
17 => "iPod/USB",
1 => "CD",
97 => "CD-R/TAPE",
2 => "TUNER",
26 => "INTERNET RADIO",
33 => "ADAPTER PORT"
..

Also für HDMI2 einfach eine Zeile

IPS_SetVariableProfileAssociation("AVR_FUNCTION", 95, "HDMI 2", "");

zufügen.

BTW: hab ich jetzt nicht ausprobiert :wink:

Weitere Funktionen werden folgen. Also Tuner Sender schalten und Internet Radio Streams umschalten. Für letzteres gibt es leider noch keine Doku.

Noch ein Hinweise zum Script:

  • zu den Funktionen. Wird eine Funktion per Fernbedienung geschaltet die nicht aufgelistet ist. Wird der Wert= DEFAULT mit der Funktion überschrieben. Beim Ausschalten solle dann wieder ein DEFAUT drin stehen.

Problem: Ich habe mal beobachtet, dass die Reihenfolge durcheinander gewürfelt wurde. Woran es lag weiss ich nicht

  • Power Off
    Beim Ausschalten werden die Bedienelemente auch ausgeblendet. Die kann natürlich aufgrund der verzögerten Erkennung ein wenig dauern.

vg
mäc

wo hast du eigentlich herausgefunden das der 1020 920 per Lan gesteuert werden kann ? bzw wie kann man sehen welche Befehle per Lan gesendet werden können ? Ist das was offizielles von Pioneer ?
Danke für die Info werds später mal mit dem Install.php ausprobieren.
mfg
Matthias

Hatt ich schon mal im Thead für Verstärker per Lan steuern geschrieben. Über die IPhone Anwendung, sowie Dokumenten im Internet sowie der Integrierten Webseite für die Radiostreams bin ich zum Port gekommen. In den PDF Dokus von Pioneer (alle leider älter) konnte ich dementsprechend das ganz nachbilden.

Die Steuerung mit dem Internetradio wird daher schwerer, weil ich noch nicht die Befehle kenne. Es gibt noch keine Doku im Netz dazu. Die Befehle sind aber mit sicherheit enthalten.

Also wenn da jemand schon was findet bin ich daran sehr interessiert.

@Mäc: Wow, du scheinst hier gerade Pionierarbeit mit dem Pionier zu betreiben :smiley:

Mal ne kurze Frage, kann man die ganzen Steuerbefehle auch irgendwie in eine einfache Homepage einbauen, so dass ich mittels jeden Browsers das Gerät steuern kann, ohne das der WinRechner mit IP Symcom hochgefahren ist?

Grüße Thomas

Mal ne kurze Frage, kann man die ganzen Steuerbefehle auch irgendwie in eine einfache Homepage einbauen, so dass ich mittels jeden Browsers das Gerät steuern kann, ohne das der WinRechner mit IP Symcom hochgefahren ist?

Also generell wäre es möglich. Ich habe es allerdings noch nicht geschafft.

Problem ist das der integrierte Server den Post des Client prüft ob. Folglich ein aufruf vom eigenen Host. Dieses konnte ich mit Firefox noch nicht umbiegen.
Also ich wollte dem Pioneer vorgaukeln das er meinen Webserver als seinen eigenen betrachtet.

Das im Pioneer enthaltene JavaScript kann man einbinden. Damit wäre nur möglich die Internetstreams zu pflegen. Das Script kann aber eigentlich mehr.

Der Support von Pioneer war nicht wirklich eine Hilfe. Ich denke generell wäre es möglich mit dem integrierte JavaScript alles zu steuern.

Hallo,
super tool für die Kommunikation mit dem VSX-920.:slight_smile:
Ich stehe vor dem Problem der Lautsprecherumschaltung von A nach B. Im Display erscheint ordnungsgemäß SPK 0 bis 3, aber wie kann ich aus IPS heraus die Umschaltung realisieren?
mfg.
Rayk

von einem anderen VSX gibt es ein paar Commands: http://www.pioneerelectronics.com/pio/pe/images/portal/cit_3424/492741580VSX92TXH_RS232C_Protocols.pdf

Hab ich Dich richtig verstanden es geht um die Zonen umschaltung?

Dann musst Du das so erweitern das ein Befehl: APO geschickt wird. Das wäre nach der Liste PowerOn für Zone 2.

Ich habe leider keine zweite Zone im Einsatz daher ist mein Testbedarf gering.
Neben Zone muss noch eine Laustärkeregelung dazu: Für Vol+ wäre ein ZU zu senden.

hallo zusammen,

ich habe mir auch den Pioneer VSX-920 zugelegt. Jetzt stelle ich mir die frage wie ich am besten meine mp3s von meinem rechner per lan auf meinen verstärker bekomme. Hier sind ja scheinbar einige sehr versierte leute am werk!
Ich kann auf jedem fall dem thread nicht ganz folgen, wie funktioniert die sache mit der fernsteuerung? so wie ich das verstehe benötigt man noch zusätzliche hardware!?

danke schon mal!

grüße schodra

Du brauchst keine neue Hardware. Wenn Du IPS am laufen hast reicht das Script. Dieses verbindet sich via LAN auf den Pioneer und kann dieses dadurch Steuern und Abfragen.

Da hab ich mir auch schon mal Gedanken gemacht. Ich sehe zwei Ansätze.

  1. Auf dem Rechner wo IPS läuft streamst Du die mp3 Dateien (z.b. mit VLC). Die Steuerung sollte dann in IPS integriert werden. Den „Live“ Stream trägst Du als URL im Internetradio des Pioneers ein.
    Das hab ich noch nicht probiert.

  2. Einfach nen iPod synchronisieren und anstecken.

So auf den amerikanischen Seiten hab ich eine neuere Doku gefunden.

http://www.pioneerelectronics.com/StaticFiles/PUSA/Files/2010%20USA%20AVR%20RS-232C%20&%20IP%20Commands%20for%20CI.pdf

Einige Befehle hab ich ausprobiert, so dass ich vermute das nun die doku vollständig ist.

Interessant ist der Befehl z.b. „?RGB19“. Damit bekommt man die Bezeichnung des Eingangs zurück in meinem Fall PS3 anstelle der Default Belegung HDMI.

Also da steckt nun viel Potential drin. Denke als Erstes werd ich eine Internetradio Bedienung probieren.

zwischen Frage:

Kann ich den Pioneer VSX-920 auch als 5.1 Verstärker betreiben … ich will eigentlich nicht ganz so viele Lautsprecher im Wohmzimmer verteilen (Rechts, Links ist meist e’ nicht so einfach in einem bewohnten Raum zu realisieren)

Ansonsten scheint es ein recht gutes Gerät zu sein, vorallem gut steuerbar.

Überlege mir gerade auch die Anschaffung! :cool:

Ja, hab ich auch so. Nur das ich mich mittlerweile geärgert habe warum ich beim Haus sanieren nicht an 7.1 bzw. eine zweite Zone gedacht habe. Aber ich konnte nicht an alles denken :wink:

Hallo,
danke für die Doku mit den Steuerbefehlen, nun kann ich endlich meine Lautsprecher von A nach B umschalten. Nur bei der Internetradio Bedienung stehe ich total auf dem Schlauch, da auch keine Zeichen bei der Senderumschaltung von IPS empfangen werden (nur ein R???) komme ich nicht weiter…

im moment hab ich wenig Zeit das ganze zu erweitern. Aber wäre klasse wenn Ihr Erweiterungen nach dem Test in das Installationsscript mit aufnimmt.

Internetradio hab ich auch mal kurz probiert. Die Steuerung scheint ein wenig komisch zu sein. Wenn alle Stricke reissen dann muss die Weboberfläche her halten.

Hi zusammen,
mal ganz dumm gefragt, wie würde denn ein nackter Befehl (per send command ?) zum Receiver denn aussehen ? z.B. A + B Speaker umschalten.
Vielen Dank

Also als erstes so allgemein zur Info. Ich hab nun Antwort vom Pioneer Support. Die haben mir folgende Doku geschickt. Zum einen die IR Codes und dann die RS232 Commands.

Ohne mich damit beschäftig zu haben. Was ist denn Speaker A und B?
Nach Seite 10 der Doku würde es sein:

Command: *SPK<CR>
Wobei der * ersetzt wird durch:
0: SPEAKER OFF
1: SPEAKER A ON
2: SPEAKER B ON
3: SPEAKER A+B ON
9: SPEAKERS (cyclic)

Als Antwort erhält man dann: SPK*<CR+LF> wobei * wieder für die Zahl steht.

Korrektur * Datei anhang war zu gross daher konnte ich Ihn nicht hochladen

IR codes_xx20.pdf (69.7 KB)

und wie sieht das ganze in einem PHP Bafehl aus ?