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

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

  1. ИгорьК

    ИгорьК Гуру

    Версия от теперь (в приложении). Проверяет коннект с любым количеством серверов.
    Утверждает, что нет связи только если не удается законектиться ни к одному.

    Некоторые пояснения.
    Код (Lua):
    -- реле на 4 ноге
    routerPin = 4
    -- светодиод на 3 ноге
    lightPin = 3

    -- выставили режимы ног
    gpio.mode(routerPin,gpio.OUTPUT)
    gpio.mode(lightPin,gpio.OUTPUT)
    gpio.write(lightPin,gpio.LOW)

    -- попыток до перезагрузки после включения питания:
    trying = 14
    -- количество произведенных размыканий реле:
    restarting = 0
    -- каждая проверка через (миллисекунд):
    checkperiod = 30000

    -- Это непосредственно проверяет коннект
    function check()
        -- Останавливаем таймер, что дергает эту функцию
        -- потому что проверка при отсутствии связи может затянуться
        -- и это вызовет еще один запуск этой функции что есть плохо
        checkTMR:stop()
        -- можете добавлять / убавлять любые сервера:
        local servrs = {"www.google.com", "ya.ru", "www.yahoo.com", "www.mail.ru"}
        -- Счетчик перебора серверов для коннекта
        local servNo = 1

        -- Это задает вопросы серверам
        local function isconnect(srv)
            net.dns.resolve(srv, function(sk, ip)
                if (ip == nil) or (ip == "10.0.0.1") then
                    print("DNS "..servrs[servNo].." fail!")
                    -- пока есть сервера в таблице
                    if servNo < #servrs then
                        servNo = servNo + 1
                        -- зовем сами себя
                        isconnect(servrs[servNo])
                    else
                        -- кончились сервера - запускаем таймер чтобы проверяться через 30 секунд
                        checkTMR:start()
                    end
                else
                    -- После удачного соединения оставляем три попытки до следующей перезагрузки
                    -- и обнуляем количество последовательных перезагрузок
                    trying, restarting = 3, 0
                    checkTMR:start()
                    print("Got IP: "..ip.." at "..servrs[servNo] )
                end
            end)
        end
        isconnect(servrs[1])
    end

    -- Просто щелкаем реле
    function restartRouter()
        -- Опять останавливаем таймер периодических проверок
        checkTMR:stop()
        -- вот оно и дергает ноги реле туда-сюда
        local function relay(muv)
            if muv then
                gpio.write(routerPin,gpio.LOW)
                gpio.write(lightPin,gpio.HIGH)
            else
                gpio.write(routerPin,gpio.HIGH)
                gpio.write(lightPin,gpio.LOW)
            end
        end
        print("Restart Router!")
        -- разомкнули
        relay(true)
        -- создали таймер чтобы замкнуть через 15 секунд
        local stoprelay = tmr.create()
        stoprelay:alarm(15000, 0, function()
            relay(false)
            print("Exit Restart Router!")
            tmr.unregister(stoprelay)
            stoprelay = nil
            countall()
            checkTMR:start()
        end)
    end

    -- дернули реле - считаем:
    function countall()
        -- сделали рестартов
        restarting = restarting + 1
        print("Restart No "..restarting)
        if restarting == 1 then
            -- после первого рестарта - 14 проверок (через 30 секунд/checkperiod каждая)
            trying = 14
        elseif restarting == 2 then
            -- после двух последовательных рестартов - 28 проверок
            trying = 28
        else
            -- после трех - 120 проверок
            trying = 120
        end
    end

    -- это таймер что постоянно запускает функцию проверки связи
    -- создали
    checkTMR = tmr.create()
    -- зарегистрировали что делать
    checkTMR:register(checkperiod, 1, function()
        print("Heap now: "..node.heap())
        local ip = wifi.sta.getip()
        print("Trying: "..trying.." and IP:", ip)
        -- перегружаем роутер если нет wifi после 2 попыток
        if (not ip and trying <= 2) then
            restartRouter()
        -- а если wifi есть, а сайты не пингуются - ждем 4 попытки
        elseif trying <= 0  then
            restartRouter()
        elseif ip then
            print("Check connection")
            check()
        end
        trying = trying - 1
    end)
    checkTMR:start()

    Лог такой:

    upload_2018-2-14_18-11-23.png

    Для запуска - init.lua:

    Код (Lua):
    local runfile = "routerSMALL.lua"
    print("Try Run "..runfile)
    tmr.create():alarm(5000, 0, function()
        if runfile and file.exists(runfile) then
            dofile(runfile)
        else
            print("No "..runfile.. "! Start IDE")
        end
    end)
     

    Вложения:

    Последнее редактирование: 25 июл 2019
    naz и sys нравится это.
  2. star003

    star003 Нерд

    Вчера повторил конструкцию. Есть у меня один не очень хороший момент: в момент включения на Пинк 4 - высокий уровень. При перезагрузке роутера он падает в 0. По моему это не хорошо. Где то написано , что сигнал на выходе инвертированный. Может это лечится как то? Если принудительно при включении изменить - то будет щёлкать реле, что совсем не хорошо для роутера.
     
  3. ИгорьК

    ИгорьК Гуру

    Тут смотри в чем дело. При старте ESP-8266 ESP-01 обе его свободные ноги должны быть подтянуты к единице, иначе модуль не загрузится.
    Это никак не обойти.

    Поэтому сигнал инвертированный и схема такая корявая. Что было тогда под рукой и как понимал электрический ток - так и наколхозил.

    Для нормального сигнала надо брать любой другой модуль где больше ног. Сейчас тот же NodeMcu недорого стоит, там можно управлять неинвертированно.

    Другой вариант, применять реле не от амперки, а от китайских друзей. У них как раз есть экземпляры, управляемые не единицей, а сбросом ноги на землю как в этом устройстве. Правда, работают они с трехвольтовой логикой или нет - не знаю.

    Давно пора переделать эту железку, да вот в чем проблема - работает уж больно хорошо.
     
    Последнее редактирование: 23 июл 2018
  4. IvanUA

    IvanUA Гуру

    Может стоит добавить один транзистор и пару резисторов? Тут тебе и инвертор, тут тебе и согласование по 5 вольтам если надо))))
     
  5. ИгорьК

    ИгорьК Гуру

    Это правильно.
    Но... работает оно! :)
     
    IvanUA нравится это.
  6. star003

    star003 Нерд

    Сегодня отключили интернет по причине исчерпания трафика. Устройство не сработало. Стал смотреть - причина предположительно , что при попытке что то открыть - скрипт получает положительный ответ , хотя там страница с просьбой пополнить баланс. Есть ли способ получить аналог команды ping ,так как у меня эта причина практически основная , как причина потери связи.
     
  7. Mitrandir

    Mitrandir Гуру

    Как вариант, регуляркой искать на полученной странице сообщение о отсутствии баланса
     
  8. ИгорьК

    ИгорьК Гуру

    А как оно, по-вашему, должно было сработать в этом случае? Устройство отправляет http запрос серверам по перечню.

    Этот запрос перехватывается провайдером и подменяется ответ от него.
    Для устройства все нормально - ответ получен.

    А что в этом случае изменит перезагрузка роутера? Если отключили за неуплату, перегружай , не перегружай - интернет не появится.
     
    Последнее редактирование: 21 авг 2018
  9. ИгорьК

    ИгорьК Гуру

    Это будет совсем другое устройство.

    Ну, хорошо: получит модуль информацию об отключении, а дальше что?
     
    star003 нравится это.
  10. Mitrandir

    Mitrandir Гуру

    Ну например поднимет резервный канал
     
  11. ИгорьК

    ИгорьК Гуру

    ESP-8266 поднимет резервный канал? Фигасе.
     
  12. Airbus

    Airbus Радиохулиган Модератор

    Отправит платеж через Сбербанк онлайн
     
    Mitrandir нравится это.
  13. Mitrandir

    Mitrandir Гуру

    У нас есть удалённый автономный объект. Данные с него идут через радио узел. Если приходит сообщение о ошибке или канал рвётся, выезжает бригада ремонтников. Иногда по вине энергетиков радио узел вырубается и сам через некоторое время врубается(оборудование на объекте автономно за исключением радиоточки). Ремонтники задолбались ездить впустую. Сделали на есп вотчдог. Если упал радио узел, поднимается зуксель с 3г мопедом. Затем есп отправляет сообщение, что оборудование в порядке,, радиоузел отрубился. И далее работает в качестве шлюза. Принимает команды и передаёт оборудованию (правда с урезанным функционалом)
     
  14. ИгорьК

    ИгорьК Гуру

    У меня сделано по-другому.
    Есть запасной канал, он представляет собой просто другую wifi сетку.
    Устройства, отвечающие за отправку критической информации могут, в случае потери главной сетки, переключаться на запасную, проверяя каждый час, не поднялась ли главная.
    Раскрывал здесь: в п.54 http://forum.amperka.ru/threads/arduino-esp8266-raspberry-pi-2-openhab-Умный-дом-азы-управления.5043/
    Спасибо Роскомпозору, теперь тему надо листать вручную, ...ь.
    http://forum.amperka.ru/threads/ard...й-дом-азы-управления.5043/page-78#post-111449
    Что касается вашего варианта, то тоже могу сделать.
    Но это будет другое устройство.
     
    Последнее редактирование: 23 июл 2018
  15. star003

    star003 Нерд

    Особенностью моего провайдера (мегафон корпоративный) является то , что когда деньги положат - он не включиться , пока его физически не выключить а затем включить. А деньги там кончаются стабильно раз в месяц . Их вносят на баланс а связь именно на моем моем модеме не подымается без перезагрузки.
     
  16. ИгорьК

    ИгорьК Гуру

    Видимо, для решения этой задачи надо анализировать ответ сервера, что вполне решаемо. Естественно, в этом проекте такого не происходит.
     
  17. papaybreus

    papaybreus Нуб

    Повторил реализацию на имеющемся у меня Witty Cloud, он же "esp8266 - бутерброд". Залил сразу последний вариант. Ничего не менял в оригинальном Witty Cloud, просто залил все по пунктам. Сейчас он при подаче питания всегда получит IP от моего роутера и реагирует на наличие интернета, пока я его из ESPlorer-а стартую. Если отключить от компа и подать питание отдельно - молчит. Это пока там два файла - init.lua и последний.lua. Потом для эксперимента переименовал последний.lua в init.lua и оставил его единственным, тогда фара загорается сразу и на наличие интернета реагирует. Вот что в этой ситуации уже хорошо, а что еще нет? И куда стоит двигаться дальше? Передо мной стоит задача построить два устройства - одно почти в оригинальном варианте, и пусть пасет роутер, а второе видоизменить - оно должно не роутер передергивать, а рядом с ним Orange Pi, который организует vpn канал, при зависании самого канала только.
     
  18. ИгорьК

    ИгорьК Гуру

    Эммм. А без лирики, по пунктам?
     
  19. papaybreus

    papaybreus Нуб

    Первый пункт - можно ли так делать? т.е. оставить последний вариант файла lua, переименовав его в init.lua, или добиваться, чтобы init запускал основной скрипт.
    Пункт второй - на втором устройстве мне не нужно проверять yandex, google и т.д. , а нужно придумать, что же прописать вместо них. Наверное чью нибудь веб-морду у меня за vpn каналом. Это уже не совсем правильно, но у меня других идей нет. А vpn канал нужно передергивать. Он работает сносно, но пропадает чаще общего интернета. Было бы неплохо просто пинговать vpn сервер, но вроде нет в lua такого.
     
    Последнее редактирование: 24 июл 2019
  20. ИгорьК

    ИгорьК Гуру

    Файл init.lua автоматически запускается системой при старте. Системе все равно что в нем.
    Обычно, (у меня) этот файл тормозит систему на некоторое время для того, чтобы можно было его переименовать и устройство после перезагрузки не запускалось. После "тормоза" он просто запускает другой файл.

    Что касается ИМЕННО этого устройства, то возможны варианты. К сожалению, я не имею возможности посмотреть код. Только вечером или завтра.

    Не может быть того, чтобы устройство не запускалось, вы учитываете, что оно первые минут 7 ничего не проверяет?

    Такого нет.