CoolAutomation CoolMaster
Local TCP integration for the CoolAutomation CoolMaster family — CoolMasterNet and the larger CoolMaster Pro. These boxes are universal VRF/VRV-to-IP gateways: they sit on a manufacturer's indoor-unit bus (Daikin, Samsung, Mitsubishi Electric/Heavy, Toshiba, Hitachi, LG, Panasonic, and more) and expose every indoor unit over a single ASCII "line" protocol on TCP 10102.
One CoolMaster becomes one GEM device row; each indoor air handler becomes a climate zone addressed by its CoolMaster UID (for example L7.400 — line 7, address 400).
What this integration covers
- Power — on / off per indoor unit.
- Mode — cool, heat, auto, dry, fan (mapped to GEM
system_mode;offpowers the unit down). - Setpoint — single target temperature per unit, reported and set in °F.
- Fan speed — low, medium, high, very_strong (CoolMaster "Top"/turbo), auto.
- Swing — auto / vertical / horizontal / off, where the indoor unit supports it.
- Status polling of on/off state, mode, room temperature, setpoint, fan speed, the unit fault code, and the active heating/cooling demand flag.
- Auto-discovery — the driver enumerates indoor units with
lsand (by default) creates a climate zone per unit.
What this integration does NOT cover (yet)
- Push updates. The CoolMaster line protocol is strictly request/response with no unsolicited event stream, so a change made at a wall controller appears at the next poll (within
poll_interval), not instantly. - Dual heat/cool setpoints. A CoolMaster indoor unit has a single setpoint; the
setpointcommand accepts amodeargument for climate-UI compatibility but always applies that one setpoint. - Line / DIP configuration. Assigning an HVAC line to a manufacturer (Daikin, Samsung, …) is done on the box — by DIP switches for lines L1/L2 and on-device for L3–L8. The driver consumes whatever lines are already configured.
- PRO-only object data (
ostat/istatoutdoor and indoor "PRO" telemetry), filter-life resets, group management, and the box's other gateway roles (Modbus, BACnet, KNX, REST). The driver speaks only the indoor-unit control surface.
Prerequisites
- A CoolMaster reachable from the GEM host on TCP 10102 (the "ASCII server" / aserver port). Confirm it is enabled on the box.
- HVAC lines already configured on the CoolMaster with indoor units detected (verify with
ls/lineon the device console).
Setup steps
- In GEM, go to System → Devices → Add Device (Open Devices) and pick CoolAutomation CoolMaster as the driver.
- Enter the device
ipandport(default10102). - Save. After a few seconds the device row should show Connected — the driver reads the box's °C/°F setting and identity, then polls
ls. - Run the
discovercommand to list the indoor units the CoolMaster currently reports (UID, mode, setpoint, temperature). - Leave
auto_create_zoneson (the default) to have a climate zone created per indoor unit, or set it off and create zones by hand withaddress= the CoolMaster UID (e.g.L7.400).
Auto-created zones are placed under the seeded Climate subsystem. If your site has no climate subsystem the driver logs a warning and skips creation — create the zones manually (any subsystem works; the subsystem only affects grouping/presentation, not whether commands work).
Attribute reference
Device attributes
| Name | Type | Required | Description |
|---|---|---|---|
ip | string | yes | LAN IP or hostname of the CoolMaster. |
port | int | no | ASCII server port (default 10102). A blank or out-of-range value uses 10102. |
poll_interval | int | no | How often to poll all indoor units with ls, in ms (default 15000). The poll runs at most once a second; zero, negative or unreadable values use the default. |
auto_create_zones | bool | no | Create a climate zone per discovered indoor unit (default true). |
firmware | string | — | Read from the box (version). |
model / serial | string | — | Read from the box (S/N). |
Zone attributes
| Name | Type | Description |
|---|---|---|
address | string | CoolMaster unit UID, e.g. L7.400 (required). |
state | string | on / off. |
system_mode | string | off when the unit is off, otherwise cool / heat / auto / dry / fan. |
device_mode | string | The underlying mode regardless of power — used for an optimistic power-on. |
setpoint | int | Target temperature in °F. |
temperature | int | Current room temperature in °F. |
fan_mode | string | auto / low / medium / high / very_strong. |
system_modes / fan_modes | json | Capability lists published once so the climate UI renders the right buttons. |
min / max | int | Setpoint bounds seeded once by the driver: 60–90 °F, in °F like the setpoint, whatever unit the box displays. Older versions seeded 16 / 32 on a °C box, which capped the setpoint at 32 °F; if a zone still shows those values, set them to 60 / 90. |
fault | string | The CoolMaster fail-code for the unit; empty when OK. |
demand | bool | true while the unit is actively calling for heating/cooling. |
swing | string | Last swing value applied. |
Commands
| Command | Args | Notes |
|---|---|---|
on / off | address | Power the unit. on resumes its last mode. |
system_mode | address, mode | off, cool, heat, auto, dry, fan. Any non-off mode also powers the unit on (a CoolMaster mode verb does not power on by itself). |
fan_mode | address, mode | auto, low, medium, high, very_strong (= "Top"/turbo). |
setpoint | address, setpoint, mode | Target temperature in °F. mode is accepted for UI compatibility but the unit has a single setpoint. |
swing | address, mode | auto, vertical, horizontal, off, where supported. |
get_temperature / get_system_mode / get_fan_mode | address | Return the last-polled value for the zone. |
discover | — | List all indoor units the box currently reports. |
How state mapping works
- Temperature units. GEM works in °F. The CoolMaster has one display unit (°C or °F); each
lstemperature carries aC/Fsuffix and the driver also reads the unit from the box'ssetreply. Reads are converted to °F; setpoints are converted back to the device unit before sending. On a °F box this is a no-op. - Off vs. mode. The climate UI treats "off" as a mode, so when a unit is off the driver reports
system_mode = offwhile preserving the real cool/heat selection indevice_mode. Turning the unit back on optimistically restoresdevice_mode, and the next poll reconciles. - Polling. Every
lsreply line is parsed independently and keyed by UID, so one poll refreshes every zone. Duplicate UIDs (only possible with the device'ssimultest mode) collapse onto a single zone. A zone whoseaddresswas typed in lower case (l7.400) is matched to the unit the box reports asL7.400. - Commands. A command answers an error, and leaves the zone's state alone, when the line could not be sent (the box is disconnected). Otherwise the zone is updated straight away and the next poll confirms it.
- Connection health. Once the box has answered on a connection, three polls in a row with no reply (at least 45 seconds) close the connection and the driver reconnects. Without this, a box that lost power could leave the device showing Connected with every zone frozen at its last values.
Troubleshooting
| Symptom | Check |
|---|---|
discover returns no units but the device connects | The HVAC line may be configured but have no indoor units detected on the bus. Run ls / line on the CoolMaster directly. |
| Setpoint lands a degree or two off | The box is likely in °C while GEM works in °F; the driver rounds on conversion. Confirm the device unit with the set command. |
A zone shows a fault value | The CoolMaster reports a non-OK fail-code for that indoor unit — check the unit's error code on the equipment. |
| Zone state lags a manual change at a wall controller | Expected — there is no push; state refreshes on poll_interval. |
| The device drops to disconnected and reconnects on its own | The box stopped answering polls for three intervals. Check its power and network link; the log line coolmaster: no reply to polls, recycling socket marks each occurrence. |
| A unit never gets a zone and the log mentions a zone insert error | The zone could not be created (for example its name is taken). The driver waits 10 minutes before trying that unit again; create the zone by hand with the unit's UID as address. |