Попытка подружить Сервер ioBroker и контроллер MegaLight
Добрый день. Пытаюсь подключить контроллер управления освещением в систему умного дома на базе сервера ioBroker.
Вот протокол взаимодействия по HTTP Получение состояния реле HTTP-GET запрос вида http://megalight/state?c=get&n=1 n - ID нужного реле (обязательный) Ответ: text/plain в виде 1;255 где первое число - состояние (1 - вкл), второе - значение диммера Установка состояния реле HTTP-GET запрос вида http://megalight/state?c=set&n=1&o=1&v=200&t=30000 http://megalight/state?c=set&n=1&i=10 n - ID нужного реле (обязательный) o - состояние (1 - вкл, 0 - выкл) v - значение диммера (0-255) i - инкремент/декремент значения диммера (-255 по 255) t - таймаут в миллисекундах Ответ: пусто Получение состояния кнопки HTTP-GET запрос вида http://megalight/state?c=button&n=1 n - ID нужной кнопки/выключателя (обязательный) Ответ: text/plain в виде 1 состояние (1 - нажата, 0 - не нажата) Я не силён пока в JavaScript но покопавшись в инете нашёл пару скриптов для управления через Get запросы. Это первый вариант
createState('javascript.0.test', '');
var url = 'http://192.168.0.89';
var request = require('request');
var options = {
url: ''
};
on({id: 'javascript.0.test', change: 'any'}, function (obj) {
if(obj.newState.val === 0){
options.url = url+'/state?c=set&n=7&o=1';
} else {
options.url = url+'/state?c=set&n=7&o=0';
}
request(options, function (error, response, body) {
log('Ответ' + body);
});
});
Это второй вариант
createState('javascript.0.test', '');
on({id: 'javascript.0.test', change: 'any'}, function (obj) {
if((obj.newState.from == 'web.0' || obj.newState.from == 'system.adapter.web.0' ) && obj.newState.val == '0'){
request ('http://192.168.0.89/state?c=set&n=7&o=0');
}
if((obj.newState.from == 'web.0' || obj.newState.from == 'system.adapter.web.0' ) && obj.newState.val == '1'){
request ('http://192.168.0.89/state?c=set&n=7&o=1');
}
});
Оба прекрасно работают. И управляют включением и выключением реле. Но если я включаю свет с выключателя на стене то увы сервер не видит этого. Чувствую что в эти скрипты надо что-то добавить, но вот что? Контроллер сам при изменении состояния выходных портов отсылает Get запрос на сервер. Но вот как отследить этот запрос ума не приложу. |
Никогда бы не подумал что на этом ресурсе не окажется специалистов способных помочь написать скрипт на JS.
Придётся отвечать самому себе. Может кому пригодится. Скрипт сервера получился такой
var http = require('http');
var server = http.createServer().listen(8083); // на каком порту слушаем?
server.on('request', function(req, res) {
res.writeHead(200);
var getback = req.url;
var vars = getback.split("&");
for (var i=0;i<vars.length;i++) {
var pair = vars[i].split("=");
}
if (vars[4] == 'on=1') {
var state = 1;
} else {
var state = 0;
}
if (vars[3] == 'id=1') {
setState ('javascript.0.MegaLight1.braright', state);
} else if (vars[3] == 'id=2') {
setState ('javascript.0.MegaLight1.braleft', state);
} else if (vars[3] == 'id=3') {
setState ('javascript.0.MegaLight1.lightcenter', state);
} else if (vars[3] == 'id=4') {
setState ('javascript.0.MegaLight1.lightdop', state);
}
log('Канал ' + vars[3] + ' Состояние-' +state)
});
За красивость кода просьба сильно не пинать, я не программист. Скрипт работает но с первым вариантом управления который выше произошла какая-то завязка и при попытке управления происходило хаотичное включение-выключение света. А вот второй вариант отлично подружился с этим кодом. |
rw6miu, я с nodejs не знаком, но, думаю, ваш код можно так переписать:
on({
id:'javascript.0.test',
change:'any'
},function (obj) {
if(obj.newState.from!='web.0' && obj.newState.from!='system.adapter.web.0')
return;
const value=[0,1].indexOf(+obj.newState.val)<0?0:+obj.newState.val;
request('http://192.168.0.89/state?c=set&n=7&o='+value);
});
var http = require('http');
var urlParser=require('url');
var server = http.createServer().listen(8083); // на каком порту слушаем?
server.on('request', function(req, res) {
const requestGetParams=urlParser.parse(req.url,true).query;
const idsAssocs={
1:'braright',
2:'braleft',
3:'lightcenter',
4:'lightdop'
};
const state=+!((+requestGetParams.on)===0 || [1,0].indexOf(+requestGetParams.on)<0);
const stateName=idsAssocs[+requestGetParams.id]||requestGetParams[1];
setState(`javascript.0.MegaLight1.braright.${stateName}`,state);
res.writeHead(200);
log(`Канал id=${requestGetParams.id}; Состояние ${state}`);
});
|
| Часовой пояс GMT +3, время: 00:46. |