Perheemme auto vaihtui joulukuussa yksityisleasingiin. Sopimus kestää vuoden ja kattaa 15 000 kilometriä. Se ei tule aivan riittämään. Ylimääräisten kilometrien ollessa varsin arvokkaita, haluan seurata kilometrimäärän täyttymistä.

Mutta miten sen tekisi?

Vaihtoehto 1 – Excel

Tein ensin Excelin, johon laskin paljonko voimme keskimäärin ajaa kuukaudessa ja mitä mittarilukeman pitäisi näyttää kuun lopussa. Viereen kun syöttää toteuman niin näkee missä mennään.

Näyttökuva 2020-1-13 kello 18.36.42.png

Kuka muistaa ottaa mittarilukeman ylös joka kuun viimeinen päivä?

Ei kukaan.

Tein toisen Excelin, johon laskin oletetun mittarilukeman vuokrakauden jokaiselle päivälle. Nyt voin lisätä toteutuneen mittarilukeman mille tahansa päivälle ja näen miten toteuma suhtautuu ennusteeseen.

Näyttökuva 2020-1-13 kello 18.44.30.png

Kävisin autossa kirjaamassa ylös mittarilukeman ja tulisin kotiin naputtelemaan sen  Exceliin?

Jep. Kuulostaa hieman ysäriltä.

Tehdään tämä kunnolla tai ei tehdä ollenkaan.

Vaihtoehto 2 – Kännykällä käytettävä Power Apps

Haluan mobiilisovelluksen, jolla voi autossa olessaan nopeasti kirjata mittarilukeman. Sovellus näyttää saman tien olenko ajamassa yli vai alle vuosikilometrirajani.

Koska tykkään seurata kaikkia kustannuksia, haluan tallentaa sovelluksella tiedot myös

  • kotona ladatun sähkön määrästä (kwh lukema autopaikan tolpasta)
  • latauspisteillä lataamastani sähköstä (määrä ja kustannus)
  • ilmaiseksi lataamani sähköstä (Lidl, Motonet, IKEA jne)

Näiden avulla voi laskea jo kaikkea kivaa.

Käyttöliittymä

Kuvittelen tietäväni mitä haluan, joten voimme aloittaa suoraan käyttöliittymästä. Sovelluksen aloitusnäyttö voisi näyttää tältä.

Näyttökuva 2020-1-14 kello 20.09.00.png

Näytöllä ei ole erikseen ”Lisää” painikkeita. Luvut pääsee syöttämään arvoja painamalla.

Kilometrilukeman syöttäminen voisi näyttää tältä.

Näyttökuva 2020-1-14 kello 20.14.53.png

Ladatut sähköt syötetään samannäköiseltä näytöllä.

Nyt kun tiedetään mitä halutaan, voidaan miettiä mitä tietoja sovellus tarvitsee (parametrit) ja mitä se tallentaa.

Tietojen tallennuspaikka – Common Data Service

Sovellus ei tule tallentamaan hurjia määriä rivejä, eikä sen tietomalliin tule edes relaatioita. Selvää SharePoint tavaraa.

Vai onko?

Käytetään kuitenkn tietovarastona Common Data Serviceä (CDS). Seuraavista syistä:

  • Voin laskea päiväkohtaisen käytössä olevan kilometrimäärän suoraan tietovarastossa. Näin sovelluksesta tulee yksinkertaisempi.
  • Haluan jatkossa tehdä tiedoista Power BI -raportin ja upottaa sen Power Appsiin. CDS:n roadmapilla olevalla Direct Query -yhteydellä voin tehdä raportista reaaliaikaisen. SharePointin kanssa tämä ei ole mahdollista.

Luodaan CDS:ään seuraavat entiteetit.

Leasing parametrit

Parametritietue sisältää yhden leasingauton sopimustiedot, joita sitten mobiilisovellus hyödyntää laskennassa.

  • Nimi
  • Sopimuksen alkupäivä
  • Sopimuksen loppupäivä
  • Sopimuksen kesto päivinä (lasketaan: sopimuksen loppupäivä – sopimuksen alkupäivä)
  • Mittarilukema sopimuksen alussa
  • Sopimuksen kilometrit
  • Keskimääräiset kilometrit per päivä (lasketaan: sopimuksen kilometrit / sopimuksen kesto päivinä)
  • Kotona ladattavan sähkön hinta (senttiä/kWh)

Näyttökuva 2020-1-15 kello 17.49.08.png

Teemme ratkaisun ainoastaan minun käyttööni, mutta se on helposti laajennettavissa usean käyttäjän käytettäväksi. Jokaisella käyttäjällä (tarkemmin ottaen ajoneuvolla) olisi tällöin oma parametritietueensa.

Omani näyttää tältä.

Näyttökuva 2020-1-15 kello 17.55.06.png

Leasing kilometrilukemat

Tärkein entiteetti. Ja yksinkertaisin. Tänne tallennetaan mittarilukemat.

Entiteetin kentät ovat.

  • Kilometrilukema
  • Kirjauspäivä (tietueen luontipäivä)

Näyttökuva 2020-1-15 kello 17.48.23.png

Leasing lataukset

Lataus-entiteettiä käytetään lataustapahtumien tallentamiseen. Samaa entiteettiä käytetään niin kotona kuin muuallakin tehtyjen latausten kirjaamiseen.

Entiteetin kentät ovat.

  • Latauspäivä
  • kWh määrä
  • Latauskustannus
  • Latauspaikka (koti, maksullinen, ilmainen)

Näyttökuva 2020-1-15 kello 17.49.36.png

Tietomalli on valmis. Voimme siirtyä toteutukseen.

Power Apps – Aloitusnäyttö

Lisätään Power Appsin tietolähteiksi juuri luomaamme entiteetit (Näytä – Tietolähteet -> etsi ja klikkaa).

Näyttökuva 2020-1-15 kello 18.00.13

Leasingsopimuksen tietoja (auton mittarilukema sopimuksen alussa jne) tarvitaan useassa paikassa, joten ladataan ne sovelluksen käynnistyksen yhteydessä (App OnStart) omaan muuttujaansa.

Set(varLeasingParametrit; First('Leasing parametrit'))

Näyttökuva 2020-1-15 kello 17.56.48.png

Myös viimeisintä tallennettua mittarilukemaa käytetään useassa paikassa. Sen arvo kuitenkin voi muuttua sovellusta käytettäessä, joten tallennetaan se muuttujaan aina kun etusivu näytetään (OnVisible).

Set(varLastOdometerRecord; 
    Last(Sort('Leasing kilometrilukema';'Created On';Ascending)))

Näyttökuva 2020-1-15 kello 18.06.25.png

Mittarilukemana näytetään aina tämän muuttujan sisältämä mittarilukema.

Näyttökuva 2020-1-15 kello 18.13.19.png

Lasketaan seuraavaksi kilometrin vieressä näytettävä toteuman ja ennusteen erotus.

Loogisesti se menee seuraavasti.

  • Lasketaan paljonko nyt on ajettu (Mittarilukema nyt – mittarilukema sopimuskauden alussa)
  • Vähennetään ajetustä määrästä määrä, jonka olisi laskenallisesti voinut ajaa (monesko sopimuspäivä nyt on * keskimääränien päivittäinen kilometrimäärä)
  • Mikäli summa on positiivinen, ollaan ajettu liikaa. Korostetaan tätä + -merkillä

Kaavana sama näyttää hieman monimutkaisemmalta.

With(
  {currentdifference: 
    Round(varLastOdometerRecord.Mittarilukema - 
    varLeasingParametrit.'Mittarilukema sopimuksen alussa' - 
    RoundUp(
     (varLastOdometerRecord.'Created On' - 
      varLeasingParametrit.'Sopimuksen alkupäivä' - 1);0
     ) * varLeasingParametrit.'Keskimääräiset kilometrit per päivä';
     0)
   };
  If(currentdifference > 0;
    "(+" & currentdifference & ")";
    "(" & currentdifference & ")"
  )
)

Korostetaan kilometrien ylitystä vielä värillä. Mikäli luvun etumerkki on miinus, asetataan väriksi punainen. Muutoin luku on vihreä.

Näyttökuva 2020-1-15 kello 18.37.21

Kilometrilukemaa klikkaamalla siirrytään mittarilukeman kirjaamiseen.

Näyttökuva 2020-1-15 kello 18.41.20.png

Power Apps – Mittarilukeman syöttäminen ja muokkaaminen

Aloitetaan Update-painikkeesta. Mikäli olemme päivittämässä vanhaa kirjausta (varEditHistoryItem muuttuja sisältää arvon), päivitämme sen. Muussa tapauksessa lisäämme uuden kirjauksen.

OnSelect: If(!IsBlank(varEditHistoryItem);
             Patch('Leasing kilometrilukema';
                   varEditHistoryItem;
                   {Mittarilukema: Value(inpOdometerValue.Text)});
             Patch('Leasing kilometrilukema';
                   Defaults('Leasing kilometrilukema');
                   {Name: Today();
                    Mittarilukema: Value(inpOdometerValue.Text)})
             );;
           Navigate(scrHome;ScreenTransition.None)

Näyttökuva 2020-1-15 kello 18.53.05.png

Älä hämmenny, emme ole vielä luoneet varEditHistoryItem muuttujaa, se tulee myöhemmin.

Cancel-painikkeella palataan takaisin etusivulle.

Näyttökuva 2020-1-15 kello 18.54.17.png

Lisätään näytölle galleria, jonka tietolähteenä on Leasing kilometrilukema -entiteetti. Gallerian ainoassa tekstikentässä esitetään mittarilukema ja kirjauspäivä (tietueen otsikko).

ThisItem.Mittarilukema & "km (" & ThisItem.Name & ")"

Näyttökuva 2020-1-15 kello 18.56.51.png

Käyttäjän klikatessa riviä, tallennetaan se muuttujaan (varEditHistoryItem).

Select(Parent);; UpdateContext({varEditHistoryItem: ThisItem})

Mikäli käyttäjä on valinnut vanhan rivin muokattavaksi, näytetään syöttökentän otsikossa päivä, jonka kirjausta ollaan muokkaamassa.

Text: "Odometer value " & If(!IsBlank(varEditHistoryItem); varEditHistoryItem.Name)

Näyttökuva 2020-1-15 kello 19.01.24.png

Olemassa olevaa kirjausta muokatessa näytetään tietenkin syöttökentässä oletuksena alkuperäinen arvo.

Näyttökuva 2020-1-15 kello 19.04.19.png

Vielä kun lisätään mahdollisuus poistaa tehtyjä kirjauksia, alkaa näyttö olemaan valmis.

Näyttökuva 2020-1-15 kello 19.09.08.png

Power Apps – Lataustapahtumien syöttäminen

Auton lataustiedot tallennetaan hyvin samanlaisella näytöllä, kuin mittarilukema. Erona on

  • Riveille tallennetaan lataustapahtuman tyyppi (mittarilukema kotona, maksullinen lataus muualla, ilmainen lataus muualla)
  • Lataustapahtuman tyyppi määräytyy sen mukaan, mistä etusivun kohdasta näytolle tullaan
  • Maksullisesta latauksesta tallennetaan ladatun kWh määrän lisäksi myös latauksen kustannus
  • Mikäli kirjataan mittarilukema kotona, lasketaan kustannukseksi kWh-lukema * sähkön hinta kotona (tieto tallennettu parametritietueeseen)

Näyttökuva 2020-1-15 kello 19.11.41.png

Skipataan toteutuksen yksityiskohdat, ettei tarina käy tylsäksi ja ala toistamaan itseään.

Power Apps – Etusivun muut osuudet

Kun tietojen syöttäminen on kunnossa, voimme vimeistellä etusivun muut osuudet.

Auton lataaminen kotona

Etusivulla näytetään kotona ladatun sähkön määrä, sekä sen kustannus.

Näyttökuva 2020-1-16 kello 20.02.21

Teksti toimii linkkinä lataustapahtuman syöttönäytölle.

OnSelect: Navigate(scrCharges; ScreenTransition.None;
          {varChargingType: "Home"; varEditHistoryItem: Blank()})

Näytettävävät luvut ovat

  • viimeiseisen mittariluvun kWh lukema
  • kyseistä lukemaa vastaava kustannus (laskettu valmiiksi tietojen syöttäminsen yhteydessä: kWh määrä * sähkön hinta kotona (tieto tallennet parametritietueeseen)
Text: With(
 {item: Last(Filter('Leasing lataukset';Latauspaikka = "Home"))};
 item.'Kwh määrä' & "kWh (" & item.Latauskustannus & "€)"
 )

Maksulliset latauspisteet

Seuraavassa laatikossa kerrotaan paljonko olen ladannut maksullisista latauspisteistä sekä paljonko tähän on mennyt rahaa.

Näyttökuva 2020-1-16 kello 20.08.24

Teksti on jälleen linkki lataustapahtuman syöttönäytölle.

Näytettävän tekstin muodostaminen on nyt pykälää monimutkaisempaa. Nyt lasketaan tietueilta löytyviä lukuja yhteen (SUM funktio).

Text: Text(
       Sum(
        Filter('Leasing lataukset';
               Latauspaikka = "ChargingStationPaid");
        'Kwh määrä')
       ) & "kWh (" & 
      Text(
       Sum(
        Filter('Leasing lataukset';
               Latauspaikka = "ChargingStationPaid");
       Latauskustannus)
       ) & "€)"

Ilmaiseksi ladattu sähkö

Alimpana näytetään ilmaiseksi ladatun sähkön määrä.

Näyttökuva 2020-1-16 kello 20.16.05

Text: Text(
       Sum(
        Filter('Leasing lataukset';
               Latauspaikka = "ChargingStationFree");
        'Kwh määrä')
       ) & "kWh"

Ajokustannukset ja kilometriylityksen arvioitu kustannus

Etusivun yläosassa on vielä kaksi kiinnostavaa lukua.

  • Paljonko sähköön on kulunut rahaa ajettua 100km kohden
  • Paljonko joudun maksamaan lisäkilometreista (30 senttiä/km), mikäli kilometrejä kertyy tähän tahtiin

Näyttökuva 2020-1-16 kello 20.22.14

Jätetään näiden laskeminen kotitehtäväksi.

Yhtenveto

Sovellusta oli hauska tehdä. Tarve oli todellinen ja käytän appsia viikottain. Näen koko ajan miten paljon olen ylittänyt arvioidun kilometrimäärän. Lisäksi näen arvion lisäkilometreista tulevasta lisälaskusta, mikäli jatkan ajamista samaan tahtiin.