Немного непортативного домашнего мониторинга, или из чего ещё можно собрать троллейбус +16


AliExpress RU&CIS

КДПВ © Borya_Spec (facebook.com/strangedrawings)
КДПВ © Borya_Spec (facebook.com/strangedrawings)

Мысль внедрить очередную свистелку в Home Assistant посетила меня, внезапно, в туалете. Бывает, сидишь, залипаешь в любимый информационный ресурс, и вдруг в глазах резко темнеет, и весь твой кругозор сужается до светящегося экранчика телефона. Снова УЗО не выдержал кухонных экспериментов, или, как говорили наши далёкие предки, "пробки выбило". И вот считаешь про себя секунды, в течение которых всё твоё драгоценное оборудование, весь твой любимый зоопарк одноплатников и показометров, противостоит беспросветной тьме силами бездушного куска свинца, именуемого "Источник бесперебойного питания". И, казалось бы, нагрузка невелика, и вроде как статью дочитать успеваешь, и до электрощита добежать, чтобы "автомат" передёрнуть, но всё равно как-то волнительно, вот бы знать, сколько минут еще в запасе осталось?

TL;DR

Далее я покажу и расскажу, как сделать беспроводной портативный роутер Kingston Mobilelite Wireless MLWG2 проводным и непортативным, с возможностью быстро вернуться к базовому состоянию (не стоит зацикливаться на рарности данной модели, руководство универсальное), а также накрутить на него OpenWrt, воткнуть кабель от APC UPS и отправлять данные в Home Assistant.

Дисклеймер: автор не несёт ответственности за сожжённое и закирпиченное вами оборудование, если решились что-то повторить - думайте своей головой. Мне обычно везёт, а повезёт ли вам?

Intro

Итак, задача поставлена: старенький бесперебойник, допустим, "APC Back-UPS ES 700", без особых финансовых затрат желает быть помониторенным и интегрированным в Home Assistant, с последующей привязкой на смену статуса каких-либо событий автоматизации. Задача осложняется достаточно коротким проприетарным шнурком, допустим, "USB-RJ45", который особо далеко не протянешь (неудобство компенсируется практически нулевой стоимостью ИБП, ввиду появления огромного количества оных на вторичном рынке). Нужна маленькая тихая железяка, способная спрятаться под столом, принимать данные по USB, и слать воздухом - под эти цели был выделен портативный роутер, он же "портативная флешка", он же Kingston MobileLite Wireless G2. Немного об MLWG2: не вдаваясь в технические подробности по поводу его внутренностей, устройство представляет собой точку доступа, способную принимать подключения по WiFi, раздавая интернет через другую точку доступа (одним радиомодулем), либо через мобильный "свисток", либо через витую пару. Оснащено крайне ограниченной функционально прошивкой, умеет шарить подключенные флешки через родное мобильное приложение. Приобреталось для временного расширения памяти нерасширяемых устройств Apple, в связи с пандемией актуальность временно утратило.

Железо

Большинство портативных роутеров, оснащенных съёмной батареей, без этой самой батареи включаться и работать отказываются, даже будучи подключенными к источнику постоянного питания. Без понятия, с чем это связано, но держать 24/7 устройство, запитанное от аккумулятора, я посчитал нецелесообразным и местами даже опасным, так как батареи имеют свойство деградировать, вздуваться и воспламеняться.

Kingston MLWG2 без верхней крышки (фото с сайта openwrt.org)
Kingston MLWG2 без верхней крышки (фото с сайта openwrt.org)

Самый распространённый (в интернете) способ сделать портативное устройство непортативным - воткнуть или впаять вместо батареи опытным путём подобранный конденсатор, спаяв его с пачкой резисторов, и тем самым обманывая контроллер заряда/разряда, встроенный в роутер. Выглядит крайне ненадёжно, устройство я еще планирую использовать по назначению, а значит обманывать контроллер буду наиболее очевидным способом: подавая в него постоянное напряжение, равное напряжению полностью заряженного аккумулятора. Из устройства была изъята батарея, и путём многократных замеров штангенциркулем, гугления, чтения даташитов, и даже не с первого раза, был идентифицирован и приобретён на Алиэкспресс правильный коннектор с маркировкой JST ZH 5-pin.

Сверху вниз: JST GH 1.25 мм, JST ZH 1.50 мм, оригинальный коннектор и батарея
Сверху вниз: JST GH 1.25 мм, JST ZH 1.50 мм, оригинальный коннектор и батарея
Термистор заменен на резистор 10 кОм
Термистор заменен на резистор 10 кОм

Вооружившись мультиметром, удалось определить распиновку коннектора: два красных провода - плюс, два чёрных провода - минус. Средний жёлтый провод показывал сопротивление порядка 10 кОм и был идентифицирован, как термистор. У китайского JST-коннектора были аккуратно срезаны направляющие "рельсы", термистор заменен обычным 10 кОм-резистором и подключен к минусу преобразователя, всё аккуратненько спаяно и закрыто в термоусадку.

Готовая связка коннектор - преобразователь
Готовая связка коннектор - преобразователь

Полностью заряженный аккумулятор роутера давал напряжение чуть более 4 вольт, значит нужен понижающий преобразователь с 5 вольт. Как нельзя лучше подошёл миниатюрный модуль, известный как DSN-MINI-360 (360 вероятно из-за вращающегося на 360° подстроечника). Пришлось помучиться с капризным подстроечником, дабы понизить напряжение телефонной зарядки до нужных 4 вольт (делать это лучше с тем блоком питания, от которого планируете питать устройство в будущем, учитывая так же, что под нагрузкой напряжение слегка просядет). В итоге роутер благополучно обманулся, показал 100% заряд аккумулятора и без проблем загрузился. Непрерывная работа связки в течение нескольких суток так же не выявила каких-либо проблем. Родное приложение показывает полностью заряженный аккумулятор (при его отсутствии). Конструкция с легкостью возвращается к исходному состоянию.

С 4 вольт без нагрузки просел до 3.86 под нагрузкой
С 4 вольт без нагрузки просел до 3.86 под нагрузкой

Прошивка

Kingston MLWG2 имеет официально поддерживаемую сообществом сборку OpenWrt последней (на текущий момент) версии, 19.07.7. Однако способ прошивки здесь слегка нестандартный. Вряд ли кто-то будет это повторять, но интереса ради можно и глянуть, я получил от процесса "колоссальное" удовольствие. Для начала нужно активировать в железяке telnet. К сожалению, я забыл вытащить init-скрипты оригинальной прошивки, но костыль там прописан знатный. Итак, форматируем флешку в FAT32, помещаем в корень сборку OpenWrt (я использовал openwrt-19.07.7-ramips-mt7620-mlwg2-squashfs-sysupgrade.bin из официального репозитория), и пустой текстовый файл с названием "mlwG2_v;telnetd; .x.x.bin" (именно так, без кавычек).

После втыкания флешки в устройство и последующей его перезагрузки, подключившись к создаваемой устройством WiFi-сети, можно подсоединиться telnet-клиентом (логин admin, без пароля, ip устройства захардкожен в прошивке):

telnet 192.168.201.254

Получаем BusyBox:

  (none) login: admin
  
  BusyBox v1.12.1 (2014-09-18 09:46:08 CST) built-in shell (ash)
  Enter 'help' for a list of built-in commands.
  
  #

Прошиваем...

mtd_write write /media/USB1/openwrt-19.07.7-ramips-mt7620-mlwg2-squashfs-sysupgrade.bin KernelA
mtd_write -r write /media/USB1/openwrt-19.07.7-ramips-mt7620-mlwg2-squashfs-sysupgrade.bin KernelB

После окончания прошивки устройство весело помигает лампочками, потом все три лампочки разом загорятся, и железяка… окирпичится. Не будет ни WiFi, ни Ethernet, просто три горящих лампочки.

Вскрываем корпус устройства и на верхней плате справа видим четыре неподписанных пятнышка припоя - это и есть спасительный UART. Запаиваем на него USB-to-TTL конвертер, запускаем эмулятор терминала (под винду я использую PuTTY), подключаемся (COMx:57600,8,n,1).

Белый - TX (R конвертера), зелёный - RX (T конвертера), черный - GND, паял дрожащими руками
Белый - TX (R конвертера), зелёный - RX (T конвертера), черный - GND, паял дрожащими руками

Видим, что устройство живо, но неправильно сконфигурированы сетевые интерфейсы. Вместо eth0 откуда-то вылез eth0.1, а WiFi вообще отключен. Исправляем несправедливость, отправляем устройство в reboot, и наслаждаемся полностью работоспособной OpenWrt (UART я отпаивать пока не рекомендую, только через него можно сделать failsafe в случае нарушения работоспособности прошивки).

root@OpenWrt:/etc/config# cat network 
config interface 'loopback'
        option ifname 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'

config globals 'globals'
        option ula_prefix 'fdf0:a4ca:5192::/48'

config interface 'lan'
        option type 'bridge'
        option ifname 'eth0.1' <--- заменяем на eth0
        option proto 'static'
        option ipaddr '192.168.1.1'
        option netmask '255.255.255.0'
        option ip6assign '60'

config device 'lan_eth0_1_dev'
        option name 'eth0.1'  <-- заменяем на eth0
        option macaddr '00:26:b7:09:e9:32'
        
root@OpenWrt:/etc/config# cat wireless 
config wifi-device 'radio0'
      option type 'mac80211'
      option channel '11'
      option hwmode '11g'
      option path 'platform/10180000.wmac'
      option htmode 'HT20'
      option disabled '1' <-- убираем

config wifi-iface 'default_radio0'
      option device 'radio0'
      option network 'lan'
      option mode 'ap'
      option ssid 'OpenWrt'
      option encryption 'none'

Как подключить OpenWrt в режиме клиента к существующей точке доступа, думаю, писать не стоит, есть подробнейшая официальная документация. Вкратце, через LuCI: Network -> Wireless -> Scan -> Join Network -> Assign firewall-zone = lan. После чего, в целях безопасности, лучше деактивировать интерфейс точки доступа (Mode: Master), продолжая работу с устройством по IP изнутри основной сети (всё-таки написал).

Софт

Для мониторинга ИБП APC используется демон apcupsd, про его интеграцию с Home Assistant уже много где написано, для этого даже плагины не нужны, у меня всё заработало просто через configuration.yml.

Ставим поддержку USB и демона из репозитория:

opkg update
opkg install kmod-usb-hid
opkg install apcupsd

Подключаем кабель ИБП в роутер, проверяем, что устройство видно:

root@OpenWrt:/# ls -la /dev/usb
drwxr-xr-x    2 root     root            60 Mar  2 21:10 .
drwxr-xr-x    5 root     root          1380 Mar  2 21:10 ..
crw-------    1 root     root      180,  96 Mar  2 21:10 hiddev0

Заходим в /etc/apcupsd, бэкапим конфиг apcupsd.conf, заменяя на свой. В минимуме нам достаточно вот этого (говорим, что используем USB-кабель, и будем отдавать данные по сети):

## apcupsd.conf v1.1 ##
UPSCABLE usb
UPSTYPE usb
NETSERVER on
NISIP 0.0.0.0
NISPORT 3551

Cтартуем демона

/etc/init.d/apcupsd start

Выполняем команду apcaccess и в идеале видим в консоли информацию об ИБП, любуемся полем STATUS: ONLINE. Теперь по адресу роутера (при правильно сконфигурированном файрволе) можно получать инфу от бесперебойника.
С софтом закончено.

root@OpenWrt:/etc/apcupsd# apcaccess
APC      : 001,035,0824
DATE     : 2021-03-03 00:23:17 +0300
HOSTNAME : OpenWrt
VERSION  : 3.14.14 (31 May 2016) unknown
UPSNAME  : OpenWrt
CABLE    : USB Cable
DRIVER   : USB UPS Driver
UPSMODE  :
STARTTIME: 2021-03-03 00:23:15 +0300
SHARE    :
MODEL    : Back-UPS ES 700
STATUS   : ONLINE
LINEV    : 232.0 Volts
LOADPCT  : 42.0 Percent
BCHARGE  : 100.0 Percent
TIMELEFT : 31.4 Minutes
MBATTCHG : 10 Percent
MINTIMEL : 5 Minutes
MAXTIME  : 0 Seconds
SENSE    : Medium
LOTRANS  : 180.0 Volts
HITRANS  : 266.0 Volts
ALARMDEL : 30 Seconds
BATTV    : 13.5 Volts
LASTXFER : Low line voltage
NUMXFERS : 0
TONBATT  : 0 Seconds
CUMONBATT: 0 Seconds
...

Настройка Home Assistant

Тут даже и настраивать ничего не надо, прописываем в configuration.yml, рестартуем:

apcupsd:
  host: <IP устройства с apcupsd>
  port: 3551

sensor:
  - platform: apcupsd
    resources:
     - bcharge
     - loadpct
     - status
     - timeleft
     - model
     - linev

Получаем готовый набор entities: модель ИБП, состояния (ONLINE, ONBATT, ...), % заряда батареи, % нагрузки, примерное оставшееся время работы от батареи, напряжение в сети (перечень параметров гораздо больше, я взял основные для себя). По результатам тестов, Home Assistant получает состояние бесперебойника где-то в течение 10-40 секунд, обновление показателей идёт где-то раз в 2-3 минуты. В целом, оно того стоило.

Далеко не полный набор сущностей, которые можно вытянуть из демона
Далеко не полный набор сущностей, которые можно вытянуть из демона

Итак, кто дочитал до конца, узнал, что с помощью старого портативного роутера, спрятанного под столом, можно мониторить напряжение в сети и заряд старенького бесперебойника с Авито, а ещё стоит иметь про запас USB-to-TTL конвертер, мало ли, захочется что-нибудь перепрошить. Я же получил некоторое удовольствие от того, что заставил работать валявшуюся без дела железяку, а также без особых усилий получил очередную карточку в Lovelace своего полоумного дома. Спасибо за внимание.

Данные несколько искажены вследствие тестирования
Данные несколько искажены вследствие тестирования

Ссылки




Комментарии (14):

  1. Stesh
    /#22759166

    По-аккуратней с модулем MINI-360. Из-за того самого пресловутого подстроечного резистора, напряжение на выходе может плавать, а в случае обрыва — пройдет фактически питающее.
    Есть готовые модули на фиксированные напряжения, гуглятся как MINI560. Либо же фиксируйте положение построечного резистора капелькой лака.

    PS: для красивой пайки не жалейте флюса, нормально прогревайте паяльник и предварительно облуживайте провода)

    • dfesenko
      /#22759444

      Есть готовые модули на фиксированные напряжения, гуглятся как MINI560.

      MINI560, к сожалению, не умеет 5V-to-4V, только 3,3V, а это мало =(

      для красивой пайки не жалейте флюса

      Консольный кабель в таком состоянии провёл около полугода, за это время мои скилы в пайке заметно подросли)

      насколько помню OpenWRT, сеть можно предварительно сконфигурировать

      Можно, но придётся самостоятельно собирать прошивку из исходников, возникнут проблемы с установкой зависимостей, и ещё много чего. В официальной инструкции всё же сказано: паяйтесь консольным кабелем.

      • Stesh
        /#22759498

        не умеет 5V-to-4V, только 3,3V, а это мало =(

        В таком случае, по-возможности, сдуйте подстроечник, замеряйте его сопротивление и запаяйте на его место постоянный ближайшего по ряду номинала. Еще момент был с подобными модулями — попадается проблемная керамика на выходе, не помешает продублировать параллельно штатной. Стабильное питание (не смотря на штатные dc-dc преобразователи самого MLWG2) — залог стабильной работы, для мониторинга это критично

      • Gengenid
        /#22760834

        Вместо dc/dc можно было бы просто два кремниевых диода последовательно и после них резистор на 1 кОм между + и -

    • sim2q
      /#22760122

      Из-за того самого пресловутого подстроечного резистора, напряжение на выходе может плавать,
      Для 5V в место него удачно запаивается 43кОм 0603 (при условии, что китайцы во всех такой делитель используют:) )

  2. Angel_of_Sorrow
    /#22759400

    Я конечно может быть покажусь странным — но что мешает взять любую малинку и сделать мониториниг на ней? Просто какой то DIY ради DIY получается.

    • dfesenko
      /#22759410

      Именно так! Это отражено и в названии статьи, и в КДПВ. А с малинкой неинтересно, там заморочиться негде.

    • Siorinex
      /#22760546

      Ну, к примеру упс может обеспечивать питанием конкретно локалку и роутер: согласитесь, идиотизм при этом ставить дополнительно малину, если роутер может выполнять роль шлюза между упсом и локалкой?!

      • Angel_of_Sorrow
        /#22760660

        Обычно у всех современных роутеров есть USB — отчего бы не питать малинку от него. Понятно что флэйм и все такое. Но вариант имеет право на существование.

        • Siorinex
          /#22760746

          • А давайте навертим кучу переходников?
          • А зачем, если они норм стыкуются?!
          • Просто у нас есть много ненужных переходников!

          • Angel_of_Sorrow
            /#22760820

            Ну у меня прицел на результат, а у вас на DIY. Наверное в этом дело.

  3. Siorinex
    /#22760532

    Уххх… Вот ровно такого монстробуса пытался с openWRT подружить на днях…
    Попробовал-бы, но зараза скопытилась — визжит при включении с нагрузкой....

    • Siorinex
      /#22765984

      Вобщем починил упс: вечная прооблема всех Apc с писком от дохлых кондеров...


      Начал дружить его с Асусом rt ac-58u…
      С NUT я в январе обломался: lsusb его видит, nut — нет!
      С ApcUpsD история аналогичная: не видит он упса и все тут, хотя система упс видит!
      Причем с малинкой оно у меня работало, так что он может, просто не хочет!


      Вобщем пять часов спустя натыкаюсь на одном западном форуме на фразу, от которой убивать хочется:
      "У чипов альтерос есть косяк, чтоиесли чип под usb 3.0 — с usb 1.1 будут глюки..."
      Вот не гады, а? Проблема "в железе" с "крутым" 3.0 портом!


      Далее: "Решается подключением через хаб"!!!
      Подключил через хаб: да, оно решается! Все увидело, все заработало!!!
      Грррр!!!!!!

      • Stesh
        /#22766724

        Кстати, на заметку. На старых apc back-ups (за новые ничего не скажу) на 3-й и 2-й пин COM-порта выведены сигналы (открытый коллектор) «низкое напряжение батареи» и «переход на батарею» соотв.

        Кусок схемы
        image