maanantai 27. huhtikuuta 2020

Älyjääkaappi raportoi käytöstään

Ostin vuoden 2018 alussa Boschin älyjääkaapin. Älykkääksi sen tekee mobiilisovellus, jonka kautta voi säätää jääkaapin ja pakastimen lämpötilaa, saada hälytykset liian pitkään auki olevasta ovesta sekä mahdollisuus katsoa kahdella kameralla mitä jääkaapissa on. Viimeksi mainittu on näppärä ominaisuus ruokakaupassa. Usein on vaikea muistaa, montako maitotölkkiä kaapissa olikaan. Toisaalta pelkistä kamerakuvista on vaikea nähdä koko sisältöä eikä se tietenkään kerro, onko maidon viimeinen käyttöpäivä mennyt jo umpeen.

Bosch käyttää HomeConnect-tekniikkaa, joka ei ole erityisen avoin. Siihen kuitenkin löytyy IFTTT-rajapinta, jonka kautta jääkaappi pystyy liittymään muihin sovelluksiin. Kirjoitin aiheesta aiemmin.

Koronaviruksen aiheuttaman eristäytymisen vuoksi tuli mieleen katsoa, millaista dataa jääkaappi on vuosien mittaan tuottanut. Rajapinta on toiminut luotettavasti ja kirjannut Google Docsin laskentamalliin lähes 20 000 riviä. Niiden analysointi ei tosin ollut ihan helppoa. Seuraavassa muutama idea, joita voi soveltaa muissakin tehtävissä.

Ensimmäinen työ on saada data Exceliin, sillä Google Docs ei sovellu isojen datamäärien pyörittelyyn. IFTTT oli tuottanut toistakymmentä HomeConnectFridgeLog(n) tiedostoa, missä n oli järjestysnumero. Tiedostot piti ladata omalle levylle, avata Exceliin ja kopioida manuaalisesti peräkkäin samalle laskentamallin sivulle. Otin mukaan vain datan vuoden 2019 alusta, jolloin analysoitavaksi jäi 13 632 riviä dataa.

Tästä analyysi alkaa.
IFTTT kirjoittaa avaukset omassa muodossaan, mikä ei ole suoraan Google Docsin eikä Excelin käyttämä päiväysformaatti. Se vaati melkoisen määrän manuaalista käsittelyä ja joukon tarkkaan suunniteltuja etsi-korvaa-toimintoja ennen kuin päivämäärä sekä tuntiarvo oli saatu poimittua omiin sarakkeisiinsa.

Jos merkkijonon pituus olisi ollut vakio, olisi voinut helposti poimia päivän numeron ja kellonajan. Vaihteleva pituus pakotti kikkailuihin. Tehtävää helpotti se, että pilkku, at ja kaksoispiste olivat kaikki erilaisia erottimia. Samat erottimet eri paikoissa olisivat mutkistaneet prosessia merkittävästi.

Tein ensin etsi-korvaa kuukausien nimille ja vaihdoin ne numeroiksi (January -> 01). Päivän poimiminen osoittautui vaikeimmaksi, se piti tehdä useassa osassa. Perässä oleva pilkku helpotti korvausta ( 1, -> 01,), mutta tällöin piti huomioida myös numeron edessä oleva välilyönti. Ensimmäisellä yrityksellä 31, vaihtui muotoon 301, mikä ei tietenkään ollut tarkoitus.

Kun päivämäärä oli vakiomuotoinen, vuoden poimiminen omaan sarakkeeseen oli helppoa ja koska siinä oli vain kaksi arvoa, ne olisi voinut täyttää ilman funktioitakin.

Kellonaika oli yllättävän visainen ongelma, sillä AM/PM-muunnos ei ollut ihan mekaaninen. Periaatteessa PM tarkoittaa kellonaika +12 h, mutta ensimmäinen tunti puolenpäivän (klo 12:00) jälkeen ei olekaan 0 PM vaan 12 AM.

Lopulta data oli kuitenkin halutussa järjestyksessä Excelissä.

Sarakkeet oikeilla paikoillaan
kkvv-sarake oli tarpeen x-akselin arvoja varten. Näistä olikin sitten jo helppo laatia Pivot-taulukko ja laskea eri kuukausien avausmäärät yhteen.

Jossain tapauksissa on helpompaa siirtää data csv-muodossa ensin Wordiin ja tehdä perusmuokkaus siellä esimerkiksi erotinmerkkejä muuttamalla. Vasta sen jälkeen data palautetaan Exceliin joko tiedostona tai leikepöydän kautta.

Jääkaapin oven avaukset kuukausittain.
Maaliskuun 2020 aiheuttama piikki näkyy selvästi. Sen kohdalla 1160 avausta ovat 31 prosenttia suuremmat kuin maaliskuun 2019 avaukset (885 kertaa). Todellinen nousu on vielä suurempi, sillä etätyöpakko alkoi vasta kuun puolivälissä.

Kun data oli kerran olemassa, sitä oli helppo pyöritellä. Toinen grafiikka näyttää avaukset kellonajan (tunti) mukaan:

Jääkaapin oven avaukset tunneittain.
Ei ole mitenkään yllättävää, että kuvaajan muoto täsmää esimerkiksi mobiilidatan hitauteen, joskin huippu osuu pari tuntia aikaisemmaksi.

Tämän jälkeen olisi helppo laskea korrelaatio kuukausittain jääkaapin avauksen ja painon (Withings-älyvaaka) tai askelten (Fitbit-askelmittari) kanssa. Korrelaatio olisi epäilemättä vahva. Tulos voisi kuitenkin olla sen verran masentava, että jääköön analyysi tähän.

Jääkaapin dataesimerkki on muistutus siitä, miten dataa syntyy nykyään kaikkialla, ja millaisia yllättäviäkin laskelmia sen perusteella voidaan tehdä.

7 kommenttia:

  1. Ekö nuo olisi saanut erotettu teksti sarakkeisiin toiminnolla omiin sarakkeisiin ja osan sitten siivonnut turhasta tekstistä.

    VastaaPoista
  2. Excelin findreplacen sijaan olisin kyllä muuntanut päivämäärät parempaan formaattiin jollain ohjelmointikielellä joka osaa päivämäärien muokkauskoodit. Normaalia strftime-parsintaa.

    Esim. pythonilla:

    datetime.strptime('January 1, 2019 at 10.07AM, '%B %d, %Y at %I.%M%p')

    Tämän jälkeen voi sitten tulostaa sen missä formaatissa haluaa.


    VastaaPoista
  3. Totta, teksti sarakkeisiin olisi tehnyt asian helpommin. Lähdin alunperin kehittämään muotoa, joka kääntäisi merkkijonon suoraan Excelin tunnistamaksi päivämääräksi ja kellonajaksi, mutta se osoittautui liian hankalaksi. Olisi pitänyt erotella aikaleiman eri osat sarakkeisiin. Python ei itselle tullut edes mieleen, mutta strptime onkin tässä suhteessa erittäin kätevä - pitää muistaa ensi kerralla.

    Joskus on kuitenkin tilanteita, joissa esim. sarakkeiden erotinmerkkinä on pilkku, vaikka pilkku esiintyy myös arvojen sisällä desimaalierottimena, ja silloin tarvitaan kohtuullista kikkailua.

    VastaaPoista
  4. Hyödyntäessä dataa kuvaaja pitäisi toteuttaa mahdollisimman yksinkertaisesti, jotta se ei olisi virhealtis. Itse käytän Ohjelmakartta.fi-sivustolla omaa "päiväfunktiota", jolla lasken ohjelmien tilan käytön niin, että primetime-aika saisi enemmän tilaa yön kustannuksella:

    (hour > 6) ? (hour<16||hour>23)? 1.75 : 2.2 : 1.0

    Funktio näyttää todella karulta, mutta on selkeä. Pääasia on, että pystyn visualisoimaan funktiota gnuplot-ohjelman avulla. Sitten syötän funktion koodin C++-ohjelmaan sellaisenaan.

    Homman voisi hoitaa paljon hienommin. Ehkä olisi järkevämpää välttää ehtolauseita ja laskea koko homma 2.-4. asteen polynomeilla. Saisi pehmeäpää jälkeä, ja pystyisi luomaan yhtälöitä, joissa on tietyt reunaehdot.

    VastaaPoista
  5. Onko tuo IFTT-rajapinta ainoa eli sieltä ei saa dataa ulos esim. Grafanalla?
    https://grafana.com/
    https://www.influxdata.com/

    VastaaPoista
  6. @Zarr: vinkkisi Pythonin käytöstä oli hyvä, tein siitä pienen ohjelman: https://bittimittari.blogspot.com/2020/05/jaakaapin-data-googlesta-pythonilla.html.

    Jääkaappi käyttää HomeConnect-alustaa, jonka tuesta Grafanalle tai muille tekniikoille itselläni ei ole tietoa.

    VastaaPoista
    Vastaukset
    1. Itse asiassa Grafana osaa (tai pitäisi osata) hakea dataa suoraan Google Sheetiltä mutta testaamani lisäosa ei jostain syystä toiminut. Päivämäärien kanssa voi silti olla ongelmia ja datan määrän kanssa, jos sitä alkaa kertymään paljon.

      Poista