I think i got my device sorted out, will post here in case anyone else has a stubborn device and they want to give it a shot.
Overall, gotta love the RM mini (cheap little device that does the job)
So, for some reason, I had one device where the commands learnt by the rm mini would not actually work when transmitted. Narrowed it down to a stubborn device that needs to see the ir code in a specific way.
anyhow, found a few posts on the internet related to this and I hope it's ok to post here with reference.
1st off, you will need to get a hold of scrutinizer, used for analyzing IR signals, which can be found here:
http://www.harctoolbox.org/downloads/#Current+softwareYou will then need to find the specific device protocol information (similar to what's noted in the post below)
http://www.remotecentral.com/cgi-bin/mboard/rc-custom/thread.cgi?30540This is for my application (Telus Optik PVR - which uses a generic Cisco format), however, this also appears to work for any device as long as you have the required details to convert to pronto hex (using scrutinizer -
http://www.harctoolbox.org)
Here are function numbers for a CIS 430. These match the two Pronto Hex signals given here for the CIS330. The protocol is Nokia32 device 36.128. Use IrMaster to convert these into Pronto Hex or some other formats. For example, to generate the signal for Power, enter 36 into D, 128 into S, 12 into F, and set T to either 0 or 1. Type X=38 into additional parameters.
Power Nokia32 36.128 function 12
0000 0073 0000 0012 000F 000A 0006 000A 0006 0016 0006 0010 0006 000A 0006 0016 0006 000A 0006 000A 0006 000A 0006 000A 0006 0016 0006 0010 0006 0016 0006 000A 0006 000A 0006 001C 0006 000A 0006 0CA5
Function
Number
0 = 0
1= 1
2 = 2
3 = 3
4=4
5=5
6=6
7=7
8=8
9=9
vol up=16
vol down=17
channel up=32
channel down=33
power=12
last (prev ch)=41
menu=84
program guide=204
up arrow=88
down arrow=89
left arrow=90
right arrow=91
select=92
play=44
pause=48
rewind=41
fast fwd=40
stop=49
record=55
exit=85
info=15
clear=158
replay=77
advance=156
interact=218
jump=10
livetv=242
multiscreen=59
phone=249
recording=241
search=64
tvvideo=232
a=56
b=57
c=134
once you have that, you can generate the Pronto Hex for each remote function you need in the next step.
I then managed to find a py script online that converts the Pronto Hex generated above. Within indigo I created an action group with an embedded py script to execute the code and do the conversion for me - modified to output the result to the indigo server log.
- Code: Select all
#with help from https://repl.it/repls/StupidBiodegradableNanotechnology
import binascii
import struct
ProntoCodes = [
# menu - add your code from iscrutinize here
# "0000 0047 0000 001A 00D5 00D5 001B 0035 001B 006B 001B 0035 001B 0035 001B 0035 #001B 0035 001B 0035 001B 0035 001B 006B 001B 0035 001B 0035 001B 0035 001B #006B 001B #0035 001B 006B 001B 006B 001B 006B 001B 006B 001B 006B 001B 006B 001B 0035 001B 006B #001B 006B 001B 006B 001B 01AB",
#Power Off - add your code from iscrutinize here
# "0000 006b 0022 0002 015b 00b1 0016 0016 0015 0019 0013 0018 0014 0017 0017 0016 #0015 0017 0014 0043 0014 0017 0017 0040 0016 0040 0014 0044 0014 0044 0012 #0044 0015 #0043 0014 0018 0014 0043 0014 0043 0013 0043 0014 0043 0016 0041 0014 0043 0014 0043 #0012 0044 0014 001a 0012 0018 0014 0019 0016 0016 0014 0018 #0014 0018 0014 001a 0012 #0018 0014 0043 0016 0619 015b 0059 0014 0e93",
#codes to convert - replace with your list pronto hex codes from iscrutinizer ("code","code",etc)
"0000 0073 0000 0012 000F 000A 0006 000A 0006 0016 0006 0010 0006 000A 0006 0016 0006 000A 0006 000A 0006 000A 0006 0016 0006 0016 0006 0010 0006 0016 0006 000A 0006 0016 0006 0016 0006 001C 0006 0C7F",0000 0073 0000 0012 000F 000A 0006 000A 0006 0016 0006 0010 0006 000A 0006 0016 0006 000A 0006 000A 0006 000A 0006 0016 0006 0016 0006 0010 0006 0016 0006 000A 0006 0016 0006 0016 0006 001C 0006 0C7F",0000 0073 0000 0012 000F 000A 0006 000A 0006 0016 0006 0010 0006 000A 0006 0016 0006 000A 0006 000A 0006 000A 0006 0016 0006 0016 0006 0010 0006 0016 0006 000A 0006 0016 0006 0016 0006 001C 0006 0C7F",0000 0073 0000 0012 000F 000A 0006 000A 0006 0016 0006 0010 0006 000A 0006 0016 0006 000A 0006 000A 0006 000A 0006 0016 0006 0016 0006 0010 0006 0016 0006 000A 0006 0016 0006 0016 0006 001C 0006 0C7F",
]
def pronto2lirc(pronto):
codes = [long(binascii.hexlify(pronto[i:i+2]), 16) for i in xrange(0, len(pronto), 2)]
if codes[0]:
raise ValueError('Pronto code should start with 0000')
if len(codes) != 4 + 2 * (codes[2] + codes[3]):
raise ValueError('Number of pulse widths does not match the preamble')
frequency = 1 / (codes[1] * 0.241246)
return [int(round(code / frequency)) for code in codes[4:]]
def lirc2broadlink(pulses):
array = bytearray()
for pulse in pulses:
pulse = pulse * 269 / 8192 # 32.84ms units
if pulse < 256:
array += bytearray(struct.pack('>B', pulse)) # big endian (1-byte)
else:
array += bytearray([0x00]) # indicate next number is 2-bytes
array += bytearray(struct.pack('>H', pulse)) # big endian (2-bytes)
packet = bytearray([0x26, 0x00]) # 0x26 = IR, 0x00 = no repeats
packet += bytearray(struct.pack('<H', len(array))) # little endian byte count
packet += array
packet += bytearray([0x0d, 0x05]) # IR terminator
# Add 0s to make ultimate packet size a multiple of 16 for 128-bit AES encryption.
remainder = (len(packet) + 4) % 16 # rm.send_data() adds 4-byte header (02 00 00 00)
if remainder:
packet += bytearray(16 - remainder)
return packet
for ProntoCode in ProntoCodes:
pcode = ProntoCode.replace(' ',"")
pronto = bytearray.fromhex(pcode)
pulses = pronto2lirc(pronto)
packet = lirc2broadlink(pulses)
# comment out print as not needed by indigo (use for py shell)
# print
# print binascii.hexlify(packet)
# added for indigo log display
broadlinkCode=binascii.hexlify(packet)
indigo.server.log(broadlinkCode)
Once you have the output, open your broadlink device, enter a "new command name", copy the specific output line to the "raw command", "add command" and you should be good to go:)
This may seem like a lot of work, but it drives me nutz when I know there is the possibility to make something work. There may be better ways to do this, but this is what worked for me.
Why did I go through all this you ask? Basically wanted control of my TV/PVR via HomeKit and didn't want to spend a lot of money gaining control of my existing equipment (TV/PVR).
I can now say... "Hey Siri... turn on the Seahawks game." This will turn off all unneeded lights in my house, turn specific lights on in the room and change to Seahawks Colors, and turn the TV/PVR on and to the specific channel that the game is on.