Skip to content

Instantly share code, notes, and snippets.

@henryjfry
Created August 22, 2025 10:07
Show Gist options
  • Save henryjfry/13bdce04a3dd969c4efa489d2b421a15 to your computer and use it in GitHub Desktop.
Save henryjfry/13bdce04a3dd969c4efa489d2b421a15 to your computer and use it in GitHub Desktop.
convert_lirc_to_irplus.py
import xml.etree.ElementTree as ET
def parse_lirc_file(file_path):
with open(file_path, 'r') as f:
lines = f.readlines()
timings = {}
codes = {}
pre_data = ''
pre_data_bits = 0
gap = ''
header = ''
ptrail = ''
in_codes = False
for line in lines:
line = line.strip()
if line.startswith('header'):
header = line.split()[1:]
elif line.startswith('one'):
timings['one'] = line.split()[1:]
elif line.startswith('zero'):
timings['zero'] = line.split()[1:]
elif line.startswith('ptrail'):
ptrail = line.split()[1]
elif line.startswith('pre_data_bits'):
pre_data_bits = int(line.split()[1])
elif line.startswith('pre_data'):
pre_data = line.split()[1]
elif line.startswith('gap'):
gap = line.split()[1]
elif line == 'begin codes':
in_codes = True
elif line == 'end codes':
in_codes = False
elif in_codes and line:
parts = line.split()
codes[parts[0]] = parts[1]
return header, timings, ptrail, pre_data, pre_data_bits, gap, codes
def hex_to_bin(hex_str, bits):
return bin(int(hex_str, 16))[2:].zfill(bits)
def generate_pulse_sequence(binary_str, timings, header, ptrail, gap):
sequence = []
sequence.extend(header)
for bit in binary_str:
if bit == '1':
sequence.extend(timings['one'])
else:
sequence.extend(timings['zero'])
sequence.append(ptrail)
sequence.append(gap)
return ' '.join(sequence)
def convert_lirc_to_irplus(input_path, output_path, manufacturer, model):
header, timings, ptrail, pre_data, pre_data_bits, gap, codes = parse_lirc_file(input_path)
root = ET.Element('irplus')
device = ET.SubElement(root, 'device', {
'manufacturer': manufacturer,
'model': model,
'columns': '4',
'format': 'WINLIRC_RAW'
})
for label, hex_code in codes.items():
full_hex = pre_data + hex_code[2:]
binary_str = hex_to_bin(full_hex, pre_data_bits + 16)
pulse_sequence = generate_pulse_sequence(binary_str, timings, header, ptrail, gap)
ET.SubElement(device, 'button', {
'label': label,
'labelSize': '25.0',
'span': '4'
}).text = pulse_sequence
tree = ET.ElementTree(root)
ET.indent(tree, ' ')
tree.write(output_path, encoding='utf-8', xml_declaration=True)
# Example usage
convert_lirc_to_irplus(
input_path=r"C:\TEMP\technics_sl-pg570a.lircd.conf",
output_path=r"C:\TEMP\TECHNICS__SL-PG570A.IRPLUS",
manufacturer='TEST',
model='SL-PG570A'
)
#python "C:\TEMP\convert_lirc_to_irplus.py"
<?xml version='1.0' encoding='utf-8'?>
<irplus>
<device manufacturer="TECHNICS" model="SL-PG570A" columns="4" format="WINLIRC_RAW">
<button label="KEY_POWER" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 1197 555 1197 555 1197 555 314 555 314 555 1197 555 1197 555 1197 555 314 555 1197 555 314 555 314 555 1197 536 74550</button>
<button label="KEY_VOLUMEUP" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 1197 536 74550</button>
<button label="KEY_VOLUMEDOWN" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 1197 555 1197 555 314 555 1197 555 314 555 314 555 314 555 1197 536 74550</button>
<button label="KEY_EJECTCD" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 536 74550</button>
<button label="KEY_1" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 1197 555 1197 555 314 555 1197 536 74550</button>
<button label="KEY_2" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 1197 555 1197 555 314 555 1197 555 1197 555 1197 555 314 555 1197 536 74550</button>
<button label="KEY_3" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 1197 555 1197 555 314 555 314 555 1197 555 314 555 314 555 314 555 1197 555 314 555 314 555 1197 555 1197 555 1197 555 314 555 1197 536 74550</button>
<button label="KEY_4" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 1197 555 1197 555 1197 555 1197 555 1197 555 314 555 1197 536 74550</button>
<button label="KEY_5" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 1197 555 1197 555 1197 555 1197 555 1197 555 1197 555 314 555 1197 536 74550</button>
<button label="KEY_6" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 1197 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 1197 555 1197 555 1197 555 1197 555 314 555 1197 536 74550</button>
<button label="KEY_7" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 1197 555 1197 555 1197 555 314 555 1197 555 314 555 314 555 314 555 1197 555 314 555 1197 555 1197 555 1197 555 1197 555 314 555 1197 536 74550</button>
<button label="KEY_8" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 1197 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 1197 555 1197 555 314 555 1197 536 74550</button>
<button label="KEY_9" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 1197 555 1197 555 314 555 314 555 314 555 1197 555 1197 555 314 555 314 555 1197 555 1197 555 314 555 1197 536 74550</button>
<button label="KEY_0" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 1197 555 1197 555 314 555 1197 555 314 555 314 536 74550</button>
<button label="KEY_CLEAR" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 536 74550</button>
<button label="KEY_AGAIN" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 1197 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 536 74550</button>
<button label="time_mode" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 1197 555 1197 555 1197 555 1197 555 1197 555 1197 555 1197 536 74550</button>
<button label="a-b_repeat" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 1197 555 314 555 314 555 1197 555 314 555 314 555 314 555 1197 555 1197 555 1197 536 74550</button>
<button label="KEY_MEDIA_REPEAT" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 1197 555 1197 555 1197 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 1197 555 314 555 1197 555 1197 555 1197 536 74550</button>
<button label="random" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 1197 555 314 555 314 555 1197 555 314 555 1197 555 1197 555 1197 555 314 555 314 555 1197 555 1197 555 1197 536 74550</button>
<button label="auto_cue" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 1197 555 1197 555 314 555 1197 555 314 555 314 555 314 555 1197 555 1197 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 536 74550</button>
<button label="tape_length" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 1197 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 536 74550</button>
<button label="side_a-b" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 1197 555 314 555 314 555 314 555 314 555 314 536 74550</button>
<button label="time_fade" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 314 555 1197 555 314 555 1197 555 1197 555 1197 555 1197 555 1197 555 314 555 314 536 74550</button>
<button label="peak_search" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 1197 555 1197 555 1197 555 1197 555 314 555 314 555 314 555 1197 555 1197 555 314 555 1197 555 314 555 314 555 1197 555 314 555 314 536 74550</button>
<button label="search_down" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 536 74550</button>
<button label="search_up" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 1197 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 536 74550</button>
<button label="skip_down" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 1197 555 314 555 314 555 1197 555 314 555 1197 555 1197 555 314 555 314 555 314 555 1197 555 1197 555 1197 536 74550</button>
<button label="skip_up" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 1197 555 1197 536 74550</button>
<button label="KEY_STOP" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 536 74550</button>
<button label="KEY_PAUSE" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 1197 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 1197 555 314 555 1197 555 314 555 1197 536 74550</button>
<button label="KEY_PLAY" labelSize="25.0" span="4">3678 1563 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 314 555 1197 555 314 555 1197 536 74550</button>
</device>
</irplus>
# LIRC config file for Technics SL-PG570A CD Player
begin remote
name technics_sl-pg570a
bits 16
flags SPACE_ENC
eps 30
aeps 100
header 3678 1563
one 555 1197
zero 555 314
ptrail 536
pre_data_bits 32
pre_data 0x40040550
gap 74550
toggle_bit 0
begin codes
KEY_POWER 0xBCE9
KEY_VOLUMEUP 0x0451
KEY_VOLUMEDOWN 0x84D1
KEY_EJECTCD 0x80D5
KEY_1 0x085D
KEY_2 0x88DD
KEY_3 0xC89D
KEY_4 0x287D
KEY_5 0xA8FD
KEY_6 0x683D
KEY_7 0xE8BD
KEY_8 0x184D
KEY_9 0x98CD
KEY_0 0x2174
KEY_CLEAR 0x0154
KEY_AGAIN 0x81D4
time_mode 0xAAFF
a-b_repeat 0x1247
KEY_MEDIA_REPEAT 0xE2B7
random 0xB2E7
auto_cue 0xD184
tape_length 0xD580
side_a-b 0x3560
time_fade 0x297C
peak_search 0xF1A4
search_down 0x4015
search_up 0xC095
skip_down 0x92C7
skip_up 0x5207
KEY_STOP 0x0055
KEY_PAUSE 0x6035
KEY_PLAY 0x5005
end codes
end remote
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment