← wszystkie wpisy

OpenClaw na Raspberry Pi 5

Jak zamienić Pi 5 i 7-calowy ekran dotykowy w przydatne domowe urządzenie IoT z OpenClaw — pulpity, czujniki środowiskowe, monitorowanie ruchu i oceny każdego eksperymentu.

raspberry-piopenclawiotai-agents

Testowałem OpenClaw na Raspberry Pi 5. Ten wpis opisuje, jak zamieniłem Pi i 7-calowy ekran dotykowy w przydatne domowe urządzenie IoT, nie pisząc ani jednej linijki kodu.

1. Konfiguracja

  • Model — wybrałem Gemini 3 Flash, który daje dobry balans między szybkością, rozumowaniem i niższym kosztem w porównaniu z mocniejszymi modelami.
  • Komunikacja (VNC) — z botem pracuję głównie przez pulpit, łącząc się z Raspberry Pi przez VNC (TigerVNC Viewer).

Pulpit VNC na ekranie dotykowym Raspberry Pi

  • Komunikacja (Telegram) — do sprawdzania bieżących zadań używam też Telegrama. Zauważyłem, że nawet gdy asystent mówi „dam znać, kiedy skończę zadanie”, nie odzywa się sam, więc Telegram przydaje się do śledzenia postępu, zużycia tokenów, statusu itp.

Sprawdzanie postępu i statusu zadań przez Telegram

2. Główny pulpit + REST API + baza danych

Krok po kroku prosiłem asystenta o zbudowanie pulpitu w Svelte, który wyświetla:

  • Aktualne kursy wymiany GBP → PLN (odświeżane każdego ranka).
  • Kilkudniową prognozę pogody.

Potem poprosiłem, żeby codziennie zapisywał kurs wymiany oraz maksymalną i minimalną temperaturę i udostępniał je przez REST API. Wybrał do tego FastAPI i SQLite — dokładnie to, czego w przeszłości używałem w swoich projektach na RP 5 i 4. Uważam, że to świetny wybór w tej konfiguracji.

Ocena: 5/5

Główny pulpit z kursami wymiany i prognozą pogody

3. Temperatura i wilgotność (czujnik BME280)

Pracę z IoT zacząłem od przetestowania czujnika BME280 do pomiaru temperatury i wilgotności w pomieszczeniu. Czujnik został wykryty bez problemów. Przeprowadziłem kilka testów i dodałem usługę, która uruchamia się automatycznie po starcie systemu. Potem poprosiłem o dodanie do pulpitu dwóch nowych kart z temperaturą i wilgotnością. Porównałem wartości z osobnym termometrem pokojowym — były niemal identyczne.

Czujnik BME280 podłączony do pomiaru temperatury i wilgotności

Karty temperatury i wilgotności dodane do pulpitu

Ocena: 5/5

4. eCO2 i TVOC (czujnik SGP30)

W kolejnym teście IoT mierzyłem jakość powietrza w sypialni za pomocą Raspberry Pi Zero z czujnikiem SGP30, który podaje łączną ilość lotnych związków organicznych (TVOC) i ekwiwalent CO2 (eCO2). Badania sugerują, że wysokie stężenie CO2 podczas snu może zaburzać fazę REM, obniżać zmienność rytmu serca (HRV) i pogarszać sprawność umysłową następnego dnia, dlatego dobra wentylacja sypialni jest ważna.

SGP30 nie zastąpi prawdziwego czujnika CO2, takiego jak SCD41, który wykorzystuje impulsy światła podczerwonego pochłaniane przez cząsteczki CO2. To pochłanianie wytwarza maleńką falę ciśnienia (dźwięk), którą wykrywa wewnętrzny mikrofon czujnika.

SGP30 działa w zupełnie innej technologii — najpierw musi rozgrzać płytkę z tlenku metalu. Cząsteczki tlenu, które na niej osiadają, odbierają metalowi elektrony, tworząc warstwę ładunku ujemnego, co zwiększa opór elektryczny. Gdy gaz trafia na powierzchnię, reaguje z tlenem i uwalnia elektrony, co sygnalizuje skok stężenia gazu.

Jak metalotlenkowy czujnik SGP30 wykrywa gaz

Poprosiłem asystenta o usługę, która co 30 sekund przez 15 minut zbiera pomiary, liczy średnią i zapisuje wyniki w bazie SQLite. Potem poprosiłem o REST API w FastAPI, które te pomiary udostępnia.

Get all entries:
http://192.168.50.79:8000/measurements

Get entries from date until now (Unix timestamp):
http://192.168.50.79:8000/env_measurements?from_date=1771342047

Get entries from/to date (Unix timestamp):
http://192.168.50.79:8000/env_measurements?from_date=1771342047&to_date=1771455047
{
  "timestamp": 1771342763,
  "device_name": "RPZero",
  "eco2_ppm": 426,
  "tvoc_ppb": 84,
  "temperature": null,
  "humidity": null,
  "uptime": 104651,
  "location": "master bedroom"
}

Po 24-godzinnym okresie kalibracji i stabilizacji poprosiłem o dzienny wykres eCO2 (w częściach na milion) i TVOC (w częściach na miliard).

Wyniki? Chyba muszę otwierać okno przed snem, żeby wpuścić do pokoju świeże powietrze 😉.

Dzienny wykres eCO2 i TVOC po 24-godzinnej kalibracji

Żeby mieć wyniki pod ręką, zbudowałem aplikację mobilną, która pokazuje dzienne wartości dla wybranej daty. Będę je porównywać z oceną snu z Fitbita, żeby sprawdzić, czy gorszy sen idzie w parze z wyższym stężeniem CO2.

Aplikacja mobilna z dziennymi wartościami jakości powietrza

Ocena: 5/5

5. Scraping i wyszukiwanie w sieci

Przygotowałem szczegółowy prompt, żeby wyszukać wyniki zawodów triathlonowych (dystans sprint i olimpijski) do pobrania jako pliki CSV. Pliki miały zostać pobrane, przemianowane, posortowane i przygotowane do czyszczenia. Zachęciłem asystenta, żeby pytał o wszystko, czego nie jest pewien, abyśmy mogli omówić kolejne kroki. Poprosiłem też o plan działania przed rozpoczęciem, żebym mógł go przejrzeć i zatwierdzić. Asystent użył do tego przeglądarki Brave.

Wynik

Asystent zwrócił strony bez linków do plików CSV, a niektóre w ogóle nie miały wyników zawodów triathlonowych. Sam wybrałem kilka stron, o których wiedziałem, że mają linki do CSV, ale asystent zgłosił, że nie może pobrać plików. Za to bardzo dobrze poradził sobie z czyszczeniem plików CSV, kiedy pobrałem je sam.

Wyniki scrapingu i wyszukiwania w sieci

Ocena: 1/5

6. Monitorowanie ruchu — wykrywanie samochodów na obrazie

Cel był prosty, ale technicznie podchwytliwy: wykrywać samochody jadące pod górę i z góry, licząc każdy pojazd tylko raz. Każdy samochód jest w kadrze przez około cztery sekundy. System rozpoznawania obiektów miał pomijać pojazdy, które stoją dłużej niż minutę, bo to zwykle oznacza, że ktoś zaparkował przy drodze. Ruch jest niewielki, więc samochody rzadko stoją w korku dłużej niż 30 sekund.

Wybraliśmy YOLOv8-nano z trackerem BoT-SORT, który nadaje każdemu pojazdowi unikalny identyfikator. Żeby poradzić sobie z opóźnieniem wewnętrznego bufora, asystent zastosował opróżnianie klatek, dzięki czemu system zawsze pracował na bieżącym obrazie.

Wyniki

Wyniki były mieszane. Wykrywanie samochodów szło całkiem nieźle, mimo słabej kamery USB i braku sprzętu AI (np. kamery AI albo AI HAT+). Nie udało się jednak pominąć stojących obiektów, o co prosiłem w prompcie, a czasem samochód częściowo zasłonięty przez drzewo był wykrywany jako dwa pojazdy, co dawało zdublowane identyfikatory.

Wykrywanie samochodów na obrazie w działaniu

Myślę, że da się to poprawić w kolejnych iteracjach. Ponieważ jednak pewność wykrycia pojedynczego samochodu była często niska (nierzadko poniżej 0,5), planuję kupić „AI camera” albo „AI HAT+ 2” i powtórzyć zadanie, żeby ją zwiększyć. Poprosiłem też o wykres wykrytych samochodów na minutę podczas 10-minutowego testu.

Wykryte samochody na minutę podczas 10-minutowego testu

Ocena: 2/5

7. Monitorowanie ruchu — wykrywanie samochodów po dźwięku

Skoro wykrywanie obiektów nie dawało dobrych wyników, spróbowałem innego podejścia — wykrywania przejeżdżających samochodów za pomocą mikrofonu.

Specyfikacja mikrofonu:

  • Pasmo przenoszenia: 50–16000 Hz
  • Wymiary mikrofonu: 6,0×2,7 mm
  • Czułość: −46 dB (0 dB = 1 V/µbar, f = 1 kHz)
  • Charakterystyka kierunkowa: dookólna
  • Typ USB: USB 2.0 / V1.1

Mikrofon USB użyty do wykrywania samochodów po dźwięku

Poprosiłem asystenta, żeby przez kilka minut prowadził wykrywanie, podczas gdy ja ręcznie liczyłem samochody, a potem porównałem wyniki. Wystarczyła jedna próba strojenia, żeby osiągnąć około 90% trafności, która utrzymała się w trzech kolejnych testach. System wykrył nawet dwa samochody jadące tuż za sobą — spodziewałem się, że z tym będzie miał problem. W jednym teście słychać było nisko przelatującą awionetkę, ale system nie uznał tego dźwięku za samochód.

Każde wykrycie tworzy plik .wav i uruchamia skrypt w Pythonie, który generuje wykres amplitudy oraz plik JSON z cechami wykrycia, które ustaliliśmy w trakcie pracy.

Wykres amplitudy wygenerowany dla wykrytego samochodu

Ograniczenia

  • Warunki pogodowe — ta konfiguracja działa dobrze tylko bez deszczu i silnego wiatru.
  • Brak wykrywania na żywo — to podejście nie pozwala wykrywać w czasie rzeczywistym.
  • Fałszywe alarmy — samochód wjeżdżający na podjazd sąsiada albo z niego wyjeżdżający może zostać błędnie uznany za przejeżdżający.

Ocena: 4/5

8. Łączny koszt

Używałem najtańszego dostępnego wtedy modelu Gemini — w sumie kosztowało mnie to 5,16 £. Droższy model mógłby poprawić wyniki testów, ale jestem zadowolony z obecnych efektów, a mocniejszych modeli zamierzam używać do bardziej złożonych zadań.

Zestawienie łącznych kosztów eksperymentu

9. Stabilność

Podczas testów tylko raz musiałem zrestartować sesję. Poza tym OpenClaw na RP5 działał bardzo stabilnie i nie zauważyłem żadnych problemów.

10. Kolejne kroki

  1. Techniki optymalizacji
    • Dobór właściwego modelu do zadania.
    • Ustawianie max_tokens dla odpowiedzi i dynamiczne dostosowywanie go do zadania.
    • Przetwarzanie wsadowe i cache.
  2. Inżynieria promptów
    • Szablony promptów.
    • Różne role do konkretnych zadań.
    • Dzielenie dużych wymagań na mniejsze zadania.
    • Przemyślenie formatu wyjściowego przed napisaniem promptu (JSON, CSV, tekst itp.).
    • Dostarczanie kontekstu i przykładów.
  3. Monitorowanie — śledzenie zużycia tokenów, błędów, opóźnień itp.
  4. Własny routing dla oszczędności.
  5. Więcej projektów IoT.

11. Podsumowanie

Dzięki możliwości podłączania do Raspberry Pi różnych czujników, kamer i ekranów można realizować bardzo szeroki zakres projektów. Pi łatwo łączy się z Raspberry Pi Zero W albo Pico 2 W, więc zadania mogą działać również na tych urządzeniach. Zadania obciążające CPU/GPU można przenieść na AI HAT+ 2, który wciąż jest dużo tańszy niż Mac mini. A jeśli coś pójdzie nie tak, wystarczy wymienić kartę SD i zacząć od nowa. Jeśli masz pod ręką Raspberry Pi, polecam zainstalować OpenClaw i zabrać się za projekt, który od dawna odkładasz.