Статья

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

Бывают ситуации, когда в один прекрасный момент мы теряем доступ к серверу УД. Например, он зависает и мы просто не можем подключиться по 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, чтобы проверить, если ли что-то похожее у "четверки".

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

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

Итак, в бой!

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

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

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

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

Или так

Прошивка ESP

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

substitutions: board_name: hardware-rebooter upper_board_name: HARDWARE_REBOOTER esphome: 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: "$ 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: '$_Uptime_Sensor' icon: mdi:clock-outline id: uptime_sensor - platform: wifi_signal name: $_WiFi_RSSI update_interval: 60s switch: - platform: restart 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: $ ESPHome Version # Expose WiFi information as sensors. - platform: wifi_info ip_address: name: $_IP ssid: name: $_SSID bssid: name: $_BSSID mac_address: name: $_MAC - platform: template 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 ; icon: mdi:clock-start update_interval: 15s time: - platform: homeassistant id: homeassistant_time

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

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

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

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

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

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

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

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


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

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

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

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

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


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

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


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



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

https://sprut.ai/static/media/cache/00/45/30/5/10846497/83818/1000x_image.png?1638286733" alt="1000x_image.png?1638286733" />

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

выход

5V 2.5A


https://sprut.ai/static/media/cache/00/45/30/5/10846497/83818/1000x_image.png?1638286733" alt="1000x_image.png?1638286733" />

Да. Можно попробовать. Не знал про него. Цена чуть кусается, но зато полностью готовое устройство. Спасибо. Вопрос подойдёт ли по размерам и не закроет ли другие разъёмы. Но можно и через удлинитель подключить


Вернуться назад

Устройства


Raspberry Pi

Raspberry Pi 4

(16 отзывов)

Raspberry Pi

Raspberry Pi 3 Model B+

(22 отзыва)

Espressif Systems

ESP-01

(2 отзыва)

Вернуться назад