{
 "manufacturer": "Buderus",
 "manufacturer_slug": "buderus",
 "model": "SSB condensing boilers (built-in Modbus RTU)",
 "model_slug": "ssb-boiler",
 "short_model": "Buderus SSB",
 "aliases": [
  "SSB",
  "Buderus SSB boiler",
  "Bosch SSB",
  "6720818450"
 ],
 "equipment_type": "Boiler",
 "applies_to": "Buderus SSB series condensing boilers (Bosch Thermotechnology, North America) using the Modbus terminals on the boiler's internal terminal strip, per installation instructions 6720818450 (2015/10).",
 "summary": "Buderus SSB floor-standing condensing boilers have a Modbus RTU slave on their own controller. Everything is a 16-bit holding register: burner state, status and error code, pump outputs, supply/return/DHW/flue temperatures, firing rate, counters, lockout and blocking history, cascade dependents, and the CH, DHW and outdoor-reset setpoints. Writes need a write-enable bit set just before each write.",
 "transport": [
  "RTU"
 ],
 "defaults": {
  "unit_id": 1,
  "baud": 9600,
  "parity": "None",
  "data_bits": 8,
  "stop_bits": 2,
  "tcp_port": null
 },
 "addressing": {
  "convention": "0-based",
  "note": "The document prints decimal register numbers with their hex form (98 = 0x0062) and says to use them as printed when the master counts from 0x0000, and to add 1 only if the master counts from 0x0001. So register 100 is wire address 100."
 },
 "default_word_order": null,
 "firmware": null,
 "source": {
  "title": "Modbus for Buderus SSB Boilers - Installation and Service Instructions for Contractors",
  "doc_number": "6720818450 (2015/10) US Rev.0",
  "revision_date": "2015-10",
  "url": "https://www.bosch-homecomfort.com/us/media/country_pool/service/technical_guides/6720818450_ssb_boiler_modbus_installation_instructions_en_10.2015_us_us.pdf",
  "pages": "p. 4 (wiring, serial settings, addressing), pp. 5-7 (register tables), p. 8 (control register, write enable, unit selection, data types), pp. 9-11 (state, status, error tables)"
 },
 "notes": [
  "Scaling follows the document's data-type table: temperatures, pressures, voltages, flame current and percentages are sent x10 (one decimal). Registers marked 'automatic conversion' use it; state, status and error codes and the counters do not.",
  "Temperatures follow the unit chosen in register 98 (°C or °F) for both reads and writes; the document does not say which bit value means which unit or what the default is, so check a known reading first.",
  "The document never says whether values are signed. Outside temperature (125) and the outdoor reset-curve points (506 Outdoor Mild Weather, 507 Outdoor Design) can be below zero, so they are left out rather than guessed; the other temperatures are typed unsigned.",
  "Left out: successful ignition counter 200 (printed with 'resolution 16', meaning not explained); CH mode 500 and DHW mode 501 (range '0..x' with no value list).",
  "Only the first slot of the lockout and blocking histories is listed; slots 2-16 follow at consecutive addresses (lockouts 221-235, blockings 261-275). The history is not in order of occurrence.",
  "Dependent registers 300-339 report the cascade dependents (01-07) in the same state/error code tables; the document leaves their access column blank, so they are listed read-only.",
  "Left out: the 'time after lockout' (236-251) and 'time after blocking' (276-291) hour stamps. They are marked 'automatic conversion' yet hours are not one of the x10 data types in the document's data-type table, so their scaling is unclear; the burn-hour counters 203-204 carry no such mark."
 ],
 "registers": [
  {
   "table": "holding_register",
   "address": 98,
   "documented": "98 (0x0062)",
   "name": "Unit selection",
   "description": "Bit 0 picks °C or °F, bit 1 bar or psi; needs Write Enable first.",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": {
    "0": "Temperature unit (°C / °F)",
    "1": "Pressure unit (bar / psi)"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 99,
   "documented": "99 (0x0063)",
   "name": "Control register",
   "description": "Set bit 0 before every write; bit 14 resets a lockout.",
   "data_type": "BITMAP16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "RW",
   "values": null,
   "bits": {
    "0": "Write Enable (cleared automatically after a write or after 4 s)",
    "14": "Controller reset (only in lockout; clears itself)"
   },
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 100,
   "documented": "100 (0x0064)",
   "name": "State",
   "description": "Burner sequence state.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "0": "RESET_0 (start-up init)",
    "1": "RESET_1 (start-up)",
    "2": "STANDBY_0 (standby / idle)",
    "3": "PRE_PURGE (init)",
    "4": "PRE_PURGE_1 (pre purging)",
    "5": "SAFETY_ON (test safety relay on)",
    "6": "SAFETY_OFF (test safety relay off)",
    "7": "IGNIT_0 (ignition)",
    "8": "IGNIT_1 (ignition)",
    "9": "BURN_0 (burning)",
    "10": "SHUT_DOWN_RELAY_TEST_0 (init)",
    "11": "SHUT_DOWN_RELAY_TEST_1 (testing safety and gas valve relays)",
    "12": "POST_PURGE_0 (init)",
    "13": "POST_PURGE_1 (post purging)",
    "14": "PUMP_CH_0 (init)",
    "15": "PUMP_CH_1 (pumping for CH)",
    "16": "PUMP_HW_0 (init)",
    "17": "PUMP_HW_1 (pumping for DHW)",
    "18": "ALARM_1 (lockout)",
    "19": "ERROR_CHECK (blocking)",
    "20": "BURNER_BOOT (rebooting)",
    "21": "CLEAR_E2PROM_ERROR",
    "22": "STORE_BLOCK_ERROR",
    "23": "WAIT_A_SECOND"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 101,
   "documented": "101 (0x0065)",
   "name": "Status",
   "description": "What the boiler is doing.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "0": "STANDBY",
    "10": "ALARM (lockout)",
    "14": "BLOCK (blocking error)",
    "15": "FROST_PROTECT",
    "16": "CH_DEMAND",
    "17": "RESET_STATE",
    "18": "STORAGE_DEMAND",
    "19": "DHW_TAP_DEMAND",
    "20": "DHW_PRE_HEAT",
    "21": "STORE_HOLD_WARM",
    "22": "GENERAL_PUMPING"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 102,
   "documented": "102 (0x0066)",
   "name": "Error code",
   "description": "Active lockout or blocking error, see error table.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "1": "Ignit Error (3 failed ignitions) - lockout",
    "2": "Gv Relay Error - lockout",
    "3": "Gv Relay Not Open - lockout",
    "4": "Gv Relay Not Close - lockout",
    "5": "Safety Relay Error - lockout",
    "6": "Safety Relay Open - lockout",
    "7": "Safety Relay Closed - lockout",
    "11": "Blocking Too Long Error (blocked > 20 h) - lockout",
    "12": "Fan Error - lockout",
    "13": "Ram Error - lockout",
    "14": "Wrong E2prom Signature - lockout",
    "15": "X Ram Error - lockout",
    "16": "E2Prom Error - lockout",
    "17": "E2Prom Error C - lockout",
    "18": "E2Prom Error Cal Table - lockout",
    "19": "State Error - lockout",
    "20": "Rom Error - lockout",
    "21": "Rom Error C - lockout",
    "22": "Air Sw Not Open - lockout",
    "23": "15Ms Xrl Error - lockout",
    "24": "Air Sw Not Closed - lockout",
    "25": "T Max Lock Error (external overheat) - lockout",
    "26": "Stack Error - lockout",
    "27": "Flame Out Too Late Error - lockout",
    "28": "Flame Error 1 (flame before ignition) - lockout",
    "29": "20Ms Xrl Error - lockout",
    "30": "41Ms Error - lockout",
    "31": "Too Many Flame Failures - lockout",
    "32": "Flow Switch Not Closed Error - lockout",
    "33": "Flow Switch Not Open Error - lockout",
    "34": "Flag Byte Integrity Error - lockout",
    "35": "Ad Hi Cpl Error - lockout",
    "36": "Ad Lo Cpl Error - lockout",
    "37": "Register Error - lockout",
    "45": "WD Error Ram - blocking",
    "46": "WD Error Rom - blocking",
    "47": "WD Error Stack - blocking",
    "48": "WD Error Register - blocking",
    "49": "WD Error Xrl - blocking",
    "50": "Refhi Too Lo Error - blocking",
    "51": "Refhi Too Hi Error - blocking",
    "52": "Reflo Too Lo Error - blocking",
    "53": "Reflo Too Hi Error - blocking",
    "54": "Flame Error 2 - blocking",
    "55": "Water Level Detect - blocking",
    "56": "Water Level Meas - blocking",
    "57": "Low Water Cutoff Error - blocking",
    "58": "Low Water Pressure Error - blocking",
    "59": "Low Water Pressure Sensor - blocking",
    "60": "Flue Gas Error - blocking",
    "61": "Return Temp Error - blocking",
    "62": "Blocked Drain Error - blocking",
    "64": "Wd Freq Error - blocking",
    "65": "Phase Error (hot/neutral reversed) - blocking",
    "66": "Net Freq Error - blocking",
    "67": "Faulty Earth Error - blocking",
    "68": "WD Communication Error - blocking",
    "70": "Overheat Error - blocking",
    "72": "T Supply Open - blocking",
    "73": "T Return Open - blocking",
    "76": "T Dhw Out Open - blocking",
    "80": "T Supply Shorted - blocking",
    "81": "T Return Shorted - blocking",
    "84": "T Dhw Out Shorted - blocking",
    "86": "T Flue Shorted - blocking",
    "87": "Reset Button Error - blocking",
    "93": "Appliance Selection - blocking",
    "107": "Gas Pressure Error - blocking",
    "108": "Flue Press Error - blocking"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 110,
   "documented": "110",
   "name": "CH pump",
   "description": "0 or 100 % (or 0-100 % if modulating).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 111,
   "documented": "111",
   "name": "DHW pump",
   "description": "0 or 100 % (or 0-100 % if modulating).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 112,
   "documented": "112",
   "name": "General pump",
   "description": "0 or 100 % (or 0-100 % if modulating).",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 120,
   "documented": "120",
   "name": "Supply temperature",
   "description": "In °C or °F per register 98.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "°C/°F",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 121,
   "documented": "121",
   "name": "Return temperature",
   "description": "In °C or °F per register 98.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "°C/°F",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 122,
   "documented": "122",
   "name": "DHW temperature",
   "description": "In °C or °F per register 98.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "°C/°F",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 123,
   "documented": "123",
   "name": "Flue gas temperature",
   "description": "In °C or °F per register 98.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "°C/°F",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 124,
   "documented": "124",
   "name": "System (heat exchanger) temperature",
   "description": "If fitted; °C or °F per register 98.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "°C/°F",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 140,
   "documented": "140",
   "name": "Firing rate",
   "description": "Burner power output.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 142,
   "documented": "142",
   "name": "Flame (ionization) current",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "µA",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 201,
   "documented": "201",
   "name": "Failed ignition counter",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 202,
   "documented": "202",
   "name": "Flame failure counter",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 203,
   "documented": "203",
   "name": "Burn hours CH",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "h",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 204,
   "documented": "204",
   "name": "Burn hours DHW",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "h",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 220,
   "documented": "220",
   "name": "First lockout in history",
   "description": "History slot 1 of 16 (220-235); not in time order.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "1": "Ignit Error (3 failed ignitions) - lockout",
    "2": "Gv Relay Error - lockout",
    "3": "Gv Relay Not Open - lockout",
    "4": "Gv Relay Not Close - lockout",
    "5": "Safety Relay Error - lockout",
    "6": "Safety Relay Open - lockout",
    "7": "Safety Relay Closed - lockout",
    "11": "Blocking Too Long Error (blocked > 20 h) - lockout",
    "12": "Fan Error - lockout",
    "13": "Ram Error - lockout",
    "14": "Wrong E2prom Signature - lockout",
    "15": "X Ram Error - lockout",
    "16": "E2Prom Error - lockout",
    "17": "E2Prom Error C - lockout",
    "18": "E2Prom Error Cal Table - lockout",
    "19": "State Error - lockout",
    "20": "Rom Error - lockout",
    "21": "Rom Error C - lockout",
    "22": "Air Sw Not Open - lockout",
    "23": "15Ms Xrl Error - lockout",
    "24": "Air Sw Not Closed - lockout",
    "25": "T Max Lock Error (external overheat) - lockout",
    "26": "Stack Error - lockout",
    "27": "Flame Out Too Late Error - lockout",
    "28": "Flame Error 1 (flame before ignition) - lockout",
    "29": "20Ms Xrl Error - lockout",
    "30": "41Ms Error - lockout",
    "31": "Too Many Flame Failures - lockout",
    "32": "Flow Switch Not Closed Error - lockout",
    "33": "Flow Switch Not Open Error - lockout",
    "34": "Flag Byte Integrity Error - lockout",
    "35": "Ad Hi Cpl Error - lockout",
    "36": "Ad Lo Cpl Error - lockout",
    "37": "Register Error - lockout",
    "45": "WD Error Ram - blocking",
    "46": "WD Error Rom - blocking",
    "47": "WD Error Stack - blocking",
    "48": "WD Error Register - blocking",
    "49": "WD Error Xrl - blocking",
    "50": "Refhi Too Lo Error - blocking",
    "51": "Refhi Too Hi Error - blocking",
    "52": "Reflo Too Lo Error - blocking",
    "53": "Reflo Too Hi Error - blocking",
    "54": "Flame Error 2 - blocking",
    "55": "Water Level Detect - blocking",
    "56": "Water Level Meas - blocking",
    "57": "Low Water Cutoff Error - blocking",
    "58": "Low Water Pressure Error - blocking",
    "59": "Low Water Pressure Sensor - blocking",
    "60": "Flue Gas Error - blocking",
    "61": "Return Temp Error - blocking",
    "62": "Blocked Drain Error - blocking",
    "64": "Wd Freq Error - blocking",
    "65": "Phase Error (hot/neutral reversed) - blocking",
    "66": "Net Freq Error - blocking",
    "67": "Faulty Earth Error - blocking",
    "68": "WD Communication Error - blocking",
    "70": "Overheat Error - blocking",
    "72": "T Supply Open - blocking",
    "73": "T Return Open - blocking",
    "76": "T Dhw Out Open - blocking",
    "80": "T Supply Shorted - blocking",
    "81": "T Return Shorted - blocking",
    "84": "T Dhw Out Shorted - blocking",
    "86": "T Flue Shorted - blocking",
    "87": "Reset Button Error - blocking",
    "93": "Appliance Selection - blocking",
    "107": "Gas Pressure Error - blocking",
    "108": "Flue Press Error - blocking"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 260,
   "documented": "260",
   "name": "First blocking in history",
   "description": "History slot 1 of 16 (260-275); not in time order.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "1": "Ignit Error (3 failed ignitions) - lockout",
    "2": "Gv Relay Error - lockout",
    "3": "Gv Relay Not Open - lockout",
    "4": "Gv Relay Not Close - lockout",
    "5": "Safety Relay Error - lockout",
    "6": "Safety Relay Open - lockout",
    "7": "Safety Relay Closed - lockout",
    "11": "Blocking Too Long Error (blocked > 20 h) - lockout",
    "12": "Fan Error - lockout",
    "13": "Ram Error - lockout",
    "14": "Wrong E2prom Signature - lockout",
    "15": "X Ram Error - lockout",
    "16": "E2Prom Error - lockout",
    "17": "E2Prom Error C - lockout",
    "18": "E2Prom Error Cal Table - lockout",
    "19": "State Error - lockout",
    "20": "Rom Error - lockout",
    "21": "Rom Error C - lockout",
    "22": "Air Sw Not Open - lockout",
    "23": "15Ms Xrl Error - lockout",
    "24": "Air Sw Not Closed - lockout",
    "25": "T Max Lock Error (external overheat) - lockout",
    "26": "Stack Error - lockout",
    "27": "Flame Out Too Late Error - lockout",
    "28": "Flame Error 1 (flame before ignition) - lockout",
    "29": "20Ms Xrl Error - lockout",
    "30": "41Ms Error - lockout",
    "31": "Too Many Flame Failures - lockout",
    "32": "Flow Switch Not Closed Error - lockout",
    "33": "Flow Switch Not Open Error - lockout",
    "34": "Flag Byte Integrity Error - lockout",
    "35": "Ad Hi Cpl Error - lockout",
    "36": "Ad Lo Cpl Error - lockout",
    "37": "Register Error - lockout",
    "45": "WD Error Ram - blocking",
    "46": "WD Error Rom - blocking",
    "47": "WD Error Stack - blocking",
    "48": "WD Error Register - blocking",
    "49": "WD Error Xrl - blocking",
    "50": "Refhi Too Lo Error - blocking",
    "51": "Refhi Too Hi Error - blocking",
    "52": "Reflo Too Lo Error - blocking",
    "53": "Reflo Too Hi Error - blocking",
    "54": "Flame Error 2 - blocking",
    "55": "Water Level Detect - blocking",
    "56": "Water Level Meas - blocking",
    "57": "Low Water Cutoff Error - blocking",
    "58": "Low Water Pressure Error - blocking",
    "59": "Low Water Pressure Sensor - blocking",
    "60": "Flue Gas Error - blocking",
    "61": "Return Temp Error - blocking",
    "62": "Blocked Drain Error - blocking",
    "64": "Wd Freq Error - blocking",
    "65": "Phase Error (hot/neutral reversed) - blocking",
    "66": "Net Freq Error - blocking",
    "67": "Faulty Earth Error - blocking",
    "68": "WD Communication Error - blocking",
    "70": "Overheat Error - blocking",
    "72": "T Supply Open - blocking",
    "73": "T Return Open - blocking",
    "76": "T Dhw Out Open - blocking",
    "80": "T Supply Shorted - blocking",
    "81": "T Return Shorted - blocking",
    "84": "T Dhw Out Shorted - blocking",
    "86": "T Flue Shorted - blocking",
    "87": "Reset Button Error - blocking",
    "93": "Appliance Selection - blocking",
    "107": "Gas Pressure Error - blocking",
    "108": "Flue Press Error - blocking"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 300,
   "documented": "300",
   "name": "Dependent 01 state",
   "description": "Cascade dependent boiler, state table codes.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "0": "RESET_0 (start-up init)",
    "1": "RESET_1 (start-up)",
    "2": "STANDBY_0 (standby / idle)",
    "3": "PRE_PURGE (init)",
    "4": "PRE_PURGE_1 (pre purging)",
    "5": "SAFETY_ON (test safety relay on)",
    "6": "SAFETY_OFF (test safety relay off)",
    "7": "IGNIT_0 (ignition)",
    "8": "IGNIT_1 (ignition)",
    "9": "BURN_0 (burning)",
    "10": "SHUT_DOWN_RELAY_TEST_0 (init)",
    "11": "SHUT_DOWN_RELAY_TEST_1 (testing safety and gas valve relays)",
    "12": "POST_PURGE_0 (init)",
    "13": "POST_PURGE_1 (post purging)",
    "14": "PUMP_CH_0 (init)",
    "15": "PUMP_CH_1 (pumping for CH)",
    "16": "PUMP_HW_0 (init)",
    "17": "PUMP_HW_1 (pumping for DHW)",
    "18": "ALARM_1 (lockout)",
    "19": "ERROR_CHECK (blocking)",
    "20": "BURNER_BOOT (rebooting)",
    "21": "CLEAR_E2PROM_ERROR",
    "22": "STORE_BLOCK_ERROR",
    "23": "WAIT_A_SECOND"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 302,
   "documented": "302",
   "name": "Dependent 01 error code",
   "description": "Cascade dependent boiler, error table codes.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": {
    "1": "Ignit Error (3 failed ignitions) - lockout",
    "2": "Gv Relay Error - lockout",
    "3": "Gv Relay Not Open - lockout",
    "4": "Gv Relay Not Close - lockout",
    "5": "Safety Relay Error - lockout",
    "6": "Safety Relay Open - lockout",
    "7": "Safety Relay Closed - lockout",
    "11": "Blocking Too Long Error (blocked > 20 h) - lockout",
    "12": "Fan Error - lockout",
    "13": "Ram Error - lockout",
    "14": "Wrong E2prom Signature - lockout",
    "15": "X Ram Error - lockout",
    "16": "E2Prom Error - lockout",
    "17": "E2Prom Error C - lockout",
    "18": "E2Prom Error Cal Table - lockout",
    "19": "State Error - lockout",
    "20": "Rom Error - lockout",
    "21": "Rom Error C - lockout",
    "22": "Air Sw Not Open - lockout",
    "23": "15Ms Xrl Error - lockout",
    "24": "Air Sw Not Closed - lockout",
    "25": "T Max Lock Error (external overheat) - lockout",
    "26": "Stack Error - lockout",
    "27": "Flame Out Too Late Error - lockout",
    "28": "Flame Error 1 (flame before ignition) - lockout",
    "29": "20Ms Xrl Error - lockout",
    "30": "41Ms Error - lockout",
    "31": "Too Many Flame Failures - lockout",
    "32": "Flow Switch Not Closed Error - lockout",
    "33": "Flow Switch Not Open Error - lockout",
    "34": "Flag Byte Integrity Error - lockout",
    "35": "Ad Hi Cpl Error - lockout",
    "36": "Ad Lo Cpl Error - lockout",
    "37": "Register Error - lockout",
    "45": "WD Error Ram - blocking",
    "46": "WD Error Rom - blocking",
    "47": "WD Error Stack - blocking",
    "48": "WD Error Register - blocking",
    "49": "WD Error Xrl - blocking",
    "50": "Refhi Too Lo Error - blocking",
    "51": "Refhi Too Hi Error - blocking",
    "52": "Reflo Too Lo Error - blocking",
    "53": "Reflo Too Hi Error - blocking",
    "54": "Flame Error 2 - blocking",
    "55": "Water Level Detect - blocking",
    "56": "Water Level Meas - blocking",
    "57": "Low Water Cutoff Error - blocking",
    "58": "Low Water Pressure Error - blocking",
    "59": "Low Water Pressure Sensor - blocking",
    "60": "Flue Gas Error - blocking",
    "61": "Return Temp Error - blocking",
    "62": "Blocked Drain Error - blocking",
    "64": "Wd Freq Error - blocking",
    "65": "Phase Error (hot/neutral reversed) - blocking",
    "66": "Net Freq Error - blocking",
    "67": "Faulty Earth Error - blocking",
    "68": "WD Communication Error - blocking",
    "70": "Overheat Error - blocking",
    "72": "T Supply Open - blocking",
    "73": "T Return Open - blocking",
    "76": "T Dhw Out Open - blocking",
    "80": "T Supply Shorted - blocking",
    "81": "T Return Shorted - blocking",
    "84": "T Dhw Out Shorted - blocking",
    "86": "T Flue Shorted - blocking",
    "87": "Reset Button Error - blocking",
    "93": "Appliance Selection - blocking",
    "107": "Gas Pressure Error - blocking",
    "108": "Flue Press Error - blocking"
   },
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 303,
   "documented": "303",
   "name": "Dependent 01 firing rate",
   "description": "Cascade dependent boiler power output.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 306,
   "documented": "306",
   "name": "Dependent 02 state",
   "description": "Cascade dependent boiler, state table codes.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 308,
   "documented": "308",
   "name": "Dependent 02 error code",
   "description": "Cascade dependent boiler, error table codes.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 309,
   "documented": "309",
   "name": "Dependent 02 firing rate",
   "description": "Cascade dependent boiler power output.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 312,
   "documented": "312",
   "name": "Dependent 03 state",
   "description": "Cascade dependent boiler, state table codes.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 314,
   "documented": "314",
   "name": "Dependent 03 error code",
   "description": "Cascade dependent boiler, error table codes.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 315,
   "documented": "315",
   "name": "Dependent 03 firing rate",
   "description": "Cascade dependent boiler power output.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 318,
   "documented": "318",
   "name": "Dependent 04 state",
   "description": "Cascade dependent boiler, state table codes.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 320,
   "documented": "320",
   "name": "Dependent 04 error code",
   "description": "Cascade dependent boiler, error table codes.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 321,
   "documented": "321",
   "name": "Dependent 04 firing rate",
   "description": "Cascade dependent boiler power output.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 324,
   "documented": "324",
   "name": "Dependent 05 state",
   "description": "Cascade dependent boiler, state table codes.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 326,
   "documented": "326",
   "name": "Dependent 05 error code",
   "description": "Cascade dependent boiler, error table codes.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 327,
   "documented": "327",
   "name": "Dependent 05 firing rate",
   "description": "Cascade dependent boiler power output.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 330,
   "documented": "330",
   "name": "Dependent 06 state",
   "description": "Cascade dependent boiler, state table codes.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 332,
   "documented": "332",
   "name": "Dependent 06 error code",
   "description": "Cascade dependent boiler, error table codes.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 333,
   "documented": "333",
   "name": "Dependent 06 firing rate",
   "description": "Cascade dependent boiler power output.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 336,
   "documented": "336",
   "name": "Dependent 07 state",
   "description": "Cascade dependent boiler, state table codes.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 338,
   "documented": "338",
   "name": "Dependent 07 error code",
   "description": "Cascade dependent boiler, error table codes.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 1,
   "units": "",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 339,
   "documented": "339",
   "name": "Dependent 07 firing rate",
   "description": "Cascade dependent boiler power output.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "%",
   "access": "R",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 502,
   "documented": "502",
   "name": "CH set-point",
   "description": "Central heating setpoint; °C or °F per register 98.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "°C/°F",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 503,
   "documented": "503",
   "name": "DHW set-point",
   "description": "Hot water setpoint; °C or °F per register 98.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "°C/°F",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 504,
   "documented": "504",
   "name": "Reset curve boiler design",
   "description": "Supply temperature at outdoor design condition.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "°C/°F",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 505,
   "documented": "505",
   "name": "Reset curve boiler mild weather",
   "description": "Supply temperature at mild outdoor condition.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "°C/°F",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 508,
   "documented": "508",
   "name": "Warm weather shutdown",
   "description": "Outdoor temperature above which heating stops.",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "°C/°F",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 509,
   "documented": "509",
   "name": "Reset curve boiler maximum",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "°C/°F",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 510,
   "documented": "510",
   "name": "Reset curve boiler minimum",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "°C/°F",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  },
  {
   "table": "holding_register",
   "address": 511,
   "documented": "511",
   "name": "Night setback",
   "description": "",
   "data_type": "UINT16",
   "length": 1,
   "word_order": null,
   "scale": 0.1,
   "units": "°C/°F",
   "access": "RW",
   "values": null,
   "bits": null,
   "offset": 0
  }
 ],
 "integration": {
  "summary": "Wire Modbus + and - to the MOD BUS terminals of the boiler's terminal strip, set the master to 9600 8-N-2 and read holding registers 100-142 with function 03. To change a setpoint, first write register 99 = 1 (Write Enable), then write the value x10 within 4 seconds.",
  "minimum_registers": [
   {
    "table": "holding_register",
    "address": 101,
    "why": "Boiler status"
   },
   {
    "table": "holding_register",
    "address": 102,
    "why": "Error code"
   },
   {
    "table": "holding_register",
    "address": 120,
    "why": "Supply temperature"
   },
   {
    "table": "holding_register",
    "address": 121,
    "why": "Return temperature"
   },
   {
    "table": "holding_register",
    "address": 140,
    "why": "Firing rate"
   },
   {
    "table": "holding_register",
    "address": 502,
    "why": "CH setpoint"
   },
   {
    "table": "holding_register",
    "address": 503,
    "why": "DHW setpoint"
   },
   {
    "table": "holding_register",
    "address": 99,
    "why": "Write enable / lockout reset"
   }
  ],
  "enable": "Writes are refused unless register 99 bit 0 (Write Enable) is set. The bit clears itself after each write sequence or after 4 seconds, so set it again before every write.",
  "watchdog": "If no Modbus read or write arrives for more than 4 seconds the control register 99 is cleared. No other comm-loss behaviour is documented.",
  "quirks": [
   "Only functions 03, 06 and 16 are supported - no input registers or coils.",
   "Setting any undefined bit in register 99 clears the whole register.",
   "Lockout reset (99 bit 14) works only while the boiler is in lockout."
  ],
  "setup": [
   "Slave address (default 1) and stop bits (1 or 2, default 2) are set with the 894PB tool or LabVision software.",
   "Baud is fixed at 9600, 8 data bits, no parity.",
   "RS-485 two-wire, ground optional: Modbus + and - go to the MOD BUS pair on the boiler terminal strip (terminals 3-4)."
  ],
  "gotchas": [
   "Do not leave Write Enable set when you are not writing; the document warns that registers can be corrupted.",
   "Changing register 98 changes the units of every temperature you read and write."
  ]
 },
 "page": "https://easymodbus.com/modbus-register-maps/buderus/ssb-boiler",
 "address_note": "address = 0-based Modbus wire (PDU) address; documented = as printed in the source.",
 "note": "Re-typed from the manufacturer's public documentation (see source) and verified against it. Registers vary by firmware and options; verify against the live device before writing."
}
