Nur mal so (musste meine neue Anlage steuern)... Funktioniert gut, unterstützt aber nur die von mir benötigten Funktionen - Ihr dürft den LBS also nach Herzenslust modifizieren, kopieren oder ignorieren 
EDIT:
Code etwas modifiziert - so ist's besser...

Code:
###[DEF]### [name = DENON CEOL N9 ] [e#1 OPTION= Aktiviert #init=1 ] [e#2 IMPORTANT= IP-Adresse ] [e#3 TRIGGER= Ein/Aus ] [e#4 TRIGGER= Quelle ] [e#5 TRIGGER= Lautstärke ] [e#6 TRIGGER= Stumm ] [e#7 TRIGGER= Favorit ] [e#8 TRIGGER= Befehl ] [a#1 = Status ] [a#2 = Info ] [a#3 = Ein/Aus ] [a#4 = Quelle ] [a#5 = Lautstärke ] [a#6 = Stumm ] [a#7 = Favorit ] [a#8 = Befehl ] [v#2 = ] SBC: Info [v#3 = ] SBC: Ein/Aus [v#4 = ] SBC: Quelle [v#5 = ] SBC: Lautstärke [v#6 = ] SBC: Stumm [v#7 = ] SBC: Favorit ###[/DEF]### ###[HELP]### Dieser Baustein ermöglich die Steuerung eines DENON CEOL N9 (ggf. auch ähnliche Typen). Sofern der Baustein aktiviert ist (E1≠0), wird der Status des Geräts zyklisch abgefragt (z.B. Betriebszustand, Lautstärke, etc.). Das Abfrage-Intervall wird dynamisch zwischen 0.5..10s variieren: Beim Start (E1) wird das Intervall zunächst mit 3s festgelegt und dann kontinuierlich bis auf 10s verlängert. Nach jedem Befehl (E3..E8) wird das Abfrageintervall auf 0.5s gesetzt und steigt dann erneut kontinuiertlich an. Über die Eingänge E3..E8 können Paramter des Geräts festgelegt werden (Befehle). Die Befehle werden mit einer Rate von max. 2/s ausgeführt, um das Gerät nicht zu überlasten. E1: ≠0=Baustein ist aktiviert, 0=Baustein ist deaktiviert E2: IP-Adresse des Geräts (in der Form 111.222.333.444), ohne diese Angabe startet der Baustein nicht E3: 1=Gerät einschalten, 0=Gerät ausschalten E4: Eingangsquelle des Geräts festlegen: 1=Internet Radio, 2=Analog-In, 3=Radio, 4=USB, 5=CD, 6=Digital-In1, 7=Digital-In2, 8=Server (z.B. Airplay, etc.), 9=Bluetooth E5: 0..60=Lautstärke des Geräts festlegen E6: 1=Stumm schalten, 0=Stummschaltung aufheben E7: 1..50=Favorit abrufen E8: eigenen Befehl absetzen (aus der Denon-API: /goform/formiPhoneAppDirect.xml?<BEFEHL>) A1: letzter Status des Bausteins: 0=deaktiviert, 1=aktiviert, 2=Abfrage-Fehler, 3=Fehler beim Absetzen eines Befehls (A1 wird z.B. nach einem Fehler nicht zurückgesetzt, der letzte Zustand bleibt also stets erhalten) A2: Informationen über den aktuellen Zustands des Geräts: je nach Zustand entspricht dies z.B. dem Display-Inhalt, einzelne Zeilen werden mit einem Semikolon separiert (z.B. "Zeile1;Zeile2;...") A3 (SBC): aktueller Betriebszustand des Geräts (1=Ein, 0=Aus) A4 (SBC): aktuelle Eingangsquelle des Geräts: 1=Internet Radio, 2=Analog-In, 3=Radio, 4=USB, 5=CD, 6=Digital-In1, 7=Digital-In2, 8=Server (z.B. Airplay, etc.), 9=Bluetooth A5 (SBC): aktuelle Lautstärke des Geräts: das Abfragen der aktuellen Lautstärke funktioniert leider nicht zuverlässig, daher wird A5 stets beim Setzen der Lautstärke (E5) auf den Wert von E5 gesetzt (und ggf. bei erfolgreichem Polling erneut gesetzt) A6 (SBC): aktueller Stummschaltung-Zustand (1=Stumm, 0=Aus) A7 (SBC): aktuell gewählter Favorit: das Abfragen des aktuellen Favoriten ist nicht möglich, daher wird A7 stets auf den Wert von E7 gesetzt A8 (SBC): bei einem erfolgreich abgesetzten Befehl (E8) wird dieser Ausgangs auf den Wert von E8 gesetzt (der Befehl wird jedoch nicht auf seine Gültigkeit geprüft) ###[/HELP]### ###[LBS]### <? function LB_LBSID($id) { if ($E=logic_getInputs($id)) { if (logic_getStateExec($id)==0) { if ($E[1]['refresh']==1 && $E[1]['value']!=0 && (!isEmpty($E[2]['value']))) { logic_setInputsQueued($id,$E); logic_callExec(LBSID,$id); } } else { logic_setInputsQueued($id,$E); } } } ?> ###[/LBS]### ###[EXEC]### <? require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php"); set_time_limit(0); restore_error_handler(); error_reporting(0); sql_connect(); //------------------------------------------------------------------------------------------------------------ $cmdInterval=0.5; //Befehlsintervall in Sekunden $pollMaxInterval=10; //max. Abfrageintervall in Sekunden $pollInterval=3; //initiales Abfrageintervall in Sekunden $const_sources=array('NET','IRADIO','ANALOGIN','TUNER','USB','CD','DIGITALIN1','DIGITALIN2','SERVER','BLUETOOTH'); //------------------------------------------------------------------------------------------------------------ $pollTimerOld=0; $cmdTimerOld=0; if ($E=logic_getInputs($id)) {$serverIp=$E[2]['value'];} else {$serverIp='';} logic_setOutput($id,1,1); while (logic_getEdomiState()==1 && (!isEmpty($serverIp))) { $doPoll=false; $doCmd=false; if ((getMicrotime()-$pollTimerOld)>=$pollInterval) { $pollTimerOld=getMicrotime(); $doPoll=true; } if ((getMicrotime()-$cmdTimerOld)>=$cmdInterval) { $cmdTimerOld=getMicrotime(); $doCmd=true; } if ($doPoll || $doCmd) { if ($V=logic_getVars($id)) { //Status-Polling if ($doPoll) { $xml=LB_LBSID_getStatus($serverIp,'goform/formMainZone_MainZoneXmlStatusLite.xml'); if ($xml!==false) { $xml2=LB_LBSID_getStatus($serverIp,'goform/formNetAudio_StatusXml.xml'); //Info if ($xml2!==false) { $tmp=''; foreach ($xml2->{'szLine'}->{'value'} as $value) { $tmp.=str_replace(';','',$value).';'; } if (strval($V[2])!=strval($tmp)) { logic_setOutput($id,2,$tmp); logic_setVar($id,2,$tmp); } } $tmp=(($xml->{'Power'}->{'value'}=='ON')?1:0); if (strval($V[3])!=strval($tmp)) { logic_setOutput($id,3,$tmp); logic_setVar($id,3,$tmp); } $value=$xml->{'InputFuncSelect'}->{'value'}; $tmp=array_search($value,$const_sources); if ($tmp!==false) { if ($tmp>=1) { if (strval($V[4])!=strval($tmp)) { logic_setOutput($id,4,$tmp); logic_setVar($id,4,$tmp); } } else if ($tmp==0 && $xml2!==false) { //Quelle ist NET -> Details ermitteln $value=$xml2->{'NetFuncSelect'}->{'value'}; $tmp=array_search($value,$const_sources); if ($tmp!==false) { if ($tmp>=1) { if (strval($V[4])!=strval($tmp)) { logic_setOutput($id,4,$tmp); logic_setVar($id,4,$tmp); } } } } } $value=$xml->{'MasterVolume'}->{'value'}; if (!isEmpty($value) && $value!='--') {$tmp=floatval($value)+80;} else {$tmp=0;} if (strval($V[5])!=strval($tmp)) { logic_setOutput($id,5,$tmp); logic_setVar($id,5,$tmp); } $tmp=(($xml->{'Mute'}->{'value'}=='on')?1:0); if (strval($V[6])!=strval($tmp)) { logic_setOutput($id,6,$tmp); logic_setVar($id,6,$tmp); } $pollInterval+=0.5; } else { $pollInterval=3; logic_setOutput($id,1,2); } if ($pollInterval>$pollMaxInterval) {$pollInterval=$pollMaxInterval;} } //Befehl absetzen if ($doCmd) { if ($E=logic_getInputsQueued($id)) { if ($E[3]['refresh']==1 || $E[4]['refresh']==1 || $E[5]['refresh']==1 || $E[6]['refresh']==1 || $E[7]['refresh']==1 || $E[8]['refresh']==1) { $ok=false; if ($E[3]['refresh']==1) { if (intval($E[3]['value'])!=0) {$tmp=1;} else {$tmp=0;} $ok=LB_LBSID_sendCommand($serverIp,(($tmp==1)?'PWON':'PWSTANDBY')); } else if ($E[4]['refresh']==1) { $tmp=intval($E[4]['value']); if ($tmp>=1 && $tmp<=9) {$ok=LB_LBSID_sendCommand($serverIp,'SI'.$const_sources[$tmp]);} } else if ($E[5]['refresh']==1) { $tmp=intval($E[5]['value']); if ($tmp>=0 && $tmp<=60) { $ok=LB_LBSID_sendCommand($serverIp,'MV'.sprintf('%02d',$tmp)); if ($ok) {logic_setOutput($id,5,$tmp);} //Polling-Status ist unzuverlässig } } else if ($E[6]['refresh']==1) { if (intval($E[6]['value'])!=0) {$tmp=1;} else {$tmp=0;} $ok=LB_LBSID_sendCommand($serverIp,(($tmp==1)?'MUON':'MUOFF')); } else if ($E[7]['refresh']==1) { $tmp=intval($E[7]['value']); if ($tmp>=1 && $tmp<=50) { $ok=LB_LBSID_sendCommand($serverIp,'FVC'.sprintf('%02d',$tmp)); if ($ok) { //Polling-Status gibt es nicht if (strval($V[7])!=strval($tmp)) { logic_setOutput($id,7,$tmp); logic_setVar($id,7,$tmp); } } } } else if ($E[8]['refresh']==1) { $tmp=$E[8]['value']; $tmp=str_replace('/','',$tmp); $tmp=str_replace(';','',$tmp); if (!isEmpty($tmp)) { $ok=LB_LBSID_sendCommand($serverIp,$tmp); if ($ok) {logic_setOutput($id,8,$tmp);} } } if ($ok) { $pollInterval=0.5; } else { logic_setOutput($id,1,3); } } if ($E[1]['value']==0) {break;} } } } } usleep(1000*100); } logic_setOutput($id,1,0); sql_disconnect(); function LB_LBSID_getStatus($ipAddress,$url) { $ctx=stream_context_create(array('http' => array('timeout'=>10))); $r=file_get_contents('http://'.$ipAddress.'/'.$url.'?nocache='.getMicrotimeInt(),10000,$ctx); if ($r!==false) { $tmp=simplexml_load_string($r); if (!isEmpty($tmp)) {return $tmp;} } return false; } function LB_LBSID_sendCommand($ipAddress,$n) { $ctx=stream_context_create(array('http' => array('timeout'=>10))); $r=file_get_contents('http://'.$ipAddress.'/goform/formiPhoneAppDirect.xml?'.$n,1,$ctx); if ($r!==false) {return true;} return false; } ?> ###[/EXEC]###
Code etwas modifiziert - so ist's besser...