Ankündigung

Einklappen
Keine Ankündigung bisher.

LBS "DENON CEOL N9" (und Anwendungsbeispiel für die neuen EXEC-Queue-Funktionen)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    LBS "DENON CEOL N9" (und Anwendungsbeispiel für die neuen EXEC-Queue-Funktionen)

    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

    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]###
    EDIT:
    Code etwas modifiziert - so ist's besser...
    Zuletzt geändert von gaert; 18.08.2018, 08:34.
    EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)
Lädt...
X