mirror of
				https://github.com/wled/WLED.git
				synced 2025-10-29 21:58:59 +00:00 
			
		
		
		
	 c4f084a991
			
		
	
	c4f084a991
	
	
	
		
			
			* add decodeIRJson and JSON remote option * handle JSON API commands also * removed code that forced IR codes in a certain range to be decoded by decodeIR24. Generate default ir.json files for currently supported remotes. * comment out printing API commands in IR handling * refactor decodeIRJson to change how ir.json is loaded add support for calling several c functions * Handle setting palette when effect is still on default solid and will not display it * remove colorUpdated notifier that was pasted in accidentally * Update to handle both 24-key and 24-key old remotes (#1969) * Update readme.md * Update ir.cpp Handle both 24-key and 24-key old in decodeIR switch statement * Re-add JSON remote option Co-authored-by: Scott Bailey <scottrbailey@gmail.com> Co-authored-by: Artacus <40248830+scottrbailey@users.noreply.github.com>
		
			
				
	
	
		
			109 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import colorsys
 | |
| import json
 | |
| import openpyxl
 | |
| 
 | |
| named_colors = {'AliceBlue': '0xF0F8FF', 'AntiqueWhite': '0xFAEBD7', 'Aqua': '0x00FFFF',
 | |
|                 'Aquamarine': '0x7FFFD4', 'Azure': '0xF0FFFF', 'Beige': '0xF5F5DC', 'Bisque': '0xFFE4C4',
 | |
|                 'Black': '0x000000', 'BlanchedAlmond': '0xFFEBCD', 'Blue': '0x0000FF',
 | |
|                 'BlueViolet': '0x8A2BE2', 'Brown': '0xA52A2A', 'BurlyWood': '0xDEB887',
 | |
|                 'CadetBlue': '0x5F9EA0', 'Chartreuse': '0x7FFF00', 'Chocolate': '0xD2691E',
 | |
|                 'Coral': '0xFF7F50', 'CornflowerBlue': '0x6495ED', 'Cornsilk': '0xFFF8DC',
 | |
|                 'Crimson': '0xDC143C', 'Cyan': '0x00FFFF', 'DarkBlue': '0x00008B', 'DarkCyan': '0x008B8B',
 | |
|                 'DarkGoldenRod': '0xB8860B', 'DarkGray': '0xA9A9A9', 'DarkGrey': '0xA9A9A9',
 | |
|                 'DarkGreen': '0x006400', 'DarkKhaki': '0xBDB76B', 'DarkMagenta': '0x8B008B',
 | |
|                 'DarkOliveGreen': '0x556B2F', 'DarkOrange': '0xFF8C00', 'DarkOrchid': '0x9932CC',
 | |
|                 'DarkRed': '0x8B0000', 'DarkSalmon': '0xE9967A', 'DarkSeaGreen': '0x8FBC8F',
 | |
|                 'DarkSlateBlue': '0x483D8B', 'DarkSlateGray': '0x2F4F4F', 'DarkSlateGrey': '0x2F4F4F',
 | |
|                 'DarkTurquoise': '0x00CED1', 'DarkViolet': '0x9400D3', 'DeepPink': '0xFF1493',
 | |
|                 'DeepSkyBlue': '0x00BFFF', 'DimGray': '0x696969', 'DimGrey': '0x696969',
 | |
|                 'DodgerBlue': '0x1E90FF', 'FireBrick': '0xB22222', 'FloralWhite': '0xFFFAF0',
 | |
|                 'ForestGreen': '0x228B22', 'Fuchsia': '0xFF00FF', 'Gainsboro': '0xDCDCDC',
 | |
|                 'GhostWhite': '0xF8F8FF', 'Gold': '0xFFD700', 'GoldenRod': '0xDAA520', 'Gray': '0x808080',
 | |
|                 'Grey': '0x808080', 'Green': '0x008000', 'GreenYellow': '0xADFF2F', 'HoneyDew': '0xF0FFF0',
 | |
|                 'HotPink': '0xFF69B4', 'IndianRed': '0xCD5C5C', 'Indigo': '0x4B0082', 'Ivory': '0xFFFFF0',
 | |
|                 'Khaki': '0xF0E68C', 'Lavender': '0xE6E6FA', 'LavenderBlush': '0xFFF0F5',
 | |
|                 'LawnGreen': '0x7CFC00', 'LemonChiffon': '0xFFFACD', 'LightBlue': '0xADD8E6',
 | |
|                 'LightCoral': '0xF08080', 'LightCyan': '0xE0FFFF', 'LightGoldenRodYellow': '0xFAFAD2',
 | |
|                 'LightGray': '0xD3D3D3', 'LightGrey': '0xD3D3D3', 'LightGreen': '0x90EE90',
 | |
|                 'LightPink': '0xFFB6C1', 'LightSalmon': '0xFFA07A', 'LightSeaGreen': '0x20B2AA',
 | |
|                 'LightSkyBlue': '0x87CEFA', 'LightSlateGray': '0x778899', 'LightSlateGrey': '0x778899',
 | |
|                 'LightSteelBlue': '0xB0C4DE', 'LightYellow': '0xFFFFE0', 'Lime': '0x00FF00',
 | |
|                 'LimeGreen': '0x32CD32', 'Linen': '0xFAF0E6', 'Magenta': '0xFF00FF', 'Maroon': '0x800000',
 | |
|                 'MediumAquaMarine': '0x66CDAA', 'MediumBlue': '0x0000CD', 'MediumOrchid': '0xBA55D3',
 | |
|                 'MediumPurple': '0x9370DB', 'MediumSeaGreen': '0x3CB371', 'MediumSlateBlue': '0x7B68EE',
 | |
|                 'MediumSpringGreen': '0x00FA9A', 'MediumTurquoise': '0x48D1CC', 'MediumVioletRed': '0xC71585',
 | |
|                 'MidnightBlue': '0x191970', 'MintCream': '0xF5FFFA', 'MistyRose': '0xFFE4E1',
 | |
|                 'Moccasin': '0xFFE4B5', 'NavajoWhite': '0xFFDEAD', 'Navy': '0x000080', 'OldLace': '0xFDF5E6',
 | |
|                 'Olive': '0x808000', 'OliveDrab': '0x6B8E23', 'Orange': '0xFFA500', 'OrangeRed': '0xFF4500',
 | |
|                 'Orchid': '0xDA70D6', 'PaleGoldenRod': '0xEEE8AA', 'PaleGreen': '0x98FB98',
 | |
|                 'PaleTurquoise': '0xAFEEEE', 'PaleVioletRed': '0xDB7093', 'PapayaWhip': '0xFFEFD5',
 | |
|                 'PeachPuff': '0xFFDAB9', 'Peru': '0xCD853F', 'Pink': '0xFFC0CB', 'Plum': '0xDDA0DD',
 | |
|                 'PowderBlue': '0xB0E0E6', 'Purple': '0x800080', 'RebeccaPurple': '0x663399', 'Red': '0xFF0000',
 | |
|                 'RosyBrown': '0xBC8F8F', 'RoyalBlue': '0x4169E1', 'SaddleBrown': '0x8B4513', 'Salmon': '0xFA8072',
 | |
|                 'SandyBrown': '0xF4A460', 'SeaGreen': '0x2E8B57', 'SeaShell': '0xFFF5EE', 'Sienna': '0xA0522D',
 | |
|                 'Silver': '0xC0C0C0', 'SkyBlue': '0x87CEEB', 'SlateBlue': '0x6A5ACD', 'SlateGray': '0x708090',
 | |
|                 'SlateGrey': '0x708090', 'Snow': '0xFFFAFA', 'SpringGreen': '0x00FF7F', 'SteelBlue': '0x4682B4',
 | |
|                 'Tan': '0xD2B48C', 'Teal': '0x008080', 'Thistle': '0xD8BFD8', 'Tomato': '0xFF6347',
 | |
|                 'Turquoise': '0x40E0D0', 'Violet': '0xEE82EE', 'Wheat': '0xF5DEB3', 'White': '0xFFFFFF',
 | |
|                 'WhiteSmoke': '0xF5F5F5', 'Yellow': '0xFFFF00', 'YellowGreen': '0x9ACD32'}
 | |
| 
 | |
| def shift_color(col, shift=30, sat=1.0, val=1.0):
 | |
|     r = (col & (255 << 16)) >> 16
 | |
|     g = (col & (255 << 8)) >> 8
 | |
|     b = col & 255
 | |
|     hsv = colorsys.rgb_to_hsv(r, g, b)
 | |
|     h = (((hsv[0] * 360) + shift) % 360) / 360
 | |
|     rgb = colorsys.hsv_to_rgb(h, hsv[1] * sat, hsv[2] * val)
 | |
|     return (int(rgb[0]) << 16) + (int(rgb[1]) << 8) + int(rgb[2])
 | |
| 
 | |
| def parse_sheet(ws):
 | |
|     print(f'Parsing worksheet {ws.title}')
 | |
|     ir = {"desc": ws.title}
 | |
|     rows = ws.rows
 | |
|     keys = [col.value.lower() for col in next(rows)]
 | |
|     for row in rows:
 | |
|         rec = dict(zip(keys, [col.value for col in row]))
 | |
|         if rec.get('code') is None:
 | |
|             continue
 | |
|         cd = {"label": rec.get('label')}
 | |
|         if rec.get('row'):
 | |
|             cd['pos'] = f'{rec["row"]}x{rec["col"]}'
 | |
|         if rec.get('comment'):
 | |
|             cd['cmnt'] = rec.get('comment')
 | |
|         if rec.get('rpt'):
 | |
|             cd['rpt'] = bool(rec['rpt'])
 | |
|                        
 | |
|         if rec.get('cmd'):
 | |
|             cd['cmd'] = rec['cmd']
 | |
|         elif all((rec.get('primary'), rec.get('secondary'), rec.get('tertiary'))):
 | |
|             c1 = int(rec.get('primary'), 16)
 | |
|             c2 = int(rec.get('secondary'), 16)
 | |
|             c3 = int(rec.get('tertiary'), 16)
 | |
|             cd['cmd'] = f'FP=5&CL=h{c1:X}&C2=h{c2:X}&C3=h{c3:X}'
 | |
|         elif all((rec.get('primary'), rec.get('secondary'))):
 | |
|             c1 = int(rec.get('primary'), 16)
 | |
|             c2 = int(rec.get('secondary'), 16)
 | |
|             c3 = shift_color(c1, -1, sat=0.66, val=0.66)
 | |
|             cd['cmd'] = f'FP=5&CL=h{c1:X}&C2=h{c2:X}&C3=h{c3:X}'
 | |
|         elif rec.get('primary'):
 | |
|             c1 = int(rec.get('primary'), 16)
 | |
|             c2 = shift_color(c1, 30)
 | |
|             c3 = shift_color(c1, -10, sat=0.66, val=0.66)
 | |
|             cd['cmd'] = f'FP=5&CL=h{c1:X}&C2=h{c2:X}&C3=h{c3:X}'
 | |
|         elif rec.get('label') in named_colors:
 | |
|             c1 = int(named_colors[rec.get('label')], 16)
 | |
|             c2 = shift_color(c1, 30)
 | |
|             c3 = shift_color(c1, -10, sat=0.66, val=0.66)
 | |
|             cd['cmd'] = f'FP=5&CL=h{c1:X}&C2=h{c2:X}&C3=h{c3:X}'
 | |
|         else:
 | |
|             print(f'Did not find a command or color for {rec["label"]}. Hint use named CSS colors as labels')
 | |
|         ir[rec['code']] = cd
 | |
|             
 | |
|     with open(f'{ws.title}_ir.json', 'w') as fp:
 | |
|         json.dump(ir, fp, indent=2)        
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     wb = openpyxl.load_workbook('IR_Remote_Codes.xlsx')
 | |
|     for ws in wb.worksheets:
 | |
|         parse_sheet(ws)
 |