Hard restart Raspberry Pi - удаленная перезагрузка/включение сервера УД на "малине"

04 ноября 2021, 09:57

Бывают ситуации, когда в один прекрасный момент мы теряем доступ к серверу УД. Например, он зависает и мы просто не можем подключиться по SSH. На самом деле, причин невозможности подключения может быть масса. Это может быть DDOS на 22 порт, выставленный наружу, перегрев, зависание и т.д. При правильной настройке сервера такие ситуации крайне редки, но они возможны.

У меня бывало такое пару раз, но больше - по моей же глупости. 

У меня УД управляется сервером на Raspberry Pi 4B с настроенным watchdog'ом. И вот в один прекрасный момент я начал замечать, что "малинка" стала часто перегружаться. Возникла мысль, что может быть не хватает ОЗУ, в связи с возросшими требованиями Home Assistant, хотя свободное ОЗУ всегда было порядка 300-700 МБ. Как назло, в этот момент на основном сервере полетел SSD, и УД был поднят на резервном, а там только 2 ГБ. Был вариант, что либо не хватает ресурсов, либо некорректно настроил watchdog и он перегружает сервер УД, когда предпосылок для этого еще недостаточно.

Решил отключить watchdog и посмотреть, как будет вести себя "малина" без него, но как потом оказалось, решение было принято в неподходящий момент, т.к. именно тогда, когда я находился на работе, сервер УД решил "умереть" не приходя в сознание, а именно - зависнуть, без возможности подключиться по SSH. У меня уже и до этого момента закрадывались мысли, что неплохо было бы сделать возможность включать и перезагружать "малинку" удаленно, но после этой ситуации было принято решение все-таки этот вопрос "добить".

Как один из вариантов - это использование Wi-Fi розетки после UPS. Но т.к. я использую компактный бесперебойник на 2-х аккумуляторах 18650, то мне этот вариант не сильно подходил. Сам Raspberry Pi UPS HAT включался непосредственно к плате, а значит розетку можно было без вандализма поставить только на БП самого бесперебойника. Но такой вариант позволял "малине" работать несколько часов после отключения внешнего питания. Более того. Есть ряд портативных UPS, которые при глубоком разряде аккумуляторов и аварийного их отключения, повторно после появления питания уже не включаются. Соответственно, хотелось найти способ, который бы подходил во всех случаях, а не зависел от случая. И понятное дело, что управлять мы не могли по протоколу Zigbee, т.к. Zigbee еще зависит дополнительно как минимум от шлюза, а в моем случае вообще бесполезен, т.к. стик подключен был к зависшему серверу. Т.е. по какому каналу управлять - вопросов не было, был выбран канал Wi-Fi (можно еще больше заморочиться и подключить ESP с LAN на борту WT32-ETH01, но это уже оставляю на личный опыт каждого, т.к. именно мне хотелось получить максимально компактное устройство управления, а зоопарк Wi-Fi устройств держу минимально необходимым. В первую очередь стараюсь все делать на Zigbee и только понимая, что применение Zigbee нецелесообразно, применяю ESP).

Настала очередь разобраться с Raspberry Pi 4B.

Где-то внутри было четкое убеждение, что на Raspberry предусмотрена возможность запуска/перезапуска через отдельные пины (это к спорам о том, "домашнее" решение Raspberry Pi или все-таки "промышленное" :)  ).

И вот после долгих поисков информации в интернете было найдено, что есть некие выводы на плате, которые могут мне помочь. Название их было GLOBAL_EN и RUN. Информация больше встречалась по плате Raspberry Pi 3b. Пришлось вскрыть свой корпус Argon ONE M.2, чтобы проверить, если ли что-то похожее у "четверки".

Интуиция не подвела. Как оказалось, на плате действительно есть место под гребенку с такими контактами.

1600x_image.png?1635777564

После недолгих исследований было обнаружено, что для наших задач необходимо замыкать кратковременно контакт RUN на землю. Была запаяна гребенка. В качестве управляющей платы была выбрана ESP-01s (можно взять ESP-01, но там у нее не совсем корректные подтяжки GPIO, возможно нужно будет дополнительно подтянуть GPIO0).

Итак, в бой!

Запайка пина Raspberry Pi 4B

Запаиваем гребенку. На самом деле, можно запаять только 1 контакт RUN, а не запаивать все 3.  Но я на всякий случай запаял сразу все, т.к. был на этапе экспериментов и не было на тот момент полной уверенности, что не понадобятся оставшиеся два.

o01-1.jpg
1600x_image.png?1635779175
С платой Raspberry разобрались, теперь необходимо подготовить ESP-01s. Для этого нужно подтянуть к 3.3В контакты CH_PD/EN и RST, запаяв перемычку как на фото ниже.
o01-1.jpg

* На самом деле это ESP-01s

Или так

1600x_image.png?1635779183

Прошивка ESP

Пришло время написать прошивку на ESPHome. Управлять будем через GPIO2, т.к. всем остальным нужна подтяжка на плюс, для нормальной загрузки ESP.

substitutions:
    board_name: hardware-rebooter
    upper_board_name: HARDWARE_REBOOTER
    
  esphome:
    name: ${board_name}
    platform: ESP8266
    board: esp01_1m
    comment: Hardware rebooter raspberry
  
  wifi:
    ssid: !secret wifi-ssid
    password: !secret wifi-password
    reboot_timeout: 15min
    output_power: 17.5dB
    fast_connect: true
    power_save_mode: none

    ap:
      ssid: "${upper_board_name} Fallback WI-FI"
      password: !secret ap-password
  
  captive_portal:
  
  # Enable logging
  logger:
  
  # Enable Home Assistant API
  api:
    reboot_timeout: 10min
  ota:
  
  web_server:
    port: 80
  
  sensor:
    - platform: uptime
      name: '${upper_board_name}_Uptime_Sensor'
      icon: mdi:clock-outline
      id: uptime_sensor
  
    - platform: wifi_signal
      name: ${upper_board_name}_WiFi_RSSI
      update_interval: 60s
  
  
  switch:
    - platform: restart
      name: '${upper_board_name} Restart'
      icon: "mdi:restart-alert"
  
    - platform: gpio
      pin: 
        number: GPIO2
        inverted: true
        mode: OUTPUT
      id: reset
      name: "Hardware reboot RPI"
      icon: "mdi:shield-refresh"
      on_turn_on:
      - delay: 500ms
      - switch.turn_off: reset
  
  
  text_sensor:
    # Expose ESPHome version as sensor.
    - platform: version
      name: ${upper_board_name} ESPHome Version
    # Expose WiFi information as sensors.
    - platform: wifi_info
      ip_address:
        name: ${upper_board_name}_IP
      ssid:
        name: ${upper_board_name}_SSID
      bssid:
        name: ${upper_board_name}_BSSID
      mac_address:
        name: ${upper_board_name}_MAC
  
    - platform: template
      name: ${upper_board_name}_Uptime
      lambda: |-
        uint32_t dur = id(uptime_sensor).state;
        int dys = 0;
        int hrs = 0;
        int mnts = 0;
        if (dur > 86399) {
          dys = trunc(dur / 86400);
          dur = dur - (dys * 86400);
        }
        if (dur > 3599) {
          hrs = trunc(dur / 3600);
          dur = dur - (hrs * 3600);
        }
        if (dur > 59) {
          mnts = trunc(dur / 60);
          dur = dur - (mnts * 60);
        }
        char buffer[17];
        sprintf(buffer, "%ud uh um us", dys, hrs, mnts, dur);
        return {buffer};
      icon: mdi:clock-start
      update_interval: 15s
  
  time:
    - platform: homeassistant
      id: homeassistant_time
  

Прошивку можно делать разными способами и об этом есть масса статей, поэтому тут останавливаться подробней не будем. Но нужно понимать, что если гребенку будем выпаивать, то, возможно, придется потом подпаивать провода для прошивки. Либо можно предварительно залить прошивку, проверить, что она работает и после этого уже выпаивать, оставив возможность дальше перепрошиваться по OTA. Возможность перепрошиваться по OTA лучше тоже проверить заранее, т.к. у меня бывает, что по каким-то причинам ESP-01 после перепрошивки по "воздуху" превращалась в "кирпич" и нужно было прошивать проводами. Она почему-то упорно перегружалась каждые 5 секунд, нормально не подключаясь к Wi-Fi.

Подключение к Argon One M.2

1600x_image.png?1635780338
1600x_image.png?1635780352
1600x_image.png?1635780353

В собранном виде правда крышка не закрывается, т.к. упирается, но у меня на "боевом" сервере в разъеме стоит USP HAT, а уже к нему подключается ESP.

В собранном виде на тестовом сервере это выглядит так. Для управляющего провода как раз есть подходящее отверстие воздуховода вентилятора.

1600x_image.png?1635783623

Отдельно отмечу, что данное решение позволяет и включать Raspberry, если по каким-либо причинам работа ее была завершена через такие команды как, poweroff, shutdown -h и др. Понятное дело, что питание физически не должно отключаться.

Причем у меня включается даже на корпусе Argon One, хотя питание там управляется отдельным контролером (в очередной раз убеждаюсь, что этот корпус стоит своих денег. Отдельная благодарность Alex Kvazis, который в свое время сделал шикарный обзор и замотивировал на его приобретение. Конструктора действительно постарались и сделали отличный корпус).

Также оставляю за кадром процесс пробрасывания портов к веб-интерфейсу нашего Hardware reboote'ру. На постоянной основе доступ должен быть закрыт и либо только после потери доступа открываем доступ наружу или пробрасываем порты, либо подключаемся через VPN и уже оттуда получаем доступ к веб-интерфейсу управления. Также можно подключить в ХА резервного сервера и управлять через него.

Хоть плата Raspberry достаточно "живучая" и у меня она спокойно пережила короткое замыкание между 3,3В и землей, но все же настоятельно рекомендую подключать все на выключенной от питания плате и тщательнейшим образом перепроверять правильность подключения. Особенно, если подключение будет производится к родному разъему, на котором отсутствует маркировка выводов. Также отмечу, что данная плата ESP-01s питается именно 3.3В и подача стандартного для Raspberry Pi 4B питающего напряжения в 5В - приведет к выходу ее из строя.


Все новости мира умных домов - t.me/SprutAI_News или Instagram
Остались вопросы? Мы в Telegram - @SprutAI

Хочешь умный дом но нет времени разбираться?
Посмотри примеры работ и выбери себе интегратора.
  1. (alexsb)
    (alexsb) 23 дня назад

    rpi 4 поддерживает POE, если роутер тоже (mikrotik например), то можно просто на нем написать скрипт, который будет передергивать питание у малины, если с ней пропала связь

  2. Евгений Матлай (Jeka_M)

    Ну у меня Кинетик без POE. И для POE нужен отдельный шиелд, который на корпус Argon One не поставишь нормально

  3. (snkku)
    (snkku) 21 день назад

    А смысл? Если железо вешается, то ребутится по ватчдогу и это уже не нормально и примочки с ребутом и вкл/выкл тут не помогут. Нужно проблему устранить, а не резетилку делать, которая там и так хардварно существует )

    • Евгений Матлай (Jeka_M)
      Евгений Матлай (Jeka_M) 21 день назад

      Вы не внимательно читали. Watchdog'ом вы не включите плату. Я же могу и включать и выключать когда мне вздумается и не смотря на то, какой UPS HAT стоит. Прочитайте внимательно какие могут быть случаи и когда это необходимо. Эта статья именно для таких случаев.

      • (snkku)
        (snkku) отредактировано 20 дней назад

        для случаев "случайно сделал halt -p" есть умная розетка яндекса и ноопепт(чтоб не забывать для чего эта команда) :DDD в остальных случаях - бесполезная фича

        poweron при подаче питания и так по дефолту есть, резет при зависании и так есть... остается только человеческий фактор, решаемый умной розеткой, но лучше исключить человеческий фактор :D

        • Евгений Матлай (Jeka_M)
          Евгений Матлай (Jeka_M) отредактировано 20 дней назад

          Еще раз, вы не внимательно читали. Умную розетку вы поставите до UPS HAT и после того, как вы выключите ее, у вас распберри еще будет пару часов работать. После того, как UPS HAT (не у меня, но есть масса таких экземпляров), выключится, высадив аккумулятор в ноль, то ваша умная розетка просто будет бесполезна, т.к. после ее включение срабатывает на плате защита из-за просаженного аккумулятора и не подает питание на плату распберри. После того, как аккумулятор зарядился, предположим, вы выключаете розетку и цикл запускается снова, ждем пока высадятся в ноль аккумуляторы, при этом плата как была обесточена, так и будет продолжать быть обесточенной. Выходом из этой ситуации будет ставить "умную" розетку между распберри и UPS HAT (и опять же, если вы внимательно читали, то в статье этот вариант тоже затрагивается). Но теперь давайте прикинем стоимость розетки, кол-во пайки, работы и того "огорода", который вы получите. Мое решение избавлено от всех этих недостатков и стоимость ему 1$.

          Повторюсь, прочитайте внимательно статью, прежде чем писать свои замечания. Все, что вы описываете, уже давно было пройдено и материал статьи помогает решить те редкие случаи, которые возникают. А они могут быть актуальны, если есть наложение определенных факторов. И особенно это актуально, когда вы не сможете в ближайшее время попасть в дом.

  4. Евгений Пирогов (eug314)
    Евгений Пирогов (eug314) отредактировано 2 часа назад
    Комментарий удален
  5. Евгений Пирогов (eug314)
    Евгений Пирогов (eug314) 46 минут назад

    можно использовать готовое решение: SONOFF Micro USB Adaptor

    выход 5V 2.5A

    1000x_image.png?1638286733
К списку статей

Устройства в материале

Raspberry Pi 4

Производитель: Raspberry Pi
Заказать на:

Raspberry Pi 3 Model B+

Производитель: Raspberry Pi
Заказать на:

ESP-01

Производитель: Espressif Systems
Заказать на:

Тематические чаты

Похожие статьи

17 декабря 2019, 17:49
Универсальный привод для автоматического удаленного открытия окон с простой интеграцией в умные дома.
04 сентября 2018, 12:14
Интеграция RGB ленты на ESP8266 с прошивкой tasmota в систему HomeBridge (HomeKit)
15 октября 2018, 09:05
Прошивка для Sonoff c нативным HomeKit
02 ноября 2018, 12:14
Кнопка звонка с уведомлениями в HomeKit
27 октября 2018, 12:20
Нативный Термостат для котла на ESP8266 с поддержкой Apple HomeKit
25 сентября 2020, 11:49
Сенсорный монитор для управления умным домом. Настройка и использование.
15 ноября 2018, 09:42
Способы автоматизации механических ворот
28 августа 2018, 09:48
От голого Raspbian до веб-интерфейса homebridge за четыре команды в терминале.
18 февраля 2020, 17:06
В данной статье описывается сборка слаботочного эл. щита на базе Wiren Board 6, а так же силового щита для небольшой квартиры.
03 октября 2018, 22:03
Как собрать и настроить Hyperion Ambilight - адаптивную подсветку ТВ.