Sure, what would you like to know? In the mqtt2serial component here’s the mapping I make for RNET commands (promise not to laugh):
def get_action_message(self, action, ccid, zzid, pram = 0):
if action == 'PowerOn':
command = [0xF0, ccid, zzid, 0x7F, 0x00, 0x00, 0x70, 0x05, 0x02, 0x02, 0x00, 0x00, 0xF1, 0x23, 0x00, 0x01, 0x00, zzid, 0x00, 0x01, 0x00, 0x00]
elif action == 'PowerOff':
command = [0xF0, ccid, zzid, 0x7F, 0x00, 0x00, 0x70, 0x05, 0x02, 0x02, 0x00, 0x00, 0xF1, 0x23, 0x00, 0x00, 0x00, zzid, 0x00, 0x01, 0x00, 0x00]
elif action == 'GetOnOff':
command = [0xF0, ccid, zzid, 0x7F, 0x00, 0x00, 0x70, 0x01, 0x04, 0x02, 0x00, zzid, 0x06, 0x00, 0x00, 0x00, 0x00]
elif action == 'SystemOn':
command = [0xF0, 0x7E, 0x00, 0x7F, 0x00, 0x00, 0x70, 0x05, 0x02, 0x02, 0x00, 0x00, 0xF1, 0x22, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'SystemOff':
command = [0xF0, 0x7E, 0x00, 0x7F, 0x00, 0x00, 0x70, 0x05, 0x02, 0x02, 0x00, 0x00, 0xF1, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'SetSource':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x02, 0x00, 0x00, 0x00, 0xF1, 0x3E, 0x00, 0x00, 0x00, pram, 0x00, 0x01, 0x00, 0x00]
elif action == 'SetSource0':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x02, 0x00, 0x00, 0x00, 0xF1, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'SetSource1':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x02, 0x00, 0x00, 0x00, 0xF1, 0x3E, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00]
elif action == 'SetSource2':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x02, 0x00, 0x00, 0x00, 0xF1, 0x3E, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00]
elif action == 'SetSource3':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x02, 0x00, 0x00, 0x00, 0xF1, 0x3E, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00]
elif action == 'SetSource4':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x02, 0x00, 0x00, 0x00, 0xF1, 0x3E, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00]
elif action == 'SetSource5':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x02, 0x00, 0x00, 0x00, 0xF1, 0x3E, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00]
elif action == 'SetSource6':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x02, 0x00, 0x00, 0x00, 0xF1, 0x3E, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00]
elif action == 'GetSource':
command = [0xF0, ccid, 0x00, 0x7F, 0x00, 0x00, 0x70, 0x01, 0x04, 0x02, 0x00, zzid, 0x02, 0x00, 0x00, 0x00, 0x00]
elif action == 'SetVolume':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x02, 0x02, 0x00, 0x00, 0xF1, 0x21, 0x00, pram, 0x00, zzid, 0x00, 0x01, 0x00, 0x00]
elif action == 'VolumeUp':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x02, 0x02, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'VolumeDown':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x02, 0x02, 0x00, 0x00, 0xF1, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'GetVolume':
command = [0xF0, ccid, 0x00, 0x7F, 0x00, 0x00, 0x70, 0x01, 0x04, 0x02, 0x00, zzid, 0x01, 0x00, 0x00, 0x00, 0x00]
elif action == 'BassUp':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x05, 0x02, 0x00, zzid, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'BassDown':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x05, 0x02, 0x00, zzid, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'SetBass':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x00, 0x05, 0x02, 0x00, zzid, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, pram, 0x00, 0x00]
elif action == 'GetBass':
command = [0xF0, ccid, 0x00, 0x7F, 0x00, 0x00, 0x70, 0x01, 0x05, 0x02, 0x00, zzid, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
elif action == 'TrebleUp':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x05, 0x02, 0x00, zzid, 0x00, 0x01, 0x00, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'TrebleDown':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x05, 0x02, 0x00, zzid, 0x00, 0x01, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'SetTreble':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x00, 0x05, 0x02, 0x00, zzid, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, pram, 0x00, 0x00]
elif action == 'GetTreble':
command = [0xF0, ccid, 0x00, 0x7F, 0x00, 0x00, 0x70, 0x01, 0x05, 0x02, 0x00, zzid, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00]
elif action == 'LoudnessOn':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x00, 0x05, 0x02, 0x00, zzid, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00]
elif action == 'LoudnessOff':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x00, 0x05, 0x02, 0x00, zzid, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00]
elif action == 'LoudnessOnOff':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x00, 0x05, 0x02, 0x00, zzid, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00]
elif action == 'GetLoudness':
command = [0xF0, ccid, 0x00, 0x7F, 0x00, 0x00, 0x70, 0x01, 0x05, 0x02, 0x00, zzid, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00]
elif action == 'SetBalanceLeft':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x00, 0x05, 0x02, 0x00, zzid, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00]
elif action == 'SetBalanceCenter':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x00, 0x05, 0x02, 0x00, zzid, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0A, 0x00, 0x00]
elif action == 'SetBalanceRight':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x00, 0x05, 0x02, 0x00, zzid, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00]
elif action == 'BalanceLeft':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x05, 0x02, 0x00, zzid, 0x00, 0x03, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'BalanceRight':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x05, 0x02, 0x00, zzid, 0x00, 0x03, 0x00, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'GetBalance':
command = [0xF0, ccid, 0x00, 0x7F, 0x00, 0x00, 0x70, 0x01, 0x05, 0x02, 0x00, zzid, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00]
elif action == 'IncreaseOnVolume':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x05, 0x02, 0x00, zzid, 0x00, 0x04, 0x00, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'DecreaseOnVolume':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x05, 0x02, 0x00, zzid, 0x00, 0x04, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'SetOnVolume':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x00, 0x05, 0x02, 0x00, zzid, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, pram, 0x00, 0x00]
elif action == 'GetOnVolume':
command = [0xF0, ccid, 0x00, 0x7F, 0x00, 0x00, 0x70, 0x01, 0x05, 0x02, 0x00, zzid, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00]
elif action == 'BackgroundOnOff':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x05, 0x02, 0x00, zzid, 0x00, 0x05, 0x00, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'BackgroundGreen':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x00, 0x05, 0x02, 0x00, zzid, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00]
elif action == 'BackgroundAmber':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x00, 0x05, 0x02, 0x00, zzid, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00]
elif action == 'BackgroundOff':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x00, 0x05, 0x02, 0x00, zzid, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00]
elif action == 'GetBackgroundColor':
command = [0xF0, ccid, 0x00, 0x7F, 0x00, 0x00, 0x70, 0x01, 0x05, 0x02, 0x00, zzid, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00]
elif action == 'DNDOnOff':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x00, 0x05, 0x02, 0x00, zzid, 0x00, 0x06, 0x00, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'DNDOn':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x00, 0x05, 0x02, 0x00, zzid, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00]
elif action == 'DNDOff':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x00, 0x05, 0x02, 0x00, zzid, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00]
elif action == 'GetDND':
command = [0xF0, ccid, 0x00, 0x7F, 0x00, 0x00, 0x70, 0x01, 0x05, 0x02, 0x00, zzid, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00]
elif action == 'PartyModeOnOff':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x00, 0x05, 0x02, 0x00, zzid, 0x00, 0x07, 0x00, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'PartyModeMaster':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x00, 0x05, 0x02, 0x00, zzid, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00]
elif action == 'PartyModeOn':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x00, 0x05, 0x02, 0x00, zzid, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00]
elif action == 'PartyModeOff':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x00, 0x05, 0x02, 0x00, zzid, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00]
elif action == 'GetPartyMode':
command = [0xF0, ccid, 0x00, 0x7F, 0x00, 0x00, 0x70, 0x01, 0x05, 0x02, 0x00, zzid, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00]
elif action == 'GetZoneInfo':
command = [0xF0, ccid, 0x00, 0x7F, 0x00, 0x00, 0x70, 0x01, 0x04, 0x02, 0x00, zzid, 0x07, 0x00, 0x00, 0x00, 0x00]
elif action == 'KeyPrevious':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x02, 0x02, 0x00, 0x00, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'KeyNext':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x02, 0x02, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'KeyPlus':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x02, 0x02, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'KeyMinus':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x02, 0x02, 0x00, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'KeyPlay':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x02, 0x02, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'KeyStop':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x02, 0x02, 0x00, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'KeyPause':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x02, 0x02, 0x00, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'KeyF1':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x02, 0x02, 0x00, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'KeyF2':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x02, 0x02, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00]
elif action == 'SearchForward':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x02, 0x02, 0x00, 0x00, 0xF1, 0x40, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x01, 0x00, 0x00]
elif action == 'SearchBack':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x02, 0x02, 0x00, 0x00, 0xF1, 0x40, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x01, 0x00, 0x00]
elif action == 'DisplayMessage':
command = [0xF0, ccid, zzid, 0x7F, ccid, zzid, 0x70, 0x05, 0x02, 0x02, 0x00, 0x00, 0xF1, 0x23, 0x00, 0x00, 0x00, zzid, 0x00, 0x01, 0x00, 0x00]
else:
logger.debug('No such action')
return
total = len(command) - 2
for c in command:
total += c
command[-2] = total & 0x7F
command[-1] = 0xF7
message = bytes([command[0]])
for b in command[1:]:
message += bytes([b])
return message
These are the messages I intercept. It’s much harder to decode the keypad and system messages so this is even more crazy:
while (self.mqtt_q.empty() == False) and (self.connected_rc == 0):
message = mqtt_q.get()
# only worried about certain messages
if len(message) == 38 and message[24:36] == bytearray(b'\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a\x5a'):
# treat this is a power off indicator
# update zone data
controller_id = message[1]
zone_id = message[2]
self.zone[controller_id][zone_id].state = 0
# publish zone
self.publish('/rnet/zone/{0}/{1}'.format(controller_id, zone_id), self.zone[controller_id][zone_id].zone_json, False)
elif len(message) == 15 and message[7] == 6:
if message[12] == 5:
# this is a set source with power on message
# this is also generated when returning to the main screen from making
# various attribute changes
# Determine if this change is to do with Power/ Source or something else
controller_id = message[1]
zone_id = message[2]
if self.zone[controller_id][zone_id].state != 1 or self.zone[controller_id][zone_id].source != message[9]:
# update zone data
self.zone[controller_id][zone_id].state = 1
self.zone[controller_id][zone_id].source = message[9]
# publish zone
self.publish('/rnet/zone/{0}/{1}'.format(controller_id, zone_id), self.zone[controller_id][zone_id].zone_json, False)
else:
# something else has changed, possibly
# so make a GetZoneInfo call to find out
request = self.get_action_message("GetZoneInfo", z.controller_id, z.zone_id)
self.serial_q.put(request)
# when the control pad returns from making Bass, Treble, Loudness or Balance adjustments
# it sets the zone so no need to pick up specific changes.
elif message[12] == 16:
# this is a volume changed message
# it also occurs when the zone is powered on so will generate
# another mqqt send to Home Assistant
controller_id = message[1]
zone_id = message[2]
self.zone[controller_id][zone_id].volume = message[8]
# publish zone
self.publish('/rnet/zone/{0}/{1}'.format(controller_id, zone_id), self.zone[controller_id][zone_id].zone_json, False)
#if len(message) == 11 and message[
elif len(message) == 34 and message[13] == 7:
# get GetZoneInfo response
# update zone data
controller_id = message[4]
zone_id = message[12]
self.zone[controller_id][zone_id].state = message[20]
self.zone[controller_id][zone_id].source = message[21]
self.zone[controller_id][zone_id].volume = message[22]
self.zone[controller_id][zone_id].bass = message[23]
self.zone[controller_id][zone_id].treble = message[24]
self.zone[controller_id][zone_id].loudness = message[25]
self.zone[controller_id][zone_id].balance = message[26]
self.zone[controller_id][zone_id].partymode = message[29]
self.zone[controller_id][zone_id].donotdisturb = message[30]
# publish zone
self.publish('/rnet/zone/{0}/{1}'.format(controller_id, zone_id), self.zone[controller_id][zone_id].zone_json, False)
if self.mqqt_request_getzoneinfo:
# publish the full response
topic = '/rnet/response'
payload = '{'
payload += '"rnet_controller" : {0}'.format(message[4])
payload += ', "rnet_zone" : {0}'.format(message[12])
payload += ', "ha_zone" : {0}'.format((message[4] * 6) + message[12] + 1)
payload += ', "state" : {0}'.format(message[20])
payload += ', "source" : "{0}"'.format(SOURCE_LIST[message[21]])
payload += ', "volume" : {0}'.format(message[22] * 2)
payload += ', "bass" : {0}'.format(message[23] - 10)
payload += ', "treble" : {0}'.format(message[24] - 10)
payload += ', "loudness" : {0}'.format(message[25])
payload += ', "balance" : {0}'.format(message[26] - 10)
payload += ', "systemonstate" : {0}'.format(message[27])
payload += ', "sharedsource" : {0}'.format(message[28])
payload += ', "partymode" : {0}'.format(message[29])
payload += ', "donotdisturb" : {0}'.format(message[30])
payload += '}'
self.publish(topic, payload, False)
elif message[0:6] == bytearray(b'\xf0\x7d\x00\x79\x00\x7d'):
# this is a source message
# determnine the source
source_id = message[6]
# determine the text
# text starts from character 23 and continues ignoring the last three characters
display_text = message[23:len(message)-3]
# update the source display text
self.source[source_id].display_text = display_text.decode("utf-8")
# publish a source message
self.publish('/rnet/source/{0}'.format(source_id), self.source[source_id].source_json, False)
elif len(message) == 23 and message[5:12] == bytearray(b'\x00\x7f\x00\x00\x04\x02\x00'):
if message[13] == 6:
# this is the GetState respoonse
# update zone data
controller_id = message[1]
zone_id = message[2]
self.zone[controller_id][zone_id].state = message[20]
# publish zone
self.publish('/rnet/zone/{0}/{1}'.format(controller_id, zone_id), self.zone[controller_id][zone_id].zone_json, False)
# publish the raw result
topic = '/rnet/response'
payload = '{'
payload += '"rnet_controller" : {0}, '.format(message[4])
payload += '"rnet_zone" : {0}, '.format(message[12])
payload += '"ha_zone" : {0}, '.format((message[4] * 6) + message[12] + 1)
payload += '"state" : {0}'.format(message[20])
payload += '}'
self.publish(topic, payload, False)
if message[13] == 2:
# this is the GetSource response
# update zone data
controller_id = message[1]
zone_id = message[2]
self.zone[controller_id][zone_id].source = message[20]
# publish zone
self.publish('/rnet/zone/{0}/{1}'.format(controller_id, zone_id), self.zone[controller_id][zone_id].zone_json, False)
# publish the raw result
topic = '/rnet/response'
payload = '{'
payload += '"rnet_controller" : {0}'.format(message[4])
payload += ', "rnet_zone" : {0}'.format(message[12])
payload += ', "ha_zone" : {0}'.format((message[4] * 6) + message[12] + 1)
payload += ', "source" : "{0}"'.format(SOURCE_LIST[message[20]])
payload += '}'
self.publish(topic, payload, False)
if message[13] == 1:
# this is the GetVolume response
# update zone data
controller_id = message[1]
zone_id = message[2]
self.zone[controller_id][zone_id].volume = message[20]
# publish zone
self.publish('/rnet/zone/{0}/{1}'.format(controller_id, zone_id), self.zone[controller_id][zone_id].zone_json, False)
# publish the raw result
topic = '/rnet/response'
payload = '{'
payload += '"rnet_controller" : {0}'.format(message[4])
payload += ', "rnet_zone" : {0}'.format(message[12])
payload += ', "ha_zone" : {0}'.format((message[4] * 6) + message[12] + 1)
payload += ', "volume" : {0}'.format(message[20] * 2)
payload += '}'
self.publish(topic, payload, False)
elif len(message) == 24 and message[5:12] == bytearray(b'\x00\x7f\x00\x00\x04\x02\x00'):
# publish the raw result
topic = '/rnet/response'
payload = '{'
payload += '"rnet_controller" : {0}'.format(message[4])
payload += ', "rnet_zone" : {0}'.format(message[12])
payload += ', "ha_zone" : {0}'.format((message[4] * 6) + message[12] + 1)
payload += ', "turnonvolume" : {0}'.format(message[21] * 2)
payload += '}'
self.publish(topic, payload, False)
elif len(message) == 24 and message[5:12] == bytearray(b'\x00\x7f\x00\x00\x05\x02\x00'):
if message[14] == 0:
# this is the GetBass respoonse
# update zone data
controller_id = message[1]
zone_id = message[2]
self.zone[controller_id][zone_id].bass = message[21]
# publish zone
self.publish('/rnet/zone/{0}/{1}'.format(controller_id, zone_id), self.zone[controller_id][zone_id].zone_json, False)
# publish the raw result
topic = '/rnet/response'
payload = '{'
payload += '"rnet_controller" : {0}'.format(message[4])
payload += ', "rnet_zone" : {0}'.format(message[12])
payload += ', "ha_zone" : {0}'.format((message[4] * 6) + message[12] + 1)
payload += ', "bass" : {0}'.format(message[21] - 10)
payload += '}'
self.publish(topic, payload, False)
if message[14] == 1:
# this is the GetTreble respoonse
# update zone data
controller_id = message[1]
zone_id = message[2]
self.zone[controller_id][zone_id].treble = message[21]
# publish zone
self.publish('/rnet/zone/{0}/{1}'.format(controller_id, zone_id), self.zone[controller_id][zone_id].zone_json, False)
# publish the raw result
topic = '/rnet/response'
payload = '{'
payload += '"rnet_controller" : {0}'.format(message[4])
payload += ', "rnet_zone" : {0}'.format(message[12])
payload += ', "ha_zone" : {0}'.format((message[4] * 6) + message[12] + 1)
payload += ', "treble" : {0}'.format(message[21] - 10)
payload += '}'
self.publish(topic, payload, False)
if message[14] == 2:
# this is the GetLoudness respoonse
topic = '/rnet/response'
payload = '{'
payload += '"rnet_controller" : {0}'.format(message[4])
payload += ', "rnet_zone" : {0}'.format(message[12])
payload += ', "ha_zone" : {0}'.format((message[4] * 6) + message[12] + 1)
payload += ', "loudness" : {0}'.format(message[21])
payload += '}'
self.publish(topic, payload, False)
if message[14] == 3:
# this is the GetBalance respoonse
# update zone data
controller_id = message[1]
zone_id = message[2]
self.zone[controller_id][zone_id].balance = message[21]
# publish zone
self.publish('/rnet/zone/{0}/{1}'.format(controller_id, zone_id), self.zone[controller_id][zone_id].zone_json, False)
# publish the raw result
topic = '/rnet/response'
payload = '{'
payload += '"rnet_controller" : {0}'.format(message[4])
payload += ', "rnet_zone" : {0}'.format(message[12])
payload += ', "ha_zone" : {0}'.format((message[4] * 6) + message[12] + 1)
payload += ', "balance" : {0}'.format(message[21] - 10)
payload += '}'
self.publish(topic, payload, False)
if message[14] == 5:
# this is the GetBackgroundColour respoonse
topic = '/rnet/response'
payload = '{'
payload += '"rnet_controller" : {0}'.format(message[4])
payload += ', "rnet_zone" : {0}'.format(message[12])
payload += ', "ha_zone" : {0}'.format((message[4] * 6) + message[12] + 1)
resp = ["OFF", "AMBER", "GREEN"]
payload += ', "backgroundcolour" : "{0}"'.format(resp[message[21]])
payload += '}'
self.publish(topic, payload, False)
if message[14] == 6:
# this is the GetDoNotDisturbrespoonse
# update zone data
controller_id = message[1]
zone_id = message[2]
self.zone[controller_id][zone_id].donotdisturb = message[21]
# publish zone
self.publish('/rnet/zone/{0}/{1}'.format(controller_id, zone_id), self.zone[controller_id][zone_id].zone_json, False)
# publish the raw result
topic = '/rnet/response'
payload = '{'
payload += '"rnet_controller" : {0}'.format(message[4])
payload += ', "rnet_zone" : {0}'.format(message[12])
payload += ', "ha_zone" : {0}'.format((message[4] * 6) + message[12] + 1)
resp = ["OFF", "ON"]
payload += ', "donotdisturb" : "{0}"'.format(resp[message[21]])
payload += '}'
self.publish(topic, payload, False)
if message[14] == 7:
# this is the GetPartyMode respoonse
# update zone data
controller_id = message[1]
zone_id = message[2]
self.zone[controller_id][zone_id].partymode = message[21]
# publish zone
self.publish('/rnet/zone/{0}/{1}'.format(controller_id, zone_id), self.zone[controller_id][zone_id].zone_json, False)
# publish the raw result
topic = '/rnet/response'
payload = '{'
payload += '"rnet_controller" : {0}'.format(message[4])
payload += ', "rnet_zone" : {0}'.format(message[12])
payload += ', "ha_zone" : {0}'.format((message[4] * 6) + message[12] + 1)
resp = ["OFF", "ON", "MASTER"]
payload += ', "partymode" : {0}'.format(message[resp[21]])
payload += '}'
self.publish(topic, payload, False)
else:
# dump message it's not needed
continue
And I have a loop that in essence goes:
# Write to serial port
# RNET IN
# These are messages received from MQQT
serialclient.serial_write()
# Rceive from MQTT
# MQTT IN
# start the MQTT Loop this will check for messages and add them to the serial_q
#logger.debug('MQTT loop start')
mqttclient.client.loop(0.05)
#logger.debug('MQTT loop end')
# Send to MQTT
# MQTT OUT
# the filtered commands to go to Home Assistant stored in mqtt queue
mqttclient.mqtt_send()
# Read serial port
# RNET OUT
# these commands will be filtered, the ones to go to Home Assistant added to mqtt queue
#logger.debug('RNET READ loop start')
serialclient.serial_read()
#logger.debug('RNET READ loop end')