ESP8266: Автоматическая перезагрузка роутера. Бюджетный вариант.

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

  1. Aleksander

    Aleksander Нерд

    ESP01 хочу использовать. Такой же как у Вас в примере. И я не могу понять почему на схеме у Вас подключено к одним выводам а в коде описаны другие выводы.
     
  2. ИгорьК

    ИгорьК Гуру

    routerPin = 4
    lightPin = 3
    [​IMG]
    Их всего там два.
    [​IMG]

    [​IMG]

    Все у меня там правильно. Повторяйте и не заморачивайтесь.
     
  3. Securbond

    Securbond Гуру

    Кстати Tx и Rx то же вполне юзабельные пины . У меня на погодной станции на них датчики висят. (Это к фразе "их всего там два")
     
  4. Aleksander

    Aleksander Нерд

    Я Tx и Rx и имел ввиду. Если там нет проблем таких как с GPIO0 и GPIO2 то схему можно сильно упростить и уменьшить физические размеры устройства да и вообще использовать полевик вместо реле. Игорь, спасибо за табличку соответствия пинов! Буду экспериментировать с полевиком и Tx Rx
     
  5. ИгорьК

    ИгорьК Гуру

    Вы видели эту ссылку из первого поста? http://forum.amperka.ru/threads/esp8266-как-не-надо-делать.4748/

    Конечно схему можно упростить! Но что касается полевика - это что переключать. Здесь реле включает/выключает розетку 220в, в которую (у меня) включены модем и роутер. Не представляю как это полевиком сделать.
     
  6. Aleksander

    Aleksander Нерд

    Можно коммутировать выходное напряжение БП роутера (там как правило 12в или 5в но реже) а не 220в. От него же и питать схему. На мой взгляд так проще
     
    Securbond нравится это.
  7. small__220

    small__220 Нуб

    Здравствуйте!
    Залил скрипты и комманды в ESP01, К сети подключается на отсутствие интернета реагирует но после комманды ребута роутера не подключается к сети... идёт постоянный отсчёт.
    Exit Restart Router!
    Trying: -12 (счётчик уменьшается)
    Отсчёт будет продолжаться до передёргивания питания ESP, потом она с лёту конектится и говорит, что всё хорошо..
    Розетки, релюхи не цеплял, смотрю в консоли и тестером.
    Адрес DHCP выделил для ESP.
    Как исправить данную ситуацию?
    Модуль впервые вижу, ранее не имел с этим дел...
     
  8. ИгорьК

    ИгорьК Гуру

    Терпеть и не передергивать питание. Чтобы терпеть было легче - читать описание работы в начале темы. :)
     
  9. small__220

    small__220 Нуб

    Терпел....
    > Trying: 1
    192.168.1.111
    No Time
    time is money
    Trying: 1
    192.168.1.111
    No Time
    time is money
    Trying: 1
    nil Тут я перезагрузил роутер.
    Restart No 1
    Exit Restart Router!
    Exit Restart Router!
    Trying: -13 Где-то тут интернет появился.
    Exit Restart Router!
    Trying: -12
    Trying: -11
    Trying: -10
    Trying: -9
    Trying: -8
    Trying: -7
    Trying: -6
    Trying: -5
    Trying: -4
    Trying: -3
    Trying: -2
    Trying: -1
    Trying: 0
    Trying: 1
    nil
    Restart No 2
    Exit Restart Router!
    Exit Restart Router!
    Trying: -27
    Exit Restart Router!
    Trying: -26
    Trying: -25 Устал ждать, снова спросил...
     
  10. ИгорьК

    ИгорьК Гуру

    Прошивку как собирали?
    Завтра сможем поразмышлять. Нынче я на сотовом телефоне.
    Мысли две. 1. Не восстанавливается соединение с wifi. Команду на автоконнект не забыли?
    2. Прошивка ntp не поддерживает.
     
  11. small__220

    small__220 Нуб

    1) Закинул 3 комманды построчно (завёл в сеть)
    2) Скопировал ваш код netCheck02003.lua Вставил в ESPlorer (в поле скрипт) Нажал на сохранить в ESP,
    Сохранил с именем "netCheck02003.lua"
    3) Также поступил с кодом "init.lua" как в пункте 2 только название соответственно другое.
    И работает модель на скорости 9600 так и должно быть?
    Подключен модуль без резисторов. Источник питания стабилизирован и отфильтрован.
     
    Последнее редактирование: 5 фев 2016
  12. ИгорьК

    ИгорьК Гуру

    Ну да. Вроде все правильно. Завтра...
     
  13. ИгорьК

    ИгорьК Гуру

    Проверил код. Единственно - раскомментировал функцию чтения времени и вывел ее на печать.
    Вот как он работает при выключении wifi:
    123456.jpg

    Эначит, Вам надо пересобрать прошивку и перегрузить ее в модуль. Вот что в моей прошивке:
    22222.jpg

    Идете по этому адресу: http://nodemcu-build.com/ и выбираете те модули, которые указаны у меня на картинке. Зашиваете в ESP и пробуете все заново.
    Ниже - откорректированный скрипт чтобы было чуть понятнее.
    Код:
    Код (Lua):

    trying = - 14
    routerPin = 4
    lightPin = 3
    gpio.mode(routerPin,gpio.OUTPUT)
    gpio.mode(lightPin,gpio.OUTPUT)
    gpio.write(lightPin,gpio.LOW)
    nowifi = false
    noconnect = false
    restarting = 0
    togglepin = 0
    offrout = false -- роутер выключен
    time_zone = 3

    function getTime()
      conn=net.createConnection(net.TCP, 0)
      conn:on("connection",function(conn, payload)
      conn:send("HEAD / HTTP/1.1\r\n"..
      "Host: google.com\r\n"..
      "Accept: */*\r\n"..
      "User-Agent: Mozilla/4.0 (compatible; esp8266 Lua;)"..
      "\r\n\r\n")
      connection = conn
      end)
      conn:on("receive", function(conn, payload)
      local hour = tonumber(string.sub(payload, string.find(payload,"Date: ")+23, string.find(payload,"Date: ")+24)) + time_zone
      local minsec = string.sub(payload,string.find(payload,"Date: ")+25,string.find(payload,"Date: ")+31)
      print("Time is "..hour..minsec)
      noconnect, trying, restarting = false, 0, 0
      conn:close()
      end)
      --conn:connect(80,'google.com')
      conn:connect(80,'ya.ru')

    end

    function restartRouter()

      if offrout == false then
      gpio.write(routerPin,gpio.LOW)
      gpio.write(lightPin,gpio.HIGH)
      togglepin = tmr.now() + 10000000
      offrout = true
      restarting = restarting + 1
      print("Restart No "..restarting)
      if restarting == 1 then
      trying = -14
      elseif restarting < 3 then
      trying = -28
      else
      trying = -120
      end
      end

      if togglepin < tmr.now()  then
      gpio.write(routerPin,gpio.HIGH)
      gpio.write(lightPin,gpio.LOW)
      offrout = false
         print("Router Switched ON!")
      end
    end

    getTime()
    tmr.alarm(0, 30000, 1, function()
      trying = trying + 1
      print("Trying: "..trying)
      if offrout == true then
      print("Router Switched OFF!")
         restartRouter()
      end
      if trying > 0 then
      ip = wifi.sta.getip()
      if ip=="0.0.0.0" or ip==nil then
      print("Wi-fi lost!")
           restartRouter()
         else
            print("IP = "..ip)
      end
     
      if ((offrout == false) and (trying < 3)) then
      print("What Time Is It Now?")
      getTime()
      else
      restartRouter()
      end
      end
    end)
     
    Вот лог этого скрипта:
    Код (C++):
    > Time is 16:16:31
    Trying: 1
    IP = 192.168.8.100
    What Time Is It Now?
    Time is 16:17:00
    Trying: 1
    IP = 192.168.8.100
    What Time Is It Now?
    Time is 16:17:30
    Trying: 1
    IP = 192.168.8.100
    What Time Is It Now?
    Time is 16:18:00
    Trying: 1
    Wi-fi lost!
    Restart No 1
    Trying: -13
    Router Switched OFF!
    Router Switched ON!
    Trying: -12
    Trying: -11
    Trying: -10
    Trying: -9
    Trying: -8
    Trying: -7
    Trying: -6
    Trying: -5
    Trying: -4
    Trying: -3
    Trying: -2
    Trying: -1
    Trying: 0
    Trying: 1
    IP = 192.168.8.100
    What Time Is It Now?
    Time is 16:26:00

    PORT CLOSED
     
     
    Последнее редактирование: 5 фев 2016
  14. NE_XT

    NE_XT Гик

    Архиважно старый роутер снабдить watchdog, в более менее нормальном роутере ставите галочку, вписываете айпи который нужно пинговать и вуаля. Нет в роутере галочки, поставьте опенврт и радуйтесь.
    watchdog.jpg
     
  15. small__220

    small__220 Нуб

    Вроде работает, тестировать особо не получается... родсвеники зверем смотрят как я с роутером играюсь (всем вайфай нужен...) Завтра попробую потестить.
    Вы бы указали в начале поста по поводу прошивки, там их 2 вида float и integer. Первый раз я заливал integer
    второй раз по ссылке автора из конструктора float.
    Какая в них разница?!
    Скрипт заливал тот, что чуть выше с "What Time Is It Now?"
     
  16. ИгорьК

    ИгорьК Гуру

    Одна прошивка поддерживает арифметику float (цифры с точкой), другая - нет. Для этого скрипта разницы нет.
     
  17. ИгорьК

    ИгорьК Гуру

    Новый вариант прошивки.

    Обязательно читать первые посты чтобы понять как работает и как заливать.
    В старом был очень редко возникающий баг, который подавал питание на реле и не сбрасывал его.
    Причина - использование вот такой несложной конструкции:
    Код (Javascript):
    togglepin = tmr.now() + 10000000
    В NodeMCU это засада. Прощает лишь то, что во время изготовления этой железки толкового описания системы, как сейчас, не было. Причина бага описана здесь.
    Возможно, многие с этой проблемой и не сталкивались. У меня она возникла лишь один раз за все время.
    Код работает с новыми прошивками. И то и другое в приложении.

    Железка последовательно конектится к трем серверам: www.google.com, ya.ru, www.yahoo.com и если нет связи ни с одним из них - перегружает роутер и что там еще с ним висит на реле.

    В остальном - алгоритм тот же.

    Код (Lua):
    trying = - 14
    routerPin = 4
    lightPin = 3
    restarting = 0
    gpio.mode(routerPin,gpio.OUTPUT)
    gpio.mode(lightPin,gpio.OUTPUT)
    gpio.write(lightPin,gpio.LOW)
    servrs = {"www.google.com", "ya.ru", "www.yahoo.com"}
    svNow = 1

    function check(srv)
        net.dns.resolve(srv, function(sk, ip)
            if (ip == nil) then
                print("DNS fail!")
            else
                print("Got IP: "..ip)
                trying, restarting = 0, 0
            end
        end)
    end

    function restartRouter()
        tmr.stop(0)
        gpio.write(routerPin,gpio.LOW)
        gpio.write(lightPin,gpio.HIGH)
        restarting = restarting + 1
        print("Restart No "..restarting)
        tmr.alarm(6, 10000, 0, function()
            gpio.write(lightPin,gpio.LOW)
            gpio.write(routerPin,gpio.HIGH)
            if restarting == 1 then
                trying = -14
            elseif restarting == 2 then
                trying = -28
            else
                trying = -120
            end
            tmr.start(0)
            print("Exit Restart Router!")
        end)
    end

    check(servrs[svNow])

    tmr.alarm(0, 30000, 1, function()
        trying = trying + 1
        print("Trying: "..trying)
        svNow = svNow + 1
        if svNow == 4 then svNow = 1 end

        local ip = wifi.sta.getip()
        print("Got ip:", ip)
        if ((ip=="0.0.0.0" or ip==nil) and trying > 0) or trying > 3  then
            restartRouter()
        else
            print("Check conection with "..servrs[svNow])
            check(servrs[svNow])
        end
    end)
     
    Работает так:
    008.jpg
     

    Вложения:

    Последнее редактирование: 2 ноя 2017
    alp69 нравится это.
  18. alp69

    alp69 Форумчанин

    Несколько раз подводил. Выключал роутер и не включал его. Приходилось руками передергивать питание. А летом так вообще это произошло когда я в другом городе был. И из-за отсутствия связи с домашней Raspberry, ввиду срочной необходимости пришлось раскошелиться на еще одну для другого объекта.
    Спасибо за апдейт! Внедрю. И наверное добавлю пуш через Telegram об успешной перезагрузке.
    Еще раз спасибо!!!
     
  19. ИгорьК

    ИгорьК Гуру

    Часто, видимо, срабатывает.
    Зависон происходит, если реле включается в интервале десять секунд, перед тем, когда время сбрасывается в ноль.
    Вероятность сами можете посчитать. (Время - 31 бит.)
    И, как обычно, - вероятность это одно, а зависает оно в самый неподходящий момент из всех возможных вопреки всем расчетам.
     
    Последнее редактирование: 16 янв 2017
  20. ИгорьК

    ИгорьК Гуру

    Железку можно на MQTT-брокер завесить и перегружать в зависимости от потери соединения с ним, а также по MQTT получать информацию о времени и причине срабатывания. Вести график состояния включено/зависло.
    Единственное, что меня удерживает от этого - потеряется простота и общедоступность, тема то для всех. Придется много писать и рисовать, а потом отвечать на тучу вопросов "у меня не работает".