
Dzień dobry,
Poniżej chcę zaprezentować swoją konstrukcję systemu wykorzystującego sztuczną inteligencję, którego celem jest wykrywanie podłączonych urządzeń elektrycznych do domowej sieci. Motywacją była próba stworzenia czegoś do kontroli aktualnie podłączonych urządzeń korzystających z energii elektrycznej i informowanie o tym użytkownika.
Układ podzieliłem na dwa podstawowe elementy - jednym z nich jest moduł pomiarowy oparty o ESP32 i ADS1115, a z drugiej strony Raspberry Pi z logiką (python, keras, tensorflow).
Realizacja pomiaru - skąd brać dane?
Moduł pomiarowy zbudowałem na bazie ESP32cam, z 2 powodów, po pierwsze urwałem taśmę od kamery i została sama płytka, po drugie ma 2 rdzenie co ułatwia jednoczesny odczyt natężenia i obsługę sieci. Jest to bardzo prosta i prymitywna konstrukcja, zlutowałem bez schematu, dzielniki z rezystorów na wejściu przetwornika ADS1115, odczyt realizowany za pomocą przekładników prądowych założonych na 3 poszczególne fazy pomiędzy licznikiem a skrzynką bezpieczników. Całość zamknięta w obudowie na szynę DIN.
Odczyt nie jest super dokładny ale nie to było celem (nawet zasadne jest aby nie był doskonały).
Oprogramowanie układowe napisałem w arduino, dodałem front html z wykresami i PWA (ładniej wygląda).
Ze sterownika odczytuje również JSON-a który zawiera tablicę 500 sek pomiarów wstecz (wyrażonych w Watach) dla każdej fazy.
Tak przygotowane urządzenie jest źródłem danych dla kolejnego etapu.



Luna - Sztuczna Sieć Neuronowa w praktyce.
Luna jest siecią neuronowa zaprojektowaną w oparciu o popularne biblioteki Keras i TensorFlow 2.
Zbudowałem sekwencyjny model składający się z kilku warstw.
Sieć na wejściu otrzymuje tablicę 500 sek zapisów które odczytuje przez wifi z modułu pomiarowego.
Dla każdego rozpoznawanego urządzenia sieć posiada wyjście na którym w procentach wyraża wyliczony wynik.
Tego typu sieć uczy się metodą propagacji wstecznej, co wymaga przygotowania odpowiednich zestawów uczących.
W moim przypadku są to owe 500 elementowe tablice które zapisuje jako kolejne klatki.
Całość podzielona jest na foldery (z nazwami urządzeń) w których przechowuje poszczególne sample (jako tablica numpy):
Code: dos
Dopisałem dodatkowe narzędzia do zbierania i kategoryzowania próbek - wystarczy podłączyć nowe urządzenie, podać jego nazwę i Luna samodzielnie zapisze odpowiednie dane i się ich "nauczy".
Poniżej przykładowe wykresy przebiegu zużycia energii służące jako zestawy uczące. Widać na nich np. charakterystyczne szpilki silników hydroforu i lodówki. Swoją drogą czy można by po ich kształcie kontrolować kondycję silnika, wyższe, niższe?.




Zgrywa kilka - kilkadziesiąt ramek i dopisuje je do istniejącej kategorii (urządzenia) lub do nowo utworzonej.
Tak przygotowana struktura jest gotowa do rozpoczęcia nauczania.
Parametry sieci w moim przypadku dobierałem doświadczalnie - z pewnością wymaga to jeszcze dokładniejszego tuningu.
Obecnie sieć składa się z kilku warstw. Pierwsza zmienia kształt danych na obraz (10,50,1),
potem kilka konwolucji 2d i poolingów, spłaszczanie i na końcu warstwy dense sprowadzające wyjścia do kategorii:
Code: dos
Ilość neuronów jest zależna od ilości wyjść (obecnie 9 urządzeń)- sieć skaluje się zgodnie z aktualną ilością kolejno poznawanych (foldery z zestawami uczącymi).
Poniżej listing z uczenia sieci:
Code: dos
Sieć wytrenowała się na poziomie 92%, nie jest to idealny wynik ale i przy takim poziomie radzi sobie dobrze.
Powyższy przykład to ok 10000 próbek, po ok 1200 próbek dla każdego urządzenia.
Predykcja - czyli co w prądzie piszczy.
Sieć uruchomiłem na rpi4. Pracuje non stop, zapisując dane z predykcji co kilka minut. Cały czas ją testuję, a i tak jestem bardzo zadowolony wyników. Mój zestaw uczący składa się obecnie z ponad 10 tyś ramek dla 9 urządzeń (kategorii)
Luna widzi 9 minut wstecz i taki zakres analizuje.
Wynik prezentowany jest w postaci listy wykrytych urządzeń wraz z procentowym prawdopodobieństwem jego wystąpienia.
Poniżej kilka porównań wykresu z przewidywaniem.


Sieć radzi sobie zarówno z wykresem o dużej dynamice np włączenie urządzenia dużej mocy, jak i z płaskimi złożonymi przebiegami w których rozpoznaje lodówkę, laptop i tv jednoczenie pracujące.
Czasem ma problem np czajnik vs hydrofor - podobne przebiegi o dużym skoku, czasem w przypadku kilku urządzeń dostrzega tylko najbardziej charakterystyczne.
Zapis z predykcji zapisuje się co kilka minut i tworzy tabelę procentowego wystąpienia w czasie.
Kilka wykresów prezentujących wykryte załączenia urządzeń w ciągu ok doby:





W przypadku laptopa widać początkowe błędy uczenia, wykrywany był prawie zawsze. Po korekcie zestawów uczących (usunąłem wybrane) sieć zaczęła pracować poprawnie.
Przyszłość - jak użyć tę wiedzę?
Planuję dodać szereg powiadomień (użyje push i PWA) do informowania mnie o użyciu energii w domu.
Sieć potrafi rozpoznać moment naładowania się laptopa - ma inny przebieg na pełnej baterii,
potrafi dostrzec podłączone i nieużywane żelazko - rzadsze cykle załączenia i poinformować o tym.
Rozpoznaje programy pralki - każdy zostawia charakterystyczny ślad.
Nic nie stoi na przeszkodzie aby dodać układy wykonawcze (przekaźniki) i automatycznie nadzorować dystrybucję energii,
odłączać niepotrzebne odbiorniki itp.
Z każdym dniem umie coraz więcej i jest dokładniejsza, zwiększam liczbę kategorii,
specjalnie komplikuje przebiegi podłączając wiele urządzeń na raz..
Ilość zastosowań jest nieograniczona, a użycie pythona umożliwia uruchomienie na wielu różnych platformach.
Dodatkowo ta sieć pracuje tak, że na wejściu może odczytać dowolny wykres, a odpowiednio skategoryzowany będzie rozpoznawalny. Mogą to być pliki wave (NLP) czy nawet wykres drgań - planuje przykleić akcelerometr do drogi i analizować przejazd pojazdu - każdy inaczej "brzmi", można rozpoznawać rodzaj (wielkość), może prędkość.
Zagrożenia - wszystko może być trucizną.
W kontekście wymiany naszych liczników energii na te "inteligentne" pojawia się pytanie, czy ktoś nie będzie chciał wykorzystać do swoich celów z tak dość zaawansowanej możliwość analizy zachowań odbiorcy.
A jak powyżej udowodniłem jest to możliwe.
Urządzenie zastosowane mobilnie może też "szpiegować" jakie odbiorniki włączamy, kiedy itp (obecność). W zasadzie opowiada o wszystkich naszych codziennych nawykach...
Dodaję kod źródłowy do ESP32 (platformio), reszta wymaga jeszcze pracy.
Pozdrawiam,
p.
Cool? Ranking DIY