homebridge-roborock-vacuum-update
Version:
Comprehensive Homebridge plugin for Roborock vacuum cleaners with full HomeKit integration including mopping, dock features, and advanced controls.
113 lines • 4.21 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.WaterBoxService = void 0;
const rxjs_1 = require("rxjs");
const plugin_service_class_1 = require("./plugin_service_class");
const ensure_name_1 = require("./utils/ensure_name");
class WaterBoxService extends plugin_service_class_1.PluginServiceClass {
constructor(coreContext, accessory) {
super(coreContext);
this.accessory = accessory;
if (this.config.waterBox && this.deviceManager.hasFeature("waterLevel")) {
const name = `${this.config.name} Water Box`;
this.service = this.accessory.getServiceById(this.hap.Service.Fan, "waterBox")
|| this.accessory.addService(this.hap.Service.Fan, name, "waterBox");
(0, ensure_name_1.ensureName)(this.hap, this.service, name);
this.service
.getCharacteristic(this.hap.Characteristic.RotationSpeed)
.onGet(() => this.getWaterSpeed())
.onSet((newState) => this.setWaterSpeed(newState))
.setProps({
minValue: 0,
maxValue: 100,
minStep: 33, // 0%, 33%, 67%, 100% (maps to Off, Mild, Standard, Intense)
});
// Handle ON/OFF characteristic
this.service
.getCharacteristic(this.hap.Characteristic.On)
.onGet(async () => (await this.getWaterSpeed()) > 0)
.onSet(async (newState) => {
if (!newState) {
await this.setWaterSpeed(0);
}
});
}
}
async init() {
if (!this.service)
return;
this.deviceManager.stateChanged$
.pipe((0, rxjs_1.filter)(({ key }) => key === "water_box_custom_mode"), (0, rxjs_1.distinct)(({ value }) => value))
.subscribe(({ value: mode }) => {
this.log.debug(`Water box mode changed: ${mode}`);
const speed = this.waterModeToSpeed(mode);
this.service
.getCharacteristic(this.hap.Characteristic.RotationSpeed)
.updateValue(speed);
this.service
.getCharacteristic(this.hap.Characteristic.On)
.updateValue(speed > 0);
});
}
get services() {
return this.service ? [this.service] : [];
}
async setWaterSpeed(speed) {
this.log.info(`setWaterSpeed: ${speed}%`);
const waterMode = this.speedToWaterMode(speed);
if (waterMode === null) {
this.log.warn(`Invalid water speed: ${speed}%`);
return;
}
try {
await this.roborockAPI.set_water_box_custom_mode(this.duid, waterMode);
this.log.info(`Set water box mode to ${waterMode} (${speed}%)`);
}
catch (err) {
this.log.error(`setWaterSpeed failed:`, err);
throw err;
}
}
async getWaterSpeed() {
const mode = this.deviceManager.getStatus("water_box_custom_mode");
if (mode === undefined || mode === "") {
return 0;
}
const speed = this.waterModeToSpeed(mode);
this.log.debug(`getWaterSpeed: mode=${mode}, speed=${speed}%`);
return speed;
}
waterModeToSpeed(mode) {
// Map water box mode to speed percentage
// 200 = Off (0%), 201 = Mild (33%), 202 = Moderate/Standard (67%), 203 = Intense (100%)
switch (mode) {
case 200:
return 0;
case 201:
return 33;
case 202:
return 67;
case 203:
return 100;
default:
return 0;
}
}
speedToWaterMode(speed) {
// Map speed percentage to water box mode
if (speed === 0) {
return 200; // Off
}
else if (speed <= 33) {
return 201; // Mild
}
else if (speed <= 67) {
return 202; // Moderate/Standard
}
else {
return 203; // Intense
}
}
}
exports.WaterBoxService = WaterBoxService;
//# sourceMappingURL=water_box_service.js.map