Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.01.2019, 21:48
Новичок на форуме
Отправить личное сообщение для rw6miu Посмотреть профиль Найти все сообщения от rw6miu
 
Регистрация: 15.01.2019
Сообщений: 2

Попытка подружить Сервер 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 запрос на сервер. Но вот как отследить этот запрос ума не приложу.

Последний раз редактировалось rw6miu, 22.01.2019 в 09:45.
Ответить с цитированием
  #2 (permalink)  
Старый 22.01.2019, 09:42
Новичок на форуме
Отправить личное сообщение для rw6miu Посмотреть профиль Найти все сообщения от rw6miu
 
Регистрация: 15.01.2019
Сообщений: 2

Никогда бы не подумал что на этом ресурсе не окажется специалистов способных помочь написать скрипт на 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, 25.01.2019 в 10:07.
Ответить с цитированием
  #3 (permalink)  
Старый 22.01.2019, 10:06
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

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}`);
});
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с загрузкой файла на сервер shkarbatov Серверные языки и технологии 8 13.08.2011 01:27