Skip to content

Instantly share code, notes, and snippets.

@svyatogor
Last active April 26, 2025 14:03
Show Gist options
  • Save svyatogor/7839d00303998a9fa37eb48494dd680f to your computer and use it in GitHub Desktop.
Save svyatogor/7839d00303998a9fa37eb48494dd680f to your computer and use it in GitHub Desktop.
Convert SmartIR Broadlink commands to Tuya
@MusiCode1
Copy link

This is so genius!
Why is this code not integrated into SmartIR?

@BenJamesAndo
Copy link

This is so genius! Why is this code not integrated into SmartIR?

I did see on the SmartIR fork that the author is thinking about making a dynamic converter litinoveweedle/SmartIR#122 (comment)

@nazmibojan
Copy link

Hi guys, I got this error when convert 4180.json

Traceback (most recent call last):
  File "/home/nazmi/Documents/ferbos/code/irremote/broadlink_to_tuya.py", line 173, in <module>
    print(process_commands(sys.argv[1]))
  File "/home/nazmi/Documents/ferbos/code/irremote/broadlink_to_tuya.py", line 167, in process_commands
    data['commands'] = process_commands_recursively(data.get('commands', {}))
  File "/home/nazmi/Documents/ferbos/code/irremote/broadlink_to_tuya.py", line 159, in process_commands_recursively
    processed_commands[key] = encode_ir(value)
  File "/home/nazmi/Documents/ferbos/code/irremote/broadlink_to_tuya.py", line 16, in encode_ir
    signal = filter(get_raw_from_broadlink(base64.b64decode(command).hex()))
  File "/home/nazmi/Documents/ferbos/code/irremote/broadlink_to_tuya.py", line 145, in get_raw_from_broadlink
    dec.append(ceil(int(hex_value, 16) / unit))  # Will be lower than initial value due to former round()
ValueError: invalid literal for int() with base 16: ''

Do you have any idea why did this happened?

@nazmibojan
Copy link

Hi guys, I got this error when convert 4180.json

Traceback (most recent call last):
  File "/home/nazmi/Documents/ferbos/code/irremote/broadlink_to_tuya.py", line 173, in <module>
    print(process_commands(sys.argv[1]))
  File "/home/nazmi/Documents/ferbos/code/irremote/broadlink_to_tuya.py", line 167, in process_commands
    data['commands'] = process_commands_recursively(data.get('commands', {}))
  File "/home/nazmi/Documents/ferbos/code/irremote/broadlink_to_tuya.py", line 159, in process_commands_recursively
    processed_commands[key] = encode_ir(value)
  File "/home/nazmi/Documents/ferbos/code/irremote/broadlink_to_tuya.py", line 16, in encode_ir
    signal = filter(get_raw_from_broadlink(base64.b64decode(command).hex()))
  File "/home/nazmi/Documents/ferbos/code/irremote/broadlink_to_tuya.py", line 145, in get_raw_from_broadlink
    dec.append(ceil(int(hex_value, 16) / unit))  # Will be lower than initial value due to former round()
ValueError: invalid literal for int() with base 16: ''

Do you have any idea why did this happened?

Apologize for the mistake, 4180.json is using Xiaomi controller, not broadlink.

@nakata5321
Copy link

Hi guys, thank you for your code!
I came form SmartIR repo to here and i'm working with Z06/UFO-R11 and convert to this IR remote from broadlink. To work properly, i have to change one line at the and of the code:
data['supportedController'] = 'MQTT' -> data['supportedController'] = 'UFOR11'
Just leave it here for the history.

@glenricky
Copy link

Hi everyone, I am not a programmer at all, but just playing with homeassistant and wants to use all my devices locally. I am using tuya and tuya local and I can see all my devices. However the IR devices doesnt work and I just found about smartir. I have broadlink IR blaster and it works with smartir, but my tuya device isn't (I have 2 identical AC in seperate floor) and then I found out about this converter which I think should help me so that smartir can send the right command with the tuya device. My question is, how do I use this tool? can anyone give me step-by-step? My AC works with 1300.json.

@pasthev
Copy link

pasthev commented Mar 3, 2025

Hi @glenricky,

https://irtuya.streamlit.app/ might help in your case.
@svyatogor sorry, I don't mean to hack this thread - just thought that an online tool can be useful for non-programmers.

Pascal

@LotharWoman
Copy link

LotharWoman commented Apr 26, 2025

Hello folks,
Unfortunately I have no idea about the matter. However, I would like to operate air conditioning in the "Followme" mode with an external temperature sensor. The remote control sends the determined value of the room temperature to the air conditioning every 2-3min. Unfortunately, it can only be placed unfavorably and the batteries empty very quickly.
I have already managed to intercept some codes required with "Learn Command" in home assistant. Unfortunately, they are only graded in 1 ° C steps and the air conditioning is not very finely regulated.
I hope for your help. Is someone able to decode the transmitted temperature value from attached codes and to create new complete codes in 0.2 ° C steps? You would help me and others a lot.

Thanks for your help.

    "FollowMe 19°C": "dRHoEDICOgZSAtQBUgIaBlICGgZSAhoGUgLUAVICGgYzAvQBUgL0AVEC/AVRAvUBUQLVAVEC9QFRAhsGMgL0AVICGgYyAjoGMwIaBlIC9AFRAhoGMwL0AVEC9AFSAvsFMgI6BjMCEwJSAtQBUgIaBjIC9AFSAhoGMwI5BjMC9AEyAhMCMgL0ATMCOgYyAjoGMwI5BjMCGwZRAhsGMgI6BjICEwIzAhoGUgL0ATIC9AEyAhQCMgL0ATIC9AFSAvQBMwI5BjMCQxQ1ERcRMgI4BjMC8wEyAjkGMgI4BjICOQYyAhMCEwJYBhMCEwISAjMCEgI5BjICEwITAhMCMgITAhMCWAYTAhICEwJYBhMCWAYTAlgGEwITAhMCWAYTAjIC9AEyAhMCWAYSAlgGEwISAhMCMgITAjkGEwIyAhMCWAYTAlcGEwITAhMCMgL0ATICEwJZBhMCWAYTAlcG9AFYBhMCdwbzAXcG9AEyAhMCWAb0AVEC9AEyAvQBUQL0ATIC9AEyAhICMgL0AXcG9AEwdQ==",
    "FollowMe 20°C": "ixHoEDECWQYTAhMCMgI4BhMCWQYUAlcGEwITAjMCOAYyAhQCEgITAhQCWAYSAhMCMwITAhMCEwITAlsGEAITAjUCOAYxAjoGEgJYBhQCEgIyAjoGMgISAhUCWAYSAhMCFAISAjICEwIUAhICMgI6BhICMwISAjoGMQITAhQCWAYWAlgGEgISAhICWQYTAhMCMwI4BhMCWQYSAloGEgJYBhMCEwITAlkGEwIUAjECOQYUAjECEwIUAhICMgIUAhICEwJZBhMCQBRUEfYQNAJXBhICFQISAlgGFAJXBhMCWAYUAhICEwJYBhUCMQIVAhICEgJaBhICEgIVAhICNALxATMCOwYvAvUBUwIYBjICOQYzAjsGMAL0AXAC+wUyAhQCUQIZBjMC9AFRAtUBcALWAVEC1AFSAhkGMgIUAlEC/QVPAvQBUQIaBjICOQY1AvIBUQIbBjEC9AFTAhgGMgI6BjICOQY0AjgGMQL2ATECOAY0AvMBMQI6BjICEgI0AvMBMgIUAjIC8wE0AjcGMwIwdQ==",
    "FollowMe 21°C": "eBECETMCOQYVAjICFAI5BjQCOAYTAlsGEgITAjQCOAY1AhECEwIVAhICWAYVAhICFQIxAhMCFAITAloGEgITAjQCOQYVAlcGEwJaBhMCFAITAlsGEwISAjICOgYUAjICEwI7BjICFQISAhMCEwJaBhMCFAIyAjsGEgIzAhQCOAYzAhQCFQISAhICWQYTAjUCEQI5BjQCOQYVAlcGEwJaBhMCFAITAlkGFAITAjQCOAYTAjMCEwIUAhUCEgITAjMCEgJcBhICRRQ2ERYRNQI4BjICFAITAlsG8gFcBjACOgYSAjQCEgI6BjMCFQIRAhMCFQJYBhMCEwIzAhUCEQITAhQCWAYUAjICFgI4BhMCWQYTAloGEgITAjQCOQYUAjICFAI5BjMCFQISAlgGFAITAvYBMAIzAjoGEwIVAjECOQY0AvMBNAI4BjUC8wEyAhQCMgIcBlEC8wFTAhoGUQL9BVICGAZSAhsGUgL0AVIC/AUyAhYCMAI5BjQC8wFSAtUBUQL3ATAC9AE0AjgGMgIwdQ==",
    "FollowMe 22°C": "dBEIETICWwYSAhMCFAJZBhUCWQYSAjoGMwITAhUCWAYTAhYCEgITAjICOgYTAjUCEgITAhMCFAIyAjwGEgIyAhMCOwYxAjsGEwJZBhMCFAIyAjwGEgIyAhQCOgYyAjoGEwI1AhECFAITAhUCMQI8BhECMwIUAjkGNAISAhMCFAITAlkGFAITAjICOwYSAjQC8wFbBjICPAYSAlgGEwJZBhUCEgITAloGEgIVAjICPAYQAjMCEwIUAhMCEwI1AhECEwJaBhMCRBQ3ERsRMgI8BhICMgIUAjsGNQI4BhYCWAYWAhICMgI7BhQCMwITAhUC9AF5BvUBMgIWAhICNAITAhYCVwYWAhICEwJbBhMCOwYzAjsGFAI0AhICPAYyAhMCFQJbBhICPAYSAhcCMgLzATICFAIzAhsGNAITAjMCHQZRAvUBUgLXAVECHAZRAtUBUgIeBlAC9AFUAvsFMgI8BjQCOgY0AjoGUwLUAVQCGgZUAtMBUgIcBjYC8gFSAvQBUwLVAVIC1gFRAhwGMwIwdQ==",
    "FollowMe 23°C": "iRHoEDUCOAZRAtcBTwIbBlMCGQZRAvsFcQLVAVICGgZSAtcBUQLTAXMC+gVUAvIBUQLWAVIC0wFxAvsFUgL1AVECHAZQAvsFcQL6BVMC9AFRAv0FUQLzAVMCGQZVAvkFcQL8BVAC9gFRAtQBUwIaBjQC8wFVAhkGNQLyAVIC9QFRAtUBVALzAVIC/AU1AjgGNgI4BjUCOQYyAhsGNAI7BjIC9QFxAvwFMwIVAlEC1wFPAtUBcwLUAVMC1AFUAvMBMgIcBjMCRhQ6ERgRNAI8BjEC9AEzAjoGMwI7BjMCOgYzAvQBNQI5BjQC8wEzAvQBMwI7BjICFQIyAvQBMwL1ATICOwYzAhMCNQIZBjUCOQY0AjkGNQLzATICOwY1AhICEwJaBhMCWgYUAjsGMgIUAhMCFQITAloGEwIWAjECPAYSAjMCEwIUAhUCEgITAjMCFAJaBhMCPAYTAlsGEwJbBhMCWQYVAjkGFQIxAhYCWAb2ATICEgIVAhMCNQISAhMCFAIyAvYBMgITAloGEwIwdQ==",
    "FollowMe 24°C": "lhHpEDACOQY0AhMCUQL6BVQCGAYzAjkGMwL2AU8CGgY0AhICUgLVAVECGgY1AvMBUAL2AVEC0wFUAhgGMwL0AVECHAYyAjgGMwI5BjUC8gEyAjoGMgI4BjQC8wEyAhUCMQLzATUCEAIzAvUBMgI7BjEC8wE1AhICMQIbBlECHQYwAjoGMQL2AVECGQY0AjgGMwI5BjICOwYzAjcGMgIaBlIC9gEwAjkGNQLyATICFQIxAvMBNALzATICFAIyAvYBMQI5BjQCQBQ2ETURFQJYBhICEwIUAlgGFgJXBhICOgYyAhMCEwJYBhQCEwIUAjICEwI5BhMCNQIRAhMCEwI0AhICWAb2ATACEwJaBhICWwYRAjkGFQIxAhMCWQYTAjsGEgIyAhQCEgITAjQCEgITAhQCMQL0AVgGFAIyAhUCEgITAlkGEwJYBhUCVwYTAhQCEwJYBhYCVQYTAlkGEwJZBvYBVwYSAnkG8wEyAvUBdwb1ATICEwIzAvMBMgL0AVIC9gEwAvQBVALyAVgGFQIwdQ==",
    "FollowMe 25°C": "lBHoEDMCOQZUAtMBUQIbBlECHQZSAhgGUQLVAVMCGQZSAtYBUAL0AVQC+AVxAtYBUQLUAVIC9AFRAv0FbwLUAVQCGAZSAhoGUwL6BXIC1AFRAhsGUgL8BXAC1gFRAtQBUwIZBlEC1gFxAtQBUwIZBlEC1AFSAtUBcwL5BTMCOgYyAhMCVALTAVECGwZRAhkGNAIZBlICGQYyAjoGMwI6BjIC9QFQAh0GMAITAlMC0wFSAtUBUgL0AVEC1AFUAvIBVAL5BTICQxRVEfYQVAIYBjMCFAIxAhkGUgIbBjICPAYvAhQCNAIZBjICFgIwAvQBNAI4BjIC9QExAhMCMgL0ATICOgYzAvUBMgI4BjQCOQY0AjkGNQLyATMCOwYyAlkGFAITAhQCFQIyAjkGFgISAjICFAITAlkGFQISAhMCFAIzAjsGEgJbBhMCNAISAhMCFAJZBhQCOgYTAlsGEgJaBhMCWQYUAloGFAITAhUCWAYWAhACFAIzAhMCFgISAhMCFAIyAhMCFAITAlsGEgIwdQ==",
    "FollowMe 26°C": "khHnEDICOgZRAtUBUgIaBlICGgZSAhoGUQLVAVICGgZRAtUBcQLUAVICGgZSAtQBUgLVAXEC1AFSAhoGUgLUAVICGwZRAhoGUgL7BXAC1QFSAhoGUQIaBlIC1QFRAhoGUgLVAVEC9AFSAtQBUgIaBlIC1AFSAvQBUgL7BXEC1AFSAhsGUQLVAVECGgZSAhoGUgIaBlIC+wVxAvsFUQIbBlEC1QFxAvsFUQL0AVIC1QFSAtQBcQLVAVEC1QFSAvMBUgIaBjMCIxR0EdgQUQIbBjICEwJSAhoGMgIbBlECGgYzAhMCUgL6BTMCEwJSAtUBUQIaBjMC9AFRAvQBUgLVAVICGwYzAvQBMwI6BjMCOgYyAjsGMgL0ATMCOgYzAjoGMwL0ATICOwYyAvQBMwIUAjMC8wEzAjoGMwL0ATMCFAIyAhsGUgL0ATMCOwYzAvQBMgI7BjMCOgYzAhsGMwI6BjMCOgYzAjsGMgL0ATMCOgYzAvQBMwITAjMCEwIUAhMCEwIzAhQCEwITAloGFAIwdQ==",
    "FollowMe 27°C": "hRHlEDICOQZRAtUBUQIZBlICGQZRAhkGUgLUAVECGgZRAvQBUQLVAVECGQYyAvQBUQL0AVEC1AFSAhkGMgL0AXAC+gUyAjgGMwI4BjIC9AFwAvsFMgI4BjICEwJRAvoFUgIZBjICEwJRAtUBUQIZBjIC9AFwAtUBUQIZBjIC9AEyAhMCMgLzATICOQYxAjkGMgI5BjICGQZRAhkGMgI4BjICEwIzAhkGUgL0ATIC9AEzAhMCMwL0ATICEwIzAvQBMgI5BjICQhQ1ERYRMwI5BjIC9AEzAjkGMwI5BjICOgYTAjMCEwI5BjMCEwITAhMCEwJZBhMCEwIzAhMCEwITAhMCWQYTAjMCEwI5BhMCWQYTAlkGEwITAhMCWQYTAlgGEwIUAhMCWQYTAlgGFAIyAvQBMgITAlgGEwIUAhMCMgITAjoGEwIzAhMCEwITAjICEwI6BhMCWQYTAncG9AF4BvQBeAb0AVgGEwIyAvQBeAb0ATMC8wEzAhMCMgL0ATMC9AFRAvQBMgL0AXgG8wEwdQ=="

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment