node-red-contrib-home-assistant-websocket
Version:
Node-RED integration with Home Assistant through websocket and REST API
64 lines (63 loc) • 2.73 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const InputOutputController_1 = __importDefault(require("../../common/controllers/InputOutputController"));
const NoConnectionError_1 = __importDefault(require("../../common/errors/NoConnectionError"));
const InputService_1 = require("../../common/services/InputService");
const const_1 = require("../../const");
const mustache_1 = require("../../helpers/mustache");
class FireEventController extends InputOutputController_1.default {
async onInput({ message, parsedMessage, send, done, }) {
if (!this.homeAssistant.websocket.isConnected) {
throw new NoConnectionError_1.default();
}
const eventType = parsedMessage.event.source === InputService_1.DataSource.Message
? parsedMessage.event.value
: (0, mustache_1.renderTemplate)(parsedMessage.event.value, message, this.node.context(), this.homeAssistant.websocket.getStates());
let eventData;
if (parsedMessage.data.source === InputService_1.DataSource.Message) {
eventData = parsedMessage.data.value;
}
else if (parsedMessage.data.value) {
if (parsedMessage.dataType.value === const_1.TypedInputTypes.JSONata) {
eventData = await this.jsonataService.evaluate(parsedMessage.data.value, {
message,
});
}
else {
const dataString = (0, mustache_1.renderTemplate)(typeof parsedMessage.data.value === 'object'
? JSON.stringify(parsedMessage.data.value)
: parsedMessage.data.value, message, this.node.context(), this.homeAssistant.websocket.getStates());
try {
eventData = JSON.parse(dataString);
}
catch (e) {
eventData = dataString;
}
}
}
this.node.debug(`Fire Event: ${eventType} -- ${JSON.stringify({})}`);
this.status.setSending();
try {
await this.homeAssistant.websocket.send({
type: 'fire_event',
event_type: eventType,
event_data: eventData,
});
}
catch (e) {
if (e instanceof Error) {
this.status.setError(e.message);
done(e);
}
this.node.error(e);
return;
}
this.status.setSuccess(eventType);
send(message);
done();
}
}
exports.default = FireEventController;
;