constructor(options) {
        super(options);
        this.robot = options.robot;
        this.valetudoEventStore = options.valetudoEventStore;
        this.baseTopic = options.baseTopic;
        this.mapHandle = null;

        // Attach map handle
        this.mapHandle = new MapNodeMqttHandle({
            parent: this,
            controller: this.controller,
            robot: this.robot
        });
        this.registerChild(this.mapHandle);

        this.valetudoEventsHandle = new ValetudoEventsNodeMqttHandle({
            parent: this,
            controller: this.controller,
            robot: this.robot,
            valetudoEventStore: this.valetudoEventStore
        });
        this.registerChild(this.valetudoEventsHandle);

        // Attach all available capabilities to self
        for (const [type, capability] of Object.entries(this.robot.capabilities)) {
            const handle = CAPABILITY_TYPE_TO_HANDLE_MAPPING[type];

            if (handle !== undefined && (handle.OPTIONAL !== true || options.optionalExposedCapabilities.includes(type))) {
                this.registerChild(new handle({
                    parent: this,
                    capability: capability,
                    controller: this.controller,
                    robot: this.robot,
                }));
            }
        }

        // Subscribe to all available status attributes. Once we receive an event, we will attach the respective handle.
        this.statusSubscriber = new CallbackAttributeSubscriber((eventType, attribute) => {
            this.onStatusAttributeEvent(eventType, attribute).catch(err => {
                Logger.error("Error in onStatusAttributeEvent", err);
            });
        });

        for (const item of STATUS_ATTR_TO_HANDLE_MAPPING) {
            this.robot.state.subscribe(this.statusSubscriber, item.matcher);
        }

        // Attach vacuum.mqtt Hass component
        this.controller.withHass((hass) => {
            this.attachHomeAssistantComponent(
                new VacuumHassComponent({
                    hass: hass,
                    robot: this.robot
                })
            );
        });
    }
@param {object} options
@param {import("../../core/ValetudoRobot")} options.robot
@param {import("../MqttController")} options.controller
@param {import("../../ValetudoEventStore")} options.valetudoEventStore
@param {string} options.baseTopic Base topic for Valetudo
@param {string} options.topicName Topic identifier for this robot
@param {string} options.friendlyName Friendly name for this robot
@param {Array<string>} options.optionalExposedCapabilities