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.
35 lines • 1.67 kB
JavaScript
// Matterbridge plugin for Dyson robot vacuum and air treatment devices
// Copyright © 2025 Alexander Thoukydides
import { createHash } from 'crypto';
import { assertIsDefined } from './utils.js';
// Regular expressions to parse Wi-Fi setup SSIDs
const SSID_360EYE_RE = /^(360EYE-)?(?<sn>[A-Z0-9]{3}-[A-Z]{2}-[A-Z0-9]{8,})/;
const SSID_OTHER_RE = /^DYSON-(?<sn>[A-Z0-9]{3}-[A-Z]{2}-[A-Z0-9]{8,})-(?<type>[0-9]{3}[A-Z]?)$/;
// Dyson 360 Eye uses a different Wi-Fi setup SSID format
const TYPE_360EYE = 'N223';
// Dyson Pure Hot+Cool Link (HP02) SSIDs don't match the MQTT topic and username
const TYPE_MAP = new Map([['455A', '455']]);
// Convert Wi-Fi setup credentials to local MQTT credentials
export function getDeviceConfigMqtt(config) {
const { ssid, password: wifiPassword } = config;
const { rootTopic, serialNumber } = parseSSID(ssid);
const password = hashWifiPassword(wifiPassword);
return { ...config, serialNumber, password, rootTopic };
}
// Extract the MQTT topic and username from a Wi-Fi setup SSID
function parseSSID(ssid) {
const match = SSID_360EYE_RE.exec(ssid) ?? SSID_OTHER_RE.exec(ssid);
if (!match)
throw new Error(`Unable to parse Product SSID: ${ssid}`);
const rootTopic = match.groups?.type ?? TYPE_360EYE;
const sn = match.groups?.sn;
assertIsDefined(sn);
const serialNumber = TYPE_MAP.get(sn) ?? sn;
return { rootTopic, serialNumber };
}
// Convert a Wi-Fi password to the form required for MQTT
function hashWifiPassword(password) {
const sha512 = createHash('sha512').update(password).digest();
return sha512.toString('base64');
}
//# sourceMappingURL=dyson-mqtt-config.js.map