{
  "proto": "broadcast",
  "keyBytes": [
    0,
    1
  ],
  "ocpSpecific": true,
  "messageType": "request",
  "shortName": "Set[item]",
  "name": "Set Config Item (IntelliCenter)",
  "desc": "Set a configuration item on the IntelliCenter OCP. The first byte identifies the configuration category, second byte the sub-item, and third byte typically the item index (0-based). v3.004+: Wireless sends full options block for type 0, with setpoint offsets shifted +1 compared to Action 30. v3.004+: For circuit control, prefer Action 184 (indexed) over Action 168 case 15 to avoid state reversion.",
  "payload": [
    {
      "start": 0,
      "length": 1,
      "name": "Config Category",
      "desc": "The configuration category for the item being set.",
      "dataType": "byte",
      "values": {
        "0": "Options (temp calibration, clock, delays, body heat)",
        "1": "Circuits",
        "2": "Features",
        "3": "Schedules",
        "4": "Pumps",
        "5": "Remotes",
        "6": "Circuit/Light Groups",
        "7": "Chlorinators",
        "8": "IntelliChem Controllers",
        "9": "Valves",
        "10": "Heaters",
        "11": "Security",
        "12": "General (alias, owner, location)",
        "13": "Bodies/Equipment",
        "14": "Covers",
        "15": "System State (circuit states)"
      }
    },
    {
      "start": 1,
      "length": 1,
      "name": "Sub-Item",
      "desc": "The sub-item within the category. Meaning varies by category.",
      "dataType": "byte"
    },
    {
      "start": 2,
      "length": 1,
      "name": "Item Index",
      "desc": "The 0-based index of the item being configured (e.g., circuit id - 1).",
      "dataType": "byte"
    }
  ],
  "payloadKeys": {
    "0_0": {
      "shortName": "Set[options]",
      "name": "Set Options/Body Heat Settings",
      "desc": "Sets options configuration including temp sensor calibration, clock settings, delays, and body heat setpoints. Byte 2 identifies specific option item. v3.004+ WARNING: When received from Wireless (Action 168 type 0), body setpoint/mode offsets are shifted +1 compared to Action 30 type 0 due to an extra byte in early positions. v3 offsets: poolSetpoint=20, poolCool=21, spaSetpoint=22, spaCool=23, poolMode=24, spaMode=25 (vs Action 30: 19, 20, 21, 22, 23, 24).",
      "payload": [
        {
          "start": 0,
          "length": 1,
          "name": "Category",
          "desc": "Options category = 0",
          "dataType": "byte",
          "values": {
            "0": "Options"
          }
        },
        {
          "start": 1,
          "length": 1,
          "name": "Sub-Item",
          "desc": "Always 0 for options",
          "dataType": "byte"
        },
        {
          "start": 2,
          "length": 1,
          "name": "Option Item",
          "desc": "Identifies which option is being set",
          "dataType": "byte",
          "values": {
            "1": "Water Temp Calibration 1 (byte 4)",
            "2": "Solar Temp Calibration 1 (byte 5)",
            "3": "Air Temp Calibration (byte 6)",
            "4": "Water Temp Calibration 2 (byte 7)",
            "5": "Solar Temp Calibration 2 (byte 8)",
            "6": "Water Temp Calibration 3 (byte 9)",
            "7": "Solar Temp Calibration 3 (byte 10)",
            "8": "Water Temp Calibration 4 (byte 11) / Solar Temp Calibration 4 (byte 12)",
            "11": "Clock Mode/DST (byte 14) / Clock Source (byte 17)",
            "22": "Body 1 Heat Mode (via heat settings payload)",
            "23": "Body 2 Heat Mode (via heat settings payload)",
            "27": "Pump Delay (byte 30)",
            "28": "Cooldown Delay (byte 31)",
            "36": "Manual Priority (byte 39)",
            "37": "Manual Heat (byte 40)"
          }
        },
        {
          "start": 3,
          "length": 1,
          "name": "Unknown",
          "desc": "Usually 1",
          "dataType": "byte"
        },
        {
          "start": 4,
          "length": 1,
          "name": "Water Temp Adj 1",
          "desc": "Water temp sensor 1 calibration. Signed: bit 7 = negative, bits 0-6 = magnitude",
          "dataType": "byte"
        },
        {
          "start": 5,
          "length": 1,
          "name": "Solar Temp Adj 1",
          "desc": "Solar temp sensor 1 calibration. Signed byte.",
          "dataType": "byte"
        },
        {
          "start": 6,
          "length": 1,
          "name": "Air Temp Adj",
          "desc": "Air temp sensor calibration. Signed byte.",
          "dataType": "byte"
        },
        {
          "start": 7,
          "length": 1,
          "name": "Water Temp Adj 2",
          "desc": "Water temp sensor 2 calibration. Signed byte.",
          "dataType": "byte"
        },
        {
          "start": 8,
          "length": 1,
          "name": "Solar Temp Adj 2",
          "desc": "Solar temp sensor 2 calibration. Signed byte.",
          "dataType": "byte"
        },
        {
          "start": 9,
          "length": 1,
          "name": "Water Temp Adj 3",
          "desc": "Water temp sensor 3 calibration. Signed byte.",
          "dataType": "byte"
        },
        {
          "start": 10,
          "length": 1,
          "name": "Solar Temp Adj 3",
          "desc": "Solar temp sensor 3 calibration. Signed byte.",
          "dataType": "byte"
        },
        {
          "start": 11,
          "length": 1,
          "name": "Water Temp Adj 4",
          "desc": "Water temp sensor 4 calibration. Signed byte.",
          "dataType": "byte"
        },
        {
          "start": 12,
          "length": 1,
          "name": "Solar Temp Adj 4",
          "desc": "Solar temp sensor 4 calibration. Signed byte.",
          "dataType": "byte"
        },
        {
          "start": 13,
          "length": 1,
          "name": "Unknown",
          "desc": "Reserved/Unknown",
          "dataType": "byte"
        },
        {
          "start": 14,
          "length": 1,
          "name": "Clock Settings",
          "desc": "Clock mode and DST settings",
          "dataType": "bits",
          "values": "Bit 4-5=0x30 always set, Bit 6=24hr mode, Bit 7=Adjust DST, Bit 5=Internet clock source"
        },
        {
          "start": 17,
          "length": 1,
          "name": "Clock Source",
          "desc": "Clock source setting",
          "dataType": "byte",
          "values": {
            "0": "Manual",
            "1": "Internet"
          }
        },
        {
          "start": 21,
          "length": 1,
          "name": "Body 1 Heat Setpoint",
          "desc": "Pool/Body 1 heat setpoint temperature",
          "dataType": "byte"
        },
        {
          "start": 22,
          "length": 1,
          "name": "Body 1 Cool Setpoint",
          "desc": "Pool/Body 1 cool setpoint temperature",
          "dataType": "byte"
        },
        {
          "start": 23,
          "length": 1,
          "name": "Body 2 Heat Setpoint",
          "desc": "Spa/Body 2 heat setpoint temperature",
          "dataType": "byte"
        },
        {
          "start": 24,
          "length": 1,
          "name": "Body 2 Cool Setpoint",
          "desc": "Spa/Body 2 cool setpoint temperature",
          "dataType": "byte"
        },
        {
          "start": 25,
          "length": 1,
          "name": "Body 1 Heat Mode",
          "desc": "Pool/Body 1 heat mode",
          "dataType": "byte",
          "values": {
            "1": "Off",
            "2": "Heater",
            "3": "Solar Pref",
            "4": "Solar Only"
          }
        },
        {
          "start": 26,
          "length": 1,
          "name": "Body 2 Heat Mode",
          "desc": "Spa/Body 2 heat mode",
          "dataType": "byte"
        },
        {
          "start": 30,
          "length": 1,
          "name": "Pump Delay",
          "desc": "Pump delay enabled",
          "dataType": "byte",
          "values": {
            "0": "Disabled",
            "1": "Enabled"
          }
        },
        {
          "start": 31,
          "length": 1,
          "name": "Cooldown Delay",
          "desc": "Cooldown delay enabled",
          "dataType": "byte",
          "values": {
            "0": "Disabled",
            "1": "Enabled"
          }
        },
        {
          "start": 39,
          "length": 1,
          "name": "Manual Priority",
          "desc": "Manual operation takes priority over schedules",
          "dataType": "byte",
          "values": {
            "0": "Disabled",
            "1": "Enabled"
          }
        },
        {
          "start": 40,
          "length": 1,
          "name": "Manual Heat",
          "desc": "Manual heat control enabled",
          "dataType": "byte",
          "values": {
            "0": "Disabled",
            "1": "Enabled"
          }
        }
      ]
    },
    "1_0": {
      "shortName": "Set[circuit]",
      "name": "Set Circuit Configuration",
      "desc": "Sets circuit configuration including type, freeze protection, egg timer, and name.",
      "payload": [
        {
          "start": 0,
          "length": 1,
          "name": "Category",
          "desc": "Circuits category = 1",
          "dataType": "byte",
          "values": {
            "1": "Circuits"
          }
        },
        {
          "start": 1,
          "length": 1,
          "name": "Sub-Item",
          "desc": "Always 0 for circuit config",
          "dataType": "byte"
        },
        {
          "start": 2,
          "length": 1,
          "name": "Circuit Index",
          "desc": "Circuit ID - 1 (0-based index)",
          "dataType": "byte"
        },
        {
          "start": 3,
          "length": 1,
          "name": "Circuit Type",
          "desc": "Circuit function type",
          "dataType": "byte",
          "values": "See circuitFunctions valueMap"
        },
        {
          "start": 4,
          "length": 1,
          "name": "Freeze Protection",
          "desc": "Freeze protection enabled for this circuit",
          "dataType": "byte",
          "values": {
            "0": "Disabled",
            "1": "Enabled"
          }
        },
        {
          "start": 5,
          "length": 1,
          "name": "Show In Features",
          "desc": "Show this circuit in features list",
          "dataType": "byte",
          "values": {
            "0": "No",
            "1": "Yes"
          }
        },
        {
          "start": 6,
          "length": 1,
          "name": "Theme/Level",
          "desc": "Light theme for light circuits, dimmer level for dimmers (type 9)",
          "dataType": "byte"
        },
        {
          "start": 7,
          "length": 1,
          "name": "Egg Timer Hours",
          "desc": "Hours portion of egg timer (0-24)",
          "dataType": "byte"
        },
        {
          "start": 8,
          "length": 1,
          "name": "Egg Timer Minutes",
          "desc": "Minutes portion of egg timer (0-59)",
          "dataType": "byte"
        },
        {
          "start": 9,
          "length": 1,
          "name": "Don't Stop",
          "desc": "Circuit runs indefinitely (egg timer = 1440 mins)",
          "dataType": "byte",
          "values": {
            "0": "Uses egg timer",
            "1": "Don't stop"
          }
        },
        {
          "start": 10,
          "length": 16,
          "name": "Circuit Name",
          "desc": "Circuit name (16 byte string, null padded)",
          "dataType": "string"
        }
      ]
    },
    "2_0": {
      "shortName": "Set[feature]",
      "name": "Set Feature Configuration",
      "desc": "Sets feature configuration including type, freeze protection, egg timer, and name.",
      "payload": [
        {
          "start": 0,
          "length": 1,
          "name": "Category",
          "desc": "Features category = 2",
          "dataType": "byte",
          "values": {
            "2": "Features"
          }
        },
        {
          "start": 1,
          "length": 1,
          "name": "Sub-Item",
          "desc": "Always 0 for feature config",
          "dataType": "byte"
        },
        {
          "start": 2,
          "length": 1,
          "name": "Feature Index",
          "desc": "Feature ID - features.start (0-based index)",
          "dataType": "byte"
        },
        {
          "start": 3,
          "length": 1,
          "name": "Feature Type",
          "desc": "Feature function type. Set to 255 to delete.",
          "dataType": "byte"
        },
        {
          "start": 4,
          "length": 1,
          "name": "Freeze Protection",
          "desc": "Freeze protection enabled",
          "dataType": "byte",
          "values": {
            "0": "Disabled",
            "1": "Enabled"
          }
        },
        {
          "start": 5,
          "length": 1,
          "name": "Show In Features",
          "desc": "Show in features list",
          "dataType": "byte",
          "values": {
            "0": "No",
            "1": "Yes"
          }
        },
        {
          "start": 6,
          "length": 1,
          "name": "Egg Timer Hours",
          "desc": "Hours portion of egg timer",
          "dataType": "byte"
        },
        {
          "start": 7,
          "length": 1,
          "name": "Egg Timer Minutes",
          "desc": "Minutes portion of egg timer",
          "dataType": "byte"
        },
        {
          "start": 8,
          "length": 1,
          "name": "Don't Stop",
          "desc": "Feature runs indefinitely",
          "dataType": "byte",
          "values": {
            "0": "Uses egg timer",
            "1": "Don't stop"
          }
        },
        {
          "start": 9,
          "length": 16,
          "name": "Feature Name",
          "desc": "Feature name (16 byte string)",
          "dataType": "string"
        }
      ]
    },
    "3_0": {
      "shortName": "Set[schedule]",
      "name": "Set Schedule Configuration",
      "desc": "Sets or deletes a schedule including start/end times, circuit, days, and heat settings. v3.004+ CRITICAL: 16-bit time values (start/end) use BIG-ENDIAN byte order. v1.x uses LITTLE-ENDIAN.",
      "payload": [
        {
          "start": 0,
          "length": 1,
          "name": "Category",
          "desc": "Schedules category = 3",
          "dataType": "byte",
          "values": {
            "3": "Schedules"
          }
        },
        {
          "start": 1,
          "length": 1,
          "name": "Sub-Item",
          "desc": "Always 0 for schedule config",
          "dataType": "byte"
        },
        {
          "start": 2,
          "length": 1,
          "name": "Schedule Index",
          "desc": "Schedule ID - 1 (0-based, IntelliCenter schedules start at 0)",
          "dataType": "byte"
        },
        {
          "start": 3,
          "length": 2,
          "name": "Start Time",
          "desc": "Start time in minutes from midnight. v1.x: little-endian. v3.004+: BIG-ENDIAN (hi*256+lo). E.g., [2,33] = 545 = 9:05 AM",
          "dataType": "int16"
        },
        {
          "start": 5,
          "length": 2,
          "name": "End Time",
          "desc": "End time in minutes from midnight. v1.x: little-endian. v3.004+: BIG-ENDIAN (hi*256+lo). E.g., 1020 = 5:00 PM",
          "dataType": "int16"
        },
        {
          "start": 7,
          "length": 1,
          "name": "Circuit",
          "desc": "Circuit ID - 1 (0-based index). Set to 255 to delete schedule.",
          "dataType": "byte"
        },
        {
          "start": 8,
          "length": 1,
          "name": "Run Once / Time Types",
          "desc": "Schedule type and time type flags",
          "dataType": "bits",
          "values": "Bit 0=Run once (129) vs Repeating (128), Bits 2-3=Start time type (0=manual, 1=sunrise, 2=sunset), Bits 4-5=End time type"
        },
        {
          "start": 9,
          "length": 1,
          "name": "Schedule Days",
          "desc": "Days of week bitmask for repeating schedules",
          "dataType": "bits",
          "values": "Bit 0=Sunday, Bit 1=Monday, ..., Bit 6=Saturday"
        },
        {
          "start": 10,
          "length": 1,
          "name": "Start Month",
          "desc": "Start date month (1-12)",
          "dataType": "byte"
        },
        {
          "start": 11,
          "length": 1,
          "name": "Start Day",
          "desc": "Start date day of month (1-31)",
          "dataType": "byte"
        },
        {
          "start": 12,
          "length": 1,
          "name": "Start Year",
          "desc": "Start date year - 2000 (e.g., 24 = 2024)",
          "dataType": "byte"
        },
        {
          "start": 13,
          "length": 1,
          "name": "Heat Source",
          "desc": "Heat source for scheduled circuit. 0=No change in fw 1.047+",
          "dataType": "byte",
          "values": {
            "0": "No Change",
            "1": "Off",
            "2": "Heater",
            "3": "Solar Pref",
            "4": "Solar Only"
          }
        },
        {
          "start": 14,
          "length": 1,
          "name": "Heat Setpoint",
          "desc": "Heat setpoint temperature",
          "dataType": "byte"
        },
        {
          "start": 15,
          "length": 1,
          "name": "Cool Setpoint",
          "desc": "Cool setpoint temperature (for UltraTemp)",
          "dataType": "byte"
        }
      ]
    },
    "4_0": {
      "shortName": "Set[pump settings]",
      "name": "Set Pump Settings",
      "desc": "Sets pump configuration including type, address, speed/flow ranges, and circuit assignments.",
      "payload": [
        {
          "start": 0,
          "length": 1,
          "name": "Category",
          "desc": "Pumps category = 4",
          "dataType": "byte",
          "values": {
            "4": "Pumps"
          }
        },
        {
          "start": 1,
          "length": 1,
          "name": "Sub-Item",
          "desc": "0 = Settings, 1 = Name and speeds/flows",
          "dataType": "byte",
          "values": {
            "0": "Settings",
            "1": "Name/Speeds"
          }
        },
        {
          "start": 2,
          "length": 1,
          "name": "Pump Index",
          "desc": "Pump ID - 1 (0-based index)",
          "dataType": "byte"
        },
        {
          "start": 3,
          "length": 1,
          "name": "Pump Type",
          "desc": "Pump type. 0 = delete/no pump",
          "dataType": "byte",
          "values": {
            "0": "None",
            "1": "SS (Single Speed)",
            "2": "DS (Dual Speed)",
            "3": "VS",
            "4": "VSF",
            "5": "VF"
          }
        },
        {
          "start": 4,
          "length": 1,
          "name": "Unknown",
          "desc": "Usually 0",
          "dataType": "byte"
        },
        {
          "start": 5,
          "length": 1,
          "name": "Address",
          "desc": "RS-485 address for VS/VF pumps (96-111 = pump 1-16)",
          "dataType": "byte"
        },
        {
          "start": 6,
          "length": 2,
          "name": "Min Speed",
          "desc": "Minimum speed in RPM (little endian)",
          "dataType": "int16"
        },
        {
          "start": 8,
          "length": 2,
          "name": "Max Speed",
          "desc": "Maximum speed in RPM (little endian)",
          "dataType": "int16"
        },
        {
          "start": 10,
          "length": 1,
          "name": "Min Flow",
          "desc": "Minimum flow in GPM",
          "dataType": "byte"
        },
        {
          "start": 11,
          "length": 1,
          "name": "Max Flow",
          "desc": "Maximum flow in GPM",
          "dataType": "byte"
        },
        {
          "start": 12,
          "length": 1,
          "name": "Flow Step Size",
          "desc": "Flow increment step size",
          "dataType": "byte"
        },
        {
          "start": 13,
          "length": 2,
          "name": "Priming Speed",
          "desc": "Priming speed in RPM (little endian)",
          "dataType": "int16"
        },
        {
          "start": 15,
          "length": 1,
          "name": "Speed Step Size",
          "desc": "Speed step size / 10",
          "dataType": "byte"
        },
        {
          "start": 16,
          "length": 1,
          "name": "Priming Time",
          "desc": "Priming time in minutes",
          "dataType": "byte"
        },
        {
          "start": 17,
          "length": 1,
          "name": "Unknown",
          "desc": "Usually 5 or 255",
          "dataType": "byte"
        },
        {
          "start": 18,
          "length": 8,
          "name": "Circuit Assignments",
          "desc": "Circuit IDs - 1 for each of 8 pump circuits (255 = unassigned)",
          "dataType": "byte[]"
        },
        {
          "start": 26,
          "length": 8,
          "name": "Circuit Units",
          "desc": "Units for each circuit: 0=RPM, 1=GPM",
          "dataType": "byte[]"
        }
      ]
    },
    "4_1": {
      "shortName": "Set[pump name]",
      "name": "Set Pump Name and Speeds",
      "desc": "Sets pump name and speed/flow values for each circuit assignment.",
      "payload": [
        {
          "start": 0,
          "length": 1,
          "name": "Category",
          "desc": "Pumps category = 4",
          "dataType": "byte"
        },
        {
          "start": 1,
          "length": 1,
          "name": "Sub-Item",
          "desc": "1 = Name and speeds",
          "dataType": "byte",
          "values": {
            "1": "Name/Speeds"
          }
        },
        {
          "start": 2,
          "length": 1,
          "name": "Pump Index",
          "desc": "Pump ID - 1",
          "dataType": "byte"
        },
        {
          "start": 3,
          "length": 16,
          "name": "Circuit Speeds/Flows",
          "desc": "8 x 2-byte values (little endian): speed in RPM or flow in GPM for each circuit",
          "dataType": "int16[]"
        },
        {
          "start": 19,
          "length": 16,
          "name": "Pump Name",
          "desc": "Pump name (16 byte string)",
          "dataType": "string"
        }
      ]
    },
    "6_0": {
      "shortName": "Set[group config]",
      "name": "Set Circuit/Light Group Configuration",
      "desc": "Sets circuit group or light group configuration including type, circuits, and egg timer.",
      "payload": [
        {
          "start": 0,
          "length": 1,
          "name": "Category",
          "desc": "Circuit Groups category = 6",
          "dataType": "byte",
          "values": {
            "6": "Circuit/Light Groups"
          }
        },
        {
          "start": 1,
          "length": 1,
          "name": "Sub-Item",
          "desc": "0=Config, 1=Name, 2=Colors/States",
          "dataType": "byte",
          "values": {
            "0": "Config",
            "1": "Name",
            "2": "Colors/Desired States"
          }
        },
        {
          "start": 2,
          "length": 1,
          "name": "Group Index",
          "desc": "Group ID - circuitGroups.start (0-based)",
          "dataType": "byte"
        },
        {
          "start": 3,
          "length": 1,
          "name": "Group Type",
          "desc": "1=Light Group, 2=Circuit Group, 0=Delete",
          "dataType": "byte",
          "values": {
            "0": "Delete",
            "1": "Light Group",
            "2": "Circuit Group"
          }
        },
        {
          "start": 4,
          "length": 1,
          "name": "Theme/Flags",
          "desc": "For light groups: (theme << 2) + 1",
          "dataType": "byte"
        },
        {
          "start": 5,
          "length": 1,
          "name": "Don't Stop",
          "desc": "Should be don't stop flag but may be bugged",
          "dataType": "byte"
        },
        {
          "start": 6,
          "length": 16,
          "name": "Circuit IDs",
          "desc": "16 circuit assignments (circuit ID - 1, 255 = unassigned)",
          "dataType": "byte[]"
        },
        {
          "start": 22,
          "length": 16,
          "name": "Swim Delays",
          "desc": "For light groups: swim delay for each circuit. For circuit groups: all 0s",
          "dataType": "byte[]"
        },
        {
          "start": 38,
          "length": 1,
          "name": "Egg Timer Hours",
          "desc": "Hours portion of egg timer",
          "dataType": "byte"
        },
        {
          "start": 39,
          "length": 1,
          "name": "Egg Timer Minutes",
          "desc": "Minutes portion of egg timer",
          "dataType": "byte"
        }
      ]
    },
    "6_1": {
      "shortName": "Set[group name]",
      "name": "Set Group Name",
      "desc": "Sets the name for a circuit or light group.",
      "payload": [
        {
          "start": 0,
          "length": 1,
          "name": "Category",
          "desc": "Circuit Groups category = 6",
          "dataType": "byte"
        },
        {
          "start": 1,
          "length": 1,
          "name": "Sub-Item",
          "desc": "1 = Name",
          "dataType": "byte",
          "values": {
            "1": "Name"
          }
        },
        {
          "start": 2,
          "length": 1,
          "name": "Group Index",
          "desc": "Group ID - circuitGroups.start",
          "dataType": "byte"
        },
        {
          "start": 3,
          "length": 16,
          "name": "Unknown",
          "desc": "16 bytes, usually 255s. Byte 0 = 10 for light groups",
          "dataType": "byte[]"
        },
        {
          "start": 19,
          "length": 16,
          "name": "Group Name",
          "desc": "Group name (16 byte string)",
          "dataType": "string"
        }
      ]
    },
    "6_2": {
      "shortName": "Set[group colors]",
      "name": "Set Group Colors/Desired States",
      "desc": "Sets colors for light groups or desired states for circuit groups.",
      "payload": [
        {
          "start": 0,
          "length": 1,
          "name": "Category",
          "desc": "Circuit Groups category = 6",
          "dataType": "byte"
        },
        {
          "start": 1,
          "length": 1,
          "name": "Sub-Item",
          "desc": "2 = Colors/States",
          "dataType": "byte",
          "values": {
            "2": "Colors/Desired States"
          }
        },
        {
          "start": 2,
          "length": 1,
          "name": "Group Index",
          "desc": "Group ID - circuitGroups.start",
          "dataType": "byte"
        },
        {
          "start": 3,
          "length": 16,
          "name": "Colors",
          "desc": "Light colors for each of 16 circuits (light groups only)",
          "dataType": "byte[]"
        },
        {
          "start": 19,
          "length": 16,
          "name": "Desired States",
          "desc": "Desired on/off state for each circuit (circuit groups: 1=on, 255=unassigned)",
          "dataType": "byte[]"
        }
      ]
    },
    "7_0": {
      "shortName": "Set[chlorinator]",
      "name": "Set Chlorinator Configuration",
      "desc": "Sets chlorinator configuration including body, setpoints, and super chlorination.",
      "payload": [
        {
          "start": 0,
          "length": 1,
          "name": "Category",
          "desc": "Chlorinators category = 7",
          "dataType": "byte",
          "values": {
            "7": "Chlorinators"
          }
        },
        {
          "start": 1,
          "length": 1,
          "name": "Sub-Item",
          "desc": "Always 0",
          "dataType": "byte"
        },
        {
          "start": 2,
          "length": 1,
          "name": "Chlorinator Index",
          "desc": "Chlorinator ID - 1",
          "dataType": "byte"
        },
        {
          "start": 3,
          "length": 1,
          "name": "Body",
          "desc": "Body assignment",
          "dataType": "byte",
          "values": {
            "0": "Pool",
            "1": "Spa",
            "32": "Pool+Spa"
          }
        },
        {
          "start": 4,
          "length": 1,
          "name": "Enabled",
          "desc": "Chlorinator enabled. 0 = delete/disable",
          "dataType": "byte",
          "values": {
            "0": "Disabled/Delete",
            "1": "Enabled"
          }
        },
        {
          "start": 5,
          "length": 1,
          "name": "Pool Setpoint",
          "desc": "Pool chlorination setpoint percentage (0-100)",
          "dataType": "byte"
        },
        {
          "start": 6,
          "length": 1,
          "name": "Spa Setpoint",
          "desc": "Spa chlorination setpoint percentage (0-100)",
          "dataType": "byte"
        },
        {
          "start": 7,
          "length": 1,
          "name": "Super Chlorinate",
          "desc": "Super chlorination enabled",
          "dataType": "byte",
          "values": {
            "0": "Off",
            "1": "On"
          }
        },
        {
          "start": 8,
          "length": 1,
          "name": "Super Chlor Hours",
          "desc": "Super chlorination duration in hours",
          "dataType": "byte"
        },
        {
          "start": 9,
          "length": 1,
          "name": "Unknown",
          "desc": "Usually 0",
          "dataType": "byte"
        },
        {
          "start": 10,
          "length": 1,
          "name": "Unknown",
          "desc": "Usually 1",
          "dataType": "byte"
        }
      ]
    },
    "8_0": {
      "shortName": "Set[intellichem]",
      "name": "Set IntelliChem Configuration",
      "desc": "Sets IntelliChem controller configuration including setpoints and water chemistry values.",
      "payload": [
        {
          "start": 0,
          "length": 1,
          "name": "Category",
          "desc": "IntelliChem category = 8",
          "dataType": "byte",
          "values": {
            "8": "IntelliChem"
          }
        },
        {
          "start": 1,
          "length": 1,
          "name": "Sub-Item",
          "desc": "Always 0",
          "dataType": "byte"
        },
        {
          "start": 2,
          "length": 1,
          "name": "Controller Index",
          "desc": "Chem controller ID - 1",
          "dataType": "byte"
        },
        {
          "start": 3,
          "length": 1,
          "name": "Body",
          "desc": "Body assignment",
          "dataType": "byte",
          "values": {
            "0": "Pool",
            "1": "Spa",
            "32": "Pool+Spa"
          }
        },
        {
          "start": 4,
          "length": 1,
          "name": "Unknown",
          "desc": "Usually 1",
          "dataType": "byte"
        },
        {
          "start": 5,
          "length": 1,
          "name": "Address",
          "desc": "IntelliChem RS-485 address (144-158)",
          "dataType": "byte"
        },
        {
          "start": 6,
          "length": 1,
          "name": "Unknown",
          "desc": "Usually 1",
          "dataType": "byte"
        },
        {
          "start": 7,
          "length": 2,
          "name": "pH Setpoint",
          "desc": "pH setpoint x 100 (e.g., 740 = 7.40)",
          "dataType": "int16"
        },
        {
          "start": 9,
          "length": 2,
          "name": "ORP Setpoint",
          "desc": "ORP setpoint in mV (400-800)",
          "dataType": "int16"
        },
        {
          "start": 11,
          "length": 1,
          "name": "Acid Tank Level",
          "desc": "Acid tank level + 1",
          "dataType": "byte"
        },
        {
          "start": 12,
          "length": 1,
          "name": "ORP Tank Level",
          "desc": "ORP/Chlorine tank level + 1",
          "dataType": "byte"
        },
        {
          "start": 13,
          "length": 2,
          "name": "Calcium Hardness",
          "desc": "Calcium hardness in ppm",
          "dataType": "int16"
        },
        {
          "start": 15,
          "length": 2,
          "name": "Cyanuric Acid",
          "desc": "Cyanuric acid (CYA) in ppm",
          "dataType": "int16"
        },
        {
          "start": 17,
          "length": 2,
          "name": "Alkalinity",
          "desc": "Total alkalinity in ppm",
          "dataType": "int16"
        }
      ]
    },
    "9_0": {
      "shortName": "Set[valve]",
      "name": "Set Valve Configuration",
      "desc": "Sets valve configuration including circuit assignment and name.",
      "payload": [
        {
          "start": 0,
          "length": 1,
          "name": "Category",
          "desc": "Valves category = 9",
          "dataType": "byte",
          "values": {
            "9": "Valves"
          }
        },
        {
          "start": 1,
          "length": 1,
          "name": "Sub-Item",
          "desc": "Always 0",
          "dataType": "byte"
        },
        {
          "start": 2,
          "length": 1,
          "name": "Valve Index",
          "desc": "Valve ID - 1 (0-based)",
          "dataType": "byte"
        },
        {
          "start": 3,
          "length": 1,
          "name": "Circuit",
          "desc": "Associated circuit ID - 1 (0-based)",
          "dataType": "byte"
        },
        {
          "start": 4,
          "length": 16,
          "name": "Valve Name",
          "desc": "Valve name (16 byte string)",
          "dataType": "string"
        }
      ]
    },
    "10_0": {
      "shortName": "Set[heater]",
      "name": "Set Heater Configuration",
      "desc": "Sets heater configuration including type, body, address, and operating parameters.",
      "payload": [
        {
          "start": 0,
          "length": 1,
          "name": "Category",
          "desc": "Heaters category = 10",
          "dataType": "byte",
          "values": {
            "10": "Heaters"
          }
        },
        {
          "start": 1,
          "length": 1,
          "name": "Sub-Item",
          "desc": "Always 0",
          "dataType": "byte"
        },
        {
          "start": 2,
          "length": 1,
          "name": "Heater Index",
          "desc": "Heater ID - 1 (0-based). Type=0 to delete.",
          "dataType": "byte"
        },
        {
          "start": 3,
          "length": 1,
          "name": "Heater Type",
          "desc": "Heater type. 0 = delete",
          "dataType": "byte",
          "values": {
            "0": "None/Delete",
            "1": "Gas",
            "2": "Solar",
            "3": "Heat Pump",
            "4": "UltraTemp",
            "5": "Hybrid"
          }
        },
        {
          "start": 4,
          "length": 1,
          "name": "Body",
          "desc": "Body assignment",
          "dataType": "byte"
        },
        {
          "start": 5,
          "length": 1,
          "name": "Cooldown Delay",
          "desc": "Cooldown delay in minutes",
          "dataType": "byte"
        },
        {
          "start": 6,
          "length": 1,
          "name": "Start Temp Delta",
          "desc": "Temperature delta to start heater",
          "dataType": "byte"
        },
        {
          "start": 7,
          "length": 1,
          "name": "Stop Temp Delta",
          "desc": "Temperature delta to stop heater",
          "dataType": "byte"
        },
        {
          "start": 8,
          "length": 1,
          "name": "Cooling Enabled",
          "desc": "Cooling mode enabled (for heat pumps)",
          "dataType": "byte",
          "values": {
            "0": "Disabled",
            "1": "Enabled"
          }
        },
        {
          "start": 9,
          "length": 1,
          "name": "Differential Temp",
          "desc": "Differential temperature",
          "dataType": "byte"
        },
        {
          "start": 10,
          "length": 1,
          "name": "Address",
          "desc": "RS-485 address for addressable heaters (112-128)",
          "dataType": "byte"
        },
        {
          "start": 11,
          "length": 16,
          "name": "Heater Name",
          "desc": "Heater name (16 byte string)",
          "dataType": "string"
        },
        {
          "start": 27,
          "length": 1,
          "name": "Efficiency Mode",
          "desc": "Efficiency mode setting",
          "dataType": "byte"
        },
        {
          "start": 28,
          "length": 1,
          "name": "Max Boost Temp",
          "desc": "Maximum boost temperature",
          "dataType": "byte"
        },
        {
          "start": 29,
          "length": 1,
          "name": "Economy Time",
          "desc": "Economy time setting",
          "dataType": "byte"
        }
      ]
    },
    "12_0": {
      "shortName": "Set[general]",
      "name": "Set General Configuration",
      "desc": "Sets general configuration items including alias, owner info, and location.",
      "payload": [
        {
          "start": 0,
          "length": 1,
          "name": "Category",
          "desc": "General category = 12",
          "dataType": "byte",
          "values": {
            "12": "General"
          }
        },
        {
          "start": 1,
          "length": 1,
          "name": "Sub-Item",
          "desc": "Always 0",
          "dataType": "byte"
        },
        {
          "start": 2,
          "length": 1,
          "name": "Item",
          "desc": "General item being set",
          "dataType": "byte",
          "values": {
            "0": "System Alias (16 byte string follows)",
            "1": "Address (32 byte string)",
            "2": "Owner Name (16 byte string)",
            "3": "Owner Email (32 byte string)",
            "4": "Owner Email 2 (32 byte string)",
            "5": "Owner Phone (16 byte string)",
            "6": "Owner Phone 2 (16 byte string)",
            "7": "Zip Code (6 byte string)",
            "8": "Country (32 byte string)",
            "9": "City (32 byte string)",
            "10": "State (32 byte string)",
            "11": "Latitude (2 bytes: high byte, low byte, value = abs(lat) * 100)",
            "12": "Longitude (2 bytes: high byte, low byte, value = abs(lon) * 100)",
            "13": "TimeZone (1 byte)"
          }
        },
        {
          "start": 3,
          "length": "variable",
          "name": "Value",
          "desc": "Value to set - string length or byte count depends on item",
          "dataType": "variable"
        }
      ]
    },
    "13_0": {
      "shortName": "Set[body]",
      "name": "Set Body Configuration",
      "desc": "Sets body configuration including name, capacity, and manual heat.",
      "payload": [
        {
          "start": 0,
          "length": 1,
          "name": "Category",
          "desc": "Bodies/Equipment category = 13",
          "dataType": "byte",
          "values": {
            "13": "Bodies/Equipment"
          }
        },
        {
          "start": 1,
          "length": 1,
          "name": "Sub-Item",
          "desc": "Always 0",
          "dataType": "byte"
        },
        {
          "start": 2,
          "length": 1,
          "name": "Body Item",
          "desc": "Body index and item type combined",
          "dataType": "byte",
          "values": {
            "0": "Body 1 Name (16 byte string follows)",
            "1": "Body 3 Name",
            "2": "Body 2 Name",
            "3": "Body 4 Name",
            "4": "Body 1 Capacity (1 byte: capacity / 1000)",
            "5": "Body 3 Capacity",
            "6": "Body 2 Capacity",
            "7": "Body 4 Capacity",
            "8": "Body 1 Manual Heat (1 byte: 0=off, 1=on)",
            "9": "Body 3 Manual Heat",
            "10": "Body 2 Manual Heat",
            "11": "Body 4 Manual Heat"
          }
        },
        {
          "start": 3,
          "length": "variable",
          "name": "Value",
          "desc": "Value to set - 16 byte string for names, 1 byte for capacity/manual heat",
          "dataType": "variable"
        }
      ]
    },
    "15_0": {
      "shortName": "Set[circuit state]",
      "name": "Set Circuit/Feature States",
      "desc": "Sets the on/off state of circuits and features. Used internally by createCircuitStateMessage. v3.004+ WARNING: For circuit/feature control, prefer Action 184 (indexed) which does not suffer from state reversion. Action 168 case 15 still works for v3 but the OCP may briefly accept then revert. v3.004+ offsets: circuits=bytes 3-7, features=bytes 9-12, groups=bytes 13-14, schedules=bytes 15+ (shifted by +1 from v1.x offsets of 2-6, 8-11, 12-13, 14+).",
      "payload": [
        {
          "start": 0,
          "length": 1,
          "name": "Category",
          "desc": "System State category = 15",
          "dataType": "byte",
          "values": {
            "15": "System State"
          }
        },
        {
          "start": 1,
          "length": 1,
          "name": "Sub-Item",
          "desc": "Always 0",
          "dataType": "byte"
        },
        {
          "start": 2,
          "length": 5,
          "name": "Circuit States 1-40",
          "desc": "Bitmask of circuit on/off states (5 bytes = 40 circuits)",
          "dataType": "bits"
        },
        {
          "start": 7,
          "length": 4,
          "name": "Feature States",
          "desc": "Bitmask of feature on/off states (4 bytes = 32 features)",
          "dataType": "bits"
        },
        {
          "start": 11,
          "length": 2,
          "name": "Circuit Group States",
          "desc": "Bitmask of circuit group on/off states",
          "dataType": "bits"
        }
      ]
    }
  }
}
