diff --git a/usermods/JSON_IR_remote/21-key_ir.json b/usermods/JSON_IR_remote/21-key_ir.json
new file mode 100644
index 000000000..cc71b14df
--- /dev/null
+++ b/usermods/JSON_IR_remote/21-key_ir.json
@@ -0,0 +1,119 @@
+{
+ "desc": "21-key",
+ "0xFFA25D": {
+ "label": "On",
+ "pos": "1x1",
+ "cmd": "T=1"
+ },
+ "0xFF629D": {
+ "label": "Off",
+ "pos": "1x2",
+ "cmd": "T=0"
+ },
+ "0xFFE21D": {
+ "label": "Flash",
+ "pos": "1x3",
+ "cmnt": "Cycle Effects",
+ "cmd": "CY=0&FX=~"
+ },
+ "0xFF22DD": {
+ "label": "Strobe",
+ "pos": "2x1",
+ "cmnt": "Sinelon Dual",
+ "cmd": "CY=0&FX=93"
+ },
+ "0xFF02FD": {
+ "label": "Fade",
+ "pos": "2x2",
+ "cmnt": "Rain",
+ "cmd": "CY=0&FX=43"
+ },
+ "0xFFC23D": {
+ "label": "Smooth",
+ "pos": "2x3",
+ "cmnt": "Aurora",
+ "cmd": "CY=0&FX=38"
+ },
+ "0xFFE01F": {
+ "label": "Bright +",
+ "pos": "3x1",
+ "cmd": "A=~16"
+ },
+ "0xFFA857": {
+ "label": "Bright -",
+ "pos": "3x2",
+ "cmd": "A=~-16"
+ },
+ "0xFF906F": {
+ "label": "White",
+ "pos": "3x3",
+ "cmd": "FP=5&CL=hFFFFFF&C2=hFFFFFF&C3=hA8A8A8"
+ },
+ "0xFF6897": {
+ "label": "Red",
+ "pos": "4x1",
+ "cmnt": "Lava",
+ "cmd": "FP=8"
+ },
+ "0xFF9867": {
+ "label": "Green",
+ "pos": "4x2",
+ "cmnt": "Forest",
+ "cmd": "FP=10"
+ },
+ "0xFFB04F": {
+ "label": "Blue",
+ "pos": "4x3",
+ "cmnt": "Breeze",
+ "cmd": "FP=15"
+ },
+ "0xFF30CF": {
+ "label": "Tomato",
+ "pos": "5x1",
+ "cmd": "FP=5&CL=hFF6347&C2=hFFBF47&C3=hA85859"
+ },
+ "0xFF18E7": {
+ "label": "LightGreen",
+ "pos": "5x2",
+ "cmnt": "Rivendale",
+ "cmd": "FP=14"
+ },
+ "0xFF7A85": {
+ "label": "SkyBlue",
+ "pos": "5x3",
+ "cmnt": "Ocean",
+ "cmd": "FP=9"
+ },
+ "0xFF10EF": {
+ "label": "Orange",
+ "pos": "6x1",
+ "cmnt": "Orangery",
+ "cmd": "FP=47"
+ },
+ "0xFF38C7": {
+ "label": "Aqua",
+ "pos": "6x2",
+ "cmd": "FP=5&CL=hFFFF&C2=h7FFF&C3=h39A895"
+ },
+ "0xFF5AA5": {
+ "label": "Purple",
+ "pos": "6x3",
+ "cmd": "FP=5&CL=h663399&C2=h993399&C3=h473864"
+ },
+ "0xFF42BD": {
+ "label": "Yellow",
+ "pos": "7x1",
+ "cmd": "FP=5&CL=hFFFF00&C2=hFFC800&C3=hFDFFDE"
+ },
+ "0xFF4AB5": {
+ "label": "Cyan",
+ "pos": "7x2",
+ "cmnt": "Beech",
+ "cmd": "FP=22"
+ },
+ "0xFF52AD": {
+ "label": "Pink",
+ "pos": "7x3",
+ "cmd": "FP=5&CL=hFFC0CB&C2=hFFD4C0&C3=hA88C96"
+ }
+}
\ No newline at end of file
diff --git a/usermods/JSON_IR_remote/24-key_ir.json b/usermods/JSON_IR_remote/24-key_ir.json
new file mode 100644
index 000000000..48be10b93
--- /dev/null
+++ b/usermods/JSON_IR_remote/24-key_ir.json
@@ -0,0 +1,147 @@
+{
+ "desc": "24-key",
+ "0xF700FF": {
+ "label": "+",
+ "pos": "1x1",
+ "cmnt": "Speed +",
+ "cmd": "SX=~16"
+ },
+ "0xF7807F": {
+ "label": "-",
+ "pos": "1x2",
+ "cmnt": "Speed -",
+ "cmd": "SX=~-16"
+ },
+ "0xF740BF": {
+ "label": "On/Off",
+ "pos": "1x3",
+ "cmnt": "Toggle On/Off",
+ "cmd": "T=2"
+ },
+ "0xF7C03F": {
+ "label": "W",
+ "pos": "1x4",
+ "cmnt": "Cycle color palette",
+ "cmd": "FP=~"
+ },
+ "0xF720DF": {
+ "label": "R",
+ "pos": "2x1",
+ "cmnt": "Lava",
+ "cmd": "FP=8"
+ },
+ "0xF7A05F": {
+ "label": "G",
+ "pos": "2x2",
+ "cmnt": "Forest",
+ "cmd": "FP=10"
+ },
+ "0xF7609F": {
+ "label": "B",
+ "pos": "2x3",
+ "cmnt": "Breeze",
+ "cmd": "FP=15"
+ },
+ "0xF7E01F": {
+ "label": "Bright -",
+ "pos": "2x4",
+ "cmnt": "Bright -",
+ "cmd": "A=~-16"
+ },
+ "0xF710EF": {
+ "label": "Timer1H",
+ "pos": "3x1",
+ "cmnt": "Timer 60 min",
+ "cmd": "NL=60&NT=0"
+ },
+ "0xF7906F": {
+ "label": "Timer4H",
+ "pos": "3x2",
+ "cmnt": "Timer 30 min",
+ "cmd": "NL=30&NT=0"
+ },
+ "0xF750AF": {
+ "label": "Timer8H",
+ "pos": "3x3",
+ "cmnt": "Timer 15 min",
+ "cmd": "NL=15&NT=0"
+ },
+ "0xF7D02F": {
+ "label": "Bright128",
+ "pos": "3x4",
+ "cmnt": "Bright 128",
+ "cmd": "A=128"
+ },
+ "0xF730CF": {
+ "label": "Music1",
+ "pos": "4x1",
+ "cmnt": "Cycle FX +",
+ "cmd": "FX=~"
+ },
+ "0xF7B04F": {
+ "label": "Music2",
+ "pos": "4x2",
+ "cmnt": "Cycle FX -",
+ "cmd": "FX=~-1"
+ },
+ "0xF7708F": {
+ "label": "Music3",
+ "pos": "4x3",
+ "cmnt": "Reset FX and FP",
+ "cmd": "FX=1&PF=6"
+ },
+ "0xF7F00F": {
+ "label": "Bright +",
+ "pos": "4x4",
+ "cmnt": "Bright +",
+ "cmd": "A=~16"
+ },
+ "0xF708F7": {
+ "label": "Mode1",
+ "pos": "5x1",
+ "cmnt": "Preset 1",
+ "cmd": "PL=1"
+ },
+ "0xF78877": {
+ "label": "Mode2",
+ "pos": "5x2",
+ "cmnt": "Preset 2",
+ "cmd": "PL=2"
+ },
+ "0xF748B7": {
+ "label": "Mode3",
+ "pos": "5x3",
+ "cmnt": "Preset 3",
+ "cmd": "PL=3"
+ },
+ "0xF7C837": {
+ "label": "Up",
+ "pos": "5x4",
+ "cmnt": "Intensity +",
+ "cmd": "IX=~16"
+ },
+ "0xF728D7": {
+ "label": "Mode4",
+ "pos": "6x1",
+ "cmnt": "Preset 4",
+ "cmd": "PL=4"
+ },
+ "0xF7A857": {
+ "label": "Mode5",
+ "pos": "6x2",
+ "cmnt": "Preset 5",
+ "cmd": "PL=5"
+ },
+ "0xF76897": {
+ "label": "Cycle",
+ "pos": "6x3",
+ "cmnt": "Toggle preset cycle",
+ "cmd": "CY=1&PT=60000"
+ },
+ "0xF7E817": {
+ "label": "Down",
+ "pos": "6x4",
+ "cmnt": "Intensity -",
+ "cmd": "IX=~-16"
+ }
+}
\ No newline at end of file
diff --git a/usermods/JSON_IR_remote/32-key_ir.json b/usermods/JSON_IR_remote/32-key_ir.json
new file mode 100644
index 000000000..f58c7795a
--- /dev/null
+++ b/usermods/JSON_IR_remote/32-key_ir.json
@@ -0,0 +1,185 @@
+{
+ "desc": "32-key",
+ "0xFF08F7": {
+ "label": "On",
+ "pos": "1x1",
+ "cmd": "T=1"
+ },
+ "0xFFC03F": {
+ "label": "Off",
+ "pos": "1x2",
+ "cmd": "T=0"
+ },
+ "0xFF807F": {
+ "label": "Auto",
+ "pos": "1x3",
+ "cmnt": "Toggle preset cycle",
+ "cmd": "CY=2"
+ },
+ "0xFF609F": {
+ "label": "Mode",
+ "pos": "1x4",
+ "cmnt": "Cycle effects",
+ "cmd": "FX=~&CY=0"
+ },
+ "0xFF906F": {
+ "label": "4H",
+ "pos": "2x1",
+ "cmnt": "Timer 60min",
+ "cmd": "NL=60&NT=0"
+ },
+ "0xFFB847": {
+ "label": "6H",
+ "pos": "2x2",
+ "cmnt": "Timer 90min",
+ "cmd": "NL=90&NT=0"
+ },
+ "0xFFF807": {
+ "label": "8H",
+ "pos": "2x3",
+ "cmnt": "Timer 120min",
+ "cmd": "NL=120&NT=0"
+ },
+ "0xFFB04F": {
+ "label": "Timer Off",
+ "pos": "2x4",
+ "cmd": "NL=0"
+ },
+ "0xFF9867": {
+ "label": "Red",
+ "pos": "3x1",
+ "cmnt": "Lava",
+ "cmd": "FP=8"
+ },
+ "0xFFD827": {
+ "label": "Green",
+ "pos": "3x2",
+ "cmnt": "Forest",
+ "cmd": "FP=10"
+ },
+ "0xFF8877": {
+ "label": "Blue",
+ "pos": "3x3",
+ "cmnt": "Breeze",
+ "cmd": "FP=15"
+ },
+ "0xFFA857": {
+ "label": "White",
+ "pos": "3x4",
+ "cmd": "FP=5&CL=hFFFFFF&C2=hFFE4CD&C3=hE4E4FF"
+ },
+ "0xFFE817": {
+ "label": "OrangeRed",
+ "pos": "4x1",
+ "cmnt": "Sakura",
+ "cmd": "FP=49"
+ },
+ "0xFF48B7": {
+ "label": "SeaGreen",
+ "pos": "4x2",
+ "cmnt": "Rivendale",
+ "cmd": "FP=14"
+ },
+ "0xFF6897": {
+ "label": "RoyalBlue",
+ "pos": "4x3",
+ "cmnt": "Ocean",
+ "cmd": "FP=9"
+ },
+ "0xFFB24D": {
+ "label": "DarkBlue",
+ "pos": "4x4",
+ "cmnt": "Breeze",
+ "cmd": "FP=15"
+ },
+ "0xFF02FD": {
+ "label": "Orange",
+ "pos": "5x1",
+ "cmnt": "Orangery",
+ "cmd": "FP=47"
+ },
+ "0xFF32CD": {
+ "label": "YellowGreen",
+ "pos": "5x2",
+ "cmnt": "Aurora",
+ "cmd": "FP=37"
+ },
+ "0xFF20DF": {
+ "label": "SkyBlue",
+ "pos": "5x3",
+ "cmnt": "Beech",
+ "cmd": "FP=22"
+ },
+ "0xFF00FF": {
+ "label": "Orchid",
+ "pos": "5x4",
+ "cmd": "FP=5&CL=hDA70D6&C2=hDA70A0&C3=h89618F"
+ },
+ "0xFF50AF": {
+ "label": "Yellow",
+ "pos": "6x1",
+ "cmd": "FP=5&CL=hFFFF00&C2=hFFC800&C3=hFDFFDE"
+ },
+ "0xFF7887": {
+ "label": "DarkGreen",
+ "pos": "6x2",
+ "cmnt": "Orange and Teal",
+ "cmd": "FP=44"
+ },
+ "0xFF708F": {
+ "label": "RebeccaPurple",
+ "pos": "6x3",
+ "cmd": "FP=5&CL=h800080&C2=h800040&C3=h4B1C54"
+ },
+ "0xFF58A7": {
+ "label": "Plum",
+ "pos": "6x4",
+ "cmd": "FP=5&CL=hDDA0DD&C2=hDDA0BE&C3=h8D7791"
+ },
+ "0xFF38C7": {
+ "label": "Strobe",
+ "pos": "7x1",
+ "cmnt": "Dancing Shadows",
+ "cmd": "FX=112&CY=0"
+ },
+ "0xFF28D7": {
+ "label": "In Waves",
+ "pos": "7x2",
+ "cmnt": "Noise 1",
+ "cmd": "FX=70&CY=0"
+ },
+ "0xFFF00F": {
+ "label": "Speed +",
+ "pos": "7x3",
+ "cmd": "SX=~16"
+ },
+ "0xFF30CF": {
+ "label": "Speed -",
+ "pos": "7x4",
+ "cmd": "SX=~-16"
+ },
+ "0xFF40BF": {
+ "label": "Jump",
+ "pos": "8x1",
+ "cmnt": "Colortwinkles",
+ "cmd": "FX=74&CY=0"
+ },
+ "0xFF12ED": {
+ "label": "Fade",
+ "pos": "8x2",
+ "cmnt": "Sunrise",
+ "cmd": "FX=104&CY=0"
+ },
+ "0xFF2AD5": {
+ "label": "Flash",
+ "pos": "8x3",
+ "cmnt": "Railway",
+ "cmd": "FX=78&CY=0"
+ },
+ "0xFFA05F": {
+ "label": "Chase Flash",
+ "pos": "8x4",
+ "cmnt": "Washing Machine",
+ "cmd": "FX=113&CY=0"
+ }
+}
\ No newline at end of file
diff --git a/usermods/JSON_IR_remote/40-key-black_ir.json b/usermods/JSON_IR_remote/40-key-black_ir.json
new file mode 100644
index 000000000..71262b122
--- /dev/null
+++ b/usermods/JSON_IR_remote/40-key-black_ir.json
@@ -0,0 +1,233 @@
+{
+ "desc": "40-key-black",
+ "0xFF3AC5": {
+ "label": "Bright +",
+ "pos": "1x1",
+ "cmd": "A=~16"
+ },
+ "0xFFBA45": {
+ "label": "Bright -",
+ "pos": "1x2",
+ "cmd": "A=~-16"
+ },
+ "0xFF827D": {
+ "label": "Off",
+ "pos": "1x3",
+ "cmd": "T=0"
+ },
+ "0xFF02FD": {
+ "label": "On",
+ "pos": "1x4",
+ "cmd": "T=1"
+ },
+ "0xFF1AE5": {
+ "label": "Red",
+ "pos": "2x1",
+ "cmnt": "Lava",
+ "cmd": "FP=8"
+ },
+ "0xFF9A65": {
+ "label": "Green",
+ "pos": "2x2",
+ "cmnt": "Forest",
+ "cmd": "FP=10"
+ },
+ "0xFFA25D": {
+ "label": "Blue",
+ "pos": "2x3",
+ "cmnt": "Breeze",
+ "cmd": "FP=15"
+ },
+ "0xFF22DD": {
+ "label": "White",
+ "pos": "2x4",
+ "cmd": "FP=5&CL=hFFFFFF&C2=hFFFFFF&C3=hA8A8A8"
+ },
+ "0xFF2AD5": {
+ "label": "Tomato",
+ "pos": "3x1",
+ "cmnt": "Yelmag",
+ "cmd": "FP=5&CL=hFF6347&C2=hFFBF47&C3=hA85859"
+ },
+ "0xFFAA55": {
+ "label": "LightGreen",
+ "pos": "3x2",
+ "cmnt": "Rivendale",
+ "cmd": "FP=14"
+ },
+ "0xFF926D": {
+ "label": "SkyBlue",
+ "pos": "3x3",
+ "cmnt": "Ocean",
+ "cmd": "FP=9"
+ },
+ "0xFF12ED": {
+ "label": "WarmWhite",
+ "pos": "3x4",
+ "cmnt": "Warm White",
+ "cmd": "FP=5&CL=hFFE4CD&C2=hFFFCCD&C3=hA89892"
+ },
+ "0xFF0AF5": {
+ "label": "OrangeRed",
+ "pos": "4x1",
+ "cmnt": "Sakura",
+ "cmd": "FP=49"
+ },
+ "0xFF8A75": {
+ "label": "Cyan",
+ "pos": "4x2",
+ "cmnt": "Beech",
+ "cmd": "FP=22"
+ },
+ "0xFFB24D": {
+ "label": "RebeccaPurple",
+ "pos": "4x3",
+ "cmd": "FP=5&CL=h663399&C2=h993399&C3=h473864"
+ },
+ "0xFF32CD": {
+ "label": "CoolWhite",
+ "pos": "4x4",
+ "cmnt": "Cool White",
+ "cmd": "FP=5&CL=hE4E4FF&C2=hF1E4FF&C3=h9C9EA8"
+ },
+ "0xFF38C7": {
+ "label": "Orange",
+ "pos": "5x1",
+ "cmnt": "Orangery",
+ "cmd": "FP=47"
+ },
+ "0xFFB847": {
+ "label": "Turquoise",
+ "pos": "5x2",
+ "cmd": "FP=5&CL=h40E0D0&C2=h40A0E0&C3=h4E9381"
+ },
+ "0xFF7887": {
+ "label": "Purple",
+ "pos": "5x3",
+ "cmd": "FP=5&CL=h800080&C2=h800040&C3=h4B1C54"
+ },
+ "0xFFF807": {
+ "label": "MedGray",
+ "pos": "5x4",
+ "cmnt": "Cycle palette +",
+ "cmd": "FP=~"
+ },
+ "0xFF18E7": {
+ "label": "Yellow",
+ "pos": "6x1",
+ "cmd": "FP=5&CL=hFFFF00&C2=h7FFF00&C3=hA89539"
+ },
+ "0xFF9867": {
+ "label": "DarkCyan",
+ "pos": "6x2",
+ "cmd": "FP=5&CL=h8B8B&C2=h458B&C3=h1F5B51"
+ },
+ "0xFF58A7": {
+ "label": "Plum",
+ "pos": "6x3",
+ "cmnt": "Magenta",
+ "cmd": "FP=40"
+ },
+ "0xFFD827": {
+ "label": "DarkGray",
+ "pos": "6x4",
+ "cmnt": "Cycle palette -",
+ "cmd": "FP=~-"
+ },
+ "0xFF28D7": {
+ "label": "Jump3",
+ "pos": "7x1",
+ "cmnt": "Colortwinkles",
+ "cmd": "CY=0&FX=74"
+ },
+ "0xFFA857": {
+ "label": "Fade3",
+ "pos": "7x2",
+ "cmnt": "Rain",
+ "cmd": "CY=0&FX=43"
+ },
+ "0xFF6897": {
+ "label": "Flash",
+ "pos": "7x3",
+ "cmnt": "Cycle Effects",
+ "cmd": "CY=0&FX=~"
+ },
+ "0xFFE817": {
+ "label": "Quick",
+ "pos": "7x4",
+ "cmnt": "Fx speed +16",
+ "cmd": "SX=~16"
+ },
+ "0xFF08F7": {
+ "label": "Jump7",
+ "pos": "8x1",
+ "cmnt": "Sinelon Dual",
+ "cmd": "CY=0&FX=93"
+ },
+ "0xFF8877": {
+ "label": "Fade7",
+ "pos": "8x2",
+ "cmnt": "Lighthouse",
+ "cmd": "CY=0&FX=41"
+ },
+ "0xFF48B7": {
+ "label": "Auto",
+ "pos": "8x3",
+ "cmnt": "Toggle preset cycle",
+ "cmd": "CY=2"
+ },
+ "0xFFC837": {
+ "label": "Slow",
+ "pos": "8x4",
+ "cmnt": "FX speed -16",
+ "cmd": "SX=~-16"
+ },
+ "0xFF30CF": {
+ "label": "Custom1",
+ "pos": "9x1",
+ "cmnt": "Noise 1",
+ "cmd": "CY=0&FX=70"
+ },
+ "0xFFB04F": {
+ "label": "Custom2",
+ "pos": "9x2",
+ "cmnt": "Dancing Shadows",
+ "cmd": "CY=0&FX=112"
+ },
+ "0xFF708F": {
+ "label": "Music +",
+ "pos": "9x3",
+ "cmnt": "FX Intensity +16",
+ "cmd": "IX=~16"
+ },
+ "0xFFF00F": {
+ "label": "Timer60",
+ "pos": "9x4",
+ "cmnt": "Timer 60 min",
+ "cmd": "NL=60&NT=0"
+ },
+ "0xFF10EF": {
+ "label": "Custom3",
+ "pos": "10x1",
+ "cmnt": "Twinklefox",
+ "cmd": "CY=0&FX=80"
+ },
+ "0xFF906F": {
+ "label": "Custom4",
+ "pos": "10x2",
+ "cmnt": "Twinklecat",
+ "cmd": "CY=0&FX=81"
+ },
+ "0xFF50AF": {
+ "label": "Music -",
+ "pos": "10x3",
+ "cmnt": "FX Intesity -16",
+ "cmd": "IX=~-16"
+ },
+ "0xFFD02F": {
+ "label": "Timer120",
+ "pos": "10x4",
+ "cmnt": "Timer 120 min",
+ "cmd": "NL=120&NT=0"
+ }
+}
\ No newline at end of file
diff --git a/usermods/JSON_IR_remote/40-key-blue_ir.json b/usermods/JSON_IR_remote/40-key-blue_ir.json
new file mode 100644
index 000000000..ed25d7781
--- /dev/null
+++ b/usermods/JSON_IR_remote/40-key-blue_ir.json
@@ -0,0 +1,217 @@
+{
+ "desc": "40-key-blue",
+ "0xFF3AC5": {
+ "label": "Bright +",
+ "pos": "1x1",
+ "cmd": "A=~16"
+ },
+ "0xFFBA45": {
+ "label": "Bright -",
+ "pos": "1x2",
+ "cmd": "A=~-16"
+ },
+ "0xFF827D": {
+ "label": "Off",
+ "pos": "1x3",
+ "cmd": "T=0"
+ },
+ "0xFF02FD": {
+ "label": "On",
+ "pos": "1x4",
+ "cmd": "T=1"
+ },
+ "0xFF1AE5": {
+ "label": "Red",
+ "pos": "2x1",
+ "cmnt": "Lava",
+ "cmd": "FP=8"
+ },
+ "0xFF9A65": {
+ "label": "Green",
+ "pos": "2x2",
+ "cmnt": "Forest",
+ "cmd": "FP=10"
+ },
+ "0xFFA25D": {
+ "label": "Blue",
+ "pos": "2x3",
+ "cmnt": "Breeze",
+ "cmd": "FP=15"
+ },
+ "0xFF22DD": {
+ "label": "White",
+ "pos": "2x4",
+ "cmd": "FP=5&CL=hFFFFFF&C2=hFFFFFF&C3=hA8A8A8"
+ },
+ "0xFF2AD5": {
+ "label": "Tomato",
+ "pos": "3x1",
+ "cmnt": "Yelmag",
+ "cmd": "FP=5&CL=hFF6347&C2=hFFBF47&C3=hA85859"
+ },
+ "0xFFAA55": {
+ "label": "LightGreen",
+ "pos": "3x2",
+ "cmnt": "Rivendale",
+ "cmd": "FP=14"
+ },
+ "0xFF926D": {
+ "label": "SkyBlue",
+ "pos": "3x3",
+ "cmnt": "Ocean",
+ "cmd": "FP=9"
+ },
+ "0xFF12ED": {
+ "label": "WarmWhite",
+ "pos": "3x4",
+ "cmnt": "Warm White",
+ "cmd": "FP=5&CL=hFFE4CD&C2=hFFFCCD&C3=hA89892"
+ },
+ "0xFF0AF5": {
+ "label": "OrangeRed",
+ "pos": "4x1",
+ "cmnt": "Sakura",
+ "cmd": "FP=49"
+ },
+ "0xFF8A75": {
+ "label": "Cyan",
+ "pos": "4x2",
+ "cmnt": "Beech",
+ "cmd": "FP=22"
+ },
+ "0xFFB24D": {
+ "label": "RebeccaPurple",
+ "pos": "4x3",
+ "cmd": "FP=5&CL=h663399&C2=h993399&C3=h473864"
+ },
+ "0xFF32CD": {
+ "label": "CoolWhite",
+ "pos": "4x4",
+ "cmnt": "Cool White",
+ "cmd": "FP=5&CL=hE4E4FF&C2=hF1E4FF&C3=h9C9EA8"
+ },
+ "0xFF38C7": {
+ "label": "Orange",
+ "pos": "5x1",
+ "cmnt": "Orangery",
+ "cmd": "FP=47"
+ },
+ "0xFFB847": {
+ "label": "Turquoise",
+ "pos": "5x2",
+ "cmd": "FP=5&CL=h40E0D0&C2=h40A0E0&C3=h4E9381"
+ },
+ "0xFF7887": {
+ "label": "Purple",
+ "pos": "5x3",
+ "cmd": "FP=5&CL=h800080&C2=h800040&C3=h4B1C54"
+ },
+ "0xFFF807": {
+ "label": "MedGray",
+ "pos": "5x4",
+ "cmnt": "Cycle palette +",
+ "cmd": "FP=~"
+ },
+ "0xFF18E7": {
+ "label": "Yellow",
+ "pos": "6x1",
+ "cmd": "FP=5&CL=hFFFF00&C2=h7FFF00&C3=hA89539"
+ },
+ "0xFF9867": {
+ "label": "DarkCyan",
+ "pos": "6x2",
+ "cmd": "FP=5&CL=h8B8B&C2=h458B&C3=h1F5B51"
+ },
+ "0xFF58A7": {
+ "label": "Plum",
+ "pos": "6x3",
+ "cmnt": "Magenta",
+ "cmd": "FP=40"
+ },
+ "0xFFD827": {
+ "label": "DarkGray",
+ "pos": "6x4",
+ "cmnt": "Cycle palette -",
+ "cmd": "FP=~-"
+ },
+ "0xFF28D7": {
+ "label": "W +",
+ "pos": "7x1"
+ },
+ "0xFFA857": {
+ "label": "W -",
+ "pos": "7x2"
+ },
+ "0xFF6897": {
+ "label": "W On",
+ "pos": "7x3"
+ },
+ "0xFFE817": {
+ "label": "W Off",
+ "pos": "7x4"
+ },
+ "0xFF08F7": {
+ "label": "W25",
+ "pos": "8x1"
+ },
+ "0xFF8877": {
+ "label": "W50",
+ "pos": "8x2"
+ },
+ "0xFF48B7": {
+ "label": "W75",
+ "pos": "8x3"
+ },
+ "0xFFC837": {
+ "label": "W100",
+ "pos": "8x4"
+ },
+ "0xFF30CF": {
+ "label": "Jump3",
+ "pos": "9x1",
+ "cmnt": "Colortwinkles",
+ "cmd": "CY=0&FX=74"
+ },
+ "0xFFB04F": {
+ "label": "Fade3",
+ "pos": "9x2",
+ "cmnt": "Rain",
+ "cmd": "CY=0&FX=43"
+ },
+ "0xFF708F": {
+ "label": "Jump7",
+ "pos": "9x3",
+ "cmnt": "Sinelon Dual",
+ "cmd": "CY=0&FX=93"
+ },
+ "0xFFF00F": {
+ "label": "Quick",
+ "pos": "9x4",
+ "cmnt": "Fx speed +16",
+ "cmd": "SX=~16"
+ },
+ "0xFF10EF": {
+ "label": "Fade",
+ "pos": "10x1",
+ "cmnt": "Lighthouse",
+ "cmd": "CY=0&FX=41"
+ },
+ "0xFF906F": {
+ "label": "Flash",
+ "pos": "10x2",
+ "cmnt": "Cycle Effects",
+ "cmd": "CY=0&FX=~"
+ },
+ "0xFF50AF": {
+ "label": "Auto",
+ "pos": "10x3",
+ "cmnt": "Toggle preset cycle",
+ "cmd": "CY=2"
+ },
+ "0xFFD02F": {
+ "label": "Slow",
+ "pos": "10x4",
+ "cmnt": "Sinelon Dual",
+ "cmd": "CY=0&FX=93"
+ }
+}
\ No newline at end of file
diff --git a/usermods/JSON_IR_remote/44-key_ir.json b/usermods/JSON_IR_remote/44-key_ir.json
new file mode 100644
index 000000000..bd78e766f
--- /dev/null
+++ b/usermods/JSON_IR_remote/44-key_ir.json
@@ -0,0 +1,241 @@
+{
+ "desc": "44-key",
+ "0xFF3AC5": {
+ "label": "Bright +",
+ "pos": "1x1",
+ "cmd": "A=~16"
+ },
+ "0xFFBA45": {
+ "label": "Bright -",
+ "pos": "1x2",
+ "cmd": "A=~-16"
+ },
+ "0xFF827D": {
+ "label": "Off",
+ "pos": "1x3",
+ "cmd": "T=0"
+ },
+ "0xFF02FD": {
+ "label": "On",
+ "pos": "1x4",
+ "cmd": "T=1"
+ },
+ "0xFF1AE5": {
+ "label": "Red",
+ "pos": "2x1",
+ "cmnt": "Lava",
+ "cmd": "FP=8"
+ },
+ "0xFF9A65": {
+ "label": "Green",
+ "pos": "2x2",
+ "cmnt": "Forest",
+ "cmd": "FP=10"
+ },
+ "0xFFA25D": {
+ "label": "Blue",
+ "pos": "2x3",
+ "cmnt": "Breeze",
+ "cmd": "FP=15"
+ },
+ "0xFF22DD": {
+ "label": "White",
+ "pos": "2x4",
+ "cmd": "FP=5&CL=hFFFFFF&C2=hFFFFFF&C3=hA8A8A8"
+ },
+ "0xFF2AD5": {
+ "label": "Tomato",
+ "pos": "3x1",
+ "cmd": "FP=5&CL=hFF6347&C2=hFFBF47&C3=hA85859"
+ },
+ "0xFFAA55": {
+ "label": "LightGreen",
+ "pos": "3x2",
+ "cmnt": "Rivendale",
+ "cmd": "FP=14"
+ },
+ "0xFF926D": {
+ "label": "DeepBlue",
+ "pos": "3x3",
+ "cmnt": "Ocean",
+ "cmd": "FP=9"
+ },
+ "0xFF12ED": {
+ "label": "Warmwhite2",
+ "pos": "3x4",
+ "cmnt": "Warm White",
+ "cmd": "FP=5&CL=hFFE4CD&C2=hFFFCCD&C3=hA89892"
+ },
+ "0xFF0AF5": {
+ "label": "Orange",
+ "pos": "4x1",
+ "cmnt": "Sakura",
+ "cmd": "FP=49"
+ },
+ "0xFF8A75": {
+ "label": "Turquoise",
+ "pos": "4x2",
+ "cmnt": "Beech",
+ "cmd": "FP=22"
+ },
+ "0xFFB24D": {
+ "label": "Purple",
+ "pos": "4x3",
+ "cmd": "FP=5&CL=h663399&C2=h993399&C3=h473864"
+ },
+ "0xFF32CD": {
+ "label": "WarmWhite",
+ "pos": "4x4",
+ "cmd": "FP=5&CL=hE4E4FF&C2=hF1E4FF&C3=h9C9EA8"
+ },
+ "0xFF38C7": {
+ "label": "Yellowish",
+ "pos": "5x1",
+ "cmnt": "Orangery",
+ "cmd": "FP=47"
+ },
+ "0xFFB847": {
+ "label": "Cyan",
+ "pos": "5x2",
+ "cmnt": "Beech",
+ "cmd": "FP=22"
+ },
+ "0xFF7887": {
+ "label": "Magenta",
+ "pos": "5x3",
+ "cmd": "FP=5&CL=hFF00FF&C2=hFF007F&C3=h9539A8"
+ },
+ "0xFFF807": {
+ "label": "ColdWhite",
+ "pos": "5x4",
+ "cmd": "FP=5&CL=hE4E4FF&C2=hF1E4FF&C3=h9C9EA8"
+ },
+ "0xFF18E7": {
+ "label": "Yellow",
+ "pos": "6x1",
+ "cmd": "FP=5&CL=hFFFF00&C2=hFFC800&C3=hFDFFDE"
+ },
+ "0xFF9867": {
+ "label": "Aqua",
+ "pos": "6x2",
+ "cmd": "FP=5&CL=hFFFF&C2=h7FFF&C3=h39A895"
+ },
+ "0xFF58A7": {
+ "label": "Pink",
+ "pos": "6x3",
+ "cmd": "FP=5&CL=hFFC0CB&C2=hFFD4C0&C3=hA88C96"
+ },
+ "0xFFD827": {
+ "label": "ColdWhite2",
+ "pos": "6x4",
+ "cmd": "FP=5&CL=hE4E4FF&C2=hF1E4FF&C3=h9C9EA8"
+ },
+ "0xFF28D7": {
+ "label": "Red +",
+ "pos": "7x1",
+ "cmd": "FP=5&R=~16"
+ },
+ "0xFFA857": {
+ "label": "Green +",
+ "pos": "7x2",
+ "cmd": "FP=5&G=~16"
+ },
+ "0xFF6897": {
+ "label": "Blue +",
+ "pos": "7x3",
+ "cmd": "FP=5&B=~16"
+ },
+ "0xFFE817": {
+ "label": "Quick",
+ "pos": "7x4",
+ "cmnt": "Fx speed +16",
+ "cmd": "SX=~16"
+ },
+ "0xFF08F7": {
+ "label": "Red -",
+ "pos": "8x1",
+ "cmd": "FP=5&R=~-16"
+ },
+ "0xFF8877": {
+ "label": "Green -",
+ "pos": "8x2",
+ "cmd": "FP=5&G=~-16"
+ },
+ "0xFF48B7": {
+ "label": "Blue -",
+ "pos": "8x3",
+ "cmd": "FP=5&B=~-16"
+ },
+ "0xFFC837": {
+ "label": "Slow",
+ "pos": "8x4",
+ "cmnt": "FX speed -16",
+ "cmd": "SX=~-16"
+ },
+ "0xFF30CF": {
+ "label": "Diy1",
+ "pos": "9x1",
+ "cmd": "CY=0&PL=1"
+ },
+ "0xFFB04F": {
+ "label": "Diy2",
+ "pos": "9x2",
+ "cmd": "CY=0&PL=2"
+ },
+ "0xFF708F": {
+ "label": "Diy3",
+ "pos": "9x3",
+ "cmd": "CY=0&PL=3"
+ },
+ "0xFFF00F": {
+ "label": "Auto",
+ "pos": "9x4",
+ "cmnt": "Toggle preset cycle",
+ "cmd": "CY=2"
+ },
+ "0xFF10EF": {
+ "label": "Diy4",
+ "pos": "10x1",
+ "cmd": "CY=0&PL=4"
+ },
+ "0xFF906F": {
+ "label": "Diy5",
+ "pos": "10x2",
+ "cmd": "CY=0&PL=5"
+ },
+ "0xFF50AF": {
+ "label": "Diy6",
+ "pos": "10x3",
+ "cmd": "CY=0&PL=6"
+ },
+ "0xFFD02F": {
+ "label": "Flash",
+ "pos": "10x4",
+ "cmnt": "Cycle Effects",
+ "cmd": "CY=0&FX=~"
+ },
+ "0xFF20DF": {
+ "label": "Jump3",
+ "pos": "11x1",
+ "cmnt": "Colortwinkles",
+ "cmd": "CY=0&FX=74"
+ },
+ "0xFFA05F": {
+ "label": "Jump7",
+ "pos": "11x2",
+ "cmnt": "Sinelon Dual",
+ "cmd": "CY=0&FX=93"
+ },
+ "0xFF609F": {
+ "label": "Fade3",
+ "pos": "11x3",
+ "cmnt": "Rain",
+ "cmd": "CY=0&FX=43"
+ },
+ "0xFFE01F": {
+ "label": "Fade7",
+ "pos": "11x4",
+ "cmnt": "Lighthouse",
+ "cmd": "CY=0&FX=41"
+ }
+}
\ No newline at end of file
diff --git a/usermods/JSON_IR_remote/6-key_ir.json b/usermods/JSON_IR_remote/6-key_ir.json
new file mode 100644
index 000000000..d4960a4b7
--- /dev/null
+++ b/usermods/JSON_IR_remote/6-key_ir.json
@@ -0,0 +1,38 @@
+{
+ "desc": "6-key",
+ "0xFF0FF0": {
+ "label": "Power",
+ "pos": "1x1",
+ "cmd": "T=2"
+ },
+ "0xFF8F70": {
+ "label": "Channel +",
+ "pos": "2x1",
+ "cmnt": "Cycle palette up",
+ "cmd": "FP=~"
+ },
+ "0xFF4FB0": {
+ "label": "Channel -",
+ "pos": "3x1",
+ "cmnt": "Cycle palette down",
+ "cmd": "FP=~-"
+ },
+ "0xFFCF30": {
+ "label": "Volume +",
+ "pos": "4x1",
+ "cmnt": "Brighten",
+ "cmd": "A=~16"
+ },
+ "0xFF2FD0": {
+ "label": "Volume -",
+ "pos": "5x1",
+ "cmnt": "Dim",
+ "cmd": "A=~-16"
+ },
+ "0xFFAF50": {
+ "label": "Mute",
+ "pos": "6x1",
+ "cmnt": "Cycle effects",
+ "cmd": "CY=0&FX=~"
+ }
+}
\ No newline at end of file
diff --git a/usermods/JSON_IR_remote/9-key_ir.json b/usermods/JSON_IR_remote/9-key_ir.json
new file mode 100644
index 000000000..f0bdd8f36
--- /dev/null
+++ b/usermods/JSON_IR_remote/9-key_ir.json
@@ -0,0 +1,47 @@
+{
+ "desc": "9-key",
+ "0xFF629D": {
+ "label": "Power",
+ "cmd": "T=2"
+ },
+ "0xFF22DD": {
+ "label": "A",
+ "cmnt": "Preset 1",
+ "cmd": "PL=1"
+ },
+ "0xFF02FD": {
+ "label": "B",
+ "cmnt": "Preset 2",
+ "cmd": "PL=2"
+ },
+ "0xFFC23D": {
+ "label": "C",
+ "cmnt": "Preset 3",
+ "cmd": "PL=3"
+ },
+ "0xFF30CF": {
+ "label": "Left",
+ "cmnt": "Speed -",
+ "cmd": "SI=~-16"
+ },
+ "0xFF7A85": {
+ "label": "Right",
+ "cmnt": "Speed +",
+ "cmd": "SI=~16"
+ },
+ "0xFF9867": {
+ "label": "Up",
+ "cmnt": "Bright +",
+ "cmd": "A=~16"
+ },
+ "0xFF38C7": {
+ "label": "Down",
+ "cmnt": "Bright -",
+ "cmd": "A=~-16"
+ },
+ "0xFF18E7": {
+ "label": "Select",
+ "cmnt": "Cycle effects",
+ "cmd": "CY=0&FX=~"
+ }
+}
\ No newline at end of file
diff --git a/usermods/JSON_IR_remote/IR_Remote_Codes.xlsx b/usermods/JSON_IR_remote/IR_Remote_Codes.xlsx
new file mode 100644
index 000000000..b1f99d3ac
Binary files /dev/null and b/usermods/JSON_IR_remote/IR_Remote_Codes.xlsx differ
diff --git a/usermods/JSON_IR_remote/ir_json_maker.py b/usermods/JSON_IR_remote/ir_json_maker.py
new file mode 100644
index 000000000..a6adcc8cd
--- /dev/null
+++ b/usermods/JSON_IR_remote/ir_json_maker.py
@@ -0,0 +1,108 @@
+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)
diff --git a/usermods/JSON_IR_remote/readme.md b/usermods/JSON_IR_remote/readme.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/wled00/data/settings_sync.htm b/wled00/data/settings_sync.htm
index 6022d56ef..b664f693b 100644
--- a/wled00/data/settings_sync.htm
+++ b/wled00/data/settings_sync.htm
@@ -34,6 +34,7 @@ Infrared remote:
+
IR info