<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on Szymon Krajewski</title>
    <link>https://szymonkrajewski.pl/pl/posts/</link>
    <description>Recent content in Posts on Szymon Krajewski</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>pl</language>
    <copyright>Copyright © 2017 - 2026 Szymon Krajewski</copyright>
    <lastBuildDate>Sat, 06 Dec 2025 00:00:00 +0000</lastBuildDate>
    <image>
      <url>https://szymonkrajewski.pl/about/avatar.jpg</url>
      <title>Szymon Krajewski</title>
      <link>https://szymonkrajewski.pl/</link>
      <width>144</width>
      <height>144</height>
    </image><atom:link href="https://szymonkrajewski.pl/pl/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Konfiguracja wielu sieci WiFi w ESPHome</title>
      <link>https://szymonkrajewski.pl/pl/multiple-wifi-networks-in-esphome/</link>
      <pubDate>Sat, 06 Dec 2025 00:00:00 +0000</pubDate>
      
      <guid>https://szymonkrajewski.pl/pl/multiple-wifi-networks-in-esphome/</guid>
      <description>&lt;p&gt;Moja obecna sieć domowa nadal jest daleka od tego, co uznałbym za stan docelowy. Oprócz głównego routera mam także wzmacniacz WiFi tworzący osobną sieć. Od czasu do czasu zmieniam lokalizację routera, a wiele moich urządzeń połączonych bezprzewodowo wymaga wtedy dodatkowej uwagi, często dlatego, że zapominam zaktualizować dane logowania do najbliższej sieci &lt;em&gt;przed&lt;/em&gt; przeniesieniem sprzętu. Tym razem było inaczej.&lt;/p&gt;
&lt;p&gt;Urządzenia oparte na ESPHome zwykle były najtrudniejszym przypadkiem. Aby zmienić konfigurację WiFi, trzeba podać nowe dane logowania, ponownie skompilować i wgrać firmware. Można to zrobić &lt;em&gt;over-the-air&lt;/em&gt;, ale ma się tylko jedną szansę. Jeśli zapomnisz zaktualizować konfigurację przed przeniesieniem punktu dostępowego (albo po prostu podasz złe hasło), czeka Cię wycieczka w celu znalezienia urządzenia, by wgrać firmware w stary sposób – przez kabel – jak robiłem to wiele razy.&lt;/p&gt;
&lt;p&gt;Ostatnio jednak miałem przebłysk, i sprawdziłem, czy &lt;a href=&#34;https://esphome.io/components/wifi/#connecting-to-multiple-networks&#34;&gt;ESPHome obsługuje wiele sieci WiFi w konfiguracji&lt;/a&gt;. Odpowiedź brzmi tak, obsługuje. Działa to dokładnie tak, jak się spodziewałem.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You can give ESPHome a number of WiFi networks to connect to. ESPHome will then attempt to connect to the one with the highest signal strength.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Co tłumaczymy jako:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Możesz podać ESPHome kilka sieci WiFi, do których ma się podłączyć. ESPHome spróbuje wtedy połączyć się z tą o najwyższej sile sygnału.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;W moim przypadku skończyło się na definicji dla mojej głównej sieci oraz sieci rozszerzonej&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;wifi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;networks&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;ssid&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;!&lt;span class=&#34;l&#34;&gt;secret wifi_ssid&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;password&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;!&lt;span class=&#34;l&#34;&gt;secret wifi_password&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;ssid&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;!&lt;span class=&#34;l&#34;&gt;secret wifi_ext_ssid&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;password&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;!&lt;span class=&#34;l&#34;&gt;secret wifi_ext_password&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Od tamtej pory skończył temat aktualizacji danych dostępowych.&lt;/p&gt;
&lt;p&gt;Wciąż szukam podobnego rozwiązania dla moich Raspberry Pi. Obecnie ręcznie zmieniam konfigurację sieci &lt;strong&gt;przed&lt;/strong&gt; przeniesieniem punktu dostępowego – co działa, o ile pamiętam, żeby zrobić to w &lt;strong&gt;odpowiedniej kolejności&lt;/strong&gt;.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Jak uruchomić Proxmox z USB przy użyciu GRUB</title>
      <link>https://szymonkrajewski.pl/pl/how-to-boot-proxmox-from-usb-using-grub/</link>
      <pubDate>Tue, 21 Oct 2025 00:00:00 +0000</pubDate>
      
      <guid>https://szymonkrajewski.pl/pl/how-to-boot-proxmox-from-usb-using-grub/</guid>
      <description>&lt;p&gt;Kiedy ostatnim razem byłem zmuszony zainstalować świeży system Linux na moim starym laptopie, miałem okazję dowiedzieć się, &lt;a href=&#34;https://szymonkrajewski.pl/how-to-boot-system-from-usb-using-grub/&#34;&gt;jak zmusić GRUB do uruchomienia systemu przy użyciu bootloadera znajdującego się na dysku USB&lt;/a&gt;. Ten mały trik oszczędził mi dziesiątki godzin – dopóki nie spróbowałem zrobić tego samego z obrazem Proxmox VE, gdzie mój sposób po prostu nie działał.&lt;/p&gt;
&lt;p&gt;Ostatecznie udało mi się to uruchomić. Oto krótka instrukcja – dla mnie i dla Ciebie.&lt;/p&gt;
&lt;h2 id=&#34;przygotowanie-usb-z-proxmox-ve&#34;&gt;Przygotowanie USB z Proxmox VE&lt;/h2&gt;
&lt;p&gt;Jeden z moich komputerów uparcie ignoruje kolejność urządzeń rozruchowych, więc zewnętrzne urządzenie USB zawsze ma niższy priorytet. Nie mogę po prostu włożyć bootowalnej płyty CD lub dysku USB i oczekiwać, że system uruchomi się automatycznie.&lt;/p&gt;
&lt;p&gt;Jeśli to czytasz, istnieje spora szansa, że masz ten sam problem i szukasz rozwiązania.&lt;/p&gt;
&lt;p&gt;Dla porządku – użyłem &lt;em&gt;macOS&lt;/em&gt; oraz &lt;em&gt;balenaEtcher&lt;/em&gt; do przygotowania dysku USB. Nie jestem pewien, czy ma to znaczenie, ale jeśli Twoje wyniki różnią się od moich, to może być przyczyną. Działam w oparciu o &lt;strong&gt;Proxmox VE 8.0&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Na macOS można zainstalować go przy użyciu Homebrew:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install --cask balenaetcher
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wybierz obraz ISO oraz docelowy dysk USB, a następnie pozwól oprogramowaniu zrobić resztę.&lt;/p&gt;
&lt;h2 id=&#34;zlokalizuj-dysk-usb-i-uruchom-system&#34;&gt;Zlokalizuj dysk USB i uruchom system&lt;/h2&gt;
&lt;p&gt;Po podłączeniu dysku USB uruchom ponownie komputer.&lt;/p&gt;
&lt;p&gt;Gdy pojawi się ekran GRUB, naciśnij &lt;code&gt;C&lt;/code&gt; lub &lt;code&gt;ESC&lt;/code&gt;, aby otworzyć konsolę GRUB. Zobaczysz wiersz poleceń &lt;code&gt;grub&amp;gt;&lt;/code&gt; oczekujący na dane wejściowe.&lt;/p&gt;
&lt;p&gt;Zacznij od wyświetlenia listy dostępnych dysków:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;grub&amp;gt; ls
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W moim przypadku wynik pokazał &lt;code&gt;(hd0)&lt;/code&gt; i &lt;code&gt;(hd1)&lt;/code&gt; z kilkoma partycjami. Aby sprawdzić jedną z nich, wpisz:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;grub&amp;gt; &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;root&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=(&lt;/span&gt;hd0,
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;hellip; i naciśnij &lt;code&gt;TAB&lt;/code&gt;, aby zobaczyć podpowiedzi.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;grub&amp;gt; &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;root&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=(&lt;/span&gt;hd0,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Possible partitions are:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Partition hd0,gpt1: No known filesystem detected - Partition start at 32KiB &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;...&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Partition hd0,gpt2: Filesystem &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt; fat, UUID 4238-7745 - Partition start at 302K1B &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;...&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Partition hd0,gpt3: Filesystem &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt; hfsplus - Label &lt;span class=&#34;s1&#34;&gt;&amp;#39;PVE&amp;#39;&lt;/span&gt; - Last modification &lt;span class=&#34;nb&#34;&gt;time&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;...&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Partition hd0,gpt4: No known filesystem detected - Partition start at 1534730KiB &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;...&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Partition hd0,apple1: No known filesystem detected - Partition start at 2KiB &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;...&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Partition hd0,apple2: No known filesystem detected - Partition start at 32KiB &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;...&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Partition hd0,apple3: Filesystem &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt; hfsplus - Label &lt;span class=&#34;s1&#34;&gt;&amp;#39;PVE&amp;#39;&lt;/span&gt; - Last modification &lt;span class=&#34;nb&#34;&gt;time&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;...&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Partition hd0,apple4: No known filesystem detected - Partition start at 1534730KiB &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;...&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Otrzymałem dość długą listę niezidentyfikowanych systemów plików, ale dwie z nich – &lt;code&gt;gpt3&lt;/code&gt; i &lt;code&gt;apple3&lt;/code&gt; – wyglądały obiecująco. Wybrałem &lt;code&gt;gpt3&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;grub&amp;gt; &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;root&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=(&lt;/span&gt;hd0,gpt3&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;W tym momencie dowiedziałem się, że nie mogłem użyć &lt;em&gt;chainload&lt;/em&gt; dla bootloadera, ponieważ nie było ścieżki do EFI, której spodziewałem się zobaczyć. Znalazłem jednak katalog &lt;code&gt;/boot&lt;/code&gt; z dwoma interesującymi plikami: &lt;em&gt;linux26&lt;/em&gt; i &lt;em&gt;initrd.img&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Aby uruchomić Proxmox, wpisałem następujące polecenia:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;grub&amp;gt; linux /boot/linux26 ro
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;grub&amp;gt; initrd /boot/initrd.img
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;grub&amp;gt; boot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;System rozpoczął uruchamianie, a kilka minut później na ekranie pojawił się instalator Proxmox VE.&lt;/p&gt;
&lt;h2 id=&#34;proxmox-uruchamia-się-w-trybie-bios&#34;&gt;Proxmox uruchamia się w trybie BIOS&lt;/h2&gt;
&lt;p&gt;Oto czego się nauczyłem:&lt;/p&gt;
&lt;p&gt;Polecenie &lt;code&gt;chainloader&lt;/code&gt; jest specyficzne dla EFI i nie zadziała w tym przypadku, ponieważ Proxmox nie zawiera bootloadera EFI. Zamiast tego GRUB musi załadować kernel bezpośrednio – co dokładnie robimy przy pomocy poleceń &lt;code&gt;linux&lt;/code&gt; i &lt;code&gt;initrd&lt;/code&gt;. Ostateczne &lt;code&gt;boot&lt;/code&gt; przekazuje kontrolę kernelowi – i po krótkiej chwili pojawia się instalator Proxmox VE.&lt;/p&gt;
&lt;p&gt;Jeśli masz problem z uruchomieniem obrazu opartego na EFI, sprawdź &lt;a href=&#34;https://szymonkrajewski.pl/how-to-boot-system-from-usb-using-grub/&#34;&gt;instrukcję z mojego innego artykułu&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Smart Home, po mojemu</title>
      <link>https://szymonkrajewski.pl/pl/smart-home-my-way/</link>
      <pubDate>Tue, 30 Sep 2025 00:00:00 +0000</pubDate>
      
      <guid>https://szymonkrajewski.pl/pl/smart-home-my-way/</guid>
      <description>&lt;p&gt;Kiedy ludzie pytają mnie o elementy mojego Smart Home, często spodziewają się czegoś bardzo zaawansowanego technologicznie. Tymczasem to co widzą, to zwykły dom, który po prostu można obserwować, kontrolować i który jest nieco wygodniejszy. Sztuczka? Ukryta warstwa, którą mogę budować, demolować i przebudowywać tak, jak tylko chcę.&lt;/p&gt;
&lt;h2 id=&#34;czym-jest-smart-home&#34;&gt;Czym jest smart home&lt;/h2&gt;
&lt;p&gt;Nie przepadam za terminem &amp;ldquo;Smart Home&amp;rdquo;. Nie jestem pewien, czy istnieje w ogóle oficjalna definicja, ale większość, które znalazłem, wspomina o &amp;ldquo;&lt;em&gt;zdalnym sterowaniu&lt;/em&gt;&amp;rdquo;, &amp;ldquo;&lt;em&gt;połączeniu z internetem&lt;/em&gt;&amp;rdquo; i &amp;ldquo;&lt;em&gt;automatyzacji&lt;/em&gt;&amp;rdquo;. Zbyt szerokie, zbyt niejasne.&lt;/p&gt;
&lt;p&gt;Wolę myśleć o smart home jako o domu, który jest:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Obserwowalny&lt;/strong&gt; – wiem, co się dzieje.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sterowalny&lt;/strong&gt; – mogę na niego wpływać.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ale skupienie się na tych dwóch czynnikach sprawia, że prawie każdy dom jest &amp;ldquo;smart&amp;rdquo;, o ile aktualnie przebywa w nim człowiek. Ludzie mogą przecież ręcznie kontrolować rzeczy, gdy jest to potrzebne.&lt;/p&gt;
&lt;p&gt;A co, jeśli zastąpimy człowieka automatyzacją, algorytmem lub AI? Wtedy potrzebujemy innego sposobu uzyskania dostępu do danych i kontroli – &lt;strong&gt;zdalnie&lt;/strong&gt;. I to wcale nie musi oznaczać &amp;ldquo;&lt;em&gt;przez Internet&lt;/em&gt;&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;brak-uzależnienia-od-jednego-dostawcy&#34;&gt;Brak uzależnienia od jednego dostawcy&lt;/h2&gt;
&lt;p&gt;Technologia pozwala nam robić imponujące rzeczy, ale ma jedną cechę, której osobiście nie mogę zignorować – starzeje się szybciej niż wszystko inne.&lt;/p&gt;
&lt;p&gt;Dlatego unikam polegania na jednym dostawcy, który obiecuje zbudować cały ekosystem Smart Home. Wierzę, że dla niektórych osób to działa i w pewnych przypadkach jest to najlepszy wybór dla tych, którzy chcą mieć &lt;em&gt;sterowalny&lt;/em&gt; dom. Ale wiem, że u mnie to się nie sprawdzi. Lubię majsterkować o wiele bardziej, niż pozwalają na to takie systemy, i &lt;strong&gt;chcę mieć wolność używania tego, czego tylko chcę&lt;/strong&gt; – tak jak zrobiłem to np. w przypadku &lt;a href=&#34;https://szymonkrajewski.pl/pl/esp-monitorowanie-wydajnosci-rekuperacji/&#34;&gt;monitorowania systemu rekuperacji&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Skonfigurowałem cały dom korzystając z &lt;a href=&#34;https://www.home-assistant.io/&#34;&gt;Home Assistant&lt;/a&gt;, otwartoźródłowej platformy smart home. W większości używam urządzeń, które są &lt;strong&gt;tanie, łatwe do modernizacji i przyjemne do zabawy&lt;/strong&gt;. Większość z nich komunikuje się przez Zigbee i Wi-Fi.&lt;/p&gt;
&lt;h2 id=&#34;ukryta-warstwa&#34;&gt;Ukryta warstwa&lt;/h2&gt;
&lt;p&gt;Niektóre nowoczesne domy wyglądają na &amp;ldquo;smart&amp;rdquo; od pierwszego wejrzenia: wszechobecne wyświetlacze, panele dotykowe, przyciemniane światła sterowane przez cicho nasłuchujący głośnik Google Home w rogu salonu.&lt;/p&gt;
&lt;p&gt;Moim celem było coś zupełnie przeciwnego. Chciałem stworzyć dom wyglądający standardowo, w którym &amp;ldquo;smart&amp;rdquo; elementy są starannie ukryte. To po prostu &lt;strong&gt;zwykły dom&lt;/strong&gt; – przy pierwszym, drugim, a nawet trzecim spojrzeniu.&lt;/p&gt;
&lt;p&gt;Lubię myśleć o tym jako o &lt;strong&gt;warstwie&lt;/strong&gt;. Czymś, co istnieje ponad (lub pod) rzeczami, które już mam. Mogę dodawać elementy do tej warstwy, mogę je usuwać, ale co najważniejsze – &lt;strong&gt;mogę usunąć wszystko, nie pozostawiając żadnych wizualnych zmian&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&#34;głupie-urządzenia-też-są-w-porządku&#34;&gt;Głupie urządzenia też są w porządku&lt;/h2&gt;
&lt;p&gt;Nie wszystko musi być podłączone do Internetu. Smart piekarnik jest bezużyteczny, gdy w środku nic nie ma. Poza tym nie zostawiam takich urządzeń pracujących bez nadzoru ani przynajmniej jednej osoby w domu.&lt;/p&gt;
&lt;p&gt;Smart lodówka? Nie kupuję tego. Smart zmywarka, która liczy tabletki? Zawsze trzymam zapasowe opakowanie w pralni.&lt;/p&gt;
&lt;p&gt;Za każdym razem, gdy jakieś urządzenie prosi mnie o hasło do Wi-Fi, pierwsze pytanie, jakie sobie zadaję, to: po co? W większości przypadków &lt;strong&gt;nie przynosi to żadnych realnych korzyści&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Czasami trudno jest kupić sprzęty bez &amp;ldquo;smart&amp;rdquo; funkcji (spróbuj kupić telewizor bez smart). Ale nie musisz ich włączać albo, przynajmniej, podłączać do Internetu.&lt;/p&gt;
&lt;h2 id=&#34;strategia-wyjścia&#34;&gt;Strategia wyjścia&lt;/h2&gt;
&lt;p&gt;Ponieważ wybrałem podejście &amp;ldquo;&lt;em&gt;brak uzależnienia od dostawcy&lt;/em&gt;&amp;rdquo;, straciłem możliwość zakupu jakiejkolwiek oficjalnej pomocy technicznej. Jestem jedynym opiekunem warstwy mojego smart home.&lt;/p&gt;
&lt;p&gt;Ale bycie jedynym opiekunem nie oznacza, że jestem jedynym użytkownikiem. &lt;strong&gt;Moja rodzina też z niego korzysta&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Nie ma nic bardziej irytującego niż rzeczy, które &lt;em&gt;czasami działają&lt;/em&gt;. Dlatego projektuję i buduję krytyczne części domu w określony sposób. Nawet jeśli Home Assistant przestanie działać, &lt;strong&gt;wszystko pozostaje sprawne&lt;/strong&gt;. Światła i rolety nadal sterowane są przyciskami, alarm jest nienaruszony, a smart gniazdka można włączać i wyłączać przyciskiem na obudowie.&lt;/p&gt;
&lt;p&gt;To, co zostaje utracone, to tylko&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;obserwowalność&lt;/strong&gt; – chyba że niektóre komponenty są zdecentralizowane,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sterowalność&lt;/strong&gt; – ta zdalna część.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Więc wyłączenie wszystkiego po prostu degraduje Smart Home do zwykłego Home. A na końcu dnia i tak wygląda jak zwykły dom.&lt;/p&gt;
&lt;p&gt;Takie podejście gwarantuje, że nawet jeśli mnie już nie będzie, aby aktualizować czy naprawiać rzeczy, moja żona nadal będzie mieszkać w tym samym przytulnym miejscu – może tylko bez kilku wygodnych automatyzacji.&lt;/p&gt;
&lt;h2 id=&#34;hobby-nie-projekt&#34;&gt;Hobby, nie projekt&lt;/h2&gt;
&lt;p&gt;Traktuję to, co zbudowałem, jako &lt;strong&gt;hobby&lt;/strong&gt;. Lubię majsterkować, dodawać komponenty, usuwać stare, testować automatyzacje, tworzyć sceny, analizować dane i tak dalej. Niektóre eksperymenty pozostają jako użyteczne automatyzacje, inne są wyłączane po kilku próbach – ale to jest właśnie to co lubię.&lt;/p&gt;
&lt;p&gt;Nie ma możliwości przewidzenia każdego potencjalnego przypadku użycia, ale w moim podejściu mogę dość łatwo rozszerzać i dostosowywać rzeczy do swoich potrzeb.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Automatyzacja jest najlepsza, gdy nawet jej nie zauważasz&lt;/strong&gt;. Czasami jednak ją zauważamy – zwłaszcza gdy &lt;em&gt;nie zadziała&lt;/em&gt;. To właśnie ten moment, w którym uśmiecham się do siebie, myśląc, że zawsze jest miejsce na poprawę.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Pisanie w erze AI</title>
      <link>https://szymonkrajewski.pl/pl/pisanie-w-erze-ai/</link>
      <pubDate>Sat, 16 Aug 2025 00:00:00 +0000</pubDate>
      
      <guid>https://szymonkrajewski.pl/pl/pisanie-w-erze-ai/</guid>
      <description>&lt;p&gt;Zacząłem pisać, zanim generatywna sztuczna inteligencja stała się popularna. Nawet prosty artykuł zawsze zajmował mi dużo czasu. Dzisiaj autorzy mogą tworzyć&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; i publikować &lt;strong&gt;wysokiej jakości treści&lt;/strong&gt; szybciej niż kiedykolwiek wcześniej, niemal bez wysiłku. Z drugiej strony odbiorcy nie muszą już przeszukiwać i przeglądać internetu w poszukiwaniu odpowiedzi – mogą wygenerować dla siebie gotowe treści na niemal dowolny temat.&lt;/p&gt;
&lt;p&gt;Jeśli każda odpowiedź może być natychmiast wygenerowana przez LLM, &lt;strong&gt;jaki sens ma pisanie w ogóle?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Dzisiejsi autorzy są &lt;strong&gt;dostawcami treści dla modeli AI&lt;/strong&gt;, które indeksują i przetwarzają każdy kawałek internetu. To, co dzieje się później z tymi danymi, jest dość proste – są one mieszane z innymi treściami, tworzonymi przez ludzi oraz przez AI, aby zasilić kolejną iterację modeli.&lt;/p&gt;
&lt;p&gt;Jako odbiorca, nie czytam tylko po to, by zdobyć wiedzę. Nadal używam RSS jako mojego głównego (choć nie jedynego) źródła informacji. Co subskrybuję? Głównie blogi. Pisane przez &lt;strong&gt;prawdziwych ludzi&lt;/strong&gt;, którzy tworzą &lt;strong&gt;własne treści&lt;/strong&gt; na tematy, które mnie interesują i które uważam za przydatne.&lt;/p&gt;
&lt;p&gt;Najbardziej cenię artykuły posiadające &lt;em&gt;emocjonalny i osobisty charakter&lt;/em&gt;. Artykuły typu problem-rozwiązanie, w których mogę &lt;em&gt;poczuć zmagania autora&lt;/em&gt; w poszukiwaniu odpowiedzi. Opinie o produkcie lub narzędziu z &lt;em&gt;czyjejś unikalnej perspektywy&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Przeglądam także różnego rodzaju agregatory wiadomości, takie jak Hacker News. Ale zamiast zagłębiać się w kolejne podstrony, szukam interesujących artykułów i staram się dowiedzieć więcej o ich autorach. &lt;em&gt;Kim oni są? Co ich interesuje? Czy ich inne teksty mogą być dla mnie interesujące?&lt;/em&gt; Jeśli tak, subskrybuję i czekam.&lt;/p&gt;
&lt;p&gt;Treści, które lubię najbardziej, mają wspólny mianownik. &lt;strong&gt;Jest za nimi człowiek&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pisanie w erze treści generowanych przez AI jest ważniejsze niż kiedykolwiek wcześniej&lt;/strong&gt; – ale natura tych treści powinna ewoluować, aby odzwierciedlać nową rzeczywistość.&lt;/p&gt;
&lt;p&gt;Kiedyś pisałem artykuły, które opisywały idee, lecz były oderwane od tego, kim jestem – byłem niewidzialny w większości akapitów. Ale skoro AI potrafi generować dowolne eksperckie treści, to znacznie bardziej wartościowe jest pokazanie siebie jako &lt;strong&gt;prawdziwej osoby&lt;/strong&gt; z &lt;strong&gt;prawdziwymi opiniami i przemyśleniami&lt;/strong&gt;. Może to być &lt;em&gt;mniej dopracowane&lt;/em&gt;, ale bardziej &lt;em&gt;&lt;strong&gt;ludzkie&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Kiedy zaczynałem prowadzić blog, miałem pomysł, że będę pisał dla siebie – aby &lt;em&gt;dać sobie szansę ponownego przemyślenia pewnych idei, utrwalenia wiedzy&lt;/em&gt;, a przy okazji może pomóc komuś jeszcze. Jednak przez lata uświadomiłem sobie, że skutkiem ubocznym nie powinno być samo &lt;em&gt;dzielenie się wiedzą&lt;/em&gt;, ale o pokazanie &lt;em&gt;&lt;em&gt;jak&lt;/em&gt; do niej doszedłem&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Wiedza już istnieje – &lt;strong&gt;AI może ją łatwo wygenerować&lt;/strong&gt;. Nawet przed AI informacji w Internecie było mnóstwo. Bardziej wartościowa jest jednak &lt;strong&gt;droga prowadząca do wniosków&lt;/strong&gt; – pokazanie procesu.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Pokazanie jak połączyć kropki.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Po prostu pisz, jakby nikt miał tego nie przeczytać – a wszystko będzie dobrze.&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Odłóżmy na bok wątpliwości związane z prawami autorskimi oraz prywatność. To ważne, ale to bitwa, której teraz nie chcę toczyć.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Monitorowanie wydajności rekuperacji z użyciem ESPHome i Home Assistant</title>
      <link>https://szymonkrajewski.pl/pl/esp-monitorowanie-wydajnosci-rekuperacji/</link>
      <pubDate>Sat, 26 Jul 2025 00:00:00 +0000</pubDate>
      
      <guid>https://szymonkrajewski.pl/pl/esp-monitorowanie-wydajnosci-rekuperacji/</guid>
      <description>&lt;p&gt;W moim domu posiadam mechaniczną wentylację z odzyskiem ciepła napędzaną przez urządzenie &lt;em&gt;Stiebel Eltron V-400&lt;/em&gt;. W uproszczeniu jest to &lt;em&gt;duży wentylator&lt;/em&gt; z kanałami nawiewnymi i wywiewnymi. Pomijając wbudowaną automatykę, jest to raczej proste urządzenie. Bez dedykowanej bramki (&lt;em&gt;która dodatkowo kosztuje&lt;/em&gt;) mogę jedynie sterować urządzeniem lub zobaczyć bieżące parametry na sterowniku, umieszczonym albo bezpośrednio na jednostce, albo w przedpokoju.&lt;/p&gt;
&lt;p&gt;Pomyślałem, że warto byłoby &lt;strong&gt;zbierać dane&lt;/strong&gt; z tego urządzenia, zarówno do analizy, jak i z czystej ciekawości. Korzystam z Home Assistant, który umożliwia prezentację dedykowanych wykresów i dashboardów do takich celów. Ponieważ niedawno eksperymentowałem z modułami ESP, w mojej głowie pojawił się pomysł na projekt.&lt;/p&gt;
&lt;h2 id=&#34;potrzebne-części&#34;&gt;Potrzebne części&lt;/h2&gt;
&lt;p&gt;W projekcie wykorzystałem czujniki temperatury Dallas &lt;strong&gt;DS18B20&lt;/strong&gt; oraz moduł &lt;strong&gt;Wemos D1&lt;/strong&gt; z wbudowanym &lt;strong&gt;ESP8266&lt;/strong&gt;. Wybrałem Wemos D1 ze względu na kompaktowy rozmiar, wyjście &lt;strong&gt;5V&lt;/strong&gt; i fakt, że akurat miałem jeden wolny pod ręką.&lt;/p&gt;
&lt;p&gt;Czujniki Dallas DS18B20 są dobrze znane z interfejsu &lt;strong&gt;1-wire&lt;/strong&gt;, pozwalającego podłączyć wiele czujników do &lt;strong&gt;jednej linii danych&lt;/strong&gt;. Jeśli zastanawiałeś się kiedyś, czy istnieją projekty, w których jest sens użyć &lt;em&gt;więcej niż jednego czujnika DS18B20 na jednej płytce&lt;/em&gt; – czytaj dalej.&lt;/p&gt;
&lt;p&gt;Miałem również &lt;strong&gt;6-żyłowy przewód LED&lt;/strong&gt;, który rozdzieliłem i wykorzystałem do podłączenia czujników do modułu. Do zasilania użyłem starej ładowarki do telefonu i kabla USB-C.&lt;/p&gt;
&lt;figure class=&#34;figure center&#34;&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;https://szymonkrajewski.pl/esp-heat-recovery-performance/01_parts_hu_799b66e7d573711c.webp 360w, https://szymonkrajewski.pl/esp-heat-recovery-performance/01_parts_hu_60fb0b764f1ad158.webp 640w, https://szymonkrajewski.pl/esp-heat-recovery-performance/01_parts_hu_3319950e155821d8.webp 960w, https://szymonkrajewski.pl/esp-heat-recovery-performance/01_parts_hu_363791ad27051cfd.webp 1200w, https://szymonkrajewski.pl/esp-heat-recovery-performance/01_parts_hu_d947448595a18314.webp 1280w&#34; sizes=&#34;(min-width: 900px) 78ch, 100vw&#34; /&gt;&lt;img
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          src=&#34;https://szymonkrajewski.pl/esp-heat-recovery-performance/01_parts.jpeg&#34;
          srcset=&#34;https://szymonkrajewski.pl/esp-heat-recovery-performance/01_parts_hu_616588555cadac33.jpeg 360w, https://szymonkrajewski.pl/esp-heat-recovery-performance/01_parts_hu_8d7057fcd667d39e.jpeg 640w, https://szymonkrajewski.pl/esp-heat-recovery-performance/01_parts_hu_521b3975982581f7.jpeg 960w, https://szymonkrajewski.pl/esp-heat-recovery-performance/01_parts_hu_2dde58bf139997fe.jpeg 1200w, https://szymonkrajewski.pl/esp-heat-recovery-performance/01_parts_hu_fe8b55b6ee02b4b3.jpeg 1280w&#34;
          sizes=&#34;(min-width: 900px) 78ch, 100vw&#34;
          width=&#34;1280&#34;
          height=&#34;960&#34;
           alt=&#34;Moduł ESP8266 Wemos D1, czujniki DS18B20 i piny&#34; 
          
          
        /&gt;
      &lt;/picture&gt;&lt;figcaption class=&#34;center&#34; &gt;
      Najważniejsze elementy: moduł Wemos D1 z ESP8266 i 5 czujników DS18B20
    &lt;/figcaption&gt;&lt;/figure&gt;

&lt;h2 id=&#34;plan&#34;&gt;Plan&lt;/h2&gt;
&lt;p&gt;Urządzenie rekuperacyjne ma cztery kanały powietrzne – &lt;strong&gt;dwie pary&lt;/strong&gt; kanałów &lt;strong&gt;nawiewnych&lt;/strong&gt; i &lt;strong&gt;wywiewnych&lt;/strong&gt;. Jedna para obsługuje wymianę powietrza z zewnątrz, druga cyrkuluje powietrze wewnątrz domu. Układ przepływu powietrza wygląda następująco:&lt;/p&gt;
&lt;figure class=&#34;figure center invertible&#34;&gt;&lt;picture&gt;&lt;img
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          src=&#34;https://szymonkrajewski.pl/esp-heat-recovery-performance/02_schema_pipes_air.png&#34;
          srcset=&#34;https://szymonkrajewski.pl/esp-heat-recovery-performance/02_schema_pipes_air_hu_99a63804b03fe951.png 360w, https://szymonkrajewski.pl/esp-heat-recovery-performance/02_schema_pipes_air_hu_9b433dd32bd9d88e.png 640w, https://szymonkrajewski.pl/esp-heat-recovery-performance/02_schema_pipes_air_hu_36690dc856318d61.png 960w, https://szymonkrajewski.pl/esp-heat-recovery-performance/02_schema_pipes_air_hu_a923bf076053ce8c.png 1200w, https://szymonkrajewski.pl/esp-heat-recovery-performance/02_schema_pipes_air_hu_7ffebe372c0ba1d6.png 1559w&#34;
          sizes=&#34;(min-width: 900px) 78ch, 100vw&#34;
          width=&#34;1559&#34;
          height=&#34;1041&#34;
           alt=&#34;Schemat przepływu powietrza Stiebel Eltron V-400&#34; 
          
          
        /&gt;
      &lt;/picture&gt;&lt;figcaption class=&#34;center&#34; &gt;
      Schemat kanałów przepływu powietrza w urządzeniu Stiebel Eltron V-400
    &lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Spodziewałem się, że powietrze w tych kanałach będzie miało różne temperatury. Wewnątrz każdego z nich umieściłem po jednym czujniku DS18B20. Dodałem także dodatkowy czujnik, mierzący temperaturę na strychu, gdzie zainstalowane jest urządzenie.&lt;/p&gt;
&lt;figure class=&#34;figure center invertible&#34;&gt;&lt;picture&gt;&lt;img
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          src=&#34;https://szymonkrajewski.pl/esp-heat-recovery-performance/03_schema_pipes_sensors.png&#34;
          srcset=&#34;https://szymonkrajewski.pl/esp-heat-recovery-performance/03_schema_pipes_sensors_hu_5857d6e37e03b2d8.png 360w, https://szymonkrajewski.pl/esp-heat-recovery-performance/03_schema_pipes_sensors_hu_2435b1214fce6f95.png 640w, https://szymonkrajewski.pl/esp-heat-recovery-performance/03_schema_pipes_sensors_hu_380fd3550073b43.png 960w, https://szymonkrajewski.pl/esp-heat-recovery-performance/03_schema_pipes_sensors_hu_4faa14be93424d42.png 1130w&#34;
          sizes=&#34;(min-width: 900px) 78ch, 100vw&#34;
          width=&#34;1130&#34;
          height=&#34;1138&#34;
           alt=&#34;Schemat rozmieszczenia czujników DS18B20 w kanałach urządzenia Stiebel Eltron V-400&#34; 
          
          
        /&gt;
      &lt;/picture&gt;&lt;figcaption class=&#34;center&#34; &gt;
      Schemat rozmieszczenia czujników DS18B20 w kanałach urządzenia Stiebel Eltron V-400
    &lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Jak wspominałem wcześniej, DS18B20 używają interfejsu 1-wire, więc wszystkie czujniki mogą współdzielić jedną linię danych. Zamiast podłączać czujniki szeregowo, zastosowałem &lt;strong&gt;topologię gwiazdy&lt;/strong&gt;, gdzie każdy czujnik ma swój własny przewód, ale współdzieli wspólny pin danych.&lt;/p&gt;
&lt;h2 id=&#34;przygotowanie&#34;&gt;Przygotowanie&lt;/h2&gt;
&lt;p&gt;Najpierw – czujniki. Lutowanie pierwszego było przyjemnością, ale każdy kolejny stawał się coraz bardziej &lt;em&gt;monotonny&lt;/em&gt;. Każdy czujnik przylutowałem do przewodu o długości &lt;strong&gt;około pół metra&lt;/strong&gt;.&lt;/p&gt;
&lt;figure class=&#34;figure center&#34;&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;https://szymonkrajewski.pl/esp-heat-recovery-performance/04_prep_wires_hu_89f0d954bbf6a94f.webp 360w, https://szymonkrajewski.pl/esp-heat-recovery-performance/04_prep_wires_hu_752cb1802d581656.webp 640w, https://szymonkrajewski.pl/esp-heat-recovery-performance/04_prep_wires_hu_ce9a57a6c9d0ae09.webp 960w, https://szymonkrajewski.pl/esp-heat-recovery-performance/04_prep_wires_hu_b1f7733b628aaa9e.webp 1200w, https://szymonkrajewski.pl/esp-heat-recovery-performance/04_prep_wires_hu_66f03c10aeb90286.webp 1280w&#34; sizes=&#34;(min-width: 900px) 78ch, 100vw&#34; /&gt;&lt;img
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          src=&#34;https://szymonkrajewski.pl/esp-heat-recovery-performance/04_prep_wires.jpeg&#34;
          srcset=&#34;https://szymonkrajewski.pl/esp-heat-recovery-performance/04_prep_wires_hu_48722f5ca3e57b13.jpeg 360w, https://szymonkrajewski.pl/esp-heat-recovery-performance/04_prep_wires_hu_e451491a1cfe3ed8.jpeg 640w, https://szymonkrajewski.pl/esp-heat-recovery-performance/04_prep_wires_hu_66b4626232a91077.jpeg 960w, https://szymonkrajewski.pl/esp-heat-recovery-performance/04_prep_wires_hu_2b489ad170dccaa0.jpeg 1200w, https://szymonkrajewski.pl/esp-heat-recovery-performance/04_prep_wires_hu_5c8e0f3f6a98bc4d.jpeg 1280w&#34;
          sizes=&#34;(min-width: 900px) 78ch, 100vw&#34;
          width=&#34;1280&#34;
          height=&#34;960&#34;
           alt=&#34;Przewody przygotowane do lutowania z czujnikami DS18B20&#34; 
          
          
        /&gt;
      &lt;/picture&gt;&lt;figcaption class=&#34;center&#34; &gt;
      Przewody przygotowane do lutowania z czujnikami DS18B20
    &lt;/figcaption&gt;&lt;/figure&gt;

&lt;figure class=&#34;figure center&#34;&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;https://szymonkrajewski.pl/esp-heat-recovery-performance/05_prep_soldering_hu_561206786d7614da.webp 360w, https://szymonkrajewski.pl/esp-heat-recovery-performance/05_prep_soldering_hu_11545d43862544aa.webp 640w, https://szymonkrajewski.pl/esp-heat-recovery-performance/05_prep_soldering_hu_70e1e65a0e8fb92e.webp 960w, https://szymonkrajewski.pl/esp-heat-recovery-performance/05_prep_soldering_hu_89b4dae15051d494.webp 1200w, https://szymonkrajewski.pl/esp-heat-recovery-performance/05_prep_soldering_hu_34d7939fe0d186f9.webp 1280w&#34; sizes=&#34;(min-width: 900px) 78ch, 100vw&#34; /&gt;&lt;img
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          src=&#34;https://szymonkrajewski.pl/esp-heat-recovery-performance/05_prep_soldering.jpeg&#34;
          srcset=&#34;https://szymonkrajewski.pl/esp-heat-recovery-performance/05_prep_soldering_hu_f8f0f4245ff058d1.jpeg 360w, https://szymonkrajewski.pl/esp-heat-recovery-performance/05_prep_soldering_hu_dea43ec8231debe4.jpeg 640w, https://szymonkrajewski.pl/esp-heat-recovery-performance/05_prep_soldering_hu_e1e66854457f0e16.jpeg 960w, https://szymonkrajewski.pl/esp-heat-recovery-performance/05_prep_soldering_hu_54c8923dd1f2c8d2.jpeg 1200w, https://szymonkrajewski.pl/esp-heat-recovery-performance/05_prep_soldering_hu_5d62578189796b22.jpeg 1280w&#34;
          sizes=&#34;(min-width: 900px) 78ch, 100vw&#34;
          width=&#34;1280&#34;
          height=&#34;960&#34;
           alt=&#34;Czujnik DS18B20 z przylutowanymi przewodami&#34; 
          
          
        /&gt;
      &lt;/picture&gt;&lt;figcaption class=&#34;center&#34; &gt;
      Czujnik DS18B20 z przylutowanymi przewodami
    &lt;/figcaption&gt;&lt;/figure&gt;

&lt;figure class=&#34;figure center&#34;&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;https://szymonkrajewski.pl/esp-heat-recovery-performance/06_prep_securing_hu_9de0209d33bae570.webp 360w, https://szymonkrajewski.pl/esp-heat-recovery-performance/06_prep_securing_hu_64dee8f8c2c3c414.webp 640w, https://szymonkrajewski.pl/esp-heat-recovery-performance/06_prep_securing_hu_8c70aaf239117ab3.webp 960w&#34; sizes=&#34;(min-width: 900px) 78ch, 100vw&#34; /&gt;&lt;img
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          src=&#34;https://szymonkrajewski.pl/esp-heat-recovery-performance/06_prep_securing.jpeg&#34;
          srcset=&#34;https://szymonkrajewski.pl/esp-heat-recovery-performance/06_prep_securing_hu_5d3af3c4ae4bf665.jpeg 360w, https://szymonkrajewski.pl/esp-heat-recovery-performance/06_prep_securing_hu_6c8f4a0e7639ffc6.jpeg 640w, https://szymonkrajewski.pl/esp-heat-recovery-performance/06_prep_securing_hu_3cdefa0dbe644094.jpeg 960w&#34;
          sizes=&#34;(min-width: 900px) 78ch, 100vw&#34;
          width=&#34;960&#34;
          height=&#34;1280&#34;
           alt=&#34;Czujnik DS18B20 z przylutowanymi przewodami i zabezpieczonymi połączeniami&#34; 
          
          
        /&gt;
      &lt;/picture&gt;&lt;figcaption class=&#34;center&#34; &gt;
      Czujnik DS18B20 z przylutowanymi przewodami i zabezpieczonymi połączeniami
    &lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Chciałem wszystko podłączyć do płytki prototypowej, jednak brakowało mi zaciskarki Dupont do przygotowania odpowiednich pinów. Ostatecznie użyłem złączek Wago.&lt;/p&gt;
&lt;p&gt;Linia danych została podłączona do pinu &lt;strong&gt;D13&lt;/strong&gt; (&lt;em&gt;GPIO13&lt;/em&gt;) na Wemos D1.&lt;/p&gt;
&lt;figure class=&#34;figure center&#34;&gt;&lt;picture&gt;&lt;source type=&#34;image/webp&#34; srcset=&#34;https://szymonkrajewski.pl/esp-heat-recovery-performance/07_breadcrumb_hu_22522d15a9bdbf74.webp 360w, https://szymonkrajewski.pl/esp-heat-recovery-performance/07_breadcrumb_hu_bd8144235e17d01a.webp 640w, https://szymonkrajewski.pl/esp-heat-recovery-performance/07_breadcrumb_hu_b585119db63f0e81.webp 951w&#34; sizes=&#34;(min-width: 900px) 78ch, 100vw&#34; /&gt;&lt;img
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          src=&#34;https://szymonkrajewski.pl/esp-heat-recovery-performance/07_breadcrumb.jpeg&#34;
          srcset=&#34;https://szymonkrajewski.pl/esp-heat-recovery-performance/07_breadcrumb_hu_e26374eeaeaaf82e.jpeg 360w, https://szymonkrajewski.pl/esp-heat-recovery-performance/07_breadcrumb_hu_64dad6c7405783ec.jpeg 640w, https://szymonkrajewski.pl/esp-heat-recovery-performance/07_breadcrumb_hu_d1ef0ced5eed2b81.jpeg 951w&#34;
          sizes=&#34;(min-width: 900px) 78ch, 100vw&#34;
          width=&#34;951&#34;
          height=&#34;966&#34;
           alt=&#34;ESP8266 Wemos D1 z czujnikami DS18B20 połączonymi przez złączki Wago na płytce prototypowej&#34; 
          
          
        /&gt;
      &lt;/picture&gt;&lt;figcaption class=&#34;center&#34; &gt;
      ESP8266 Wemos D1 z czujnikami DS18B20 połączonymi przez złączki Wago na płytce prototypowej
    &lt;/figcaption&gt;&lt;/figure&gt;

&lt;h2 id=&#34;oprogramowanie&#34;&gt;Oprogramowanie&lt;/h2&gt;
&lt;p&gt;Nie pisałem firmware’u ESP samodzielnie. Zamiast tego skorzystałem z &lt;strong&gt;ESPHome&lt;/strong&gt;, który świetnie integruje się z Home Assistant.&lt;/p&gt;
&lt;p&gt;Konfiguracja ESP przez ESPHome była jedną z najbardziej &lt;em&gt;magicznych rzeczy&lt;/em&gt;, jakie robiłem. Chociaż lubię pisać oprogramowanie samemu od podstaw, możliwość generowania firmware’u z pliku &lt;strong&gt;YAML&lt;/strong&gt; jest fantastyczna.&lt;/p&gt;
&lt;h3 id=&#34;identyfikacja-czujników&#34;&gt;Identyfikacja czujników&lt;/h3&gt;
&lt;p&gt;Rozpocząłem od podstawowego projektu ESPHome, konfigurując WiFi i protokół &lt;code&gt;one_wire&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;one_wire&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;gpio&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;pin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;GPIO13&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Po wgraniu firmware’u ESP wypisał adresy podłączonych czujników.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[13:47:40][C][gpio.one_wire:021]:   Pin: GPIO13
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[13:47:40][C][gpio.one_wire:080]:   Found devices:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[13:47:40][C][gpio.one_wire:082]:     0x48e2a7bc12fa3651 (DS18B20)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[13:47:40][C][gpio.one_wire:082]:     0xc903deab6719b425 (DS18B20)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[13:47:40][C][gpio.one_wire:082]:     0x1f64b28d4ca713ff (DS18B20)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[13:47:40][C][gpio.one_wire:082]:     0xa82fbac2e19d54e7 (DS18B20)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[13:47:40][C][gpio.one_wire:082]:     0x702c19f8ab65e038 (DS18B20)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Wszystkie moje czujniki były widoczne, ale pojawił się jeden problem. Chciałem poprawnie nazwać każdy z czujników, lecz nie wiedziałem, który adres przypisany jest do którego z nich. Na szczęście czujniki są bardzo czułe, więc zarejestrowałem je wszystkie, przypisując im nazwy. Następnie przez dotyk, &lt;strong&gt;podgrzewałem&lt;/strong&gt; konkretny czujnik i obserwowałem, który odczyt temperatury wzrósł.&lt;/p&gt;
&lt;p&gt;To by wystarczyło, ale z racji tego, że postanowiłem użyć przewodów w różnych kolorach dla temperatur nawiewu i wywiewu, musiałem odpowiednio zaktualizować nazwy. Ostatecznie lista wyglądała następująco:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;sensor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;dallas_temp&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;temp_inner_inflow&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;address&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0x48e2a7bc12fa3651&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;temp_inner_inflow&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;update_interval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;60s &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;dallas_temp&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;temp_inner_outflow&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;address&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0xc903deab6719b425&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;temp_inner_outflow&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;update_interval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;60s&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;dallas_temp&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;temp_outer_inflow&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;address&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0x1f64b28d4ca713ff&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;temp_outer_inflow&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;update_interval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;60s&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;dallas_temp&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;address&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0xa82fbac2e19d54e7&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;temp_attic&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;update_interval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;60s&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;dallas_temp&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;address&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0x702c19f8ab65e038&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;temp_outer_outflow&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;update_interval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;60s&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;sprawność-temperaturowa&#34;&gt;Sprawność temperaturowa&lt;/h3&gt;
&lt;p&gt;Mając wszystkie temperatury, skonfigurowałem czujnik wyliczający &lt;em&gt;sprawność temperaturową&lt;/em&gt; wymiennika ciepła:&lt;/p&gt;
&lt;p&gt;$$
\eta = \frac{T_2 - T_1}{T_3 - T_1} \times 100%
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$T_1$ – temperatura powietrza zewnętrznego przed wymiennikiem ciepła&lt;/li&gt;
&lt;li&gt;$T_2$ – temperatura powietrza nawiewanego za wymiennikiem ciepła&lt;/li&gt;
&lt;li&gt;$T_3$ – temperatura powietrza wywiewanego z pomieszczeń&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;W ESPHome wygląda to następująco:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;sensor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;platform&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;template&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;efficiency&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;filters&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;nt&#34;&gt;round&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;unit_of_measurement&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;%&amp;#39;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;state_class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;measurement&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;accuracy_decimals&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;lambda&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;|-&lt;/span&gt;&lt;span class=&#34;sd&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;      float t1 = id(temp_outer_inflow).state;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;      float t2 = id(temp_inner_inflow).state;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;      float t3 = id(temp_inner_outflow).state;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;      float eff = (t2 - t1) / (t3 - t1);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sd&#34;&gt;      return eff * 100;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;update_interval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;60s&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mogłem zrobić to samo, korzystając z sensora szablonowego w Home Assistant. Jednak wykonanie tego bezpośrednio na ESP pozwoliło mi &lt;strong&gt;odciążyć&lt;/strong&gt; główną instancję i przenieść obliczenia &lt;strong&gt;bliżej źródła danych&lt;/strong&gt;. Dane są już dostępne w module, więc może ono udostępniać wstępnie przeliczoną wartość jako część swojego API.&lt;/p&gt;
&lt;h2 id=&#34;wdrożenie&#34;&gt;Wdrożenie&lt;/h2&gt;
&lt;p&gt;Początkowe wdrożenie było &lt;em&gt;nieco inne&lt;/em&gt; niż tradycyjny proces rozwoju oprogramowania. Musiałem wejść na strych, ostrożnie umieścić wszystkie czujniki w przewodach powietrznych zgodnie z planem i uruchomić płytkę Wemos D1.&lt;/p&gt;
&lt;p&gt;Gdy wszystko znalazło się na swoim miejscu, przeszedłem do konfiguracji w Home Assistant.&lt;/p&gt;
&lt;h2 id=&#34;dashboard-home-assistant&#34;&gt;Dashboard Home Assistant&lt;/h2&gt;
&lt;p&gt;Ponieważ integrację ESPHome z Home Assistant miałem już gotową, nowe urządzenie zostało &lt;strong&gt;automatycznie wykryte&lt;/strong&gt;, a wszystkie udostępniane encje zostały zarejestrowane. Dopasowałem ich nazwy i przygotowałem &lt;strong&gt;dashboard&lt;/strong&gt;, aby mieć szybki przegląd pracy mojej jednostki wentylacyjnej.&lt;/p&gt;
&lt;figure class=&#34;figure center&#34;&gt;&lt;picture&gt;&lt;img
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          src=&#34;https://szymonkrajewski.pl/esp-heat-recovery-performance/08_dashboard_preview.png&#34;
          srcset=&#34;https://szymonkrajewski.pl/esp-heat-recovery-performance/08_dashboard_preview_hu_8573be585107496.png 360w, https://szymonkrajewski.pl/esp-heat-recovery-performance/08_dashboard_preview_hu_83fff82c8fd02e4.png 640w, https://szymonkrajewski.pl/esp-heat-recovery-performance/08_dashboard_preview_hu_afc7388d663b6795.png 960w, https://szymonkrajewski.pl/esp-heat-recovery-performance/08_dashboard_preview_hu_dec8000549d2e1bb.png 1200w, https://szymonkrajewski.pl/esp-heat-recovery-performance/08_dashboard_preview_hu_62775fc0b00f239a.png 1592w&#34;
          sizes=&#34;(min-width: 900px) 78ch, 100vw&#34;
          width=&#34;1592&#34;
          height=&#34;1052&#34;
           alt=&#34;Dedykowany dashboard Home Assistant pokazujący temperaturę z każdego czujnika&#34; 
          
          
        /&gt;
      &lt;/picture&gt;&lt;figcaption class=&#34;center&#34; &gt;
      Obraz pokazuje niską wydajność oraz temperatury, które nie wyglądają dobrze pod kątem wymiany ciepła, ale bez obaw – jednostka pracowała w tym czasie w trybie &lt;em&gt;bypass&lt;/em&gt;. Udostępnię lepszy obrazek, gdy zrobi się chłodniej.
    &lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Nie będę tutaj pokazywał konfiguracji krok po kroku, ale jeśli uważasz, że byłoby to dla Ciebie przydatne, po prostu &lt;a href=&#34;https://szymonkrajewski.pl/contact/&#34;&gt;napisz do mnie&lt;/a&gt;. Chętnie podzielę się szczegółami.&lt;/p&gt;
&lt;h2 id=&#34;końcowe-przemyślenia&#34;&gt;Końcowe przemyślenia&lt;/h2&gt;
&lt;p&gt;Ten zestaw działa &lt;strong&gt;bez zarzutu&lt;/strong&gt; już od pół roku. W następnej iteracji zamierzam umieścić ESP w dedykowanej obudowie i zastąpić złączki Wago. Ale kiedy już wszystko działa, potrzeba dalszych ulepszeń okazuje się mniejsza, niż się spodziewałem.
Mam nadzieję, że artykł był dla Ciebie przydatny. Dzięki za przeczytanie!&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>O obserwowaniu w Social Mediach</title>
      <link>https://szymonkrajewski.pl/pl/following/</link>
      <pubDate>Mon, 10 Aug 2020 00:00:00 +0000</pubDate>
      
      <guid>https://szymonkrajewski.pl/pl/following/</guid>
      <description>&lt;p&gt;Problem z Social Mediami leży w ich &lt;em&gt;społecznej&lt;/em&gt; części, w której to wszyscy traktujemy siebie wzajemnie jak przyjaciół. Niektórzy biorą to bardzo poważnie i udostępniają niemalże wszystko i wszystkim – w tym ludziom, których to średnio interesuje. Tak długo jak autor jest świadom swoich działań i konsekwencji lub po prostu czerpie z tego przyjemność – jest OK. Problem występuje jednak często po drugiej stronie, ponieważ nie każdy jest zainteresowany szczegółami z życia innych, poglądami politycznymi lub religijnymi, czy innymi rzeczami, którzy &lt;em&gt;znajomi&lt;/em&gt; dosyć aktywnie udostępniają. Dlaczego więc ludzie pozwalają na to, aby te wszystkie niechciane treści do nich docierały? Odpowiedzią jest &lt;em&gt;przyjaźń&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;nie-myl-znajomości-z-obserwowaniem&#34;&gt;Nie myl znajomości z obserwowaniem&lt;/h2&gt;
&lt;p&gt;Za każdym razem kiedy dodajemy kogoś do znajomych na Facebook&amp;rsquo;u, obserwujemy kogoś na Twitterze lub łączymy się z kimś na LinkedIn, zaczynamy otrzymywać aktualizacje od tej osoby. Tym samym pozwalamy, aby inni ludzie wpływali na rodzaj treści jakie konsumujemy i to bez większego zastanowienia co do ich jakości. Wszystkie te posty to kolejny strumień informacji do przetworzenia, ale można sobie z nim poradzić w dość prosty sposób. Aby nie zwariować w tym społecznościowym świecie trzymam się jednej prostej zasady, która po angielsku brzmi: &lt;strong&gt;following does not mean friendship&lt;/strong&gt;, co można tłumaczyć jako &lt;em&gt;obserwowanie nie oznacza jednocześnie przyjaźni&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Otóż to. Obserwowanie kogoś nie oznacza od razu przyjaźni (często też znajomości). Obserwacja (ang. observing, following) oznacza, że widzimy wszelkie aktualizacje od osoby, którą obserwujemy. Przyjaźń z kolei jest czymś głębszym, czego nawet nie będę próbować definiować. Istnieje ona poza mediami społecznościowymi.&lt;/p&gt;
&lt;p&gt;Pozwól, że podam prosty przykład.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Możesz nie być moim przyjacielem ani znajomym, ale obserwuje Cię, ponieważ publikujesz wartościowe treści, które mi się podobają.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Możesz być moim przyjacielem lub znajomym, ale nie obserwuje Cię, ponieważ to co publikujesz nie pasuje się do moich obecnych zainteresowań.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jeżeli jesteś moim znajomym i Cię nie obserwuje, nie oznacza to, że Cię nie lubię. Z drugiej strony, jeżeli ledwie mnie kojarzysz (i vice versa) ale Cię obserwuje, nie oznacza to, że od razu jesteśmy przyjaciółmi – po prostu podobają mi się treści, które udostępniasz.&lt;/p&gt;
&lt;h2 id=&#34;bądź-wybiórczy&#34;&gt;Bądź wybiórczy&lt;/h2&gt;
&lt;p&gt;Możliwość wybierania czyje treści do nas docierają jest w zasięgu naszych rąk. Mimo tego, ludzie niezbyt chętnie przestają obserwować swoich znajomych. Przyczyną może być FOMO&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;em&gt;(lęk przed tym, że coś nas ominie)&lt;/em&gt;, lub po prostu dlatego, że jest to emocjonalnie trudne. Kiedy tylko zdasz sobie sprawę, że obserwowanie nie oznacza jednocześnie przyjaźni, będzie Ci dużo łatwiej poradzić sobie z tą &lt;em&gt;rzekomą stratą&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Bycie wybiórczym w stosunku do informacji które odbierasz, jest o wiele bardziej istotne niż myślisz. Po pierwsze, ludzie produkują więcej treści niż kiedykolwiek każdy z nas zdoła skonsumować, dlatego też istotne jest, aby mądrze wybierać przy czym spędzamy czas. Po drugie, wszystko co czytasz, słuchasz, oglądasz, każdy news czy status od osoby, którą obserwujesz, ma na Ciebie wpływ. &lt;strong&gt;Te rzeczy kształtują Twoje zrozumienie i wyobrażenie o świecie&lt;/strong&gt;. Jak być szczęśliwym czytając ciągle o klęskach, śmierci, zmianach klimatu, lub innych przygnębiających rzeczach? Jak pozostać produktywnym, jeżeli ciągle napotykasz przeróżne memy, gify lub filmiki, które każdy udostępnia i podaje dalej?&lt;/p&gt;
&lt;p&gt;Na Twitterze obserwuje ludzi, którzy publikują treści wzbogacające moje myślenie i moją wiedzę – rzeczy, które mocno we mnie rezonują. Jest to całkiem normalne, że czasami przestaje obserwować konta, które nie wnoszą już dłużej nic więcej do mojego życia. Zainteresowania zmieniają się z czasem, a tym samym ludzie, których obserwujesz.&lt;/p&gt;
&lt;p&gt;Na Facebook&amp;rsquo;u – medium, którego używam sporadycznie – przestałem obserwować praktycznie wszystkich znajomych, za wyjątkiem kilku przyjaciół i członków rodziny. Wciąż mam kontakt z ludźmi, których znam, ale i tutaj kieruje się zasadą, że obserwowanie nie jest tym samym co znajomość czy przyjaźń.&lt;/p&gt;
&lt;p&gt;LinkedIn jest trochę bardziej problematyczny. Promuje się on jako biznesowa sieć społecznościowa, jednak dla mnie działa to trochę jak strona z ogłoszeniami o pracę z wbudowanym komunikatorem. Być może zmieni się to, kiedy przestane obserwować ludzi z mojej sieci kontaktów, których nawet nie znam (głównie rekruterzy).&lt;/p&gt;
&lt;p&gt;Masz moc wyboru. Używaj jej. Twoi znajomi zrozumieją, a większość i tak nie zauważy zmiany.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Okładka wpisu dzięki &lt;a href=&#34;https://unsplash.com/@jaysung?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&#34;&gt;Jehyun Sung&lt;/a&gt; z &lt;a href=&#34;https://unsplash.com/s/photos/follow?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&#34;&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;ang: &lt;em&gt;Fear Of Missing Out&lt;/em&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>5 etapów bycia programistą</title>
      <link>https://szymonkrajewski.pl/pl/5-etapow-bycia-programista/</link>
      <pubDate>Mon, 27 May 2019 00:00:00 +0000</pubDate>
      
      <guid>https://szymonkrajewski.pl/pl/5-etapow-bycia-programista/</guid>
      <description>&lt;p&gt;Niedawno minęło 5 lat, odkąd zacząłem zawodowo pracować jako programista. Pomimo że programowanie jako hobby towarzyszyło mi już dużo wcześniej, to dopiero praca dała mi przysłowiowego &amp;ldquo;kopa&amp;rdquo;, dzięki któremu zacząłem się rozwijać.&lt;/p&gt;
&lt;p&gt;Kiedy ostatnio przypomniałem sobie moje początki, byłem zaskoczony, jak wiele się we mnie zmieniło. Zauważyłem to dopiero po kilku latach. Postanowiłem więc to spisać.&lt;/p&gt;
&lt;p&gt;Zabiorę Cię zatem na krótką wyprawę i opowiem Ci o etapach, które przeszedłem – jak wtedy myślałem, co robiłem i co się zmieniło. Idziesz?&lt;/p&gt;
&lt;h2 id=&#34;początkujący-programista-tworzy-kod-który-działa&#34;&gt;Początkujący programista tworzy kod, który działa&lt;/h2&gt;
&lt;p&gt;Każdy, kto kiedykolwiek zaczynał programować, wie, że jeden z pierwszych powodów do radości to ten, kiedy program kompiluje się bez błędu i zaczyna działać. Nieważne, że wyświetla statyczny tekst na ekranie, komunikat po kliknięciu przycisku czy też wykonuje jakieś mniej ambitne zadania. Działa.&lt;/p&gt;
&lt;p&gt;Na tym etapie nie myśli się jeszcze o architekturze. Przynajmniej ja nie myślałem. Bardziej byłem zafascynowany tym, co mogę jeszcze ciekawego zaprogramować. Boty do gier, proste strony internetowe, własny CMS… Im więcej przeprowadzonych eksperymentów, tym lepiej.&lt;/p&gt;
&lt;p&gt;Z czasem pojawiają się bardziej zaawansowane projekty, a wraz z nimi pierwsze większe problemy. Problemy ze strukturą kodu, duplikacje, brak czytelności i ogólny nieład, który skutkuje coraz to większą frustracją. Wprowadzanie zmian staje się czasochłonne, a efekty działań zazwyczaj nie są zadowalające.&lt;/p&gt;
&lt;figure class=&#34;figure center&#34;&gt;&lt;img
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;
      src=&#34;https://media.giphy.com/media/xZqycRHIQkKNa/giphy.gif&#34;
      
      
      
    /&gt;&lt;figcaption class=&#34;center&#34; &gt;
      Źródło: &lt;a href=&#34;https://giphy.com/gifs/13XW2MJE0XCoM0&#34;&gt;giphy.com&lt;/a&gt;
    &lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;Brak wiedzy na temat podstawowych wzorców projektowych potrafi szybko położyć nawet najbardziej ambitny projekt. Kod staje się nierozwijalny, w efekcie czego łatwiej jest napisać wszystko od początku. Z wiadomym skutkiem.&lt;/p&gt;
&lt;p&gt;Kilka mądrych ludzi i książek podpowiadało, co z tym można zrobić. Zastosowanie reguł takich jak &lt;em&gt;SOLID&lt;/em&gt;, &lt;em&gt;DRY&lt;/em&gt; czy &lt;em&gt;KISS&lt;/em&gt; było pierwszą poradą, o której przeczytałem – nawet już nie pamiętam gdzie. W teorii oczywiście wszystko brzmi świetnie, jednak stosowanie się do tych zasad stwarza problemy nawet doświadczonym programistom, a co dopiero początkującym.&lt;/p&gt;
&lt;p&gt;Rozwiązaniem wydaje się użycie wzorców projektowych. To one wkrótce staną się moim podstawowym narzędziem pracy.&lt;/p&gt;
&lt;h2 id=&#34;etap-używania-wzorców-projektowych&#34;&gt;Etap używania wzorców projektowych&lt;/h2&gt;
&lt;p&gt;W miarę odkrywania programistycznego świata dowiedziałem się, że większość problemów, z którymi się mierzyłem, została już rozwiązana. Część z nich została uogólniona na tyle, że można je wpasować w któryś ze znanych już wzorców projektowych, np. tych zaproponowanych w &lt;a href=&#34;https://en.wikipedia.org/wiki/Design_Patterns&#34;&gt;książce gangu czworga&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Idea stojąca za używaniem wzorców projektowych była bardzo zachęcająca. Zapewniają one sprawdzone rozwiązania na konkretne problemy projektowe. Dla mnie, jako początkującego programisty był to sposób na umieszczenie kodu we właściwym miejscu we właściwy sposób.&lt;/p&gt;
&lt;h4 id=&#34;nadużywanie-wzorców-projektowych&#34;&gt;Nadużywanie wzorców projektowych&lt;/h4&gt;
&lt;p&gt;Wzorce były tak świetnym narzędziem, że wręcz błędem wydawało mi się pisanie kodu bez ich użycia. Skutek był taki, że po jakimś czasie wszędzie widziałem możliwości wykorzystania jakiegoś wzorca. Nawet tam, gdzie nie było to potrzebne.&lt;/p&gt;
&lt;p&gt;Początkowo posiadanie uogólnionego rozwiązania na każdy problem wydawało się dobrym pomysłem. Najczęściej jednak program stawał się zlepkiem abstrakcji, natomiast to, co faktycznie robił, było głęboko ukryte w kodzie.&lt;/p&gt;
&lt;p&gt;Teraz już wiem, że wzorzec projektowy stanowi ramę do rozwiązania problemu, ale nie jest rozwiązaniem samym w sobie.&lt;/p&gt;
&lt;p&gt;Tamtego czasu większość rzeczy pisałem samodzielnie, nie chcąc korzystać z gotowych rozwiązań. Z jednej strony było to dobre, ponieważ dużo rzeczy zrozumiałem, kiedy musiałem je zaimplementować. Z drugiej strony wymagało to jednak znacznie większej ilości czasu, a efekty tego były różne.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Wzorzec projektowy nie jest rozwiązaniem problemu. Jest uogólnieniem rozwiązania i stanowi dla niego szkielet.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Kiedy jednak znudziło mi się pisanie w kółko tych samych rzeczy, moja uwaga powędrowała w stronę gotowych rozwiązań.&lt;/p&gt;
&lt;h2 id=&#34;na-każdy-problem-jest-biblioteka&#34;&gt;Na każdy problem jest biblioteka&lt;/h2&gt;
&lt;p&gt;Bardzo szybko wszedłem w świat frameworków. Były dobre, ponieważ nałożyły ramy i strukturyzowały pracę, szczególnie jeżeli chodzi o pisanie kodu. Miały również masę gotowych do użycia komponentów, które przyspieszały development.&lt;/p&gt;
&lt;p&gt;Szybko przyzwyczaiłem się do podejścia, że jeżeli jest jakiś problem, to jest bardzo prawdopodobne, że ktoś już znalazł na niego rozwiązanie. Możliwe, że nawet zaimplementował je w formie jakiejś biblioteki.&lt;/p&gt;
&lt;figure class=&#34;figure center&#34;&gt;&lt;picture&gt;&lt;img
          loading=&#34;lazy&#34;
          decoding=&#34;async&#34;
          src=&#34;https://szymonkrajewski.pl/5-stages-of-development-as-the-programmer/032_packagist_package_numbers.png&#34;
          srcset=&#34;https://szymonkrajewski.pl/5-stages-of-development-as-the-programmer/032_packagist_package_numbers_hu_c5e1f8984e0c92c.png 360w, https://szymonkrajewski.pl/5-stages-of-development-as-the-programmer/032_packagist_package_numbers_hu_34d56ed9e75dba0e.png 640w, https://szymonkrajewski.pl/5-stages-of-development-as-the-programmer/032_packagist_package_numbers_hu_a0ffd876ae6d1386.png 960w, https://szymonkrajewski.pl/5-stages-of-development-as-the-programmer/032_packagist_package_numbers_hu_e2414677a15f777e.png 1200w, https://szymonkrajewski.pl/5-stages-of-development-as-the-programmer/032_packagist_package_numbers_hu_3d569590aa8766ea.png 1526w&#34;
          sizes=&#34;(min-width: 900px) 78ch, 100vw&#34;
          width=&#34;1526&#34;
          height=&#34;704&#34;
           alt=&#34;The chart which presents number of packages and their versions in time&#34; 
          
          
        /&gt;
      &lt;/picture&gt;&lt;figcaption class=&#34;center&#34; &gt;
      Wykres przedstawiajacy wzrost liczby bibliotek i ich wersji w repozytorium packagist.org. Liczba bibliotek na maj 2019 wynosi ponad 225 tysięcy.
    &lt;/figcaption&gt;&lt;/figure&gt;

&lt;h4 id=&#34;szukanie-gotowców-zamiast-rozwiązań&#34;&gt;Szukanie gotowców zamiast rozwiązań&lt;/h4&gt;
&lt;p&gt;Ta sytuacja sprawiła, że zamiast skupiać się na rozwiązaniu problemów, zacząłem skupiać się na odnajdowaniu narzędzi, które ów problem mogłyby rozwiązać. Czy rozwiązywały? Oczywiście. Czy bezproblemowo? Niestety nie. Często użycie jakiegoś zewnętrznego kodu nakłada ograniczenia, które stają się problemem w bardziej specyficznych przypadkach biznesowych.&lt;/p&gt;
&lt;p&gt;Po jakimś czasie zacząłem dużo uważniej przyglądać się wszystkim bibliotekom, jakie zamierzałem włączyć w projekt. Skoro i tak trzeba będzie poświęcić czas na dostosowanie danej funkcjonalności do wymagań, może jednak napisać to samodzielnie? Czy jeżeli użyje innej biblioteki, to czy nie wygeneruje ona nowych problemów? Czy faktycznie rozwiąże problem?&lt;/p&gt;
&lt;figure class=&#34;figure center&#34;&gt;&lt;img
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;
      src=&#34;https://media.giphy.com/media/kwEmwFUWO5Ety/giphy.gif&#34;
      
      
      
    /&gt;&lt;figcaption class=&#34;center&#34; &gt;
      Adjusting ready-made solutions according to client&amp;rsquo;s requirements. Source: &lt;a href=&#34;https://giphy.com/gifs/modern-software-development-kwEmwFUWO5Ety&#34;&gt;giphy.com&lt;/a&gt;
    &lt;/figcaption&gt;&lt;/figure&gt;

&lt;h2 id=&#34;rozwiązywanie-problemów&#34;&gt;Rozwiązywanie problemów&lt;/h2&gt;
&lt;p&gt;W pewnym momencie stało się dla mnie jasne, że rozwiązywanie problemów nie polega jedynie na pisaniu oprogramowania. Niektóre klasy problemów można rozwiązać, wykorzystując do tego celu już istniejące programy. Trzeba tylko wiedzieć jakie.&lt;/p&gt;
&lt;h4 id=&#34;wsłuchanie-się-w-potrzeby-klienta&#34;&gt;Wsłuchanie się w potrzeby klienta&lt;/h4&gt;
&lt;p&gt;Załóżmy, że klient przychodzi z prośbą o stworzenie aplikacji do generowania zestawień i raportów z firmy, ale ma dosyć mocno ograniczony budżet. Z jakiegoś powodu przyszedł właśnie do nas. To z kolei powinno prowadzić do kilku pytań:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Czy to, że trafił właśnie do nas, wynika z tego, że źle adresujemy komunikat do potencjalnych klientów?&lt;/li&gt;
&lt;li&gt;Skoro już się u nas pojawił, jak możemy mu pomóc?
&lt;ul&gt;
&lt;li&gt;Czy klient faktycznie potrzebuje dedykowanego oprogramowania?&lt;/li&gt;
&lt;li&gt;Jeśli nie, to czy istnieje gotowe narzędzie, które możemy zaproponować klientowi w zamian, np. Microsoft Excel, Calc z pakietu Libre Office lub inny arkusz kalkulacyjny?&lt;/li&gt;
&lt;li&gt;Czy możemy przekierować klienta do innej firmy, która być może się w tym specjalizuje lub dla której ten klient byłby odpowiedni?&lt;/li&gt;
&lt;li&gt;Czy faktycznie w zadanym budżecie możemy coś wykonać?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jak widać, nie wszystko musi się sprowadzać do pisania kodu. Jeżeli jednak się sprowadza, to należy zadbać, aby faktycznie było to ukierunkowane na rozwiązanie jakiegoś problemu. Najlepiej gdyby to rozwiązanie w pełni zaspokajało potrzeby.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Architektura, paradygmat, język, framework to tylko narzędzia, które mają za zadanie pomóc w rozwiązaniu problemu domenowego.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Zauważyłeś pewnie, że kiedy piszę o problemach, nie mam tu na myśli wyzwań, które sami jako programiści stawiamy sobie, wybierając architekturę, paradygmat czy framework. Są to nasze narzędzia, które mają za zadanie służyć do rozwiązania problemu wyższego poziomu, najczęściej jakiegoś problemu biznesowego lub bardziej ogólnie – &lt;strong&gt;problemu domenowego&lt;/strong&gt;.&lt;/p&gt;
&lt;h4 id=&#34;rozwiązywanie-problemów-domenowych&#34;&gt;Rozwiązywanie problemów domenowych&lt;/h4&gt;
&lt;p&gt;Te problemy są najciekawsze, nie wystarczy tutaj sama wiedza z zakresu programowania. Potrzebna jest także specjalistyczna wiedza dziedzinowa. To prawdziwe wyzwania, które wymagają od programisty ciągłego doskonalenia się i chęci poznawania nowych rzeczy, niekoniecznie związanych ze światem IT.&lt;/p&gt;
&lt;p&gt;To tutaj pojawia się słynny akronim DDD – &lt;em&gt;Domain–Driven Design&lt;/em&gt;, który to jest świętym gralem każdego programisty aspirującego do roli projektanta systemów. Miejscem, w którym developerzy wiedzą, czego oczekuje biznes, a biznes czuje się zrozumiany przez developerów.&lt;/p&gt;
&lt;p&gt;Aby to było możliwe, należy zrezygnować z rzeczy, które wprowadzają niepotrzebny szum. Używać ich tylko tam, gdzie jest to niezbędne, aby usprawnić rozwiązanie problemu. Rzeczy, które są skomplikowane, należy upraszać, a proste czynić jeszcze prostszymi.&lt;/p&gt;
&lt;p&gt;Faworyzacja prostoty prowadzi w efekcie do tego, że programista zaczyna tworzyć kod, który po prostu działa. I jest prosty.&lt;/p&gt;
&lt;h2 id=&#34;doświadczony-programista-tworzy-kod-który-działa&#34;&gt;Doświadczony programista tworzy kod, który działa&lt;/h2&gt;
&lt;p&gt;Nie szukam projektów, które mogę zrobić w moim ulubionym frameworku lub wykorzystując aktualnie popularną architekturę. Nie tworzę na siłę z każdej pętli iteratora i staram się nie komplikować rzeczy, które mogą być proste.&lt;/p&gt;
&lt;p&gt;Nie wymyślam też koła na nowo i używam narzędzi, które są dostosowane do rozwiązywania określonych problemów. Każda napisana linijka kodu to rzecz, o którą trzeba będzie dbać i którą trzeba konserwować w przyszłości.&lt;/p&gt;
&lt;p&gt;Zamiast tego pomagam innym rozwiązywać ich problemy. Probuje dotrzeć do tego, czego tak naprawdę potrzebują, zrozumieć to i zaproponować najlepsze rozwiązanie do konkretnej sytuacji.&lt;/p&gt;
&lt;p&gt;Korzystam też z hojności innych programistów, którzy dzielą się zarówno swoją wiedzą, jak i pracą. Sam staram odwdzięczać się tym samym – pokazując jak pisać dobry kod i samemu dzieląc się wiedzą z innymi.&lt;/p&gt;
&lt;p&gt;Kiedy piszę kod, wiem, że nie tylko ja będę go oglądał. Wiele par oczu będzie czytało i starało się zrozumieć, jak dana funkcjonalność została zaimplementowana i co właściwie robi. Moim zadaniem jest ułatwić innym zrozumienie tego.&lt;/p&gt;
&lt;p&gt;Wszystko to w połączeniu z doświadczeniem składa na mój warsztat, dzięki któremu mogę sprawnie rozwiązywać kolejne problemy, stale się przy tym rozwijając i doskonaląc. Codziennie poznaje nowe rzeczy i sam decyduje, które z nich mogę włączyć do mojego warsztatu.&lt;/p&gt;
&lt;h2 id=&#34;podsumowanie&#34;&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Dziele się swoimi przemyśleniami, bo chce pokazać Ci, jak na różnym etapie życia i kariery zawodowej zmieniałem perspektywę i swój sposób myślenia.&lt;/p&gt;
&lt;p&gt;Raz dążyłem do tego, aby pisać jak najwięcej samemu, innym razem szukałem gotowych rozwiązań. Potem usilnie starałem się wykorzystywać to, czego się nauczyłem. Dopiero po latach nauczyłem się jak robić to dobrze.&lt;/p&gt;
&lt;p&gt;Jak widać, wiele się zmieniło – moim zdaniem na lepsze. Zmiany są widocznym następstwem i dowodem dokonywania postępu. Nie są jednak wynikiem samego upływu czasu.&lt;/p&gt;
&lt;p&gt;Zmiana pracy, wpływ innych ludzi, utrzymywane relacje, środowisko, &lt;a href=&#34;https://szymonkrajewski.pl/ive-finished-studies-here-are-some-of-my-thoughts/&#34;&gt;studia (🇺🇸)&lt;/a&gt; i książki to tylko niektóre z ważniejszych elementów, które wpłynęły na mój sposób myślenia. Dlatego tak ważne jest otwarcie się na inne doświadczenia i konfrontacja z nowymi ideami i pomysłami.&lt;/p&gt;
&lt;p&gt;To, co opisałem to moja droga, która nie koniecznie musi pokrywać się z Twoją i zapewne nie będzie. Jeśli jednak w jakiś sposób identyfikujesz się z tym, co przedstawiłem, powiedz mi o tym, zostawiając komentarz lub przez e-mail.&lt;/p&gt;
&lt;p&gt;To jeszcze nie koniec podróży.&lt;/p&gt;
&lt;p&gt;Zanim się jednak pożegnamy, zostawię Cię z taką myślą – jaką najważniejszą zmianę widzisz w sobie, porównując obecnego siebie do siebie z przed roku?&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Featured photo by &lt;a href=&#34;https://unsplash.com/photos/xrVDYZRGdw4?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&#34;&gt;Émile Perron&lt;/a&gt; on &lt;a href=&#34;https://unsplash.com/search/photos/developer?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText&#34;&gt;Unsplash&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
