Raspberry Pi – sterowanie LED i odczyt temperatury CPU i dysku

Parę dni temu zamówiłem opisywanego wcześniej Banana Pi, którego mam nadzieję użyć jako następcę Raspberry Pi w NAS. Nie wiem co stanie się z obecnym rpi, więc dla pamięci zapiszę parę przydatnych rzeczy, których używam.

Oczywiście do Raspberry Pi można podłączyć LEDy, termometry i ogólnie cuda na kiju (czy tam raczej na GPIO), ale warto też wiedzieć, że jest wbudowany czujnik, z którego można czytać temperaturę CPU. Podobnie jak LED, którym można sterować. Wszystko z wiersza poleceń Linuksa, bezpośrednio z powłoki, bez dodatkowych skryptów czy też bibliotek.

Temperatura CPU

Nie pamiętam już źródła, ale temperaturę CPU w Raspberry Pi odczytać można z /sys/class/thermal/thermal_zone0/temp Jednostka w której jest podawana to tysięczne stopnia Celsjusza, więc pewnie warto będzie zamienić na coś bardziej ludzkiego, np. na stopnie Celsjusza z dokładnością do jednej dziesiątej stopnia (zaokrąglanie):

awk '{printf("%.1f\n",$1/1e3)}' /sys/class/thermal/thermal_zone0/temp

Temperatura dysku

Skoro już sprawdzamy temperaturę, to warto też czytać ją z dysku, o ile taki mamy podłączony do Raspberry Pi. Główna zaleta jest taka, że mniej podatna na chwilowe zmiany i bardziej związana z temperaturą otoczenia. Praktycznie każdy dysk ma czujnik temperatury i można czytać z niego dane przy pomocy S.M.A.R.T. Pobranie samej wartości w stopniach Celsjusza z /dev/sda:

/usr/sbin/smartctl -A /dev/sda | grep -i temp | awk '{print $10}'

Ponieważ zdarzyło mi się raz, że nazwa dysku podczas pracy zmieniała się z /dev/sda na /dev/sdb (nie mam pojęcia czemu) i miałem dziurę w logach, to w skrypcie do logowania obu tych danych stosuję na to obejście (przy okazji pozwoli na czytanie z większej ilości dysków). Cały skrypt (który uruchamiam z crona co godzinę):

#!/bin/bashlogger -t temperature "RPi `awk '{printf("%.1f\n",$1/1e3)}' /sys/class/thermal/thermal_zone0/temp`"for i in `ls /dev/sd?`; dologger -t temperature "Disk `/usr/sbin/smartctl -A $i | grep -i temp | awk '{print $10}'`"done

Sterowanie LED

Większość opisów sterowania LED przy pomocy Raspberry Pi dotyczy tych podłączanych przez GPIO, ale samo rpirównież umożliwia użytkownikowi sterowanie jednym z wbudowanych LEDów. Od razu ostudzę zapał – jest to jedna zielona dioda z kilku LEDów w różnych kolorach świecących się i migających podczas pracy, więc użyteczność OOTB jest mierna. Można się oczywiście bawić w zasłonięcie pozostałych LEDów czy wyprowadzenie na obudowę „światłowodem” tej jednej, albo wyprowadzenie jej w określone miejsce na obudowie, co niewątpliwie zwiększy czytelność, ale to już trochę inna bajka. Polecenia przepisane z wpisu Raspberry Pi – Control the on board LED lights (polecam wpis; blogi znikają, wolę mieć backup).

Wyłączenie triggera (domyślnie pokazuje aktywność mmc0):

echo none > /sys/class/leds/led0/trigger

Zapalenie LED:

echo 1 >/sys/class/leds/led0/brightness

Zgaszenie LED:

echo 0 > /sys/class/leds/led0/brightness

Nie wykorzystuję tego w praktyce z uwagi na wspomnianą małą widoczność. Można w prosty sposób oprogramować i sygnalizować… cokolwiek, w dodatku na minimum 3 stanach (zgaszony/migający/zapalony). Przy odrobinie chęci można dodać obsługę częstotliwości migania. Jeśli chodzi o potencjalne zastosowania, to pierwsze co mi przyszło do głowy, to sygnalizacja temperatury z poprzednich akapitów. Wersja z kilkoma częstotliwościami świetnie nadaje się do informowania o aktualnym zużyciu pasma.

10 odpowiedzi na “Raspberry Pi – sterowanie LED i odczyt temperatury CPU i dysku”

  1. Skrypt Ci zjadło.
    Poza tym ile razy pokazuje Ci wynik odczytu temperatury? Bo u mnie na Debianie to działa, ale zwraca podwójne wyniki (temperatura jest pod ID 190 i 194). Korzystam jak dotąd z hddtemp.

  2. @Monter Czym czytasz? Bo skrypt jak najbardziej jest widoczny (wklejka gist) w typowych graficznych przeglądarkach.

    Jeśli chodzi o dyski, to wynik pokazuje mi raz. I nigdy nie miałem dysku, który pokazywał więcej, ale patrzę na wiki i faktycznie, jest inna wartość. Interesuje nas raczej ta z 194, więc można zmienić grep -i temp na – w sumie bardziej eleganckie i jednoznaczne egrep „^194”. To takie trochę na kolanie pisane…

    Jak już mamy całkiem elegancko robić, to grepowanie można pominąć, skoro korzystamy z awk i wtedy będzie:
    awk '/^194/ {print $10}’

  3. Chrome z wtyczkami AdBlock, Ghostery i ScriptSafe (dawniej ScriptNo), czyli raczej standardowy zestaw świadomego internauty. W zablokowanych nie widzę nic, co by się odnosiło do wklejki.
    (minęło pół chwili…)
    Pomogło dopiero wejście na gist.github.com i danie zielonego światła tej stronie w ScriptSafe. Dziwne.

    Hddtemp jako osobna aplikacja też jest fajne, pokazuje też model dysku, dodatkowo gdy dysk jest uśpiony dostajemy info „SLP” w wyniku. Wyniki można też otrzymać odwołując się do nazwy hosta i ustawionego portu (za pomocą netcat lub telnet), bo hddtemp może pracować jako daemon. Ale pewnie dla miniaturki jakiej używasz nie ma sensu stosowania takiego osobnego narzędzia.

  4. No widzisz, jak to nie wiadomo, co się traci mając blokery? 😉 Swoją drogą to NoScript dla Firefox czytelnie pokazuje, co zablokował (chyba, że jest reguła typu zawsze blokuj, to wtedy trzeba pogrzebać nieco).

    Hddtemp znam i jakoś nigdy nie mogłem się zmusić do instalacji dodatkowego programu, który i tak korzysta ze smartctl pod spodem. Demon miałby sens, ale musiałby działać z uwierzytelnianiem jakimś, a tego nie widzę w opisie. W sumie myślałem o zebraniu na jednej stronie danych (load, uptime, temperatura) ze wszystkich maszyn, ale raczej wystawiałbym z nich po HTTP dane, z uwierzytelnianiem do centralnego punktu.

  5. Wolę coś tracić niż dostać coś w prezencie od odwiedzanych stron ;o)

    Z ciekawości odpaliłem Twój wpis na kompie w pracy, czyli na pierwszym lepszym terminalu HP z Win7 Embedded zawierającym przeglądarkę IE. Tam też nie było widać Twojej wklejki, a IE w terminalach nie mają żadnych wtyczek ani blokerów. Ciekawe.

  6. Update: A na pewno hddtemp czyta dane w ten sam sposób co smartctl? Nie jestem tego pewien, bo odczyt temperatury za pomocą hddtemp na dysku uśpionym pokazuje stosowne info i dysku nie wybudza, natomiast użycie smartctl od razu budzi uśpiony dysk. Czyli Twoja metoda nie nadaje się do cyklicznego sprawdzania temperatury, bo dysk albo będzie stale wybudzany, albo po prostu nigdy nie uśnie.

    Swoją drogą przypomina mi to moją walkę z usypianiem dysku gdy w tle pracuje Webmin – może on też co chwila czyta dane Smart i dlatego dyski nie chcą „zasnąć”?

  7. @Monter: Gratuluję, zostałeś autorem tysięcznego komentarza na tym blogu. 🙂

    Odnośnie hddtemp – strona domowa savannah.nongnu.org/projects/hddtemp/ twierdzi, że hddtemp is a small utility that gives you the temperature of your hard drive by reading S.M.A.R.T. informations (for drives that support this feature). Czyli też czyta S.M.A.R.T., ale – z tego co widzę – korzystając z innych bibliotek. W smartctl -a czy -A to jednak odczyt wszystkich atrybutów, stąd pewnie rozpędzanie dysku (nawiasem, moje nie śpią).

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *