UNPKG

node-red-contrib-home-assistant-websocket

Version:
212 lines (211 loc) 8.64 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = waitUntilNode; const joi_1 = __importDefault(require("joi")); const const_1 = require("../../common/const"); const helpers_1 = require("../../common/controllers/helpers"); const ClientEvents_1 = __importDefault(require("../../common/events/ClientEvents")); const ComparatorService_1 = __importDefault(require("../../common/services/ComparatorService")); const InputService_1 = __importStar(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 WaitUntilController_1 = __importDefault(require("./WaitUntilController")); const inputs = { entityId: { // TODO: Remove payload.entity_id in v1.0 messageProp: ['payload.entity_id', 'payload.entityId'], }, entityIdFilterType: { messageProp: 'payload.entityIdFilterType', default: 'exact', }, entities: { messageProp: 'payload.entities', configProp: 'entities', }, property: { messageProp: 'payload.property', configProp: 'property', }, comparator: { messageProp: 'payload.comparator', configProp: 'comparator', }, value: { messageProp: 'payload.value', configProp: 'value', }, valueType: { messageProp: 'payload.valueType', configProp: 'valueType', }, timeout: { messageProp: 'payload.timeout', configProp: 'timeout', }, timeoutUnits: { messageProp: 'payload.timeoutUnits', configProp: 'timeoutUnits', }, checkCurrentState: { messageProp: 'payload.checkCurrentState', configProp: 'checkCurrentState', }, }; function transformInput(parsedMessage) { // If no entities are provided, use entityId if (parsedMessage.entityId.value) { const entities = { [const_1.IdSelectorType.Entity]: [], [const_1.IdSelectorType.Substring]: [], [const_1.IdSelectorType.Regex]: [], }; switch (parsedMessage.entityIdFilterType.value) { case const_2.EntityFilterType.Exact: entities[const_1.IdSelectorType.Entity] = [ parsedMessage.entityId.value, ]; break; case const_2.EntityFilterType.Substring: entities[const_1.IdSelectorType.Substring] = [ parsedMessage.entityId.value, ]; break; case const_2.EntityFilterType.Regex: entities[const_1.IdSelectorType.Regex] = [parsedMessage.entityId.value]; break; case const_2.EntityFilterType.List: entities[const_1.IdSelectorType.Entity] = parsedMessage.entityId.value; break; } parsedMessage.entities.value = entities; parsedMessage.entities.source = InputService_1.DataSource.Transformed; } // If entities is a string or array, convert to object if (parsedMessage.entities.source === InputService_1.DataSource.Message && (typeof parsedMessage.entities.value === 'string' || Array.isArray(parsedMessage.entities.value))) { parsedMessage.entities.value = { [const_1.IdSelectorType.Entity]: typeof parsedMessage.entities.value === 'string' ? [parsedMessage.entities.value] : parsedMessage.entities.value, }; parsedMessage.entities.source = InputService_1.DataSource.Transformed; } // each entities property should be an array [ const_1.IdSelectorType.Entity, const_1.IdSelectorType.Substring, const_1.IdSelectorType.Regex, ].forEach((key) => { const value = parsedMessage.entities.value[key]; if (!Array.isArray(value)) { parsedMessage.entities.value[key] = []; } }); return parsedMessage; } const defaultInputSchema = joi_1.default.object({ entities: joi_1.default.object({ entity: joi_1.default.array().items(joi_1.default.string()), substring: joi_1.default.array().items(joi_1.default.string()), regex: joi_1.default.array().items(joi_1.default.string()), }) .custom((value, helpers) => { const { entity, substring, regex } = value; if ((entity === null || entity === void 0 ? void 0 : entity.length) > 0 || (substring === null || substring === void 0 ? void 0 : substring.length) > 0 || (regex === null || regex === void 0 ? void 0 : regex.length) > 0) { return value; // At least one array is not empty } else { return helpers.error('array.length'); } }) .message('ha-wait-until.error.no_entities_provided'), property: joi_1.default.string(), comparator: joi_1.default.string().valid(...Object.values(const_2.ComparatorType)), value: joi_1.default.alternatives().try(joi_1.default.string(), joi_1.default.number()), valueType: joi_1.default.string(), timeout: joi_1.default.alternatives() .try(joi_1.default.string(), joi_1.default.number()) .allow('') .default('0'), timeoutUnits: joi_1.default.string().valid(...Object.values(const_2.TimeUnit)), checkCurrentState: joi_1.default.boolean(), // Only used for input overrides entityId: joi_1.default.alternatives().try(joi_1.default.string(), joi_1.default.array().items(joi_1.default.string())), entityIdFilterType: joi_1.default.string().valid(...Object.values(const_2.EntityFilterType)), }).unknown(true); function waitUntilNode(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 clientEvents = new ClientEvents_1.default({ node: this, emitter: homeAssistant.eventBus, }); const status = new Status_1.default({ config: serverConfigNode.config, node: this, }); clientEvents.setStatus(status); const inputService = new InputService_1.default({ inputs, nodeConfig: this.config, schema: defaultInputSchema, transform: transformInput, }); if (this.config.blockInputOverrides) { inputService.disableInputOverrides(); } 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 WaitUntilController_1.default({ comparatorService, clientEvents, inputService, node: this, status, ...controllerDeps, }); }