Skip to content

Commit

Permalink
feat(vendor.dreame): L10S Pro Ultra Heat support
Browse files Browse the repository at this point in the history
  • Loading branch information
Hypfer committed Apr 21, 2024
1 parent b1f58ab commit 99e13da
Show file tree
Hide file tree
Showing 19 changed files with 675 additions and 36 deletions.
4 changes: 2 additions & 2 deletions backend/lib/robots/dreame/DreameD10SPlusValetudoRobot.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ class DreameD10SPlusValetudoRobot extends DreameGen2LidarValetudoRobot {

this.registerCapability(new capabilities.DreameWaterUsageControlCapability({
robot: this,
presets: Object.keys(DreameValetudoRobot.WATER_GRADES).map(k => {
return new ValetudoSelectionPreset({name: k, value: DreameValetudoRobot.WATER_GRADES[k]});
presets: Object.keys(this.waterGrades).map(k => {
return new ValetudoSelectionPreset({name: k, value: this.waterGrades[k]});
}),
siid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.SIID,
piid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.PROPERTIES.WATER_USAGE.PIID
Expand Down
4 changes: 2 additions & 2 deletions backend/lib/robots/dreame/DreameD10SProValetudoRobot.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ class DreameD10SProValetudoRobot extends DreameGen2LidarValetudoRobot {

this.registerCapability(new capabilities.DreameWaterUsageControlCapability({
robot: this,
presets: Object.keys(DreameValetudoRobot.WATER_GRADES).map(k => {
return new ValetudoSelectionPreset({name: k, value: DreameValetudoRobot.WATER_GRADES[k]});
presets: Object.keys(this.waterGrades).map(k => {
return new ValetudoSelectionPreset({name: k, value: this.waterGrades[k]});
}),
siid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.SIID,
piid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.PROPERTIES.WATER_USAGE.PIID
Expand Down
4 changes: 2 additions & 2 deletions backend/lib/robots/dreame/DreameD9ProValetudoRobot.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ class DreameD9ProValetudoRobot extends DreameGen2LidarValetudoRobot {

this.registerCapability(new capabilities.DreameWaterUsageControlCapability({
robot: this,
presets: Object.keys(DreameValetudoRobot.WATER_GRADES).map(k => {
return new ValetudoSelectionPreset({name: k, value: DreameValetudoRobot.WATER_GRADES[k]});
presets: Object.keys(this.waterGrades).map(k => {
return new ValetudoSelectionPreset({name: k, value: this.waterGrades[k]});
}),
siid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.SIID,
piid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.PROPERTIES.WATER_USAGE.PIID
Expand Down
4 changes: 2 additions & 2 deletions backend/lib/robots/dreame/DreameD9ValetudoRobot.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ class DreameD9ValetudoRobot extends DreameGen2LidarValetudoRobot {

this.registerCapability(new capabilities.DreameWaterUsageControlCapability({
robot: this,
presets: Object.keys(DreameValetudoRobot.WATER_GRADES).map(k => {
return new ValetudoSelectionPreset({name: k, value: DreameValetudoRobot.WATER_GRADES[k]});
presets: Object.keys(this.waterGrades).map(k => {
return new ValetudoSelectionPreset({name: k, value: this.waterGrades[k]});
}),
siid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.SIID,
piid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.PROPERTIES.WATER_USAGE.PIID
Expand Down
5 changes: 2 additions & 3 deletions backend/lib/robots/dreame/DreameGen2VSlamValetudoRobot.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
const DreameGen2ValetudoRobot = require("./DreameGen2ValetudoRobot");

const capabilities = require("./capabilities");
const DreameValetudoRobot = require("./DreameValetudoRobot");
const entities = require("../../entities");
const ValetudoSelectionPreset = require("../../entities/core/ValetudoSelectionPreset");

Expand All @@ -19,8 +18,8 @@ class DreameGen2VSlamValetudoRobot extends DreameGen2ValetudoRobot {

this.registerCapability(new capabilities.DreameWaterUsageControlCapability({
robot: this,
presets: Object.keys(DreameValetudoRobot.WATER_GRADES).map(k => {
return new ValetudoSelectionPreset({name: k, value: DreameValetudoRobot.WATER_GRADES[k]});
presets: Object.keys(this.waterGrades).map(k => {
return new ValetudoSelectionPreset({name: k, value: this.waterGrades[k]});
}),
siid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.SIID,
piid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.PROPERTIES.WATER_USAGE.PIID
Expand Down
56 changes: 49 additions & 7 deletions backend/lib/robots/dreame/DreameGen2ValetudoRobot.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class DreameGen2ValetudoRobot extends DreameValetudoRobot {
* @param {object} options
* @param {object} options.operationModes
* @param {boolean} [options.detailedAttachmentReport]
* @param {boolean} [options.highResolutionWaterGrades]
* @param {import("../../Configuration")} options.config
* @param {import("../../ValetudoEventStore")} options.valetudoEventStore
*/
Expand All @@ -41,6 +42,9 @@ class DreameGen2ValetudoRobot extends DreameValetudoRobot {
)
);

this.highResolutionWaterGrades = !!options.highResolutionWaterGrades;
this.waterGrades = this.highResolutionWaterGrades ? DreameGen2ValetudoRobot.HIGH_RESOLUTION_WATER_GRADES : DreameValetudoRobot.WATER_GRADES;

this.detailedAttachmentReport = options.detailedAttachmentReport === true;

/** @type {Array<{siid: number, piid: number, did: number}>} */
Expand Down Expand Up @@ -313,6 +317,7 @@ class DreameGen2ValetudoRobot extends DreameValetudoRobot {
break;
case MIOT_SERVICES.AUTO_EMPTY_DOCK.SIID:
case MIOT_SERVICES.TIMERS.SIID:
case MIOT_SERVICES.TOTAL_STATISTICS.SIID:
//Intentionally left blank (for now?)
break;
case MIOT_SERVICES.SILVER_ION.SIID:
Expand Down Expand Up @@ -374,7 +379,7 @@ class DreameGen2ValetudoRobot extends DreameValetudoRobot {
* @return {Array<{piid: number, siid: number}>}
*/
getStatePropertiesToPoll() {
return [
const properties = [
{
siid: MIOT_SERVICES.VACUUM_2.SIID,
piid: MIOT_SERVICES.VACUUM_2.PROPERTIES.MODE.PIID
Expand All @@ -387,10 +392,6 @@ class DreameGen2ValetudoRobot extends DreameValetudoRobot {
siid: MIOT_SERVICES.VACUUM_2.SIID,
piid: MIOT_SERVICES.VACUUM_2.PROPERTIES.FAN_SPEED.PIID
},
{
siid: MIOT_SERVICES.VACUUM_2.SIID,
piid: MIOT_SERVICES.VACUUM_2.PROPERTIES.WATER_USAGE.PIID
},
{
siid: MIOT_SERVICES.VACUUM_2.SIID,
piid: MIOT_SERVICES.VACUUM_2.PROPERTIES.WATER_TANK_ATTACHMENT.PIID
Expand All @@ -408,6 +409,20 @@ class DreameGen2ValetudoRobot extends DreameValetudoRobot {
piid: MIOT_SERVICES.BATTERY.PROPERTIES.CHARGING.PIID
}
];

if (this.highResolutionWaterGrades) {
properties.push({
siid: MIOT_SERVICES.MOP_EXPANSION.SIID,
piid: MIOT_SERVICES.MOP_EXPANSION.PROPERTIES.HIGH_RES_WATER_USAGE.PIID
});
} else {
properties.push({
siid: MIOT_SERVICES.VACUUM_2.SIID,
piid: MIOT_SERVICES.VACUUM_2.PROPERTIES.WATER_USAGE.PIID
});
}

return properties;
}

async pollState() {
Expand Down Expand Up @@ -473,8 +488,8 @@ class DreameGen2ValetudoRobot extends DreameValetudoRobot {
}

case MIOT_SERVICES.VACUUM_2.PROPERTIES.WATER_USAGE.PIID: {
let matchingWaterGrade = Object.keys(DreameValetudoRobot.WATER_GRADES).find(key => {
return DreameValetudoRobot.WATER_GRADES[key] === elem.value;
let matchingWaterGrade = Object.keys(this.waterGrades).find(key => {
return this.waterGrades[key] === elem.value;
});

this.state.upsertFirstMatchingAttribute(new stateAttrs.PresetSelectionStateAttribute({
Expand Down Expand Up @@ -569,6 +584,25 @@ class DreameGen2ValetudoRobot extends DreameValetudoRobot {
this.capabilities[ConsumableMonitoringCapability.TYPE].parseConsumablesMessage(elem);
}
break;
case MIOT_SERVICES.MOP_EXPANSION.SIID: {
switch (elem.piid) {
case MIOT_SERVICES.MOP_EXPANSION.PROPERTIES.HIGH_RES_WATER_USAGE.PIID: {
let matchingWaterGrade = Object.keys(this.waterGrades).find(key => {
return this.waterGrades[key] === elem.value;
});

this.state.upsertFirstMatchingAttribute(new stateAttrs.PresetSelectionStateAttribute({
metaData: {
rawValue: elem.value
},
type: stateAttrs.PresetSelectionStateAttribute.TYPE.WATER_GRADE,
value: matchingWaterGrade
}));
break;
}
}
break;
}
default:
Logger.warn("Unhandled property update", elem);
}
Expand Down Expand Up @@ -674,5 +708,13 @@ DreameGen2ValetudoRobot.OPERATION_MODES = Object.freeze({
[stateAttrs.PresetSelectionStateAttribute.MODE.VACUUM_AND_MOP]: 2,
});

DreameGen2ValetudoRobot.HIGH_RESOLUTION_WATER_GRADES = Object.freeze({
[stateAttrs.PresetSelectionStateAttribute.INTENSITY.MIN]: 1,
[stateAttrs.PresetSelectionStateAttribute.INTENSITY.LOW]: 8,
[stateAttrs.PresetSelectionStateAttribute.INTENSITY.MEDIUM]: 16,
[stateAttrs.PresetSelectionStateAttribute.INTENSITY.HIGH]: 24,
[stateAttrs.PresetSelectionStateAttribute.INTENSITY.MAX]: 32,
});


module.exports = DreameGen2ValetudoRobot;
4 changes: 2 additions & 2 deletions backend/lib/robots/dreame/DreameL10ProValetudoRobot.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ class DreameL10ProValetudoRobot extends DreameGen2LidarValetudoRobot {

this.registerCapability(new capabilities.DreameWaterUsageControlCapability({
robot: this,
presets: Object.keys(DreameValetudoRobot.WATER_GRADES).map(k => {
return new ValetudoSelectionPreset({name: k, value: DreameValetudoRobot.WATER_GRADES[k]});
presets: Object.keys(this.waterGrades).map(k => {
return new ValetudoSelectionPreset({name: k, value: this.waterGrades[k]});
}),
siid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.SIID,
piid: DreameGen2ValetudoRobot.MIOT_SERVICES.VACUUM_2.PROPERTIES.WATER_USAGE.PIID
Expand Down

0 comments on commit 99e13da

Please sign in to comment.