Попытка подружить Сервер 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, время: 07:03. |