Skip to content

Commit

Permalink
feat(mqtt): Optionally expose KeyLockCapability
Browse files Browse the repository at this point in the history
  • Loading branch information
Hypfer committed Jun 8, 2024
1 parent 0a036ef commit 572e3ce
Show file tree
Hide file tree
Showing 5 changed files with 99 additions and 2 deletions.
3 changes: 2 additions & 1 deletion backend/lib/doc/Configuration.openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,8 @@
"ConsumableMonitoringCapability",
"CurrentStatisticsCapability",
"TotalStatisticsCapability",
"SpeakerVolumeControlCapability"
"SpeakerVolumeControlCapability",
"KeyLockCapability"
]
}
}
Expand Down
8 changes: 8 additions & 0 deletions backend/lib/mqtt/capabilities/KeyLockCapabilityMqttHandle.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
const SimpleToggleCapabilityMqttHandle = require("./SimpleToggleCapabilityMqttHandle");


class KeyLockCapabilityMqttHandle extends SimpleToggleCapabilityMqttHandle {}

KeyLockCapabilityMqttHandle.OPTIONAL = true;

module.exports = KeyLockCapabilityMqttHandle;
86 changes: 86 additions & 0 deletions backend/lib/mqtt/capabilities/SimpleToggleCapabilityMqttHandle.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
const CapabilityMqttHandle = require("./CapabilityMqttHandle");

const capabilities = require("../../core/capabilities");
const Commands = require("../common/Commands");
const ComponentType = require("../homeassistant/ComponentType");
const DataType = require("../homie/DataType");
const EntityCategory = require("../homeassistant/EntityCategory");
const InLineHassComponent = require("../homeassistant/components/InLineHassComponent");
const PropertyMqttHandle = require("../handles/PropertyMqttHandle");

class SimpleToggleCapabilityMqttHandle extends CapabilityMqttHandle {
/**
* @param {object} options
* @param {import("../handles/RobotMqttHandle")} options.parent
* @param {import("../MqttController")} options.controller MqttController instance
* @param {import("../../core/ValetudoRobot")} options.robot
* @param {import("../../core/capabilities/SimpleToggleCapability")} options.capability
*/
constructor(options) {
super(Object.assign(options, {
friendlyName: CAPABILITIES_TO_FRIENDLY_NAME_MAPPING[options.capability.getType()]
}));
this.capability = options.capability;

this.registerChild(
new PropertyMqttHandle({
parent: this,
controller: this.controller,
topicName: "enabled",
friendlyName: CAPABILITIES_TO_FRIENDLY_NAME_MAPPING[options.capability.getType()],
datatype: DataType.ENUM,
format: Object.values(Commands.SWITCH).join(","),
setter: async (value) => {
if (value === Commands.SWITCH.ON) {
await this.capability.enable();
} else if (value === Commands.SWITCH.OFF) {
await this.capability.disable();
} else {
throw new Error("Invalid value");
}
},
getter: async () => {
const isEnabled = await this.capability.isEnabled();

if (isEnabled) {
return Commands.SWITCH.ON;
} else {
return Commands.SWITCH.OFF;
}
},
}).also((prop) => {
const capabilityType = options.capability.getType();

this.controller.withHass((hass) => {
prop.attachHomeAssistantComponent(
new InLineHassComponent({
hass: hass,
robot: this.robot,
name: capabilityType,
friendlyName: CAPABILITIES_TO_FRIENDLY_NAME_MAPPING[capabilityType],
componentType: ComponentType.SWITCH,
autoconf: {
state_topic: prop.getBaseTopic(),
value_template: "{{ value }}",
command_topic: prop.getBaseTopic() + "/set",
icon: CAPABILITIES_TO_ICON_MAPPING[capabilityType],
entity_category: EntityCategory.CONFIG,
}
})
);
});
})
);
}

}

const CAPABILITIES_TO_FRIENDLY_NAME_MAPPING = {
[capabilities.KeyLockCapability.TYPE]: "Lock keys",
};

const CAPABILITIES_TO_ICON_MAPPING = {
[capabilities.KeyLockCapability.TYPE]: "mdi:lock",
};

module.exports = SimpleToggleCapabilityMqttHandle;
1 change: 1 addition & 0 deletions backend/lib/mqtt/capabilities/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ module.exports = {
ConsumableMonitoringCapabilityMqttHandle: require("./ConsumableMonitoringCapabilityMqttHandle"),
CurrentStatisticsCapabilityMqttHandle: require("./CurrentStatisticsCapabilityMqttHandle"),
GoToLocationCapabilityMqttHandle: require("./GoToLocationCapabilityMqttHandle"),
KeyLockCapabilityMqttHandle: require("./KeyLockCapabilityMqttHandle"),
LocateCapabilityMqttHandle: require("./LocateCapabilityMqttHandle"),
MapSegmentationCapabilityMqttHandle: require("./MapSegmentationCapabilityMqttHandle"),
PresetSelectionCapabilityMqttHandle: require("./PresetSelectionCapabilityMqttHandle"),
Expand Down
3 changes: 2 additions & 1 deletion backend/lib/mqtt/handles/HandleMappings.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ const CAPABILITY_TYPE_TO_HANDLE_MAPPING = {
[capabilities.AutoEmptyDockManualTriggerCapability.TYPE]: capabilityHandles.AutoEmptyDockManualTriggerCapabilityMqttHandle,
[capabilities.CurrentStatisticsCapability.TYPE]: capabilityHandles.CurrentStatisticsCapabilityMqttHandle,
[capabilities.TotalStatisticsCapability.TYPE]: capabilityHandles.TotalStatisticsCapabilityMqttHandle,
[capabilities.SpeakerVolumeControlCapability.TYPE]: capabilityHandles.SpeakerVolumeControlCapabilityMqttHandle
[capabilities.SpeakerVolumeControlCapability.TYPE]: capabilityHandles.SpeakerVolumeControlCapabilityMqttHandle,
[capabilities.KeyLockCapability.TYPE]: capabilityHandles.KeyLockCapabilityMqttHandle
};

const STATUS_ATTR_TO_HANDLE_MAPPING = [
Expand Down

0 comments on commit 572e3ce

Please sign in to comment.