Smogly – miernik poziomu smogu

Dużo ostatnio mówi się w mediach o smogu i zanieczyszczeniu powietrza, widzę też, że pomału wśród znajomych popularne stają się różnego rodzaju, mniej lub bardziej DIY, mierniki poziomu zanieczyszczeń powietrza. Niezależnie od tego, co słychać w mediach, istnieją oddolne obywatelskie inicjatywy, mające na celu monitorowanie zanieczyszczenia powietrza w miastach. Przykładem jest Smogly AKA EnviroMonitor.

Czym jest Smogly?

Celem projektu jest stworzenie otwartego, zarówno sprzętowo, jak i programowo, przystępnego cenowo rozwiązania do monitoringu zanieczyszczenia powietrza, zbudowanie społeczności zainteresowanej jakością powietrza i finalnie zbieranie danych z wielu punktów pomiarowych w celu tworzenia pełnego obrazu jakości powietrza, nie tylko w Polsce, choć większość twórców – o ile nie wszyscy – pochodzi z Polski.

Istnieją co prawda podobne rozwiązania, ale brakuje im przekrojowości. Przykładowo w Poznaniu są dwa czujniki zanieczyszczeń dostępne online – jeden na obrzeżach miasta, drugi w okolicach centrum, ale zanieczyszczenia potrafią się różnić znacząco między poszczególnymi rejonami miasta, nawet między sąsiednimi dzielnicami.

Projekt Smogly składa się z kilku części. Zasadniczą jest sam miernik jakości powietrza. Potrafi on mierzyć ciśnienie, wilgotność, temperaturę oraz zanieczyszczenie pyłami PM 2.5 oraz PM 10. Czujnik przeznaczony jest do samodzielnego montażu (DIY) i wysyła dane do serwera łącząc się z internetem przy pomocy WiFi. Można skorzystać z własnego serwera lub – co jest lepszym rozwiązaniem – wysyłać dane do serwera utrzymywanego przez twórców projektu.

Koszt części (bez obudowy) szacowany jest na ok. 150-200 zł. Nie jest to dużo, biorąc pod uwagę, że – jak
zapewniają twórcy – pomiary były konfrontowane z wykonywanymi przez WIOŚ i różnice w przypadku wersji z grzałką, zapewniającą osuszenie powietrza przed pomiarem zanieczyszczeń, są na poziomie kilku procent.

Kolejne elementy układanki to wspomniany serwer, odbierający dane z sensorów, frontend, prezentujący dane w
przeglądarce oraz obudowa. Sonda badająca jakość powietrza musi być zamontowana na zewnątrz, do zasilania wystarcza zasilacz o prądzie 1A.

Czemu Smogly?

Wyróżniki Smogly na tle „konkurencji” są następujące:

  • montaż zewnętrzny, zapewniający realne dane nt. stanu powietrza w okolicy
  • grzałka, zapewniająca poprawne działanie także w warunkach zwiększonej wilgotności
  • usieciowienie, czyli zbieranie danych z różnych punktów do wspólnej bazy, możliwość odczytu wyników za pomocą np. smartfona
  • otwarty projekt, pozwalający na swobodne ulepszanie i dający nadzieję na utrzymanie i rozwój

Jak pomóc?

W tej chwili najpotrzebniejszą rzeczą są ochotnicy, którzy zbudują i zamontują czujki. Ambicją twórców projektu są 2-3 sensory w każdej dzielnicy, żeby zapewnić miarodajne wyniki. Na pewno projektowi przyda się nagłośnienie, więc jeśli macie znajomych interesujących się ochroną środowiska albo geeków interesujących się Arduino, to dajcie im znać. Podobnie dajcie znać znajomych zainteresowanych kupnem gotowego miernika – prawdopodobnie taniej mogą mieć urządzenie dokładniejsze, o większych możliwościach i bardziej użyteczne społecznie.

Przyłączyć się można za pośrednictwem GitHuba – standardowy flow pracy, czyli zgłaszanie issues,
forkowanie i pull requesty. Projekt korzysta również ze Slacka, dostępnego na zaproszenie – automat zapraszający dostępny jest tutaj.

Na koniec garść linków na temat pyłów smogu, mierzenia jakości powietrza PM10 i PM2.5:

  1. O pyłach PM2.5 i PM10 https://airnow.gov/index.cfm?action=aqibasics.particle
  2. Artykuł na Wikipedii https://en.wikipedia.org/wiki/Particulates
  3. Strona projektu Smogly https://github.com/EnviroMonitor
  4. Wpływ zanieczyszczeń na zdrowie http://smog.imgw.pl/content/health
  5. Dopuszczalne normy zanieczyszczeń powietrza http://smog.imgw.pl/content/norm
  6. Poziomy zanieczyszczeń PM2.5 i PM10 online: http://aqicn.org/

Częstochowa czyli paskudny kościół

Niedawno jechałem samochodem do Tych. Po skonsultowaniu z Google Maps, postanowiłem jechać przez Łódź, płatną autostradą, głównie za sprawą przewidywanego czasu przejazdu (lekko ponad 4h) i potencjalnego stanu dróg, bo harmonogram imprezy był dość napięty, a akurat przyszło ochłodzenie i możliwość oblodzenia. Odcinek pierwszy, Poznań – Łódź, znałem od strony technicznej, natomiast zaskoczyły mnie ceny. Patrząc od strony Poznania dwie bramki po 18 zł, potem jedna za 10 zł. Razem 46 zł za ~250 km. Jak na możliwość skorzystania z drogi wybudowanej za moje pieniądze, w dodatku własnym środkiem transportu – zdecydowanie za drogo, w podobnej cenie za kilometr są taksówki.

Jednak nie o tym miało być. W okolicy Częstochowy zaczęły się korki. Oddając sprawiedliwość: Google Maps ostrzegło o pracach drogowych, ale liczyłem, że skoro wakacje za nami, to nie będziemy pokonywać miejsc z robotami drogowymi w tempie 5 km/h, tylko powiedzmy jak na znakach (30-60 km/h). Myliłem się, i cała podróż trwała ponad 6h.

W każdym razie, dla pełnego obrazu sytuacji, w okolicy Częstochowy utknęliśmy w korku, aura niesprzyjająca. I nagle wyłonił się ten widok. Oczywiście nie było zieleni, po prostu bryła górująca nad miastem.

Chodzi o ten obiekt, czyli kościół św. Antoniego z Padwy:

Kościół św. Antoniego z Padwy Częstochowa

Źródło: Wikipedia

Powyższe zdjęcie w Wikipedii ukazuje ten kościół chyba od najlepszej możliwej strony, więc wygląda, że uchodzi. Piękny nie jest, ale nie widać tej totalnej szkaradności, którą widzą wjeżdżający od północy. Poniżej widok z Google Street View, nie oddający w pełni klimatu, ale można już dostrzec o co tak naprawdę chodzi.

Kościół św. Antoniego z Padwy, Częstochowa

Źródło: Google Maps

To też jeszcze nie oddaje klimatu, ale szperając po sieci znalazłem zdjęcie, które nie jest najlepszej jakości, ale trafia w sedno:

Kościół św. Antoniego z Padwy, Częstochowa

Źródło: MapOfPoland

Tak to właśnie wygląda, przy czym aby oddać pełnię wrażenia, należałoby skrzyżować szerszą perspektywę z przedostatniego zdjęcia i kolorystyką ostatniego.

Jakbym miał nazwać ten styl to chyba najlepiej pasuje kpina z gotyku. Do tego jest totalnie nieprzystający proporcją do reszty miasta. Miałem wrażenie, jakby ktoś celowo chciał oszpecić miasto stawiając takie wielkie, brzydkie monstrum. Skojarzenia z Grą o tron i obecną tam sektą panoszącą się w stolicy jak najbardziej na miejscu.

Python

Tak się składa, że ostatnio podstawowym językiem programowania, którego używam, jest Python. W związku z tym kilka przemyśleń na jego temat i na temat rozpoczynania zabawy z nim. Disclaimer: do Pythona podchodziłem już kiedyś, jeśli muszę coś napisać, to domyślnie korzystam z Perla. Niekoniecznie pięknego, często poganiającego polecenia systemowe, ale działającego. Historycznie bawiłem się Pascalem, C i oczywiście miałem kontakt z Bashem i PHP (do ostatniego oficjalnie się nie przyznaję).

Po pierwsze, istnieją czytelne reguły, np. PEP 8, którego wszyscy używają[1] czy PEP 20. Są też narzędzia, które ułatwiają zachowanie zasad dotyczących formatowania kodu, aby był zgodny z wytycznymi. Nie sposób tu nie wspomnieć o edytorze Atom, którego kiedyś włączyłem i wydał mi się straszną kobyłą. Jednak w połączeniu z pluginami działa naprawdę dobrze. Na tyle na ile mogę stwierdzić przy tak małym doświadczeniu. W każdym razie ma wszystko, do czego używałem kate. I sporo więcej. Vim nigdy mi nie podszedł na tyle, bym go używał w bardziej zaawansowany sposób. Do szybkich poprawek zawsze było albo nano, albo właśnie vim. Ale tryb tekstowy to nie jest to, co preferuję przy pracy nad dłuższym kodem.

Po drugie, dostępnych jest dużo materiałów do nauki Pythona. Także bezpłatnych. Samych książek/kursów jest kilkanaście (choćby oficjalny The Hitchhiker’s Guide to Python). Istnieją też gry, które uczą programować w Pythonie. Choćby Codecombat, którym kiedyś się bawiłem, o którym miała być notka, ale które ostatecznie mnie nie wciągnęło, a pomysł na notkę jakoś się rozmył. Mi do gustu przypadł jednak interaktywny kurs Learn Python na Androida. Jednak jeśli coś piszę i są interaktywne testy, a nie tylko czytam, to zapamiętuję więcej. Oczywiście nawet jeśli zapamiętam to do poziomu „potrafię użyć w programie” jest jeszcze kawałek, ale przynajmniej rozumiem przykłady i gotowy kod.

Po trzecie, istnieje sporo gotowych modułów, które ułatwiają pisanie. Jednak nawet gdyby nie istniały, to kod można „pożyczać” z innych skryptów przy pomocy import. I można mieć różne wersje bibliotek za sprawą środowisk wirtualnych. Z jednej strony fajne, z drugiej tworzy bałagan. Do developerki przydatne i zgodne z modną ostatnio ideą konteneryzacji. Ogólnie nauczyłem się z tym żyć, ale odruchu, żeby wszystko robić w virutalenv jeszcze nie mam.

Skoro mowa o bałaganie, to pora na wady, a tych jest zaskakująco wiele. Po pierwsze, Python 2 nadal żyje, ma się dobrze i można go spotkać na wolności. Taka umowna wada i na razie nie bardzo przeszkadza. Niemniej, nie każdy kod napisany w Pythonie 3 daje się wykorzystać w wersji drugiej.

Inna trochę dziwna na początku rzecz, to struktury danych. Jest tablica (list, w Perlu array), jest tablica asocjacyjna (dict, w Perlu hash). Ale są też tuple (niemodyfikowalne listy) i sety (nieuporządkowane zbiory unikatowych wartości). Nie żebym nie widział zalet, ale żeby aż wydzielać to? Zwł. sety (normalnie to po prostu się hasha tworzy, klucze są nieuporządkowane i unikatowe)…

To co się najbardziej rzuca w oczy: wcięcia. Są wymagane i rzutują na kod. Najprostszy przykład to:

for i in range (3):
    print ("wartosc: ")
    print (i)

Usunięcie wcięcia w ostatnim wierszu totalnie zmieni sposób działania programu. Drażni szczególnie na początku, gdy chcemy coś na szybko przetestować i np. coś wklejamy. Trzeba poprawić i dokładnie sprawdzić wcięcia, inaczej mogą być kwiatki jak wyżej.

Kolejna rzecz, która irytuje, to wciskanie filozofii w stylu zen. Na siłę i niekoniecznie zgodnie z prawdą. Weźmy mój ulubiony przykład:

There should be one– and preferably only one –obvious way to do it.

No to teraz bierzemy na tapetę set. Można go utworzyć przez

mojset = set([1, 2, 3])

Ale od wersji 2.7 można użyć do tworzenia równoważnej formy

mojset = {1, 2, 3}

Nie ma problemu? No to jak utworzyć pustego seta? Gdyby ktoś wpadł na całkiem logiczny pomysł użycia

mojset = {}

to niech wie, że nie pustego seta stworzył, a pustego dicta i za chwilę dostanie błędem po oczach. BTDT, dobry kwadrans dumania, czemu to nie działa. Dopiero wezwana pomoc uratowała sytuację, bo nie wiem ile bym jeszcze nad tym dumał.

Także one way my ass, skoro Tim Toady wita nas już na samym wstępie, przy tworzeniu jednego z podstawowych typów danych.

Możliwe, że dla ludzi, którzy zaczynają programowanie od Pythona, wady nie są tak zauważalne czy irytujące.

Niemniej, oddaję sprawiedliwość – w Pythonie pisze się przyjemnie i w praktyce jest to łatwiejsze, niż wygląda na pierwszy rzut oka. Wystarczy przejrzeć jakiś tutorial. Zdarzało mi się pisać rozszerzenia do istniejących skryptów po kilku dniach styczności z językiem i nie było większych problemów. Więc faktycznie, może być czytelnie, prosto i wygodnie. Oczywiście mogło być tak, że na ładne skrypty trafiłem. 😉

Z Perlem oczywiście nie kończę, bo do pewnych rzeczy nadaje się IMHO lepiej. Trochę gratów mam w nim napisanych, ale wersji 6 raczej już nie zacznę.

[1] A przynajmniej prawie wszyscy. A przynajmniej starają się. Prawie wszyscy.

UPDATE: Wspomniany kurs Learn Python skończyłem i szczerze polecam. Świetna podstawka, traktująca szeroko o różnych zagadnieniach, przy czym, jednak, te praktyczne części są lepsze, a teoretyczne kuleją. Jest w sumie o wszystkim najważniejszym, z programowaniem obiektowym i regexpami włącznie. Zapomniałem też wspomnieć o ipython – bardzo fajny do szybkiego sprawdzenia jakichś drobiazgów.

Swoją drogą, dziwi mnie to wciskanie regexpów do nauki programowania. To jest IMHO osobna działka zupełnie i nijak się nie klei z resztą.

Przy okazji kolejny kamyczek do ogródka w Pythonie jest inaczej. Tym razem chodzi o re.match, które działa totalnie nieintuicyjnie, choć przyznaję, że w sposób zgodny z dokumentacją. Otóż ww. funkcja dopasowuje wyrażenie tylko na początku stringa. Czyli ma takie niejawne, hardcodowane ^ – i albo .* na początku, albo korzystamy z re.search, żeby było normalnie. One way my ass, ponownie. Szczęśliwie wyszło to na Learn Python, nie w praktyce. Nie wiem co za piękny umysł to wymyślił i w imię czego…