Oma Internet-sääasema pikkuvaivalla
Kirjoitin aikaisemmin rakentavani kotiimme e-paperinäyttöistä sääasemaa, jonka säätietolähteenä toimisi iPod Touchista rakennettu sisäverkon HTTP-palvelin. Kuten tällaisille harrasteprojekteille yleensä on tyypillistä, ei projekti varmaankaan koskaan tule olemaan täysin valmis, mutta nykytilassaan se on jo erittäin käyttökelpoinen. Kaikki tässä kirjoituksessa käsiteltävä iPod Touchilla ajettava koodi on nähtävissä GitHubissa.
Laitteiston näyttönä toimii e-radionica-nimisen yrityksen Inkplate 6 -näyttö. Inkplate pitää sisällään kuusituumaisen e-paperinäytön, joka pystyy esittämään harmaasävygrafiikkaa 800×600-resoluutiolla. Tekniikkana e-paperinäyttö on sikäli mielenkiintoinen, että se käyttää virtaa ainoastaan silloin, kun näytöllä olevaan kuvaan tehdään muutoksia. Tämä tekeekin siitä optimaalisen tekniikan harvakseltaan päivittyvän tiedon esittämiseen.
Inkplaten sydämenä sykkii ESP32-mikrokontrolleri, jossa on sisäärakennettuna tuki mm. langattomalle verkkoyhteydelle sekä Bluetoothille. Laite on Arduino-yhteensopiva, joten ohjelmointi on kohtuullisen yksinkertaista Arduino-kehitystyökaluilla.
Niin iPod-palvelin kuin Inkplatekin ovat toimineet nyt puoli vuotta ilman minkäänlaista nikottelua ja säätiedot jopa tuntuvat pitävän paikkansa.
Toteutussuunnitelma
Koska tarkoituksena oli käyttää Inkplatella esitettävän säätiedon lähteenä sisäverkossa olevaa vanhaa iPod Touchia, piti palvelinohjelmistoon lisätä tuki tiedon välittämiselle Inkplatelle. Alkuperäinen ajatukseni oli seuraava:
- Ladataan säätiedot iPodille OpenWeatherin One Call -rajapinnasta
- Pureskellaan iPodilla säätiedot paremmin Inkplatelle sopivaan muotoon
- Ladataan tiedot Inkplatelle
- Muodostetaan Inkplatella tietojen pohjalta graafinen esitys säätiedoista
Hetken aikaa asiaa mietittyäni (ja parin testin jälkeen) tulin siihen tulokseen, että noin tuota hommaa ei kannata tehdä. Inkplatella tietojen käsitteleminen on todella paljon hankalampaa kuin iPodilla. Myös graafisen esityksen muodostaminen Inkplatella olisi todennäköisesti aika paljon vaativampaa kuin iPodilla. Tästä syystä päätin muuttaa suunnitelman seuraavaksi:
- Ladataan säätiedot iPodille OpenWeatherin One Call -rajapinnasta
- Muodostetaan säätiedoista valmis (noin) 800×600-kokoinen graafinen esitys kuvaksi
- Ladataan valmis säätietokuva iPodilta Inkplatelle ja näytetään se Inkplaten näytöllä
Inkplatella ajettava sovellus jääkin täten todella yksinkertaiseksi. Inkplaten Arduino-kirjastossa tulee jopa mukana drawBitmapFromWeb
-funktio, jolla voi suoraan lätkäistä Inkplaten näytölle web-URL:stä ladatun BMP-muotoisen kuvan. Paljon mielenkiintoisempi toteutus sen sijaan täytyykin sitten rakentaa iPodille.
Säätietografiikan luominen iPod Touchilla
Kuten aikaisemmassa blogikirjoituksessani kirjoitin, on iPod Touchille asennettuna touch-lighttpd-php-mysql
-pakettikokonaisuus, joka muuttaa iPodin varsin päteväksi PHP 5.3 -palvelimeksi. Kyseiseen PHP-asennukseen sisältyy läjä kaikenlaisia PHP-kirjastoja ja joukossa on myös GD-grafiikkakirjasto. GD:n kanssa grafiikan tuottaminen on melko vaivatonta, mutta heti alussa hommassa nousi mieleen muutama kysymys:
- Mitä säätietoja halutaan näyttää pienikokoisella näytöllä?
- Miten säätietoa voidaan esittää kivan näköisenä ilman, että työmäärä karkaa lapasesta?
- Miten grafiikkakoodi organisoidaan niin, että sitä on helppo päivittää? Mitä abstraktioita tarvitaan?
Koska Inkplaten näyttö on läpimitaltaan vain kuusi tuumaa ja resoluutiokin on nykymittapuulla vaatimaton 800×600, ei näytöllä kannata koittaa esittää mahdotonta määrää tietoa. Lopulta päädyin valikoimaan esitettäväksi seuraavat tiedot:
- Tämänhetkinen säätila: lämpötila ja kuvaus
- Tämän päivän säätila: ylin ja alin lämpötila sekä kuvaus
- Kolmen seuraavan päivän ennuste: iltapäivän lämpötila sekä kuvaus
Jotta esitykseen saadaan hiukan eloa, säätilakuvaukset esitetään OpenWeatherin tarjoamilla säätilaikoneilla ryyditettynä. OpenWeather ei tarjoa ikoneistaan suoraan sopivia harmaasävyversioita, joten tein ImageMagick-grafiikkaohjelmiston Mogrify-työkalua käyttävän skriptin, joka muuntaa ikonit näteiksi harmaasävykuviksi. Skripti on mukana iPod Touchillani ajettavien PHP-sovellusten GitHub-repositoriossa.
Grafiikkakoodin organisoinnissa päädyin lopulta ratkaisuun, jossa kukin esitettävä säätilatieto on oma instanssinsa. Instanssit lisätään kuvaan haluttuun kohtaan ja ne itse pitävät huolta esittämiensä tietojen asettelusta suhteessa instanssin sijaintiin. Tämä helpottaa sekä yksittäisen säätilatiedon kehittämistä että koko kuvan asettelun muuttamista. Esimerkki tällaisen säätilatietoinstanssin pohjana toimivasta luokasta on tämänhetkistä säätilaa käsittelevä CurrentImageChunk
-luokka.
Kun lopulta sain säätiedoille mielestäni mukavan esitystavan, oli edessä vielä kuvaformaattiongelma: Inkplaten drawBitmapFromWeb
-funktio vaatii kuvan BMP-formaatissa, mutta tuollaista en saa suoraan iPodille asennetulla GD:llä tuotettua. Ongelman sai onneksi melko helposti ratkaistua asentamalla iPodille ImageMagick ja ajamalla sitä PHP:n exec
-funktiolla. Tämä on toteutettu InkplateOutput
-luokan convertImage
-metodissa.
Lopullinen tuomio
Suurimmaksi ongelmaksi järjestelmää rakentaessa lopulta nousi se, että Inkplatesta ei tunnu löytyvän kovin hyvää dokumentaatiota. Esimerkiksi Inkplatella näytettävä kuva ei voi olla kooltaan ihan tasan 800×600, vaan sekä pysty että vaakasuunnassa joudutaan tinkimään muutama pikseli. Kuvan maksimikooksi paljastuikin kokeilujen myötä 796×598. Olisi nopeuttanut hommaa huomattavasti, jos tämä tieto olisi lukenut jossakin. Myöskään Inkplaten Arduino-kirjastoa ei ole oikeastaan dokumentoitu mitenkään, vaan asiat pitää selvittää itse koodiesimerkkejä ja kirjaston lähdekoodia lukemalla.
Käytön ja ylläpidon kannalta ei toisaalta ole mitään ongelmia. Niin iPod-palvelin kuin Inkplatekin ovat toimineet nyt puoli vuotta ilman minkäänlaista nikottelua ja säätiedot jopa tuntuvat pitävän paikkansa. E-paperinäyttö on todella helppolukuinen ja säätiedot näkee nopeasti yhdellä vilkaisulla. Säätietoja päivitetään vartin välein, joten koko järjestelmän virrankulutus on varsin vähäistä. Laitteiston taskukokoiset osat on lisäksi helppo sijoitella asunnossa ihan mihin vain, koska ainoat vaatimukset toiminnalle ovat virta ja WLAN-verkon kuuluvuus.