DENON AV Reciever mit openHAB steuern

Nachdem ich die HTTP Befehle hatte, habe ich mich daran gemacht das HTTP Binding von openHAB zu konfigurieren.

Information von Januar 2015 – Inzwischen gibt es ein DENON Binding für openHAB.

Da die Status Informationen einer Zone in einer XML Datei des Receiver stehen, habe ich für jede Zone ein “cache item” in der openhab.cfg angelegt.

openHAB

openhab.cfg

############################### HTTP Binding ##########################################
#
# timeout in milliseconds for the http requests (optional, defaults to 5000)
#http:timeout=

# the interval in milliseconds when to find new refresh candidates
# (optional, defaults to 1000)
#http:granularity=

# configuration of the first cache item
http:CacheDenonMainZoneStatusLite.url=http://192.168.2.99/goform/formMainZone_MainZoneXmlStatusLite.xml
http:CacheDenonMainZoneStatusLite.updateInterval=1000

# configuration of the second cache item
http:CacheDenonZone2StatusLite.url=http://192.168.2.99/goform/formZone2_Zone2XmlStatusLite.xml
http:CacheDenonZone2StatusLite.updateInterval=1000

Somit werden die beiden Status seiten jede Sekunde abgerufen. Im moment benutze ich aber nur die erste Zone

Ich habe mir dann folgende Items angelegt. Die dazugehörigen XSL Dateien befinden sich im Archiv am Ende des Artikels.

Blue.items

Switch Denon_Main_Power "Power" <power> (gDENON) { http="<[CacheDenonMainZoneStatusLite:5000:XSLT(denon_x3000_master_power.xsl)] >[ON:GET:http://192.168.2.99/goform/formiPhoneAppPower.xml?1+PowerOn] >[OFF:GET:http://192.168.2.99/goform/formiPhoneAppPower.xml?1+PowerStandby]" }
String Denon_Main_Input "Eingang" <input> (gDENON)
String Denon_Main_InputTXT "Eingang [%s]" <input> (gDENON) { http="<[CacheDenonMainZoneStatusLite:1000:XSLT(denon_x3000_master_input.xsl)]" }
Switch Denon_Main_Mute "Mute" <volumemute> (gDENON) { http="<[CacheDenonMainZoneStatusLite:1000:XSLT(denon_x3000_master_mute.xsl)] >[ON:GET:http://192.168.2.99/goform/formiPhoneAppMute.xml?1+MuteOn] >[OFF:GET:http://192.168.2.99/goform/formiPhoneAppMute.xml?1+MuteOff]"}
Dimmer Denon_Main_Volume "Lautstärke [%.1f]" <volume> (gDENON)
Number Denon_Main_Volumedb "Lautstärke db [%.1f db]" <none> (gDENON) { http="&lt [CacheDenonMainZoneStatusLite:1000:XSLT(denon_x3000_master_volumedb.xsl)]"}

Dazu noch die dazugehörigen Sitemap Einträge. Der “IRADIO” Eintrag ist nur enthalten, um den Eingang richtig anzuzeigen wen ich AIRplay benutze.

Frame label="DENON" {
 Switch item=Denon_Main_Power label="Main Zone Power"
 Switch item=Denon_Main_Mute
 Setpoint item=Denon_Main_Volume minValue=0 maxValue=100 step=1
 Selection item=Denon_Main_Input mappings=[GAME="GAME", TV="TV AUDIO", FAVORITE1="Radio NDR2", IRADIO="Internet Radio"]
 }

denon.rule

Das meiste sollte schon funktionieren.  Da es beim setzen der Lautstärke und dem passiven abfragen des Status immer wieder zu Überschneidungen gekommen ist, habe ich mir über eine  rule-Datei einen “timer” für das setzen angelegt. Darüber werden die Eingange und die Lautstärke gesetzt. Je nach ausgeführten Befehl wird der Timer neu gesetzt, um eine Überschneidung zu verhindern.

Zusätzlich gibt es noch die Regel “DENON Main Zone InputTXT” in der selben rule-Datei. Diese sorgt für die Umsetzung von Namen, da sonst der angezeigte Name und der Befehl für den Eingang nicht stimmen.

import org.joda.time.*
import org.openhab.core.library.types.*
import org.openhab.core.library.math.*
import org.openhab.model.script.actions.*
//import java.lang.Math // (Math::round(varMAINVolumeDB.doubleValue)

var Integer varTimerMAINRefreshTime = 2 //sollte Ungefähr das doppelte vom Binding Refresh haben
var Integer varTimerMAINRefreshTimeFast = 100 //sollte Ungefähr das ein Zehntel vom Binding Refresh haben !!!Vorsicht Millisekunden!!!

// DENON MASTER VOLUME
// -------------------------------------------------------------------------------------------------------
var String varMAINurlVolume = "http://192.168.2.99/goform/formiPhoneAppVolume.xml?1+" //IP-Adresse anpassen
var Number varMAINVolumeDB = 0
var Number varMAINVolumeStep = 1 //Schritt zum erhöhen der Lautstärke von 0.5 bis 2 ist OK !!!Nur 0.5 Schritte!!!
var Timer varTimerMAINVolumeUpdate = null

// DENON MASTER INPUT
// -------------------------------------------------------------------------------------------------------
var String varMAINurlInput = "http://192.168.2.99/goform/formiPhoneAppDirect.xml?" //IP-Adresse anpassen
var String varMAINInput = ""
var Timer varTimerMAINInputUpdate = null

// =======================================================================================================
// DENON Timer
// =======================================================================================================

rule "Startup DENON Timer"
when
   System started
then
   varTimerMAINVolumeUpdate = createTimer(now.plusSeconds(5)) [|
      postUpdate(Denon_Main_Volume, varMAINVolumeDB + 80)
      varTimerMAINVolumeUpdate.reschedule(now.plusSeconds(varTimerMAINRefreshTime))
 ]

   varTimerMAINInputUpdate = createTimer(now.plusSeconds(5)) [|
      postUpdate(Denon_Main_Input, varMAINInput)
      varTimerMAINInputUpdate.reschedule(now.plusSeconds(varTimerMAINRefreshTime))
 ]
end

// =======================================================================================================
// DENON MASTER Volume
// =======================================================================================================

rule "DENON Main Zone Volume"
   when
      Item Denon_Main_Volumedb received update
   then
      varMAINVolumeDB = Denon_Main_Volumedb.state as DecimalType
   end

rule "DENON Main Volume Slider COMMAND"
   when
      Item Denon_Main_Volume received command
   then
      switch receivedCommand {
         case receivedCommand == DECREASE : {
            varMAINVolumeDB = varMAINVolumeDB - varMAINVolumeStep
            varTimerMAINVolumeUpdate.reschedule(now.plusMillis(varTimerMAINRefreshTimeFast))
         }
         case receivedCommand == INCREASE : {
            varMAINVolumeDB = varMAINVolumeDB + varMAINVolumeStep
            varTimerMAINVolumeUpdate.reschedule(now.plusMillis(varTimerMAINRefreshTimeFast))
         }
         case ( receivedCommand >= 1 && receivedCommand <= 100 ) : {
            varMAINVolumeDB = receivedCommand as DecimalType - 80
            varMAINVolumeDB = varMAINVolumeDB.floatValue
            postUpdate(Denon_Main_Volume, varMAINVolumeDB + 80)
            varTimerMAINVolumeUpdate.reschedule(now.plusSeconds(varTimerMAINRefreshTime * 2))
         }
      }
      logInfo( "DENON VOLUME", "Setze Volume:" + varMAINVolumeDB.toString)
      sendHttpGetRequest(varMAINurlVolume + varMAINVolumeDB.toString)
   end

// =======================================================================================================
// DENON MASTER INPUT
// =======================================================================================================

rule "DENON Main Zone InputTXT"
   when
      Item Denon_Main_InputTXT received update
   then
      if (Denon_Main_InputTXT.state.toString == "SAT/CBL") varMAINInput = "SATCBL"
      else if (Denon_Main_InputTXT.state.toString == "Internet Radio") varMAINInput = "IRADIO"
      else varMAINInput = Denon_Main_InputTXT.state.toString
   end

rule "DENON Main Input COMMAND"
   when
      Item Denon_Main_Input changed
   then
      logInfo( "DENON COMMAND", varMAINurlInput + Denon_Main_Input.state.toString)
      varTimerMAINInputUpdate.reschedule(now.plusSeconds(varTimerMAINRefreshTime * 2))
      if (Denon_Main_Input.state.toString == "SATCBL") sendHttpGetRequest(varMAINurlInput + "SISAT/CBL")
      else if (Denon_Main_Input.state.toString == "IRADIO") {}
      else if (Denon_Main_Input.state.toString == "FAVORITE1") sendHttpGetRequest(varMAINurlInput + "ZMFAVORITE1")
      else if (Denon_Main_Input.state.toString == "FAVORITE2") sendHttpGetRequest(varMAINurlInput + "ZMFAVORITE2")
      else if (Denon_Main_Input.state.toString == "FAVORITE3") sendHttpGetRequest(varMAINurlInput + "ZMFAVORITE3")
      else sendHttpGetRequest(varMAINurlInput + "SI" + Denon_Main_Input.state.toString)
end

Download

Anbei noch einmal alle Konfigurationsdateien als ZIP-Archiv.


DENON openHAB config

 

6 Comments

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

− 4 = 4