addNewConsumable(topicId, type, subType, unit) {
        this.registerChild(
            new PropertyMqttHandle({
                parent: this,
                controller: this.controller,
                topicName: topicId,
                friendlyName: this.genConsumableFriendlyName(type, subType),
                datatype: DataType.INTEGER,
                unit: unit === stateAttrs.ConsumableStateAttribute.UNITS.PERCENT ? Unit.PERCENT : undefined,
                format: unit === stateAttrs.ConsumableStateAttribute.UNITS.PERCENT ? "0:100" : undefined,
                getter: async () => {
                    const newAttr = this.robot.state.getFirstMatchingAttribute({
                        attributeClass: stateAttrs.ConsumableStateAttribute.name,
                        attributeType: type,
                        attributeSubType: subType
                    });

                    if (newAttr) {
                        // Raw value for Home Assistant
                        await this.controller.hassAnchorProvider.getAnchor(
                            HassAnchor.ANCHOR.CONSUMABLE_VALUE + topicId
                        ).post(newAttr.remaining.value);

                        // Convert value to seconds for Homie
                        return newAttr.remaining.value * (unit === stateAttrs.ConsumableStateAttribute.UNITS.PERCENT ? 1 : 60);
                    }

                    return null;
                },
                helpText: unit === stateAttrs.ConsumableStateAttribute.UNITS.PERCENT ?
                    "This handle returns the consumable remaining endurance percentage." :
                    "This handle returns the consumable remaining endurance time as an int representing seconds remaining."
            }).also((prop) => {
                this.controller.withHass((hass) => {
                    prop.attachHomeAssistantComponent(
                        new InLineHassComponent({
                            hass: hass,
                            robot: this.robot,
                            name: `${this.capability.getType()}_${topicId.replace("-", "_")}`,
                            friendlyName: this.genConsumableFriendlyName(type, subType),
                            componentType: ComponentType.SENSOR,
                            baseTopicReference: this.controller.hassAnchorProvider.getTopicReference(
                                HassAnchor.REFERENCE.HASS_CONSUMABLE_STATE + topicId
                            ),
                            autoconf: {
                                state_topic: this.controller.hassAnchorProvider.getTopicReference(
                                    HassAnchor.REFERENCE.HASS_CONSUMABLE_STATE + topicId
                                ),
                                unit_of_measurement: unit === stateAttrs.ConsumableStateAttribute.UNITS.PERCENT ? Unit.PERCENT : Unit.MINUTES,
                                icon: "mdi:progress-wrench",
                                entity_category: EntityCategory.DIAGNOSTIC
                            },
                            topics: {
                                "": this.controller.hassAnchorProvider.getAnchor(
                                    HassAnchor.ANCHOR.CONSUMABLE_VALUE + topicId
                                )
                            }
                        })
                    );
                });
            })
        );

        this.registerChild(
            new PropertyMqttHandle({
                parent: this,
                controller: this.controller,
                topicName: `${topicId}/reset`,
                friendlyName: "Reset the consumable",
                datatype: DataType.ENUM,
                format: Commands.BASIC.PERFORM,
                setter: async (value) => {
                    await this.capability.resetConsumable(type, subType);
                }
            }).also((prop) => {
                this.controller.withHass((hass) => {
                    prop.attachHomeAssistantComponent(
                        new InLineHassComponent({
                            hass: hass,
                            robot: this.robot,
                            name: `${this.capability.getType()}_${topicId.replace("-", "_")}_reset`,
                            friendlyName: `Reset ${this.genConsumableFriendlyName(type, subType)} Consumable`,
                            componentType: ComponentType.BUTTON,
                            autoconf: {
                                command_topic: `${prop.getBaseTopic()}/set`,
                                payload_press: Commands.BASIC.PERFORM,
                                icon: "mdi:restore",
                                entity_category: EntityCategory.DIAGNOSTIC
                            }
                        })
                    );
                });
            })
        );
    }
@private
@param {string} topicId
@param {import("../../entities/state/attributes/ConsumableStateAttribute").TYPE} type
@param {import("../../entities/state/attributes/ConsumableStateAttribute").SUB_TYPE} subType
@param {import("../../entities/state/attributes/ConsumableStateAttribute").UNITS} unit
@return {void}