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="< [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.
Nice work man!
I tried official denon binding, but it doesent work with my Denon AVR3808.
Do you know, what to change in this configuration to work with AVR3808?
Thanks
Thank you, I’ve recently been searching for information approximately this subject for
a while and yours is the greatest I’ve discovered so far.
However, what concerning the bottom line? Are you positive about the supply?
Wonderful blog! I found it while browsing on Yahoo News.
Do you have any suggestions on how to get listed
in Yahoo News? I’ve been trying for a while but I never seem to get there!
Many thanks
Thanks for finally writing about >DENON AV Reciever mit
openHAB steuern – Blue-PC <Liked it!
Howdy! Would you mind if I share your blog with my twitter group?
There’s a lot of folks that I think would really enjoy your content.
Please let me know. Cheers
Yes no Problem