Receiver Pioneer VSX-923 per Lan steuern

Dieses Skript basiert auf der Arbeit von „mäc“ und dem Thread:
https://www.symcon.de/forum/threads/10828-Verst%C3%A4rker-Pioneer-VSX-920-per-Lan-steuern

Die Ansteuerung wurde an den Pioneer VSX-923 angepasst, sollte wohl auch für diese Geräte (SC-LX87, SC-LX77, SC-LX57, SC-2023, SC-1223, VSX-1123, VSX-923) funktionieren, da diese im gleichen Handbuch beschrieben sind.

Feedback ist gerne erwünscht

MR_20170820_205731.jpg

Installationshinweise:

0.) Skript wurde in IPS 4.3 erstellt
1.) Leeres Skript erzeugen (Name z.B. „PioneerVSX-923_Install“)
2.) Skript an den Ort (Kategorie,…) verschieben, in dem die Objekte eingebaut werden sollen
3.) Inhalt für INSTALL-Skript einfügen und CONFIG-Werte im Skript an anpassen
4.) Install-Skript ausführen
5.) Haupt-Skript mit Code auffüllen (Achtung: nicht include-Zeilen überschreiben)
6.) Konstanten-Skript mit Code auffüllen
7.) Auf der Statusseite des Receivers (http://IP-Adresse) überprüfen/aktivieren, dass der AVR im Standby erreichbar bleibt (Network Standby ON)
-> Fertig

Install-Skript:


<?
###################  CONFIG-START  ################### 

define ('ID_WebFront', "");				// WebFront-ID
define ('NAME_DEVICE',"Pioneer VSX-923");		// Gerätebenennung
define ('IP_DEVICE',"");				// AVR IP-Adresse
define ('PORT_DEVICE',"8102");					// Kommunikationsport
// Zum Testen: direkte Kommunikation per telnet (Windows-Taste -> Eingabeaufforderung (CMD) -> telnet 10.0.0.42 8102

###################  CONFIG-ENDE  ###################

if (ID_WebFront=="" or NAME_DEVICE=="" or IP_DEVICE=="" or PORT_DEVICE=="") {echo("CONFIG-Daten unvollständig!"); return;} 

$ParentID=IPS_GetParent($_IPS['SELF']);

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


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


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

// client socket instanz erstellen 
$ID_INSTANZ_SOCKET= IPS_CREATEINSTANCE("{3CFF0FD9-E306-41DB-9B5A-9D06D38576C3}"); 
IPS_SETName($ID_INSTANZ_SOCKET, NAME_DEVICE."_SOCKET"); 
CSCK_SetHost($ID_INSTANZ_SOCKET,IP_DEVICE); 
CSCK_SetPort($ID_INSTANZ_SOCKET,PORT_DEVICE);
IPS_SetProperty($ID_INSTANZ_SOCKET, "Open", true);

//dummy pioneer script für konstanten anlegen in das dann der inhalt einkopiert werden muss 
$ID_PIONEER_SCRIPT_CONF= CreateScriptByName(NAME_DEVICE."_Const", $ID_INSTANZ, "<?\r\r?>");


//dummy pioneer script anlegen in das dann der inhalt einkopiert werden muss  
$ID_PIONEER_SCRIPT= CreateScriptByName(NAME_DEVICE, $ID_INSTANZ, "<?\r\r?>");


// 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, 5);   //Jeden Tag jede 5 Minuten 
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); 



// eigenes Profil anlegen, dafür das vorhandene löschen
if (IPS_VariableProfileExists("AVR_VOLUME")) 
IPS_DeleteVariableProfile("AVR_VOLUME"); 
IPS_CreateVariableProfile ("AVR_VOLUME", 1 ); 
IPS_SetVariableProfileText ("AVR_VOLUME", "", "%" ); 
IPS_SetVariableProfileValues ("AVR_VOLUME", 40, 161 , 1 ); 
IPS_SetVariableProfileIcon("AVR_VOLUME", "Speaker");

// eigenes Profil anlegen, dafür das vorhandene löschen
if (IPS_VariableProfileExists("AVR_LISTENINGMODE"))
IPS_DeleteVariableProfile("AVR_LISTENINGMODE"); 
IPS_CreateVariableProfile ("AVR_LISTENINGMODE", 1 ); 
IPS_SetVariableProfileIcon("AVR_LISTENINGMODE", "Music");
IPS_SetVariableProfileAssociation("AVR_LISTENINGMODE", 1, "Auto.SURR/ALC/Direct", "", -1); 
IPS_SetVariableProfileAssociation("AVR_LISTENINGMODE", 2, "Std.SURR", "", -1); 
IPS_SetVariableProfileAssociation("AVR_LISTENINGMODE", 3, "Adv.SURR", "", -1);


// eigenes Profil anlegen, dafür das vorhandene löschen
if (IPS_VariableProfileExists("AVR_LISTENINGMODE_EXT"))
IPS_DeleteVariableProfile("AVR_LISTENINGMODE_EXT"); 
IPS_CreateVariableProfile ("AVR_LISTENINGMODE_EXT", 1 ); 
IPS_SetVariableProfileIcon("AVR_LISTENINGMODE_EXT", "Music");
IPS_SetVariableProfileAssociation("AVR_LISTENINGMODE_EXT", 1, "STEREO", "", -1); 
IPS_SetVariableProfileAssociation("AVR_LISTENINGMODE_EXT", 2, "EXTENDED STEREO", "", -1); 
IPS_SetVariableProfileAssociation("AVR_LISTENINGMODE_EXT", 3, "DOLBY PROLOGIC", "", -1);
IPS_SetVariableProfileAssociation("AVR_LISTENINGMODE_EXT", 4, "DOLBY PLII MUSIC", "", -1);
IPS_SetVariableProfileAssociation("AVR_LISTENINGMODE_EXT", 5, "Auto Level Control (A.L.C.)", "", -1);


// eigenes Profil anlegen, dafür das vorhandene löschen
if (IPS_VariableProfileExists("AVR_KEYLOCK"))
IPS_DeleteVariableProfile("AVR_KEYLOCK"); 
IPS_CreateVariableProfile ("AVR_KEYLOCK", 1 ); 
IPS_SetVariableProfileIcon("AVR_KEYLOCK", "Lock");
IPS_SetVariableProfileAssociation("AVR_KEYLOCK", 0, "Aus", "", -1); 
IPS_SetVariableProfileAssociation("AVR_KEYLOCK", 1, "Ein", "", -1); 
IPS_SetVariableProfileAssociation("AVR_KEYLOCK", 2, "Ein + Vol Lock", "", -1);


// eigenes Profil anlegen, dafür das vorhandene löschen
if (IPS_VariableProfileExists("AVR_INTERNETRADIOBUTTONS"))
IPS_DeleteVariableProfile("AVR_INTERNETRADIOBUTTONS"); 
IPS_CreateVariableProfile ("AVR_INTERNETRADIOBUTTONS", 1 ); 
IPS_SetVariableProfileIcon("AVR_INTERNETRADIOBUTTONS", "Shutter");
IPS_SetVariableProfileAssociation("AVR_INTERNETRADIOBUTTONS", 0, "Stop", "", -1);
IPS_SetVariableProfileAssociation("AVR_INTERNETRADIOBUTTONS", 1, "Play", "", -1); 
IPS_SetVariableProfileAssociation("AVR_INTERNETRADIOBUTTONS", 2, "Ch -", "", -1); 
IPS_SetVariableProfileAssociation("AVR_INTERNETRADIOBUTTONS", 3, "Ch +", "", -1);
IPS_SetVariableProfileAssociation("AVR_INTERNETRADIOBUTTONS", 4, "Display", "", -1);


// eigenes Profil anlegen, dafür das vorhandene löschen
if (IPS_VariableProfileExists("AVR_FUNCTION"))
IPS_DeleteVariableProfile("AVR_FUNCTION"); 
IPS_CreateVariableProfile ("AVR_FUNCTION", 1 ); 
IPS_SetVariableProfileIcon("AVR_FUNCTION", "Shutter");
IPS_SetVariableProfileAssociation("AVR_FUNCTION", 0, "Diveres", "", -1);
IPS_SetVariableProfileAssociation("AVR_FUNCTION", 2, "Tuner", "", -1); 
IPS_SetVariableProfileAssociation("AVR_FUNCTION", 4, "XBox", "", -1); 
IPS_SetVariableProfileAssociation("AVR_FUNCTION", 17, "USB", "", -1);
IPS_SetVariableProfileAssociation("AVR_FUNCTION", 25, "BD", "", -1);
IPS_SetVariableProfileAssociation("AVR_FUNCTION", 26, "NET", "", -1);
IPS_SetVariableProfileAssociation("AVR_FUNCTION", 38, "Webradio", "", -1);

// eigenes Profil anlegen, dafür das vorhandene löschen
if (IPS_VariableProfileExists("AVR_DISPLAY"))
IPS_DeleteVariableProfile("AVR_DISPLAY"); 
IPS_CreateVariableProfile ("AVR_DISPLAY", 1 ); 
IPS_SetVariableProfileIcon("AVR_DISPLAY", "Information");
IPS_SetVariableProfileAssociation("AVR_DISPLAY", 0, "Change", "", -1);


// Variablen anlegen
$VarID_Power=	CreateVarByName(2, "Power",						"0", null,			$ID_INSTANZ, "~Switch",					$ID_PIONEER_SCRIPT, false);
$VarID_KeyLock=	CreateVarByName(4, "KeyLock",					"1", null, 			$ID_INSTANZ, "AVR_KEYLOCK",				$ID_PIONEER_SCRIPT, false);
$VarID_Display=	CreateVarByName(6, "Display",					"3", "Information", $ID_INSTANZ, "~String", 				null,				false);
$VarID_DisplCh=	CreateVarByName(8, "Display Change",			"1", "Information", $ID_INSTANZ, "AVR_DISPLAY",				$ID_PIONEER_SCRIPT,	false);
$VarID_dB=		CreateVarByName(10, "dB",						"3", "Speaker", 	$ID_INSTANZ, "~String", 				null,				false);
$VarID_Vol=		CreateVarByName(12, "Volume",					"1", null,			$ID_INSTANZ, "AVR_VOLUME",				$ID_PIONEER_SCRIPT, false);
$VarID_Mute=	CreateVarByName(14, "Mute",						"0", "Sleep",		$ID_INSTANZ, "~Switch",					$ID_PIONEER_SCRIPT, false);
$VarID_Fkt=		CreateVarByName(16, "Function",					"1", null,			$ID_INSTANZ, "AVR_FUNCTION",			$ID_PIONEER_SCRIPT, false);
$VarID_ALM=		CreateVarByName(18, "Active Listening Mode",	"3", "Music",		$ID_INSTANZ, "~String",					null,				false);
$VarID_LM=		CreateVarByName(20, "Listening Mode",			"1", null,			$ID_INSTANZ, "AVR_LISTENINGMODE",		$ID_PIONEER_SCRIPT, false);
$VarID_LM_Ext=	CreateVarByName(22, "Listening Mode, extended",	"1", null,			$ID_INSTANZ, "AVR_LISTENINGMODE_EXT",	$ID_PIONEER_SCRIPT, false);
$VarID_WebRStn=	CreateVarByName(24, "WebRadio Station",			"3", null,			$ID_INSTANZ, "~HTMLBox",				null,				true);
$VarID_WebRadio=CreateVarByName(26, "WebRadio",					"1", null,			$ID_INSTANZ, "AVR_INTERNETRADIOBUTTONS",$ID_PIONEER_SCRIPT, false);
$VarID_WebRBtn=	CreateVarByName(28, "WebRadio Button",			"1", null,			$ID_INSTANZ, null,						$ID_PIONEER_SCRIPT, true);


// Script mit Variablen-Definitionen für das Haupt-Skript anlegen 
$SText="<?\r"; 
$SText.="// Erzeugt von INSTALL_SCRIPT\r";
$SText.="// Variablen-Definitionen für das Haupt-Skript\r"; 
$SText.="\r";
$SText.="define ('NAME_DEVICE','".NAME_DEVICE."');\r";
$SText.="define ('ID_WEBFRONT', ".ID_WebFront.");\r";
$SText.="define ('ID_SOCKET', ".$ID_INSTANZ_SOCKET.");\r";
$SText.="define ('IP_DEVICE','".IP_DEVICE."'); //AVR IP-Adresse;\r"; 
$SText.="define ('PORT_DEVICE','".PORT_DEVICE."'); // Kommunikationsport \r";
$SText.="\r";
$SText.="define ('ID_POWER', ".$VarID_Power.");\r";
$SText.="define ('ID_KEYLOCK', ".$VarID_KeyLock.");\r";
$SText.="define ('ID_DISPLAY', ".$VarID_Display.");\r"; 
$SText.="define ('ID_DISPLAY_CHANGE', ".$VarID_DisplCh.");\r";
$SText.="define ('ID_VOL_DB', ".$VarID_dB.");\r";
$SText.="define ('ID_VOL', ".$VarID_Vol.");\r";
$SText.="define ('ID_MUTE', ".$VarID_Mute.");\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.="define ('ID_CHANGE_LISTENING_MODE_EXT', ".$VarID_LM_Ext.");\r";
$SText.="define ('ID_INET_RADIO', ".$VarID_WebRadio.");\r";
$SText.="define ('ID_INET_RADIO_BUTTONS', ".$VarID_WebRStn.");\r"; 
$SText.="define ('ID_INET_STATION', ".$VarID_WebRBtn.");\r";
$SText.="?>\r"; 

$ID_PIONEER_SCRIPT_VARS= CreateScriptByName(NAME_DEVICE."_Vars", $ID_INSTANZ, $SText);


// INCLUDE-Daten in Hauptskript eintragen
$SText="<?\r"; 
$SText.="// Erzeugt von INSTALL_SCRIPT\r";
$SText.="// ########### INCLUDE-START ###########\r";
$SText.="include(IPS_GetScriptFile(".$ID_PIONEER_SCRIPT_CONF."));\r";
$SText.="include(IPS_GetScriptFile(".$ID_PIONEER_SCRIPT_VARS."));\r";
$SText.="// ########### INCLUDE-ENDE  ###########\r\r";
$SText.="// ########### AB HIER HAUPT-SKRIPT EINFÜGEN  ###########\r";
$SText.="?>\r"; 
IPS_SetScriptContent($ID_PIONEER_SCRIPT, $SText);


// Funktion zum erstellen eines Variablen 
// 
// Parameter: 
// VarNAME  	= Name wie die Variable im Objektbaum heissen soll
// VarTyp		= Typ der Variablen (0=Boolean, 1=Integer, 2=Float, 3=String)
// Icon			= Icon für Variable, wenn nicht aus Profil
// ParentID 	= Objekt ID unter der das Script untergehangen wird
// Profil		= Name des Profils 
// ScriptID 	= Aktionsskript ID
// Position		= Reihenfolge im Objektbaum 
// Hidden		= Variable unsichtbar (true|false)

function CreateVarByName($Position, $VarNAME, $VarTyp, $Icon, $ParentID, $Profil, $ScriptID, $Hidden) 
 { 
 global $IPS_SELF; 
 $VarID = @IPS_GetVariableIDByName($VarNAME, $ParentID); 
 if ($VarID == 0){ 
  $VarID = IPS_CreateVariable($VarTyp); 
  IPS_SetName($VarID, $VarNAME); 
  IPS_SetParent($VarID, $ParentID);
  IPS_SetVariableCustomProfile($VarID, $Profil); 
  IPS_SetVariableCustomAction($VarID, $ScriptID);    
  IPS_SetPosition($VarID, $Position);
  IPS_SetIcon($VarID, $Icon);
  IPS_SetHidden($VarID, $Hidden);
 } 
return $VarID; 
} 


// 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 

function CreateScriptByName($ScriptNAME, $ParentID, $ScriptTEXT) 

 { 
 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#"); 
  IPS_SetScriptContent($ScriptID, $ScriptTEXT);
  IPS_SetHidden($ScriptID, true); 
  IPS_SetPosition($ScriptID, 98); 
 } 
return $ScriptID; 
} 

Haupt-Skript:



$INET_RADIO_HIDDEN=true;

// 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
      // funktionen gibt es mit drei und zwei zeichen
      $lv_fkt1 = substr($data,0,1);  // funktion ersten 1 zeichen
      $lv_val1 = substr($data,1,3);  // value die letzten 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
	  
		
		// Fehlermeldungen
		/*
		E02<CR+LF>	NOT AVAILABLE NOW
		E03<CR+LF>	INVALID COMMAND
		E04<CR+LF>	COMMAND ERROR
		E06<CR+LF>	PARAMETER ERROR
		B00<CR+LF>	BUSY
		*/
		if ($lv_fkt1=="E" or $lv_fkt1=="B")
    	{
			if ($lv_val1=="00")	{SetValue(ID_DISPLAY, "BUSY");}
			if ($lv_val1=="02")	{SetValue(ID_DISPLAY, "NOT AVAILABLE NOW");}
			if ($lv_val1=="03")	{SetValue(ID_DISPLAY, "INVALID COMMAND");}
			if ($lv_val1=="04")	{SetValue(ID_DISPLAY, "COMMAND ERROR");}
			if ($lv_val1=="06")	{SetValue(ID_DISPLAY, "PARAMETER ERROR");}

		}

		
		// Status AVR EIN-Standby-AUS
		if ($lv_fkt3=="PWR")
    	{
			if ($lv_val3==0) 
			{
			echo $NAME_DEVICE." ist EIN";
			// gerät eingeschaltet, aber variable nicht erneut setzen wenn schon on
   			if (GetValue(ID_POWER)==false)
		  		{
				   echo "Now ON";
		   		SetValue(ID_POWER,true);
		
					// 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
					$ret = sendCommand("?PKL");   // keylock
					
					avOn();		// variablen, schalter einblenden
				}
			}
			if ($lv_val3==1) 
			{
				echo $NAME_DEVICE." ist Standby";
				// gerät ausgeschaltet, aber variable nicht erneut setzen wenn schon off
   				if (GetValue(ID_POWER)==true)
  				{
   				SetValue(ID_POWER,false);
				avOff();		// variablen, schalter ausblenden
				}
			}
		}
		// 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
			SetValue(ID_VOL_DB,(($lv_val3-161)*0.5)."dB"); //dB-Wert anzeigen
			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")
		#var_dump($lv_fkt2);
	  	{
	  	   // funktion ändern nur wenn die variable nicht aktuell ist
			if (GetValue(ID_FUNCTION) != $lv_val2)
			{
				// liste der gültigen funktionen
				if ($lv_val2==38 || $lv_val2==26 || $lv_val2==19 || $lv_val2==17 || $lv_val2==20 || $lv_val2==4 || $lv_val2==2)
				{
			   	SetValue(ID_FUNCTION,$lv_val2);    // funktion setzen
				}
		 		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.
		 		}
		 	}

			// wenn internet radio und die optionen noch nicht eingeblendet dann einblenden.
			if (($lv_val2==26 || $lv_val2==38)&& $INET_RADIO_HIDDEN==true)
			{
			   // inet radion steuerung einblenden. methode führt refresh automstisch aus
			   InetRadioOn();
			}
			else
			{
			   // inet radion steuerung einblenden. methode führt refresh automstisch aus
			   InetRadioOff();
			}

		}
		// listening mode
		if ($lv_fkt2=="LM")
		{
			echo "Listening Mode".$lv_val2;
		   SetValue(ID_LISTENING_MODE,$listening[$lv_val2]);    //
 		}
 		// key lock
		if ($lv_fkt3=="PKL")
		{
			//echo "Key Lock".$lv_val3;
		   SetValue(ID_KEYLOCK,$lv_val3);    //
 		}
 		// request input name
		if ($lv_fkt3=="RGB")
		{
			echo "request input name".$lv_val3;
		   //SetValue(ID_KEYLOCK,$lv_val3);    //
 		}

	}
}
if($IPS_SENDER == "WebFront") {

	// aktion per webfront
	
	// TODO: anpassen auf das installscript
	// internetradio buttons
	if ($IPS_VARIABLE==ID_INET_RADIO)
	{
	   //echo "test ".$IPS_VALUE;
	   SetValue(ID_INET_RADIO,$IPS_VALUE);    //

		// letzten Status merken ob play oder stop
		if ($IPS_VALUE<=1)
         SetValue(ID_INET_RADIO_BUTTONS,$IPS_VALUE);    //
	   
	   if ($IPS_VALUE == 0)
	   {
	   	$ret = sendCommand("20NW");
	   }
	   if ($IPS_VALUE == 1)
	   	$ret = sendCommand("10NW");
	   if ($IPS_VALUE == 2)
	   	$ret = sendCommand("12NW");
	   if ($IPS_VALUE == 3)
	   	$ret = sendCommand("13NW");
      if ($IPS_VALUE == 4)
	   	$ret = sendCommand("18NW");
	   	
		// da die buttons nicht dauerhaft aktiv sein können, wird einfach der wert -1 gesetzt, so
		// ist keiner aktiv, aber nur bei aktionen >1
		if ($IPS_VALUE>1)
      	SetValue(ID_INET_RADIO, GetValue(ID_INET_RADIO_BUTTONS));    //
	}
	
	/* MR
	// 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);
	   	
	   	//socket aktualisieren da unter umständen keine verbinung zustande kommt
	   	IPS_ApplyChanges(ID_SOCKET);
	   }
	   else
		{
			$ret = sendCommand("PF");     		/// ausschaltbefehl
	   	SetValue(ID_POWER, $IPS_VALUE);     // varaible für power off setzen
	   	avOff();										// variablen + schalter ausblenden
	   }
	}
	MR */
	
	    if ($IPS_VARIABLE==ID_POWER)
    {
       // je nach zustand ausschalten. einschalten geht - wenn vom receiver erlaubt - auch über lan!
       if ($IPS_VALUE == true)
       {
           $ret = sendCommand("PO");              // einschaltbefehl
           SetValue(ID_POWER, $IPS_VALUE);        // varaible für power on setzen
           avOn();                                // variablen + schalter einblenden
		 }                                           
       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
       }

    }

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

	// display change zur Umschaltung statusanzeige
	if ($IPS_VARIABLE==ID_DISPLAY_CHANGE)
	{
		$ret = sendCommand("18NW");     // Display Anzeige umschalten	
 	}

	// 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.
			#MR $ret = sendCommand($IPS_VALUE."VL");     // vol direkt setzen
	   		#MR SetValue(ID_VOL, $IPS_VALUE);
			$ret = sendCommand(str_pad($IPS_VALUE, 3, "0", STR_PAD_LEFT)."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

			// bei internetradio ein und ausblenden
	   	if ($IPS_VALUE==26 || $IPS_VALUE==38)
	   	{
	   	   InetRadioOn();
         }
         if (GetValue(ID_FUNCTION)==26|| $IPS_VALUE==38)
	   	{
	   	   InetRadioOff();
         }
         
         SetValue(ID_FUNCTION, $tmp_val);
	   }
	}

	// listening mode schalter
	if ($IPS_VARIABLE==ID_CHANGE_LISTENING_MODE)
	{
		if ($IPS_VALUE=="1") {$ret = sendCommand("0005SR");}		// AUTO SURR/STREAM DIRECT (cyclic)
	    else if ($IPS_VALUE=="2") {$ret = sendCommand("0010SR");}	// STANDARD (cyclic)
	    else if ($IPS_VALUE=="3") {$ret = sendCommand("0100SR");}	// ADVANCED SURROUND (cyclic)
	    // 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);
		SetValue(ID_CHANGE_LISTENING_MODE_EXT, 0);
	}
	
	// extendet listening mode schalter
	if ($IPS_VARIABLE==ID_CHANGE_LISTENING_MODE_EXT)
	{
		if ($IPS_VALUE=="1") {$ret = sendCommand("0009SR");}		// STEREO (direct set)
		else if ($IPS_VALUE=="2") {$ret = sendCommand("0112SR");}	// EXTENDED STEREO
		else if ($IPS_VALUE=="3") {$ret = sendCommand("0012SR");}	// DOLBY PROLOGIC
		else if ($IPS_VALUE=="4") {$ret = sendCommand("0014SR");}	// DOLBY PLII MUSIC
		else if ($IPS_VALUE=="5") {$ret = sendCommand("0151SR");}	// Auto Level Control (A.L.C.)	
	    // 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_EXT, $IPS_VALUE);
		SetValue(ID_CHANGE_LISTENING_MODE, 0);
	}	
	
	
	
	// key lock schalter
	if ($IPS_VARIABLE==ID_KEYLOCK)
	{
	setValue(ID_KEYLOCK,$IPS_VALUE);
	$ret = sendCommand($IPS_VALUE."PKL");     // key lock setzen
   	}
}

// 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
	$ret = sendCommand("?P");     // Prüfung ob AVR EIN/AUS/Standby
	
	#MR if (Sys_Ping($IP_DEVICE, 1000) )
/*
   {
	#echo "PWR0 (EIN)";
   	// gerät eingeschaltet, aber variable nicht erneut setzen wenn schon on
   	if (GetValue(ID_POWER)==false)
  		{
		   echo "Now ON";
   		SetValue(ID_POWER,true);

			// 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
			$ret = sendCommand("?PKL");   // keylock
			
			avOn();		// variablen, schalter einblenden
		}
   }
  	if ($ret=="PWR1") //PWR0=EIN, PRW1=Standby
 	{

	// gerät ausgeschaltet, aber variable nicht erneut setzen wenn schon off
   	if (GetValue(ID_POWER)==true)
  		{	
   		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, $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_CHANGE_LISTENING_MODE_EXT, false);
	IPS_SetHidden(ID_DISPLAY, false);
	IPS_SetHidden(ID_CHANGE_LISTENING_MODE, false);
	IPS_SetHidden(ID_KEYLOCK, false);
	IPS_SetHidden(ID_DISPLAY_CHANGE, false);
	IPS_SetHidden(ID_VOL_DB, false);
	// beim einschalten ist ggf. noch der modus internetradio aktiv gewesen. dann aktivieren damit danach das ausblenden funktioniert
	if (GetValue(ID_FUNCTION) == 26 || GetValue(ID_FUNCTION) == 38)
	{
	   // inet radion steuerung einblenden. methode führt refresh automstisch aus
	   InetRadioOn();
	}
}

// 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)
	// das diplay löschen damit im ausgeschalteten zustand nicht ein alter text stehen bleibt.
	SetValue(ID_DISPLAY, " ");           // bei aus das diplay löschen
	// andere elemente ausblenden
	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_EXT, true);
	IPS_SetHidden(ID_CHANGE_LISTENING_MODE, true);
	IPS_SetHidden(ID_KEYLOCK, true);
	IPS_SetHidden(ID_DISPLAY_CHANGE, true);
	IPS_SetHidden(ID_VOL_DB, true);
	
	InetRadioOff();
}

// TODO: ins installscript übernehmen
function InetRadioOn()
{
	$INET_RADIO_HIDDEN= false;
	IPS_SetHidden(ID_INET_RADIO, false);
	#MR IPS_SetHidden(ID_INET_STATION, false);
	
	#MR $html = ReadStationList();
	#MR setValue(ID_INET_STATION,$html);

}

function InetRadioOff()
{
   $INET_RADIO_HIDDEN=true;
	IPS_SetHidden(ID_INET_RADIO, true);
	#MR IPS_SetHidden(ID_INET_STATION, true);

}

Konstanten-Skript:


// function_list (VSX-923)
// funktionen ggf umbenenen falls diese auch im gerät umbenannt wurden
$function_list = array(
# "00" => "PHONO", //nicht im 923
"01" => "CD",
"02" => "TUNER",
"04" => "DVD",
"05" => "TV",
"06" => "SAT/CBL",
"10" => "VIDEO 1(VIDEO)",
"12" => "MULTI CH IN",
"13" => "USB-DAC",
"15" => "DVR/BDR",
"17" => "iPod/USB",
"19" => "HDMI 1",
"20" => "HDMI 2",
"21" => "HDMI 3",
"22" => "HDMI 4",
"23" => "HDMI 5",
"24" => "HDMI 6",
"25" => "BD",
"26" => "NETWORK (cyclic)",
"31" => "HDMI (cyclic)",
"33" => "ADAPTER PORT",
"34" => "HDMI 7",
"35" => "HDMI 8",
"38" => "INTERNET RADIO",
"41" => "PANDORA",
"44" => "MEDIA SERVER",
"45" => "FAVORITES",
"48" => "MHL"
);


// listening modes for Display(VSX-923)
$listening = array(
"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 PROLOGIC",
"0108" => "Neo:6 CINEMA",
"0109" => "Neo:6 MUSIC",
"010c" => "2ch Straight Decode",
"010d" => "DOLBY PLIIz HEIGHT",
"010e" => "WIDE SURR MOVIE",
"010f" => "WIDE SURR MUSIC",
"0110" => "STEREO",
"0111" => "Neo:X CINEMA",
"0112" => "Neo:X MUSIC",
"0113" => "Neo:X GAME",
"0201" => "ACTION",
"0202" => "DRAMA",
"0208" => "ADVANCEDGAME",
"0209" => "SPORTS",
"020a" => "CLASSICAL  ",
"020b" => "ROCK/POP  ",
"020d" => "EXT.STEREO ",
"020e" => "PHONES SURR.",
"020f" => "FRONT STAGE SURROUND ADVANCE",
"0211" => "SOUND RETRIEVER AIR",
"0212" => "ECO MODE 1",
"0213" => "ECO MODE 2",
"0301" => "DOLBY PLIIx MOVIE +THX",
"0302" => "DOLBY PLII MOVIE +THX",
"0303" => "DOLBY PL +THX CINEMA",
"0305" => "THX CINEMA",
"0306" => "DOLBY PLIIx MUSIC +THX",
"0307" => "DOLBY PLII MUSIC +THX",
"0308" => "DOLBY PL +THX MUSIC",
"030a" => "THX MUSIC",
"030b" => "DOLBY PLIIx GAME +THX",
"030c" => "DOLBY PLII GAME +THX",
"030d" => "DOLBY PL +THX GAMES",
"0310" => "THX GAMES",
"0311" => "DOLBY PLIIz +THX CINEMA",
"0312" => "DOLBY PLIIz +THX MUSIC",
"0313" => "DOLBY PLIIz +THX GAMES",
"0314" => "Neo:X CINEMA + THX CINEMA",
"0315" => "Neo:X MUSIC + THX MUSIC",
"0316" => "Neo:X GAMES + THX GAMES",
// "0401" => "STEREO",
"0401" => "AUTO SURROUND",
"0402" => "DOLBY PLII MOVIE",
"0403" => "DOLBY PLIIx MOVIE",
"0405" => "AUTO SURROUND Straight Decode",
"0406" => "DOLBY DIGITAL EX",
"0407" => "DOLBY PLIIx MOVIE",
"0408" => "DTS +Neo:6",
"0409" => "ES MATRIX",
"040a" => "ES DISCRETE",
"040b" => "DTS-ES 8ch",
"040e" => "RETRIEVER AIR",
"040f" => "Neo:X CINEMA",
// "0501" => "STEREO",
"0501" => "ALC",
"0502" => "DOLBY PLII MOVIE",
"0503" => "DOLBY PLIIx MOVIE",
"0504" => "DTS/DTS-HD",
"0505" => "ALC Straight Decode",
"0506" => "DOLBY DIGITAL EX",
"0507" => "DOLBY PLIIx MOVIE",
"0508" => "DTS +Neo:6",
"0509" => "ES MATRIX",
"050a" => "ES DISCRETE",
"050b" => "DTS-ES 8ch",
"050e" => "RETRIEVER AIR",
"050f" => "Neo:X CINEMA",
// "0601" => "STEREO",
"0601" => "DIRECT",
"0602" => "DOLBY PLII MOVIE",
"0603" => "DOLBY PLIIx MOVIE",
"0605" => "STREAM DIRECT NORMAL Straight Decode",
"0606" => "DOLBY DIGITAL EX",
"0607" => "DOLBY PLIIx MOVIE",
"0609" => "ES MATRIX",
"060a" => "ES DISCRETE",
"060b" => "DTS-ES 8ch",
"060c" => "Neo:X CINEMA",
"0701" => "STREAM DIRECT PURE 2ch",
"0702" => "DOLBY PLII MOVIE",
"0703" => "DOLBY PLIIx MOVIE",
"0704" => "Neo:6 CINEMA",
"0705" => "PURE DIRECT",
"0706" => "DOLBY DIGITAL EX",
"0707" => "DOLBY PLIIx MOVIE",
"0708" => "(nothing)",
"0709" => "ES MATRIX",
"070a" => "ES DISCRETE",
"070b" => "DTS-ES 8ch",
"070c" => "Neo:X CINEMA",
"0881" => "OPTIMUM",
"0e01" => "HDMI THROUGH",
"0f01" => "MULTI CH IN",
"1101" => "DOLBY PLIIx MOVIE",
"1102" => "DOLBY PLIIx MUSIC",
"1103" => "DOLBY DIGITAL EX",
"1104" => "DTS Neo:6",
"1105" => "ES MATRIX",
"1106" => "ES DISCRETE",
"1107" => "DTS-ES 8ch",
"1108" => "multi ch Straight Decode",
"1109" => "DOLBY PLIIz HEIGHT",
"110a" => "WIDE SURR MOVIE",
"110b" => "WIDE SURR MUSIC",
"110c" => "Neo:X CINEMA",
"110d" => "Neo:X MUSIC",
"110e" => "Neo:X GAME",
"1301" => "THX Surr EX",
"1303" => "ES MTRX +THX CINEMA",
"1304" => "ES DISC +THX CINEMA",
"1305" => "ES 8ch +THX CINEMA",
"1306" => "DOLBY PLIIx MOVIE +THX",
"1309" => "THX CINEMA",
"130b" => "ES MTRX +THX MUSIC",
"130c" => "ES DISC +THX MUSIC",
"130d" => "ES 8ch +THX MUSIC",
"130e" => "DOLBY PLIIx MUSIC +THX",
"1311" => "THX MUSIC",
"1313" => "ES MTRX +THX GAMES",
"1314" => "ES DISC +THX GAMES",
"1315" => "ES 8ch +THX GAMES",
"1319" => "THX GAMES",
"131a" => "DOLBY PLIIz +THX CINEMA",
"131b" => "DOLBY PLIIz +THX MUSIC",
"131c" => "DOLBY PLIIz +THX GAMES",
"131d" => "Neo:X CINEMA + THX CINEMA",
"131e" => "Neo:X MUSIC + THX MUSIC",
"131f" => "Neo:X GAME + THX GAMES"
);

// listening modes for SET (VSX-923)
$listeningSET = array(
"0001" => "STEREO (cyclic)",
"0003" => "Front Stage Surround Advance",
"0005" => "AUTO SURR/STREAM DIRECT (cyclic)",
"0006" => "AUTO SURROUND",
"0007" => "DIRECT",
"0008" => "PURE DIRECT",
"0009" => "STEREO (direct set)",
"0010" => "STANDARD (cyclic)",
"0011" => "(2ch source)",
"0012" => "PRO LOGIC",
"0013" => "PRO LOGIC2 MOVIE",
"0014" => "PRO LOGIC2 MUSIC",
"0015" => "PRO LOGIC2 GAME",
"0016" => "Neo:6 CINEMA",
"0017" => "Neo:6 MUSIC",
"0018" => "PRO LOGIC2x MOVIE",
"0019" => "PRO LOGIC2x MUSIC",
"0020" => "PRO LOGIC2x GAME",
"0021" => "(Multi ch source)",
"0022" => "(Multi ch source)+DOLBY EX",
"0023" => "(Multi ch source)+PRO LOGIC2x MOVIE",
"0024" => "(Multi ch source)+PRO LOGIC2x MUSIC",
"0025" => "(Multi ch source)DTS-ES Neo:6",
"0026" => "(Multi ch source)DTS-ES matrix",
"0027" => "(Multi ch source)DTS-ES discrete",
"0030" => "(Multi ch source)DTS-ES 8ch discrete",
"0031" => "PRO LOGIC2z HEIGHT",
"0032" => "WIDE SURROUND MOVIE",
"0033" => "WIDE SURROUND MUSIC",
"0034" => "(Multi-ch Source)+PRO LOGIC2z HEIGHT",
"0035" => "(Multi-ch Source)+WIDE SURROUND MOVIE",
"0036" => "(Multi-ch Source)+WIDE SURROUND MUSIC",
"0037" => "Neo:X CINEMA",
"0038" => "Neo:X MUSIC",
"0039" => "Neo:X GAME",
"0043" => "(Multi ch source)+Neo:X CINEMA ",
"0044" => "(Multi ch source)+Neo:X MUSIC",
"0045" => "(Multi ch source)+Neo:X GAME",
"0050" => "THX (cyclic)",
"0051" => "PROLOGIC + THX CINEMA",
"0052" => "PL2 MOVIE + THX CINEMA",
"0053" => "Neo:6 CINEMA + THX CINEMA",
"0054" => "PL2x MOVIE + THX CINEMA",
"0055" => "THX SELECT2 GAMES",
"0056" => "THX CINEMA (for multi ch)",
"0057" => "THX SURROUND EX (for multi ch)",
"0058" => "PL2x MOVIE + THX CINEMA (for multi ch)",
"0059" => "ES Neo:6 + THX CINEMA (for multi ch)",
"0060" => "ES MATRIX + THX CINEMA (for multi ch)",
"0061" => "ES DISCRETE + THX CINEMA (for multi ch)",
"0067" => "ES 8ch DISCRETE + THX CINEMA (for multi ch)",
"0068" => "THX CINEMA (for 2ch)",
"0069" => "THX MUSIC (for 2ch)",
"0070" => "THX GAMES (for 2ch)",
"0071" => "PL2 MUSIC + THX MUSIC",
"0072" => "PL2x MUSIC + THX MUSIC",
"0073" => "Neo:6 MUSIC + THX MUSIC",
"0074" => "PL2 GAME + THX GAMES",
"0075" => "PL2x GAME + THX GAMES",
"0076" => "THX ULTRA2 GAMES",
"0077" => "PROLOGIC + THX MUSIC",
"0078" => "PROLOGIC + THX GAMES",
"0080" => "THX MUSIC (for multi ch)",
"0081" => "THX GAMES (for multi ch)",
"0082" => "PL2x MUSIC + THX MUSIC (for multi ch)",
"0083" => "EX + THX GAMES (for multi ch)",
"0084" => "Neo:6 + THX MUSIC (for multi ch)",
"0085" => "Neo:6 + THX GAMES (for multi ch)",
"0086" => "ES MATRIX + THX MUSIC (for multi ch)",
"0087" => "ES MATRIX + THX GAMES (for multi ch)",
"0088" => "ES DISCRETE + THX MUSIC (for multi ch)",
"0089" => "ES DISCRETE + THX GAMES (for multi ch)",
"0090" => "ES 8CH DISCRETE + THX MUSIC (for multi ch)",
"0091" => "ES 8CH DISCRETE + THX GAMES (for multi ch)",
"0092" => "PL2z HEIGHT + THX CINEMA",
"0093" => "PL2z HEIGHT + THX MUSIC",
"0094" => "PL2z HEIGHT + THX GAMES",
"0095" => "PL2z HEIGHT + THX CINEMA (for multi ch)",
"0096" => "PL2z HEIGHT + THX MUSIC (for multi ch)",
"0097" => "PL2z HEIGHT + THX GAMES (for multi ch)",
"0100" => "ADVANCED SURROUND (cyclic)",
"0101" => "ACTION",
"0103" => "DRAMA",
"0107" => "CLASSICAL",
"0110" => "ROCK/POP",
"0112" => "EXTENDED STEREO",
"0113" => "PHONES SURROUND",
"0117" => "SPORTS",
"0118" => "ADVANCED GAME",
"0151" => "Auto Level Control (A.L.C.)",
"0152" => "OPTIMUM SURROUND",
"0153" => "RETRIEVER AIR",
"0200" => "ECO MODE (cyclic)",
"0201" => "Neo:X CINEMA + THX CINEMA",
"0202" => "Neo:X MUSIC + THX MUSIC",
"0203" => "Neo:X GAME + THX GAMES",
"0204" => "Neo:X CINEMA + THX CINEMA (for multi ch)",
"0205" => "Neo:X MUSIC + THX MUSIC (for multi ch)",
"0206" => "Neo:X GAME + THX GAMES (for multi ch)",
"0212" => "ECO MODE 1",
"0213" => "ECO MODE 2"
);

Hi

Ich habe in deinem Installscript ein paar Zeilen ersetzt, da diese Funktionen nicht mehr existieren (zumindest auf Mac und Raspi) Version 4.4 .

Komplett testen konnte ich noch nicht da ich im Moment nicht in reichweite meines SC-2023 bin, aber bei der installation wurden sonst immer Fehler ausgegeben.


<?
###################  CONFIG-START  ################### 

define ('ID_WebFront', "18648 /*[WebFront]*/");                // WebFront-ID
define ('NAME_DEVICE',"Pioneer VSX-923");        // Gerätebenennung
define ('IP_DEVICE',"192.168.1.2");                // AVR IP-Adresse
define ('PORT_DEVICE',"8102");                    // Kommunikationsport
// Zum Testen: direkte Kommunikation per telnet (Windows-Taste -> Eingabeaufforderung (CMD) -> telnet 10.0.0.42 8102

###################  CONFIG-ENDE  ###################



if (ID_WebFront=="" or NAME_DEVICE=="" or IP_DEVICE=="" or PORT_DEVICE=="") {echo("CONFIG-Daten unvollständig!"); return;} 

$ParentID=IPS_GetParent($_IPS['SELF']);

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


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


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

// client socket instanz erstellen 
$ID_INSTANZ_SOCKET= IPS_CREATEINSTANCE("{3CFF0FD9-E306-41DB-9B5A-9D06D38576C3}"); 
IPS_SETName($ID_INSTANZ_SOCKET, NAME_DEVICE."_SOCKET"); 
IPS_SetProperty($ID_INSTANZ_SOCKET,"Host",IP_DEVICE);        // Erneuert da Anweisung "CSCK_SetHost" nicht Funktioniert
IPS_SetProperty($ID_INSTANZ_SOCKET,"Port",PORT_DEVICE);   // Erneuert da Anweisung "CSCK_SetPort" nicht Funktioniert
IPS_SetProperty($ID_INSTANZ_SOCKET, "Open", true);

//dummy pioneer script für konstanten anlegen in das dann der inhalt einkopiert werden muss 
$ID_PIONEER_SCRIPT_CONF= CreateScriptByName(NAME_DEVICE."_Const", $ID_INSTANZ, "<?\r\r?>");


//dummy pioneer script anlegen in das dann der inhalt einkopiert werden muss  
$ID_PIONEER_SCRIPT= CreateScriptByName(NAME_DEVICE, $ID_INSTANZ, "<?\r\r?>");


// 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, 5);   //Jeden Tag jede 5 Minuten 
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); 
IPS_SetProperty($ID_INSTANZ_REGISTER,"RXObjectID", $ID_PIONEER_SCRIPT); // Erneuert da Anweisung "RegVar_SetRXObjectID" nicht Funktioniert
IPS_SetProperty($ID_INSTANZ_CUTTER,"ParseType", 0); // Erneuert da Anweisung "Cutter_SetParseType" nicht Funktioniert
IPS_SetProperty($ID_INSTANZ_CUTTER,"RightCutChar", "
"); // Erneuert da Anweisung "Cutter_SetRightCutChar" nicht Funktioniert
IPS_ConnectInstance($ID_INSTANZ_CUTTER, $ID_INSTANZ_SOCKET); 
 
IPS_ApplyChanges($ID_INSTANZ_SOCKET); 
IPS_ApplyChanges($ID_INSTANZ_CUTTER); 
IPS_ApplyChanges($ID_INSTANZ_REGISTER); 



// eigenes Profil anlegen, dafür das vorhandene löschen
if (IPS_VariableProfileExists("AVR_VOLUME")) 
IPS_DeleteVariableProfile("AVR_VOLUME"); 
IPS_CreateVariableProfile ("AVR_VOLUME", 1 ); 
IPS_SetVariableProfileText ("AVR_VOLUME", "", "%" ); 
IPS_SetVariableProfileValues ("AVR_VOLUME", 40, 161 , 1 ); 
IPS_SetVariableProfileIcon("AVR_VOLUME", "Speaker");

// eigenes Profil anlegen, dafür das vorhandene löschen
if (IPS_VariableProfileExists("AVR_LISTENINGMODE"))
IPS_DeleteVariableProfile("AVR_LISTENINGMODE"); 
IPS_CreateVariableProfile ("AVR_LISTENINGMODE", 1 ); 
IPS_SetVariableProfileIcon("AVR_LISTENINGMODE", "Music");
IPS_SetVariableProfileAssociation("AVR_LISTENINGMODE", 1, "Auto.SURR/ALC/Direct", "", -1); 
IPS_SetVariableProfileAssociation("AVR_LISTENINGMODE", 2, "Std.SURR", "", -1); 
IPS_SetVariableProfileAssociation("AVR_LISTENINGMODE", 3, "Adv.SURR", "", -1);


// eigenes Profil anlegen, dafür das vorhandene löschen
if (IPS_VariableProfileExists("AVR_LISTENINGMODE_EXT"))
IPS_DeleteVariableProfile("AVR_LISTENINGMODE_EXT"); 
IPS_CreateVariableProfile ("AVR_LISTENINGMODE_EXT", 1 ); 
IPS_SetVariableProfileIcon("AVR_LISTENINGMODE_EXT", "Music");
IPS_SetVariableProfileAssociation("AVR_LISTENINGMODE_EXT", 1, "STEREO", "", -1); 
IPS_SetVariableProfileAssociation("AVR_LISTENINGMODE_EXT", 2, "EXTENDED STEREO", "", -1); 
IPS_SetVariableProfileAssociation("AVR_LISTENINGMODE_EXT", 3, "DOLBY PROLOGIC", "", -1);
IPS_SetVariableProfileAssociation("AVR_LISTENINGMODE_EXT", 4, "DOLBY PLII MUSIC", "", -1);
IPS_SetVariableProfileAssociation("AVR_LISTENINGMODE_EXT", 5, "Auto Level Control (A.L.C.)", "", -1);


// eigenes Profil anlegen, dafür das vorhandene löschen
if (IPS_VariableProfileExists("AVR_KEYLOCK"))
IPS_DeleteVariableProfile("AVR_KEYLOCK"); 
IPS_CreateVariableProfile ("AVR_KEYLOCK", 1 ); 
IPS_SetVariableProfileIcon("AVR_KEYLOCK", "Lock");
IPS_SetVariableProfileAssociation("AVR_KEYLOCK", 0, "Aus", "", -1); 
IPS_SetVariableProfileAssociation("AVR_KEYLOCK", 1, "Ein", "", -1); 
IPS_SetVariableProfileAssociation("AVR_KEYLOCK", 2, "Ein + Vol Lock", "", -1);


// eigenes Profil anlegen, dafür das vorhandene löschen
if (IPS_VariableProfileExists("AVR_INTERNETRADIOBUTTONS"))
IPS_DeleteVariableProfile("AVR_INTERNETRADIOBUTTONS"); 
IPS_CreateVariableProfile ("AVR_INTERNETRADIOBUTTONS", 1 ); 
IPS_SetVariableProfileIcon("AVR_INTERNETRADIOBUTTONS", "Shutter");
IPS_SetVariableProfileAssociation("AVR_INTERNETRADIOBUTTONS", 0, "Stop", "", -1);
IPS_SetVariableProfileAssociation("AVR_INTERNETRADIOBUTTONS", 1, "Play", "", -1); 
IPS_SetVariableProfileAssociation("AVR_INTERNETRADIOBUTTONS", 2, "Ch -", "", -1); 
IPS_SetVariableProfileAssociation("AVR_INTERNETRADIOBUTTONS", 3, "Ch +", "", -1);
IPS_SetVariableProfileAssociation("AVR_INTERNETRADIOBUTTONS", 4, "Display", "", -1);


// eigenes Profil anlegen, dafür das vorhandene löschen
if (IPS_VariableProfileExists("AVR_FUNCTION"))
IPS_DeleteVariableProfile("AVR_FUNCTION"); 
IPS_CreateVariableProfile ("AVR_FUNCTION", 1 ); 
IPS_SetVariableProfileIcon("AVR_FUNCTION", "Shutter");
IPS_SetVariableProfileAssociation("AVR_FUNCTION", 0, "Diveres", "", -1);
IPS_SetVariableProfileAssociation("AVR_FUNCTION", 2, "Tuner", "", -1); 
IPS_SetVariableProfileAssociation("AVR_FUNCTION", 4, "XBox", "", -1); 
IPS_SetVariableProfileAssociation("AVR_FUNCTION", 17, "USB", "", -1);
IPS_SetVariableProfileAssociation("AVR_FUNCTION", 25, "BD", "", -1);
IPS_SetVariableProfileAssociation("AVR_FUNCTION", 26, "NET", "", -1);
IPS_SetVariableProfileAssociation("AVR_FUNCTION", 38, "Webradio", "", -1);

// eigenes Profil anlegen, dafür das vorhandene löschen
if (IPS_VariableProfileExists("AVR_DISPLAY"))
IPS_DeleteVariableProfile("AVR_DISPLAY"); 
IPS_CreateVariableProfile ("AVR_DISPLAY", 1 ); 
IPS_SetVariableProfileIcon("AVR_DISPLAY", "Information");
IPS_SetVariableProfileAssociation("AVR_DISPLAY", 0, "Change", "", -1);


// Variablen anlegen
$VarID_Power=    CreateVarByName(2, "Power",                        "0", null,            $ID_INSTANZ, "~Switch",                    $ID_PIONEER_SCRIPT, false);
$VarID_KeyLock=    CreateVarByName(4, "KeyLock",                    "1", null,             $ID_INSTANZ, "AVR_KEYLOCK",                $ID_PIONEER_SCRIPT, false);
$VarID_Display=    CreateVarByName(6, "Display",                    "3", "Information", $ID_INSTANZ, "~String",                 null,                false);
$VarID_DisplCh=    CreateVarByName(8, "Display Change",            "1", "Information", $ID_INSTANZ, "AVR_DISPLAY",                $ID_PIONEER_SCRIPT,    false);
$VarID_dB=        CreateVarByName(10, "dB",                        "3", "Speaker",     $ID_INSTANZ, "~String",                 null,                false);
$VarID_Vol=        CreateVarByName(12, "Volume",                    "1", null,            $ID_INSTANZ, "AVR_VOLUME",                $ID_PIONEER_SCRIPT, false);
$VarID_Mute=    CreateVarByName(14, "Mute",                        "0", "Sleep",        $ID_INSTANZ, "~Switch",                    $ID_PIONEER_SCRIPT, false);
$VarID_Fkt=        CreateVarByName(16, "Function",                    "1", null,            $ID_INSTANZ, "AVR_FUNCTION",            $ID_PIONEER_SCRIPT, false);
$VarID_ALM=        CreateVarByName(18, "Active Listening Mode",    "3", "Music",        $ID_INSTANZ, "~String",                    null,                false);
$VarID_LM=        CreateVarByName(20, "Listening Mode",            "1", null,            $ID_INSTANZ, "AVR_LISTENINGMODE",        $ID_PIONEER_SCRIPT, false);
$VarID_LM_Ext=    CreateVarByName(22, "Listening Mode, extended",    "1", null,            $ID_INSTANZ, "AVR_LISTENINGMODE_EXT",    $ID_PIONEER_SCRIPT, false);
$VarID_WebRStn=    CreateVarByName(24, "WebRadio Station",            "3", null,            $ID_INSTANZ, "~HTMLBox",                null,                true);
$VarID_WebRadio=CreateVarByName(26, "WebRadio",                    "1", null,            $ID_INSTANZ, "AVR_INTERNETRADIOBUTTONS",$ID_PIONEER_SCRIPT, false);
$VarID_WebRBtn=    CreateVarByName(28, "WebRadio Button",            "1", null,            $ID_INSTANZ, null,                        $ID_PIONEER_SCRIPT, true);


// Script mit Variablen-Definitionen für das Haupt-Skript anlegen 
$SText="<?\r"; 
$SText.="// Erzeugt von INSTALL_SCRIPT\r";
$SText.="// Variablen-Definitionen für das Haupt-Skript\r"; 
$SText.="\r";
$SText.="define ('NAME_DEVICE','".NAME_DEVICE."');\r";
$SText.="define ('ID_WEBFRONT', ".ID_WebFront.");\r";
$SText.="define ('ID_SOCKET', ".$ID_INSTANZ_SOCKET.");\r";
$SText.="define ('IP_DEVICE','".IP_DEVICE."'); //AVR IP-Adresse;\r"; 
$SText.="define ('PORT_DEVICE','".PORT_DEVICE."'); // Kommunikationsport \r";
$SText.="\r";
$SText.="define ('ID_POWER', ".$VarID_Power.");\r";
$SText.="define ('ID_KEYLOCK', ".$VarID_KeyLock.");\r";
$SText.="define ('ID_DISPLAY', ".$VarID_Display.");\r"; 
$SText.="define ('ID_DISPLAY_CHANGE', ".$VarID_DisplCh.");\r";
$SText.="define ('ID_VOL_DB', ".$VarID_dB.");\r";
$SText.="define ('ID_VOL', ".$VarID_Vol.");\r";
$SText.="define ('ID_MUTE', ".$VarID_Mute.");\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.="define ('ID_CHANGE_LISTENING_MODE_EXT', ".$VarID_LM_Ext.");\r";
$SText.="define ('ID_INET_RADIO', ".$VarID_WebRadio.");\r";
$SText.="define ('ID_INET_RADIO_BUTTONS', ".$VarID_WebRStn.");\r"; 
$SText.="define ('ID_INET_STATION', ".$VarID_WebRBtn.");\r";
$SText.="?>\r"; 

$ID_PIONEER_SCRIPT_VARS= CreateScriptByName(NAME_DEVICE."_Vars", $ID_INSTANZ, $SText);


// INCLUDE-Daten in Hauptskript eintragen
$SText="<?\r"; 
$SText.="// Erzeugt von INSTALL_SCRIPT\r";
$SText.="// ########### INCLUDE-START ###########\r";
$SText.="include(IPS_GetScriptFile(".$ID_PIONEER_SCRIPT_CONF."));\r";
$SText.="include(IPS_GetScriptFile(".$ID_PIONEER_SCRIPT_VARS."));\r";
$SText.="// ########### INCLUDE-ENDE  ###########\r\r";
$SText.="// ########### AB HIER HAUPT-SKRIPT EINFÜGEN  ###########\r";
$SText.="?>\r"; 
IPS_SetScriptContent($ID_PIONEER_SCRIPT, $SText);


// Funktion zum erstellen eines Variablen 
// 
// Parameter: 
// VarNAME      = Name wie die Variable im Objektbaum heissen soll
// VarTyp        = Typ der Variablen (0=Boolean, 1=Integer, 2=Float, 3=String)
// Icon            = Icon für Variable, wenn nicht aus Profil
// ParentID     = Objekt ID unter der das Script untergehangen wird
// Profil        = Name des Profils 
// ScriptID     = Aktionsskript ID
// Position        = Reihenfolge im Objektbaum 
// Hidden        = Variable unsichtbar (true|false)

function CreateVarByName($Position, $VarNAME, $VarTyp, $Icon, $ParentID, $Profil, $ScriptID, $Hidden) 
 { 
 global $IPS_SELF; 
 $VarID = @IPS_GetVariableIDByName($VarNAME, $ParentID); 
 if ($VarID == 0){ 
  $VarID = IPS_CreateVariable($VarTyp); 
  IPS_SetName($VarID, $VarNAME); 
  IPS_SetParent($VarID, $ParentID);
  IPS_SetVariableCustomProfile($VarID, $Profil); 
  IPS_SetVariableCustomAction($VarID, $ScriptID);    
  IPS_SetPosition($VarID, $Position);
  IPS_SetIcon($VarID, $Icon);
  IPS_SetHidden($VarID, $Hidden);
 } 
return $VarID; 
} 


// 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 

function CreateScriptByName($ScriptNAME, $ParentID, $ScriptTEXT) 

 { 
 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#"); 
  IPS_SetScriptContent($ScriptID, $ScriptTEXT);
  IPS_SetHidden($ScriptID, true); 
  IPS_SetPosition($ScriptID, 98); 
 } 
return $ScriptID; 
} 

Ich hoffe das hilft weiter. :smiley:

Viele Grüße Crazy

Hallo Leute,

ich habe mal begonnen ein Modul für den Pioneer VSX923 zu schreiben.

Noch ist das ganze im Aufbau, von den unglaublich umfangreichen Möglichkeiten ist nur ein Bruchteil umgesetzt.

Mein Problem ist aber eher nicht die Umsetzung des Moduls, sondern dass ich die verschiedenen Funktionalitäten und Abhängigkeiten noch nicht vollends verstanden habe.

Ich würde mich also freuen, wenn ihr mir hier und da noch „Nachhilfe“ bezüglich der Nutzung dieses Receivers geben könntet - je mehr ich das verstehe, umso besser bildet das Modul das dann auch ab…

Aber Obacht: Noch ist das Modul zwar schon zu gebrauchen, hat aber hier und da noch seine Defizite…:wink:

Fragen:

  • Welche Quellen kann ich für die Zone 2 nutzen? Ist dass abhängig von der Quelle (HDMI/Analog) in der Hauptzone?

  • Wann kann Bass/Treble manuell verändert werden? Tone muss auf „ByPass“? Wann ist das „erlaubt“?

  • Wenn Zone 2 aktiviert ist, dann sind offensichtlich nur Speaker A+B möglich. Wann ist die Differenzierung Speaker A/Speaker B/ Speaker A+B möglich?

Joachim

Da ich noch kein Modul gebaut habe und mich intensiv an dem Skript für den VSX-923 ausgelasse hatte, bin ich neugierig zu sehen wie das abläuft/gemacht wird.

Zu den aktuellen Fragen kann ich leider keine Auskunft geben.

…vielleicht noch mal zur besseren Erläuterung…
In der Bedienungsanleitung steht folgendes:

Mit dieser Einstellung werden die Tonsteuerungen für Höhen und Bässe auf eine Quelle angewendet oder komplett umgangen.

Diese Einstellung erscheint nur, wenn der Hörmodus STEREO, Auto-Surround (STEREO) oder SOUND RETRIEVER AIR ist.

Habe versucht das im Modul korrekt abzubilden. Nach meinem Verständnis müssten das mehrere der „ListingMode“ sein die das dann freigeben bzw. sperren.
Habe 6, 9 und 153 probiert, offenbar sind das in Gänze oder in Teilen nicht die richtigen. Kann da jemand einen Tipp geben?

Joachim

Superb!!!:D:D:D
Ich steuere damit ab sofort meinen VSX-830, das geht ebenfalls wunderbar.
Ich musste nur die Eingänge etwas abändern, der Rest klappt hervorragend.
Vielen Dank…

Hallo Maeffjus,

vielen Dank. Da ist noch deutlich mehr möglich, war bisher nur wenig Interesse. Was Du noch nicht sehen kannst ist die HTML-Aufbereitung des Displays, werde ich mal in den nächsten Tagen versuchen dort zu integrieren.

Was ist denn bei Dir anders? Möglicherweise lässt sich das ja im Modul integrieren?

Joachim

So gut wie nix - ich habe die Eingänge nur umbenannt :wink:
Zudem hast Du im Hauptscript viele Eingänge einfach als „Diverses“ zusammengefasst, unter anderem auch von mir genutzte.
Aber das ist ja kein Problem - habe die Nummern und Namen angepasst und jetzt gehen die bei mir auch. (Ich benutze z.B. SPDIF-COAX für meine Squeezebox).
Gruß,
Maeffjus

Hallo Maeffjus,

bin jetzt etwas verunsichert: Benutzt Du mein Modul oder die Skripte?

Joachim

Öhm hoppla - Asche über mein Haupt :smiley:
Ich benutze die Skripte.
Wenn ich ein Modul oder was auch immer finde, dann lese ich ja nicht grundsätzlich den kpl. Thread durch, ich habe das mit dem Modul erst später gesehen. Und dann ergibt sich für dich ggf. auch wieso ich die Eingänge umbenannt habe :wink:
Ich werde die Tage aber mal einen Blick auf das Modul werfen!

Gruß
Maeffjus

Modul geht super :wink:
Wenn ich Zeit habe schreibe ich meine Skripte um, dann brauche ich die Skripte nicht mehr…