feat(vendor.midea): J15 Ultra

This commit is contained in:
Sören Beye 2025-10-22 21:48:41 +02:00
parent 6c94eda6ff
commit 84c8697432
2 changed files with 116 additions and 1 deletions

View File

@ -0,0 +1,114 @@
const capabilities = require("./capabilities");
const fs = require("node:fs");
const Logger = require("../../Logger");
const MideaQuirkFactory = require("./MideaQuirkFactory");
const MideaValetudoRobot = require("./MideaValetudoRobot");
const MissingResourceValetudoEvent = require("../../valetudo_events/events/MissingResourceValetudoEvent");
const QuirksCapability = require("../../core/capabilities/QuirksCapability");
const {IMAGE_FILE_FORMAT} = require("../../utils/const");
class MideaJ15UltraValetudoRobot extends MideaValetudoRobot {
constructor(options) {
super(
Object.assign(
{},
options,
{
waterGrades: MideaJ15UltraValetudoRobot.WATER_GRADES,
}
)
);
const quirkFactory = new MideaQuirkFactory({
robot: this
});
[
capabilities.MideaAutoEmptyDockAutoEmptyIntervalControlCapabilityV2,
capabilities.MideaMopExtensionControlCapability,
capabilities.MideaCameraLightControlCapability,
capabilities.MideaObstacleAvoidanceControlCapability,
capabilities.MideaMopDockMopWashTemperatureControlCapability,
capabilities.MideaCarpetSensorModeControlCapabilityV2,
capabilities.MideaPetObstacleAvoidanceControlCapability,
capabilities.MideaMopTwistControlCapabilityV2,
capabilities.MideaMopExtensionFurnitureLegHandlingControlCapability,
capabilities.MideaCollisionAvoidantNavigationControlCapability,
capabilities.MideaCarpetModeControlCapabilityV2
].forEach(capability => {
this.registerCapability(new capability({robot: this}));
});
this.registerCapability(new capabilities.MideaObstacleImagesCapability({
robot: this,
fileFormat: IMAGE_FILE_FORMAT.JPG,
dimensions: {
width: 640,
height: 480
}
}));
this.registerCapability(new QuirksCapability({
robot: this,
quirks: [
quirkFactory.getQuirk(MideaQuirkFactory.KNOWN_QUIRKS.HAIR_CUTTING),
quirkFactory.getQuirk(MideaQuirkFactory.KNOWN_QUIRKS.HAIR_CUTTING_ONE_TIME_TURBO),
quirkFactory.getQuirk(MideaQuirkFactory.KNOWN_QUIRKS.AI_OBSTACLE_CLASSIFICATION),
quirkFactory.getQuirk(MideaQuirkFactory.KNOWN_QUIRKS.QUIET_AUTO_EMPTY),
quirkFactory.getQuirk(MideaQuirkFactory.KNOWN_QUIRKS.CLIFF_SENSORS),
quirkFactory.getQuirk(MideaQuirkFactory.KNOWN_QUIRKS.CARPET_FIRST),
quirkFactory.getQuirk(MideaQuirkFactory.KNOWN_QUIRKS.DEEP_CARPET_CLEANING),
quirkFactory.getQuirk(MideaQuirkFactory.KNOWN_QUIRKS.INCREASED_CARPET_AVOIDANCE),
quirkFactory.getQuirk(MideaQuirkFactory.KNOWN_QUIRKS.STAIN_CLEANING),
quirkFactory.getQuirk(MideaQuirkFactory.KNOWN_QUIRKS.AUTO_EMPTY_DURATION),
]
}));
if (this.config.get("embedded") === true) {
if (!fs.existsSync("/userdata/ai_models/cod-detect-large.bin")) {
this.valetudoEventStore.raise(new MissingResourceValetudoEvent({
id: "midea_ai_model",
message: "The large obstacle detection AI model is missing."
}));
}
}
}
startup() {
super.startup();
if (this.config.get("embedded") === true) {
let aiModelVersion = "unknown/none";
try {
aiModelVersion = fs.readFileSync("/userdata/ai_models/version.txt").toString();
} catch (e) {
/* intentional */
}
Logger.info(`Obstacle detection AI model version: ${aiModelVersion}`);
}
}
getManufacturer() {
return "Eureka";
}
getModelName() {
return "J15 Ultra";
}
static IMPLEMENTATION_AUTO_DETECTION_HANDLER() {
let sn8;
try {
sn8 = fs.readFileSync("/oem/midea/device.sn8").toString().trim();
} catch (e) {
//This is intentionally failing if we're the wrong implementation
Logger.trace("cannot read", "/oem/midea/device.sn8", e);
}
return ["750Y000V", "750Y000W"].includes(sn8);
}
}
module.exports = MideaJ15UltraValetudoRobot;

View File

@ -1,4 +1,5 @@
module.exports = {
"MideaJ12UltraValetudoRobot": require("./MideaJ12UltraValetudoRobot"),
"MideaJ15ProUltraValetudoRobot": require("./MideaJ15ProUltraValetudoRobot")
"MideaJ15ProUltraValetudoRobot": require("./MideaJ15ProUltraValetudoRobot"),
"MideaJ15UltraValetudoRobot": require("./MideaJ15UltraValetudoRobot")
};