Arduino, ESP8266 Lua, Raspberry Pi 2 && OpenHab. Умный дом: азы управления.

Тема в разделе "Глядите, что я сделал", создана пользователем ИгорьК, 12 май 2015.

  1. ИгорьК

    ИгорьК Гуру

    wifi.sta.autoconnect(0)
    Перегрузитесь и развлекайтесь с АР.
    Она не появится, ее надо будет создавать соответствующими командами.
     
  2. ИгорьК

    ИгорьК Гуру

    Так... Специально бросил все дела, залил ESP-01 новой прошивкой.
    Предыдущий SDK на модуле был 1.4.7.

    (Как его узнать? Выполнить команду node.restart() и увидеть.
    Если вы заливаетесь впервые с АТ-прошивки - узнавание пропускаем.)

    После заливки - прошивка не завелась. Признаки - бешеное мигание синего светодиода.
    Все ответы есть здесь, надо просто въехать. Ну или читать ниже.

    Короче, теперь, если у вас не SDK 1.5.4 - нужно просто заливать еще один файл, по адресу, указанному так:
    Publication2.jpg
    Обратите внимание - для ESP-01 - два адреса. Подбирать опытным путем.
    (Можно в ESPlorer выполнить команду =node.flashsize(), у меня получилось 524288, однако прошивку пришлось заливать все равно как для 1мб модуля. Опять забыл :) - если с АТ-прошивки - никак не узнать. И если УЖЕ залил а оно не работает - тоже не узнать)

    Заливать все можно в один прием:
    Publication3.jpg
    Получается так:
    Publication4.jpg

    Ну и файл прилагаю. Или извлекайте отсюда.
    ПыСы. Вот за что я не люблю один очень известный сайт про ESP-8266... Проблема уже существует, оказывается, приличное время, а ... Да не люблю и все.

    UPD 02/12/2016.

    Еще вариант - у меня сработал несколько раз.
    Сначала залейте прилагаемую прошивку (nodemcu-master-14-modules-2016-01-31-16-04-40-float), а потом вашу.

    Инструмент для заливки: https://github.com/marcelstoer/nodemcu-pyflasher/releases
     

    Вложения:

    Последнее редактирование: 5 мар 2017
  3. alp69

    alp69 Форумчанин

    Удивительно. Сколько работаю с есп, ни разу не было случая, чтобы сразу не взлетело. Может это потому, что строго следую технологии? Или использую есп-12?
    Или китайцы массово брак начали гнать?
    Было несколько экземпляров, которые либо не цепляли wifi, либо отваливались от него. Проблему решил доработкой антенны.
     
  4. ИгорьК

    ИгорьК Гуру

    Не в этом дело. Дело в новом SDK. Если Вы сейчас сгенерируете прошивку возможно и у Вас возникнут проблемы.
     
  5. alp69

    alp69 Форумчанин

    Если я правильно понял - в облаке генерится некорректно?
     
  6. ИгорьК

    ИгорьК Гуру

    :-( значит я фигово описал...
    Это не баг, это фича.
    Все там правильно генерится, но для запуска этого теперь надо ESP "подкручивать" в силу определенных (мне не до конца понятных) вещей.
    Фактически это выражается в том что первый раз надо залить еще один файлик.
     
    alp69 нравится это.
  7. alp69

    alp69 Форумчанин

    Упс... давненько не прошивал с нуля. Надо будет освоить. Спасибо за информацию!
    Как хорошо, что у меня старые прошивки сохранились. Даже максимальная где-то должна лежать.
     
  8. ИгорьК

    ИгорьК Гуру

    Дык... я тоже не прошивал. И не сталкивался - вот здесь народ подкинул. И отдельная тема была - не смог помочь.
    Это второй случай, натолкнул на мысль что дело не в юзерах - пришлось разобраться.

    Я прошивки храню в папочках с проектами. Их уже на все случаи мои есть - вот и не заходил на сайт компиляции давно.
     
    Последнее редактирование: 20 ноя 2016
    alp69 нравится это.
  9. dimm71

    dimm71 Нерд

    В общем получилось следующее... Собираем прошивку со следующими модулями:
    dht,enduser_setup,file,gpio,http,mqtt,net,node,tmr,uart,wifi. Нюансы прошивки ESPшки описаны несколькими постами выше...

    Создаем файл init.lua
    Код (C++):
    wifi.setmode(wifi.STATIONAP)
    wifi.ap.config({ssid="MyPersonalSSID", pwd="***********"}) -- указываем пароль
    -- wifi.ap.config({ssid="MyPersonalSSID", auth=wifi.OPEN}) -- так пишем если без пароля
    enduser_setup.manual(true)
    enduser_setup.start(
      function()
        print("Connected to wifi as:" .. wifi.sta.getip())
      end,
      function(err, str)
        print("enduser_setup: Err #" .. err .. ": " .. str)
      end
    );

    do
    FileToExecute="thermoHab.lua"
    l = file.list()
    for k,v in pairs(l) do
      if k == FileToExecute then
        print("*** You have got 20 sec to stop timer 0 ***")
        print("*******    Execute: tmr.stop(0)    *******")
        tmr.alarm(0, 20000, 0, function()
          print("Executing ".. FileToExecute)
          dofile(FileToExecute)
        end)
      end
    end
    end
    и thermoHab.lua
    Код (C++):
    gpio.mode(4,gpio.OUTPUT)
    gpio.write(4,gpio.LOW)

    Broker="www.*******.ru"
    port=1883
    myClient="ESPSwitch"
    iogin="********"
    pass="********"

    m = mqtt.Client(myClient, 180, iogin, pass)
    m:lwt("/lwt", "ESPSwitch", 0, 0)
    m:on("offline", function(con)
      print ("reconnecting...")
      tmr.alarm(1, 120000, 1, function()
      m:connect(Broker, port, 0, function()
      tmr.stop(1)
      m:subscribe("/myhome/lamp01/command",0, function(conn)
      print("Subscribed!")
      end)
      end)
      collectgarbage()
      end)
    end)
    m:on("message", function(conn, topic, data)
      print("Recieved:" .. topic .. ":" .. data)
    if (data=="ON") then
      print("Enabling LED")
      gpio.write(4,gpio.HIGH)
      m:publish("/myhome/lamp01/state","ON",0,0)
      elseif (data=="OFF") then
      print("Disabling LED")
      gpio.write(4,gpio.LOW)
      m:publish("/myhome/lamp01/state","OFF",0,0)
      else
      print("Invalid - Ignoring")
      end
      collectgarbage()
    end)

    tmr.alarm(0, 1000, 1, function()
    if wifi.sta.status() == 5 then
      tmr.stop(0)
      m:connect(Broker, port, 0, function(conn)
      print("connected")
      m:subscribe("/myhome/lamp01/command",0, function(conn)
      print("Subscribed")
      end)
      end)
    end
    end)
     
    Заливаем их на ESPшку через ESPlorer. Далее перезагружаемся и ищем на своем смартфоне сеть "MyPersonalSSID" заходим на неё (вбив пароль). Заходим через браузер на страничку (через смартфон) 192.168.4.1 там открывается страничка, где выбираем нужную WiFi сеть и подключаемся к ней. Через несколько секунд внизу странички будет размещена информация о подключении и IP-адрес. При перезагрузки модуля сеть восстанавливается автоматом. Т.к. имя и пароль к сети запоминаются в EEPROM, а при следющей загрузке считываются оттуда.
    Удобно это тем, что не нужно заранее указывать с крипте WiFi сеть подключения и пароль. И при необходимости можно легко изменить, не подключая ESPшку к компу.


    Теперь хотелось бы пойти дальше... Чтобы при подключении как к точке доступа открывалась страничка, где можно было бы управлять, например, включением/выключением света (это как альтернатива "аварийного" управления, когда нет Интернета, но ты находишься рядом с ESPшкой)
     
    Последнее редактирование: 20 ноя 2016
    alp69, Securbond и ИгорьК нравится это.
  10. ИгорьК

    ИгорьК Гуру

    1. Я бы Вам предложил обратить внимание на этот шаблон: http://forum.amperka.ru/threads/ard...ый-дом-азы-управления.5043/page-36#post-75244
    2. Все таки, зачем Вам возможности enduser_setup? У меня лишь одно устройство работает с ним - то которое иногда даю знакомым СО2 у них дома измерить.

    3. Если нет Интернета, а ты находишься рядом - нужна кнопка, ИМХО.

    В любом случае - здорово! Поздравляю!
     
  11. dimm71

    dimm71 Нерд

    Почитал, посмотрел, но пока не разобрался как влепить функцию connecting в тот код, что привел я :) Я только учусь.
    Кнопка это, конечно, хорошо. Но управление через веб это дополнение, а не исключение кнопки.

    Спасибо. Я очень старался :)
     
  12. dimm71

    dimm71 Нерд

    Попробовал добавить в шаблон восстановления связи свой код. Соединение поднимается, но скрипт не отрабатывается. Помогите, пожалуйста, разобраться и подправить. Вот, что у меня получилось:
    Код (C++):
    gpio.mode(4,gpio.OUTPUT)
    gpio.write(4,gpio.LOW)

    Broker="www.********.ru"
    port=1883
    myClient="ESPSwitch"
    iogin="******"
    pass="******"

    m = mqtt.Client(myClient, 180, iogin, pass)
    m:lwt("/lwt", "ESPSwitch", 0, 0)

    function connecting()
        print('(Re)Connecting')
        publish = false
        function getConnect()
           if wifi.sta.status() == 5 and wifi.sta.getip() ~= nil then
                print("Got WiFi!")
                m:connect(Broker, port, 0, 0,
                    function(conn)
                        tmr.stop(6)
                        print("Connected")
                        publish = true
                        m:subscribe(myClient.."/myhome/lamp01/command",0, function(conn)
                            print("Subscribed")
                        end)
                end)
            end
        end
        getConnect()
        tmr.alarm(6, 90000, 1, function()
            getConnect()
        end)
    end
    m:on("offline", function(con)
        connecting()
    end)
    --[[
    m:on("message", function(conn, topic, data)
      print("Recieved:" .. topic .. ":" .. data)
    if (data=="ON") then
      print("Enabling LED")
      gpio.write(4,gpio.HIGH)
      m:publish("/myhome/lamp01/state","ON",0,0)
      elseif (data=="OFF") then
      print("Disabling LED")
      gpio.write(4,gpio.LOW)
      m:publish("/myhome/lamp01/state","OFF",0,0)
      else
      print("Invalid - Ignoring")
      end
      collectgarbage()
    end)
    --]]
    connecting()
     
  13. Celtis

    Celtis Нуб

    На счет проблемы с новыми прошивками и мигающим светодиодом.
    Странно, но заливка esp_init_data_default.bin должного результата не дала.
    Проверял на двух платах:
    ESP-07 - непользованная, но остатки из старой партии(больше десятка плат из нее ранее успешно прошивались и работают)
    NodeMCU-like - некое безымянное творение по мотивам NodeMCU Board с ESP12E на борту.
    Обе были первый раз прошиты свежим кастомом с сайта. Сначала только бинаркином с сайта(еще не знал о проблеме), потом с добавлением esp_init_data_default.bin по соответствующим для 07 и 12 адресам.
    Результат неизменен - непрекращающийся мусор на порту и, соответственно мигание светодиодом.

    При этом тот же кастом прекрасно заводится поверх более старого кастома с того же сайта(собирался где-то в сентябре). Но только если старый кастом залить первым. Вариант "новый, затем почистить, затем старый, затем новый" дает все тот же мусор на порту...
    Кстати, новый кастом не трет файловую систему...

    Буду благодарен за хоть какие-то идеи.
     
  14. dimm71

    dimm71 Нерд

    Я всегда перед прошивкой стирал флеш esptool.py --port <serial-port-of-ESP8266> erase_flash
    Так же есть подозрения, что адреса для прошивки могут быть разными
     
  15. Celtis

    Celtis Нуб

    dimm71, никогда ранее не стирал, но сейчас пробовал и так и этак.
    Upd: старая прошивка поверх новой(даже после esptool erase_flash) все равно выдает мусор, что совсем странно...
    Upd2: Полное клонирование прошивки через esptool read_flash/write_flash с рабочего донора решает проблему, но способ уж слишком костыльный, да и не у всех имеется парк 8266 на все случаи жизни.
    Upd3: при клонировании прошивки MAC не клонируется, что хорошо.
     
    Последнее редактирование: 20 ноя 2016
  16. alp69

    alp69 Форумчанин

    Так у вас он закомментирован. Уберите --[[ и --]].
    Или просто добавьте третий дефис в открывании блока комментария. Чтобы стало так ---[[
     
  17. dimm71

    dimm71 Нерд

    Не помогает. Конектится к вайфаю, подписывается к маскиту, но не управляется. Где то я накосячил в коде
     
  18. Celtis

    Celtis Нуб

    Точно не только подключается, но и успешно подписывается?
    Есть лог сервера?
    Могут быть нюансы:
    а) некоторые старые версии москиты с реализацией клиента NodeMCU работали особо криво. Не помню уже нюансов, но лечилось обновлением.
    б) m:subscribe в коллбеке от m:connect в каких-то версиях NodeMCU отрабытывала не всегда. Настолько не всегда, что взял привычку жертвовать еще одним таймером, но подписку оформлять отдельно от подключения.
     
  19. dimm71

    dimm71 Нерд

    Нашел причину. Была в подписке myClient.. удалил и всё заработало.
    Код (C++):
    m:subscribe(myClient.."/myhome/lamp01/command",0, function(conn)
    Теперь возник вопрос, что если в подписке и публикации будет вначале приписано "myClient..", то как указать в Items myClient.. ? это же переменная
     
  20. ИгорьК

    ИгорьК Гуру

    Эта переменная определяется в начале скрипта. Вот ее и указывайте в итеме.
    А сделано так для универсальности: скопипастил в новый код - и вперед.