Прошивка MegaD-2561 (релизы, обсуждения, предложения)

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

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Igor78 » 22 апр 2019, 18:42

Andrey_B писал(а):
20 апр 2019, 09:48
...

Но здесь нет обработки "нажатия" на ручку энкодера.
Нажатие можно кодировать звездочкой, предшествующей значению счетчика, но я бы на вашем месте сперва оценил работоспособность такого режима.
Дело в том, что весьма велика вероятность "затыка". Почти 100%. Энкодер работает по такому принципу. Он дергает порт прерывания (в примерах P35) и не отпускает его, пока контроллер не считает регистр ESTATUS. Когда энкодером управляет сервер, при резком вращении ручки достаточно потеряться какому-нибудь пакету (а их генерируется огромное количество, и возникает что-то вроде коллизии на уровне сетевого стэка), чтобы P35 остался в ON. Это похоже на зависание энкодера, но зависанием не является. Пока не знаю, что с этим можно сделать, как эффективно компенсировать. Понятно, что когда мастером выступает сам контроллер, то ничего такого быть не может, и все работает стабильно.
Спасибо, RGB подсветка заработала как положено.

Поэкспериментировал с работой через сервер. Понял, что вполне достаточно 4-5 состояний энкодера в секунду. Андрей, а можно реализовать такое поведение Меги: Мега получает прерывание, ждет 200 милисекунд и читает регистр ESTATUS энкодера, после чего шлет на сервер считанное значение энкодера

В таком случае, как не крути ручку энкодера, чаще чем 5 раз в секунду Мега не будет тревожить сервер, да и у сервера будет время "обдумать" полученную посылку...

Такую задержку и сейчас можно организовать средствами сервера, но, мне кажется, что лучше бы это делала Мега...
С уважением, Игорь

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

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Igor78 » 22 апр 2019, 18:46

pppkadaf писал(а):
21 апр 2019, 05:43
А после PCA9685 чем диммируете?
У меня все освещение светодиодное на основе LED-лент, после PCA мосфеты...
С уважением, Игорь

pppkadaf
Сообщения: 44
Зарегистрирован: 01 ноя 2017, 20:39

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение pppkadaf » 22 апр 2019, 19:51

Самодельный модули или что-то готовое?

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Andrey_B » 23 апр 2019, 10:38

Igor78 писал(а):
22 апр 2019, 18:42
Поэкспериментировал с работой через сервер. Понял, что вполне достаточно 4-5 состояний энкодера в секунду. Андрей, а можно реализовать такое поведение Меги: Мега получает прерывание, ждет 200 милисекунд и читает регистр ESTATUS энкодера, после чего шлет на сервер считанное значение энкодера
В таком случае, как не крути ручку энкодера, чаще чем 5 раз в секунду Мега не будет тревожить сервер, да и у сервера будет время "обдумать" полученную посылку...
Такую задержку и сейчас можно организовать средствами сервера, но, мне кажется, что лучше бы это делала Мега...
Мне кажется, что добавить между flush() и запросом состояния счетчика одну строчку с функцией usleep(200000) намного правильнее, а главное легче. Реализовать подобное в прошивке на порядки сложнее.

Я тоже поэкспериментировал с этой задержкой. Действительно не затыкается с PHP5 + curl или с PHP7 + file_get_contents.
Затыкается с file_get_contents в PHP5 из-за кривости работы этой функции в 5-ке, но эта версия уже история. И есть решение - добавить в конце sleep(5) и повторный запрос счетчика для "разблокировки" прерывания.

Работает, конечно, не так плавно и отзывчиво, как под управлением контроллера, но вполне терпимо.

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

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Igor78 » 23 апр 2019, 15:39

Понятно, буду реализовывать на стороне сервера, правда PHP я не использую, у меня связка: Меги - Промежуточный сервер (Python-скрипт) - Openhab2 (REST API,HTTP binding). Задержку буду реализовывать средствами промежуточного сервера, т.к. Openhab постоянно пытается все распараллелить, ждешь, что правила будут выполняться в одной последовательности, а они начинают друг друга "обгонять" :(
С уважением, Игорь

J0K3R
Сообщения: 16
Зарегистрирован: 05 май 2017, 17:12

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение J0K3R » 26 апр 2019, 07:36

Имею классический сценарий: по нажатию кнопки включается свет.
Andrey_B,
возможно ли поправить вывод MegaD в MQTT:

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

ctl1/18 {"port":18,"m":0,"value":"ON","cnt":29}
ctl1/23 {"port":23,"value":ON}
вот здесь:
"value":ON
чтобы было вот так (поместить значение в двойные кавычки):
"value":"ON"
как принято для формата JSON, а то JSON-парсер Home Assistant не воспринимает значение поля value.

PS: cтоит ли ожидать реализации функционала MQTT не в виде:
Через протокол MQTT также можно запросить состояние порта устройства. Для этого следует отправить в топик "megad/14/cmd" (где 14 - последний байт IP-адреса) команду вида "get:10" (где 10 - номер порта).
а в JSON формате

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

{"port":23} - получить значение порта
{"port":23,"value":"ON"} - задать значение порта
J3-SmartHome: MegaD + TinkerBoard + Home Assistant

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Andrey_B » 26 апр 2019, 11:24


J0K3R
Сообщения: 16
Зарегистрирован: 05 май 2017, 17:12

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение J0K3R » 26 апр 2019, 18:13

Andrey_B писал(а):
26 апр 2019, 11:24
J0K3R, попробуйте.
Andrey_B, большое спасибо за столь оперативную реализацию обеих функций! Home Assistant заработал корректно
J3-SmartHome: MegaD + TinkerBoard + Home Assistant

dimaxus
Сообщения: 227
Зарегистрирован: 12 окт 2012, 21:31

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение dimaxus » 27 апр 2019, 09:43

Доброе утро форум! А как правильно подключить SIM800L , что-то нигде схемки не нашел, как правильно согласовать уровни, ведь он же 5-вольтовый или будет работать от 3.3В?

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Andrey_B » 27 апр 2019, 13:43

Цитата отсюда.
GSM-модуль подключается к портам P32, P33 клеммы XT2 контроллера. Пин TX модуля GSM подключается к порту P32 (RX) контроллера, а пин RX модуля GSM к порту P33 (TX) контроллера.
Согласование не требуется. Согласно даташиту High Level Voltage для RX/TX не превшает 2.8В.

dimaxus
Сообщения: 227
Зарегистрирован: 12 окт 2012, 21:31

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение dimaxus » 27 апр 2019, 15:21

Спасибо за ответ Андрей, последний раз когда перечитывал описание так подробно не было расписано, а что по питанию , в даташите 3.4-4.4в , будет работать от 3.3 контроллера или нужен отдельный БП

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Andrey_B » 27 апр 2019, 16:21

В текущий версии контроллера DC-DC преобразователь не рассчитан на питание столь мощной нагрузки. Да и напряжения 3.3В мало.
Китайские платы с SIM800L предназначены для подключения питания 5В. То есть, нужен отдельный БП или преобразователь.

dimaxus
Сообщения: 227
Зарегистрирован: 12 окт 2012, 21:31

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение dimaxus » 27 апр 2019, 18:37

Понял, вот теперь наступила ясность :)

J0K3R
Сообщения: 16
Зарегистрирован: 05 май 2017, 17:12

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение J0K3R » 29 апр 2019, 08:04

Andrey_B (в продолжении разговора по части MQTT)
Будет ли возможность доработать функционал до наиболее широко употребимого варианта:
1. Выделить отдельные топики для запроса состояния и управления по портам: например, для порта 2

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

megad/2/cmd или ctl1/1/cmd - топик управления
megad/2/stat или ctl1/1/stat - топик состояния
2. Управление портом осуществлять командами в формате JSON (уже можно без указания номера порта)

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

ctl1/2/cmd <- {"state":"ON"} - переключения порта ON|OFF
ctl1/3/cmd <- {"state":200} - переключение дим. порта
ctl1/3/cmd <- {} - пустое сообщение для запроса данных состояния порта
(PS: если возможно заменить слово "value" на "state")
3. Данные о переключении порта направлять в топик (это, в принципе, уже есть, нужно только поправить топик)

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

ctl1/2/stat -> {"state":"ON"}
4. Реализовать srv-loop для MQTT (насколько понял сейчас нет такого). В топик, например,

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

ctl1/tele
слать данные по всем портам, IP, uptime, температуру, версию ПО с задаваемой периодичностью.
PS: это все пожеланию. Скажите, что реализуемо и будет добавлено, а что нет. Плюс, думаю, очевиден - это простота интеграции в любой УД по протоколу MQTT
Потырено отсюль.
J3-SmartHome: MegaD + TinkerBoard + Home Assistant

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Andrey_B » 29 апр 2019, 12:22

Можно сделать как угодно. Вопрос лишь в том, что такие изменения с высокой долей вероятности сломают уже настроенные и работающие связки с ПО сервера. И с точки зрения функциональности все эти переименования из value в state не несут какого-либо рационального смысла кроме попытки обеспечить совместимость с одним из множества сторонних проектов.
Также у меня вызывает вопросы аналог srv-loop. В HTTP - это один пакет, в котором помещается все. Вы же предлагаете периодически отправлять на сервер более 40 отдельных пакетов.

J0K3R
Сообщения: 16
Зарегистрирован: 05 май 2017, 17:12

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение J0K3R » 29 апр 2019, 14:30

Насколько я понимаю, на текущий момент поддержка MQTT является опциональным, поэтому и возможности протокола в Mega-девайсе ограничены по сравнению с HTTP. Я же предлагаю расширить функционал MQTT до полноценного и уже использовать как полноценный аналог HTTP. Необходимо только прийти к какому-то стандарту по части реализации.
Относительно изменений могу отметить, что статус беты в прошивке предполагает внесение новой логики, изменение текущей - нужно только задокументировать.
В srv-loop для MQTT предлагаю отправлять все те же статусы, что и по HTTP, но одним JSON-пакетом в один топик.
J3-SmartHome: MegaD + TinkerBoard + Home Assistant

Andrey_B
Администратор
Сообщения: 5327
Зарегистрирован: 18 мар 2011, 12:06

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Andrey_B » 01 май 2019, 12:08

pppkadaf писал(а):
14 апр 2019, 07:37
Драйверов на 7 сегментные дисплее с I2C я не нашел. Все делают на MAX7219/MAX7221, а это SPI/Microwire или TM1637, а это "two-wire serial interface (CLK, DIO)".
Т.е. без поддержки со стороны контроллера не обойтись.

Андрей реально добавить протокол для TM1637 в прошивку?
Andrey_B писал(а):
14 апр 2019, 11:45
"Two-wire serial interface" - это тот же I2C, прозванный так из-за некогда существующих лицензионных сложностей.
Вопрос в другом. Если вы собираетесь выводить просто цифры, контроллер, наверное, сможет чем-то помочь. А если произвольные символы, то будет проще взять библиотеку I2C-PHP и управлять отдельными сегментами дисплея через I2C-API. Получится немногим медленнее. В данном случае передается мало информации. Я бы сказал, что это тот случай, когда использование I2C-API оправдано.
pppkadaf писал(а):
14 апр 2019, 15:03
Если это так, то PHP-I2C достаточно. Чтобы контроллер сам выводил инфу на дисплей в моем случае не нужно.Закажу модуль, попробую.
Я попробовал. Пришло вот это. С виду вроде и ничего...

tm1637-disp.jpg
tm1637-disp.jpg (30.21 КБ) 5866 просмотров

Разумеется, им можно управлять через I2C-API серверным скриптом.

tm1637-run.gif
tm1637-run.gif (915.54 КБ) 5866 просмотров

Код простейший.

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

<?php
$digits = array("FC", "60", "DA", "F2", "66", "B6", "BE", "E0", "FE", "F6", "00"); 
define("SCL", "30");
define("SDA", "31");
define("MD", "http://192.168.0.14/sec/?");
define("V", "3");

require_once("mod_i2c_lib.php");

for ( $i = 5; $i > 0; $i-- )
{
	for ( $j = 3; $j >= 0; $j-- )
	{
		i2c_start();
		i2c_send("40");
		i2c_stop();

		i2c_start();
		i2c_send("C0");

		for ( $k = 0; $k < 4; $k++ )
		{
			if ( $k == $j )
			i2c_send($digits[$i]);
			else
			i2c_send("00");
		}
		i2c_send("00");
		i2c_send("00");
		i2c_stop();

		i2c_start();
		i2c_send("F1"); // Должно быть 8F
		i2c_stop();

		usleep(10000);
	}
}

// Shandarah
for ( $i = 0; $i < 6; $i++ )
{
		i2c_start();
		i2c_send("40");
		i2c_stop();

		i2c_start();
		i2c_send("C0");

		for ( $k = 0; $k < 4; $k++ )
		{
			if($i % 2 == 0)
			i2c_send("FF");
			else
			i2c_send("00");
		}
		i2c_send("00");
		i2c_send("00");
		i2c_stop();

		usleep(10000);

}
?>
А можно вывести часы.

tm1637-clock.gif
tm1637-clock.gif (324.65 КБ) 5866 просмотров

Код еще проще

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

<?php
$digits = array("FC", "60", "DA", "F2", "66", "B6", "BE", "E0", "FE", "F6", "00"); 
define("SCL", "30");
define("SDA", "31");
define("MD", "http://192.168.0.14/sec/?");
define("V", "3");

require_once("mod_i2c_lib.php");

$my_cnt = 0;

while (true)
{
	$hour = date("H");
	$min = date("i");


	i2c_start();
	i2c_send("40");
	i2c_stop();

	i2c_start();
	i2c_send("C0");

	$val = hexdec($digits[$hour[1]]);

	if ( $my_cnt == 1 )
	{
		$val |= (1 << 0 );
		$my_cnt = 0;
	}
	else
	$my_cnt++;

	$val = sprintf("%02X", $val);
	echo $val;

	i2c_send($digits[$hour[0]]);
	i2c_send($val);
	i2c_send($digits[$min[0]]);
	i2c_send($digits[$min[1]]);
	i2c_send("00");
	i2c_send("00");
	i2c_stop();

	i2c_start();
	i2c_send("F1"); // Должно быть 8F
	i2c_stop();

	sleep(1);

}
?>

Но в то же время хочу отметить, что мой экземпляр имеет несколько странностей.

1. Стабильно работает только режим "Auto increment mode". Data command: 0x40
Режим "Fixed address mode" не работает или работает некорректно! Data command: 0x44
2. Команда Display Control (полная яркость) согласно даташиту должна быть 0x8F (b1000 1111). Однако мой дисплей такую команду игнорировал.
Эмпирическим и экспериментальным путем выяснил, что мой чип вместо 0x8F включает дисплей по команде 0xF1
Если присмотреться, то 0xF1 - это ‭(b1111 0001‬), то есть 0x8F, но с обратной последовательностью битов (не B7:B0, а B0:B7).
Обычно я не использую эмодзи, но если бы использовал, то обязательно вставил бы "рука-лицо". Наверное, это нормально для китайских чипов. Люди не парятся по мелочам.
3. При любых некорректных операциях, дисплей уходит в какие-то странные режимы. Функции программного ресета нет. Только отключение питания.
4. 2-Wire Serial Interface - это урезанная I2C. У дисплея нет адреса. А потому на одной шине с дисплеем не могут висеть другие I2C-устройства.
5. Попадаются дисплеи двух типов (заранее это не всегда известно). У одних бит "dp" (SEG8) отвечает за точку рядом с цифрой, у других этот же бит отвечает за двоеточие и работает только в отношении второго сегмента. Мой дисплей оказался именно таким. Точками я управлять не могу, они как бы ни к чему не подключены, могу управлять только двоеточием.

tm1637-examples.zip

pppkadaf
Сообщения: 44
Зарегистрирован: 01 ноя 2017, 20:39

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение pppkadaf » 04 май 2019, 22:00

Тоже только получил модули, буду пробывать. Спасибо за пример.

Genplane
Сообщения: 36
Зарегистрирован: 04 авг 2016, 09:31
Откуда: Калининград

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение Genplane » 05 май 2019, 11:25

Хочу запустить бесконечный односекундный цикл для нагревателя на Меге. Пишу в Program следующую команду:

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

11:1;p1;11:0;13:0;p9;13:10
При сохранении команда становится такой:

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

11:1;p1;11:0;13:0;p9;13n=9
Вопрос: Что делаю не так или как это можно реализовать по другому. Нужен именно замкнутый 1-секундный цикл. Можно ли в повторах сценария Меги (параметр r) задать бесконечность?

hawkeye
Сообщения: 98
Зарегистрирован: 06 окт 2016, 22:16

Re: Прошивка MegaD-2561 (релизы, обсуждения, предложения)

Сообщение hawkeye » 05 май 2019, 12:36

Andrey_B писал(а):
07 апр 2019, 18:42
- Для RTC-версий контроллера добавлено отображение температуры
У меня исторически DS-ка подключена к SCL: C2 SDA: С1.
Обновился на fw: 4.36b4, стала отображаться температура, но выдаёт всегда одно и не меняется - "Temp: 1.75".

Ответить