MQTT manual

Faikin Australia

Faikin Faikout — MQTT Manual

Controlling and monitoring a Faikin Faikout over MQTT, from first setup through to the full topic, command and setting reference.

All control is local · no cloud, no account · works with Home Assistant, openHAB, Node-RED and anything that speaks MQTT.

A complete guide to controlling and monitoring a Faikin Faikout over MQTT, from first setup through to the full topic, command and setting reference.

This covers the WiFi Faikout module running RevK's firmware (the device is branded Faikout; you may still see the older name Faikin). It applies to S21, X50A and CN_WIRED units alike, since the firmware works out the protocol automatically. Throughout, the example hostname is GuestAC and the example broker IP is 192.168.1.10. Replace both with your own.

1. What MQTT gives you

Everything is local. Faikout speaks MQTT on your own network, with no cloud account and no internet dependency. Over MQTT you can:

  • Control the unit: power, mode, set-point, fan speed, louvre swing, powerful/econo.
  • Read live telemetry the IR remote hides: room, coil/liquid, inlet and outside temperatures, plus model and operating state.
  • Drive the Faikout Auto layer: target band, schedules, and an external temperature reference.
  • Integrate with Home Assistant (native auto-discovery), openHAB, Node-RED, Domoticz, ioBroker and anything else that speaks MQTT.

MQTT control runs alongside the built-in web interface and the IR remote. A change from any source shows up everywhere within a few seconds.

2. Before you start

You need:

  • A Faikout installed and already connected to your 2.4GHz WiFi (see the Setup manual). You can reach it at GuestAC.local in a browser.
  • An MQTT broker on the same network. Common choices are the Mosquitto add-on inside Home Assistant, or a standalone Mosquitto on a Raspberry Pi, NAS or server.
  • The broker's IP address or hostname, and a username and password if the broker requires authentication (Home Assistant's broker normally does).

Keep the broker on a network you control. Faikout's MQTT is plain local traffic and is not meant to be exposed to the internet.

3. Step 1: Point Faikout at your MQTT broker

  1. Browse to GuestAC.local and open WiFi settings (or hold the device's setup, then connect to its Daikin/ Faikout access point if it is not yet on your WiFi).
  2. In the MQTT section, enter the Host (broker IP or hostname, e.g. 192.168.1.10) and, if your broker uses them, the Username and Password.
  3. Make sure the Hostname is set to something memorable, e.g. GuestAC. This name becomes part of every MQTT topic, so pick it before you build automations.
  4. Save. Faikout reconnects and begins publishing.

The underlying connection setting is mqtthost (RevK library standard). The username and password are entered on the same page. You can also change these later over MQTT itself once connected (see Settings reference).

4. Step 2: Confirm it is connected

Subscribe to everything for that device and watch for retained status:

      mosquitto_sub -h 192.168.1.10 -u USER -P PASS -t 'state/GuestAC/#' -v
    

You should see a retained state/GuestAC message. Its payload reports online true when the air-con is talking to the module. The bare state/GuestAC topic is the device's own presence: a payload of false means the Faikout itself is offline (this is its MQTT will/birth message).

If nothing arrives, jump to Troubleshooting.

5. The topic structure

Faikout uses the standard RevK-library topic layout: prefix/hostname/suffix . With hostname GuestAC:

Type Topic Meaning
Command command/GuestAC/<command> Tells the device to do something now (e.g. power on, set mode).
Setting (JSON) setting/GuestAC Payload is JSON of one or more settings, e.g. {"reporting":60}. An empty payload makes the device publish its current settings back.
Setting (single) setting/GuestAC/<name> Sets one setting; payload is the bare value, e.g. topic setting/GuestAC/reporting payload 30.
State state/GuestAC/<aspect> Retained status, published periodically and on change. state/GuestAC with no suffix is the device's own state ( false = offline).
Event event/GuestAC/<x> One-off things that happened. Not retained.
Info info/GuestAC/<x> Informational messages, not tied to a specific event.
Error error/GuestAC/<x> Errors are reported here.

For most automation you only need two of these: publish to command/GuestAC/control and subscribe to state/GuestAC.

6. Sending commands

Publish to command/GuestAC/<command>. Simple commands take no payload; a few take an argument as the payload.

Command Payload Effect
on / off none Power on or off.
heat cool auto fan dry none Change mode.
low medium high none Change fan speed.
temp a number Set target temperature, e.g. payload 21.
status none Force an immediate status report.
control JSON Set any combination of controls at once (see next section).
send string / array Advanced: force-send a raw protocol message, e.g. S21 D62000. Accepts a JSON string or a JSON array of strings. High-bit bytes (0x80 to 0xFF) are written as JSON unicode escapes. For protocol debugging only.

Examples:

      # Power on
mosquitto_pub -h 192.168.1.10 -t 'command/GuestAC/on' -n

# Switch to cooling
mosquitto_pub -h 192.168.1.10 -t 'command/GuestAC/cool' -n

# Set target to 21 C
mosquitto_pub -h 192.168.1.10 -t 'command/GuestAC/temp' -m '21'
    

7. The control message (the main one)

command/GuestAC/control takes a JSON payload and is the cleanest way to set several things at once. The same field names appear in the status JSON, so what you send mirrors what you read.

Field Type Meaning
power boolean On / off.
mode H C A D F Heat, Cool, Auto, Dry, Fan.
temp number Target temperature in °C.
fan A Q 15 Auto, Quiet/Night, or manual levels 1 to 5.
swingv boolean Vertical louvre swing.
swingh boolean Horizontal louvre swing.
powerful boolean Powerful/turbo boost (if the unit supports it).
econo boolean Economy mode (if supported).
streamer boolean Streamer/air-purifying (if supported).
target number or [min,max] A single target temp, or a two-element min/max array. An array forces Faikout Auto mode.
env number External room-temperature reference used by Faikout Auto.

Example: cool to 24°C on auto fan, vertical swing on:

      mosquitto_pub -h 192.168.1.10 -t 'command/GuestAC/control' \
  -m '{"power":true,"mode":"C","temp":24,"fan":"A","swingv":true}'
    

Note: powerful, econo, streamer and similar extras are model-dependent. S21 is reverse-engineered and not identical across units, so a switch your unit lacks is simply ignored. The status JSON tells you which controls your unit actually exposes.

8. Reading status

Faikout publishes status to three families of topic:

  • state/GuestAC is the human/automation status, published every reporting seconds (default 60) and on significant changes. Set livestatus on to also publish on every change in real time.
  • Faikout/... is published about once a minute and is intended for the faikoutlog tool to store in a MySQL/MariaDB database for graphing.
  • <MAC>/... is the Home Assistant auto-discovery feed, published when HA support is enabled (see section 9).

The state JSON includes everything from the control table above (so you can read back power, mode, temp, fan, etc.) plus these read-only fields:

Field Meaning
online The air-con is connected and responding.
heat Currently in a heating state.
slave We are not master for heat/cool, so the requested mode cannot be applied.
antifreeze In antifreeze mode, so not operating normally.
model Model name, if known.
home Room temperature (remote reference or measured).
outside Outside temperature, if the unit reports it.
inlet Inlet (return air) temperature, if known.
liquid Liquid coolant feed temperature, if known.
control We are under external/automatic control.

Database logging format: in the Faikout/ feed, each value is summarised over the period. If it did not change it is reported as a single value; if it did, a numeric value becomes a [min, average, max] array and a boolean becomes a fraction 0.01.0 for how much of the period it was true. Set fixstatus on to always use the array/fraction format regardless.

9. Home Assistant over MQTT

Faikout has native Home Assistant auto-discovery and it is on by default (setting haenable, default on). Once the module is talking to the same broker as Home Assistant, a climate entity appears on its own.

Setup:

  1. Run an MQTT broker that Home Assistant uses. The easiest is the Mosquitto broker add-on in Home Assistant OS, with the MQTT integration added.
  2. Create an MQTT user in Home Assistant for the device (a normal HA user works with the Mosquitto add-on).
  3. On the Faikout setup page, set the MQTT host to Home Assistant's IP and enter that username and password.
  4. Within a minute Home Assistant discovers the device (published under the <MAC>/... topics) and adds a climate card. No YAML required.

Useful HA-related settings (set via MQTT or the Advanced web page):

Setting Default Effect
haenable on Home Assistant auto-discovery. (Older firmware called this ha.)
haswitches off Expose additional switches (e.g. powerful, econo) as separate HA entities.
ha1c off Force 1°C steps in the HA temperature control.
hafanrpm off Report fan speed as RPM instead of Hz.
hacomprpm off Report compressor speed as RPM instead of Hz.
hadomain local Local domain used for HA links; blank to use the IP.
nohvacaction off Stop reporting hvac_action for Faikout Auto in HA.
nohomepreset off Leave the "home" entry out of the HA preset list.

Dashboard and entity card YAML

You do not need YAML to create the entities. Auto-discovery makes a climate entity plus temperature sensors on its own. The YAML below is for laying them out on a Lovelace dashboard.

Entity IDs are derived from the hostname, so a device named GuestAC gives climate.guestac and sensors like sensor.guestac_temperature. The exact slugs vary with firmware version and your HA naming settings, so confirm them under Settings → Devices & Services → MQTT → (your device) or Developer Tools → States, and adjust the IDs below to match.

Entity card. Add a card to any dashboard with Add card → Manual and paste:

      type: entities
title: Guest AC
show_header_toggle: false
entities:
  - entity: climate.guestac          # adjust IDs to match your install
    name: Air conditioner
  - type: section
    label: Live temperatures
  - entity: sensor.guestac_temperature
    name: Room
  - entity: sensor.guestac_outside_temperature
    name: Outside
  - entity: sensor.guestac_inlet_temperature
    name: Inlet
  - entity: sensor.guestac_liquid_temperature
    name: Liquid / coil
    

Full dashboard view. Open a dashboard, Edit → (three dots) → Raw configuration editor, and add this as a new view under views::

      title: Climate
path: climate
icon: mdi:air-conditioner
cards:
  - type: thermostat
    entity: climate.guestac          # adjust IDs to match your install

  - type: entities
    title: Guest AC
    entities:
      - entity: climate.guestac
        name: Controls
      - type: section
        label: Live temperatures
      - entity: sensor.guestac_temperature
        name: Room
      - entity: sensor.guestac_outside_temperature
        name: Outside
      - entity: sensor.guestac_inlet_temperature
        name: Inlet
      - entity: sensor.guestac_liquid_temperature
        name: Liquid / coil

  - type: history-graph
    title: Temperatures (24 h)
    hours_to_show: 24
    entities:
      - sensor.guestac_temperature
      - sensor.guestac_outside_temperature
    

If you would rather build a single card visually, the Mushroom "Climate" card and the built-in Thermostat card both bind to climate.guestac directly.

Simpler, non-MQTT alternative. Faikout also emulates Daikin's own local API and answers BRP-compatible UDP discovery (setting udpdiscovery). If you do not want to run an MQTT broker, you can instead add Home Assistant's built-in Daikin integration and point it at the Faikout's IP address. For non-technical users this is the least fiddly route into HA. Reserve the MQTT path for when you want features the Daikin integration does not expose, or you are integrating with something other than HA.

Apple Home / Alexa / Google. These do not speak MQTT directly, but a bridge closes the gap. Home Assistant bridges all three. For an Apple-only household without HA, Homebridge with an MQTT plugin (for example EasyMQTT) brings Faikout into the native iOS Home app and Siri. It is well-trodden but is a self-hosted server to set up, so expect some configuration.

10. Other platforms

The same two topics ( command/GuestAC/control to write, state/GuestAC to read) work everywhere.

mosquitto command line

      # Watch everything for this device
mosquitto_sub -h 192.168.1.10 -u USER -P PASS -t 'state/GuestAC/#' -v

# Ask the device to report its current settings (empty payload)
mosquitto_pub -h 192.168.1.10 -t 'setting/GuestAC' -n

# Change one setting
mosquitto_pub -h 192.168.1.10 -t 'setting/GuestAC/reporting' -m '30'

# Full control
mosquitto_pub -h 192.168.1.10 -t 'command/GuestAC/control' \
  -m '{"power":true,"mode":"H","temp":21,"fan":2}'
    

Node-RED

  • To control: an mqtt out node with topic command/GuestAC/control. Feed it a msg.payload that is a JSON object (use a template or function node, or a change node setting the payload to a JSON value).
  • To monitor: an mqtt in node on state/GuestAC, then a json node to parse it into an object you can route on (e.g. payload.home, payload.power).

openHAB

Use the generic MQTT binding. Create an MQTT Thing for the broker, then channels such as:

  • a Switch channel with commandTopic = command/GuestAC/control, formatting the value as {"power":%s};
  • a Number channel with stateTopic = state/GuestAC and a JSONPATH transformation like $.home to read room temperature.

The same pattern (publish JSON to command/.../control, parse JSON from state/...) maps onto Domoticz, ioBroker, Jeedom, FHEM, Homey, Hubitat and Gladys.

11. Faikout Auto over MQTT

Faikout Auto is an extra control layer that holds a target band by nudging the unit between heat/cool/off, optionally using an external temperature sensor instead of the air-con's own. You can drive it three ways: from the web UI, from a BLE sensor, or over MQTT. The MQTT routes are below.

A. Push a reading from your own automation

Send a control message containing env (and optionally target). The unit then treats itself as under remote control:

      mosquitto_pub -h 192.168.1.10 -t 'command/GuestAC/control' \
  -m '{"env":22.4,"target":[20,22]}'
    
  • env is the current room temperature from your sensor. It must be re-sent in every control message and at least every tcontrol seconds (default 600). If it times out, the unit falls back out of remote/auto mode.
  • target as a [min,max] array (or a single number with margin) forces Faikout Auto mode and defines the comfort band.

B. Subscribe Faikout to a sensor topic

Instead of pushing, tell Faikout to follow an existing MQTT topic:

Setting Meaning
autotopic The MQTT topic to subscribe to for the reference temperature.
autopayload The field name within that topic's JSON payload that holds the temperature.

Important: the payload on autotopic must be JSON containing the named field. A topic that publishes a bare number (for example a plain ESPHome state topic) will not parse; wrap it in JSON, or use route A.

C. Track an external sensor but keep on/off manual

A common request: control to an accurate external reading, but never let the unit power itself on or off. The catch is that sending env makes the unit "remote", and when remote, automatic power is assumed if autoptemp is not zero (default 0.5). So:

  • Set autop off and autoptemp 0 (stops automatic power on/off).
  • Keep tempadjust on (this is what actually aims the unit at your reference: it adjusts the set-point by reference - measured).
  • Do not send a target array (an array forces full Auto band/power behaviour). Send only {"env": 22.4}.
      mosquitto_pub -h 192.168.1.10 -t 'setting/GuestAC' -m '{"autop":false,"autoptemp":0}'
mosquitto_pub -h 192.168.1.10 -t 'command/GuestAC/control' -m '{"env":22.4}'
    

Auto-mode controls you can also send in a control message

These mirror the settings and are reported back in status when not under remote control:

Field Meaning
autor Auto margin either side of the target; 0.0 means off.
autot Auto target temperature.
autob BLE sensor ID to use as the reference.
auto0 Turn-off time, HH:MM; 00:00 means do not turn off.
auto1 Turn-on time, HH:MM; 00:00 means do not turn on.

12. Settings reference

Settings are read and written over MQTT in two forms:

  • All at once / read back: publish JSON to setting/GuestAC, e.g. {"reporting":30,"livestatus":true}. An empty payload makes the device publish its current settings.
  • One at a time: publish the bare value to setting/GuestAC/<name>, e.g. topic setting/GuestAC/livestatus payload true.

Names below are the MQTT names (the Advanced web page groups them, but over MQTT they are written as one word). This is a working subset; the device's own settings dump (empty payload to setting/GuestAC) is the authoritative list for your firmware.

Connection and reporting

Setting Default Meaning
hostname Device name; forms the topic prefix and .local address.
mqtthost MQTT broker host or IP (plus username/password fields on the setup page).
reporting 60 Status report period in seconds.
livestatus off Publish state/ on every change, in real time.
fixstatus off Always use the min/ave/max (and 0.0–1.0) format in logging.
otaauto on Automatic firmware updates (roughly weekly; needs internet).
webcontrol on Enable the web control page.
websettings on Enable the web settings pages.

Home Assistant

See section 9: haenable, haswitches, ha1c, hafanrpm, hacomprpm, hadomain, udpdiscovery, nohvacaction, nohomepreset.

Faikout Auto

Setting Default Meaning
autoe on Enable auto time and power operations.
autop off Enable automatic power on/off.
autoptemp 0.5 Power on/off when temperature deviates from the band by this much.
autot Auto target temperature.
autor Auto margin either side of autot (0 = off).
autob BLE sensor ID for the reference.
auto0 / auto1 00:00 Scheduled off / on time ( HHMM); equal or 00:00 disables.
autofmax 5 Max fan level when starting far from target.
autolcontrol off Toggle the LED based on current HVAC action.
autotopic Topic to follow for the reference temperature.
autopayload JSON field name in that topic for the reference temperature.
tempadjust on Adjust the set-point for the difference between Daikin's sensor and your reference.
temptrack off Base the set-point on Daikin's measured temperature rather than the requested target.
tempnoflap 0 Minimum seconds between target-temperature changes.
thermostat off Simple thermostat mode: heat to max, then let it fall to min (hysteresis).
tcontrol 600 Timeout (s) for env/ control messages before reverting out of remote mode.
tmin / tmax 16 / 32 System minimum / maximum set-point.
thermref 50 Percentage of inlet (vs room) temperature your unit uses as its reference.

Fine-tuning of the prediction and band behaviour ( pushtemp, switchtemp, coolover, coolback, heatover, heatback, tpredicts, tpredictt, tsample, tcoolmin, theatmax, frosttemp, minoutside) is documented in the Advanced manual and rarely needs changing.

Capability overrides

If the firmware offers a control your unit does not actually have (or vice versa), the no... settings tell it what to hide: for example nopowerful, noecono, nostreamer, noswingv, noswingh, noquiet, nodemand, nofaikoutauto. The protocol-forcing settings nos21, nox50a, nocnwired stop it trying a given protocol if auto-detection picks the wrong one.

Debug

Setting Meaning
debug Verbose debug; for S21, one summary line of poll responses (also polls more fields, so slower).
dump Output raw serial communications on MQTT.
snoop Listen-only mode for protocol analysis.

13. Troubleshooting

Nothing appears on MQTT / device shows offline. Check the bare state/GuestAC topic: false means the Faikout itself is not connected to the broker. Then verify the broker IP/hostname in settings is reachable, the MQTT username and password are correct, the broker is listening (usually port 1883 on the LAN), and the module is on your 2.4GHz WiFi (it does not use 5GHz). Confirm GuestAC.local loads in a browser to prove WiFi is fine, then it is an MQTT-credentials or broker-reachability issue.

The unit keeps switching itself on. Sending env in a control message puts the unit under remote control, and when remote, automatic power is assumed if autoptemp is not zero (default 0.5). To keep on/off manual, set autop off and autoptemp 0, keep tempadjust on, and send only {"env": ...} with no target array. See section 11C.

Faikout drops out of Auto mode after a while. env/ control messages time out after tcontrol seconds (default 600). Re-send env in every control message and on a schedule shorter than the timeout.

autotopic does nothing. The subscribed topic must carry JSON with the field named in autopayload. A bare-number payload will not parse. Either publish JSON, or push the value yourself with an env control message (section 11A).

Home Assistant does not show the device. haenable must be on (it is by default), the HA MQTT integration must be installed with discovery enabled, and the device must be on the same broker as HA. Confirm discovery messages are arriving by subscribing to <MAC>/# (the module's MAC address). If you would rather not use MQTT at all, use the native Daikin integration with the Faikout's IP instead.

Status looks stale. state/ messages are retained, so a client can show the last value after a restart. If you see genuinely old data, clear the retained message on that topic, and turn on livestatus for instant updates on change.

Some controls do nothing. S21 is reverse-engineered and varies by model; powerful, econo, demand and similar may not exist on your unit and are simply ignored. The status JSON shows which controls your unit really exposes.

14. Quick reference cheat sheet

Replace GuestAC with your hostname and 192.168.1.10 with your broker.

Read (subscribe)

Topic What you receive
state/GuestAC Retained status JSON: power, mode, temp, home, outside, online, ...
state/GuestAC Payload false means the Faikout itself is offline.
setting/GuestAC Publish an empty payload and the device replies with its current settings.

Commands (publish to command/GuestAC/...)

Topic Payload
command/GuestAC/on, command/GuestAC/off none
command/GuestAC/heat cool auto fan dry none
command/GuestAC/low medium high none
command/GuestAC/temp 21
command/GuestAC/status none (forces a status report)
command/GuestAC/control JSON (see below)

The control payload

      {"power":true,"mode":"C","temp":24,"fan":"A","swingv":true}
    
Field Values
power true / false
mode H C A D F (heat, cool, auto, dry, fan)
temp number, °C
fan A Q 15 (auto, quiet, manual levels)
swingv swingh powerful econo streamer true / false
target number, or [min,max] (an array forces Faikout Auto)
env number (external reference for Faikout Auto)

Settings (publish to setting/GuestAC...)

Topic Payload
setting/GuestAC {"reporting":30,"livestatus":true} (several at once)
setting/GuestAC/reporting 30 (one at a time)

External sensor, keep on/off manual

Topic Payload
setting/GuestAC {"autop":false,"autoptemp":0}
command/GuestAC/control {"env":22.4} — resend within tcontrol (600 s)

Sources: RevK ESP32-Faikout firmware and manuals (README, Setup, Controls, Advanced) and ESP/main/settings.def on Codeberg (codeberg.org/RevK/ESP32-Faikout). Behaviour described matches the firmware as of June 2026; the device's own settings dump is authoritative for your installed version.