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 00000000..cc71b14d --- /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 00000000..48be10b9 --- /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 00000000..f58c7795 --- /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 00000000..71262b12 --- /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 00000000..ed25d778 --- /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 00000000..bd78e766 --- /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 00000000..d4960a4b --- /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 00000000..f0bdd8f3 --- /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 00000000..b1f99d3a 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 00000000..a6adcc8c --- /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 00000000..ee18aa94 --- /dev/null +++ b/usermods/JSON_IR_remote/readme.md @@ -0,0 +1,33 @@ +# JSON IR remote + +## Purpose + +The JSON IR remote allows users to customize IR remote behavior without writing custom code and compiling. +It also enables using any remote that is compatible with your IR receiver. Using the JSON IR remote, you can +map buttons from any remote to any HTTP request API or JSON API command. + +## Usage + +* Upload the IR config file, named _ir.json_ to your board using the [ip address]/edit url. Pick from one of the included files or create your own. +* On the config > LED settings page, set the correct IR pin. +* On the config > Sync Interfaces page, select "JSON Remote" as the Infrared remote. + +## Modification + +* See if there is a json file with the same number of buttons as your remote. Many remotes will have the same internals and emit the same codes but have different labels. +* In the ir.json file, each key will be the hex encoded IR code. +* The "cmd" property will be the HTTP Request API or JSON API to execute when that button is pressed. +* A limited number of c functions are supported (!incBrightness, !decBrightness, !presetFallback) +* When using !presetFallback, include properties PL (preset to load), FX (effect to fall back to) and FP (palette to fall back to) +* If the command is _repeatable_ and does not contain the "~" character, add a "rpt": true property. +* Other properties are ignored, but having a label property may help when editing. + + +Sample: +{ + "0xFF629D": {"cmd": "T=2", "rpt": true, "label": "Toggle on/off"}, // HTTP command + "0xFF9867": {"cmd": "A=~16", "label": "Inc brightness"}, // HTTP command with incrementing + "0xFF38C7": {"cmd": {"bri": 10}, "label": "Dim to 10"}, // JSON command + "0xFF22DD": {"cmd": "!presetFallback", "PL": 1, "FX": 16, "FP": 6, + "label": "Preset 1 or fallback to Saw - Party"}, // c function +} diff --git a/wled00/data/settings_leds.htm b/wled00/data/settings_leds.htm index e771a605..bac853b4 100644 --- a/wled00/data/settings_leds.htm +++ b/wled00/data/settings_leds.htm @@ -350,14 +350,15 @@ Reverse (rotated 180°):
Touch threshold:
IR pin:   ×
IR info
Relay pin: Invert  ×
diff --git a/wled00/fcn_declare.h b/wled00/fcn_declare.h index 405c14f2..ff3fa0e1 100644 --- a/wled00/fcn_declare.h +++ b/wled00/fcn_declare.h @@ -87,6 +87,7 @@ void decodeIR44(uint32_t code); void decodeIR21(uint32_t code); void decodeIR6(uint32_t code); void decodeIR9(uint32_t code); +void decodeIRJson(uint32_t code); void initIR(); void handleIR(); diff --git a/wled00/html_settings.h b/wled00/html_settings.h index 1b6bede1..5a94c336 100644 --- a/wled00/html_settings.h +++ b/wled00/html_settings.h @@ -121,36 +121,36 @@ class="xs" min="-1" max="40" name="IR" onchange="UI()">  × -
IR info
Relay pin: Invert  × -

Defaults

Turn LEDs on after power up/reset: -
Default brightness: (0-255)

Apply preset - - at boot (0 uses defaults)

Use Gamma correction for color: (strongly recommended)
-Use Gamma correction for brightness: - (not recommended)

Brightness factor: %

Transitions

Crossfade:
Transition Time: ms
Enable Palette transitions: JSON remote ×
+IR info
Relay pin: Invert + ×

Defaults

Turn LEDs on after power up/reset:
Default brightness: (0-255)

Apply preset at boot (0 uses defaults) +

Use Gamma correction for color: + (strongly recommended)
Use Gamma correction for brightness: (not recommended)

Brightness factor: %

Transitions

+Crossfade:
Transition Time: ms
Enable Palette transitions:

Timed light

Default Duration: min
-Default Target brightness:
Mode:

Advanced

Palette blending: -
Auto-calculate white channel from RGB:


)====="; +name="TL" type="number" min="1" max="255" required> min
+Default Target brightness:
Mode:

Advanced

Palette blending:
+Auto-calculate white channel from RGB:


)====="; #ifdef WLED_ENABLE_DMX diff --git a/wled00/ir.cpp b/wled00/ir.cpp index 0f0a77ee..ac921fb4 100644 --- a/wled00/ir.cpp +++ b/wled00/ir.cpp @@ -68,6 +68,14 @@ void decBrightness() } } +// apply preset or fallback to a effect and palette if it doesn't exist +void presetFallback(int8_t presetID, int8_t effectID, int8_t paletteID) +{ + if (!applyPreset(presetID)) { + effectCurrent = effectID; + effectPalette = paletteID; + } +} //Add what your custom IR codes should trigger here. Guide: https://github.com/Aircoookie/WLED/wiki/Infrared-Control //IR codes themselves can be defined directly after "case" or in "ir_codes.h" @@ -85,8 +93,6 @@ bool decodeIRCustom(uint32_t code) return true; } - - void relativeChange(byte* property, int8_t amount, byte lowerBoundary, byte higherBoundary) { int16_t new_val = (int16_t) *property + amount; @@ -156,24 +162,28 @@ void decodeIR(uint32_t code) lastValidCode = 0; irTimesRepeated = 0; if (decodeIRCustom(code)) return; if (code > 0xFFFFFF) return; //invalid code - else if (code > 0xF70000 && code < 0xF80000) decodeIR24(code); //is in 24-key remote range - else if (code > 0xFF0000) { - switch (irEnabled) { - case 1: decodeIR24OLD(code); break; // white 24-key remote (old) - it sends 0xFF0000 values - case 2: decodeIR24CT(code); break; // white 24-key remote with CW, WW, CT+ and CT- keys - case 3: decodeIR40(code); break; // blue 40-key remote with 25%, 50%, 75% and 100% keys - case 4: decodeIR44(code); break; // white 44-key remote with color-up/down keys and DIY1 to 6 keys - case 5: decodeIR21(code); break; // white 21-key remote - case 6: decodeIR6(code); break; // black 6-key learning remote defaults: "CH" controls brightness, - // "VOL +" controls effect, "VOL -" controls colour/palette, "MUTE" - // sets bright plain white - case 7: decodeIR9(code); break; - default: return; - } + switch (irEnabled) { + case 1: + if (code > 0xF80000) { + decodeIR24OLD(code); // white 24-key remote (old) - it sends 0xFF0000 values + } else { + decodeIR24(code); // 24-key remote - 0xF70000 to 0xF80000 + } + break; + case 2: decodeIR24CT(code); break; // white 24-key remote with CW, WW, CT+ and CT- keys + case 3: decodeIR40(code); break; // blue 40-key remote with 25%, 50%, 75% and 100% keys + case 4: decodeIR44(code); break; // white 44-key remote with color-up/down keys and DIY1 to 6 keys + case 5: decodeIR21(code); break; // white 21-key remote + case 6: decodeIR6(code); break; // black 6-key learning remote defaults: "CH" controls brightness, + // "VOL +" controls effect, "VOL -" controls colour/palette, "MUTE" + // sets bright plain white + case 7: decodeIR9(code); break; + case 8: decodeIRJson(code); break; // any remote configurable with ir.json file + default: return; } + if (nightlightActive && bri == 0) nightlightActive = false; colorUpdated(NOTIFIER_CALL_MODE_BUTTON); //for notifier, IR is considered a button input - //code <= 0xF70000 also invalid } void applyRepeatActions(){ @@ -219,9 +229,12 @@ void applyRepeatActions(){ nightlightStartTime = millis(); colorUpdated(NOTIFIER_CALL_MODE_BUTTON); } + else if (irEnabled == 8) + { + decodeIRJson(lastValidCode); + } } - void decodeIR24(uint32_t code) { switch (code) { @@ -286,7 +299,6 @@ void decodeIR24OLD(uint32_t code) lastValidCode = code; } - void decodeIR24CT(uint32_t code) { switch (code) { @@ -321,7 +333,6 @@ void decodeIR24CT(uint32_t code) lastValidCode = code; } - void decodeIR40(uint32_t code) { switch (code) { @@ -522,6 +533,87 @@ void decodeIR9(uint32_t code) lastValidCode = code; } + +/* +This allows users to customize IR actions without the need to edit C code and compile. +From the https://github.com/Aircoookie/WLED/wiki/Infrared-Control page, download the starter +ir.json file that corresponds to the number of buttons on your remote. +Many of the remotes with the same number of buttons emit the same codes, but will have +different labels or colors. Once you edit the ir.json file, upload it to your controller +using the /edit page. + +Each key should be the hex encoded IR code. The "cmd" property should be the HTTP API +or JSON API command to execute on button press. If the command contains a relative change (SI=~16), +it will register as a repeatable command. If the command doesn't contain a "~" but is repeatable, add "rpt" property +set to true. Other properties are ignored but having labels and positions can assist with editing +the json file. + +Sample: +{ + "0xFF629D": {"cmd": "T=2", "rpt": true, "label": "Toggle on/off"}, // HTTP command + "0xFF9867": {"cmd": "A=~16", "label": "Inc brightness"}, // HTTP command with incrementing + "0xFF38C7": {"cmd": {"bri": 10}, "label": "Dim to 10"}, // JSON command + "0xFF22DD": {"cmd": "!presetFallback", "PL": 1, "FX": 16, "FP": 6, // Custom command + "label": "Preset 1, fallback to Saw - Party if not found"}, +} +*/ +void decodeIRJson(uint32_t code) +{ + char objKey[10]; + const char* cmd; + String cmdStr; + DynamicJsonDocument irDoc(JSON_BUFFER_SIZE); + JsonObject fdo; + JsonObject jsonCmdObj; + + sprintf(objKey, "\"0x%X\":", code); + + errorFlag = readObjectFromFile("/ir.json", objKey, &irDoc) ? ERR_NONE : ERR_FS_PLOAD; + fdo = irDoc.as(); + lastValidCode = 0; + if (!errorFlag) + { + cmd = fdo["cmd"]; + cmdStr = String(cmd); + jsonCmdObj = fdo["cmd"]; + if (!cmdStr.isEmpty()) + { + if (cmdStr.startsWith("!")) { + // call limited set of C functions + if (cmdStr == "!incBrightness") { + lastValidCode = code; + incBrightness(); + } else if (cmdStr == "!decBrightness") { + lastValidCode = code; + decBrightness(); + } else if (cmdStr == "!presetFallback") { + uint8_t p1 = fdo["PL"] ? fdo["PL"] : 1; + uint8_t p2 = fdo["FX"] ? fdo["FX"] : random8(100); + uint8_t p3 = fdo["FP"] ? fdo["FP"] : 0; + presetFallback(p1, p2, p3); + } + } else { + // HTTP API command + if (cmdStr.indexOf("~") || fdo["rpt"]) + { + // repeatable action + lastValidCode = code; + } if (effectCurrent == 0 && cmdStr.indexOf("FP=") > -1) { + // setting palette but it wont show because effect is solid + effectCurrent = FX_MODE_GRADIENT; + } + if (!cmdStr.startsWith("win&")) { + cmdStr = "win&" + cmdStr; + } + handleSet(nullptr, cmdStr, false); + } + } else if (!jsonCmdObj.isNull()) { + // command is JSON object + deserializeState(jsonCmdObj); + } + } +} + void initIR() { if (irEnabled > 0) @@ -531,7 +623,6 @@ void initIR() } } - void handleIR() { if (irEnabled > 0 && millis() - irCheckedTime > 120)