Kategoria: OpenWrt

OpenWrt 18.06.1 + TP-Link WR841N = Czujnik temperatury cz.3

Jak pisałem w części 2 ostatnim krokiem będzie skonfigurowanie usługi SNMP na naszym czujniku abyśmy mogli monitorować temperaturę poprzez sieć.

Zaczynamy od konfiguracji SNMP. Edytujemy plik /etc/config/snmpd, interesuje nas sekcja

root@OpenWrt:~# nano /etc/config/snmpd
~
config system
        option sysLocation      'Monitorowana szafka' # Pole Location opisujące lokalizację czujnika
        option sysContact       'nasz@adres.email' # Pole Contact opisujące adres email, numer telefonu itp.
        option sysName          'OpenWrt_Temp' # Pole Name opisujęce nazwę urządzenia odczytywaną po SNMP
#       option sysServices      72
        option sysDescr         'OpenWrt Temperatura' # Pole Descryption z opisem urządzenia odczytywanym po SNMP
#       option sysObjectID      '1.2.3.4'
config exec
        option name     Temperatura
        option prog     /bin/cat
        option args     /etc/config/temp.txt
#       option miboid   1.2.3.4
~

Pod Windowsem korzystam z programu SNMPWalk od SolarWinds, jest to mały program pozwalający wykonać polecenie snmpwalk na urządzeniu i wynik zapisać do pliku tekstowego.snmpwalkJeżeli już wszystko ustawiliśmy wg. swoich danych zapisujemy i zamykamy edytor. Usługę snmpd uruchamiamy podobnie do usługi cron poleceniami:

root@OpenWrt:~# /etc/init.d/snmpd start
root@OpenWrt:~# /etc/init.d/snmpd enable

Po tych zabiegach możemy przetestować działanie naszego czujnika temperatury. Możemy przeskanować cały zakres OIDów lub tylko gałąź 1.3.6.1.4.1.2021.8.1, która zawiera dane odnośnie temperatury.

.1.3.6.1.4.1.2021.8.1.1.1 = INTEGER: 1
.1.3.6.1.4.1.2021.8.1.2.1 = STRING: "Temperatura"
.1.3.6.1.4.1.2021.8.1.3.1 = STRING: "/bin/cat /etc/config/temp.txt"
.1.3.6.1.4.1.2021.8.1.100.1 = INTEGER: 0
.1.3.6.1.4.1.2021.8.1.101.1 = STRING: "28"
.1.3.6.1.4.1.2021.8.1.102.1 = INTEGER: 0
.1.3.6.1.4.1.2021.8.1.103.1 = STRING: ""

Dalej możemy już dowolnie takimi danymi zarządzać, przetwarzać itp. U siebie mam dodaną taką czujkę jako urządzenie w Cacti, dodatkowo stworzony template odczytujący dany OID. Utworzony również template w pluginie Thold, monitorujący i alarmujący jeżeli temperatura wychodzi poza górny lub dolny zakres.

Cacti Tempratura SNMP

Cacti Tempratura SNMP

OpenWrt 18.06.1 + TP-Link WR841N = Czujnik temperatury cz.2

Witam w części drugiej, w niej zajmiemy się modyfikacją sprzętową. Dodamy jeden czujnik na jednej z dostępnych linii GPIO. Dostępne linie GPIO sprawdzimy poleceniem:

root@OpenWrt:~# cat /sys/kernel/debug/gpio
gpiochip0: GPIOs 0-31, parent: platform/ath79-gpio, ath79-gpio:
 gpio-3   (                    |tp-link:green:qss   ) out hi
 gpio-4   (                    |tp-link:green:wan   ) out hi
 gpio-11  (                    |tp-link:green:lan4  ) out hi
 gpio-12  (                    |Reset button        ) in  hi
 gpio-13  (                    |tp-link:green:wlan  ) out hi
 gpio-14  (                    |tp-link:green:lan3  ) out hi
 gpio-15  (                    |tp-link:green:lan2  ) out hi
 gpio-16  (                    |tp-link:green:lan1  ) out hi
 gpio-17  (                    |WIFI button         ) in  hi

gpiochip1: GPIOs 494-511, parent: platform/qca953x_wmac, ath9k-phy0:
 gpio-495 (                    |ath9k-phy0          ) in  lo

Sprawdzone i dostępne linie to 11,13,14,15,16. Testowałem linię GPIO3 ale router nie uruchamia się wcale. Innych jeszcze nie miałem czasu przetestować, choć planuję to w najbliższej przyszłości.

Ale wracamy do czujnika temperatury. Potrzebujemy czujnik temperatury DS18B20, zamieszczam kartę produktu: https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf. Do tego rezystor 3.3k przewlekany oraz kilka przewodów do podłączenia.

WR841N_V9 Top

WR841N_V9 Top

WR841N_V9 Bottom

WR841N_V9 Bottom

Wykorzystamy GPIO13 od diody WLAN, jest to druga dioda od lewej patrząc od dołu PCB. Na początek musimy usunąć diodę, można pomóc sobie małą ilością nowej cyny. Potrzebne są też trzy przewody o odpowiedniej długości, które cynujemy po obu stronach. Wszystko łączymy jak na zdjęciu poniżej:

WR841N_V9 DB18B20Jeżeli wszystko mamy przylutowane możemy złożyć router. Podpinamy zasilanie oraz łączymy się z naszym routerem po SSH. Teraz kilka poleceń aby odzyskać linie GPIO używane przez system i wykorzystać je do własnych celów.

Na początek dodajemy zawartość do pliku /etc/rc.local który jest uruchamiany przy starcie:

root@OpenWrt:~# cat /etc/rc.local
# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.
/bin/sh /etc/config/leds.sh
exit 0

Tworzymy plik /etc/config/leds.sh i wklejamy do niego zawartość oraz nadajemy mu bit wykonywalności:

root@OpenWrt:~# touch /etc/config/leds.sh
root@OpenWrt:~# cat /etc/config/leds.sh
/bin/echo "leds-gpio" > /sys/bus/platform/drivers/leds-gpio/unbind
/bin/sleep 5
/sbin/insmod w1-gpio-custom bus0=0,13,0
root@OpenWrt:~# chmod +x /etc/config/leds.sh

Plik ten będzie uruchamiany przy starcie systemu. Restartujemy nasz router. Jeżeli wszystko poszło ok to w katalogu /sys/bus/w1/drivers/w1_slave_driver/ powinien pojawić się katalog o nazwie XX-YYYYYYYYYY w moim przypadku jest to:

root@OpenWrt:~# ls -l /sys/bus/w1/drivers/w1_slave_driver/
lrwxrwxrwx    1 root     root             0 Sep 30 12:51 28-00ff984302e5 -> ../../../../devices/w1_bus_master1/28-00ff984302e5
--w-------    1 root     root          4096 Sep 30 13:11 bind
--w-------    1 root     root          4096 Sep 30 13:11 uevent
--w-------    1 root     root          4096 Sep 30 13:11 unbind

Temperaturę odczytujemy drugim skryptem, dodatkowo skrypt tworzy plik tekstowy temp.txt z aktualną temperaturą. Skrypt ten dodany został do crona i jest uruchamiany co pięć minut, częstotliwość można zmienić wg. własnego upodobania.

root@OpenWrt:~# touch /etc/config/temp.sh
root@OpenWrt:~# cat /etc/config/temp.sh
awk -F= '/t=/ {printf "%.0f\n", $2/1000}' /sys/bus/w1/drivers/w1_slave_driver/28-00ff984302e5/w1_slave > /etc/config/temp.txt
root@OpenWrt:~# chmod +x /etc/config/temp.sh

root@OpenWrt:~# touch /etc/crontabs/root
root@OpenWrt:~# cat /etc/crontabs/root
*/5 * * * * /etc/config/temp.sh
root@OpenWrt:~# /etc/init.d/cron start
root@OpenWrt:~# /etc/init.d/cron enable

W tym momencie możemy sprawdzić poprawność skryptów. Możemy uruchomić skrypt ręcznie lub poczekać pięć minut i sprawdzić czy pojawił się plik /etc/config/temp.txt i poleceniem cat /etc/config/temp.txt sprawdzić jego zawartość.

root@OpenWrt:~# cat /etc/config/temp.txt
28

W tym momencie kończymy drugą część, trzecia część będzie już krótka i opisywać będzie uruchomienie usługi SNMP. Konfiguracja i sprawdzenie poleceniem snmpwalk poprawności ustawień.

OpenWrt 18.06.1 + TP-Link WR841N = Czujnik temperatury cz.1

Ostatnio wpadł mi pomysł do głowy na monitorowanie kilku lokalizacji. Chodziło głównie o temperaturę w pomieszczeniu, szafie serwerowej czy wewnątrz skrzyni powieszonej na ścianie czy maszcie. Przeglądając internet i szukając trafiłem na sondy temperatury odczytywanej po SNMP, jednak koszt 300zł był dla mnie mało atrakcyjny. Ilość jakiej potrzebowałem to kilkanaście sztuk, może i więcej. Zainteresowałem się tematem, zmalałem wiele opisów takich sond opartych o routery z wgranym OpenWrt i podpiętym pod USB konwerterem na RS232 i do tego czujnik DS18B20 1-wire. Gra warta świeczki bo koszt takiej czujki spadł nam już w okolice 100zł. Jest o co walczyć, w cenie jednej sondy mamy trzy. Ale dalej wgłębiałem się w temat. OpenWrt jest projektem o wielu możliwościach, może być nie tylko routerem ale też dyskiem sieciowym czy kontrolerem z podpiętymi przekaźnikami na liniach GPIO. Zgłębiając dalej temat znalazłem informację, że na linii GPIO mogę również podłączyć czujnik 1-wire. Zapaliła się lampka w mojej głowie, mam jeden wolny router w szufladzie, jest to wspomniany w temacie WR841N.

Pierwszą sprawą było przygotowanie sobie obrazu OpenWrt dla tego modelu routera. Można skorzystać z gotowego obrazu, jednak nie ma on w standardzie paczek 1-wire a ilość wolnego miejsca jest bardzo skromna. Router jaki posiadam to v9.1, 550MHz, 4MB FLASH oraz 32MB RAM.

Do stworzenia takiego obrazu potrzebujemy środowiska Linuksowego x64. Czy jest to fizyczna maszyna czy wirtualna nie ma znaczenia. Jak zapewnić sobie takie środowisko odsyłam do źródła: Image Builder

Przechodzimy do katalogu ze źródłami. Do budowania obrazów OpenWrt posiłkuję się skryptem:

make -j2 image PROFILE=tl-wr841-v9 PACKAGES="kmod-w1 kmod-w1-master-gpio kmod-w1-gpio-custom kmod-w1-slave-therm terminfo libnetsnmp snmpd libncurses nano base-files busybox dnsmasq dropbear -firewall fstools -ip6tables -iptables kernel kmod-ath9k kmod-gpio-button-hotplug libc libgcc logd mtd netifd -odhcp6c -odhcpd-ipv6only opkg -ppp -ppp-mod-pppoe swconfig uboot-envtools uci uclient-fetch wpad-mini"

Krótkie wyjaśnienie parametrów w skrypcie:

  • -j2 oznacza kompilowanie w dwóch wątkach jednocześnie, w zależności od ilości rdzeni/procesorów na maszynie gdzie budujemy obrazy
  • image PROFILE=tl-wr841-v9 oznacza pod jaki router budujemy obraz, bez tego parametru będziemy budować obrazy dla każdego rodzaju routera co znacząco wydłuży czas budowy i będzie marnotrawieniem czasu
  • lista PACKAGES zawiera jakie pakiety będą dodane lub usunięte (te z – na początku nazwy) z budowanego obrazu

W katalogu bin/targets/ar71xx/tiny/ znajdują się nasze obrazy:

marcin@openwrt:~/openwrt1806_wr841n$ ls -l bin/targets/ar71xx/tiny/
razem 22012
-rw-r--r-- 1 marcin users    1678 wrz 28 14:31 openwrt-18.06.1-ar71xx-tiny-device-tl-wr841-v9.manifest
-rw-r--r-- 1 marcin users 2490368 wrz 28 14:31 openwrt-18.06.1-ar71xx-tiny-root.squashfs
-rw-r--r-- 1 marcin users 3932160 wrz 28 14:31 openwrt-18.06.1-ar71xx-tiny-tl-wr841-v9-squashfs-factory.bin
-rw-r--r-- 1 marcin users 3538948 wrz 28 14:31 openwrt-18.06.1-ar71xx-tiny-tl-wr841-v9-squashfs-sysupgrade.bin
-rw-r--r-- 1 marcin users 1348203 wrz 28 14:31 openwrt-18.06.1-ar71xx-tiny-uImage-lzma.bin
-rwxr-xr-x 1 marcin users 4234996 wrz 28 14:31 openwrt-18.06.1-ar71xx-tiny-vmlinux.bin
-rwxr-xr-x 1 marcin users 4240120 wrz 28 14:31 openwrt-18.06.1-ar71xx-tiny-vmlinux.elf
-rw-r--r-- 1 marcin users 1376256 wrz 28 14:31 openwrt-18.06.1-ar71xx-tiny-vmlinux.lzma
-rwxr-xr-x 1 marcin users 1358324 wrz 28 14:31 openwrt-18.06.1-ar71xx-tiny-vmlinux-lzma.elf
-rw-r--r-- 1 marcin users    1027 wrz 28 14:31 sha256sums

Jeżeli mamy router z fabrycznym oprogramowaniem to wybieramy obraz *-factory.bin, jeżeli mamy już wgranego OpenWrt to wybieramy obraz *-sysupgrade.bin. W nowych fabrycznych firmware jest ograniczenie ilości znaków w nazwie wgrywanego obrazu, przed wybraniem go trzeba sobie skrócić jego nazwę. Jeżeli dodajemy jakieś paczki do budowanego obrazu to przed wgrywaniem go na router należy sprawdzić jego rozmiar, powinien być zawsze 3932160, jeżeli jest więcej to przesadziliśmy z ilością pakietów i taki obraz nie wgra się poprawnie.

Jeżeli wszystko poszło ok to router rozdziela adresy IP na portach LAN, na porcie WAN jest klient DHCP czekający na adres. Po instalacji router ma aktywny telnet. Należy za jego pomocą zalogować się jako root do routera, nie ma hasła, i ustawić hasło poleceniem passwd. Jeżeli ustawimy hasło, serwer telnet zostanie wyłączony i zarządzamy naszym routerem poprzez klienta SSH.

Dla ww. wersji użycie pamięci FLASH ma się jak poniżej:

root@OpenWrt:~# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                 2.0M      2.0M         0 100% /rom
tmpfs                    13.6M     60.0K     13.6M   0% /tmp
/dev/mtdblock3          512.0K    240.0K    272.0K  47% /overlay
overlayfs:/overlay      512.0K    240.0K    272.0K  47% /
tmpfs                   512.0K         0    512.0K   0% /dev

Mamy przygotowany system do pracy z sensorami na 1-wire, w tym czujnikiem temperatury DS18B20. W części drugiej będzie o tym jak podłączyć czujnik pod jedną diodę LED routera i wykorzystać GPIO do odczytu temperatury z czujnika.