Использование MegaD в openHAB

Обсуждение статей, технологий домашней автоматизации, программных и аппаратных решений
Igor78
Сообщения: 143
Зарегистрирован: 26 янв 2015, 14:44
Откуда: Москва

Re: Использование MegaD в openHAB

Сообщение Igor78 » 19 май 2017, 14:10

Пытался перейти с версии 2.0.0.7 на 2.0.0.9. Не получилось.

Вот что в логе в 9 версии (что-то работает, что-то нет):

Код: Выделить всё

12:42:13.596 [INFO ] [marthome.event.ItemStateChangedEvent] - TU_Heat_OutTemp changed from 43.31 to 43.37
12:42:13.615 [ERROR] [b.binding.megad.handler.MegaDHandler] - Connect to megadevice 10.5.5.11 error: no protocol:
12:42:13.643 [ERROR] [b.binding.megad.handler.MegaDHandler] - Connect to megadevice 10.5.5.11 error: no protocol:
12:42:13.763 [ERROR] [b.binding.megad.handler.MegaDHandler] - Connect to megadevice 10.5.5.11 error: no protocol:
12:42:13.856 [ERROR] [b.binding.megad.handler.MegaDHandler] - Connect to megadevice 10.5.5.11 error: no protocol:
12:42:14.050 [ERROR] [b.binding.megad.handler.MegaDHandler] - Connect to megadevice 10.5.5.11 error: no protocol:
12:42:15.401 [ERROR] [b.binding.megad.handler.MegaDHandler] - Connect to megadevice 10.5.5.15 error: no protocol:
12:42:15.474 [ERROR] [b.binding.megad.handler.MegaDHandler] - Connect to megadevice 10.5.5.15 error: no protocol:
12:42:15.492 [ERROR] [b.binding.megad.handler.MegaDHandler] - Connect to megadevice 10.5.5.15 error: no protocol:
12:42:15.904 [ERROR] [b.binding.megad.handler.MegaDHandler] - Connect to megadevice 10.5.5.20 error: no protocol:
12:42:15.916 [INFO ] [marthome.event.ItemStateChangedEvent] - Room_Boy_CO2_asADCValue changed from 66 to 64
А вот как в 7 (ошибок нет):

Код: Выделить всё

12:54:24.121 [INFO ] [marthome.event.ItemStateChangedEvent] - Room_Boy_CO2_asADCValue changed from 80 to 77
12:54:25.894 [INFO ] [marthome.event.ItemStateChangedEvent] - TU_Heat_OutTemp changed from 39.50 to 39.43
12:54:26.508 [INFO ] [marthome.event.ItemStateChangedEvent] - TU_TOGVS_WaterOutTemp changed from 22.43 to 22.37
12:54:26.895 [INFO ] [marthome.event.ItemStateChangedEvent] - TU_HotFloor_InTemp changed from 23.68 to 23.62
12:54:31.556 [INFO ] [b.binding.megad.handler.MegaDHandler] - Switch: http://10.5.5.15/xxx/?cmd=8:0
12:54:31.566 [INFO ] [smarthome.event.ItemCommandEvent    ] - Item 'TU_Heat_Boiler1_TEN1' received command OFF
12:54:31.614 [INFO ] [b.binding.megad.handler.MegaDHandler] - Switch: http://10.5.5.15/bis/?cmd=9:0
12:54:31.625 [INFO ] [smarthome.event.ItemCommandEvent    ] - Item 'TU_Heat_Boiler1_TEN2' received command OFF
12:54:31.641 [INFO ] [b.binding.megad.handler.MegaDHandler] - Switch: http://10.5.5.15/xxx/?cmd=10:0
12:54:31.651 [INFO ] [smarthome.event.ItemCommandEvent    ] - Item 'TU_Heat_Boiler1_TEN3' received command OFF
12:54:31.743 [INFO ] [marthome.event.ItemStateChangedEvent] - TU_Heat_InTemp changed from 40.06 to 40.00
12:54:36.957 [INFO ] [b.binding.megad.handler.MegaDHandler] - Switch: http://10.5.5.12/xxx/?cmd=7:0
12:54:36.971 [INFO ] [smarthome.event.ItemCommandEvent    ] - Item 'TU_GVS_Gidrolock_Valve1_Power' received command OFF
12:54:36.982 [INFO ] [b.binding.megad.handler.MegaDHandler] - Switch: http://10.5.5.12/xxx/?cmd=8:0
Вся конфигурация через файлы. Мой Things:

Код: Выделить всё

Bridge megad:bridge:incomingserver [port=8585]
{
 
 //MegaD328 10.5.5.11
 Thing device MD328-11-p0 [hostname="10.5.5.11", port="0", password="xxx", refresh="3"]
 Thing device MD328-11-p1 [hostname="10.5.5.11", port="1", password="xxx", refresh="15"]
 Thing device MD328-11-p2 [hostname="10.5.5.11", port="2", password="xxx", refresh="15"]
 Thing device MD328-11-p3 [hostname="10.5.5.11", port="3", password="xxx", refresh="15"]
 Thing device MD328-11-p4 [hostname="10.5.5.11", port="4", password="xxx", refresh="15"]
 Thing device MD328-11-p5 [hostname="10.5.5.11", port="5", password="xxx", refresh="10"]
 Thing device MD328-11-p6 [hostname="10.5.5.11", port="6", password="xxx", refresh="60"]
 Thing device MD328-11-p7 [hostname="10.5.5.11", port="7", password="xxx", refresh="3"]
 Thing device MD328-11-p8 [hostname="10.5.5.11", port="8", password="xxx", refresh="15"]
 Thing device MD328-11-p9 [hostname="10.5.5.11", port="9", password="xxx", refresh="0"]
 Thing device MD328-11-p10 [hostname="10.5.5.11", port="10", password="xxx", refresh="0"]
 Thing device MD328-11-p11 [hostname="10.5.5.11", port="11", password="xxx", refresh="15"]
 Thing device MD328-11-p12 [hostname="10.5.5.11", port="12", password="xxx", refresh="0"]
 Thing device MD328-11-p13 [hostname="10.5.5.11", port="13", password="xxx", refresh="0"]
 
 //MegaD328 10.5.5.12
 Thing device MD328-12-p0 [hostname="10.5.5.12", port="0", password="xxx", refresh="60"]
 Thing device MD328-12-p1 [hostname="10.5.5.12", port="1", password="xxx", refresh="60"]
 Thing device MD328-12-p2 [hostname="10.5.5.12", port="2", password="xxx", refresh="60"]
 Thing device MD328-12-p3 [hostname="10.5.5.12", port="3", password="xxx", refresh="60"]
 Thing device MD328-12-p4 [hostname="10.5.5.12", port="4", password="xxx", refresh="60"]
 Thing device MD328-12-p5 [hostname="10.5.5.12", port="5", password="xxx", refresh="60"]
 Thing device MD328-12-p6 [hostname="10.5.5.12", port="6", password="xxx", refresh="60"]
 Thing device MD328-12-p7 [hostname="10.5.5.12", port="7", password="xxx", refresh="0"]
 Thing device MD328-12-p8 [hostname="10.5.5.12", port="8", password="xxx", refresh="0"]
 Thing device MD328-12-p9 [hostname="10.5.5.12", port="9", password="xxx", refresh="0"]
 Thing device MD328-12-p10 [hostname="10.5.5.12", port="10", password="xxx", refresh="0"]
 Thing device MD328-12-p11 [hostname="10.5.5.12", port="11", password="xxx", refresh="60"]
 Thing device MD328-12-p12 [hostname="10.5.5.12", port="12", password="xxx", refresh="60"]
 
 //MegaD328 10.5.5.14
 Thing device MD328-14-p7 [hostname="10.5.5.14", port="7", password="xxx", refresh="0"]
 Thing device MD328-14-p8 [hostname="10.5.5.14", port="8", password="xxx", refresh="0"]
 Thing device MD328-14-p9 [hostname="10.5.5.14", port="9", password="xxx", refresh="0"]
 Thing device MD328-14-p10 [hostname="10.5.5.14", port="10", password="xxx", refresh="0"]
 Thing device MD328-14-p11 [hostname="10.5.5.14", port="11", password="xxx", refresh="0"]
 Thing device MD328-14-p12 [hostname="10.5.5.14", port="12", password="xxx", refresh="60"]
 
 //MegaD328 10.5.5.15
 Thing device MD328-15-p0 [hostname="10.5.5.15", port="0", password="xxx", refresh="60"]
 Thing device MD328-15-p1 [hostname="10.5.5.15", port="1", password="xxx", refresh="60"] 
 Thing device MD328-15-p2 [hostname="10.5.5.15", port="2", password="xxx", refresh="3"] 
 Thing device MD328-15-p7 [hostname="10.5.5.15", port="7", password="xxx", refresh="60"]
 Thing device MD328-15-p8 [hostname="10.5.5.15", port="8", password="xxx", refresh="60"]
 Thing device MD328-15-p9 [hostname="10.5.5.15", port="9", password="xxx", refresh="60"]
 Thing device MD328-15-p10 [hostname="10.5.5.15", port="10", password="xxx", refresh="60"]
 Thing device MD328-15-p11 [hostname="10.5.5.15", port="11", password="xxx", refresh="15"]
 Thing device MD328-15-p12 [hostname="10.5.5.15", port="12", password="xxx", refresh="15"]
 
 //MegaD2561 10.5.5.20
 Thing device MD2561-20-p16 [hostname="10.5.5.20", port="16", password="xxx", refresh="0"]
 Thing device MD2561-20-p36 [hostname="10.5.5.20", port="36", password="xxx", refresh="5"]
}
Я так понимаю, что что-то изменилось в синтаксисе things или items. Напирмер, incount, который точно работает в 7 и не работает в 9 у меня описан так:

Код: Выделить всё

Number TU_Obratka_Flow_impCounter	"Датчик потока [%d имп]"    { channel = "megad:device:incomingserver:MD328-11-p0:incount" }
Petros, в какую сторону копать?
С уважением, Игорь

empenoso
Сообщения: 1039
Зарегистрирован: 11 ноя 2015, 08:03
Откуда: Пермь

Re: Использование MegaD в openHAB

Сообщение empenoso » 20 май 2017, 17:23

По моему в org.openhab.binding.megad_2.0.0.8.jar не работает счетчик:

Код: Выделить всё

{channel ="megad:device:14in:P6_CountElecImp:incount"}
На меге значения меняются, но в в опенхаб не попадают:

Код: Выделить всё

Back
P6/OFF/155

Код: Выделить всё

Пакет: openhab2
Версия: 2.0.0-1

Petros
Сообщения: 900
Зарегистрирован: 21 авг 2012, 22:09
Откуда: Москва

Re: Использование MegaD в openHAB

Сообщение Petros » 20 май 2017, 21:05

Понял Вас, проверю!

Bonefolder
Сообщения: 617
Зарегистрирован: 30 мар 2017, 11:15
Откуда: г.Севастополь

Re: Использование MegaD в openHAB

Сообщение Bonefolder » 21 май 2017, 15:59

Petros, здравствуйте!
Подскажите, какой синтаксис заложен в Onewire?
в браузере Мега отдает такую строку.
  • Код: Выделить всё

    192.168.X.XXX/sec/?pt=35&cmd=list
    ff2893b31604:23.31;ffecbcb31604:23.50;ffae85b31603:22.93;ff8facb31603:23.31;ffffa4b31603:23.43
Через пепер уи (т.к. не знаю синтаксиса) добавил порт 35, на котором висит гирлянда. Выбрал "Temperature Onewire". В дебаге получаю
  • Код: Выделить всё

    2017-05-21 14:52:15.910 [ERROR] [b.binding.megad.handler.MegaDHandler] - Connect to megadevice 192.168.X.XXX error: no protocol: 
    2017-05-21 14:52:15.915 [DEBUG] [b.binding.megad.handler.MegaDHandler] - Cannot update One wire temperature at channel: 'onewire'
    

Petros
Сообщения: 900
Зарегистрирован: 21 авг 2012, 22:09
Откуда: Москва

Re: Использование MegaD в openHAB

Сообщение Petros » 21 май 2017, 17:16

Onewire Списком пока не реализован. Честно говоря пока я понятия не имею как. Реализуете через http запрос и парсер

Bonefolder
Сообщения: 617
Зарегистрирован: 30 мар 2017, 11:15
Откуда: г.Севастополь

Re: Использование MegaD в openHAB

Сообщение Bonefolder » 21 май 2017, 17:23

Да, я понял.
Дебаг шоворит, что баиндинг отправляет на Мегу запрос http://192.168.1.114/sec/?pt=35&cmd=get вместо http://192.168.1.114/sec/?pt=35&cmd=list
Возможно ли заменить в баиндинге ГЕТ на ЛИСТ, для Onewire? А дальше будем парсить))) что-то у меня с http баиндингом не складывается(((

Petros
Сообщения: 900
Зарегистрирован: 21 авг 2012, 22:09
Откуда: Москва

Re: Использование MegaD в openHAB

Сообщение Petros » 22 май 2017, 13:40

Igor78, можно ли увидеть логи Дебага?

UPD
Не нужно логов, Новая версия :)

Поправил вывод ошибок.Про incount странная штука - формат вывода был OFF/136 стал P6/OFF/136 Видимо прокатывало, но когда подход немного поменялся и стал более жестким - перестало :) Поправил, попробуйте. Кстати, а расскажите как вы обновляете версии? просто закидываете в папку новый файл? Или иначе?

empenoso
Сообщения: 1039
Зарегистрирован: 11 ноя 2015, 08:03
Откуда: Пермь

Re: Использование MegaD в openHAB

Сообщение empenoso » 22 май 2017, 14:32

Petros писал(а):Igor78, можно ли увидеть логи Дебага?

UPD
Не нужно логов, Новая версия :)

Поправил вывод ошибок.Про incount странная штука - формат вывода был OFF/136 стал P6/OFF/136 Видимо прокатывало, но когда подход немного поменялся и стал более жестким - перестало :) Поправил, попробуйте. Кстати, а расскажите как вы обновляете версии? просто закидываете в папку новый файл? Или иначе?
Счетчик заработал, спасибо!

Код: Выделить всё

2017-05-22 15:29:52.276 [ItemStateChangedEvent     ] - P6_CountElecImp changed from 1 to 3
2017-05-22 15:30:52.178 [ItemStateChangedEvent     ] - P6_CountElecImp changed from 3 to 4
2017-05-22 15:31:52.316 [ItemStateChangedEvent     ] - P6_CountElecImp changed from 4 to 5

Код: Выделить всё

Back
P6/OFF/5

Petros
Сообщения: 900
Зарегистрирован: 21 авг 2012, 22:09
Откуда: Москва

Re: Использование MegaD в openHAB

Сообщение Petros » 22 май 2017, 15:02

Bonefolder писал(а):Да, я понял.
Дебаг говорит, что баиндинг отправляет на Мегу запрос http://192.168.1.114/sec/?pt=35&cmd=get вместо http://192.168.1.114/sec/?pt=35&cmd=list
Возможно ли заменить в баиндинге ГЕТ на ЛИСТ, для Onewire? А дальше будем парсить))) что-то у меня с http баиндингом не складывается(((

Прошу вас:

Sitemap:

Код: Выделить всё

sitemap default label="Main Menu"
{
    Frame {
		Text item=parse1
		Text item=p1
		Text item=p2
		Text item=p3
		Text item=p4
		Text item=p5
	}
}
Items:

Код: Выделить всё

String parse1 "[%s]" 
String p1 "[%s]"
String p2 "[%s]"
String p3 "[%s]"
String p4 "[%s]"
String p5 "[%s]"
Rules:

Код: Выделить всё

rule "onewire parsing"
when
       Time cron "0/5 * * * * ?" //EVERY 5 SECONDS
    then
    
	val parseme = sendHttpGetRequest("http://192.168.1.114/sec/?pt=35&cmd=list")
	val splitsens = parseme.split(";")
	val senslenght = splitsens.length
	
	logInfo("onwirecount",senslenght.toString )
          postUpdate(p1,splitsens.get(0).split(":").get(1))
		  postUpdate(p2,splitsens.get(1).split(":").get(1))
		  postUpdate(p3,splitsens.get(2).split(":").get(1))
		  postUpdate(p4,splitsens.get(3).split(":").get(1))
		  postUpdate(p5,splitsens.get(4).split(":").get(1))
end

МОЙ ЛОГ:

Код: Выделить всё

2017-05-22 14:01:08.343 [DEBUG] [.e.s.m.c.i.ModelRepositoryImpl:200  ] - Refreshing resource 'demo2.rules'
2017-05-22 14:01:08.353 [DEBUG] [s.m.r.r.i.e.RuleTriggerManager:590  ] - Removed scheduled cron job 'demo2.rules#onewire parsing#0/5 * * * * ?'
2017-05-22 14:01:08.354 [DEBUG] [s.m.r.r.i.e.RuleTriggerManager:570  ] - Scheduled rule 'onewire parsing' with cron expression '0/5 * * * * ?
2017-05-22 14:01:15.001 [DEBUG] [.m.r.r.i.engine.ExecuteRuleJob:58   ] - Executing scheduled rule 'onewire parsing'
2017-05-22 14:01:15.002 [DEBUG] [smarthome.io.net.http.HttpUtil:215  ] - About to execute http://localhost/sec/?pt=35&cmd=list
2017-05-22 14:01:15.006 [INFO ] [o.e.s.model.script.onwirecount:48   ] - 5
2017-05-22 14:01:15.008 [INFO ] [smarthome.event.ItemStateEvent:43   ] - p1 updated to 23.31
2017-05-22 14:01:15.009 [INFO ] [smarthome.event.ItemStateEvent:43   ] - p2 updated to 23.50
2017-05-22 14:01:15.010 [INFO ] [smarthome.event.ItemStateEvent:43   ] - p3 updated to 22.93
2017-05-22 14:01:15.010 [INFO ] [smarthome.event.ItemStateEvent:43   ] - p4 updated to 23.31
2017-05-22 14:01:15.011 [INFO ] [smarthome.event.ItemStateEvent:43   ] - p5 updated to 23.43
UPD: Удалил лишнее, senslenght нужен чтобы понять сколько датчиков определилось.

Igor78
Сообщения: 143
Зарегистрирован: 26 янв 2015, 14:44
Откуда: Москва

Re: Использование MegaD в openHAB

Сообщение Igor78 » 22 май 2017, 15:24

Petros писал(а):...Новая версия :)
.. Кстати, а расскажите как вы обновляете версии? просто закидываете в папку новый файл? Или иначе?
Спасибо! Вроде все завелось без ошибок.. Как правильно менять версии сам не знаю, вначале менял просто заменой файла, как в 1.8, но не смог нормально откатиться назад, теперь при смене обязательно чищу папку userdata: удаляю все кроме etc и tmp, понимаю, что это не правильно, но для моей конфигурации это срабатывает, вся конфигурация в файлах, храню в mySQL... где-то встречал информацию как правильно чистить кэш OH2, но сейчас не могу найти...
С уважением, Игорь

d.v.ermakov
Администратор
Сообщения: 2187
Зарегистрирован: 29 май 2015, 21:23
Откуда: Екатеринбург, Нижний Тагил

Re: Использование MegaD в openHAB

Сообщение d.v.ermakov » 22 май 2017, 18:41

Уважаемый Petros, есть вопрос, ИМХО, нуждающийся в вашем участии.
Я тут как-то подключил систему контроля доступа по Wiegand 26 к Меге. Как только СКУД видит ключ, Мега сама отправляет на сервер информацию вида: /md.php?pt=30&wg=ec532f (подробности здесь: http://ab-log.ru/smart-house/ethernet/megad-2561), где последнее число - номер ключа, который и нужен.
Есть желание сделать всё через Опенхаб. С меня донат.

Petros
Сообщения: 900
Зарегистрирован: 21 авг 2012, 22:09
Откуда: Москва

Re: Использование MegaD в openHAB

Сообщение Petros » 22 май 2017, 19:09

d.v.ermakov , Piece of cake :)

Bonefolder
Сообщения: 617
Зарегистрирован: 30 мар 2017, 11:15
Откуда: г.Севастополь

Re: Использование MegaD в openHAB

Сообщение Bonefolder » 22 май 2017, 21:05

Petros писал(а):Кстати, а расскажите как вы обновляете версии? просто закидываете в папку новый файл? Или иначе?
Получаю оповещение с Гитхаба, что уважаемый Петрос обновил свой гит))) Выкидываю "устаревший" джар из папки оддона, и закидываю туда новый) пока работает.
Только приволокся со стройки, а тут уже два обновления)) Спасиба) сейчас буду мучать клаву и ОН, и убирать костыли)
ЗЫ c HTTP баиндингом разобрался. Правда, не столь элегантно, как у Вас.(( меня вводил в заблуждение последний параметр - REGEX. Никак не мог взять в голову, что туда прописать. Потом почитав "гугль " забил на предупреждение в дебаге)))

bvasya
Сообщения: 14
Зарегистрирован: 15 дек 2014, 21:00

Re: Использование MegaD в openHAB

Сообщение bvasya » 06 июн 2017, 17:47

Хочу поделиться своим правилом для управления светом. Поскольку с java и Xtend я опыта раньше не имел, написано скорее всего не самым оптимальным образом. Кучу ошибок (в основном с типами) приходилось решать методом тыка, но сейчас по крайней мере редактор не ругается) Версия самая начальная, скорее всего буду переписывать, поэтому формат настроек может поменяться. У меня работает на OH2 + биндинг от OH1. На OH1 скорее всего работать не будет, там много поменялось в работе правил.

Основная концепция такая:
  • Сделать код управления общим для всех, все различия вынести в настройки
  • Каждый выключатель или датчик движения отвечает за один или несколько выходов (свет, вытяжки и т.п.)
  • Если выходов несколько на одной кнопке, за основу берем первый по порядку
  • Каждый выход настраивается отдельно и не зависит от того каким выключателем был включен
  • В зависимости от текущего режима (у меня это время суток), выходы могут по разному реагировать на нажатие кнопок
  • При старте режима, можно сменить состояние и т.п.
  • В разных режимах - можно сделать разное значение диммера
  • По длительному нажатию, выход включается или выключается без дополнительных настроек
В данный момент, работает только с кнопками. Датчики движения, диммеры и смену состояния при смене режима пока не делал. Бывают небольшие глюки, но пока не отлавливал причину. Код старался по максимуму комментировать и в логи сейчас практически все изменения пишутся.

Теперь к коду:

megadevice.items

Код: Выделить всё

//група со всеми выключателями, на которые действует правило
Group:Switch:OR(ON,OFF)       gSwitches   "All switches"       (All)
//група со всеми выходами, на которые действует правило
Group:Switch:OR(ON,OFF)       gLights   "All lights"       (All)
//переключатель режимов
//в sitemap прописан как 
//Switch item=modeSelector mappings=["morning"="Morning","day"="Day","evening"="Evening","night"="Night", "guard"="Guard"]  
String modeSelector "M" 

Switch	F2BedroomBedButton	"Спальня, выключатель у кровати [%s]"	(F2, Bedroom, gSwitches)		{megadevice="sec:192.168.0.22:3"}
Switch	F2BedroomHallButtonL	"Спальня, выключатель в корридоре левый [%s]"	(F2, Bedroom, gSwitches)	{megadevice="sec:192.168.0.22:5"}
Switch	F2BedroomHallButtonR	"Спальня, выключатель в корридоре правый [%s]"	(F2, Bedroom, gSwitches)	{megadevice="sec:192.168.0.22:6"}
Switch	F2BedroomBra			"Спальня, бра [%s]"					(F2, Bedroom, gLights)		{megadevice="sec:192.168.0.22:8"}
Switch	F2BedroomBathMirror	"Спальня санузел, зеркало [%s]"		(F2, BedroomBath, gLights)	{megadevice="sec:192.168.0.22:9"}
Switch	F2BedroomBathLight		"Спальня санузел, свет [%s]"			(F2, BedroomBath, gLights)	{megadevice="sec:192.168.0.22:10"}
Switch	F2BedroomBathAir		"Спальня санузел, вытяжка [%s]"		(F2, BedroomBath, gLights)		{megadevice="sec:192.168.0.31:22"}
Switch	F2BedroomLight1		"Спальня, свет 1 [%s]"				(F2, Bedroom, gLights)		{megadevice="sec:192.168.0.22:12"}
Switch	F2BedroomLight2		"Спальня, свет 2 [%s]"				(F2, Bedroom, gLights)		{megadevice="sec:192.168.0.22:13"}
Ниже в коде пример настройки для спальни с санузлом: бра обычно включается на 3 минуты, вечером и ночью без таймера. Основной свет в комнате вечером и ночью не включается (только по длительному нажатию). В санузле вчером и ночью вытяжка включается сразу и работает после выключения 10 минут, в остальное время вытяжка включается только после выключения света на 5 минут

megadevice.rules

Код: Выделить всё


import java.util.HashMap
import java.util.LinkedHashMap
import java.util.ArrayList
import java.util.Map
import java.util.concurrent.locks.Lock
import java.util.concurrent.locks.ReentrantLock
import java.io.Serializable

/* Настройки ламп по умолчанию
 * 
 * Для таймеров:
 * Double.NEGATIVE_INFINITY - не включаем
 * Double.POSITIVE_INFINITY - включаем без таймера
 * null - ?
 * 
 * Для старта:
 * TODO: реализовать
 * Double.NEGATIVE_INFINITY - выключаем
 * Double.POSITIVE_INFINITY - включаем без таймера
 * null - ничего не делаем
 * 
 */
val Double NEVER = Double.NEGATIVE_INFINITY
val Double FOREVER = Double.POSITIVE_INFINITY

var _default =
	newHashMap(
		"buttonTimeout" -> Double.POSITIVE_INFINITY,	// таймаут при включении с кнопки
		"sensorTimeout" -> 10,		// таймаут при включении с сенсора
		"started" -> null,			// значение при старте режима
		"offTimeout" -> 0,			// таймаут на выключение после выключения с кнопки
		"dimmer" -> 100				//значение диммера        	
	)

var HashMap<String, HashMap<String, ?>> _lights =
    newHashMap(
        "F2BedroomBathMirror" -> (newHashMap(      	
    	),
        "F2BedroomBathLight" -> (newHashMap(      	
    	),
        "F2BedroomBathAir" -> (newHashMap(
        	"buttonTimeout" -> Double.NEGATIVE_INFINITY,
        	"buttonTimeout_evening" -> Double.POSITIVE_INFINITY,
        	"buttonTimeout_night" -> Double.POSITIVE_INFINITY,        	
        	"offTimeout" -> 300,
        	"offTimeout_evening" -> 600,
        	"offTimeout_night" -> 600              	
    	),     	   	
        "F2BedroomBra" -> (newHashMap( 
        	"buttonTimeout" -> 180,
        	"buttonTimeout_evening" -> Double.POSITIVE_INFINITY, 
        	"buttonTimeout_night" -> Double.POSITIVE_INFINITY            	          	
    	),
        "F2BedroomLight1" -> (newHashMap(
        	"buttonTimeout_evening" -> Double.NEGATIVE_INFINITY,
        	"buttonTimeout_night" -> Double.NEGATIVE_INFINITY       	
    	),
        "F2BedroomLight2" -> (newHashMap(
        	"buttonTimeout_evening" -> Double.NEGATIVE_INFINITY,
        	"buttonTimeout_night" -> Double.NEGATIVE_INFINITY                 	
    	)		
    )

//кнопки    
var HashMap<String, ArrayList<String>> _switches = 
	newLinkedHashMap(
		"F2BedroomBedButton" -> newArrayList("F2BedroomBra", "F2BedroomLight1", "F2BedroomLight2"),
		"F2BedroomHallButtonL" -> newArrayList("F2BedroomBra", "F2BedroomLight1", "F2BedroomLight2"),
		"F2BedroomHallButtonR" -> newArrayList("F2BedroomBathLight", "F2BedroomBathMirror", "F2BedroomBathAir")			
	)   

//датчики
//TODO: реализовать
var HashMap<String, ArrayList<String>> _sensors = 
	newLinkedHashMap(
		"sensor1" -> newArrayList("light1"),
		"sensor2" -> newArrayList("light2")
	)   

// Таймеры на отключение по timeout
var HashMap<String, Timer> _timeoutTimers = newHashMap
// Триггеры на сработавший механизм, чтобы датчики движения не переназначали действия кнопок
var HashMap<String, String> _lastTriggers = newHashMap    
// время нажатия now.getMillisOfDay
var HashMap<String, Number> _switches_time = newHashMap      
  

//лямбда для получения настроек в зависимости от режима
//приоритет настроек: mode настройка для лампы -> общая для лампы -> общая для всех
//mode берем из modeSelector

val Functions$Function3 getSettingsByCurrentMode = [ 
	String item,
	HashMap<String, HashMap<String, Number>> gSettings,
	HashMap<String, Number> def |
		var mode = modeSelector.state.toString
		var HashMap<String, Number> result = newHashMap

		if (gSettings.containsKey(item)) {
			var settings = gSettings.get(item)

			for (def_entry : def.entrySet()) {
				var v = def_entry.getKey()
				if (settings.containsKey(v+"_"+mode)) {
					result.put(v, settings.get(v+"_"+mode))
				} else {
					if(settings.containsKey(v)) {
						result.put(v, settings.get(v))
					} else {
						result.put(v, def_entry.getValue())
					}
				}
			}							
		} else {
			result=def
		}

	result
	]
    
rule "Set lights timers on system start"    
when
	System started
then
//создаем таймеры для лампочек
//TODO: добавлять только для тех, где есть timeout в настройках 
for (t : _lights.entrySet()) {
	_timeoutTimers.put(t.getKey(), null)
	_lastTriggers.put(t.getKey(), "")	
}
end

rule "switch _lights by settings"
when
	Item gSwitches received update
then

	(gSwitches).members.filter(x|x.state == ON).forEach [ sw |
		//Сохраняем время нажатия кнопки
		if (!_switches_time.containsKey(sw.name)) {
			_switches_time.put(sw.name, now.getMillisOfDay)
		}
		
		//Лампы на данном выключателе
		val ArrayList<String> swLights = _switches.get(sw.name)

		//Проверяем есть ли настройки для выключателя
		if (swLights != null && swLights.size>=1) {
			//первая лампа в группе
			val firstLight = swLights.get(0)
			//State первой лампы в группе
			val firstLightState = gLights.members.findFirst[name.equals(firstLight)].state
			//настройки первой лампы
			//val firstLightSettings =  getSettingsByCurrentMode.apply(firstLight, _lights, _default) as HashMap<String, Number>
			
			
			/*
 			* Обработка длинного нажатия
 			*/
 			// Таймер на 2 секунды
			var Timer longTimer = createTimer(now.plusSeconds(2), [ |
				//если при срабатывании таймера кнопка по прежнему нажата
				if (sw.state == ON) {
					swLights.forEach [ swl |
						//если было выключено - включаем и обнуляем таймеры
						if (firstLightState==OFF) {
                    		sendCommand(swl, "ON")
                    		postUpdate(swl, "ON")
                    		var Timer offTimer = _timeoutTimers.get(swl)
                    		if (offTimer != null) {
                    			offTimer.cancel
                    			_timeoutTimers.put(swl, null)
                    			logInfo("SLbyS", swl+": timeoutTimer : clear")
                    		}
                    		logInfo("SLbyS", swl+": long_press   : ON")
						} 
						//если было включено - выключаем и обнуляем таймеры
						else {
                    		sendCommand(swl, "OFF")
                    		postUpdate(swl, "OFF")
                    		var Timer offTimer = _timeoutTimers.get(swl)
                    		if (offTimer != null) {
                    			offTimer.cancel
                    			_timeoutTimers.put(swl, null)
                    			logInfo("SLbyS", swl+": timeoutTimer : clear")
                    		}
                    		logInfo("SLbyS", swl+": long_press   : OFF")
						}
					]
				}	
			])			
			
			
			
			/*
 			* Обработка короткого нажатия
 			*/				
			swLights.forEach [ swl |
					//настройки лампы
                    var lightSettings = getSettingsByCurrentMode.apply(swl, _lights, _default) as HashMap<String, Number>
                    //Item лампы
                    var lightItem = gLights.members.findFirst[name.equals(swl)]
                    
                    /*
                     * переключаем всю группу в одно состояние обратное от первого элемента
                     * TODO проверить на отключение таймеров
                     */
                    // если лампа включена - выключаем   
					if (firstLightState==ON) { //TODO что делать если у первой лампы в группе стоит NEVER?
						// если есть offTimeout, выключаем через некоторое время
                    	if (lightSettings.get("offTimeout").intValue()>0) {
							val timerItem=lightItem
							
							//включаем, на случай, если было выключено
		         			sendCommand(timerItem, "ON")
                   			postUpdate(timerItem, "ON")
                   			
							logInfo("SLbyS", swl+": offTimer     : ON -> "+lightSettings.get("offTimeout").intValue()+" -> OFF")
							var Timer offTimer = createTimer(now.plusSeconds(lightSettings.get("offTimeout").intValue()), [ |
                    			sendCommand(timerItem, "OFF")
                    			postUpdate(timerItem, "OFF")
                    			logInfo("SLbyS", swl+": offTimer     : OFF")				
							])
							_timeoutTimers.put(swl, offTimer)                       		
                    	} 
                    	// просто выключаем
                    	else {
                    		sendCommand(lightItem, "OFF")
                    		postUpdate(lightItem, "OFF")
                    	
                    		var Timer offTimer = _timeoutTimers.get(swl)
                    		if (offTimer != null) {
                    			offTimer.cancel
                    			_timeoutTimers.put(swl, null)
                    			logInfo("SLbyS", swl+": timeoutTimer : clear")
                    		}

                    		logInfo("SLbyS", swl+": button       : OFF")                       		
                    	}
                   	}
                   	// если лампа выключена - включаем 
                   	else { 
              			if (lightSettings.get("buttonTimeout").doubleValue() == Double.NEGATIVE_INFINITY) {
              				//если NEGATIVE_INFINITY не включаем
              				logInfo("SLbyS", swl+": button       : skip")
              			} else if (lightSettings.get("buttonTimeout").doubleValue() == Double.POSITIVE_INFINITY) {
              				//POSITIVE_INFINITY просто включаем
              				sendCommand(lightItem, "ON")
                    		postUpdate(lightItem, "ON")
                    		logInfo("SLbyS", swl+": button       : ON") 
              			} else if (lightSettings.get("buttonTimeout").intValue()>0) {
              				//включаем с таймером
                    		sendCommand(lightItem, "ON")
                   		 	postUpdate(lightItem, "ON")
                    	
							val timerItem=lightItem
							var Timer offTimer = createTimer(now.plusSeconds(lightSettings.get("buttonTimeout").intValue()), [ |
                    			sendCommand(timerItem, "OFF")
                    			postUpdate(timerItem, "OFF")
                    			logInfo("SLbyS", swl+": startTimer   : OFF")			
							])
							_timeoutTimers.put(swl, offTimer)
							logInfo("SLbyS", swl+": startTimer   : ON -> "+lightSettings.get("buttonTimeout").intValue()+" -> OFF")         				
              			}               	
                    	                  		
                   	}
            ]
			
		}
	]
	
	//обнуляем время нажатия кнопки после отпускания
	for (sw : _switches_time.entrySet()) {
		if (gSwitches.members.findFirst[name.equals(sw.getKey())].state==OFF){
			_switches_time.remove(sw.getKey())
		}
	}

end
 

Petros
Сообщения: 900
Зарегистрирован: 21 авг 2012, 22:09
Откуда: Москва

Re: Использование MegaD в openHAB

Сообщение Petros » 20 июн 2017, 10:27

d.v.ermakov, работает ли новая опция?

bvasya, спасибо!

d.v.ermakov
Администратор
Сообщения: 2187
Зарегистрирован: 29 май 2015, 21:23
Откуда: Екатеринбург, Нижний Тагил

Re: Использование MegaD в openHAB

Сообщение d.v.ermakov » 21 июн 2017, 18:08

Извиняюсь, пока не нашёл времени проверить. Как проверю - напишу здесь.

stilet69
Сообщения: 103
Зарегистрирован: 30 июн 2017, 19:14

Re: Использование MegaD в openHAB

Сообщение stilet69 » 02 июл 2017, 20:15

Petros подскажите в чем может быть дело. Mega 2761, плагин для OpenHab 2 последней версии, Open hab 2.01
Подключал по вашей инструкции, но в Things Bridge Megad incoming server adapter подключился (зеленый ярлычок Online), а вот MegaD Binding Thing пишет, что INITIALIZING и все.
[img]
Screenshot-20170702190951-572x249.png
Screenshot-20170702190951-572x249.png (17.74 КБ) 3053 просмотра
[/img]
В логах events.log

Код: Выделить всё

2017-07-02 12:24:09.080 [ThingAddedEvent           ] - Thing 'megad:device:9dd66b0b' has been added.
2017-07-02 12:24:09.087 [hingStatusInfoChangedEvent] - 'megad:device:9dd66b0b' changed from UNINITIALIZED to INITIALIZING
2017-07-02 12:24:09.097 [hingStatusInfoChangedEvent] - 'megad:device:9dd66b0b' changed from INITIALIZING to UNINITIALIZED (HANDLER_INITIALIZING_ERROR)
2017-07-02 12:25:24.000 [hingStatusInfoChangedEvent] - 'megad:device:9dd66b0b' changed from UNINITIALIZED (HANDLER_INITIALIZING_ERROR) to INITIALIZING
2017-07-02 12:25:29.059 [ThingUpdatedEvent         ] - Thing 'megad:device:9dd66b0b' has been updated.
2017-07-02 12:26:14.910 [ItemChannelLinkAddedEvent ] - Link 'MegaDBindingThing_TemperatureDHT-megad:device:9dd66b0b:temp' has been added.
2017-07-02 12:26:55.714 [ThingUpdatedEvent         ] - Thing 'megad:device:9dd66b0b' has been updated.
2017-07-02 12:27:01.739 [ThingUpdatedEvent         ] - Thing 'megad:device:9dd66b0b' has been updated.
2017-07-02 12:27:28.286 [ItemChannelLinkAddedEvent ] - Link 'MegaDBindingThing_HumidityDHT-megad:device:9dd66b0b:humidity' has been added.
2017-07-02 12:27:37.076 [ThingUpdatedEvent         ] - Thing 'megad:device:9dd66b0b' has been updated.
в openhab.log

Код: Выделить всё

017-07-02 12:24:09.089 [ERROR] [ome.core.thing.internal.ThingManager] - Exception occurred while initializing handler of thing 'megad:device:9dd66b0b': java.lang.NullPointerException
java.util.concurrent.ExecutionException: java.lang.NullPointerException
	at java.util.concurrent.FutureTask.report(FutureTask.java:122)[:1.8.0_131]
	at java.util.concurrent.FutureTask.get(FutureTask.java:206)[:1.8.0_131]
	at org.eclipse.smarthome.core.common.SafeMethodCaller.callAsynchronous(SafeMethodCaller.java:194)
	at org.eclipse.smarthome.core.common.SafeMethodCaller.call(SafeMethodCaller.java:83)
	at org.eclipse.smarthome.core.common.SafeMethodCaller.call(SafeMethodCaller.java:67)
	at org.eclipse.smarthome.core.thing.internal.ThingManager.doInitializeHandler(ThingManager.java:738)[106:org.eclipse.smarthome.core.thing:0.9.0.b5]
	at org.eclipse.smarthome.core.thing.internal.ThingManager.initializeHandler(ThingManager.java:664)[106:org.eclipse.smarthome.core.thing:0.9.0.b5]
	at org.eclipse.smarthome.core.thing.internal.ThingManager.access$12(ThingManager.java:639)[106:org.eclipse.smarthome.core.thing:0.9.0.b5]
	at org.eclipse.smarthome.core.thing.internal.ThingManager$2.apply(ThingManager.java:681)
	at org.eclipse.smarthome.core.thing.internal.ThingManager$2.apply(ThingManager.java:1)
	at org.eclipse.smarthome.config.core.BundleProcessorVetoManager.applyActionFor(BundleProcessorVetoManager.java:124)[95:org.eclipse.smarthome.config.core:0.9.0.b5]
	at org.eclipse.smarthome.core.thing.internal.ThingManager.registerAndInitializeHandler(ThingManager.java:1016)[106:org.eclipse.smarthome.core.thing:0.9.0.b5]
	at org.eclipse.smarthome.core.thing.internal.ThingManager.thingAdded(ThingManager.java:464)[106:org.eclipse.smarthome.core.thing:0.9.0.b5]
	at org.eclipse.smarthome.core.thing.internal.ThingRegistryImpl.notifyTrackers(ThingRegistryImpl.java:212)
	at org.eclipse.smarthome.core.thing.internal.ThingRegistryImpl.notifyListenersAboutAddedElement(ThingRegistryImpl.java:131)
	at org.eclipse.smarthome.core.thing.internal.ThingRegistryImpl.notifyListenersAboutAddedElement(ThingRegistryImpl.java:1)
	at org.eclipse.smarthome.core.common.registry.AbstractRegistry.added(AbstractRegistry.java:126)
	at org.eclipse.smarthome.core.common.registry.AbstractProvider.notifyListeners(AbstractProvider.java:51)
	at org.eclipse.smarthome.core.common.registry.AbstractProvider.notifyListeners(AbstractProvider.java:70)
	at org.eclipse.smarthome.core.common.registry.AbstractProvider.notifyListenersAboutAddedElement(AbstractProvider.java:74)
	at org.eclipse.smarthome.core.common.registry.AbstractManagedProvider.add(AbstractManagedProvider.java:60)
	at org.eclipse.smarthome.core.common.registry.AbstractRegistry.add(AbstractRegistry.java:187)
	at org.eclipse.smarthome.io.rest.core.thing.ThingResource.create(ThingResource.java:204)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.8.0_131]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)[:1.8.0_131]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.8.0_131]
	at java.lang.reflect.Method.invoke(Method.java:498)[:1.8.0_131]
	at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81)[159:org.glassfish.jersey.core.jersey-server:2.22.2]
	at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:144)[159:org.glassfish.jersey.core.jersey-server:2.22.2]
	at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:161)[159:org.glassfish.jersey.core.jersey-server:2.22.2]
	at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:160)[159:org.glassfish.jersey.core.jersey-server:2.22.2]
	at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99)[159:org.glassfish.jersey.core.jersey-server:2.22.2]
	at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389)[159:org.glassfish.jersey.core.jersey-server:2.22.2]
	at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347)[159:org.glassfish.jersey.core.jersey-server:2.22.2]
	at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102)[159:org.glassfish.jersey.core.jersey-server:2.22.2]
	at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326)[159:org.glassfish.jersey.core.jersey-server:2.22.2]
	at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)[158:org.glassfish.jersey.core.jersey-common:2.22.2]
	at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)[158:org.glassfish.jersey.core.jersey-common:2.22.2]
	at org.glassfish.jersey.internal.Errors.process(Errors.java:315)[158:org.glassfish.jersey.core.jersey-common:2.22.2]
	at org.glassfish.jersey.internal.Errors.process(Errors.java:297)[158:org.glassfish.jersey.core.jersey-common:2.22.2]
	at org.glassfish.jersey.internal.Errors.process(Errors.java:267)[158:org.glassfish.jersey.core.jersey-common:2.22.2]
	at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)[158:org.glassfish.jersey.core.jersey-common:2.22.2]
	at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305)[159:org.glassfish.jersey.core.jersey-server:2.22.2]
	at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154)[159:org.glassfish.jersey.core.jersey-server:2.22.2]
	at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473)[156:org.glassfish.jersey.containers.jersey-container-servlet-core:2.22.2]
	at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427)[156:org.glassfish.jersey.containers.jersey-container-servlet-core:2.22.2]
	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388)[156:org.glassfish.jersey.containers.jersey-container-servlet-core:2.22.2]
	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341)[156:org.glassfish.jersey.containers.jersey-container-servlet-core:2.22.2]
	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228)[156:org.glassfish.jersey.containers.jersey-container-servlet-core:2.22.2]
	at com.eclipsesource.jaxrs.publisher.internal.ServletContainerBridge.service(ServletContainerBridge.java:76)[10:com.eclipsesource.jaxrs.publisher:5.3.1.201602281253]
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812)[82:org.eclipse.jetty.servlet:9.2.19.v20160908]
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:587)[82:org.eclipse.jetty.servlet:9.2.19.v20160908]
	at org.ops4j.pax.web.service.jetty.internal.HttpServiceServletHandler.doHandle(HttpServiceServletHandler.java:71)[173:org.ops4j.pax.web.pax-web-jetty:4.3.0]
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)[81:org.eclipse.jetty.server:9.2.19.v20160908]
	at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577)[80:org.eclipse.jetty.security:9.2.19.v20160908]
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223)[81:org.eclipse.jetty.server:9.2.19.v20160908]
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)[81:org.eclipse.jetty.server:9.2.19.v20160908]
	at org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doHandle(HttpServiceContext.java:287)[173:org.ops4j.pax.web.pax-web-jetty:4.3.0]
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)[82:org.eclipse.jetty.servlet:9.2.19.v20160908]
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)[81:org.eclipse.jetty.server:9.2.19.v20160908]
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)[81:org.eclipse.jetty.server:9.2.19.v20160908]
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)[81:org.eclipse.jetty.server:9.2.19.v20160908]
	at org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:80)[173:org.ops4j.pax.web.pax-web-jetty:4.3.0]
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)[81:org.eclipse.jetty.server:9.2.19.v20160908]
	at org.eclipse.jetty.server.Server.handle(Server.java:499)[81:org.eclipse.jetty.server:9.2.19.v20160908]
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311)[81:org.eclipse.jetty.server:9.2.19.v20160908]
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)[81:org.eclipse.jetty.server:9.2.19.v20160908]
	at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544)[72:org.eclipse.jetty.io:9.2.19.v20160908]
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)[84:org.eclipse.jetty.util:9.2.19.v20160908]
	at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)[84:org.eclipse.jetty.util:9.2.19.v20160908]
	at java.lang.Thread.run(Thread.java:748)[:1.8.0_131]
Caused by: java.lang.NullPointerException
	at org.openhab.binding.megad.handler.MegaDBridgeHandler.registerMegadThingListener(MegaDBridgeHandler.java:82)[9:org.openhab.binding.megad:2.0.1.1]
	at org.openhab.binding.megad.handler.MegaDHandler.registerMegadThingListener(MegaDHandler.java:320)[9:org.openhab.binding.megad:2.0.1.1]
	at org.openhab.binding.megad.handler.MegaDHandler.initialize(MegaDHandler.java:169)[9:org.openhab.binding.megad:2.0.1.1]
	at org.eclipse.smarthome.core.thing.internal.ThingManager$9.call(ThingManager.java:741)[106:org.eclipse.smarthome.core.thing:0.9.0.b5]
	at org.eclipse.smarthome.core.thing.internal.ThingManager$9.call(ThingManager.java:1)[106:org.eclipse.smarthome.core.thing:0.9.0.b5]
	at org.eclipse.smarthome.core.common.SafeMethodCaller$CallableWrapper.call(SafeMethodCaller.java:181)[99:org.eclipse.smarthome.core:0.9.0.b5]
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)[:1.8.0_131]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[:1.8.0_131]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)[:1.8.0_131]
	... 1 more
2017-07-02 12:25:29.038 [WARN ] [ome.core.thing.internal.ThingManager] - Initializing handler for thing 'megad:device:9dd66b0b' takes more than 5000ms.

Petros
Сообщения: 900
Зарегистрирован: 21 авг 2012, 22:09
Откуда: Москва

Re: Использование MegaD в openHAB

Сообщение Petros » 02 июл 2017, 20:54

А вы в things bridge выбрали?

stilet69
Сообщения: 103
Зарегистрирован: 30 июн 2017, 19:14

Re: Использование MegaD в openHAB

Сообщение stilet69 » 02 июл 2017, 21:45

Да, конечно
Screenshot-20170702204400-859x457.png
Screenshot-20170702204400-859x457.png (21.22 КБ) 3046 просмотров

stilet69
Сообщения: 103
Зарегистрирован: 30 июн 2017, 19:14

Re: Использование MegaD в openHAB

Сообщение stilet69 » 02 июл 2017, 21:47

А в Bridge Megad incoming server adapter в поле Location нужно что то вносить? Например IP? Может из-за этого?

Ответить