btle-proximity, czyli jak blokować automatycznie pulpit

Jakiś czas temu doszedłem do wniosku, że skoro tak czy inaczej cały czas na swoim nadgarstku noszę jedną z popularnych opasek inteligentnych, może warto byłoby oprócz monitorowania tętna spożytkować ją do czegoś umiarkowanie przydatnego. Na myśl przyszło mi automatyczne blokowanie pulpitu, gdy odejdę na dłużej od komputera.

Nie jest to pomysł nowy, ale moje poszukiwania w Internecie ujawniły głównie dość wiekowe projekty, które było ciężko odpalić ze względu na stare zależności. A po dłuższym kombinowaniu okazało się, że obsługiwany jest tylko klasyczny Bluetooth, a jak się możecie domyślić z tytułu, opaska używa Bluetooth Low Energy.

Postanowiłem więc napisać coś własnego w Pythonie. A że znalazłem całkiem sympatyczną bibliotekę do Bluetooth LE o nazwie Bleak, było to zadanie dość proste. I w ten sposób powstał skrypt btle-proximity. Ma on jedno proste zadanie - cyklicznie skanować otoczenie w poszukiwaniu urządzenia BT LE o adresie MAC podanym jako argument. Jeśli urządzenie jest dostępne, użytkownik jest w pobliżu komputera, więc nie robi on nic. Gdyby jednak nie było dostępne, a sesja nie była już zablokowana, odczeka 60 sekund i jeśli nadal pozostanie niedostępne, zablokuje sesję za pomocą loginctl (oczywiście można w to miejsce wpisać dowolną inną komendę). Jeśli ekran był zablokowany, a urządzenie pojawi się w zasięgu, skrypt go odblokuje.

Skrypt wymaga Pythona 3.10, wspomnianej wyżej biblioteki bleak (którą można zainstalować za pomocą pip install bleak). Dodatkowo używa loguru, ale tej zależności można się łatwo pozbyć, usuwając linie dotyczące logowania.

Jedyny argument, który przyjmuje skrypt przy uruchamianiu, to adres MAC urządzenia Bluetooth LE. W moim systemie uruchamiam go 5 minut po starcie za pomocą timera systemd, by uniknąć możliwych problemów z dostępnością adaptera BT przy starcie. Możecie go też dodać w opcjach automatycznie uruchamianych aplikacji/skryptów swojego środowiska graficznego.

Ponieważ zasięg wspomnianych opasek jest dość mały, zdarzyło mi się, że wyjście do kuchni albo do drzwi skutkowało zablokowaniem ekranu. Co więc jeśli gramy albo oglądamy film na pełnym ekranie i nie chcemy, żeby nagle sesja została zablokowana? Pomyślałem i o tym i dodałem sprawdzanie przed blokadą czy nie mamy aktywnej aplikacji pełnoekranowej. Wymaga to osobnego skryptu basha o nazwie check-fullscreen, który przysposobiłem z porady na stackoverflow (wymaga pakietu xwininfo, opcje grepa trzeba będzie dostosować w zależności od używanego środowiska graficznego).

Nie przedłużając, tu pobierzecie oba skrypty:

btle-proximity
check-fullscreen

Dodaj komentarz

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