{"id":12966,"date":"2026-09-11T18:25:00","date_gmt":"2026-09-11T16:25:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=12966"},"modified":"2026-10-26T13:26:23","modified_gmt":"2026-10-26T12:26:23","slug":"tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/tutorials-pl-raspberry-pi-pl\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\/","title":{"rendered":"Tutorial: Dob\u00f3r zasilacza UPS do Raspberry Pi i konfiguracja automatycznego wy\u0142\u0105czenia"},"content":{"rendered":"<p>Zasilacz bezprzerwowy (UPS) musi zasila\u0107 Raspberry Pi pod obci\u0105\u017ceniem, zg\u0142asza\u0107 zanik sieci i zachowa\u0107 energi\u0119 na uporz\u0105dkowane zamkni\u0119cie systemu. Sama pojemno\u015b\u0107 akumulatora nie odpowiada na \u017cadne z tych trzech wymaga\u0144. Znaczenie maj\u0105 energia dost\u0119pna na wyj\u015bciu, dopuszczalny pr\u0105d szczytowy oraz wsp\u00f3\u0142praca UPS z systemem operacyjnym.<\/p>\n<p>Poni\u017csze obliczenie jest przyk\u0142adem projektowym. Logika wy\u0142\u0105czenia wymaga udokumentowanego, zgodnego z Pi zasilacza UPS z sygna\u0142em zaniku sieci zwieranym do masy. Pakiet, \u0142adowarka i uk\u0142ad ochronny musz\u0105 odpowiada\u0107 konfiguracji dopuszczonej przez producenta.<\/p>\n<figure class=\"lw-diagram\"><img src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/dia-12966-review-20261024.png\" width=\"1120\" height=\"580\" decoding=\"async\" loading=\"lazy\" alt=\"Trzy pola przedstawiaj\u0105 za\u0142o\u017cony bilans energii, obliczone czasy pracy i ograniczenia monitorowania wy\u0142\u0105czenia.\"><figcaption>Przyk\u0142adowe za\u0142o\u017cenia, nie zmierzone parametry produktu. Stan akumulatora, pr\u0105d wyj\u015bciowy, b\u0142\u0119dy monitoringu i ponowny start wymagaj\u0105 osobnego sprawdzenia.<\/figcaption><\/figure>\n<h2>1. Pomiar ca\u0142ego obci\u0105\u017cenia<\/h2>\n<p>Moc znamionowa zasilacza okre\u015bla mo\u017cliwo\u015bci dostarczania energii, a nie pob\u00f3r Pi. Pomiar na wej\u015bciu 5 V obejmuje Pi i urz\u0105dzenia USB zasilane przez to wej\u015bcie. Miernik musi obs\u0142ugiwa\u0107 zastosowane zasilanie USB-C oraz wymagany pr\u0105d. Osobno zasilane urz\u0105dzenia wymagaj\u0105 odr\u0119bnego bilansu energii.<\/p>\n<p>Na Pi 5 polecenie <code>vcgencmd pmic_read_adc<\/code> udost\u0119pnia pomiary wewn\u0119trzne. Suma szyn PMIC nie obejmuje jednak poboru USB ani obci\u0105\u017ce\u0144 pod\u0142\u0105czonych bezpo\u015brednio do 5 V. Nie jest wi\u0119c pomiarem ca\u0142kowitej mocy wej\u015bciowej ani og\u00f3ln\u0105 metod\u0105 pomiarow\u0105 dla Pi 4 i Pi 5.<\/p>\n<p>Dob\u00f3r wymaga pomiaru spoczynku, zwyk\u0142ej pracy i najwy\u017cszego planowanego obci\u0105\u017cenia, \u0142\u0105cznie z operacjami dyskowymi oraz pr\u0105dem rozruchowym. Wyj\u015bcie UPS musi dostarczy\u0107 odpowiedni pr\u0105d bez niedopuszczalnego spadku napi\u0119cia. Du\u017cy akumulator nie zast\u0119puje odpowiednio wydajnej przetwornicy.<\/p>\n<h2>2. Jawne obliczenie energii i rezerwy<\/h2>\n<p>Watogodziny wynikaj\u0105 w przybli\u017ceniu z iloczynu amperogodzin i napi\u0119cia znamionowego. Dwa przyk\u0142adowe ogniwa po 3,4 Ah i 3,7 V daj\u0105 \u0142\u0105cznie 25,16 Wh. W\u0142a\u015bciw\u0105 warto\u015bci\u0105 jest rzeczywiste napi\u0119cie znamionowe dopuszczonego pakietu, a nie napi\u0119cie ko\u0144cowe \u0142adowania. Warto\u015b\u0107 mAh odnosz\u0105ca si\u0119 do ogniw nie okre\u015bla czasu pracy przez USB bez danych o napi\u0119ciu i przetwarzaniu.<\/p>\n<p>Przyk\u0142ad zak\u0142ada 80 procent dost\u0119pnej energii ogniw oraz 88 procent sprawno\u015bci przetwornicy. Pierwszy wsp\u00f3\u0142czynnik opisuje wybrany przypadek projektowy z uwzgl\u0119dnieniem wieku, temperatury i u\u017cytecznego zakresu roz\u0142adowania. \u017badna z tych warto\u015bci nie jest pomiarem uniwersalnym. Dodatkowo 1 Wh na wyj\u015bciu pozostaje jako rezerwa na zamkni\u0119cie systemu.<\/p>\n<figure style=\"--cbb-digits:1\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"plain\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Text<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-plain\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\">E_cells = 2 \u00d7 3.4 Ah \u00d7 3.7 V = 25.16 Wh\n<\/span><span class=\"cbb-line\">E_output = 25.16 Wh \u00d7 0.80 \u00d7 0.88 = 17.71264 Wh\n<\/span><span class=\"cbb-line\">E_runtime = 17.71264 Wh \u2212 1 Wh = 16.71264 Wh\n<\/span><span class=\"cbb-line\">t_runtime = E_runtime \/ P_load<\/span><\/code><\/pre><\/figure>\n<table><thead><tr><th>Za\u0142o\u017cone obci\u0105\u017cenie<\/th><th>Obliczony czas do rezerwy<\/th><\/tr><\/thead><tbody><tr><td>6 W<\/td><td>oko\u0142o 2 godz. 47 min<\/td><\/tr><tr><td>9 W<\/td><td>oko\u0142o 1 godz. 51 min<\/td><\/tr><tr><td>12 W<\/td><td>oko\u0142o 1 godz. 24 min<\/td><\/tr><\/tbody><\/table>\n<p>Poziomy mocy s\u0105 wariantami oblicze\u0144, a nie typowymi konfiguracjami Pi. Przy sta\u0142ych 12 W energia 1 Wh wystarcza na pi\u0119\u0107 minut. Za\u0142o\u017cone zamykanie systemu przez 60 sekund zu\u017cywa wtedy 0,2 Wh. Rzeczywisty czas wymaga pomiaru z docelowymi us\u0142ugami, dyskami i mo\u017cliwymi przekroczeniami czasu oczekiwania.<\/p>\n<p>U\u017cyteczna energia zmierzona ju\u017c na wyj\u015bciu 5 V uwzgl\u0119dnia straty przetwornicy. Ponowne zastosowanie sprawno\u015bci odj\u0119\u0142oby te same straty drugi raz. Pr\u00f3g zako\u0144czenia roz\u0142adowania uwzgl\u0119dniony w pomiarze pojemno\u015bci r\u00f3wnie\u017c nie wymaga kolejnego arbitralnego odliczenia.<\/p>\n<h2>3. Zanik sieci i krytyczny stan akumulatora to r\u00f3\u017cne sygna\u0142y<\/h2>\n<p>Sygna\u0142 zaniku sieci pozwala odczeka\u0107 kr\u00f3tk\u0105 przerw\u0119. Krytyczny stan akumulatora mo\u017ce natomiast wymaga\u0107 natychmiastowego zamkni\u0119cia systemu. Sta\u0142e op\u00f3\u017anienie 60 sekund jest dopuszczalne wy\u0142\u0105cznie przy wystarczaj\u0105cej energii na oczekiwanie i zamkni\u0119cie, tak\u017ce przy uruchomieniu monitora oraz po kolejnych awariach. Odpowiedni UPS potrzebuje niezale\u017cnego uk\u0142adu ochronnego; monitoring w\u0142a\u015bciwy dla urz\u0105dzenia mo\u017ce zapewnia\u0107 wcze\u015bniejsz\u0105 \u015bcie\u017ck\u0119 awaryjn\u0105.<\/p>\n<p>MAX17048 szacuje stan na\u0142adowania uk\u0142adu z jednym ogniwem; pokrewny MAX17049 obs\u0142uguje dwa ogniwa szeregowe. INA219 mierzy pr\u0105d, napi\u0119cie i moc, ale sam nie podaje procentowej pojemno\u015bci akumulatora. Szacowany stan na\u0142adowania nie usuwa potrzeby pr\u00f3by pod du\u017cym obci\u0105\u017ceniem. Uniwersalny pr\u00f3g 20 procent nie gwarantuje okre\u015blonego czasu dalszej pracy.<\/p>\n<h2>4. Prosty overlay albo monitor z op\u00f3\u017anieniem<\/h2>\n<p>Overlay <code>gpio-shutdown<\/code> generuje zdarzenie wej\u015bciowe <code>KEY_POWER<\/code>. Zamkni\u0119cie obs\u0142uguje przyk\u0142adowo <code>systemd-logind<\/code>. Bez dzia\u0142aj\u0105cego odbiorcy w systemie operacyjnym wy\u0142\u0105czenie nie jest gwarantowane, zw\u0142aszcza w ka\u017cdej fazie rozruchu. Numer GPIO, polaryzacja i po\u0142\u0105czenie musz\u0105 pasowa\u0107 do p\u0142ytki. Overlay i poni\u017cszy monitor nie mog\u0105 r\u00f3wnocze\u015bnie zajmowa\u0107 tej samej linii.<\/p>\n<p>Monitor korzysta z interfejsu Python biblioteki libgpiod 2. Starsza instalacja 1.x nie jest zgodna. Urz\u0105dzenie GPIO i offset linii wymagaj\u0105 ustalenia za pomoc\u0105 lokalnych narz\u0119dzi GPIO oraz dokumentacji p\u0142ytki. Fizyczny numer pinu z\u0142\u0105cza nie jest offsetem linii; <code>gpiochip0<\/code> i offset 17 nie s\u0105 ustawieniami uniwersalnymi.<\/p>\n<p>Za\u0142o\u017cenie elektryczne to udokumentowane wyj\u015bcie open-drain zgodne z 3,3 V: stan niski oznacza zanik sieci, wysoki obecno\u015b\u0107 sieci, przy wsp\u00f3lnej masie i odpowiednim podci\u0105gni\u0119ciu. Wyj\u015bcie open-drain zwiera sygna\u0142 do masy albo go zwalnia. Rezystor podci\u0105gaj\u0105cy utrzymuje zwolniony sygna\u0142 na dozwolonym poziomie wysokim. Przerwany przew\u00f3d mo\u017ce przez podci\u0105gni\u0119cie wygl\u0105da\u0107 jak obecna sie\u0107; przyk\u0142ad nie wykrywa tej awarii. Sygna\u0142 5 V nie mo\u017ce trafi\u0107 bezpo\u015brednio na GPIO. Inne wyj\u015bcie wymaga w\u0142a\u015bciwego dopasowania elektrycznego i sprawdzonej logiki.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"python\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Python<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-python\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-comment\">#!\/usr\/bin\/env python3<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">import<\/span> argparse\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">import<\/span> math\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">import<\/span> subprocess\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">import<\/span> time\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">class<\/span> <span class=\"cbb-type\">OutageTimer<\/span>:\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">def<\/span> <span class=\"cbb-function\">__init__<\/span>(<span class=\"cbb-variable\">self<\/span>, delay):\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-keyword\">not<\/span> math.<span class=\"cbb-function\">isfinite<\/span>(delay) <span class=\"cbb-keyword\">or<\/span> delay &lt;= <span class=\"cbb-number\">0<\/span>:\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">ValueError<\/span>(<span class=\"cbb-string\">\"delay must be positive and finite\"<\/span>)\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-variable\">self<\/span>.delay = delay\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-variable\">self<\/span>.since = <span class=\"cbb-constant\">None<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-variable\">self<\/span>.previous = <span class=\"cbb-constant\">None<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">def<\/span> <span class=\"cbb-function\">sample<\/span>(<span class=\"cbb-variable\">self<\/span>, failed, now):\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-function\">type<\/span>(failed) <span class=\"cbb-keyword\">is<\/span> <span class=\"cbb-keyword\">not<\/span> bool <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> math.<span class=\"cbb-function\">isfinite<\/span>(now):\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">ValueError<\/span>(<span class=\"cbb-string\">\"invalid sample\"<\/span>)\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-variable\">self<\/span>.previous <span class=\"cbb-keyword\">is<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-constant\">None<\/span> <span class=\"cbb-keyword\">and<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-number\">0<\/span> &lt;= now - <span class=\"cbb-variable\">self<\/span>.previous &lt;= <span class=\"cbb-number\">5<\/span>:\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">RuntimeError<\/span>(<span class=\"cbb-string\">\"monitoring gap exceeds 5 seconds\"<\/span>)\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-variable\">self<\/span>.previous = now\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-keyword\">not<\/span> failed:\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-variable\">self<\/span>.since = <span class=\"cbb-constant\">None<\/span>\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-constant\">False<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-variable\">self<\/span>.since <span class=\"cbb-keyword\">is<\/span> <span class=\"cbb-constant\">None<\/span>:\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-variable\">self<\/span>.since = now\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> now - <span class=\"cbb-variable\">self<\/span>.since &gt;= <span class=\"cbb-variable\">self<\/span>.delay\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">def<\/span> <span class=\"cbb-function\">monitor<\/span>(read_failed, delay, action, clock=time.monotonic, sleep=time.sleep):\n<\/span><span class=\"cbb-line\">    timer = <span class=\"cbb-function\">OutageTimer<\/span>(delay)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">while<\/span> <span class=\"cbb-constant\">True<\/span>:\n<\/span><span class=\"cbb-line\">        failed = <span class=\"cbb-function\">read_failed<\/span>()  <span class=\"cbb-comment\"># Read immediately, including at startup.<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">if<\/span> timer.<span class=\"cbb-function\">sample<\/span>(failed, <span class=\"cbb-function\">clock<\/span>()):\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-function\">action<\/span>()\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">return<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-function\">sleep<\/span>(<span class=\"cbb-number\">1<\/span>)\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">def<\/span> <span class=\"cbb-function\">main<\/span>():\n<\/span><span class=\"cbb-line\">    parser = argparse.<span class=\"cbb-function\">ArgumentParser<\/span>()\n<\/span><span class=\"cbb-line\">    parser.<span class=\"cbb-function\">add_argument<\/span>(<span class=\"cbb-string\">\"--chip\"<\/span>, required=<span class=\"cbb-constant\">True<\/span>)\n<\/span><span class=\"cbb-line\">    parser.<span class=\"cbb-function\">add_argument<\/span>(<span class=\"cbb-string\">\"--line\"<\/span>, required=<span class=\"cbb-constant\">True<\/span>, type=int)\n<\/span><span class=\"cbb-line\">    parser.<span class=\"cbb-function\">add_argument<\/span>(<span class=\"cbb-string\">\"--delay\"<\/span>, type=float, default=<span class=\"cbb-number\">60<\/span>)\n<\/span><span class=\"cbb-line\">    parser.<span class=\"cbb-function\">add_argument<\/span>(<span class=\"cbb-string\">\"--poweroff\"<\/span>, action=<span class=\"cbb-string\">\"store_true\"<\/span>)\n<\/span><span class=\"cbb-line\">    args = parser.<span class=\"cbb-function\">parse_args<\/span>()\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-function\">OutageTimer<\/span>(args.delay)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> args.line &lt; <span class=\"cbb-number\">0<\/span>:\n<\/span><span class=\"cbb-line\">        parser.<span class=\"cbb-function\">error<\/span>(<span class=\"cbb-string\">\"line offset must be non-negative\"<\/span>)\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">import<\/span> gpiod\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">from<\/span> gpiod.line <span class=\"cbb-keyword\">import<\/span> Bias, Direction, Value\n<\/span><span class=\"cbb-line\">    settings = gpiod.<span class=\"cbb-function\">LineSettings<\/span>(direction=Direction.INPUT,\n<\/span><span class=\"cbb-line\">                                  active_low=<span class=\"cbb-constant\">False<\/span>, bias=Bias.PULL_UP)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">with<\/span> gpiod.<span class=\"cbb-function\">request_lines<\/span>(args.chip, consumer=<span class=\"cbb-string\">\"ups-watch\"<\/span>,\n<\/span><span class=\"cbb-line\">                            config={args.line: settings}) <span class=\"cbb-keyword\">as<\/span> request:\n<\/span><span class=\"cbb-line\">        last = &#91;<span class=\"cbb-constant\">None<\/span>&#93;\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">def<\/span> <span class=\"cbb-function\">read_failed<\/span>():\n<\/span><span class=\"cbb-line\">            value = request.<span class=\"cbb-function\">get_value<\/span>(args.line)\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">if<\/span> value <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-keyword\">in<\/span> (Value.ACTIVE, Value.INACTIVE):\n<\/span><span class=\"cbb-line\">                <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">RuntimeError<\/span>(<span class=\"cbb-string\">\"unknown GPIO state\"<\/span>)\n<\/span><span class=\"cbb-line\">            failed = value == Value.INACTIVE  <span class=\"cbb-comment\"># Physical low = mains failure.<\/span>\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">if<\/span> failed != last&#91;<span class=\"cbb-number\">0<\/span>&#93;:\n<\/span><span class=\"cbb-line\">                <span class=\"cbb-function\">print<\/span>(<span class=\"cbb-string\">\"UPS mains_failed=\"<\/span> + <span class=\"cbb-function\">str<\/span>(failed), flush=<span class=\"cbb-constant\">True<\/span>)\n<\/span><span class=\"cbb-line\">                last&#91;<span class=\"cbb-number\">0<\/span>&#93; = failed\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">return<\/span> failed\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">def<\/span> <span class=\"cbb-function\">action<\/span>():\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-function\">print<\/span>(<span class=\"cbb-string\">\"UPS delay reached; poweroff=\"<\/span> + <span class=\"cbb-function\">str<\/span>(args.poweroff), flush=<span class=\"cbb-constant\">True<\/span>)\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">if<\/span> args.poweroff:\n<\/span><span class=\"cbb-line\">                subprocess.<span class=\"cbb-function\">run<\/span>(&#91;<span class=\"cbb-string\">\"\/usr\/bin\/systemctl\"<\/span>, <span class=\"cbb-string\">\"--no-block\"<\/span>, <span class=\"cbb-string\">\"poweroff\"<\/span>&#93;,\n<\/span><span class=\"cbb-line\">                               check=<span class=\"cbb-constant\">True<\/span>, timeout=<span class=\"cbb-number\">10<\/span>)\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-function\">monitor<\/span>(read_failed, args.delay, action)\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">if<\/span> __name__ == <span class=\"cbb-string\">\"__main__\"<\/span>:\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-function\">main<\/span>()<\/span><\/code><\/pre><\/figure>\n<p>Pierwszy stan jest odczytywany od razu, wi\u0119c zanik obecny ju\u017c przy starcie r\u00f3wnie\u017c uruchamia licznik. Zaobserwowany stan wysoki zeruje czas oczekiwania. Pomiar czasu korzysta z zegara monotonicznego, kt\u00f3ry mierzy up\u0142yw czasu bez skok\u00f3w wywo\u0142anych korekt\u0105 daty lub godziny systemowej. Odczyty dzieli oko\u0142o sekundy; kr\u00f3tkie zmiany pomi\u0119dzy odczytami mog\u0105 pozosta\u0107 niewykryte. Przyk\u0142ad nie dowodzi wi\u0119c nieprzerwanego zaniku i nie jest zabezpieczeniem czasu rzeczywistego.<\/p>\n<p>B\u0142\u0119dy odczytu i zaobserwowane przerwy w pr\u00f3bkowaniu przekraczaj\u0105ce pi\u0119\u0107 sekund ko\u0144cz\u0105 proces b\u0142\u0119dem. Ponowne uruchomienie zeruje licznik, dlatego powtarzaj\u0105ce si\u0119 awarie wymagaj\u0105 alarmu. Bez <code>--poweroff<\/code> program jedynie zapisuje osi\u0105gni\u0119cie progu w dzienniku i ko\u0144czy dzia\u0142anie. Ten tryb nadaje si\u0119 do pierwszego kontrolowanego sprawdzenia sygna\u0142u, ale nie zleca zamkni\u0119cia systemu.<\/p>\n<h2>5. Aktywacja us\u0142ugi po sprawdzeniu sygna\u0142u<\/h2>\n<p>Sprawdzony skrypt nale\u017cy zapisa\u0107 jako <code>\/usr\/local\/lib\/ups_watch.py<\/code>, a poni\u017csz\u0105 jednostk\u0119 jako <code>\/etc\/systemd\/system\/ups-watch.service<\/code>. Plik <code>\/etc\/ups-watch.conf<\/code> musi definiowa\u0107 <code>UPS_CHIP<\/code> ze sprawdzon\u0105 \u015bcie\u017ck\u0105 urz\u0105dzenia i <code>UPS_LINE<\/code> ze sprawdzonym offsetem. Zmiany skryptu i konfiguracji powinny wymaga\u0107 uprawnie\u0144 administracyjnych. Jednostka jawnie zawiera <code>--poweroff<\/code> i mo\u017ce wy\u0142\u0105czy\u0107 komputer.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"ini\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Config<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-ini\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-type\">&#91;Unit&#93;<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">Description<\/span>=UPS mains-failure monitor\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">StartLimitIntervalSec<\/span>=<span class=\"cbb-number\">60<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">StartLimitBurst<\/span>=<span class=\"cbb-number\">3<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-type\">&#91;Service&#93;<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">Type<\/span>=simple\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">EnvironmentFile<\/span>=\/etc\/ups-watch.conf\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">ExecStart<\/span>=\/usr\/bin\/python3 \/usr\/local\/lib\/ups_watch.py --chip <span class=\"cbb-variable\">${UPS_CHIP}<\/span> --line <span class=\"cbb-variable\">${UPS_LINE}<\/span> --delay 60 --poweroff\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">Restart<\/span>=on-failure\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">RestartSec<\/span>=<span class=\"cbb-number\">5<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-type\">&#91;Install&#93;<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">WantedBy<\/span>=multi-user.target<\/span><\/code><\/pre><\/figure>\n<p>Sprawdzenie sygna\u0142u bez opcji wy\u0142\u0105czenia poprzedza ponowne wczytanie konfiguracji systemd i \u015bwiadom\u0105 aktywacj\u0119 us\u0142ugi. Dodatkowe <code>After=multi-user.target<\/code> jest tutaj niew\u0142a\u015bciwe: wraz z do\u0142\u0105czeniem do tego targetu mo\u017ce utworzy\u0107 cykl kolejno\u015bci startu. Ograniczone restarty obs\u0142uguj\u0105 b\u0142\u0119dy przej\u015bciowe; trwale niedzia\u0142aj\u0105ca us\u0142uga wymaga osobnego alarmowania.<\/p>\n<h2>6. Wsp\u00f3lna pr\u00f3ba zamkni\u0119cia i powrotu do pracy<\/h2>\n<p><code>systemctl --no-block poweroff<\/code> zleca zamkni\u0119cie systemu. Wywo\u0142anie nie potwierdza zako\u0144czenia ani fizycznego od\u0142\u0105czenia 5 V. Uzgodnienie wy\u0142\u0105czenia pomi\u0119dzy UPS a systemem musi pozostawi\u0107 dostateczny czas. Ustawienia bootloadera zmniejszaj\u0105ce pob\u00f3r po zatrzymaniu nie zast\u0119puj\u0105 tego przebiegu.<\/p>\n<p><code>PSU_MAX_CURRENT=5000<\/code> r\u00f3wnie\u017c nie jest og\u00f3lnym ustawieniem UPS. Deklaracja wydajno\u015bci pr\u0105dowej nie tworzy zasilania zdolnego dostarczy\u0107 5 A. Zmiany limitu pr\u0105du wymagaj\u0105 odpowiednio udokumentowanej konfiguracji sprz\u0119towej.<\/p>\n<p>Pr\u00f3ba odbiorcza wymaga sprawdzonej mo\u017cliwo\u015bci odtworzenia systemu i kontrolowanego obci\u0105\u017cenia. Plan obejmuje kr\u00f3tk\u0105 i d\u0142ug\u0105 przerw\u0119, start bez sieci, niski stan akumulatora, kolejny zanik przed pe\u0142nym do\u0142adowaniem oraz powr\u00f3t sieci podczas zamykania i po zamkni\u0119ciu. Celowa praca produkcyjnego systemu plik\u00f3w a\u017c do zapadni\u0119cia napi\u0119cia nie jest potrzebna. Pozosta\u0142\u0105 energi\u0119 wyj\u015bciow\u0105 mo\u017cna zmierzy\u0107 osobno odpowiednim obci\u0105\u017ceniem testowym.<\/p>\n<p>Dzienniki poprzedniego uruchomienia wymagaj\u0105 dost\u0119pnej trwa\u0142ej pami\u0119ci. Brak wpis\u00f3w w <code>journalctl -b -1<\/code> nie dowodzi nag\u0142ej utraty zasilania; dzienniki przechowywane tylko w pami\u0119ci operacyjnej r\u00f3wnie\u017c znikaj\u0105. Logi, obserwacja zamkni\u0119cia i pomiar napi\u0119cia wyj\u015bciowego wzajemnie uzupe\u0142niaj\u0105 dowody.<\/p>\n<p>Starzenie zale\u017cy mi\u0119dzy innymi od chemii ogniwa, temperatury, stanu na\u0142adowania i u\u017cytkowania. Nie wynika st\u0105d sta\u0142e podwojenie trwa\u0142o\u015bci po dowolnym obni\u017ceniu napi\u0119cia \u0142adowania. Granice \u0142adowania i roz\u0142adowania musz\u0105 odpowiada\u0107 profilowi dopuszczonemu przez producenta. Powtarzane pr\u00f3by pojemno\u015bci i zamkni\u0119cia w odpowiednim planie konserwacji tworz\u0105 podstaw\u0119 do terminowej wymiany.<\/p>\n<div class=\"lw-faq\"><h2>Pytania i odpowiedzi<\/h2>\n<h3>Czy zatrzymane Pi uruchomi si\u0119 automatycznie po powrocie sieci?<\/h3><p>Niekoniecznie. Przy stale aktywnej szynie 5 V nie powstaje nowe zbocze w\u0142\u0105czenia zasilania. Niezawodny powr\u00f3t wymaga przewidzianego cyklu wy\u0142\u0105czenia i w\u0142\u0105czenia wyj\u015bcia albo zgodnego sterownika wybudzania. Powr\u00f3t sieci przed od\u0142\u0105czeniem wyj\u015bcia UPS i po od\u0142\u0105czeniu to osobne przypadki testowe.<\/p>\n<h3>Czy op\u00f3\u017anienie 60 sekund wystarcza jako ochrona?<\/h3><p>Tylko przy potwierdzonej energii na oczekiwanie i pe\u0142ne zamkni\u0119cie systemu. Prawie pusty akumulator mo\u017ce przesta\u0107 zasila\u0107 wcze\u015bniej. Uk\u0142ad ochronny, sygnalizacja stanu akumulatora i alarm awarii pozostaj\u0105 potrzebne.<\/p>\n<\/div>\n<div class=\"lw-quellen\"><h2>\u0179r\u00f3d\u0142a<\/h2><ul>\n<li><a href=\"https:\/\/www.raspberrypi.com\/documentation\/computers\/raspberry-pi.html\">Raspberry Pi: sprz\u0119t, GPIO i uk\u0142ad zasilania PMIC<\/a><\/li>\n<li><a href=\"https:\/\/www.raspberrypi.com\/documentation\/computers\/configuration.html\">Raspberry Pi: konfiguracja<\/a><\/li>\n<li><a href=\"https:\/\/raw.githubusercontent.com\/raspberrypi\/linux\/rpi-6.12.y\/arch\/arm\/boot\/dts\/overlays\/README\">Raspberry Pi: gpio-shutdown<\/a><\/li>\n<li><a href=\"https:\/\/libgpiod.readthedocs.io\/en\/v2.3.1\/python_line_settings.html\">libgpiod 2: LineSettings<\/a><\/li>\n<li><a href=\"https:\/\/libgpiod.readthedocs.io\/en\/v2.3.1\/python_misc.html\">libgpiod 2: request_lines<\/a><\/li>\n<li><a href=\"https:\/\/www.freedesktop.org\/software\/systemd\/man\/latest\/systemd.target.html\">systemd: kolejno\u015b\u0107 uruchamiania jednostek docelowych<\/a><\/li>\n<li><a href=\"https:\/\/www.freedesktop.org\/software\/systemd\/man\/latest\/journald.conf.html\">systemd: przechowywanie dziennik\u00f3w<\/a><\/li>\n<li><a href=\"https:\/\/www.analog.com\/en\/products\/max17048.html\">Analog Devices: MAX17048 \/ MAX17049<\/a><\/li>\n<li><a href=\"https:\/\/www.ti.com\/product\/INA219\">Texas Instruments: INA219<\/a><\/li>\n<li><a href=\"https:\/\/www.sandia.gov\/ess-ssl\/wp-content\/uploads\/2021\/03\/ESHB-Ch3_Lithium-Batteries_Preger.pdf\">Sandia: akumulatory litowo-jonowe<\/a><\/li>\n<\/ul><\/div>","protected":false},"excerpt":{"rendered":"<p>Dob\u00f3r UPS do Raspberry Pi wymaga pomiaru obci\u0105\u017cenia, u\u017cytecznej energii wyj\u015bciowej i rezerwy na zamkni\u0119cie systemu. Monitor GPIO pokazuje op\u00f3\u017anione wy\u0142\u0105czenie oraz ograniczenia dotycz\u0105ce akumulatora, b\u0142\u0119d\u00f3w i ponownego startu.<\/p>\n","protected":false},"author":1,"featured_media":23905,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[92634],"tags":[92220,92223,92238],"class_list":["post-12966","post","type-post","status-publish","format-standard","hentry","category-tutorials-pl-raspberry-pi-pl","tag-homelab-pl","tag-raspberry-pi-pl","tag-tutorial-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tutorial: Dob\u00f3r zasilacza UPS do Raspberry Pi i konfiguracja automatycznego wy\u0142\u0105czenia | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Pomiar rzeczywistego poboru mocy, przeliczenie pojemno\u015bci ogniw na czas pracy i czyste wy\u0142\u0105czenie, zanim pakiet osi\u0105gnie napi\u0119cie odci\u0119cia.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/tutorials-pl-raspberry-pi-pl\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tutorial: Dob\u00f3r zasilacza UPS do Raspberry Pi i konfiguracja automatycznego wy\u0142\u0105czenia | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Pomiar rzeczywistego poboru mocy, przeliczenie pojemno\u015bci ogniw na czas pracy i czyste wy\u0142\u0105czenie, zanim pakiet osi\u0105gnie napi\u0119cie odci\u0119cia.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/tutorials-pl-raspberry-pi-pl\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-11T16:25:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-26T12:26:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-12966-review-20261024-dark.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/raspberry-pi-pl\\\/tutorials-pl-raspberry-pi-pl\\\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/raspberry-pi-pl\\\/tutorials-pl-raspberry-pi-pl\\\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Tutorial: Dob\u00f3r zasilacza UPS do Raspberry Pi i konfiguracja automatycznego wy\u0142\u0105czenia\",\"datePublished\":\"2026-09-11T16:25:00+00:00\",\"dateModified\":\"2026-10-26T12:26:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/raspberry-pi-pl\\\/tutorials-pl-raspberry-pi-pl\\\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\\\/\"},\"wordCount\":1476,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/raspberry-pi-pl\\\/tutorials-pl-raspberry-pi-pl\\\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-12966-review-20261024-dark.png\",\"keywords\":[\"Homelab\",\"Raspberry Pi\",\"Tutorial\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/raspberry-pi-pl\\\/tutorials-pl-raspberry-pi-pl\\\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/raspberry-pi-pl\\\/tutorials-pl-raspberry-pi-pl\\\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/raspberry-pi-pl\\\/tutorials-pl-raspberry-pi-pl\\\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\\\/\",\"name\":\"Tutorial: Dob\u00f3r zasilacza UPS do Raspberry Pi i konfiguracja automatycznego wy\u0142\u0105czenia | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/raspberry-pi-pl\\\/tutorials-pl-raspberry-pi-pl\\\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/raspberry-pi-pl\\\/tutorials-pl-raspberry-pi-pl\\\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-12966-review-20261024-dark.png\",\"datePublished\":\"2026-09-11T16:25:00+00:00\",\"dateModified\":\"2026-10-26T12:26:23+00:00\",\"description\":\"Pomiar rzeczywistego poboru mocy, przeliczenie pojemno\u015bci ogniw na czas pracy i czyste wy\u0142\u0105czenie, zanim pakiet osi\u0105gnie napi\u0119cie odci\u0119cia.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/raspberry-pi-pl\\\/tutorials-pl-raspberry-pi-pl\\\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/raspberry-pi-pl\\\/tutorials-pl-raspberry-pi-pl\\\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/raspberry-pi-pl\\\/tutorials-pl-raspberry-pi-pl\\\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-12966-review-20261024-dark.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-12966-review-20261024-dark.png\",\"width\":1200,\"height\":630,\"caption\":\"Tutorial: Dob\u00f3r zasilacza UPS do Raspberry Pi i konfiguracja automatycznego wy\u0142\u0105czenia\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/raspberry-pi-pl\\\/tutorials-pl-raspberry-pi-pl\\\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorial: Dob\u00f3r zasilacza UPS do Raspberry Pi i konfiguracja automatycznego wy\u0142\u0105czenia\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tutorial: Dob\u00f3r zasilacza UPS do Raspberry Pi i konfiguracja automatycznego wy\u0142\u0105czenia | Lukas Wojcik","description":"Pomiar rzeczywistego poboru mocy, przeliczenie pojemno\u015bci ogniw na czas pracy i czyste wy\u0142\u0105czenie, zanim pakiet osi\u0105gnie napi\u0119cie odci\u0119cia.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/tutorials-pl-raspberry-pi-pl\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\/","og_locale":"en_US","og_type":"article","og_title":"Tutorial: Dob\u00f3r zasilacza UPS do Raspberry Pi i konfiguracja automatycznego wy\u0142\u0105czenia | Lukas Wojcik","og_description":"Pomiar rzeczywistego poboru mocy, przeliczenie pojemno\u015bci ogniw na czas pracy i czyste wy\u0142\u0105czenie, zanim pakiet osi\u0105gnie napi\u0119cie odci\u0119cia.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/tutorials-pl-raspberry-pi-pl\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-11T16:25:00+00:00","article_modified_time":"2026-10-26T12:26:23+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-12966-review-20261024-dark.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/tutorials-pl-raspberry-pi-pl\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/tutorials-pl-raspberry-pi-pl\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Tutorial: Dob\u00f3r zasilacza UPS do Raspberry Pi i konfiguracja automatycznego wy\u0142\u0105czenia","datePublished":"2026-09-11T16:25:00+00:00","dateModified":"2026-10-26T12:26:23+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/tutorials-pl-raspberry-pi-pl\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\/"},"wordCount":1476,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/tutorials-pl-raspberry-pi-pl\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-12966-review-20261024-dark.png","keywords":["Homelab","Raspberry Pi","Tutorial"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/tutorials-pl-raspberry-pi-pl\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/tutorials-pl-raspberry-pi-pl\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/tutorials-pl-raspberry-pi-pl\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\/","name":"Tutorial: Dob\u00f3r zasilacza UPS do Raspberry Pi i konfiguracja automatycznego wy\u0142\u0105czenia | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/tutorials-pl-raspberry-pi-pl\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/tutorials-pl-raspberry-pi-pl\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-12966-review-20261024-dark.png","datePublished":"2026-09-11T16:25:00+00:00","dateModified":"2026-10-26T12:26:23+00:00","description":"Pomiar rzeczywistego poboru mocy, przeliczenie pojemno\u015bci ogniw na czas pracy i czyste wy\u0142\u0105czenie, zanim pakiet osi\u0105gnie napi\u0119cie odci\u0119cia.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/tutorials-pl-raspberry-pi-pl\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/tutorials-pl-raspberry-pi-pl\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/tutorials-pl-raspberry-pi-pl\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-12966-review-20261024-dark.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-12966-review-20261024-dark.png","width":1200,"height":630,"caption":"Tutorial: Dob\u00f3r zasilacza UPS do Raspberry Pi i konfiguracja automatycznego wy\u0142\u0105czenia"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/raspberry-pi-pl\/tutorials-pl-raspberry-pi-pl\/tutorial-dobor-zasilacza-ups-do-raspberry-pi-i-konfiguracja-automatycznego-wylaczenia\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Tutorial: Dob\u00f3r zasilacza UPS do Raspberry Pi i konfiguracja automatycznego wy\u0142\u0105czenia"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/12966","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=12966"}],"version-history":[{"count":5,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/12966\/revisions"}],"predecessor-version":[{"id":27378,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/12966\/revisions\/27378"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/23905"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=12966"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=12966"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=12966"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}