@gybalazs/node-red-contrib-daikin-faikout 0.1.1
Daikin air-conditioner control & telemetry for Node-RED — native stock BRP069Bxx (HTTP) and Faikin/Faikout (MQTT/WebSocket) backends, headless canonical core nodes. Pairs with the node-red-dashboard-2-ac-control widgets, or use it with any dashboard or au
@gybalazs/node-red-contrib-daikin-faikout
Control and read Daikin air conditioners from Node-RED, over the factory Wi-Fi adapter (BRP069Bxx, local HTTP) or a Faikin/Faikout ESP32 board (MQTT or WebSocket). Headless: it speaks one canonical schema, so it works with any dashboard, automation, or database — with or without a UI.
Pairs with @gybalazs/node-red-dashboard-2-ac-control for a ready-made FlowFuse Dashboard 2.0 control panel, but needs neither it nor a dashboard to run.
Install
npm install @gybalazs/node-red-contrib-daikin-faikout
Or Menu → Manage palette → Install. Node-RED ≥ 3, Node.js ≥ 18.
Docker: installing into the image works for these core nodes as-is. The companion widget package needs one extra step — see its README.
Nodes
| Node | Role |
|---|---|
| daikin unit (config) | One air conditioner. Owns the connection + state; picks the backend (stock / Faikout) and transport (HTTP poll / MQTT / WebSocket / mock). Sibling nodes subscribe to it. |
| daikin ac | Controller. Input: a canonical command ({ "setpoint": 22 }). Output 1: the full canonical state on every change. In MQTT mode, output 2 is the encoded device command for an mqtt out node. |
| daikin telemetry | Live metrics. Output 1: canonical telemetry (for dashboards/automations). Output 2: InfluxDB-ready [fields, tags]. |
Quick start (no hardware)
Import Import → Examples → @gybalazs/node-red-contrib-daikin-faikout, or set a daikin unit
to transport: mock. A simulated unit runs entirely in memory — inject
{"power":true,"mode":"cool","setpoint":23} into the daikin ac node and watch the canonical
state come out.
The canonical schema
Everything speaks this one shape, so any producer can drive the UI and any consumer can read it.
// control (settable + reported)
{ "power": true, "mode": "cool", // auto | cool | heat | dry | fan
"setpoint": 22, "fan": "auto", // "auto" | 1..N | "quiet"
"swingV": false, "swingH": false,
"econo": false, "powerful": false, "streamer": false,
"comfort": false, "quiet": false, "sensor": false, "led": false,
"demand": 100, // outdoor-unit power cap %, 100 = no limit
"targetHum": 0 } // humidifying units only
// telemetry (reported)
{ "roomTemp": 24.5, "outdoorTemp": 31, "humidity": 52, "compHz": 42,
"powerW": 610, "fanRpm": 720, "liquidTemp": 12.5, "inletTemp": 25,
"energyTotalKwh": 1234.5, "energyHeatKwh": 220, "energyCoolKwh": 900 }
// meta (reported): name, backend, online, caps, error, defrosting
A partial payload merges into the state — a single key refreshes one control. The node also sends a
resolved caps object, so a UI knows exactly what this unit supports and hides the rest.
Backends
- Stock Daikin (BRP069Bxx, e.g. BRP069B42): local HTTP. No push API (polled), and no instantaneous wattage — it reports compressor Hz, runtime and cumulative kWh. Demand control and target humidity are read/probed from the device where supported.
- Faikout (ESP32): MQTT (recommended, pushes on change with
livestatus) or WebSocket. Reports the full set: instantaneous power, fan RPM, coolant/inlet temperatures, lifetime energy.
Capabilities are auto-detected from the device where possible (Faikout reports exactly which fields it supports); the config node lets you override.
Transports & wiring
- Stock → HTTP: managed. Set the host/IP and poll interval; nothing else to wire.
- Faikout → MQTT: you wire your own
mqtt in/mqtt out(your broker config is reused). The config node's edit dialog prints the exact topics. Enablelivestatuson the device. - Faikout → WebSocket: managed, push-based, no wiring.
- Mock: a simulator for testing, same code path as the real transports.
State lives in memory only; the device is the source of truth and is re-read immediately on start (retained MQTT / instant first poll), so a Node-RED restart loses nothing.
InfluxDB
Wire daikin telemetry output 2 straight into an influxdb out node. Only instantaneous
values are emitted — history belongs in the database and is charted back from there. Tags: unit,
backend.
Credits
The protocol handling is a clean-room reimplementation (zero legacy runtime deps), informed by:
- Apollon77/daikin-controller (stock BRP protocol)
- revk/ESP32-Faikin firmware (Faikin/Faikout API)
License
MIT © Balazs Gyarmati