MCDU Smart Home Control

Control your smart home with WINWING MCDU hardware via MQTT

Current Release
0.2.2
Developer
Felix Hummel
License
MIT

MCDU Smart Home Adapter for ioBroker

Control your smart home through a WINWING MCDU-32-CAPTAIN aviation cockpit display via MQTT. This project levels up your smarthome with an authentic airline-style interface with scratchpad input, page navigation, confirmation dialogs, and a 14x24 character display with 8 colors.

We all were there before: Mounting tablets on walls for smarthome control, messing with cumbersome visualizations, taking ages to get to the right switch to control a lightbulb. Having a pilot in my family I had an immediate incling when I saw the cockpit MCDU: Easy concept for data entry, quick selection of the right data point. And then I found a fantastic product from Winwing https://eu.winctrl.com/view/goods-details.html?id=945 and started with the reverse engineering. shout out to https://github.com/alha847 for the information provided on the device.

As I am not a developer but a tech geek, I used claude code in a structured way. first for gathering information on the device and reverse engineering it, then for structuring the right architecture for the smart home context and then developing the adapter for iobroker and the client for the raspberry. Thanks and shout outs to the great open source community, especially https://github.com/klein0r and his great videos on adapter development and iobroker smarthome applications of all sorts.

this is the first version of the adapter and client. I still have to test it properly and make some improvements. Feel free to contribute to it.

Project status: contributors welcome

As of August 2026 the original author has moved his own smart home to Home Assistant and maintains a sibling integration there: homeassistant-mcdu. This ioBroker adapter is not abandoned — it works and stays available — but active development has moved. Contributions and co-maintainers are very welcome.

Both projects share the same Raspberry Pi client and the same MQTT protocol, which is now frozen and documented as a versioned contract in docs/PROTOCOL.md. Please implement against that specification so the client keeps working for both worlds. The reasoning behind the split is written up in docs/HOME-ASSISTANT-CONCEPT.md.

Note: only one "brain" may drive a given MCDU at a time. Display topics are retained — if this adapter and the Home Assistant integration publish to the same device simultaneously, the display will flicker.

Known open bug: lib/mqtt/ButtonSubscriber.js handles PREV_PAGE / NEXT_PAGE, but the client only ever sends SLEW_LEFT / SLEW_RIGHT / SLEW_UP / SLEW_DOWN (see mcdu-client/lib/button-map.json). SLEW navigation therefore appears to be dead in this adapter. A good first contribution.

Architecture

ioBroker Adapter (main.js)  <-->  MQTT Broker  <-->  RasPi Client (mcdu-client/)  <-->  USB HID Hardware

The ioBroker adapter runs all business logic (page rendering, input handling, validation). The Raspberry Pi client is a "dumb terminal" that bridges MQTT messages to the USB HID hardware -- it contains no business logic.

Features

  • 14x24 character display with 8 colors (white, amber, cyan, green, magenta, red, yellow, grey)
  • 73 buttons including 12 Line Select Keys, 12 function keys, full alphanumeric keypad
  • 11 LEDs (9 indicators + 2 backlights with BRT/DIM brightness control)
  • Per-line color control: independent colLabel and colData colors, per-page status bar color
  • Aviation-style input: scratchpad on line 14, LSK-based field selection, OVFY confirmation
  • Page system: configurable pages with sub-labels, automatic pagination, layout types (menu/data/list)
  • Function keys: 11 configurable keys (MENU, INIT, DIR, FPLN, PERF, etc.) with per-device mapping
  • Navigation: parent hierarchy, breadcrumb status bar, circular SLEW, CLR-to-parent
  • Validation engine: keystroke, format, range, and business logic validation levels
  • Confirmation dialogs: soft (LSK or OVFY) and hard (OVFY only) for critical actions
  • Multi-device support: multiple MCDUs via per-device MQTT topic namespaces
  • 32 automation states: LED control, scratchpad, notifications, button triggers from ioBroker scripts

Development Status

PhaseStatus
Adapter Foundation (MQTT, state tree, display)Done
Input System (scratchpad, validation, confirmation)Done
Business Logic (rendering, pagination, function keys)Done
Admin UI Redesign + Left/Right Line ModelDone
UX Phase A: Function Key ConfigurationDone
UX Phase B: Navigation Hierarchy & BreadcrumbsDone
UX Phase C: Page Layout Types (menu/data/list)Done
Display Enhancement (color split, brightness, device states)Done
UX Phase D: Quick Access PageNot started
UX Phase E: LED Assignment ConfigurationNot started
UX Phase F: Configuration ProfilesNot started
UX Phase G: Admin UI Polish & IntegrationNot started
Hardware Deployment TestingNot started

199 tests passing (188 unit + 11 integration).

Recommended Hardware (mcdu-client)

The mcdu-client is a lightweight Node.js process (~50-100MB RAM) that bridges MQTT to USB HID. It needs WiFi, a USB Host port, and enough USB power for the MCDU (~500mA).

BoardPriceWiFiUSB HostVerdict
Raspberry Pi 4 (1-2GB)$35-45Dual-band4x USB-ARecommended -- best balance of price, power, and simplicity
Raspberry Pi 3B+~$35Dual-band4x USB-AProven (current dev setup), slightly slower
Raspberry Pi 5$50-80Dual-band4x USB-AGood, but needs official 27W PSU for full USB power output
Raspberry Pi Zero 2 W~$152.4GHzOTG adapter neededCheap but fiddly single-port OTG setup
ESP32-S3$5-15YesUSB OTGCannot run Node.js -- would require full C++ rewrite

Key constraint: The WinWing MCDU firmware requires SET_REPORT control transfers (not interrupt OUT). The mcdu-client uses node-hid which handles this automatically on all platforms (IOHIDManager on macOS, hidraw on Linux).

Quick Start (Development)

npm install
npm test          # Run all tests
npm run lint      # ESLint
npm run check     # Lint + test combined

For detailed documentation, see docs/.

Scripts

ScriptDescription
npm testRun all tests
npm run test:unitUnit tests only
npm run test:integrationIntegration tests only
npm run test:watchWatch mode for unit tests
npm run lintESLint
npm run lint:fixESLint with auto-fix
npm run checkLint + test combined

Changelog

WORK IN PROGRESS

  • (Flixhummel) Address ioBroker adapter review feedback (reviewer McM1957)
  • (Flixhummel) Migrate to ESLint 9 flat config with @iobroker/eslint-config v2.2.0
  • (Flixhummel) MQTT password now stored encrypted -- users must re-enter password once after updating
  • (Flixhummel) Fix object hierarchy: devices container changed from channel to folder
  • (Flixhummel) Fix 12+ state roles to match ioBroker standards
  • (Flixhummel) Replace native setTimeout/setInterval with adapter equivalents
  • (Flixhummel) Consolidate i18n translations to flat JSON files, move i18n.js to scripts/
  • (Flixhummel) Remove unused admin/jsonConfig-complexversion.json

0.2.0 (2026-02-28)

  • (Flixhummel) Fix error display for read-only datapoints, improve save config handling

0.1.9 (2026-02-27)

  • (Flixhummel) Unify MCDU driver to node-hid on all platforms, clean up mcdu-client setup

0.1.8 (2026-02-26)

  • (Flixhummel) Remove unpublished news entries and add missing jsonConfig size attributes

0.1.7 (2026-02-25)

  • (Flixhummel) Fix ioBroker repository checker errors and warnings

0.1.4 (2026-02-25)

  • (Flixhummel) Switch to npm trusted publishing (OIDC) for automated releases

0.1.3 (2026-02-25)

  • (Flixhummel) Initial npm release with MQTT bridge, page system, admin UI, and automation states

For detailed changelog see CHANGELOG.md.

License

MIT License

Copyright (c) 2026 Flixhummel hummelimages@googlemail.com

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.