From 54e21a4f218511a25bc2f21ccdffbd7a1c75ad30 Mon Sep 17 00:00:00 2001
From: loosrob <79396812+loosrob@users.noreply.github.com>
Date: Fri, 30 Jul 2021 17:55:08 +0200
Subject: [PATCH] Improve catching polling errors
try/expect around http requests
---
yamahaavr/integrationpluginyamaha.py | 594 ++++++++++++++-------------
1 file changed, 306 insertions(+), 288 deletions(-)
diff --git a/yamahaavr/integrationpluginyamaha.py b/yamahaavr/integrationpluginyamaha.py
index f3685ead..fa4dd58a 100644
--- a/yamahaavr/integrationpluginyamaha.py
+++ b/yamahaavr/integrationpluginyamaha.py
@@ -48,8 +48,7 @@ class ZeroconfListener(object):
return
pollTimer = None
-
-playPoll = False
+pollFrequency = 40
def discoverThings(info):
if info.thingClassId == receiverThingClassId:
@@ -314,7 +313,7 @@ def setupThing(info):
return
def pollReceiver(info):
- global playPoll
+ global pollFrequency
if info.thingClassId == zoneThingClassId:
# get parent receiver thing, needed to get deviceIp
for possibleParent in myThings():
@@ -333,301 +332,320 @@ def pollReceiver(info):
rUrl = 'http://' + deviceIp + ':80/YamahaRemoteControl/ctrl'
body = bodyStart + 'GetParam' + bodyEnd
headers = {'Content-Type': 'text/xml', 'Accept': '*/*'}
- pr = requests.post(rUrl, headers=headers, data=body)
- pollResponse = pr.text
- # add distinction between receiver & zone
- if info.thingClassId == receiverThingClassId:
- receiver = info
- if pr.status_code == requests.codes.ok:
- receiver.setStateValue(receiverConnectedStateTypeId, True)
- # Get power state
- if pollResponse.find("Standby") != -1:
- receiver.setStateValue(receiverPowerStateTypeId, False)
- powerState = False
- elif pollResponse.find("On") != -1:
- receiver.setStateValue(receiverPowerStateTypeId, True)
- powerState = True
- else:
- logger.log("Power state not found!")
- # Get sleep state
- stringIndex1 = pollResponse.find("")
- stringIndex2 = pollResponse.find("")
- responseExtract = pollResponse[stringIndex1+7:stringIndex2]
- receiver.setStateValue(receiverSleepStateTypeId, responseExtract)
- # Get mute state
- if pollResponse.find("Off") != -1:
- receiver.setStateValue(receiverMuteStateTypeId, False)
- elif pollResponse.find("On") != -1:
- receiver.setStateValue(receiverMuteStateTypeId, True)
- else:
- logger.log("Mute state not found!")
- # Get pure direct state
- if pollResponse.find("Off") != -1:
- receiver.setStateValue(receiverPureDirectStateTypeId, False)
- elif pollResponse.find("On") != -1:
- receiver.setStateValue(receiverPureDirectStateTypeId, True)
- else:
- logger.log("Pure Direct state not found!")
- # Get enhancer state
- if pollResponse.find("Off") != -1:
- receiver.setStateValue(receiverEnhancerStateTypeId, False)
- elif pollResponse.find("On") != -1:
- receiver.setStateValue(receiverEnhancerStateTypeId, True)
- else:
- logger.log("Enhancer state not found!")
- # Get input
- stringIndex1 = pollResponse.find("")
- stringIndex2 = pollResponse.find("")
- inputSource = pollResponse[stringIndex1+18:stringIndex2]
- receiver.setStateValue(receiverInputSourceStateTypeId, inputSource)
- videoSources = ["HDMI1","HDMI2","HDMI3","HDMI4","HDMI5","AV1","AV2","AV3","AV4","AV5","AV6","V-AUX"]
- if inputSource in videoSources:
- receiver.setStateValue(receiverPlayerTypeStateTypeId, "video")
- else:
- receiver.setStateValue(receiverPlayerTypeStateTypeId, "audio")
- # Get sound program
- stringIndex1 = pollResponse.find("")
- stringIndex2 = pollResponse.find("")
- responseExtract = pollResponse[stringIndex1+15:stringIndex2]
- receiver.setStateValue(receiverSurroundModeStateTypeId, responseExtract)
- # Get Cinema DSP 3D state
- stringIndex1 = pollResponse.find("<_3D_Cinema_DSP>")
- stringIndex2 = pollResponse.find("")
- responseExtract = pollResponse[stringIndex1+16:stringIndex2]
- receiver.setStateValue(receiverCinemaDSP3DStateTypeId, responseExtract)
- # Get Adaptive DRC state
- stringIndex1 = pollResponse.find("")
- stringIndex2 = pollResponse.find("")
- responseExtract = pollResponse[stringIndex1+14:stringIndex2]
- receiver.setStateValue(receiverAdaptiveDRCStateTypeId, responseExtract)
- # Get volume - volume is represented by int in Yamaha API, but shown as double = int/10 in Yamaha UI - this is ignored here as nymea wants volume to be an int
- stringIndex1 = pollResponse.find("")
- responseExtract = pollResponse[stringIndex1+18:stringIndex1+30]
- stringIndex2 = responseExtract.find("")
- responseExtract = responseExtract[0:stringIndex2]
- volume = int(responseExtract)
- receiver.setStateValue(receiverVolumeStateTypeId, volume)
- # Get bass
- stringIndex1 = pollResponse.find("")
- responseExtract = pollResponse[stringIndex1+11:stringIndex1+30]
- stringIndex2 = responseExtract.find("")
- responseExtract = responseExtract[0:stringIndex2]
- bass = int(responseExtract)
- receiver.setStateValue(receiverBassStateTypeId, bass)
- # Get treble
- stringIndex1 = pollResponse.find("")
- responseExtract = pollResponse[stringIndex1+13:stringIndex1+30]
- stringIndex2 = responseExtract.find("")
- responseExtract = responseExtract[0:stringIndex2]
- treble = int(responseExtract)
- receiver.setStateValue(receiverTrebleStateTypeId, treble)
- # Get dialogue level
- stringIndex1 = pollResponse.find("")
- stringIndex2 = pollResponse.find("")
- responseExtract = pollResponse[stringIndex1+14:stringIndex2]
- dialogueLvl = int(responseExtract)
- receiver.setStateValue(receiverDialogueLevelStateTypeId, dialogueLvl)
- # Get dialogue lift
- stringIndex1 = pollResponse.find("")
- stringIndex2 = pollResponse.find("")
- responseExtract = pollResponse[stringIndex1+15:stringIndex2]
- dialogueLift = int(responseExtract)
- receiver.setStateValue(receiverDialogueLiftStateTypeId, dialogueLift)
- # Get subwoofer trim
- stringIndex1 = pollResponse.find("")
- responseExtract = pollResponse[stringIndex1+21:stringIndex1+30]
- stringIndex2 = responseExtract.find("")
- responseExtract = responseExtract[0:stringIndex2]
- subTrim = int(responseExtract)
- receiver.setStateValue(receiverSubwooferTrimStateTypeId, subTrim)
- # Get player info
- body = '<' + inputSource + '>GetParam' + inputSource + '>'
- headers = {'Content-Type': 'text/xml', 'Accept': '*/*'}
- plr = requests.post(rUrl, headers=headers, data=body)
- if plr.status_code == requests.codes.ok and powerState == True:
- playerResponse = plr.text
- # Get repeat state
- stringIndex1 = playerResponse.find("")
- stringIndex2 = playerResponse.find("")
- responseExtract = playerResponse[stringIndex1+8:stringIndex2]
- if responseExtract not in ["None", "One", "All"]:
- responseExtract = "None"
- receiver.setStateValue(receiverRepeatStateTypeId, responseExtract)
- # Get shuffle state
- stringIndex1 = playerResponse.find("")
- stringIndex2 = playerResponse.find("")
- responseExtract = playerResponse[stringIndex1+9:stringIndex2]
- if responseExtract == "On":
- shuffleStatus = True
+ try:
+ pr = requests.post(rUrl, headers=headers, data=body)
+ polled = True
+ except:
+ logger.log("Device didn't respond to http request to get basic status", deviceIp, info.name)
+ polled = False
+ logger.log("Temporarily reducing pollfrequency to give the device some rest")
+ pollFrequency = 120
+ if polled == True:
+ pollResponse = pr.text
+ # add distinction between receiver & zone
+ if info.thingClassId == receiverThingClassId:
+ receiver = info
+ if pr.status_code == requests.codes.ok:
+ receiver.setStateValue(receiverConnectedStateTypeId, True)
+ # Get power state
+ if pollResponse.find("Standby") != -1:
+ receiver.setStateValue(receiverPowerStateTypeId, False)
+ powerState = False
+ elif pollResponse.find("On") != -1:
+ receiver.setStateValue(receiverPowerStateTypeId, True)
+ powerState = True
else:
- shuffleStatus = False
- receiver.setStateValue(receiverShuffleStateTypeId, shuffleStatus)
- # Get playback state
- stringIndex1 = playerResponse.find("")
- stringIndex2 = playerResponse.find("")
- responseExtract = playerResponse[stringIndex1+15:stringIndex2]
- if responseExtract == "Play":
- playStatus = "Playing"
- playPoll = True or playPoll
- elif responseExtract == "Pause":
- playStatus = "Paused"
- playPoll = True or playPoll
+ logger.log("Power state not found!")
+ # Get sleep state
+ stringIndex1 = pollResponse.find("")
+ stringIndex2 = pollResponse.find("")
+ responseExtract = pollResponse[stringIndex1+7:stringIndex2]
+ receiver.setStateValue(receiverSleepStateTypeId, responseExtract)
+ # Get mute state
+ if pollResponse.find("Off") != -1:
+ receiver.setStateValue(receiverMuteStateTypeId, False)
+ elif pollResponse.find("On") != -1:
+ receiver.setStateValue(receiverMuteStateTypeId, True)
else:
- playStatus = "Stopped"
- playPoll = False or playPoll
- receiver.setStateValue(receiverPlaybackStatusStateTypeId, playStatus)
- # Get meta info
- stringIndex1 = playerResponse.find("")
- stringIndex2 = playerResponse.find("")
- responseExtract = playerResponse[stringIndex1+8:stringIndex2]
- receiver.setStateValue(receiverArtistStateTypeId, unescape(responseExtract, {"&": "&", "'": "'", """: '"'}))
- stringIndex1 = playerResponse.find("")
- stringIndex2 = playerResponse.find("")
- responseExtract = playerResponse[stringIndex1+7:stringIndex2]
- receiver.setStateValue(receiverCollectionStateTypeId, unescape(responseExtract, {"&": "&", "'": "'", """: '"'}))
- stringIndex1 = playerResponse.find("")
- stringIndex2 = playerResponse.find("")
- responseExtract = playerResponse[stringIndex1+6:stringIndex2]
- receiver.setStateValue(receiverTitleStateTypeId, unescape(responseExtract, {"&": "&", "'": "'", """: '"'}))
- # Get artwork --> Yamaha artwork file type isn't recognized by nymea: browse for external cover art?
- stringIndex1 = playerResponse.find("")
- stringIndex2 = playerResponse.find("")
- responseExtract = playerResponse[stringIndex1+5:stringIndex2]
- artURL = 'http://' + deviceIp + ':80' + responseExtract
- receiver.setStateValue(receiverArtworkStateTypeId, artURL)
- else:
- # Playing from external source so no info available
- receiver.setStateValue(receiverRepeatStateTypeId, "None")
- receiver.setStateValue(receiverShuffleStateTypeId, False)
- receiver.setStateValue(receiverPlaybackStatusStateTypeId, "Stopped")
- receiver.setStateValue(receiverArtistStateTypeId, "")
- receiver.setStateValue(receiverCollectionStateTypeId, "")
- receiver.setStateValue(receiverTitleStateTypeId, "")
- receiver.setStateValue(receiverArtworkStateTypeId, "")
- else:
- receiver.setStateValue(receiverConnectedStateTypeId, False)
- elif info.thingClassId == zoneThingClassId:
- zone = info
- if pr.status_code == requests.codes.ok:
- zone.setStateValue(zoneConnectedStateTypeId, True)
- # Get power state
- if pollResponse.find("Standby") != -1:
- zone.setStateValue(zonePowerStateTypeId, False)
- powerState = False
- elif pollResponse.find("On") != -1:
- zone.setStateValue(zonePowerStateTypeId, True)
- powerState = True
- else:
- logger.log("Power state not found!")
- # Get sleep state
- stringIndex1 = pollResponse.find("")
- stringIndex2 = pollResponse.find("")
- responseExtract = pollResponse[stringIndex1+7:stringIndex2]
- zone.setStateValue(zoneSleepStateTypeId, responseExtract)
- # Get mute state
- if pollResponse.find("Off") != -1:
- zone.setStateValue(zoneMuteStateTypeId, False)
- elif pollResponse.find("On") != -1:
- zone.setStateValue(zoneMuteStateTypeId, True)
- else:
- logger.log("Mute state not found!")
- # Get input
- stringIndex1 = pollResponse.find("")
- stringIndex2 = pollResponse.find("")
- inputSource = pollResponse[stringIndex1+18:stringIndex2]
- zone.setStateValue(zoneInputSourceStateTypeId, inputSource)
- videoSources = ["HDMI1","HDMI2","HDMI3","HDMI4","HDMI5","AV1","AV2","AV3","AV4","AV5","AV6","V-AUX"]
- if inputSource in videoSources:
- zone.setStateValue(zonePlayerTypeStateTypeId, "video")
- else:
- zone.setStateValue(zonePlayerTypeStateTypeId, "audio")
- # Get volume
- stringIndex1 = pollResponse.find("")
- responseExtract = pollResponse[stringIndex1+18:stringIndex1+30]
- stringIndex2 = responseExtract.find("")
- responseExtract = responseExtract[0:stringIndex2]
- volume = int(responseExtract)
- zone.setStateValue(zoneVolumeStateTypeId, volume)
- # Get player info
- body = '<' + inputSource + '>GetParam' + inputSource + '>'
- headers = {'Content-Type': 'text/xml', 'Accept': '*/*'}
- plr = requests.post(rUrl, headers=headers, data=body)
- if plr.status_code == requests.codes.ok and powerState == True:
- playerResponse = plr.text
- # Get repeat state
- stringIndex1 = playerResponse.find("")
- stringIndex2 = playerResponse.find("")
- responseExtract = playerResponse[stringIndex1+8:stringIndex2]
- if responseExtract not in ["None", "One", "All"]:
- responseExtract = "None"
- zone.setStateValue(zoneRepeatStateTypeId, responseExtract)
- # Get shuffle state
- stringIndex1 = playerResponse.find("")
- stringIndex2 = playerResponse.find("")
- responseExtract = playerResponse[stringIndex1+9:stringIndex2]
- if responseExtract == "On":
- shuffleStatus = True
+ logger.log("Mute state not found!")
+ # Get pure direct state
+ if pollResponse.find("Off") != -1:
+ receiver.setStateValue(receiverPureDirectStateTypeId, False)
+ elif pollResponse.find("On") != -1:
+ receiver.setStateValue(receiverPureDirectStateTypeId, True)
else:
- shuffleStatus = False
- zone.setStateValue(zoneShuffleStateTypeId, shuffleStatus)
- # Get playback state
- stringIndex1 = playerResponse.find("")
- stringIndex2 = playerResponse.find("")
- responseExtract = playerResponse[stringIndex1+15:stringIndex2]
- if responseExtract == "Play":
- playStatus = "Playing"
- playPoll = True or playPoll
- elif responseExtract == "Pause":
- playStatus = "Paused"
- playPoll = True or playPoll
+ logger.log("Pure Direct state not found!")
+ # Get enhancer state
+ if pollResponse.find("Off") != -1:
+ receiver.setStateValue(receiverEnhancerStateTypeId, False)
+ elif pollResponse.find("On") != -1:
+ receiver.setStateValue(receiverEnhancerStateTypeId, True)
else:
- playStatus = "Stopped"
- playPoll = False or playPoll
- zone.setStateValue(zonePlaybackStatusStateTypeId, playStatus)
- # Get meta info
- stringIndex1 = playerResponse.find("")
- stringIndex2 = playerResponse.find("")
- responseExtract = playerResponse[stringIndex1+8:stringIndex2]
- zone.setStateValue(zoneArtistStateTypeId, responseExtract)
- stringIndex1 = playerResponse.find("")
- stringIndex2 = playerResponse.find("")
- responseExtract = playerResponse[stringIndex1+7:stringIndex2]
- zone.setStateValue(zoneCollectionStateTypeId, responseExtract)
- stringIndex1 = playerResponse.find("")
- stringIndex2 = playerResponse.find("")
- responseExtract = playerResponse[stringIndex1+6:stringIndex2]
- zone.setStateValue(zoneTitleStateTypeId, responseExtract)
- stringIndex1 = playerResponse.find("")
- stringIndex2 = playerResponse.find("")
- responseExtract = playerResponse[stringIndex1+5:stringIndex2]
- artURL = 'http://' + deviceIp + ':80' + responseExtract
- zone.setStateValue(zoneArtworkStateTypeId, artURL)
+ logger.log("Enhancer state not found!")
+ # Get input
+ stringIndex1 = pollResponse.find("")
+ stringIndex2 = pollResponse.find("")
+ inputSource = pollResponse[stringIndex1+18:stringIndex2]
+ receiver.setStateValue(receiverInputSourceStateTypeId, inputSource)
+ videoSources = ["HDMI1","HDMI2","HDMI3","HDMI4","HDMI5","AV1","AV2","AV3","AV4","AV5","AV6","V-AUX"]
+ if inputSource in videoSources:
+ receiver.setStateValue(receiverPlayerTypeStateTypeId, "video")
+ else:
+ receiver.setStateValue(receiverPlayerTypeStateTypeId, "audio")
+ # Get sound program
+ stringIndex1 = pollResponse.find("")
+ stringIndex2 = pollResponse.find("")
+ responseExtract = pollResponse[stringIndex1+15:stringIndex2]
+ receiver.setStateValue(receiverSurroundModeStateTypeId, responseExtract)
+ # Get Cinema DSP 3D state
+ stringIndex1 = pollResponse.find("<_3D_Cinema_DSP>")
+ stringIndex2 = pollResponse.find("")
+ responseExtract = pollResponse[stringIndex1+16:stringIndex2]
+ receiver.setStateValue(receiverCinemaDSP3DStateTypeId, responseExtract)
+ # Get Adaptive DRC state
+ stringIndex1 = pollResponse.find("")
+ stringIndex2 = pollResponse.find("")
+ responseExtract = pollResponse[stringIndex1+14:stringIndex2]
+ receiver.setStateValue(receiverAdaptiveDRCStateTypeId, responseExtract)
+ # Get volume - volume is represented by int in Yamaha API, but shown as double = int/10 in Yamaha UI - this is ignored here as nymea wants volume to be an int
+ stringIndex1 = pollResponse.find("")
+ responseExtract = pollResponse[stringIndex1+18:stringIndex1+30]
+ stringIndex2 = responseExtract.find("")
+ responseExtract = responseExtract[0:stringIndex2]
+ volume = int(responseExtract)
+ receiver.setStateValue(receiverVolumeStateTypeId, volume)
+ # Get bass
+ stringIndex1 = pollResponse.find("")
+ responseExtract = pollResponse[stringIndex1+11:stringIndex1+30]
+ stringIndex2 = responseExtract.find("")
+ responseExtract = responseExtract[0:stringIndex2]
+ bass = int(responseExtract)
+ receiver.setStateValue(receiverBassStateTypeId, bass)
+ # Get treble
+ stringIndex1 = pollResponse.find("")
+ responseExtract = pollResponse[stringIndex1+13:stringIndex1+30]
+ stringIndex2 = responseExtract.find("")
+ responseExtract = responseExtract[0:stringIndex2]
+ treble = int(responseExtract)
+ receiver.setStateValue(receiverTrebleStateTypeId, treble)
+ # Get dialogue level
+ stringIndex1 = pollResponse.find("")
+ stringIndex2 = pollResponse.find("")
+ responseExtract = pollResponse[stringIndex1+14:stringIndex2]
+ dialogueLvl = int(responseExtract)
+ receiver.setStateValue(receiverDialogueLevelStateTypeId, dialogueLvl)
+ # Get dialogue lift
+ stringIndex1 = pollResponse.find("")
+ stringIndex2 = pollResponse.find("")
+ responseExtract = pollResponse[stringIndex1+15:stringIndex2]
+ dialogueLift = int(responseExtract)
+ receiver.setStateValue(receiverDialogueLiftStateTypeId, dialogueLift)
+ # Get subwoofer trim
+ stringIndex1 = pollResponse.find("")
+ responseExtract = pollResponse[stringIndex1+21:stringIndex1+30]
+ stringIndex2 = responseExtract.find("")
+ responseExtract = responseExtract[0:stringIndex2]
+ subTrim = int(responseExtract)
+ receiver.setStateValue(receiverSubwooferTrimStateTypeId, subTrim)
+ # Get player info
+ body = '<' + inputSource + '>GetParam' + inputSource + '>'
+ headers = {'Content-Type': 'text/xml', 'Accept': '*/*'}
+ try:
+ plr = requests.post(rUrl, headers=headers, data=body)
+ polled = True
+ except:
+ logger.log("Device didn't respond to http request to get player status", deviceIp, info.name)
+ polled = False
+ logger.log("Temporarily reducing pollfrequency to give the device some rest")
+ pollFrequency = 120
+ if polled == True:
+ if plr.status_code == requests.codes.ok and powerState == True:
+ playerResponse = plr.text
+ # Get repeat state
+ stringIndex1 = playerResponse.find("")
+ stringIndex2 = playerResponse.find("")
+ responseExtract = playerResponse[stringIndex1+8:stringIndex2]
+ if responseExtract not in ["None", "One", "All"]:
+ responseExtract = "None"
+ receiver.setStateValue(receiverRepeatStateTypeId, responseExtract)
+ # Get shuffle state
+ stringIndex1 = playerResponse.find("")
+ stringIndex2 = playerResponse.find("")
+ responseExtract = playerResponse[stringIndex1+9:stringIndex2]
+ if responseExtract == "On":
+ shuffleStatus = True
+ else:
+ shuffleStatus = False
+ receiver.setStateValue(receiverShuffleStateTypeId, shuffleStatus)
+ # Get playback state
+ stringIndex1 = playerResponse.find("")
+ stringIndex2 = playerResponse.find("")
+ responseExtract = playerResponse[stringIndex1+15:stringIndex2]
+ if responseExtract == "Play":
+ playStatus = "Playing"
+ pollFrequency = min(10, pollFrequency)
+ elif responseExtract == "Pause":
+ playStatus = "Paused"
+ pollFrequency = min(10, pollFrequency)
+ else:
+ playStatus = "Stopped"
+ pollFrequency = min(30, pollFrequency)
+ receiver.setStateValue(receiverPlaybackStatusStateTypeId, playStatus)
+ # Get meta info
+ stringIndex1 = playerResponse.find("")
+ stringIndex2 = playerResponse.find("")
+ responseExtract = playerResponse[stringIndex1+8:stringIndex2]
+ receiver.setStateValue(receiverArtistStateTypeId, unescape(responseExtract, {"&": "&", "'": "'", """: '"'}))
+ stringIndex1 = playerResponse.find("")
+ stringIndex2 = playerResponse.find("")
+ responseExtract = playerResponse[stringIndex1+7:stringIndex2]
+ receiver.setStateValue(receiverCollectionStateTypeId, unescape(responseExtract, {"&": "&", "'": "'", """: '"'}))
+ stringIndex1 = playerResponse.find("")
+ stringIndex2 = playerResponse.find("")
+ responseExtract = playerResponse[stringIndex1+6:stringIndex2]
+ receiver.setStateValue(receiverTitleStateTypeId, unescape(responseExtract, {"&": "&", "'": "'", """: '"'}))
+ # Get artwork --> Yamaha artwork file type isn't recognized by nymea: browse for external cover art?
+ stringIndex1 = playerResponse.find("")
+ stringIndex2 = playerResponse.find("")
+ responseExtract = playerResponse[stringIndex1+5:stringIndex2]
+ artURL = 'http://' + deviceIp + ':80' + responseExtract
+ receiver.setStateValue(receiverArtworkStateTypeId, artURL)
+ else:
+ # Playing from external source so no info available
+ receiver.setStateValue(receiverRepeatStateTypeId, "None")
+ receiver.setStateValue(receiverShuffleStateTypeId, False)
+ receiver.setStateValue(receiverPlaybackStatusStateTypeId, "Stopped")
+ receiver.setStateValue(receiverArtistStateTypeId, "")
+ receiver.setStateValue(receiverCollectionStateTypeId, "")
+ receiver.setStateValue(receiverTitleStateTypeId, "")
+ receiver.setStateValue(receiverArtworkStateTypeId, "")
else:
- # Playing from external source so no info available
- zone.setStateValue(zoneRepeatStateTypeId, "None")
- zone.setStateValue(zoneShuffleStateTypeId, False)
- zone.setStateValue(zonePlaybackStatusStateTypeId, "Stopped")
- zone.setStateValue(zoneArtistStateTypeId, "")
- zone.setStateValue(zoneCollectionStateTypeId, "")
- zone.setStateValue(zoneTitleStateTypeId, "")
- zone.setStateValue(zoneArtworkStateTypeId, "")
- else:
- zone.setStateValue(zoneConnectedStateTypeId, False)
+ receiver.setStateValue(receiverConnectedStateTypeId, False)
+ elif info.thingClassId == zoneThingClassId:
+ zone = info
+ if pr.status_code == requests.codes.ok:
+ zone.setStateValue(zoneConnectedStateTypeId, True)
+ # Get power state
+ if pollResponse.find("Standby") != -1:
+ zone.setStateValue(zonePowerStateTypeId, False)
+ powerState = False
+ elif pollResponse.find("On") != -1:
+ zone.setStateValue(zonePowerStateTypeId, True)
+ powerState = True
+ else:
+ logger.log("Power state not found!")
+ # Get sleep state
+ stringIndex1 = pollResponse.find("")
+ stringIndex2 = pollResponse.find("")
+ responseExtract = pollResponse[stringIndex1+7:stringIndex2]
+ zone.setStateValue(zoneSleepStateTypeId, responseExtract)
+ # Get mute state
+ if pollResponse.find("Off") != -1:
+ zone.setStateValue(zoneMuteStateTypeId, False)
+ elif pollResponse.find("On") != -1:
+ zone.setStateValue(zoneMuteStateTypeId, True)
+ else:
+ logger.log("Mute state not found!")
+ # Get input
+ stringIndex1 = pollResponse.find("")
+ stringIndex2 = pollResponse.find("")
+ inputSource = pollResponse[stringIndex1+18:stringIndex2]
+ zone.setStateValue(zoneInputSourceStateTypeId, inputSource)
+ videoSources = ["HDMI1","HDMI2","HDMI3","HDMI4","HDMI5","AV1","AV2","AV3","AV4","AV5","AV6","V-AUX"]
+ if inputSource in videoSources:
+ zone.setStateValue(zonePlayerTypeStateTypeId, "video")
+ else:
+ zone.setStateValue(zonePlayerTypeStateTypeId, "audio")
+ # Get volume
+ stringIndex1 = pollResponse.find("")
+ responseExtract = pollResponse[stringIndex1+18:stringIndex1+30]
+ stringIndex2 = responseExtract.find("")
+ responseExtract = responseExtract[0:stringIndex2]
+ volume = int(responseExtract)
+ zone.setStateValue(zoneVolumeStateTypeId, volume)
+ # Get player info
+ body = '<' + inputSource + '>GetParam' + inputSource + '>'
+ headers = {'Content-Type': 'text/xml', 'Accept': '*/*'}
+ try:
+ plr = requests.post(rUrl, headers=headers, data=body)
+ polled = True
+ except:
+ logger.log("Device didn't respond to http request to get player status", deviceIp, info.name)
+ polled = False
+ logger.log("Temporarily reducing pollfrequency to give the device some rest")
+ pollFrequency = 120
+ if polled == True:
+ if plr.status_code == requests.codes.ok and powerState == True:
+ playerResponse = plr.text
+ # Get repeat state
+ stringIndex1 = playerResponse.find("")
+ stringIndex2 = playerResponse.find("")
+ responseExtract = playerResponse[stringIndex1+8:stringIndex2]
+ if responseExtract not in ["None", "One", "All"]:
+ responseExtract = "None"
+ zone.setStateValue(zoneRepeatStateTypeId, responseExtract)
+ # Get shuffle state
+ stringIndex1 = playerResponse.find("")
+ stringIndex2 = playerResponse.find("")
+ responseExtract = playerResponse[stringIndex1+9:stringIndex2]
+ if responseExtract == "On":
+ shuffleStatus = True
+ else:
+ shuffleStatus = False
+ zone.setStateValue(zoneShuffleStateTypeId, shuffleStatus)
+ # Get playback state
+ stringIndex1 = playerResponse.find("")
+ stringIndex2 = playerResponse.find("")
+ responseExtract = playerResponse[stringIndex1+15:stringIndex2]
+ if responseExtract == "Play":
+ playStatus = "Playing"
+ pollFrequency = min(10, pollFrequency)
+ elif responseExtract == "Pause":
+ playStatus = "Paused"
+ pollFrequency = min(10, pollFrequency)
+ else:
+ playStatus = "Stopped"
+ pollFrequency = min(30, pollFrequency)
+ zone.setStateValue(zonePlaybackStatusStateTypeId, playStatus)
+ # Get meta info
+ stringIndex1 = playerResponse.find("")
+ stringIndex2 = playerResponse.find("")
+ responseExtract = playerResponse[stringIndex1+8:stringIndex2]
+ zone.setStateValue(zoneArtistStateTypeId, responseExtract)
+ stringIndex1 = playerResponse.find("")
+ stringIndex2 = playerResponse.find("")
+ responseExtract = playerResponse[stringIndex1+7:stringIndex2]
+ zone.setStateValue(zoneCollectionStateTypeId, responseExtract)
+ stringIndex1 = playerResponse.find("")
+ stringIndex2 = playerResponse.find("")
+ responseExtract = playerResponse[stringIndex1+6:stringIndex2]
+ zone.setStateValue(zoneTitleStateTypeId, responseExtract)
+ stringIndex1 = playerResponse.find("")
+ stringIndex2 = playerResponse.find("")
+ responseExtract = playerResponse[stringIndex1+5:stringIndex2]
+ artURL = 'http://' + deviceIp + ':80' + responseExtract
+ zone.setStateValue(zoneArtworkStateTypeId, artURL)
+ else:
+ # Playing from external source so no info available
+ zone.setStateValue(zoneRepeatStateTypeId, "None")
+ zone.setStateValue(zoneShuffleStateTypeId, False)
+ zone.setStateValue(zonePlaybackStatusStateTypeId, "Stopped")
+ zone.setStateValue(zoneArtistStateTypeId, "")
+ zone.setStateValue(zoneCollectionStateTypeId, "")
+ zone.setStateValue(zoneTitleStateTypeId, "")
+ zone.setStateValue(zoneArtworkStateTypeId, "")
+ else:
+ zone.setStateValue(zoneConnectedStateTypeId, False)
def pollService():
logger.log("pollService!!!")
global pollTimer
- global playPoll
- # restart the timer for next poll (if player was playing at previous poll, increase poll frequency)
- # we start the timer before polling the receivers to test if this avoids the timer not restarting due to request errors in pollReceiver
- if playPoll == True:
- interval = 10
- else:
- interval = 30
- logger.log("Restarting timer @ pollService")
- pollTimer = threading.Timer(interval, pollService)
+ global pollFrequency
+ # restart the timer for next poll
+ logger.log("Restarting timer @ pollService, with frequency", pollFrequency)
+ pollTimer = threading.Timer(pollFrequency, pollService)
pollTimer.start()
- playPoll = False
+ pollFrequency = 30
# Poll all receivers we know
for thing in myThings():
if thing.thingClassId == receiverThingClassId or thing.thingClassId == zoneThingClassId: