matterbridge-dyson-robot
Version:
A Matterbridge plugin that connects Dyson robot vacuums and air treatment devices to the Matter smart home ecosystem via their local or cloud MQTT APIs.
162 lines • 11.2 kB
JavaScript
// Matterbridge plugin for Dyson robot vacuum and air treatment devices
// Copyright © 2025 Alexander Thoukydides
import { Dyson360State } from './dyson-360-types.js';
// Dyson robot vacuum states that map to errors
export const DYSON_360_FAULT_STATES = new Map([
[Dyson360State.MachineOff, { msg: 'Offline' }],
[Dyson360State.FaultCallHelpline, { msg: 'Call Dyson helpline' }],
[Dyson360State.FaultContactHelpline, { msg: 'Contact Dyson helpline' }],
[Dyson360State.FaultCritical, { msg: 'Critical fault' }],
[Dyson360State.FaultGettingInfo, { msg: 'Getting info' }],
[Dyson360State.FaultLost, { msg: 'Lost location', opError: 'UnableToCompleteOperation' }],
[Dyson360State.FaultOnDock, { msg: 'Fault on dock' }],
[Dyson360State.FaultOnDockCharged, { msg: 'Fault on dock (charged)' }],
[Dyson360State.FaultOnDockCharging, { msg: 'Fault on dock (charging)' }],
[Dyson360State.FaultReplaceOnDock, { msg: 'Place on dock', opError: 'FailedToFindChargingDock' }],
[Dyson360State.FaultReturnToDock, { msg: 'Unable to return to dock', opError: 'FailedToFindChargingDock' }],
[Dyson360State.FaultRunningDiagnostic, { msg: 'Running diagnostic' }],
[Dyson360State.FaultUserRecoverable, { msg: 'User-recoverable fault', opError: 'Stuck' }],
[Dyson360State.FullCleanAbandoned, { msg: 'Abandoned clean', opError: 'UnableToCompleteOperation' }]
]);
export const DYSON_360_FAULT_CATEGORIES = {
AIRWAYS: { msg: 'Airways fault', /* Lights: 1 red */ opError: 'DustBinFull' },
BRUSH_BAR_AND_TRACTION: { msg: 'Robot stuck', /* Lights: 2 red */ opError: 'Stuck' },
CHARGE_STATION: { msg: 'Unable to return to dock', /* Lights: 3 red */ opError: 'FailedToFindChargingDock' },
OPTICS: { msg: 'Optical sensors fault' /* Lights: 4 red */ },
LOST: { msg: 'Navigation fault', /* Lights: Red battery */ opError: 'UnableToCompleteOperation' },
BATTERY: { msg: 'Battery fault', batFault: 'Unspecified', chargeFault: 'Unspecified' }
};
// Specific faults/ranges
export const DYSON_360_FAULT_CODES = [
// Dyson 360 Eye faults (observed)
['1.0.-1', { msg: 'Bin full or airways blocked', opError: 'DustBinFull' }],
['3.5.-1', { msg: 'Brush bar or tracks stuck', opError: 'Stuck' }],
['7.0.-1', { msg: 'Bin missing or not detected', opError: 'DustBinMissing' }],
['9.0.-1', { msg: 'Unable to return to dock', opError: 'FailedToFindChargingDock' }],
// Dyson 360 Vis Nav fault,
// https://support.dyson.com.au/supportHome/Vacuums/Robots/360visnav/304640-01/using-your-robot/fault-codes
['1.0.#', { msg: 'Airways blocked', opError: 'DustBinFull' }],
['1.2.#', { msg: 'Check bin level', opError: 'DustBinFull' }],
['1.4.#', { msg: 'Vacuum calibration missing' }],
[['1.5.#', '1.6.#'], { msg: 'Filter not detected', opError: 'DustBinMissing' }],
[['1.7.#', '1.8.#'], { msg: 'Check airways', opError: 'DustBinFull' }],
['3.3.#', { msg: 'Brush bar motor too hot', batFault: 'OverTemp' }],
['3.4.#', { msg: 'Wheel motor too hot', batFault: 'OverTemp' }],
['3.5.#', { msg: 'Brush bar stuck', opError: 'Stuck' }],
['3.6.#', { msg: 'Wheel stuck', opError: 'Stuck' }],
[['3.7.#', '3.8.#'], { msg: 'Wheel hardware failure', opError: 'Stuck' }],
['3.9.#', { msg: 'Robot stuck', opError: 'Stuck' }],
[['3.10.#', '3.15.#'], { msg: 'ADC error' }],
['3.16.#', { msg: 'Brush bar stuck', opError: 'Stuck' }],
['3.16.12', { msg: 'Brush bar motor too hot', batFault: 'OverTemp' }],
['3.16.13', { msg: 'Brush bar motor too cold', batFault: 'UnderTemp' }],
['3.16.16', { msg: 'Brush bar motor winding failure' }],
['3.16.30', { msg: 'Brush bar communication failure' }],
['3.16.33', { msg: 'Brush bar communication failure' }],
['3.17.#', { msg: 'Wheel stuck', opError: 'Stuck' }],
['3.19.#', { msg: 'Wheel stuck', opError: 'Stuck' }],
[['3.20.#', '3.21.#'], { msg: 'Edge actuator stuck', opError: 'Stuck' }],
['3.22.#', { msg: 'Edge actuator switch stuck', opError: 'Stuck' }],
['3.23.#', { msg: 'Brush bar stuck', opError: 'Stuck' }],
['3.23.12', { msg: 'Brush bar motor too hot', batFault: 'OverTemp' }],
['3.23.13', { msg: 'Brush bar motor too cold', batFault: 'UnderTemp' }],
['3.23.16', { msg: 'Brush bar motor winding failure' }],
['3.23.30', { msg: 'Brush bar communication failure' }],
['3.23.33', { msg: 'Brush bar communication failure' }],
[['3.100.#', '3.112.#'], { msg: 'Safety prevents motion', opError: 'Stuck' }],
['3.113.#', { msg: 'Left wheel - Wheel motor too cold', batFault: 'UnderTemp' }],
[['3.114.#', '3.115.#'], { msg: 'Left wheel - Wheel motor too hot', batFault: 'OverTemp' }],
[['3.116.#', '3.120.#'], { msg: 'Safety prevents motion', opError: 'Stuck' }],
['3.121.#', { msg: 'Right wheel - Wheel motor too cold', batFault: 'UnderTemp' }],
[['3.122.#', '3.123.#'], { msg: 'Right wheel - Wheel motor too hot', batFault: 'OverTemp' }],
[['3.124.#', '3.128.#'], { msg: 'Safety prevents motion', opError: 'Stuck' }],
['3.129.#', { msg: 'Brush bar motor too cold', batFault: 'UnderTemp' }],
[['3.130.#', '3.131.#'], { msg: 'Brush bar motor too hot', batFault: 'OverTemp' }],
[['5.0.#', '5.2.#'], { msg: 'Battery pack - ADC error', batFault: 'Unspecified', chargeFault: 'Unspecified' }],
['5.3.#', { msg: 'Battery locked out', batFault: 'Unspecified', chargeFault: 'SafetyTimeout' }],
['5.4.#', { msg: 'Battery disconnected', batFault: 'Unspecified', chargeFault: 'BatteryAbsent' }],
['5.5.#', { msg: 'Battery low voltage', batFault: 'Unspecified', chargeFault: 'BatteryUnderVoltage' }],
['5.6.#', { msg: 'Battery charge required', batFault: 'Unspecified' }],
[['5.7.#', '5.9.#'], { msg: 'Battery too hot', batFault: 'OverTemp', chargeFault: 'BatteryTooHot' }],
['5.10.#', { msg: 'Unable to shut down' }],
['7.#.#', { msg: 'Bin not detected', opError: 'DustBinMissing' }],
['9.#.#', { msg: 'Unable to dock', opError: 'FailedToFindChargingDock' }],
[['11.0.#', '11.1.#'], { msg: 'Distance sensor calibration error' }],
['11.2.#', { msg: 'ADC error' }],
['11.3.#', { msg: 'Distance sensor error' }],
['11.5.#', { msg: 'Camera calibration error' }],
['11.6.#', { msg: 'Camera unplugged' }],
['11.7.#', { msg: 'Distance sensor error' }],
['11.8.#', { msg: 'Distance sensor calibration error' }],
['11.9.#', { msg: 'Distance sensor calibration error' }],
['11.10.#', { msg: 'Drop detected at start of clean', opError: 'UnableToStartOrResume' }],
[['11.11.#', '11.14.#'], { msg: 'ADC error' }],
['11.15.#', { msg: 'Unclean distance sensor' }],
['11.16.#', { msg: 'Distance sensor error' }],
['11.17.#', { msg: 'Distance sensor communication error' }],
['11.18.#', { msg: 'Distance sensor calibration error' }],
['11.19.#', { msg: 'Drop sensor maintenance alert' }],
['11.20.#', { msg: 'Non-drop sensor maintenance alert' }],
['11.21.#', { msg: 'Distance sensor error' }],
['11.22.#', { msg: 'Unclean distance sensor' }],
[['13.0.-1', '13.0.1'], { msg: 'Dirty obstacle sensors - Cannot find a route back to dock', opError: 'FailedToFindChargingDock' }],
[['13.1.#', '13.2.#'], { msg: 'Navigation sensor error' }],
['13.3.-1', { msg: 'Low battery', opError: 'UnableToCompleteOperation' }],
['13.3.1', { msg: 'Dirty obstacle sensors - Low battery', opError: 'UnableToCompleteOperation' }],
['13.4.#', { msg: 'Low battery at clean start', opError: 'UnableToStartOrResume' }],
['13.5.#', { msg: 'Camera exposure not settled' }],
[['13.6.#', '13.7.#'], { msg: 'Unable to start', opError: 'UnableToStartOrResume' }],
['13.8.#', { msg: 'Failed to set state' }],
['13.9.#', { msg: 'Unable to start', opError: 'UnableToStartOrResume' }],
['13.10.#', { msg: 'Insufficient features to find location', opError: 'UnableToCompleteOperation' }],
['13.12.#', { msg: 'High uncertainty in discovery', opError: 'UnableToCompleteOperation' }],
['13.13.#', { msg: 'Persistent location lost', opError: 'UnableToCompleteOperation' }],
['13.14.#', { msg: 'Discovered wrong floor', opError: 'UnableToCompleteOperation' }],
['13.15.#', { msg: 'Persistent location jump', opError: 'UnableToCompleteOperation' }],
['13.16.#', { msg: 'Software error' }],
['13.17.#', { msg: 'Replacement fault' }],
['13.18.#', { msg: 'Low battery', opError: 'FailedToFindChargingDock' }],
[['13.101.#', '13.102.#'], { msg: 'Safety prevents motion', opError: 'Stuck' }],
[['13.105.#', '13.106.#'], { msg: 'Safety prevents motion', opError: 'Stuck' }],
['13.132.#', { msg: 'Internal temperature too cold', batFault: 'UnderTemp' }],
[['13.133.#', '13.134.#'], { msg: 'Internal temperature too hot', batFault: 'OverTemp' }],
[['13.135.#', '13.151.#'], { msg: 'Safety prevents motion', opError: 'Stuck' }],
[['13.157.#', '13.162.#'], { msg: 'Safety prevents motion', opError: 'Stuck' }],
['17.0.#', { msg: 'Software error' }],
['17.2.#', { msg: 'Configuration data missing' }],
['17.3.#', { msg: 'Software error' }],
['17.4.#', { msg: 'Unable to start', opError: 'UnableToStartOrResume' }],
['17.5.#', { msg: 'Configuration data missing' }],
[['17.6.#', '17.8.#'], { msg: 'Unable to start', opError: 'UnableToStartOrResume' }],
['17.9.#', { msg: 'Inconsistent Sensor Time - Software error' }],
['17.10.#', { msg: 'Software error' }],
['17.11.#', { msg: 'Safety prevents motion', opError: 'Stuck' }],
['17.12.#', { msg: 'Edge actuator - Brush bar motor too hot', batFault: 'OverTemp' }],
['17.13.#', { msg: 'Could not start LCD screen' }],
['17.14.#', { msg: 'Low level PCB communication error' }],
['17.15.#', { msg: 'Wheel stuck', opError: 'Stuck' }],
['17.16.#', { msg: 'Failed to upgrade' }],
['17.17.#', { msg: 'Low memory' }],
['17.18.#', { msg: 'Failed to save map' }],
['17.19.#', { msg: 'Unable to start', opError: 'UnableToStartOrResume' }],
['17.20.#', { msg: 'Unable to upload robot logs' }],
['17.21.#', { msg: 'DHCP - Software error' }],
['17.22.#', { msg: 'IMU data error' }],
['17.23.#', { msg: 'Zoned map error' }],
[['17.100.#', '17.703.#'], { msg: 'Unhandled alert' }],
[['19.0.#', '19.2.#'], { msg: 'Robot too hot', batFault: 'OverTemp' }],
['19.3.#', { msg: 'Safety prevents motion', opError: 'Stuck' }],
['19.4.#', { msg: 'ADC error' }],
['19.5.#', { msg: 'Wheel motor too hot', batFault: 'OverTemp' }],
['19.6.#', { msg: 'Charge contact too hot', chargeFault: 'AmbientTooHot' }],
['19.7.#', { msg: 'Dirt detect sensor error' }],
['19.8.#', { msg: 'Optical flow sensor error' }],
['19.10.#', { msg: 'Vacuum fault', opError: 'DustBinFull' }],
['19.11.#', { msg: 'Illumination ring error' }],
['19.12.#', { msg: 'Routine maintenance' }],
['21.#.#', { msg: 'ADC error' }],
['23.0.#', { msg: 'Robot lifted', opError: 'Stuck' }],
[['23.1.#', '23.4.#'], { msg: 'Robot cannot recover from a drop', opError: 'Stuck' }],
['23.5.#', { msg: 'Rotated - Robot lifted', opError: 'Stuck' }]
];
//# sourceMappingURL=dyson-device-360-faults-table.js.map