Hőmérséklet mérés régi TP-Link routeren OpenWRT-vel

Van pár régi TP-Link TL-WR[740, 741, 841, 941]* eszközöm OpenWRT-re frissítve. Ezek 10 évnél is idősebb routerek, már a maguk idejében is szenvedtek a gyári szoftver alatt, ha 4-6 eszköznél több csatlakozott rájuk. Ezekre az utolsó stabil firmware a 18.06-os ágon került fordításra, hivatalosan. Későbbi verziók tipikusan a flash-be nem fértek bele, vagy már a Luci felülethez kiszolgálásához is kevés volt a 32 MByte RAM. 4/32.
Felmerült bennem a kérdés, hogy adhatunk-e új célt ezeknek az eszközöknek. Házasítottam már wireguard VPN-t OpenWRT-vel. Elérhető rá a muninlite. Hódolva a hőmérsékletmérési kísérleteimnek (és DS18B20 imádatomnak) az "olcsó hőmérőre" esett a választásom. Az alany pedig egy TP-Link TL-WR740 v4.26 [devwiki], amit ha szerencsénk van akkor 1000 Ft alatt hozzánk vágnak a hardveraprón. De szerintem még van olyan kacatos doboz valamelyik családtagunknál, amelyikben valamelyik eszköz fellelhető.

Szoftveres módosítások

A terv az, hogy az eszköz egy NAT-olt hálózatban lenne, kifele kommunikáció csak wireguard-on keresztül történne. A későbbiekben a muninlite módosítva lenne, hogy találja meg és olvassa ki a DS18B20 szenzort ha a központi munin lekérdezi (ez most nem fért bele). Ehhez nincs szükség opkg-re, mert már minden csomagot felkerült fordításkor, wpa3 nem fog kelleni (a wifi sem fog működni rajta), ipv6 pedig ugyancsak nem kell, mert ipv4-en megy majd a kommunikáció.

Ahogy a bevezetőben is írtam, sajnos az új OpenWRT támogatás eléggé szűkös a 4/32 probléma miatt. A 19.07-es ágra esett a választás, amihez magunknak kell fordítani a firmware-t egy kis takarítás után. Magára az OpenWRT firmware fordításomra nem térnék ki, de tömören:
* Ubuntu 22.04.5-re lesz szükség (bizonyos csomagok igénylik a python2.7-et)
* A 19.07-es ágat forkoltam és cherrypick-eltem muninlite és dropbear-ssh javításokat. Ez lett a 19.07.11 nem hivatalos git tag.
* A régebbi ar71xx architektúrára (az ath79 az újabb, de stabilitási problémákat tapasztaltam) állítottam a célt.
* Kivettem pár kevésbé szükséges csomagot vagy funkciót (opkg, wpa3, ipv6, ...), amit nem használnék.
* Kivettem a kmod-gpio-button-hotplug és a wifitoggle csomagokat.
* Helyettük felvettem a muninlite, wireguard, és 1-wire csomagokat és kernel modulokat.
* Luci és magyar nyelvi csomag természetesen van.
A build config (ha más is merítene ötletet): [tiny-cyrus-19.07]

A telepítést el lehet végezni a gyári webes felületen az elkészült cyrus-19.07.11-ar71xx-tiny-tl-wr740n-v4-squashfs-factory.bin fájllal.

Ha valakinek kellene a firmware image, akkor megtalálja itt tiny-v1.3.

Hardveres módosítások

A QSS gombhoz tartozó GPIO-t fogom újrahasznosítani. A v4.26-on ez egészen pontosan a GPIO26 processzor lábat jelenti. A router szétszereléséhez két csavar kell kicsavarni az öntapadó talpacskák alatt, majd lapos csavarhúzóval szétpattintani a készülékházat. Ezt a folyamatot kezdjük a hátoldalon, a LAN portok felől.
Az antenna mellett látni fogjuk a QSS gombhoz tartozó feszültségosztót. Alapállásban a GPIO értéke az R207 [7k6] ellenálláson a van lehúzva GND-re. Ha benyomjuk a gombot, akkor 3,3 V-ot kötünk az R206 [2k42] ellenállásra és a feszültségosztás miatt a GPIO-n 2,5 V jelenik meg.

Végigkövetve a feszültségosztótól elmenő nyomvonalat a C205 kondenzátorhoz jutunk (értékét nem mértem meg), ami valószínűleg a pergésmentesítésre szolgálhat.

Majd eljutunk az Atheros AR9331 processzorig, valahol a C13-C14 jelölés között végződik a nyomvonal.

Átrajzolva a nyomvonalat az alábbi ábrát kapjuk (bal oldal). Amit szeretnénk (jobb oldal), hogy a DS18B20-at parazita módban direktben kötni a GPIO26-ra. A legegyszerűbb út ehhez, ha eltávolítjuk egy forrasztó pákával a feszültségosztó R206, R207 ellenállásait, és a pergésmentesítő C205 kondenzátort. GND-t tudunk szerezni több helyről is (a tesztpontokat használva keressünk olyan szabadon hagyott csatlakozási pontot, amihez bátran merünk forrasztani). A GPIO26-hoz legkönnyebben a C205 kondenzátor helyén lehet hozzáférni. A vékony vezetékünket érdemes pillanat ragasztóval, vagy más ragasztóval rögzíteni, hogy ne tépjük meg az apró csatlakozási pontot.

Itt láthatjátok a végeredményem, és arra is választ adok, hogy miért kell parazita módban használni a DS18B20 szenzort. Ha bekötjük a 3,3 V-ot és a hozzá tartozó 4k7 értékű felhúzó ellenállást a GPIO és a 3,3V közé, akkor a router megáll bootolás közben. Így lekötöttem a felhúzó ellenállást és a 3,3V-os vezetéket a DS18B20 szenzorról. A GPIO26-n keresztül kapcsoltam be a CPU belső felhúzó ellenállását.

Kód és végeredmény

SSH-n keresztül bejelentkezve kapunk egy figyelmeztetést, hogy a root jelszó nincs beállítva. Majd kiolvasom a processzort típusát a cat /proc/cpuinfo paranccsal. A betöltött kernel modulok közül el kell távolítani a gpio_button_hotplug-t (már nem kerül bele az új képbe) és betölteni helyette a w1-gpio-custom-ot. Mivel a kernelben nincs definiálva hogy a QSS (GPIO26) a 1-wire láb, ezért modul betöltésénél paraméternek használjuk a bus0=0,26,1 értéket, ahol a végén az "1"-es a parazita módot jelöli. Végül a kiolvasást egy cat paranccsal meg lehet tenni, ha a dmesg-ben megjelenit a szenzor ID-ja. Ez így néz ki ömlesztve:

BusyBox v1.30.1 () built-in shell (ash)
_______ ________ __
| |.-----.-----.-----.| | | |.----.| |_
| - || _ | -__| || | | || _|| _|
|_______|| __|_____|__|__||________||__| |____|
|__| W I R E L E S S F R E E D O M
-----------------------------------------------------
Cyrus 19.07.11, r11435-15432053ab
-----------------------------------------------------
=== WARNING! =====================================
There is no root password defined on this device!
Use the "passwd" command to set up a new password
in order to prevent unauthorized SSH logins.
--------------------------------------------------
root@OpenWrt:~# cat /proc/cpuinfo
system type : Atheros AR9330 rev 1
machine : TP-LINK TL-WR741ND v4
processor : 0
cpu model : MIPS 24Kc V7.4
BogoMIPS : 265.42
wait instruction : yes
microsecond timers : yes
tlb_entries : 16
extra interrupt vector : yes
hardware watchpoint : yes, count: 4, address/irw mask: [0x0ffc, 0x0ffc, 0x0ffb, 0x0ffb]
isa : mips1 mips2 mips32r1 mips32r2
ASEs implemented : mips16
Options implemented : tlb 4kex 4k_cache prefetch mcheck ejtag llsc dc_aliases perf_cntr_intr_bit nan_legacy nan_2008 perf
shadow register sets : 1
kscratch registers : 0
package : 0
core : 0
VCED exceptions : not available
VCEI exceptions : not available
root@OpenWrt:~# insmod w1-gpio-custom bus0=0,26,1
root@OpenWrt:~# dmesg | tail -n 2
[ 130.530653] Custom GPIO-based W1 driver version 0.1.2
[ 130.580691] w1_master_driver w1_bus_master1: Attaching one wire slave 28.000000640a93 crc d5
root@OpenWrt:~# cat /sys/bus/w1/devices/28-000000640a93/w1_slave
61 01 7f 80 7f ff 0f 10 8d : crc=8d YES
61 01 7f 80 7f ff 0f 10 8d t=22062

...és kiolvasásra is került a 22°C-os szobai hőmérséklet.

Varázsoljunk rá egy kis shell trükköt
root@OpenWrt:~# grep -o '[[:digit:]]\{5\}' /sys/bus/w1/devices/$(cat /sys/bus/w1/devices/w1_bus_master1/w1_master_slaves)/w1_slave
22062

Update#1: Az új firmware-be nem kerül bele a kmod-gpio-button-hotplug csomag és a wifitoggle csomag. Így már nem kell a modul kiütésével foglalkozni. Csak hozzuk létre a /etc/modules.d/w1-custom fájlt az alábbi tartalommal w1-gpio-custom bus0=0,26,1 és már induláskor betöltődik a modul.

Update#2: Az elkészült firmware-ek megtalálhatóak a github release-ben. A "tiny-cyrus-19.07.11" firmware-t használtam a projektben, de ha valakit más érdekelne, akkor az ath79 architektúrát openwrt-22.03-ig sikerült fordítani.

Zárszó

A muninlite-ot jó lenne kiegészíteni, hogy ezt is kiolvassa.