Я конечно не специалист далеко в настройке и программировании majordomo, но те вопросы, которые возникали - успешно решились, благодаря этому форуму.
Но конечно всё не идеально, и найти ответ на вопрос - порой бывает очень сложно. Посему хотелось-бы создать путёвый FAQ вроде как на форуме 4PDA. Безумно удобно там всё происходит, и на каждый девайс, например смартфон - есть шапка, которая постоянно обновляется, и в ней собрано всё самое важное. И главное упорядочено. И не приходится просматривать сотни страниц форума, в поисках нужной инфы.
Итак, по модулям ESP уже сказано и написано сотни статей, но для себя я решил, что ESP это одно из лучших устройств, для умного дома. Функционал и цена - просто космос!
Для начинающих:
http://static.efetividade.net/img/esp-1 ... -54329.png - распиновка модулей ESP-01, 03, 12
Хорошо помогла статья: http://esp8266.ru/esp8266-podkluchenie- ... proshivki/
Очень много инфы, получились у меня некоторые ошибки, но всё позади =)
Как делал я:
ESP12-q ~140 рублей http://ru.aliexpress.com/item/Free-Ship ... 14761.html
Макетная плата ~8 рублей http://ru.aliexpress.com/item/10Pcs-DIY ... 63290.html
Стабилизатор 3.3v (1117-3.3) ~2.7 рубля - http://ru.aliexpress.com/item/10pcs-AMS ... 15272.html
Конденсатор танталовый 10мкф (для стабилизатора) ~6х2шт рублей http://ru.aliexpress.com/item/Free-ship ... 55486.html
Резисторы 10ком ~0,54рубля http://ru.aliexpress.com/item/10Pcs-DIY ... 63290.html
Итого получаем около 166 рублей Карл! 166 рублей, за девайс, который без проблем интегрируется в MajorDomo, и может выполнять десятки разных задач. Функционал такого устройства - порой просто поражает.
Правда ещё придется потратить 100 рублей, за прошивку (если нет желания изобретать велосипед)
По ссылке есть большая статья, но из неё по сути надо только вот эту схему:
Проблемка с этой схемой у меня была только одна. Я привык программатор подключать наоборот, rx к tx, а tx к rx. Толи мой программатор с перепутанным обозначением, толи ещё проблема какая имеется, но заработало у меня только при rx-rx, tx-tx
Всё паяем на макетной плате, или травим - если не лень. Также добавляем туда стабилизатор ams1117-3.3 по этой схеме:
Правда, я использовал другие конденсаторы, но всё отлично работает.
Вот, что получилось в итоге:
В качестве соединителей, использовал жилы от обычной витой пары. Медные проводки в ней легко паяются, и валяются без дела на каждом углу.
Сам ESP-12 висит на некотором расстоянии от макетной платы, и под ним спрятались 5 резисторов на 10ком.
Есть такой замечательный сайт
http://www.wifi-iot.ru/ - конфигуратор прошивок.
По этой ссылке открывается конфигуратор, в котором отмечаем галочками нужный функционал, и сгенерированую прошивку скачиваем и соответственно заливаем в модуль.
Есть бесплатная версия, со вполне неплохим функционалом.
Также здесь можно почитать:
http://homes-smart.ru/index.php/oborudo ... ze-esp8266 - Описание прошивки и некоторых возможностей.
Для прошивки я использую вот такой usb адаптер:
http://media.nn.ru/data/ufiles/2016-03/ ... c04249.JPG
и nodemcu flasher
Программатор проверенный, и рабочий. Покупался достаточно давно. Дрова ставятся автоматом.
В Nodemcu, в разделе "Operation" выбираем Com порт (смотрим в диспетчере устройств). Никаких танцев с AT командами тут ненужно.
Затем в разделе "Config" выбираем загруженный файл прошивки
Не забываем закоротить нулевое gpio на модуле - на землю (это режим прошивки).
В завершении вертаемся в первый раздел "Operation" и жмём Flash.
Модуль прошит и готов к работе. Вынимаем перемычку с gpio0 на gnd, жмём три раза кнопку reset модуль перезагружается, и работает как точка доступа.
Подключаемся к новой точке доступа, и проводим настройки модуля.
Варианты установки (коробки, боксы и т.п.)
В данной реализации стоит два мосфета, для управления яркостью светодиодной ленты на кухне.
Также планируется подключение датчика DHT, модуля реле, и IR светодиода, для управления музыкальным центром:
http://media.nn.ru/data/ufiles/2016-03/ ... c04250.JPG
Железные вопросы, и варианты их реализации
Принцип подключения такой-же, как и в Arduino. Поэтому нагуглить элементарно:
http://cxem.net/beginner/beginner61.php - подключение RGB ленты к Arduino.
По ссылке выше - нам нужна всего-лишь одна схема:
В статье рекомендуют мосфеты: STP16NF06 на алишке цены на них что-то недешевые. от 30 и выше рублей. По даташиту, мощность у них 16 ампер.
А к примеру http://ru.aliexpress.com/item/10pcs-fre ... 79122.html
Стоят уже 15 рублей, и мощность 98 ампер. Будет работать или нет - пока не проверял. Но свои светодиодные ленты, я запустил от мосфета, выпаянного из дохлого БП от компьютера,
там мосфеты около 50 ампер. И успешно работают. Я взял дохлый БП от компа, выпаял оттуда всё, что похоже на транзистор, и начал гуглить даташиты на каждый элемент. И все, где встречается
подобная схема:
- должны подойти.
Управление:
В мажордомо создаём слайдербокс, с мин. знач. 0 и макс. знач. 255, с кодом:
Код: Выделить всё
$value= $params['VALUE'];
$url = getURL("192.168.1.16/pwm?ch=0&set=$value",0);
Если 255 значений в слайдер боксе лишку, то меняем макс. знач. в слайдербоксе до 10, тогда код будет вот такой:
Код: Выделить всё
$value= $params['VALUE']*25.5;
$url = getURL("192.168.1.16/pwm?ch=0&set=$value",0);
Код: Выделить всё
192.168.1.16/pwm?ch=0&set=255
Если в конец строки добавить "&flash=1" то заданное значение яркости запишется в энергонезависимую память модуля,
и при перезагрузке модуля - светодиодная лента включится, с ранее установленным значением яркости.
Бывает массу разных вариантов, от модулей на одно реле, до 16шт на одной плате.
Для более богатых есть твердотельные реле. Они бесшумны.
Вот несколько вариантов:
http://ru.aliexpress.com/item/5V-Two-2- ... .20.9NQp0h
http://ru.aliexpress.com/item/4-channel ... fc26a4129f
http://ru.aliexpress.com/item/5V-DC-1-C ... 93f23a6bee
Подключение к ESP:
Если ESP питается от 5 вольт с использованием стабилизатора 1117-3,3 то очевидно, что на входе 5 вольт, их и подключаем к нашему блоку реле.
Gnd от куда угодно, хоть от Esp хоть от стабилизатора. А входы на реле помечены как in - к gpio esp модуля.
Управлять можно gpio командой вида http://IP_ADRES/gpio?st=1&pin=12 - этим Вы установите на 12 GPIO логическую единицу. Дополнительные команды: &flash=1 - настройка запишется в энергонезависимую память. Просмотреть состояние GPIO можно по адресу http://IP_ADRESS/gpioprint
Интеграция в MajorDomo:
Но более продвинутый код, от пользователя: oleglapo, мне понравился больше, есть вроде как всё.
Только почему-то значение температуры от датчика ds18b20 - не ведет историю. Изменил 366 в датчике - на 50, и история появилась.
Код: Выделить всё
if ($params['idesp']=="") { return; } //Если ID устройства отсутствует, то перестаем отрабатывать сценарий
addClass('ESP8266'); //Создаем класс ESP8266
addClassObject('ESP8266',$params['idesp']); //Создаем в классе ESP8266 объект где в качестве имени
addClassProperty('ESP8266', 'vdd', 366); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 366 дней
addClassProperty('ESP8266', 'bmpp', 366); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 366 дней
addClassProperty('ESP8266', 'bmpt', 366); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 366 дней
addClassProperty('ESP8266', 'dhth1', 366); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 366 дней
addClassProperty('ESP8266', 'dhth2', 366); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 366 дней
addClassProperty('ESP8266', 'dhtt1', 366); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 366 дней
addClassProperty('ESP8266', 'dhtt2', 366); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 366 дней
addClassProperty('ESP8266', 'dsw1', 366); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 366 дней
addClassProperty('ESP8266', 'dsw2', 366); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 366 дней
addClassProperty('ESP8266', 'dsw3', 366); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 366 дней
addClassProperty('ESP8266', 'dsw4', 366); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 366 дней
addClassProperty('ESP8266', 'dsw5', 366); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 366 дней
addClassProperty('ESP8266', 'amt', 366); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 366 дней
addClassProperty('ESP8266', 'amh', 366); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 366 дней
addClassProperty('ESP8266', 'updated', 1); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 1 дней
addClassProperty('ESP8266', 'updatedTime', 1); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 1 дней
addClassProperty('ESP8266', 'alive', 1); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 1 дней
addClassProperty('ESP8266', 'pwm0', 1); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 1 дней
addClassProperty('ESP8266', 'pwm1', 1); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 1 дней
addClassProperty('ESP8266', 'pwm2', 1); //Создаёт свойство класса и указывает, что необходимо хранить историю значений 1 дней
addClassProperty('ESP8266', 'rssi', 1); //уровень сигнала
addClassProperty('ESP8266', 'gpiout0', 1); //Данные выход GPIO 0
addClassProperty('ESP8266', 'gpiout1', 1); //Данные выход GPIO 1
addClassProperty('ESP8266', 'gpiout2', 1); //Данные выход GPIO 2
addClassProperty('ESP8266', 'gpiout3', 1); //Данные выход GPIO 3
addClassProperty('ESP8266', 'gpiout4', 1); //Данные выход GPIO 4
addClassProperty('ESP8266', 'gpiout5', 1); //Данные выход GPIO 5
addClassProperty('ESP8266', 'gpiout12', 1); //Данные выход GPIO 12
addClassProperty('ESP8266', 'gpiout13', 1); //Данные выход GPIO 13
addClassProperty('ESP8266', 'gpiout14', 1); //Данные выход GPIO 14
addClassProperty('ESP8266', 'gpiout15', 1); //Данные выход GPIO 15
addClassProperty('ESP8266', 'gpiout16', 1); //Данные выход GPIO 16
addClassProperty('ESP8266', 'gpio0', 1); //Данные вход GPIO 0
addClassProperty('ESP8266', 'gpio1', 1); //Данные вход GPIO 1
addClassProperty('ESP8266', 'gpio2', 1); //Данные вход GPIO 2
addClassProperty('ESP8266', 'gpio3', 1); //Данные вход GPIO 3
addClassProperty('ESP8266', 'gpio4', 1); //Данные вход GPIO 4
addClassProperty('ESP8266', 'gpio5', 1); //Данные вход GPIO 5
addClassProperty('ESP8266', 'gpio12', 1); //Данные вход GPIO 12
addClassProperty('ESP8266', 'gpio13', 1); //Данные вход GPIO 13
addClassProperty('ESP8266', 'gpio14', 1); //Данные вход GPIO 14
addClassProperty('ESP8266', 'gpio15', 1); //Данные вход GPIO 15
addClassProperty('ESP8266', 'gpio16', 1); //Данные вход GPIO 16
//Распихиваем всё по свойствам. Если полученное значение пустое, то свойство не записываем
if ($params['bmpp']!="") { sg(($params['idesp'].".bmpp"),$params['bmpp']); } //Данные с датчика BMP (давление)
if ($params['bmpt']!="") { sg(($params['idesp'].".bmpt"),$params['bmpt']); } //Данные с датчика BMP (температура)
if ($params['counter']!="") { sg(($params['idesp'].".counter"),$params['counter']); } //Количество импульсов со счетчика
if ($params['dhth1']!="") { sg(($params['idesp'].".dhth1"),$params['dhth1']); } //Данные с первого датчика DHT (влажность)
if ($params['dhth2']!="") { sg(($params['idesp'].".dhth2"),$params['dhth2']); } //Данные со второго датчика DHT (влажность)
if ($params['dhtt1']!="") { sg(($params['idesp'].".dhtt1"),$params['dhtt1']); } //Данные с первого датчика DHT (температура)
if ($params['dhtt2']!="") { sg(($params['idesp'].".dhtt2"),$params['dhtt2']); } //Данные со второго датчика DHT (температура)
if ($params['dsw1']!="") { sg(($params['idesp'].".dsw1"),$params['dsw1']); } //Данные с датчика DS18B20 №1
if ($params['dsw2']!="") { sg(($params['idesp'].".dsw2"),$params['dsw2']); } //Данные с датчика DS18B20 №2
if ($params['dsw3']!="") { sg(($params['idesp'].".dsw3"),$params['dsw3']); } //Данные с датчика DS18B20 №3
if ($params['dsw4']!="") { sg(($params['idesp'].".dsw4"),$params['dsw4']); } //Данные с датчика DS18B20 №4
if ($params['dsw5']!="") { sg(($params['idesp'].".dsw5"),$params['dsw5']); } //Данные с датчика DS18B20 №5
if ($params['freemem']!="") { sg(($params['idesp'].".freemem"),$params['freemem']); } //Объем свободной памяти модуля
if ($params['hostname']!="") { sg(($params['idesp'].".hostname"),$params['hostname']); } //Имя модуля
if ($params['light']!="") { sg(($params['idesp'].".light"),$params['light']); } //Данные с датчика BH1750
if ($params['uptime']!="") { sg(($params['idesp'].".uptime"),$params['uptime']); } //Время непрерывной работы модуля
if ($params['vdd']!="") { sg(($params['idesp'].".vdd"),$params['vdd']); } //Напряжение на модуле
if ($params['ver']!="") { sg(($params['idesp'].".ver"),$params['ver']); } //Версия прошивки
if ($params['amh']!="") { sg(($params['idesp'].".amh"),$params['amh']); } //Данные с датчика AM2321 (влажность)
if ($params['amt']!="") { sg(($params['idesp'].".amt"),$params['amt']); } //Данные с датчика AM2321 (температура)
if ($params['wanip']!="") { sg(($params['idesp'].".wanip"),$params['wanip']); } //IP модуля
if ($params['pwm0']!="") { sg(($params['idesp'].".pwm0"),$params['pwm0']); } //ШИМ
if ($params['pwm1']!="") { sg(($params['idesp'].".pwm1"),$params['pwm1']); } //ШИМ
if ($params['pwm2']!="") { sg(($params['idesp'].".pwm2"),$params['pwm2']); } //ШИМ
if ($params['rssi']!="") { sg(($params['idesp'].".rssi"),$params['rssi']); } //Уровень сигнала
if ($params['gpio0']!="") { sg(($params['idesp'].".gpio0"),$params['gpio0']); } //Данные выход GPIO 0
if ($params['gpio1']!="") { sg(($params['idesp'].".gpio1"),$params['gpio1']); } //Данные выход GPIO 1
if ($params['gpio2']!="") { sg(($params['idesp'].".gpio2"),$params['gpio2']); } //Данные выход GPIO 2
if ($params['gpio3']!="") { sg(($params['idesp'].".gpio3"),$params['gpio3']); } //Данные выход GPIO 3
if ($params['gpio4']!="") { sg(($params['idesp'].".gpio4"),$params['gpio4']); } //Данные выход GPIO 4
if ($params['gpio5']!="") { sg(($params['idesp'].".gpio5"),$params['gpio5']); } //Данные выход GPIO 5
if ($params['gpio12']!="") { sg(($params['idesp'].".gpio12"),$params['gpio12']); } //Данные выход GPIO 12
if ($params['gpio13']!="") { sg(($params['idesp'].".gpio13"),$params['gpio13']); } //Данные выход GPIO 13
if ($params['gpio14']!="") { sg(($params['idesp'].".gpio14"),$params['gpio14']); } //Данные выход GPIO 14
if ($params['gpio15']!="") { sg(($params['idesp'].".gpio15"),$params['gpio15']); } //Данные выход GPIO 15
if ($params['gpio16']!="") { sg(($params['idesp'].".gpio16"),$params['gpio16']); } //Данные выход GPIO 16
if ($params['gpiout0']!="") { sg(($params['idesp'].".gpiout0"),$params['gpiout0']); } //Данные вход GPIO 0
if ($params['gpiout1']!="") { sg(($params['idesp'].".gpiout1"),$params['gpiout1']); } //Данные вход GPIO 1
if ($params['gpiout2']!="") { sg(($params['idesp'].".gpiout2"),$params['gpiout2']); } //Данные вход GPIO 2
if ($params['gpiout3']!="") { sg(($params['idesp'].".gpiout3"),$params['gpiout3']); } //Данные вход GPIO 3
if ($params['gpiout4']!="") { sg(($params['idesp'].".gpiout4"),$params['gpiout4']); } //Данные вход GPIO 4
if ($params['gpiout5']!="") { sg(($params['idesp'].".gpiout5"),$params['gpiout5']); } //Данные вход GPIO 5
if ($params['gpiout12']!="") { sg(($params['idesp'].".gpiout12"),$params['gpiout12']); } //Данные вход GPIO 12
if ($params['gpiout13']!="") { sg(($params['idesp'].".gpiout13"),$params['gpiout13']); } //Данные вход GPIO 13
if ($params['gpiout14']!="") { sg(($params['idesp'].".gpiout14"),$params['gpiout14']); } //Данные вход GPIO 14
if ($params['gpiout15']!="") { sg(($params['idesp'].".gpiout15"),$params['gpiout15']); } //Данные вход GPIO 15
if ($params['gpiout16']!="") { sg(($params['idesp'].".gpiout16"),$params['gpiout16']); } //Данные вход GPIO 16
sg(($params['idesp'].".idesp"),$params['idesp']); //
http://www.wifi-iot.ru/?menu=metrics (требуется авторизация)
Код: Выделить всё
$idesp=$params['idesp'];
if (!$idesp) return;
say ($idesp);
addClass('ESP8266'); //Создаем класс ESP8266
addClassObject('ESP8266',$idesp); //Создаёт класс заданного имени дочерним от ParentClass
sg ('ESP8266.'.$idesp.".idesp",$idesp);
$esp=getObjectsByClass("ESP8266");
foreach($esp as $obj)
{
if (gg($obj['TITLE'].".idesp") ==$idesp) //
{
if (is_array($params)) {
sg ($obj['TITLE'].".LastUpdate",date("H:i",time()));
foreach($params as $k=>$v) {
if ($k!="script") {
sg($obj['TITLE'].".".$k,$v);
}
}
}
}
}
http://majordomo.smartliving.ru/forum/v ... 267#p31267 - Настройка термостата часть 2 (код от Aleks130699, инструкция от Oleglapo)