node-red-contrib-home-assistant-websocket
Version:
Node-RED integration with Home Assistant through websocket and REST API
103 lines (102 loc) • 4.25 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = getEntitiesNode;
const joi_1 = __importDefault(require("joi"));
const const_1 = require("../../common/const");
const helpers_1 = require("../../common/controllers/helpers");
const ComparatorService_1 = __importDefault(require("../../common/services/ComparatorService"));
const InputService_1 = __importDefault(require("../../common/services/InputService"));
const Status_1 = __importDefault(require("../../common/status/Status"));
const TransformState_1 = __importDefault(require("../../common/TransformState"));
const const_2 = require("../../const");
const globals_1 = require("../../globals");
const migrate_1 = require("../../helpers/migrate");
const node_1 = require("../../helpers/node");
const homeAssistant_1 = require("../../homeAssistant");
const const_3 = require("./const");
const GetEntitiesController_1 = __importDefault(require("./GetEntitiesController"));
const inputs = {
outputType: {
messageProp: 'payload.outputType',
configProp: 'outputType',
},
outputEmptyResults: {
messageProp: 'payload.outputEmptyResults',
configProp: 'outputEmptyResults',
},
outputLocationType: {
messageProp: 'payload.outputLocationType',
configProp: 'outputLocationType',
},
outputLocation: {
messageProp: 'payload.outputLocation',
configProp: 'outputLocation',
},
outputResultsCount: {
messageProp: 'payload.outputResultsCount',
configProp: 'outputResultsCount',
},
rules: {
messageProp: 'payload.rules',
configProp: 'rules',
},
};
// convert enum to array of strings
const inputSchema = joi_1.default.object({
outputType: joi_1.default.string()
.valid(...Object.values(const_3.OutputType))
.label('OutputType'),
outputEmptyResults: joi_1.default.boolean().label('outputEmptyResults'),
outputLocationType: joi_1.default.string()
.valid(const_2.TypedInputTypes.Message, const_2.TypedInputTypes.Flow, const_2.TypedInputTypes.Global)
.label('outputLocationType'),
outputLocation: joi_1.default.string().label('outputLocation'),
outputResultsCount: joi_1.default.number().label('outputResultsCount'),
rules: joi_1.default.array()
.items(joi_1.default.object({
condition: joi_1.default.string().valid(...Object.values(const_1.PropertySelectorType), ''),
property: joi_1.default.when('logic', {
is: const_2.ComparatorType.JSONata,
then: joi_1.default.any(),
otherwise: joi_1.default.string(),
}),
logic: joi_1.default.string().valid(...Object.values(const_2.ComparatorType), ''),
value: joi_1.default.string().allow(''),
valueType: joi_1.default.string().valid(...Object.values(const_2.TypedInputTypes), ''),
}))
.label('rules'),
});
function getEntitiesNode(config) {
globals_1.RED.nodes.createNode(this, config);
this.config = (0, migrate_1.migrate)(config);
const serverConfigNode = (0, node_1.getServerConfigNode)(this.config.server);
const homeAssistant = (0, homeAssistant_1.getHomeAssistant)(serverConfigNode);
const status = new Status_1.default({
config: serverConfigNode.config,
node: this,
});
const inputService = new InputService_1.default({
inputs,
nodeConfig: this.config,
schema: inputSchema,
});
const controllerDeps = (0, helpers_1.createControllerDependencies)(this, homeAssistant);
const transformState = new TransformState_1.default(serverConfigNode.config.ha_boolean);
const comparatorService = new ComparatorService_1.default({
nodeRedContextService: controllerDeps.nodeRedContextService,
homeAssistant,
jsonataService: controllerDeps.jsonataService,
transformState,
});
// eslint-disable-next-line no-new
new GetEntitiesController_1.default({
comparatorService,
inputService,
node: this,
status,
...controllerDeps,
});
}