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:
- Script in IPS anlegen und den Inhalt von „PioneerAVR_Install.isp.php“ einfügen .
- 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.
- Es wird „hoffentlich“ alles angelegt. Dabei auch zwei Scripte unter der angelegten Instanz
- Die Inhalte der Scripte „PioneerAVR_Const.ips.php“ und „PioneerAVR.ips.php“ in die vorab angelegten Hüllen einfügen, also Copy und Paste.
- 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";
}
?>