Hallo,
hier kann ich auch mal was einbringen. Ich habe mir auch ein Pioneer AVR Plugin "gebastelt", speziell für den VSX921 via telnet.
Das funktioniert soweit inkl. der "Übersetzung" des Display. Das Plugin basiert auf dem Denon-Plugin.
Vielleicht kannst Du was verwenden.
Hier mal die Infos:
conf
und das Plugin selbst
Hilft es?
Viele Grüße
hier kann ich auch mal was einbringen. Ich habe mir auch ein Pioneer AVR Plugin "gebastelt", speziell für den VSX921 via telnet.
Das funktioniert soweit inkl. der "Übersetzung" des Display. Das Plugin basiert auf dem Denon-Plugin.
Vielleicht kannst Du was verwenden.
Hier mal die Infos:
conf
Code:
[Pioneer] [[Power]] type = bool visu_acl = rw pioneer_send = power enforce_updates = on [[Mute]] type = bool visu_acl = rw pioneer_send = mute enforce_updates = on [[Volume]] type = num visu_acl = rw pioneer_send = volume pioneer_listen = volume enforce_updates = on [[VolumeUp]] type = bool visu_acl = rw pioneer_send = volume+ enforce_updates = on [[VolumeDown]] type = bool visu_acl = rw pioneer_send = volume- enforce_updates = on [[Source]] type = str visu_acl = rw pioneer_send = source pioneer_listen = source enforce_updates = on [[Source_Text]] type = str visu_acl = rw enforce_updates = on [[SourceCyclic]] type = str visu_acl = rw pioneer_send = sourcecyclic enforce_updates = on [[NowPlaying]] type = str visu_acl = rw pioneer_listen = title enforce_updates = on [[Station]] type = str visu_acl = rw pioneer_listen = station enforce_updates = on [[HMG_Play]] type = num visu_acl = rw pioneer_send = hmg_play [[HMG_Previous]] type = num visu_acl = rw pioneer_send = hmg_pre [[HMG_Next]] type = num visu_acl = rw pioneer_send = hmg_next [[Bass]] type = num visu_acl = rw pioneer_listen = bass enforce_updates = yes [[BassUp]] type = num visu_acl = rw pioneer_send = bass+ enforce_updates = on [[BassDown]] type = num visu_acl = rw pioneer_send = bass enforce_updates = on [[Treble]] type = num visu_acl = rw pioneer_listen = treble enforce_updates = yes [[TrebleUp]] type = num visu_acl = rw pioneer_send = treble+ enforce_updates = on [[TrebleDown]] type = num visu_acl = rw pioneer_send = treble- enforce_updates = on [[FLDisplay]] type = str visu_acl = rw pioneer_listen = fldisplay enforce_updates = yes [[ListeningModeSet]] type = str visu_acl = rw pioneer_send = listeningmodeset pioneer_listen = listeningmodeset enforce_updates = yes [[ListeningModeSet_Text]] type = str visu_acl = rw enforce_updates = yes [[ListeningMode]] type = str visu_acl = rw pioneer_listen = listeningmode enforce_updates = yes [[ListeningMode_Text]] type = str visu_acl = rw enforce_updates = yes [[iRadioFav]] type = str visu_acl = rw pioneer_send = iRadioF enforce_updates = yes [[RadioFav]] type = str visu_acl = rw pioneer_send = RadioF enforce_updates = yes [[RadioFavCyclic]] type = bool visu_acl = rw pioneer_send = RadioFcyclic enforce_updates = yes # [[ZonePower]] # type = bool # visu_acl = rw # pioneer_send = zonepower # enforce_updates = on # [[ZoneMute]] # type = bool # visu_acl = rw # pioneer_send = zonemute # enforce_updates = on # [[ZoneVolume]] # type = num # visu_acl = rw # pioneer_send = zonevolume # enforce_updates = on # [[ZoneVolumeUp]] # type = bool # visu_acl = rw # pioneer_send = zonevolume+ # enforce_updates = on # [[ZoneVolumeDown]] # type = bool # visu_acl = rw # pioneer_send = zonevolume- # enforce_updates = on # [[ZoneSource]] # type = str # visu_acl = rw # pioneer_send = zonesource # enforce_updates = on # [[ZoneNowPlaying]] # type = str # visu_acl = rw # pioneer_listen = zonetitle # [[ZoneStation]] # type = str # visu_acl = rw # pioneer_listen = zonestation # [[ZoneNext]] # type = num # visu_acl = rw # pioneer_listen = zonenext # enforce_updates = on # [[ZonePrevious]] # type = num # visu_acl = rw # pioneer_listen = zoneprevious # enforce_updates = on
Code:
import logging import threading from subprocess import call from time import sleep import lib.connection logger = logging.getLogger('Pioneer') class Pioneer(lib.connection.Client): def _wait(time_lapse): time_start = time.time() time_end = (time_start + time_lapse) while time_end > time.time(): pass def sendTimerExpired(): #send last command again self._send(self,self._lastCommand); # Initialize connection to receiver def __init__(self, smarthome, host, port=23, cycle=15): logger.info("Pioneer: connecting to {0}:{1}".format(host, port)) lib.connection.Client.__init__(self, host, port, monitor=True) self.terminator = b'\r' self._host = host self._sh = smarthome self._items = {} self._sources = {} self._cmd_lock = threading.Lock() self._status_objects = ['?V', '?F', '?M', '?S', '?BA', '?TR', '?FL' , '?GAH', '?L'] self._status_objects_count = len(self._status_objects) self._status_objects_pointer = 0 self._status_cycle_counter = 0 self._lastCommand = '' self._sendTimeout = threading.Timer(3,self.sendTimerExpired) # After power on poll status objects (Scheduler) self._sh.scheduler.add('pioneer-status-update', self._update_status, cycle=2) self._sh.scheduler.change('pioneer-status-update', active=False) # Sadly the Pioneer does not send an event on now playing change self._sh.scheduler.add('pioneer-nowplaying-update', self._update_now_playing, cycle=cycle) self._sh.scheduler.change('pioneer-nowplaying-update', active=False) # On connect poll states def handle_connect(self): self._send('?P') logger.debug("Connection handled") # Parse received input from Pioneer and set items def found_terminator(self, data): data = data.decode() self._sendTimeout.cancel() logger.debug("Pioneer: Response: {0} from {1}".format(data, self._host)) # AVR switched on if 'PWR0' in data: logger.info("Pioneer: {0} powered on".format(self._host)) self._items['power'](True, 'Pioneer', self._host) sleep(1.5) self._sh.scheduler.change('pioneer-status-update', active=True) # AVR entered standby elif 'PWR1' in data: logger.info("Pioneer: {0} powered off".format(self._host)) self._items['power'](False, 'Pioneer', self._host) self._sh.scheduler.change('pioneer-status-update', active=False) # AVR entered zone2 on #elif data == 'APR0': # logger.info("Pioneer: {0} zone powered on".format(self._host)) # self._items['zonepower'](True, 'Pioneer', self._host) # self._sh.scheduler.change('status-update', active=False) # AVR entered zone2 standby #elif data == 'APR1': # logger.info("Pioneer: {0} zone powered off".format(self._host)) # self._items['zonepower'](False, 'Pioneer', self._host) # self._sh.scheduler.change('status-update', active=False) # AVR Zone2 is muted #elif data == 'Z2MUT0': # logger.info("Pioneer: {0} zone muted".format(self._host)) # self._items['zonemute'](True, 'Pioneer', self._host) # AVR Zone2 is unmuted #elif data == 'Z2MUT1': # logger.info("Pioneer: {0} zone unmuted".format(self._host)) # self._items['zonemute'](False, 'Pioneer', self._host) # AVR is muted elif 'MUT0' in data: logger.info("Pioneer: {0} muted".format(self._host)) self._items['mute'](True, 'Pioneer', self._host) # AVR is unmuted elif 'MUT1' in data: logger.info("Pioneer: {0} unmuted".format(self._host)) self._items['mute'](False, 'Pioneer', self._host) # Master volume elif 'VOL' in data: try: vol = data[4:] #vol = int(vol) logger.debug("Volume Data: "+str(vol)) if vol.isdigit(): logger.info("Pioneer: {0} is at volume {1}".format(self._host, vol)) self._items['volume'](vol, 'Pioneer', self._host) else: logger.debug("Pioneer: Unknown volume info received") except: logger.debug("Pioneer: No volume info received") # Zone volume #elif 'ZV' in data: # try: # vol = data[4:][:3] # if vol.isdigit(): # logger.info("Pioneer: {0} is at zonevolume {1}".format(self._host, vol)) # self._items['zonevolume'](vol, 'Pioneer', self._host) # else: # logger.debug("Pioneer: Unknown zonevolume info received-{0}".format(vol)) # except: # logger.debug("Pioneer: Unknown zonevolume info received") # TREBLE setting elif 'TR' in data: try: treble = data[3:] logger.debug("Treble Data: "+str(treble)) if treble.isdigit(): logger.info("Pioneer: {0} treble setting is {1}".format(self._host, treble)) self._items['treble'](treble, 'Pioneer', self._host) else: logger.debug("Pioneer: Unknown Treble info received") except: logger.debug("Pioneer: No Treble info received") # BASS setting elif 'BA' in data: try: bass = data[3:] logger.debug("Bass Data: "+str(bass)) if bass.isdigit(): logger.info("Pioneer: {0} bass setting is {1}".format(self._host, bass)) self._items['bass'](bass, 'Pioneer', self._host) else: logger.debug("Pioneer: Unknown Bass info received") except: logger.debug("Pioneer: No Bass info received") #FL display information elif 'FL' in data: try: content = data[5:][:28] logger.info("Pioneer: {} FL Display Data {}".format(self._host, content)) content = "".join(list(map(lambda i: chr(int(content[2 * i : ][ : 2], 0x10)), range(14)))).strip() logger.info("Pioneer: {} FL Display Output {}".format(self._host, content)) self._items['fldisplay'](content, 'Pioneer', self._host) except: logger.debug("Pioneer: No FL display line info received") # Information on title and artist now playing elif 'GEH0' in data: try: line = data[5:][:1] if line.isdigit(): line = int(line) if line == 1: content = data[10:-1] elif line == 4: content = data[10:-1] else: content = data[10:-1] if content: # Now playing if line == 1: logger.info("Pioneer: {} Now playing {}".format(self._host, content)) self._items['title'](content, 'Pioneer', self._host) # Internet radio Station name elif line == 4: logger.info("Pioneer: {} Internet radio station {}".format(self._host, content)) self._items['station'](content, 'Pioneer', self._host) else: logger.debug("Pioneer: Unknown HMG line info received") except: logger.debug("Pioneer: No HMG line info received") # Input source information elif 'FN' in data: try: source = data[3:][:2] logger.debug("Source Data: "+str(source)) if source.isdigit(): logger.info("Pioneer: {0} is at Input {1}".format(self._host, source)) self._items['source'](source, 'Pioneer', self._host) else: logger.debug("Pioneer: unknown source info received: "+str(source)) except: logger.debug("Pioneer: No source info received: "+str(source)) # Input zone source information #elif 'Z2F' in data: # source = data[4:] # logger.info("Pioneer: {0} zone source is {1}".format(self._host, source)) # self._items['zonesource'](zonesource, 'Pioneer', self._host) # Listening Mode Set elif 'SR' in data: try: mode = data[3:][:4] logger.debug("Listening Mode Set Data: "+str(mode)) if mode.isdigit(): logger.info("Pioneer: Master {0} is at listening mode set {1}".format(self._host, mode)) self._items['listeningmodeset'](mode, 'Pioneer', self._host) else: logger.debug("Pioneer: Unknown listening mode set info received") except: logger.debug("Pioneer: No listening mode set info received: "+str(mode)) # Listening Mode elif 'LM' in data: try: mode = data[3:][:4] logger.debug("Listening Mode Data: "+str(mode)) logger.info("Pioneer: Master {0} is at listening mode {1}".format(self._host, mode)) self._items['listeningmode'](mode, 'Pioneer', self._host) except: logger.debug("Pioneer: No listening mode info received: "+str(mode)) # Set plugin to alive def run(self): self.alive = True # Close connection to receiver and set alive to false def stop(self): self.alive = False self.close() # Parse items and bind commands to plugin def parse_item(self, item): if 'pioneer_send' in item.conf: cmd = item.conf['pioneer_send'] if (cmd is None): return None else: self._items[cmd] = item return self.update_item elif 'pioneer_listen' in item.conf: info = item.conf['pioneer_listen'] if (info is None): return None else: self._items[info] = item logger.debug("Pioneer: Listening to {} info".format(info)) return self.update_item else: return None # TODO: Logic not yet used def parse_logic(self, logic): pass # Receive commands, process them and forward them to receiver def update_item(self, item, caller=None, source=None, dest=None): if caller != 'Pioneer': if 'pioneer_send' in item.conf: command = item.conf['pioneer_send'] value = item() logger.info("Pioneer: {0} set {1} to {2} for {3}".format(caller, command, value, item.id())) if(command == 'power') and (isinstance(value, bool)): self._send('PO' if value else 'PF') #if(command == 'zonepower') and (isinstance(value, bool)): # self._send('APO' if value else 'APF') elif(command == 'mute') and (isinstance(value, bool)): self._send('MO' if value else 'MF') #elif(command == 'zonemute') and (isinstance(value, bool)): # self._send('Z2MO' if value else 'Z2MF') elif(command == 'volume') and (isinstance(value, int)): self._send('{0:0>3d}VL'.format(value)) #elif(command == 'zonevolume') and (isinstance(value, int)): # self._send('{0:0>2d}ZV'.format(value)) elif(command == 'hmg_next'): self._send('13NW') elif(command == 'volume+'): self._send('VU') elif(command == 'volume-'): self._send('VD') #elif(command == 'zonevolume+'): # self._send('ZU') #elif(command == 'zonevolume-'): # self._send('ZD') elif(command == 'hmg_pre'): self._send('12NW') elif(command == 'hmg_play'): self._send('10NW') elif(command == 'source'): self._send('{}FN'.format(value)) #elif(command == 'zonesource'): # self._send('{}ZS'.format(value)) elif(command == 'sourcecyclic'): self._send('FU') self._send('?F') elif(command == 'bass+'): self._send('BI') elif(command == 'bass-'): self._send('BD') elif(command == 'treble+'): self._send('TI') elif(command == 'treble-'): self._send('TD') elif(command == 'listeningmodeset'): #value="{0:04d}".format(value) self._send('{0}SR'.format(value)) elif(command == 'iRadioF'): self._send('{}NW'.format(value)) self._send('30NW') elif(command == 'RadioF'): self._send('{}PR'.format(value)) elif(command == 'RadioFcyclic'): self._send('TPI') else: logger.warning("Pioneer: Command {0} or value {1} invalid".format(command, value)) # Poll for status updates def _update_status(self): self._send(self._status_objects[self._status_objects_pointer]) self._status_objects_pointer += 1 if self._status_objects_pointer >= self._status_objects_count: self._status_objects_pointer = 0 self._status_cycle_counter += 1 if self._status_cycle_counter == 2: self._sh.scheduler.change('pioneer-status-update', active=False) self._status_cycle_counter = 0 # Poll for now playing updates def _update_now_playing(self): self._send('?GAH') # Send commands to receiver if connected def _send(self, cmd): if not self.connected: try: logger.debug("Pioneer: No mode info received: {0}".format(mode))() except: logger.debug("Pioneer: (Re)connect failed in send") logger.warning("Pioneer: No connection, can not send command: {0}".format(cmd)) self._cmd_lock.acquire() self.send(bytes(cmd + '\r', 'utf-8')) self._lastCommand = cmd self._sendTimeout.start() self._cmd_lock.release() return else: try: self._cmd_lock.acquire() logger.debug("Pioneer: Sende Anfrage {0}".format(cmd)) self.send(bytes(cmd + '\r', 'utf-8')) self._cmd_lock.release() except: return #!/usr/bin/env python
Viele Grüße
Kommentar