loxone2mqtt
Version:
Gateway for Loxone™ miniserver to communicate with mqtt broker
89 lines (70 loc) • 2.48 kB
JavaScript
const Adaptor = require('../lib/Adaptor.js');
const WebSocketAPI = require('../lib/WebSocketAPI.js');
const Structure = require('node-lox-structure-file');
const path = require('path');
if (!process.env.NODE_CONFIG_DIR) {
process.env.NODE_CONFIG_DIR = path.join(__dirname, '/../config/');
}
var config = require('config');
var Mqtt = require('mqtt');
var log = require('yalm');
log.setLevel('debug');
var mqttConnected;
var loxClient = WebSocketAPI(config.get('miniserver'), log);
var loxMqttAdaptor;
var mqtt = Mqtt.connect(config.url, {will: {topic: config.name + '/connected', payload: '0', retain: true}});
mqtt.on('connect', function () {
mqttConnected = true;
log.info('mqtt connected', config.url);
mqtt.publish(config.name + '/connected', '1', {retain: true}); // TODO eventually set to '2' if target system already connected
log.info('mqtt subscribe', config.name + '/set/#');
mqtt.subscribe(config.name + '/set/#');
if (!loxClient.is_connected()) {
loxClient.connect();
}
});
mqtt.on('close', function () {
if (mqttConnected) {
mqttConnected = false;
log.info('mqtt closed ' + config.url);
}
});
mqtt.on('error', function (err) {
log.error('mqtt', err);
});
function updateEvent (uuid, value) {
if (loxMqttAdaptor) {
loxMqttAdaptor.set_value_for_uuid(uuid, value);
}
}
loxClient.on('update_event_text', updateEvent);
loxClient.on('update_event_value', updateEvent);
loxClient.on('get_structure_file', function (data) {
mqtt.publish(config.name + '/connected', '2', {retain: true});
if (loxMqttAdaptor) {
loxMqttAdaptor.abort();
}
loxMqttAdaptor = new Adaptor(Structure.create_from_json(data,
function (value) {
log.warn('MQTT Structure - invalid type of control', value);
}
));
mqtt.subscribe(config.name + '/set/#');
loxMqttAdaptor.on('for_mqtt', function (topic, data) {
log.debug('MQTT Adaptor - for mqtt: ', {topic: topic, data: data});
mqtt.publish(config.name + '/state/' + topic, data);
});
});
mqtt.on('message', function (topic, message, packet) {
if (!loxMqttAdaptor) {
return;
}
var action = loxMqttAdaptor.get_command_from_topic(topic, message.toString());
log.debug('MQTT Adaptor - for miniserver: ', {uuidAction: action.uuidAction, command: action.command});
if (!config.miniserver.readonly) {
loxClient.send_cmd(action.uuidAction, action.command);
} else {
log.debug('MQTT Adaptor - readonly mode');
}
});