af Senol Köycü [sekoy10@student.sdu.dk] og Ahmad Akhmiev [zaakh08@student.sdu.dk]

Introduktion

Dette projekt er en del af vores speciale. Specialet omhandler simpel og intuitiv lysstyring i universitetets lokaler. Formålet med specialet er at finde en god måde at implementere lysstyring på. Idet en bruger træder ind i et lokale skal vedkommende have mulighed for at styre lys fra sin håndholdte enhed. Hvert rum i en bygning kan have lys med forskellige egenskaber, herunder lysstyrke styring. Disse egenskaber er styret automatisk ved hjælp af sensorer placeret i rummet. Her kommer en applikation til smartphones ind i billedet, der giver mulighed for at have kontrol over nogle egenskaber, der ellers ikke er tilgængelige med fysiske kontakter. Nu til dags har de fleste smartphones i lommen og de fleste forventer at kunne interagere med deres omgivelser vha. deres enheder. Derfor for at følge trit med tiden er der brug for at udvikle en løsning der kan give brugeren disse muligheder.

Denne del af projektet omhandler implementering af en intuitiv app på iOS platformen. For at understøtte appen og for at kunne gøre noget reelt fra app’en skal der samtidig udvikles et backend system. Tests af app’en bliver udført i Mærsk bygningen ved SDU i Odense. Her er der installeret en sMAP server der kan kommunikere med de enkelte lyskilder i bygningen. sMAP serveren udstiller REST baseret API, hvormed vi kan aflæse værdier for de enkelte lokaler og vi kan styre lyset og sensorer, hvis der er nogen. Det er dette API vi bruger i vores samlede løsning.

Dette projekt hovedformål er at gøre styring af belysning i lokaler smartere og mere bekvemt gennem bruger interaktioner. Herunder ønsker brugerne et så simpelt system som muligt. Det skal være hurtigt og bekvemt at bruge.

Der ønskes udviklet et system bygget op omkring API’et udstillet af en sMAP serveren, der muliggøre styringen af belysning i bygninger.

Det samlede system skal bestå af en backend og flere klientsystemer. Der vil blive udviklet en iOS applikation, hvorigennem belysning for hele bygningen eller de enkelte lokaler kan styres.

Vores mål er at afdække krav til applikationen, simple prototyper, implementere prototyper, evaluering af hvert enkelt skridt og dernæst have en applikation, hvormed vi kan interagere med vores omgivelser.

Metoder og materialer

Dette afsnit omhandler de brugte metoder og materialer i arbejdet med dette projekt.

Første skridt i retningen af et produkt er altid at afdække potentielle brugeres behov, dvs. forstå brugerens brugsmønstre. Vi startede med at afdække krav ved at snakke med potentielle brugere, dvs. studerende på universitetet. Ved hjælp af disse krav var det muligt at etablere den første konceptuelle model for applikationen. For at finde inspiration til hvordan andre har løst samme eller lignende problem blev markedet undersøgt for at finde lignende applikationer. Det undersøgte marked indkluderer app stores for iOS og Android platformene. De fundne applikationer blev undersøgt for fordele og ulemper, samt sværhedsgrad og hvor nemt det er at konfigurere.

Andet skridt var at udvikle prototyper, der kunne testes med potentielle brugere. Vi startede med at tegne mockups på papir. For at udnytte at vi er to i projektet udviklede vi en prototype hver. Disse prototyper blev præsenteret til udvalgte brugere for at give dem et startpunkt for evalueringen, hvor vi forklarede hvad projektet går ud på. Herefter havde brugerne fri mulighed for at komme med ethvert input udfra de to første prototyper. Brugerne gav uforstyrret feedback som blev noteret og evt. uddybet når det var nødvendigt. Brugerevalueringen resulterede i at de to separate prototyper blev til én med brugernes feedback for øje.

Resultaterne blev samlet sammen og der blev udviklet en endelig prototype vha. værktøjet Balsamiq Mockups. Den endelige prototype blev implementeret i Xcode med Interface Builder. På dette tidspunkt var der ikke implementeret nogle funktionaliteter. Det implementerede views præsenterede evaluerede vi igen med potentielle brugere og fik masser af feedback.

Med feedback fra evalueringen blev der lavet en komplet redesign af applikationen fra den oprindelige prototype.

Implementering er foregået i Xcode med Swift som programmeringssprog. Alle views er bygget med Interface Builder. I toppen af skærmen er der brugt et tredjeparts framework der gør det muligt at have en dropdown menu i navigationsbaren. Dette framework hedder BTNavigationDropDownMenu og kan findes på github.com. Derudover er der bliver brugt CoreData frameworket til at kunne gemme personlige indstillinger på enheden.

Det endelige design blev implementeret igen, den her gang med funktionaliteter. Den endelige version der kan styre lys i enkelte lokaler blev præsenteret og testet af igen med potentielle brugere.

Resultater

Dette afsnit beskriver en sammenfattende konklusion på projektet. Afsnittet indeholder konklusioner af forskellige aspekter, såsom krav, conceptual model, lignende produkter, mockups, prototyper, evaluering af disse, implementering og endelig evaluering m.m.

Kravene for projektet er omfattet af en større liste. Denne liste er neddroslet eftersom projektet og fagets ramme er anderledes, så disse er tilpasset hertil. Selve appinterfacet kan ligne at være meget simpel, men bag gardinerne er en masse backend implementering.

Funktionelle

  • Regulering af lys (styrke, tænd/sluk)
  • Kontrol af forskellige lokaler
  • Brugerspecifikke indstillinger
  • Brugeren skal være i stand til at gemme personlige indstillinger
  • Brugeren skal være i stand til at slette personlige indstillinger
  • Brugeren skal være i stand til at kunne anvende gemte indstillinger
  • Brugeren skal modtage fejlmeddelelser når noget går galt

Tekniske

  • Kommunikation med sMAP server via REST services
  • Lagring af data i en database

De konceptuelle modeller beskriver de funktionaliteter produktet skal indeholde. Det kan konkluderes at nedenstående punkter er implementeret

  • En studerende skal kunne opnå kontrol med lys i det rum vedkommende befinder sig i
  • En studerende skal kunne se hvilke lys vedkommende kan styre
  • En studerende skal kunne tænde og slukke alle lys på en gang
  • En studerende skal kunne oprette personlige lysindstillinger
  • En studerende skal kunne se sine gemte indstillinger
  • En studerende skal kunne slette de personlige indstillinger
  • En studerende skal kunne anvende sine personlige indstillinger

I starten af projektet valgte vi analysere samt teste 1 app fra iOS platformen og 2 fra Android, som en del af vores markedsresearch og inspirationskilde, hvilket resulterede i følgende output:

Incontrol Home Automation (iOS)

https://itunes.apple.com/us/app/incontrol-home-automation/id408084651?mt=8

Kommunikation baseret på Zwave netværk, der hjælper med at kontrollere lys, dørlås og termostater.

  • Fordele
    • Taget i betragtning af Zwave er installeret, er det en rigtig funktionsrig app
  • Ulemper
    • Måske lidt for avanceret til  den normale bruger der ikke har den største tekniske indsigt
    • Kræver en Zwave installation

Personal Light Control (Android)

https://play.google.com/store/apps/details?id=ro.gecosoft.android&hl=en

Kontrollere lys fra langdistance ved hjælp brug af trådløs lys services.

  • Fordele
    • ingen
  • Ulemper
    • Ingen kvalitet
    • Meget tynd klient
    • Dårlig funktionalitet
    • Ikke indbydende design
    • Ingen introduktion/hjælp i app

Light controller White & RGBW (Android)

https://play.google.com/store/apps/details?id=tv.piratemedia.lightcontroler&hl=en

Tillader styring af RGBW lyspærer og normale lys.

  • Fordele
    • Avanceret app, tilbyder en masse services og funktionaliteter
    • Understøtter en del lys modes: Normal mode, lyttetilstand (opfange samt tilpasse sig rytmen af musik og dermed udbyde forskellige farver), disco mode
  • Ulemper
    • Setup af app er ikke altid let – konfiguration kan være en nødvendighed

Mockups

Til udvikling af mockups er der valgt en velkendt, simpel og effektiv metode. Ved hjælp af POP-metoden (Prototyping on Paper) opnåede vi  ikke blot en tidsbesparelse men samtidig nem en nem måde at tilpasse efter evaluering med slutbrugeren. Derudover valgte vi at sidde individuelt og tegne hver vores idé, for dernæst at få evalueret begge på samme tid, og se hvilken idé brugerne bedst kunne lide. Første billede illustrerer Senol Köycüs idé.

iOS mockup

Efterfølgende billeder illustrerer Ahmad Akmievs idé.

Screen Shot 2015-11-30 at 14.45.03Screen Shot 2015-11-30 at 14.45.26

Disse prototyper blev evalueret sammen med udvalgte brugere fra universitet. Brugerne kender omgivelserne og miljøet på universitetet, hvorfor de ville være de oplagte testere. De studerende blev præsenteret POP prototyperne med en introduktion til projektet. Brugerne kom med feedback såsom layout, struktur og generelt brugervenlighed. En af feedback var at der ikke skulle være for mange funktionaliteter, så ville brugerne ikke bruge applikationen. En anden var at der ikke skulle være alt for mange clicks førend man kunne tage styringen. Evalueringerne af disse viste sig, at brugeren kunne tænke sig et mix af POP prototyperne, så App’en indeholdte en Splash screen (velkomstskærm), hoved menu, settings menu osv. Efter evalueringen tegnede vi i fællesskab det brugerne ville have, implementerede dette, og gik derefter individuelt ud for at teste med potentielle brugere. Deres feedback blev noteret, så vi kunne mødes i gruppen og sammenligne svarene. Nedenfor viste figurer illustrerer de udviklede mockups før implementeringen i Xcode.

Screen Shot 2015-11-30 at 14.48.28 Screen Shot 2015-11-30 at 14.48.48 Screen Shot 2015-11-30 at 14.49.00 Screen Shot 2015-11-30 at 14.49.12

Efter implementeringen i Xcode, viste det sig at brugerne ønskede sig noget andet og derfor blev vi nødt til at udvikle nye mockups. Brugerkritikken på endelige prototyper gik ud på at det ikke var lige til at styre lyset som de havde ønsket sig i starten. Fx ville de gerne havde en enkelt knap til hvert lokale, som ville gøre det hurtigt og nemt at slukke og tænde lyset. Resultatet af denne brugerevaluering førte til at det nye design blev som vist nedenfor.

Main views

Det endelige design blev igen præsenteret for brugerne, som svarede tilbage med at resultatet er lige hvad de havde ønsket sig. Interfacet var meget simpelt og ligetil som ønsket, og derudover let at forstå de øvrige funktioner tilknyttet appen. Den eneste kommentar omkring designet var af selve tænd/sluk knappen, hvor billedet ikke er skaleret rigtigt.

Overordnet set ser hele systemet ud som på følgende figur. Vi har en allerede eksisterende sMAP server, der er installeret i Mærsk bygningen og hvor vi har adgang til nogle enkelte lokaler. Vores server der er bygget på Node.js bruger REST services udstillet af sMAP serveren. Vores egen server udstiller selv REST services, som andre klienter kan bruge af. Som database på serveren bruger vi MongoDB da dette syntes at være det bedste fit for dette slags system.

Screen Shot 2015-11-30 at 20.23.57

Nedenfor er objekt diagram, der illustrerer model-view-controller struktur af applikationen. Modellen består kun af LightSetting, dvs. lys indstillinger der er bruger og lokale definerede. Controllers består af tre controllere der manipulerer med views.

ObjectDiagramMVC

Strukturen af applikationen kan ses på det næste figur. Vi har en HTTPHelper, der bygger en http request op og udfører dette som asynkront for ikke at blokere UI. I bunden har vi SettingCell og LightSetting. LightSetting repræsenterer vores model og SettingCell er en custom klasse når settings skal tegnes i en table view. Med SettingsViewController putter vi data i en array der indeholder objekter af typen LightSetting og bruger SettingCell til at tegne tabellen med lys indstillinger.

Screen Shot 2015-11-30 at 20.06.36

Følgende er en kodestykke af metoden som indlæser lokaler når viewet bliver indlæst. Her laves et asynkront http kald mod vores ekstrene server. Når kaldet returnerer bliver det returnerede json data pakket ud og lagt ind i en dictionary. I slutningen af det asynkrone kald, laves der en update af dropdown menuen og settings viewet.

func loadRooms() {
        // Create HTTP request and set request Body
        let httpRequest = httpHelper.buildRequest("offices/all", method: "GET", authType: nil, requestContentType: .HTTPJsonContent)
        
        httpHelper.sendRequest(httpRequest, completion: {(data:NSData!, error:NSError!) in
            // Display error
            if error != nil {
                let errorMessage = self.httpHelper.getErrorMessage(error)
                self.displayAlertMessage("Error", alertDescription: errorMessage as String)
                self.activityIndicatorView.hidden = true
                
                return
            }
            
            self.activityIndicatorView.hidden = true
            
            let responseDict = try!NSJSONSerialization.JSONObjectWithData(data,
                options: NSJSONReadingOptions.AllowFragments) as! NSDictionary
            
            if let offices: AnyObject = responseDict["offices"]{
                for aOffice in offices as! NSArray {
                    var friendlyName = ""
                    var path = ""
                    for aKey in (aOffice as! NSDictionary).allKeys{
                        //print(aKey)
                        if aKey as! String == "friendlyName" {
                            friendlyName = aOffice.objectForKey(aKey) as! String
                        }
                        if aKey as! String == "path" {
                            path = aOffice.objectForKey(aKey) as! String
                        }
                    }
                    self.rooms[friendlyName] = path
                }
            }
            self.drawDropDownMenu()
            self.setRoomPathOnSettingsView()
        })
    }

Formatet af det modtagne data er som følger:

{
    "offices": [
        {
            "_id": "563a032a574c1a490a53b467",
            "friendlyName": "Someones office",
            "path": "some/path",
            "__v": 0
        }
}

I settings viewet har vi brug for at vide nuværende lokale der er valgt for at kunne vise de rigtige lys indstillinger for det rigtige lokale. Dette udføres ved at tage fat i navigation controllere, som der er to af. Hver af dem indeholder et x antal views, i dette tilfælde et hver. Da vi har brug for SettingsViewController tager vi fat i navigation controller på plads 1 og viewcontroller på plads 0 på denne navigation controller. Denne viewcontroller kan så blive castet til SettingsViewController og vi kan derfor læse og skrive til dens variable. Følgende stykke kode viser dette.

func setRoomPathOnSettingsView() {
        let barControllers = self.tabBarController?.viewControllers
        let navigationController = barControllers![1] as!  UINavigationController
        let settingsViewController = navigationController.viewControllers[0] as! SettingsViewController
        settingsViewController.roomPath = self.rooms[self.selectedCellLabel.title!]!

Når tænd/sluk knappen er trykket, udføres atter et asynkront http kald mod vores externe server. Kaldet bliver udført med to parametre, som er lokale stien og den tilstand der skal skiftes til. Følgende er koden der gør dette.

@IBAction func lightSwitchClicked(sender: AnyObject) {
        let roomPath = self.rooms[selectedCellLabel.title!]
        
        var state = 1
        
        if lightsOn {
            state = 0
        }
        
        let url = "controls/toggleActuator?officePath="+roomPath!+"&state="+String(state)
        
        let httpRequest = httpHelper.buildRequest(url, method: "GET",
            authType: nil, requestContentType: nil)
        
        httpHelper.sendRequest(httpRequest, completion: {(data:NSData!, error:NSError!) in
            // Display error
            if error != nil {
                let errorMessage = self.httpHelper.getErrorMessage(error)
                self.displayAlertMessage("Error", alertDescription: errorMessage as String)
                return
            }
            
            _ = try!NSJSONSerialization.JSONObjectWithData(data,
                options: NSJSONReadingOptions.AllowFragments) as! NSDictionary
            
            self.lightsOn = Bool(state)
            self.switchLights()
        })
    }

Discussion

Vi har formået at implementere en funktionel app der opfylder alle funktionelle og tekniske krav. Vi har formået at imødekomme alle konceptuelle modeller beskrevet i afsnittet Results. Sammenlignes vores research med produktet vi tilbyder, vil vi på nuværende tidspunkt kun være i stand til at udkonkurrere “Personal Light Control”. Med hensyn til kommunikationen vil det dog være en fordel at bruge vores produktet, eftersom der ikke kræves en opsætning fra brugerens side. Ydermere er fordelen for vores produkt, at vi tilbyder et meget simplere interface, der er til at forstå for vores målgruppe, idet vi bruger et velkendt tænd/sluk logo til knappen med skiftende farve, som indikerer lystilstanden.

Evalueringer af projektet

Det har hjulpet rigtig meget løbende at evaluere projektet fra start til slut. De første evalueringer hjalp os at komme hurtigt i gang med udviklingen af rigtige views i Xcode. Efterfølgende viste det sig at resultatet ikke blev helt så godt som på papiret. Her hjalp det igen at evaluere og komme op med et nyt design, som brugerne kunne meget bedre lide. Det endelige resultat blev meget bedre end det vi startede ud med.

Mangler i implementeringen

Vi mangler at implementere anvendelse af personlige indstillinger. Det er muligt at gemme og slette, men de kan ikke anvendes, dermed bruges. Derudover mangler vi at implementere lysstyrke og styring forskellige lyskilder i et rum. Implementering af lysstyrke har ikke været mulig endnu, da vi er afhængige af en tredjepart, der skal gør det muligt for os at styre lysstyrke. Dette forventer vi sker i den nærmeste fremtid. Styring af forskellige lyskilder har også været forsinket pga. tredjepart. Mapping af lokaler og lyskilder i Mærsk bygningen har været fejlbehæftet, hvorfor vi ikke nåede at implementere denne funktionalitet.

Perspektivering

Som beskrevet i introduktionen er dette produkt en del af vores speciale. iOS applikationen var en del af dette kursus, og for at kunne styre lys skulle der også udvikles en backend, som skulle udvikles målrettet iOS kurset. Ved at tilpasse specialet til iOS kurset har vi opfyldt kursets mål.

Formålet er at udvikle en fuld funktionel app, der interagere med beacons, placeret i alle rum i Mærsk bygningen. Enheden skal via bluetooth detektere den pågældende beacon i lokalet, oprette forbindelse og derefter give adgang til appens funktionaliteter, som bl.a. er styring af rummets lys, lysstyrke m.m.

Før en bruger kan få tilladelse til at bruge app’en, skal bluetooth aktiveres. Vi skal derfor ændre vores interface til, at der efter Splash Screen bliver viderestillet til et nyt info view, der bl.a. informerer om at aktivere bluetooth. Efter aktivering vil appen fungere som hidtil, ved at vise main view. Der er udviklet og klargjort layouts til log in og sign up. Disse skal bruges i tilfælde af, at der skal udvikles et seperat admin panel, til at skelne mellem den normale bruger og brugere med administratorrettigheder, såsom vagter, pedeller m.m. Følgende er illustreret på billedet nedenfor. 

Screen Shot 2015-11-30 at 20.29.32

Når vi har en korrekt mapning af lokaler og lyskilder med den rigtige beacon kan vi tilbyde individuel kontrol af forskellige lys i rummet, så det er muligt at slukke for tavlelys, hovedlys, og baggrundslys for sig, eller justere deres lysstyrke. Indholdet af den nuværende drop-down-menu skal udskiftes til at indeholde de forskellige lys, der er adgang til at kontrollere.

Source code

Leave a Reply