feat(mqtt): Publish Dock Status to MQTT

This commit is contained in:
Sören Beye 2024-11-16 15:57:57 +01:00
parent 9b98e3ebfe
commit ee76222a41
4 changed files with 76 additions and 1 deletions

View File

@ -34,6 +34,10 @@ const STATUS_ATTR_TO_HANDLE_MAPPING = [
{
matcher: {attributeClass: stateAttrs.StatusStateAttribute.name},
handle: stateHandles.StatusStateMqttHandle
},
{
matcher: {attributeClass: stateAttrs.DockStatusStateAttribute.name},
handle: stateHandles.DockStatusStateMqttHandle
}
];

View File

@ -0,0 +1,66 @@
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");
const RobotStateNodeMqttHandle = require("../handles/RobotStateNodeMqttHandle");
const stateAttrs = require("../../entities/state/attributes");
class DockStatusStateMqttHandle extends RobotStateNodeMqttHandle {
/**
* @param {object} options
* @param {import("../handles/RobotMqttHandle")} options.parent
* @param {import("../MqttController")} options.controller MqttController instance
* @param {import("../../core/ValetudoRobot")} options.robot
*/
constructor(options) {
super(Object.assign(options, {
topicName: "DockStatusStateAttribute",
friendlyName: "Dock state",
type: "Status"
}));
this.registerChild(new PropertyMqttHandle({
parent: this,
controller: this.controller,
topicName: "status",
friendlyName: "Status",
datatype: DataType.ENUM,
format: Object.values(stateAttrs.DockStatusStateAttribute.VALUE).join(","),
getter: async () => {
const dockStatus = this.robot.state.getFirstMatchingAttribute({
attributeClass: stateAttrs.DockStatusStateAttribute.name
});
if (dockStatus === null) {
return false;
}
return dockStatus.value;
},
}).also((prop) => {
this.controller.withHass((hass => {
prop.attachHomeAssistantComponent(
new InLineHassComponent({
hass: hass,
robot: this.robot,
name: "dock_status",
friendlyName: "Dock Status",
componentType: ComponentType.SENSOR,
autoconf: {
state_topic: prop.getBaseTopic(),
icon: "mdi:home",
entity_category: EntityCategory.DIAGNOSTIC
}
})
);
}));
}));
}
getInterestingStatusAttributes() {
return [{attributeClass: stateAttrs.DockStatusStateAttribute.name}];
}
}
module.exports = DockStatusStateMqttHandle;

View File

@ -1,5 +1,6 @@
module.exports = {
AttachmentStateMqttHandle: require("./AttachmentStateMqttHandle"),
BatteryStateMqttHandle: require("./BatteryStateMqttHandle"),
StatusStateMqttHandle: require("./StatusStateMqttHandle"),
DockStatusStateMqttHandle: require("./DockStatusStateMqttHandle"),
StatusStateMqttHandle: require("./StatusStateMqttHandle")
};

View File

@ -20,6 +20,7 @@ const path = require("path");
const BatteryStateAttribute = require("../backend/lib/entities/state/attributes/BatteryStateAttribute");
const AttachmentStateAttribute = require("../backend/lib/entities/state/attributes/AttachmentStateAttribute");
const StatusStateAttribute = require("../backend/lib/entities/state/attributes/StatusStateAttribute");
const DockStatusStateAttribute = require("../backend/lib/entities/state/attributes/DockStatusStateAttribute");
const PresetSelectionStateAttribute = require("../backend/lib/entities/state/attributes/PresetSelectionStateAttribute");
const Unit = require("../backend/lib/mqtt/common/Unit");
const HomieCommonAttributes = require("../backend/lib/mqtt/homie/HomieCommonAttributes");
@ -237,6 +238,9 @@ class FakeMqttController extends MqttController {
value: StatusStateAttribute.VALUE.CLEANING,
flag: StatusStateAttribute.FLAG.SEGMENT
}),
new DockStatusStateAttribute({
value: DockStatusStateAttribute.VALUE.IDLE,
}),
new PresetSelectionStateAttribute({
type: PresetSelectionStateAttribute.TYPE.FAN_SPEED,
value: PresetSelectionStateAttribute.INTENSITY.MAX