Faikin Ninja P1P2 — MQTT manual

Faikin Australia

Controlling and monitoring a Faikin Ninja P1P2 over MQTT, from first setup through to the full topic, command and sensor 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 Ninja P1P2 over MQTT, from first setup through to the full topic, command and sensor reference.

This covers the Faikin Ninja module fitted to a Daikin P1/P2 control bus: VRV and VRF, Sky Air, F-series commercial, and ducted systems with an Airbase or zone controller. Throughout, the example base topic is ac/livingroom and the example broker IP is 192.168.1.10. Replace both with your own.

This is not the same MQTT interface as the Faikin Faikout. The Ninja runs different firmware with a different topic layout, so automations written for a Faikout will not carry over. If you have a Faikout, see the Faikin Faikout MQTT manual instead. Section 5 has a side-by-side comparison.

1. What MQTT gives you

The Ninja's built-in web page is enough for day to day use. MQTT is what you want when you need the air conditioner to be part of something bigger.

  • Automation. Trigger the unit from anything: presence, a schedule, an electricity price feed, a door sensor, another room's temperature.
  • Real instrumentation. The P1/P2 bus carries far more than on, off and temperature. The Ninja publishes indoor and outdoor thermistors, refrigerant pressures, expansion valve position, compressor and fan state, operating hours and the unit's own error codes. Most of this is invisible from the wall controller.
  • Ducted zones. If you have a Daikin zone controller, each damper becomes an individually controllable switch.
  • One place for everything. Home Assistant, Node-RED, openHAB and anything else that speaks MQTT can all see the same device at once.
  • It stays local. MQTT runs on your own broker on your own network. Nothing leaves the house and there is no account to create.

2. Before you start

You need three things.

  1. The Ninja on your WiFi, reachable at its own web page. If it is not, do the installation guide first.
  2. An MQTT broker on your network. If you are running Home Assistant, install the Mosquitto broker add-on; it takes a few minutes and gives you a broker plus a username and password. Otherwise any Mosquitto or compatible broker on a machine that stays on will do.
  3. The broker's IP address, username and password.

You do not need Home Assistant to use MQTT, and you do not need MQTT to use Home Assistant. They are separate choices that happen to work well together.

3. Step 1: Point the Ninja at your MQTT broker

Open the Ninja's web page and go to the MQTT settings.

Field What to put in it
Host Broker IP or hostname, e.g. 192.168.1.10.
Port The broker's port. 1883 unless you have changed it.
User Broker username, if yours uses one.
Password Broker password, if yours uses one.
Topic The first half of the base topic, e.g. ac.
Friendly Name The second half, e.g. livingroom.

The last two matter more than they look. The Ninja builds every one of its topics from them:

base topic = <Topic> / <Friendly Name>

So Topic = ac and Friendly Name = livingroom gives a base topic of ac/livingroom, and the state topic becomes ac/livingroom/state.

Pick both before you build any automation. Changing them later renames every topic and quietly breaks anything referring to the old ones. A useful convention is one shared prefix for all your units (ac) plus a room name that will not change (livingroom, masterbed, office).

Save, and the module reconnects and begins publishing.

4. Step 2: Confirm it is connected

You do not need a terminal for this. Two places tell you straight away.

On the Ninja's own page

Browse to the module. At the top of the page, beside the device name, it shows its broker status. MQTT connected means the module has reached your broker and is publishing.

If that is missing, either the host, port, username or password is wrong, or the broker is not reachable from the network the module is on. Re-check the MQTT settings, then see Troubleshooting.

In Home Assistant

Nothing to add by hand. The Ninja publishes Home Assistant's MQTT discovery messages, so once it reaches the broker, Home Assistant finds it on its own. As long as the MQTT integration is already set up and pointed at the same broker:

  1. Go to Settings > Devices & services > MQTT, then open the device list.
  2. Your device appears within a few seconds, named after the Friendly Name you set.
  3. Open it and the whole thing is there already: a climate entity with mode, target temperature, fan speed and vane; a long list of diagnostic sensors; and, if you have a zone controller, a switch for each damper zone.

You should never need to hand-write a climate entity in YAML for a Ninja. If you find yourself doing that, something upstream is wrong.

If you would rather check from a terminal

Optional, and only worth it if you already have the mosquitto client tools installed:

mosquitto_sub -h 192.168.1.10 -u USER -P PASS -t 'ac/livingroom/#' -v

You should see ac/livingroom/availability reporting online, and a full JSON payload on ac/livingroom/state.

If nothing arrives, jump to Troubleshooting.

5. The topic structure

Everything hangs off the base topic you built in section 3. With base topic ac/livingroom:

Climate and control

Topic Direction What it does
ac/livingroom/power/set you publish Power on or off.
ac/livingroom/mode/set you publish Operating mode.
ac/livingroom/temp/set you publish Target temperature.
ac/livingroom/fan/set you publish Fan speed.
ac/livingroom/vane/set you publish Vane position or swing.
ac/livingroom/zone/<1..8>/set you publish Open or close one damper zone.
ac/livingroom/state module publishes Full state as one JSON object.
ac/livingroom/availability module publishes online or offline.

System and management

Topic Direction What it does
ac/livingroom/system/set you publish restart, upgrade or factory.
ac/livingroom/system/set_safemode you publish Safe Mode on or off.
ac/livingroom/system/set_min_temp you publish Minimum setpoint limit.
ac/livingroom/system/set_max_temp you publish Maximum setpoint limit.
ac/livingroom/system/set_modbus_rtu_id you publish Modbus RTU slave ID.
ac/livingroom/system/opt/rqt you publish JSON options request.
ac/livingroom/system/opt/rps module publishes Echo of accepted options.
ac/livingroom/system/info module publishes Bridge telemetry JSON.

For most automation you only need three: publish to the .../set topics, and subscribe to state and availability.

If you also have a Faikout

The two products take opposite approaches, so it is worth seeing them together.

Faikin Faikout Faikin Ninja P1P2
Topic shape command/<host>/..., state/<host> <topic>/<name>/...
Setting one control One JSON control message with many fields One small topic per control
Reading state JSON on state/<host> JSON on <base>/state
Presence state/<host> payload false <base>/availability payload offline
Settings setting/<host> JSON <base>/system/... topics
Depth of data Room, coil, outside temp, power Plus outdoor thermistors, pressures, EV pulses, op hours, error codes
Zones Not supported Up to 8 damper zones

6. Sending commands

Publish a plain string to the relevant .../set topic. There is no JSON wrapper: the payload is the bare value.

power/set

Payload Effect
ON Turn on, restoring the last mode, temperature, fan and vane.
OFF Turn off.

mode/set

Payload Effect
heat Heating.
cool Cooling.
dry Dehumidify.
fan_only Fan, no heating or cooling.
off Power off.

temp/set

The target temperature as a number, e.g. 24. Range 16 to 32 °C, in 1.0 °C steps. You can narrow that range with system/set_min_temp and system/set_max_temp (section 11).

fan/set

Which speeds you get depends on the indoor unit. The module reports the ones your unit actually supports; sending one it does not have is ignored.

Payload Description
low Low.
medium Medium.
high High.
auto Automatic.
low_auto Low auto (zone and Airbase systems).
medium_auto Medium auto (zone and Airbase systems).
high_auto High auto (zone and Airbase systems).

The common groupings are:

  • 3-speed with auto: low, medium, high, auto
  • 2-speed: low, high
  • 4-speed zone/Airbase: low, medium, low_auto, medium_auto
  • 6-speed zone/Airbase: low, medium, high, low_auto, medium_auto, high_auto

vane/set

Payload Description
1 Position 1, the top.
2 to 4 Intermediate positions.
5 Position 5, the bottom.
swing Continuous vertical swing.

Examples

# On, cooling, 24 C, auto fan, swinging
mosquitto_pub -h 192.168.1.10 -t 'ac/livingroom/power/set' -m 'ON'
mosquitto_pub -h 192.168.1.10 -t 'ac/livingroom/mode/set'  -m 'cool'
mosquitto_pub -h 192.168.1.10 -t 'ac/livingroom/temp/set'  -m '24'
mosquitto_pub -h 192.168.1.10 -t 'ac/livingroom/fan/set'   -m 'auto'
mosquitto_pub -h 192.168.1.10 -t 'ac/livingroom/vane/set'  -m 'swing'

Because each control is its own topic, order does not matter and you can send only the ones you care about.

7. Ducted zones

If a Daikin zone controller is on the P1/P2 bus, the Ninja can open and close each damper.

Publish ON or OFF to ac/livingroom/zone/<n>/set, where <n> is 1 to 8:

# Open zone 1, close zone 3
mosquitto_pub -h 192.168.1.10 -t 'ac/livingroom/zone/1/set' -m 'ON'
mosquitto_pub -h 192.168.1.10 -t 'ac/livingroom/zone/3/set' -m 'OFF'

The state payload reports back:

Key Type Meaning
zone_count number How many zones were discovered, 1 to 8.
zone_1zone_8 boolean true is open, false is closed.
zone_name_1zone_name_8 string The names configured on the zone controller, e.g. "Master Bed".

In Home Assistant each active zone is auto-discovered as its own switch, so no configuration is needed.

Two practical notes. Zones only appear if a zone controller is present, so on a plain split there will be no zone keys at all. And closing every zone at once is a good way to make a ducted system unhappy: leave at least one open, or turn the unit off instead.

8. Reading status

The module publishes one complete JSON object to <base>/state whenever anything changes.

Only sensors your unit actually reports appear. The Ninja detects what the connected indoor and outdoor units publish and hides the rest, so your payload will be shorter than the example below, and two different Daikins will produce different keys. This is normal. Write automations against the keys you can see on your own unit.

{
  "power": "on",
  "mode": "cool",
  "action": "cooling",
  "temperature": 24,
  "fan": "auto",
  "vane": "swing",
  "room_temperature": 25.5,
  "outside_temperature": 32.0,
  "f_intake_temp": 25.0,
  "f_indoor_th1": 18.2,
  "f_indoor_th2": 24.8,
  "f_outdoor_th1": 32.0,
  "f_outdoor_th3": 75.4,
  "f_pe_pressure": 0.83,
  "f_pc_pressure": 2.40,
  "f_drain_pump": false,
  "f_electric_heater": false,
  "f_comp_operating": true,
  "operating": true,
  "f_fan_step": 3,
  "f_ev_pulses": 240,
  "f_id_op_hours": 1250,
  "f_error_present": false,
  "f_error_code": "",
  "f_indoor_model": "FBA100BVMA",
  "f_outdoor_model": "RZA100DV1",
  "zone_count": 4,
  "zone_1": true,
  "zone_2": true,
  "zone_3": false,
  "zone_4": false
}

The keys worth knowing first:

Key Meaning
power on or off. What you asked for.
mode The mode you asked for.
action What the unit is actually doing right now: cooling, heating, idle and so on. This is the one to watch, not power.
temperature Your target, not the room.
room_temperature The room, as the unit measures it.
operating Whether the system is actively running.
f_error_present / f_error_code Daikin's own fault flag and code, e.g. "A9-01".

A unit can be "power": "on" with "action": "idle" and that is perfectly normal: it has reached temperature. If you want to know whether it is really working, look at action, operating or f_comp_operating.

Subscribe to <base>/availability as well. offline there means the module has dropped off, which is different from the air conditioner being off.

9. Home Assistant over MQTT

Add the MQTT integration and point it at the same broker. That is the whole setup: the Ninja announces itself and Home Assistant builds everything.

What you get:

  • A climate entity with modes heat, cool, dry, fan_only and off, your unit's fan modes, swing positions 1 to 5 and swing, and a 1.0 °C step.
  • Sensors and binary sensors for every thermistor, pressure, actuator, hour counter, error code and model string your unit reports. Most land under Diagnostic.
  • Switches for each active damper zone.

Entity IDs follow the Friendly Name, so with livingroom you will get climate.livingroom, sensor.livingroom_outside_temperature, switch.livingroom_zone_1 and so on. Check the exact names in Developer tools > States before writing YAML.

A dashboard card

type: vertical-stack
cards:
  - type: thermostat
    entity: climate.livingroom

  - type: entities
    title: Zones
    entities:
      - entity: switch.livingroom_zone_1
        name: Living
      - entity: switch.livingroom_zone_2
        name: Master bed
      - entity: switch.livingroom_zone_3
        name: Study
      - entity: switch.livingroom_zone_4
        name: Kids

  - type: glance
    title: Right now
    columns: 3
    entities:
      - entity: sensor.livingroom_room_temperature
        name: Room
      - entity: sensor.livingroom_outside_temperature
        name: Outside
      - entity: binary_sensor.livingroom_compressor_operating
        name: Compressor

  - type: history-graph
    hours_to_show: 24
    entities:
      - sensor.livingroom_room_temperature
      - sensor.livingroom_outside_temperature
      - sensor.livingroom_od_pc_pressure

An automation

Turning the unit off once the house is comfortable, using action rather than power so it does not fire while the unit is still working:

alias: Living room off when settled
triggers:
  - trigger: state
    entity_id: climate.livingroom
    attribute: hvac_action
    to: idle
    for: "00:20:00"
conditions:
  - condition: numeric_state
    entity_id: sensor.livingroom_room_temperature
    below: 25
actions:
  - action: climate.turn_off
    target:
      entity_id: climate.livingroom
mode: single

Watching for faults

alias: Air conditioner fault
triggers:
  - trigger: state
    entity_id: binary_sensor.livingroom_ac_error_present
    to: "on"
actions:
  - action: notify.mobile_app_phone
    data:
      title: Air conditioner fault
      message: >-
        Error {{ states('sensor.livingroom_ac_error_code') }} on
        {{ state_attr('climate.livingroom','friendly_name') }}.
mode: single

That one is worth setting up. The error code is the same code a technician would read off the wall controller, and knowing it before you call saves a visit.

10. Other platforms

The same topics work everywhere. Publish strings to <base>/…/set, subscribe to <base>/state.

mosquitto command line

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

# Turn on and cool to 23
mosquitto_pub -h 192.168.1.10 -t 'ac/livingroom/power/set' -m 'ON'
mosquitto_pub -h 192.168.1.10 -t 'ac/livingroom/mode/set'  -m 'cool'
mosquitto_pub -h 192.168.1.10 -t 'ac/livingroom/temp/set'  -m '23'

# Open zone 1
mosquitto_pub -h 192.168.1.10 -t 'ac/livingroom/zone/1/set' -m 'ON'

Node-RED

Use an MQTT in node on ac/livingroom/state with output set to a parsed JSON object, then read msg.payload.power, msg.payload.room_temperature and so on.

To send, use MQTT out with the topic and payload left blank so they come from the message. Payloads must be strings, so convert numbers first.

Set the whole unit in one go:

const base = "ac/livingroom";
return [
    { topic: base + "/power/set", payload: "ON" },
    { topic: base + "/mode/set",  payload: "cool" },
    { topic: base + "/temp/set",  payload: "24" },
    { topic: base + "/fan/set",   payload: "auto" }
];

A dashboard slider driving the target temperature:

msg.topic = "ac/livingroom/temp/set";
msg.payload = String(msg.payload);
return msg;

Turn on only if it is currently off:

const p = typeof msg.payload === 'string'
    ? JSON.parse(msg.payload)
    : msg.payload;
if (p.power !== "on") {
    return [{ topic: "ac/livingroom/power/set", payload: "ON" }];
}
return null;

Subscribing to ac/livingroom/availability is a cheap way to grey out your dashboard when the module drops off.

openHAB

Add an MQTT broker Thing, then a Generic MQTT Thing with channels pointing at the topics. A switch channel on ac/livingroom/power/set with ON/OFF, a number channel on ac/livingroom/temp/set, and state channels reading ac/livingroom/state with a JSONPATH transform such as $.room_temperature.

11. System management and options

These live under <base>/system/. Most of them reboot the module, so do not wire them into anything that fires often.

system/set

Payload Effect
restart Reboots the module after about three seconds.
upgrade Checks for a firmware update over the air immediately.
factory Clears all stored settings, factory resets and reboots.

factory wipes your WiFi and MQTT settings too, so the module comes back on its own setup network and has to be reconfigured from scratch. Treat it as a last resort.

Temperature limits

Topic Payload Effect
system/set_min_temp 16 to 32 Sets the lowest target anyone can select. Reboots.
system/set_max_temp 16 to 32 Sets the highest target anyone can select. Reboots.

Useful in a rental or an office: cap the range and nobody can set 16 °C in July.

Safe Mode

system/set_safemode with on or off. Reboots.

Modbus RTU ID

system/set_modbus_rtu_id with a number from 1 to 254, for building-management installations using the RS485 build. Reboots.

Options over MQTT

system/opt/rqt takes a JSON object and lets you change several settings at once without the web page:

{
  "options": {
    "homekit": "On",
    "mode": "All",
    "safemode": "Off",
    "webpanel": "On"
  }
}
Key Values Meaning
homekit On, Off Apple Home support.
mode All, NoHeat, NoAuto Which modes to expose. NoHeat suits a cooling-only installation.
safemode On, Off Safe Mode.
webpanel On, Off The built-in web page.

Whatever is accepted is echoed back on system/opt/rps, so subscribe there to confirm rather than assuming.

Turning webpanel off removes your own way back in. Only do it if you are certain MQTT is working.

system/info

Published periodically:

{
  "connection_state": "online",
  "safe_mode": "Off",
  "reset_reason": "Software reset via ESP_RESTART",
  "web_panel": "On",
  "free_heap": "68.45",
  "rssi": "-62",
  "bssid": "AA:BB:CC:DD:EE:FF",
  "up_time": 172800,
  "min_temp": 16,
  "max_temp": 32,
  "protocol_ver": "P1P2"
}

rssi is the one to watch. Anything worse than about -80 dBm and you should move the module out of the metal casing before blaming anything else.

12. Sensor reference

Everything below is detected automatically. If your unit does not report it, the key is absent from the state payload and no entity is created in Home Assistant. A short list is not a fault.

The main ones

Key Name Unit Description
room_temperature Room Temperature °C Indoor ambient temperature.
outside_temperature Outside Temperature °C Outdoor ambient, from outdoor thermistor 1.
f_intake_temp Intake Temperature °C Return air temperature at the indoor unit.

Indoor thermistors

Key Name Description
f_indoor_th1 Indoor TH1 Liquid pipe.
f_indoor_th2 Indoor TH2 Gas pipe.
f_indoor_th3 Indoor TH3 Heat exchanger.
f_indoor_th4f_indoor_th6 Indoor TH4 to TH6 Model specific.
f_return_air_temp_1f Return Air Temp 1F Decoded return air temperature, where supported.
f_coil_temp_1f Coil Temp 1F Decoded indoor coil temperature, where supported.

Outdoor thermistors and pressures

Key Name Unit Description
f_outdoor_th1 Outdoor TH1 °C Outdoor ambient air.
f_outdoor_th2 Outdoor TH2 °C Outdoor heat exchanger.
f_outdoor_th3 Outdoor TH3 °C Discharge pipe.
f_outdoor_th4 Outdoor TH4 °C Suction pipe.
f_outdoor_th5, f_outdoor_th6 Outdoor TH5, TH6 °C Model specific.
f_pe_pressure OD Pe Pressure MPa Low-side pressure.
f_pc_pressure OD Pc Pressure MPa High-side pressure.

Discharge temperature and the two pressures together are the closest thing you get to a live health check on the outdoor unit. Graph them over a season and an abnormal reading stands out long before anything trips.

Actuators and running state

Key Name Type Description
f_comp_operating Compressor Operating boolean Outdoor compressor running.
f_drain_pump ID Drain Pump boolean Indoor condensate drain pump.
f_electric_heater ID Electric Heater boolean Auxiliary electric heater.
f_humidifier ID Humidifier boolean Indoor humidifier.
f_anti_freezing ID Anti Freezing boolean Anti-freeze protection active.
f_solenoid_valve OD Solenoid Valve boolean Outdoor solenoid valve.
f_active_1f Loop Active 1F boolean Loop active indicator.
f_fan_step OD Fan Step step Outdoor fan step level.
f_ev_pulses ID EV Pulses pulse Indoor expansion valve opening.
f_ev1_pulses OD EV1 Pulses pulse Outdoor expansion valve opening.

Hours and faults

Key Name Unit Description
f_id_op_hours ID Op Hours h Indoor unit operating hours.
f_id_fan_hours ID Fan Hours h Indoor blower hours.
f_id_pwr_hours ID Pwr Hours h Indoor unit powered-on hours.
f_error_present AC Error Present Active fault flag.
f_error_code AC Error Code Daikin error code, e.g. "A9-01", "E7-57". Empty when healthy.
f_has_error_history Has Error History Whether the unit holds historical fault records.
f_indoor_model Indoor Model Indoor model string.
f_outdoor_model Outdoor Model Outdoor model string.

Where the unit keeps a fault history, each recorded event carries a row number, the code, the date and the unit number:

[
  {"row": 1, "code": "A9-01", "date": "17/01/24", "unit": 0},
  {"row": 2, "code": "E7-57", "date": "10/11/23", "unit": 0},
  {"row": 3, "code": "C2-04", "date": "05/08/23", "unit": 0}
]

Module telemetry

Key Name Unit Description
up_time Up Time s Since last reboot.
free_heap Free Heap % Free RAM.
rssi RSSI dBm WiFi signal strength.
bssi BSSI BSSID of the access point it is joined to.
reset_reason Reset Reason Why it last restarted.
protocol_ver Protocol Version Active protocol, P1P2.
min_temp, max_temp Target limits °C Configured setpoint limits.
modbus_rtu_id Modbus RTU ID Configured slave ID.

13. Troubleshooting

No MQTT connected badge on the web page. Check the host and port, then the username and password. If the broker is on a different VLAN or subnet from the module, that is usually the real problem.

Badge shows connected, but nothing appears in Home Assistant. Confirm Home Assistant's MQTT integration is pointed at the same broker. Two brokers on one network is a common and confusing mistake. Then check discovery is enabled in the module's settings.

Some sensors are missing. Expected. Only what the connected units report is published, and a small split will show far less than a VRV. Not a fault.

No zone switches. Zones need a Daikin zone controller on the P1/P2 bus. Without one there is nothing to control.

Commands are ignored. Payloads are plain strings and are case-sensitive as documented: ON and OFF in upper case for power and zones, mode names in lower case. Sending a number rather than a string for the temperature will fail in some clients, Node-RED included.

Temperature will not go where you want. Check min_temp and max_temp in system/info. Someone may have narrowed the range.

It keeps dropping out. Look at rssi in system/info. Around -80 dBm or worse is marginal. Move the module outside the metal casing.

The unit is on but nothing is happening. Look at action and f_comp_operating. If action is idle, it has reached temperature. If the compressor never runs and f_error_present is true, read f_error_code and quote it to your installer.

Everything stopped after a settings change. Renaming the Topic or Friendly Name renames every topic. Your automations are still pointed at the old ones.

14. Quick reference cheat sheet

Base topic ac/livingroom. Replace with yours.

Read (subscribe)

Topic Content
ac/livingroom/state Full JSON state
ac/livingroom/availability online / offline
ac/livingroom/system/info Module telemetry JSON
ac/livingroom/system/opt/rps Echo of accepted options

Control (publish)

Topic Payload
ac/livingroom/power/set ON, OFF
ac/livingroom/mode/set heat, cool, dry, fan_only, off
ac/livingroom/temp/set 16 to 32
ac/livingroom/fan/set low, medium, high, auto, low_auto, medium_auto, high_auto
ac/livingroom/vane/set 1 to 5, swing
ac/livingroom/zone/1/setzone/8/set ON, OFF

System (publish)

Topic Payload
ac/livingroom/system/set restart, upgrade, factory
ac/livingroom/system/set_safemode on, off
ac/livingroom/system/set_min_temp 16 to 32
ac/livingroom/system/set_max_temp 16 to 32
ac/livingroom/system/set_modbus_rtu_id 1 to 254
ac/livingroom/system/opt/rqt {"options":{"homekit":"On","mode":"All"}}

Keys worth watching

Key Why
action What it is really doing, not what you asked for
room_temperature The actual room
f_comp_operating Whether the compressor is running
f_error_present, f_error_code Faults, in Daikin's own codes
rssi WiFi headroom, in system/info

Sources: the Faikin Ninja P1P2 MQTT protocol documentation. Behaviour described matches the firmware as of August 2026; your module's own web page and published system/info are authoritative for the version you have installed. Sensor availability varies by indoor and outdoor unit.