constructor(options) {
        super(options);

        this.mapPollMiioCommand = MAP_POLL_COMMANDS.GetFreshMap;
        this.fanSpeeds = options.fanSpeeds;
        this.waterGrades = options.waterGrades ?? {};
        this.supportedAttachments = options.supportedAttachments ?? [];
        this.dockType = options.dockType ?? RoborockConst.DOCK_TYPE.CHARGING;

        this.supportedAttachments.forEach(attachmentType => {
            this.state.upsertFirstMatchingAttribute(new entities.state.attributes.AttachmentStateAttribute({
                type: attachmentType,
                attached: false
            }));
        });

        this.registerCapability(new capabilities.RoborockFanSpeedControlCapability({
            robot: this,
            presets: Object.keys(this.fanSpeeds).map(k => {
                return new ValetudoSelectionPreset({name: k, value: this.fanSpeeds[k]});
            })
        }));

        this.registerCapability(new capabilities.RoborockConsumableMonitoringCapability({
            robot: this,
            dockType: this.dockType
        }));

        [
            capabilities.RoborockBasicControlCapability,
            capabilities.RoborockZoneCleaningCapability,
            capabilities.RoborockGoToLocationCapability,
            capabilities.RoborockLocateCapability,
            capabilities.RoborockDoNotDisturbCapability,
            capabilities.RoborockCarpetModeControlCapability,
            capabilities.RoborockSpeakerVolumeControlCapability,
            capabilities.RoborockSpeakerTestCapability,
            capabilities.RoborockVoicePackManagementCapability,
            capabilities.RoborockTotalStatisticsCapability,
            capabilities.RoborockCurrentStatisticsCapability,
        ].forEach(capability => {
            this.registerCapability(new capability({robot: this}));
        });

        this.registerCapability(new capabilities.RoborockWifiConfigurationCapability({
            robot: this,
            networkInterface: "wlan0"
        }));

        if (this.config.get("embedded") === true) {
            this.registerCapability(new LinuxWifiScanCapability({
                robot: this,
                networkInterface: "wlan0"
            }));
        }

        if (this.dockType === RoborockConst.DOCK_TYPE.ULTRA) {
            this.state.upsertFirstMatchingAttribute(new entities.state.attributes.DockStatusStateAttribute({
                value: entities.state.attributes.DockStatusStateAttribute.VALUE.IDLE
            }));
        }
    }
@param {object} options
@param {import("../../Configuration")} options.config
@param {import("../../ValetudoEventStore")} options.valetudoEventStore
@param {object} options.fanSpeeds
@param {object} [options.waterGrades]
@param {Array<import("../../entities/state/attributes/AttachmentStateAttribute").AttachmentStateAttributeType>} [options.supportedAttachments]
@param {import("./RoborockConst").DOCK_TYPE} [options.dockType]