UNPKG

node-red-contrib-smartnora

Version:

Google Smart Home integration via Smart Nora https://smart-nora.eu/

135 lines (134 loc) 6.54 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const nora_firebase_common_1 = require("@andrei-tatar/nora-firebase-common"); const util_1 = require("./util"); module.exports = function (RED) { RED.nodes.registerType('noraf-sousvide', function (config) { RED.nodes.createNode(this, config); const noraConfig = RED.nodes.getNode(config.nora); if (!(noraConfig === null || noraConfig === void 0 ? void 0 : noraConfig.valid)) { return; } const deviceConfig = { type: 'action.devices.types.SOUSVIDE', name: { name: config.devicename }, traits: [], roomHint: config.roomhint, state: { online: true, }, attributes: {}, willReportState: true, noraSpecific: {} }; if (config.onOffSupported) { deviceConfig.traits.push('action.devices.traits.OnOff'); if ((0, nora_firebase_common_1.isOnOff)(deviceConfig)) { const onOffAttributes = { commandOnlyOnOff: (config.onOffMode === 'c'), queryOnlyOnOff: (config.onOffMode === 'q') }; deviceConfig.attributes = Object.assign(Object.assign({}, deviceConfig.attributes), onOffAttributes); const onOffState = { on: false, }; deviceConfig.state = Object.assign(Object.assign({}, deviceConfig.state), onOffState); } ; } if (config.temperatureSupported) { deviceConfig.traits.push('action.devices.traits.TemperatureSetting'); if ((0, nora_firebase_common_1.isTemperatureSetting)(deviceConfig)) { const temperatureSettingAttributes = { availableThermostatModes: ['heat'], commandOnlyTemperatureSetting: (config.temperatureMode === 'c'), queryOnlyTemperatureSetting: (config.temperatureMode === 'q'), thermostatTemperatureRange: { minThresholdCelsius: parseInt(config.temperatureRangeMin, 10) || 0, maxThresholdCelsius: parseInt(config.temperatureRangeMax, 10) || 100, }, thermostatTemperatureUnit: config.temperatureUnit || 'C', }; deviceConfig.attributes = Object.assign(Object.assign({}, deviceConfig.attributes), temperatureSettingAttributes); const temperatureState = { thermostatMode: 'heat', thermostatTemperatureAmbient: 0, thermostatTemperatureSetpoint: 0, }; deviceConfig.state = Object.assign(Object.assign({}, deviceConfig.state), temperatureState); } } if (config.startStopSupported) { deviceConfig.traits.push('action.devices.traits.StartStop'); if ((0, nora_firebase_common_1.isStartStopDevice)(deviceConfig)) { const startStopAttributes = { pausable: config.startStopPausable }; deviceConfig.attributes = Object.assign(Object.assign({}, deviceConfig.attributes), startStopAttributes); const startStopState = { isRunning: false }; deviceConfig.state = Object.assign(Object.assign({}, deviceConfig.state), startStopState); } } if (config.timerSupported) { deviceConfig.traits.push('action.devices.traits.Timer'); if ((0, nora_firebase_common_1.isTimerDevice)(deviceConfig)) { const timerAttributes = { maxTimerLimitSec: parseInt(config.timerMaxLimitSeconds, 10) || 0, commandOnlyTimer: (config.timerMode === 'c' ? true : false) }; deviceConfig.attributes = Object.assign(Object.assign({}, deviceConfig.attributes), timerAttributes); const timerState = { timerRemainingSec: -1, timerPaused: false }; deviceConfig.state = Object.assign(Object.assign({}, deviceConfig.state), timerState); } } (0, util_1.registerNoraDevice)(this, RED, config, { deviceConfig, updateStatus: ({ state, update }) => { const statuses = []; if (isOnOffState(state)) { statuses.push(state.on ? 'on' : 'off'); } if (isStartStopState(state)) { statuses.push(state.isRunning ? (state.isPaused ? 'paused' : 'running') : 'not running'); } if (isTemperatureSettingState(state)) { const ambientTemperature = state.thermostatTemperatureAmbient.toFixed(2); const setpointTemperature = state.thermostatTemperatureSetpoint.toFixed(2); statuses.push(`T:${ambientTemperature} S:${setpointTemperature}`); } ; if (isTimerState(state)) { const remaining = (state.timerRemainingSec === -1 ? '' : state.timerRemainingSec.toString()); const paused = (state.timerPaused ? 'paused' : ''); statuses.push(`${remaining}s ${paused} `); } update(statuses.join(' ')); }, mapStateToOutput: state => ({ payload: state, }), handleNodeInput: async ({ msg, updateState }) => { await updateState(msg === null || msg === void 0 ? void 0 : msg.payload, []); } }); function isOnOffState(state) { return (0, nora_firebase_common_1.isOnOff)(deviceConfig) && 'on' in state; } function isStartStopState(state) { return (0, nora_firebase_common_1.isStartStopDevice)(deviceConfig) && 'isRunning' in state; } function isTemperatureSettingState(state) { return (0, nora_firebase_common_1.isTemperatureSetting)(deviceConfig) && 'thermostatTemperatureAmbient' in state; } function isTimerState(state) { return (0, nora_firebase_common_1.isTimerDevice)(deviceConfig) && 'timerRemainingSec' in state; } }); };