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

    КДПВ © 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
      По-аккуратней с модулем MINI-360. Из-за того самого пресловутого подстроечного резистора, напряжение на выходе может плавать, а в случае обрыва — пройдет фактически питающее — и запитываемое устройство испустит волшебный дым.
      Есть готовые модули на фиксированные напряжения, гуглятся как MINI560. Либо же фиксируйте положение построечного резистора капелькой лака.

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

      PSS: насколько помню OpenWRT, сеть можно предварительно сконфигурировать, чтобы избавиться от необходимости подпаивать консольный шнурок.
        0
        Есть готовые модули на фиксированные напряжения, гуглятся как MINI560.

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

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

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

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

        Можно, но придётся самостоятельно собирать прошивку из исходников, возникнут проблемы с установкой зависимостей, и ещё много чего. В официальной инструкции всё же сказано: паяйтесь консольным кабелем.
          0
          не умеет 5V-to-4V, только 3,3V, а это мало =(

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

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

            0
            Из-за того самого пресловутого подстроечного резистора, напряжение на выходе может плавать,
            Для 5V в место него удачно запаивается 43кОм 0603 (при условии, что китайцы во всех такой делитель используют:) )
            0
            Я конечно может быть покажусь странным — но что мешает взять любую малинку и сделать мониториниг на ней? Просто какой то DIY ради DIY получается.
              0
              Именно так! Это отражено и в названии статьи, и в КДПВ. А с малинкой неинтересно, там заморочиться негде.
                0

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

                  0
                  Обычно у всех современных роутеров есть USB — отчего бы не питать малинку от него. Понятно что флэйм и все такое. Но вариант имеет право на существование.
                    0
                    • А давайте навертим кучу переходников?
                    • А зачем, если они норм стыкуются?!
                    • Просто у нас есть много ненужных переходников!
                      0
                      Ну у меня прицел на результат, а у вас на DIY. Наверное в этом дело.
                0

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

                  0

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


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


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


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

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

                    Кусок схемы
                    image


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

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое