Hack na mądrym UPSie
Tak, znów moja mania statystyczno-informacyjna daje o sobie znać. Udało mi się upolować dwa zasilacze awaryjne firmy APC, a że mają wbudowany port szeregowy... To dlaczego by ich nie podłączyć do Ethernetu? Mamy w końcu stację meteo. W efekcie możemy sterować zdalnie zasilaczem, a przez co zasilaniem serwera. Mamy wgląd w pobór prądu podłączonych urządzeń i co najważniejsze – w razie zaniku zasilania, NASowi nie padnie uptime (ani żaden system plików, bo mam na nim cztery maszyny wirtualne).
Tanie Państwo
Skąd wziąć UPS? Najwyraźniej kopnąć się do jakiegoś urzędu i sprawdzić czy przypadkiem jakichś martwych nie wyrzucają i nie chcą ich zutylizować. Projektanci zasilaczy APC wpadli na genialny pomysł, że jeśli akumulator jest odłączony, lub całkowicie martwy, to urządzenie po prostu się nie włącza, nawet na zasilaniu sieciowym. I nie żeby sygnalizowało martwy akumulator w jakiś sposób i odmawiało startu, ot po prostu się nie włącza, udaje martwe, nie reaguje na nic. A co robi przeciętny informatyk w urzędzie, gdy ma do czynienia z martwym urządzeniem? "Wyrzucim, kupim nowe". Nowy zasilacz awaryjny tego typu (APC Smart-UPS SC620I) to koszt prawie tysiąca złotych, koszt przywrócenia do życia tych "zepsutych" to całe 70‑140zł, w zależności od tego gdzie chcemy kupić akumulator. Choć z wymianą może być problem. Okazuje się bowiem, że nikt nigdy akumulatorów w nich nie wymieniał, jak je kupili, tak pracowały. Nikt nawet nie zwrócił uwagi, że kontrolka sygnalizująca potrzebę wymiany aku się zaświeciła, a jak już się zaświeciła, to się świeciła i świeciła, aż akumulatory napęczniały tak, że nie można ich było wyjąć bez rozkręcenia całego zasilacza na, dosłownie, części pierwsze. Plus dla APC za to, że wszystko rozkręca się bardzo prosto, po zdjęciu obudowy trzeba tylko odkręcić płytę główną i transformator, po czym demontaż osłony akumulatora jest już banalny (w sumie 16 śrubek).
Dla pewności wypada sprawdzić jeszcze czy zasilacz startuje, tylko jak? Zapasowego akumulatora brak, nowego nie opłaca się kupować, póki nie zweryfikujemy stanu urządzeń, a gdy podłączę zasilacz zamiast aku, to UPS będzie chciał go ładować i z pewnością coś spali. Ale od czego są przebłyski geniuszu – przecież jeśli podłączę zasilacz zamiast akumulatora i tylko tyle, to UPS, nawet gdyby chciał, to nie będzie miał go z czego ładować. A że nie musi też nic zasilać, wystarczy < 1 A aby elektronika tegoż wystartowała. Jak się pomyślało, tak się zrobiło, oba dają oznaki życia, interes życia. :D
Ale po co stacja meteo?
W sumie po nic. Znaczy sama stacja, bo ta sama elektronika, która jest tam używana, może być podłączona do czegokolwiek i zbierać bardzo różne dane. Ostatnia jej inkarnacja, specjalnie do pomiarów stężenia pyłu zawieszonego ma wyprowadzony port szeregowy. Zatem można by go wykorzystać. Jest tylko jeden mały problem, port szeregowy elektroniki stacji poziomy napięć ma 3v3, port UPSa to RS232. A o ile format danych jest identyczny, tak poziomy napięć, RS232 to +- 12 V, instant burn dla STM32. Nic to dla nas jednak! Choć tym razem nie będzie własnoręcznie robionych płytek*, nie opłaca się tez modyfikować projektu używanego w stacji, to z pomocą przychodzą małe moduły z MAX3232 dostępne na allegro za 4,50, które wykują konwersję napięć 3v3 <-> 12 V (no właściwie to +‑6 V). Podłączy się kabelkami, obciągnie koszulką termokurczliwą i też będzie. A jak mi się kiedyś zachce, to te UPSy wyposażone są w port ochronny z transilami dla sieci Ethernet, te płytkę można wymontować i zastąpić własnym modułem, wewnętrznie podłączonym do portu szeregowego zasilacza, przez co cały układ wciśnie się w obudowę zasilacza. Poza tym usunie się wtedy port szeregowy z płyty głównej i zastąpi wyprowadzeniem na drugi, zewnętrzny akumulator.
Będzie schludniej, ładniej, i bardziej cacy. Ale na razie wystarczy jak jest.
Hackingo
Co mi przypomina... zasilanie. Mój układ wymaga zewnętrznego zasilania, najlepiej przez kabelek Eth, ale szczęśliwie ma też dwie goldpinowe złączki za prostownikiem – IN/OUT, tylko dalej pozostaje problem – skąd wziąć prąd. Można oczywiście skorzystać z zewnętrznego zasilacza, ale to takie trochę nie bardzo. Marnowanie miejsca w listwie zasilającej oraz mało eleganckie. Ale, ale, nietypowość złącza portu szeregowego w zasilaczu może być pomocna.
Tenże mówi, że na ósmym pinie powinno być dostępne zasilanie. Sprawdzamy multimetrem czy ten pin jest do czegokolwiek podłączony, cockblock, nie jest.
Za to reszta pinów do czegoś jest podłączona. Hmm, jeden wolny pin, wolny pin... zrobimy sprzętowego hacka. W efekcie czego na pinie numer osiem mamy teraz udostępnione zasilanie bezpośrednio z akumulatora. Idealne 10‑14V. Elektronika pobiera (bez czujników) około 70 mA. Przy pełnym 12 Ah akumulatorze to wystarczałoby na ponad tydzień pracy, ale akumulator ma inne zadanie. Tak czy inaczej, przy typowych okresach zaniku zasilania na tym osiedlu, parę godzin pracy tej elektroniki na samym aku mu nie zaszkodzi, tym bardziej, że w momencie, gdy UPS odetnie zasilanie, to wyłączy się także switch. A gdy switch się wyłączy, to pobór prądu przez naszą elektronikę spadnie praktycznie do zera. Ile może pobierać STM32.
Pozostaje już tylko wszytko polutować, poskładać i rozszerzyć możliwości softu o monitorowanie stanu pracy zasilacza awaryjnego. Protokół Smart-UPS nie jest oficjalnie dostępny, ale jest tak prosty, że najwyraźniej został lata temu nieoficjalnie opisany. Jeśli się uprzeć, można użyć po prostu terminala ustawionego na oszałamiającą prędkość 2400bps 8bit danych 1bit stopu, bez kontroli parzystości i przepływu. Teraz serwer (który sam nie ma portu szeregowego (tak, wiem, USB, nie)), a właściwie dwie maszyny wirtualne na nim odpalone mogą się komunikować z UPSem i w razie czego same się unieszkodliwić przed przybyciem całkowitego zaniku zasilania. Do kompletu brakuje tylko implementacji SNMP, ale nie jest to problem nie do pokonania, dajcie mi tydzień. :D
PS Czy wiesz, że (ja nie wiedziałem), zużyte akumulatory można oddać do skupu i nawet za to zapłacą 2,20 zł/kg? Cale 17 zł za dwa akumulatory, fortuna to nie jest, ale nie dość, że sprawne UPSy za darmo to jeszcze za złom akumulatorowy płacą.
* - miało nie być, zakupiony moduł miał jakąś dziwną wadę na jednej parze konwerterów, które powodowały loopback w kierunku UPSa. Druga para była sprawna, ale nie wyprowadzona, to tez trzeba było się do pinów przylutować "na pająka", iiii po drodze spaliłem to cudo. Zrobiłem własną na żelazku, działa.