node-red-contrib-smartnora
Version:
Google Smart Home integration via Smart Nora https://smart-nora.eu/
135 lines (134 loc) • 6.54 kB
JavaScript
;
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;
}
});
};