Odczyt temperatury przez internet
Tytuł tego wpisu jest nieco ogólny – przedstawione niżej rozwiązanie mierzy temperaturę, zapisuje ją, rysuje wykresy i umożliwia wyświetlenie całości na dowolnym urządzeniu z dostępem do internetu wyposażonym w przeglądarkę. Inspiracją do zbudowania takiego mini serwera meteo, było rozwiązanie, które znalazłem na stronie eko.one.pl.
Założenia projektu
Chciałem, by mój serwer temperatury pracował ciągle, 24 godziny na dobę, 7 dni w tygodniu. W związku z tym urządzenie wykorzystane do tego celu musi być energooszczędne i ciche. Odpada więc typowy PC. Nadaje się do tego router, na którym można zainstalować openwrt, ale to znowu nie daje tak elastycznej platformy jak w przypadku architektury 686 i ma dosyć ograniczoną wydajność. Za routerem przemawia bardzo atrakcyjna cena – około 100zł. Poszukałem trochę w sieci i znalazłem idealny dla mnie kompromis: cienki klient, czy ThinClient. Jest to komputer PC, który ma służyć jako terminal, więc posiada energooszczędny procesor, niewiele pamięci RAM, ale można ją wymieniać, dysk Flash o bardzo małej pojemności, ale jest też gniazdo IDE 44pin. Do tego porty: LPT, RS232, USB i PS2. Zainteresował mnie model HP T5720 – procesor AMD 1,5GHz, 256MB RAM i 512MB Flash. Całość z wysyłką – 118zł. Taka konfiguracja sprzętowa jest bardzo na wyrost do systemu pomiaru temperatury, więc można zbudować sobie domowy mini serwer www, email czy FTP. Dodatkowe zalety to niewielki pobór prądu i brak wentylatorów.
Instalacja linuksa na HP T5720
Jak wspomniałem wcześniej, posiadany przeze mnie HP jest wyposażony w mały dysk Flash o pojemności 512MB, na którym jest zainstalowany Windows XP Embedded. To dosyć niewielka pojemność, więc postanowiłem zainstalować Debiana na pendrive’ie. W tym celu ściągnąłem z internetu obraz iso Debiana 7.0 “Wheezy” w wersji net install. Przy pomocy unetbootin przygotowałem bootowalny pendrive, z którego uruchomiłem ThinClienta. Instalując Debiana wybrałem tylko serwer ssh i podstawowe pliki systemu. Oczywiście terminal musi być podłączony do internetu, by instalator mógł ściągać pakiety. System został zainstalowany na tym samym pendrive’ie, na którym znajdowała się instalka. W moim przypadku był to 4 letni Kingstone DataTravel 4GB.
Instalacja dodatkowych pakietów
Mini serwer musi mieć połączenie z internetem, dołączone zasilanie i czujnik temperatury. Ponieważ im mniej kabli tym lepiej, postanowiłem dołączenie do sieci zrealizować za pomocą karty WiFi wpinanej w USB. Kupiłem taniego TP-Linka TL-WN722N, który działa w Wheezy po doinstalowaniu firmware. Ściągnąłem jeszcze pakiet wpasupplicant, dzięki któremu mogłem się podłączyć z moją siecią szyfrowaną w WPA2. Dodatkowo skonfigurowałem stały adres IP na bezprzewodowym interfejsie, sprawdziłem czy wszystko działa i odłączyłem kabel sieciowy od T5720.
Kolejny niezbędny pakiet do działania całości to digitemp, którym obsługuję interfejs DS9097 z dołączonym czujnikiem DS18b20. Do rysowania wykresów wykorzystuję gnuplot, który również trzeba doinstalować. Serwer www zrealizowałem standardowo na apache’u, czyli kolejny potrzebny pakiet to apache2. Ponieważ moje łącze internetowe to ADSL ze zmiennym IP, niezbędny okazał się inadyn, który aktualizuje adres w serwisie dyndns.com.
Oprócz wyżej wymienionych można jeszcze doinstalować pakiety, które ułatwiają nam pracę, np. vim czy mc.
Konfiguracja
Następny etap budowy serwera temperatury to jego konfiguracja. Na początek ustawiłem w BIOS’ie terminala, by po powrocie zasilania automatycznie się włączał. Pozostałe czynności, zrobione już w systemie są wykonywane na koncie root.
Warto poświęcić chwilę i zoptymalizować system pod kątem jak najmniejszej ilości zapisów na pendrive’ie, które skracają jego żywotność. Ja zacząłem od ograniczonego korzystania ze swapa przez system. W tym celu trzeba wyedytować plik /etc/sysctl.conf i dopisać w nim linijkę:
vm.swappiness=5
Następnie sprawdźmy, czy katalog /tmp znajduje się w pamięci RAM. Wystarczy otworzyć plik /etc/default/tmpfs i odnaleźć linijkę:
RAMTMP=yes
Jeśli ten parametr jest ustawiony na ‘no’, należy to zmienić na ‘yes’. Po restarcie serwera, można sprawdzić, czy wszystko jest ok, wydając komendę:
df -h
W odpowiedzi powinniśmy uzyskać podobny ekran, na którym zobaczymy, że tmp jest zamontowany w pamięci RAM (ostatnia linijka):
Teraz można podłączyć interfejs DS9097 z czujnikiem DS18b20. Jego budowę opisałem dosyć dokładnie tutaj: Bardzo prosty i tani termometr komputerowy. HP T5720 posiada port RS232, ale interfejs nie działał na nim zbyt dobrze, losowe odczyty temperatury wynosiły 85,00. Postanowiłem rozbudować interfejs o osobne zasilanie czujnika, według poniższego schematu:
Ten interfejs wymaga 3-żyłowego przewodu, ale czujnik może mierzyć temperatury wyższe, niż 85°C. Niestety takie rozwiązanie nie pomogło i nadal czasem odczyty były zafałszowane. Zastosowałem więc przejściówkę USB->RS232 na chipie PL2303, która działa w linuxie zaraz pod podłączeniu, bez konieczności instalowania i konfigurowania czegokolwiek:
Kupiłem ją na ebay z darmową wysyłką za niecałe 3$.
By całość poprawnie działała, trzeba wygenerować plik z ustawieniami, czyli:
digitemp_DS9097 -i -s /dev/ttyUSB0 -a
Powinniśmy otrzymać odczyt temperatury. Jeśli interfejs jest podłączony bezpośrednio pod port RS232, ttyUSB0 trzeba zastąpić przez ttyS0 lub ttyS1. Wygenerowany plik /root/.digitemprc trzeba wyedytować – odpowiednią linijkę zaznaczyłem na czerwono:
Dzięki temu, do pliku będzie zapisywała się data, godzina i temperatura w °C. Można sprawdzić, czy format jest poprawny wydając polecenie:
digitemp_DS9097 -a
Jeśli wszystko działa poprawnie, można przystąpić do zautomatyzowania całego procesu pomiaru i wizualizacji. Na początek pomocniczy skrypt dla zainstalowanego wcześniej gnuplot’a. Ja nazwałem go plot_skrypt i umieściłem w katalogu /usr/bin/:
W skrócie: generujemu dwa pliki png o wymiarach 590x350px. Na pierwszym wykresie znajdują się 2 krzywe – pomiar rzeczywisty i uśredniony funkcją Beziera – temperatura z ostatniej doby, pomiary w pliku temp_doba.txt (o którym później), drugi wykres to krzywa obrazująca temperaturę z ostatniego tygodnia, również uśredniona, dane pochodzą z pliku temp_tydzien.txt. Obrazki są generowane do katalogu /tmp, który znajduje się w pamięci RAM.
Drugi, główny skrypt o nazwie temperatura.sh również umieściłem w /usr/bin/. Wygląda on tak:
Jego działanie polega na wywołaniu digitemp’a i zapisaniu wyniku pomiaru do pliku /var/log/temperatura.txt – jest to główna baza danych. Następnie tworzony jest w folderze /tmp plik temp_tydzien.txt, który zawiera 1008 ostatnich linijek z pliku temperatura.txt – czyli pomiar temperatury z ostatnich 7 dni, przy założeniu, że mierzymy co 10 minut. 3 linijka tworzy plik temp_doba.txt zawierający 144 ostatnie pomiary z głównej bazy danych, czyli temperatura z ostatnich 24h. Na koniec wywołujemy gnuplot’a z wcześniej napisanym skryptem, który narysuje ładne wykresy na podstawie wygenerowanych przed chwilą plików i umieści jest w katalogu /tmp.
Plik temperatura.sh musi posiadać prawa do wykonywania, czyli:
chmod 755 /usr/bin/temperatura.sh
Teraz trzeba zadbać o wykonywania pomiarów oraz generowanie wykresów co 10 minut. Pomoże nam w tym cron, który właśnie co taki okres będzie uruchamiał napisany przed chwilą skrypt. Wpisujemy:
crontab -e
i dopisujemy linijkę:
0,10,20,30,40,50 * * * * /usr/bin/temperatura.sh &> /dev/null
Dzięki temu, każdego dnia, w 10 minutowych odstępach będziemy mieli aktualizowany plik temperatura.txt, generowane pliki z pomiarem dobowym, tygodniowym i świeże wykresy. Aby zmiany odniosły skutek, konieczny jest restart crona:
/etc/init.d/cron restart
Nadszedł czas, na wyświetlanie danych w przeglądarce internetowej. Na początek sprawdzamy czy działa zainstalowany wcześniej serwer www. W tym celu na dowolnym urządzeniu pracującym w sieci lokalnej odpalamy przeglądarkę www i w pasku adresu wpisujemy IP naszego serwera. Powinien pojawić się napis It works!
Wracamy do naszego serwera. Ja na szybko wyedytowałem plik /var/www/index.html:
Żeby całość działała poprawnie, musimy jeszcze zdefiniować dwa dowiązania symboliczne, czyli takie skróty do naszych obrazków z wykresami, które są przecież w katalogu /tmp a nie /var/www. Załatwiają to polecenia:
ln -s /tmp/wykres_tydzien.png /var/www/wykres_tydzien.png
ln -s /tmp/wykres_doba.png /var/www/wykres_doba.png
Można teraz na jakimś komputerze odpalić przeglądarkę, wpisać ponownie IP naszego serwera i cieszyć się wykresami, które na początku będą dosyć ubogie ze względu na małą ilość pomiarów.
Logowanie zdalne do serwera
Ja mój serwerek umieściłem w miejscu mało widocznym i trudno dostępnym. Warto mieć do niego dostęp, bez konieczności podłączania monitora i klawiatury. W tym celu właśnie zainstalowaliśmy serwer ssh. Łatwo sprawdzić, czy działa on poprawnie. Na innym komputerze z linuxem wystarczy wpisać w terminalu:
ssh -l nazwa_uzytkownika ip_serwera
Po podaniu hasła możemy zdalnie administrować naszym serwerem. Na komputerze z Windowsem, dostęp uzyskamy dzięki popularnemu puTTy.
Dostęp do serwera z dowolnego miejsca na świecie 😉
Fajnie jest mieć możliwość odczytu temperatury nie tylko z sieci w domu, ale także z dowolnego miejsca poza nim. Pierwszą rzecz jaką trzeba zrobić, to przekierować porty na naszym routerze, by wiedział gdzie kierować ruch z zewnątrz. Do poprawnego wyświetlania strony www trzeba zrobić forwarding portu TCP 80 na IP naszego serwerka. Jeśli chcemy również nim administrować, w ten sam sposób postępujemy z portem TCP 22.
Jeśli mamy ADSL ze zmiennym IP (np. neostrada), to wszystko będzie ładnie działało, do czasu zmiany adresu WAN na inny. Aby to obejść, trzeba założyć sobie konto w serwisach typu dyndns.com, utworzyć tam domenę i odpowiednio skonfigurować klienta na komputerze, w naszym przypadku będzie to zainstalowany wcześniej inadyn. Kluczem do poprawnego uaktualniania jest plik konfiguracyjny z odpowiednimi wpisami. Jego ścieżka to /etc/inadyn.conf, u mnie wygląda on tak:
Linijki z username i password muszą zawierać nasze dane do serwisu dyndns.com, 3 wiersz powoduje aktualizację IP co 10 minut, o ile ten uległ zmianie, wymuszona aktualizacja następuje co 12 godzin, uaktualniana domena to meteo.dyndns.biz. Inadyn ma działać jako deamon (opcja background) i jako ostatnia, ścieżka do zapisu logów. Więcej informacji znajduje się w dokumentacji inadyna.
Pozostała jeszcze kwestia uruchamiania tego pakietu, najlepiej przy starcie systemu. Można to zrobić cronem, czyli:
crontab -e
i dopisujemy linijkę
@reboot /usr/sbin/inadyn
Można zrobić restart całego serwera i po uruchomieniu sprawdzić, czy inadyn pracuje. Jeśli dodatkowo zrestartujemy router, w ciagu 10 minut powinien zostać uaktualniony adres IP i po wpisaniu domeny w przeglądarkę możemy się cieszyć wykresami.
Przykład działania mojego serwera temperatury można znaleźć tutaj: Temperatura. W przypadku problemów z konfiguracją warto posłużyć się dokumentacją do danego pakietu i korzystać aktywnie z googli :). W opisie mogłem coś nieświadomie pominąć – całość konfigurowałem już jakiś czas temu. W takim przypadku proszę o informację, dzięki której poprawię opis.
Usprawnienia i bezpieczeństwo
Powyższy opis to tylko przykładowa konfiguracja. Przyznaję tutaj również, że w temacie linuksa jestem początkujący, więc przytoczone rozwiązania nie są idealne.
Na pewno w temacie bezpieczeństwa warto zrobić kilka rzeczy:
- zmienić port ssh na inny niż domyślny 22 (plik /etc/ssh/sshd_config, linijka Port 22), zmieniamy wtedy również przekierowanie na routerze, zmniejszy to próby “odwiedzin” przez boty;
- odmówić logowania przez ssh dla konta root (plik /etc/ssh/sshd_config, zmienić zapis PermitRootLogin z yes na no) – mniejsza szansa na włamanie przez konto root;
- zmienić domyślny port 80 na inny w konfiguracji apache’a (analogicznie należy postąpić z przekierowaniem tego portu na routerze) – zmniejsza liczbę odwiedzin przez boty, próbujące się włamać;
- przenieść folder /var/log do pamięci RAM by ograniczyć zapisy na pendrive’ie – UWAGA – wtedy też należy zmienić położenie pliku temperatura.txt na inne, bo po restarcie utracimy wszelkie zapisane w nim dane
- automatyczne backupowanie pliku temperatura.txt poprzez cykliczne wysyłanie na maila czy inny pendrive
Mój serwer działa już ponad miesiąc, jak na razie bezawaryjnie. Od czasu do czasu loguję się do niego i wprowadzam jakieś niewielkie usprawnienia.
Fajny artykuł. Dla mnie podwójnie, bo też się zastanawiam jak podejść do podobnego tematu. Nie wiem, jak to wygląda cenowo (pewnie nieco gorzej, niż prezentowany tutaj HP T5720), ale do tego samego zadania można użyć Raspberry Pi. Fakt, nie jest to rozwiązanie tak “elastyczne”, jak architektura x86, ale mniej prądożerne i też bazujące na w miarę normalnej wersji Linuksa. Jeszcze link do takiego projektu (żeby nie być gołosłownym):
http://www.cl.cam.ac.uk/freshers/raspberrypi/tutorials/temperature/
A od strony programowej, zamiast gnuplota można użyć rrdtool 🙂
K.
@Konrad Rozważałem też Raspberry, ale bałem się, że nie dam rady skonfigurować całości i pewnie też ciężej z informacjami w internecie w tym temacie. Jeśli chodzi o wykresy to podchodziłem do tematu pierwszy raz i stwierdziłem, że skoro prawie wszyscy korzystają z rrdtool’a, to ja zrobię to na gnuplocie :).
Przyszłościowo myślę o monitorowaniu kilku parametrów serwera (ram, procesor, dysk, sieć) i wtedy pewnie gnuplota zastąpi rrdtool, który chyba jest wygodniejszy w użyciu (skoro wszędzie go pełno).
Jeżeli chodzi o RPi, to informacji na jego temat jest w Sieci mnóstwo, więc braku dostępu do wiedzy bym się raczej nie obawiał. Chociaż nie na wszystkie pytania możemy znaleźć odpowiedź. Przykładowo szukałem ostatnio informacji, czy jest gotowy moduł 1-wire pod malinowego Archa i wyszło na to, że będę to musiał sprawdzić empirycznie.
A co do samego obrazowania, to wykres gnuplot’a wygląda naprawdę fajnie i “niestandardowo” (szczególnie dla kogoś, kto codziennie gapi się na obrazki generowane przez rrdtool :-)).
Aha, monitorowanie zasobów maszyny za pomocą czystego rrdtool to trochę odkrywanie koła. Fajne z punktu widzenia zdobywania wiedzy, ale jeżeli chodzi jedynie o osiągnięcie określonego celu, to szkoda czasu – lepiej użyć czegoś do takich celów dedykowanego. Choćby Cacti lub Zabbixa.
K.
@Konrad Nie znalazłem w sieci gotowego rozwiązania na RPi temperatura->wykresy->www i miałem obawy, że będę miusiał coś kompilować ze źródeł albo co gorsza napisać samemu jakiś zaawansowany skrypt.
W temacie monitorowania innych jeszcze parametrów, to myślałem właśnie o jakimś gotowcu, żeby tak jak piszesz, nie zarywać nocy robiąc coś, co może działać dobrze przy minimalnym nakładzie pracy. Przeglądałem wstępnie 2 czy 3 rozwiązania i opierały się one na rrdtool.
@Wojtek
Na RPI polecam nettemp’a http://techfreak.pl/nettemp
@boczek Dzięki za linka. Raspberry już czeka na realizację kilku pomysłów, które na pewno zagoszczą na stronie.
ten cienki klient ma wewnatrz obudowy (o ile dobrze pamietam) dodatkowe 2 sloty usb akurat na karte wifi i pendriva 🙂 i nic poza antenka niebedzie wystawac poza obrys urzadzenia
Fajny pomysł. Mam takie jedno pytanie – jaki jest dolny zakres pomiaru temperatury?
@access_denied -55°C do +125°C
Też zastanawiam się nad takim rozwiązaniem i chcę kupić jakiś terminal. Wydajność ma mniejsze znaczenie, ale ważny jest pobór prądu. Wojtek, sprawdzałeś może ile ten Twój HP T5720 zużywa?
@Michał T5720 z WiFi i pendrivem wpiętymi w USB pobiera około 17W. Pod obciążeniem (aktualizacja Debiana) wzrasta do 21-22W.
Dzięki za info. To stosunkowo niedużo, biorąc pod uwagę wydajność tego sprzętu. U mnie śmigałoby to bez Wifi, czyli jeszcze ciut mniej@Wojtek
Właśnie walcze z tym samym terminalem i tą samą kartą wifi ale na terminalu mam openwrt. Pomijając fakt że z terminala mam teraz router i co tylko mi się jeszcze zachce to jako mowa jest o termometrze to pochwalę się że mam podłączone 9 czujników pogodowych które zwracają 14 parametrów. To z pomocą przyszło mi arduino.
Openwrt zainstalowany mam na pendriwe w usb leży wifi, modem 3g, arduino, dvbt, klawiatura numeryczna jako panel sterowania.
Wszystkie usb zajęte i ciężko mi było wykręcić 19W
Ja jakiś czas temu porzuciłem terminal na rzecz Banana Pi – 4-krotnie mniejsze zużycie energii, moc obliczeniowa i cena porównywalna, więcej ramu. Polecam.