Kiedy znika prąd, w inteligentnym domu wszystko gaśnie w tej samej chwili: router, przełącznik sieciowy, komputer z oprogramowaniem do automatyki domowej, podłączony do niego koordynator Zigbee albo Thread i serwer NAS z kopiami zapasowymi. Krótkie przerwy zamieniają się wtedy w długie, bo urządzenia wracają w przypadkowej kolejności, a wszystko, co akurat zapisywało dane na dysk, może wrócić z uszkodzonym systemem plików.

Zasilacz awaryjny (UPS) załatwia pierwszą część problemu: podtrzymuje sprzęt podczas krótkich przerw. Za drugą odpowiada oprogramowanie. Dokumentacja Network UPS Tools (NUT) streszcza jego zadanie jednym zdaniem: cały sens oprogramowania do UPS-a polega na tym, żeby czysto wyłączyć system operacyjny, zanim w akumulatorze skończy się energia. Pokazuję, jak dobrać UPS do takiego sprzętu i skonfigurować NUT na komputerze z Linuksem, na przykład na Raspberry Pi, żeby wyłączał się na czas i sam startował po powrocie zasilania.

Co podłączyć do UPS-a

Za UPS-em umieść sprzęt, od którego zależy reszta domu:

  • modem albo terminal światłowodowy (ONT) i router;
  • główny przełącznik sieciowy i zasilane z niego punkty dostępowe;
  • komputer z serwerem automatyki domowej razem z jego radiowymi adapterami USB;
  • NAS albo dysk na kopie zapasowe, jeśli działa bez przerwy.

Nie podłączaj niczego z grzałką ani z dużym silnikiem. UPS powinien pracować wyraźnie poniżej swojej mocy znamionowej: APC zaleca nie przekraczać 80% mocy znamionowej. Czas podtrzymania spada wraz z obciążeniem, więc niewielki zestaw sieciowy z serwerem na skromnym UPS-ie wytrzyma znacznie dłużej niż ten sam UPS obciążony blisko granicy. Producenci publikują wykresy czasu podtrzymania dla każdego modelu, a kiedy NUT już działa, UPS podaje własne oszacowanie.

Rezerwowy, interaktywny czy online

Eaton opisuje trzy rodzaje budowy UPS-ów.

UPS-y rezerwowe (offline) przepuszczają napięcie z sieci bez zmian i przełączają się na akumulator, gdy zasilanie zniknie. Przełączenie trwa około 10 ms lub krócej, a przy pracy z akumulatora zwykle dają aproksymowaną sinusoidę. Według Eatona nadają się do modemów i routerów, ale nie są zalecane do komputerów i serwerów.

UPS-y interaktywne (line-interactive) mają dodatkowo automatyczną regulację napięcia, która koryguje spadki i skoki napięcia bez sięgania po akumulator. Niektóre modele dają czystą sinusoidę, co ma znaczenie dla komputerowych zasilaczy z aktywną korekcją współczynnika mocy (PFC). Tańsze dają aproksymowaną sinusoidę.

UPS-y online (z podwójną konwersją) cały czas zasilają odbiorniki z falownika, więc nie ma żadnego czasu przełączenia. Są droższe i do domowej sieci zwykle zbyt rozbudowane.

Dla domowego serwera ze sprzętem sieciowym typowym kompromisem jest UPS interaktywny. Jeśli serwer ma komputerowy zasilacz z aktywnym PFC, wybierz model z czystą sinusoidą na wyjściu.

Łatwo przeoczyć jeszcze jeden wymóg: UPS potrzebuje złącza danych, zwykle portu USB, przez który UPS zgłasza się w systemie jako urządzenie HID zasilania. Bez niego komputer nie ma pojęcia, że zasilanie zniknęło. Przed zakupem sprawdź konkretny model na liście zgodnego sprzętu NUT.

Akumulatory się zużywają

Większość małych UPS-ów ma szczelne akumulatory kwasowo-ołowiowe (VRLA). Eaton podaje typową żywotność od trzech do pięciu lat, a APC mówi to samo o większości swoich akumulatorów. Największym wrogiem jest ciepło. APC podaje jako optymalną temperaturę od 20 do 25 °C i pisze, że każdy wzrost o 8 °C skraca żywotność akumulatora o połowę. Akumulator, który w 25 °C wytrzymałby cztery lata, w 33 °C wytrzyma około dwóch. Nie chowaj UPS-a w zamkniętej szafce obok ciepłego serwera.

APC radzi też, żeby kalibrację czasu podtrzymania, która rozładowuje akumulator, przeprowadzać tylko raz albo dwa razy w roku. Eaton dodaje, że częste przełączanie na akumulator również skraca jego życie. To kolejny powód, żeby wybrać model z regulacją napięcia, jeśli napięcie w sieci się waha.

NUT może cię ostrzec, gdy sam UPS zgłosi, że akumulator wymaga wymiany (zdarzenie REPLBATT, opisane niżej).

Jak zbudowany jest NUT

NUT ma trzy warstwy:

  • sterownik komunikuje się z UPS-em (konfiguracja w ups.conf);
  • serwer danych upsd udostępnia dane ze sterownika na porcie TCP 3493 (konfiguracja w upsd.conf i upsd.users);
  • program nadzorujący upsmon obserwuje dane i w razie potrzeby wyłącza komputer (konfiguracja w upsmon.conf).

Komputer połączony z UPS-em kablem USB uruchamia wszystkie trzy i jest głównym (primary). Inne komputery zasilane z tego samego UPS-a uruchamiają tylko upsmon, łączą się z głównym przez sieć i są podrzędne (secondary). W NUT 2.8.0 nazwy master i slave zmieniono na primary i secondary. Stare nazwy nadal działają, więc w starszych poradnikach zobaczysz obie wersje.

W Debianie i Raspberry Pi OS konfiguracja leży w /etc/nut. Wersje różnią się między wydaniami: Debian 12 bookworm ma NUT 2.8.0, a Debian 13 trixie 2.8.1. Pakiet nut instaluje zarówno serwer, jak i klienta.

sudo apt install nut

Krok 1: znajdź UPS i skonfiguruj sterownik

Podłącz kabel USB i poproś NUT o wyszukanie obsługiwanych urządzeń:

sudo nut-scanner -U

Program wypisuje gotową sekcję do ups.conf. Typowa konfiguracja dla USB wygląda tak:

[homeups]
        driver = usbhid-ups
        port = auto
        desc = "Network and server UPS"

Sterowniki USB, takie jak usbhid-ups, ignorują wartość portu, ale pole musi istnieć, więc przyjęło się wpisywać auto. Pod nazwą w nawiasach kwadratowych (tutaj homeups) UPS występuje we wszystkich pozostałych narzędziach.

Krok 2: wybierz tryb i zabezpiecz serwer

W pliku /etc/nut/nut.conf ustaw tryb pracy. Wokół znaku równości nie może być spacji:

MODE=standalone

Użyj standalone, jeśli z UPS-a zasilany jest tylko ten komputer. Użyj netserver, jeśli stan UPS-a mają odczytywać inne maszyny (NAS, drugie Raspberry Pi albo Home Assistant na innym komputerze). Wartość domyślna to none i przy niej nic się nie uruchamia.

Domyślnie upsd nasłuchuje tylko na adresie lokalnym, na porcie 3493. W trybie netserver dopisz do /etc/nut/upsd.conf adres tego komputera w sieci lokalnej:

LISTEN 127.0.0.1 3493
LISTEN 192.168.1.10 3493

Potem utwórz w /etc/nut/upsd.users użytkownika dla programu nadzorującego:

[monuser]
        password = choose-a-long-password
        upsmon primary

Oba pliki zawierają dane poufne. Dokumentacja NUT zaleca właściciela root, grupę nut i uprawnienia 0640:

sudo chown root:nut /etc/nut/upsd.conf /etc/nut/upsd.users
sudo chmod 0640 /etc/nut/upsd.conf /etc/nut/upsd.users

Krok 3: skonfiguruj program nadzorujący

Najważniejsze wiersze w /etc/nut/upsmon.conf na komputerze głównym to:

MONITOR homeups@localhost 1 monuser choose-a-long-password primary
SHUTDOWNCMD "/sbin/shutdown -h +0"
POWERDOWNFLAG /run/nut/killpower

1 to liczba zasilaczy tego komputera, które są zasilane z tego UPS-a. POWERDOWNFLAG trzeba ustawić jawnie, a dokumentacja proponuje lokalizację w tymczasowym systemie plików, na przykład /run/nut/killpower, żeby nieaktualny znacznik nie przetrwał do następnego uruchomienia. Ten plik też zawiera hasło, więc nadaj mu te same ustawienia: root:nut i 0640.

Na komputerze podrzędnym wiersz MONITOR wskazuje komputer główny i kończy się słowem secondary. Utwórz dla niego osobnego użytkownika z upsmon secondary w pliku upsd.users na komputerze głównym.

Krok 4: uruchom usługi i sprawdź dane

W dystrybucjach z systemd NUT działa jako instancje nut-driver (po jednej na każdą sekcję UPS-a w ups.conf, tworzone od NUT 2.8.0 przez usługę pomocniczą), nut-server i nut-monitor. Po zmianie plików uruchom ponownie serwer i program nadzorujący:

sudo systemctl restart nut-server nut-monitor

Potem zapytaj serwer, co widzi:

upsc homeups@localhost ups.status

OL oznacza, że UPS pracuje z sieci, często razem z CHRG, gdy akumulator się ładuje. Wyjmij na chwilę wtyczkę UPS-a z gniazdka, a stan powinien zmienić się na OB (praca z akumulatora). upsc homeups@localhost bez nazwy zmiennej wypisuje wszystko, co wie sterownik, w tym battery.charge, battery.runtime (w sekundach) i ups.load.

Co dzieje się podczas awarii zasilania

Warto znać kolejność działań NUT, bo wyjaśnia ona sens ustawień:

  1. UPS przechodzi na akumulator i zgłasza OB. Na razie nic się nie wyłącza.
  2. Gdy akumulator jest bliski wyczerpania, UPS zgłasza OB LB. To jest sygnał do działania.
  3. upsmon na komputerze głównym ustawia na serwerze znacznik wymuszonego wyłączenia (FSD).
  4. Komputery podrzędne widzą FSD, czekają FINALDELAY (domyślnie 5 sekund) i wykonują własne SHUTDOWNCMD.
  5. Komputer główny czeka, aż komputery podrzędne się rozłączą albo minie HOSTSYNC (domyślnie 15 sekund), potem tworzy plik POWERDOWNFLAG i sam się wyłącza.
  6. Pod koniec wyłączania system znajduje znacznik i każe UPS-owi odciąć zasilanie gniazd.
  7. Kiedy prąd wraca, UPS ponownie włącza gniazda, a komputery startują.

Krok 6 jest ważniejszy, niż się wydaje. Gdyby UPS pozostał włączony, komputer ustawiony tak, żeby włączał się po powrocie zasilania, nigdy by tego powrotu nie zauważył, bo z jego punktu widzenia zasilanie wcale nie zniknęło. Dokumentacja NUT nazywa takie sytuacje wyścigami zasilania. Jeśli NUT pochodzi z pakietów dystrybucji, skrypt sprawdzający znacznik podczas wyłączania jest już na miejscu.

Zauważ też, że sygnał niskiego stanu akumulatora zwykle wysyła sam UPS. Jeśli sterownik udostępnia próg, NUT pokazuje go jako battery.charge.low.

Powiadomienia

upsmon potrafi informować o zdarzeniach bez dodatkowego oprogramowania. Wiersze NOTIFYFLAG określają, co dzieje się przy danym typie zdarzenia (SYSLOG, WALL, EXEC), a NOTIFYCMD wskazuje skrypt uruchamiany przez EXEC. Nazwy zdarzeń to między innymi ONBATT, ONLINE, LOWBATT, FSD, COMMBAD, NOCOMM i REPLBATT. Przykład:

NOTIFYCMD /usr/local/bin/ups-notify.sh
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
NOTIFYFLAG REPLBATT SYSLOG+EXEC

Na COMMBAD i NOCOMM zwracaj szczególną uwagę: oznaczają, że upsmon stracił łączność z UPS-em. Według podręcznika upsmon.conf UPS, który przestaje odpowiadać, a ostatnio pracował z akumulatora, jest traktowany jak UPS z niskim stanem akumulatora, co uruchamia wyłączanie.

Jeśli korzystasz z Home Assistant, jego integracja NUT łączy się z tym samym serwerem na porcie 3493 i zamienia zmienne UPS-a w czujniki, więc awarie zasilania mogą uruchamiać tam automatyzacje i powiadomienia. Serwer NUT musi wtedy działać w trybie netserver i mieć wiersz LISTEN z adresem osiągalnym z komputera z Home Assistant.

Przetestuj wyłączanie, zanim będzie potrzebne

Dokumentacja NUT wyraźnie zaznacza, że sprzęt UPS różni się nawet w obrębie jednej serii modeli, więc wyłączanie trzeba przetestować, zanim zostawisz system bez nadzoru. Zacznij od przebiegu próbnego, który tylko wypisuje, co zrobiłby sterownik:

sudo upsdrvctl -t shutdown

Potem, w chwili, gdy ponowne uruchomienie nikomu nie zaszkodzi, wykonaj prawdziwą sekwencję:

sudo upsmon -c fsd

To pełne wymuszone wyłączenie: komputer się wyłącza, UPS na jakiś czas odcina zasilanie gniazd, a potem je przywraca, a komputer powinien sam wystartować. Jeśli UPS nigdy nie włącza gniazd z powrotem, grozi ci wyścig zasilania i musisz to naprawić, zanim zaczniesz polegać na tej konfiguracji. Pamiętaj, że upsd utrzymuje stan FSD aż do ponownego uruchomienia, a to załatwia restart komputera.

Według dokumentacji test jest udany, gdy system operacyjny zatrzyma się przed wyczerpaniem akumulatora i uruchomi ponownie po powrocie zasilania. Raspberry Pi startuje, gdy tylko dostanie zasilanie. Komputer PC albo NAS może po zaniku zasilania pozostać wyłączony, jeśli jego oprogramowanie układowe nie jest ustawione na włączanie po powrocie prądu, więc sprawdź też to ustawienie.