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
PHP-Code:
<?
<?
$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."\n";
}
*/
//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
// 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
// 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);
}
// 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);
// 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],"");
// 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";
}
?>
Geändert von mäc (24.07.10 um 18:05 Uhr)
Grund: Update
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
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.
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
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?
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.
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
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.