_Du kan gjerne fjerne innholdet i denne filen og skrive din egen dokumentasjon av SmartHus-applikasjonen i denne [README.md](https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-readmes) filen etter at du har laget din kopi at dette repository._
OBS! Det er bare en per gruppe som skal utføre følgende steg:
Trykk på "Use this template". Velg første opsjon "Create a new repository". Du kommer til en ny side. Her skal du gi repo'en et godt navn, f.eks. noe somm inneholder ing301 og ditt gruppenummer. Du skal gjøre repo'en privat slik at bare inviterte folk kan se inneholdet.
Når du har opprettet repo'en kan du dele tilgang med dine gruppemedlemmer.
Når du er på hovedsiden (dvs. https://github.com/{ditt brukernavn}/{ditt valgte repo navn}
) går du på "Settings" > "Collaborators and teams" > "Add people":
Du kan søke opp de andre med deres GitHub brukernavn eller epost.
Alle gruppemedlemmer må minst ha Write
-rollen.
I tillegg skal dere legge til github brukerne til Patrick (@webminz) og Lars (@lmkr) med rollen Read
.
Når tilgangene er på plass kan alle i gruppen ssjekke ut koden på vanlig måte. Trykk på "Code" på hovedsiden og så kopierer du URLen. I GitHub Dekstop på venstre siden trykker du på "Add" > "Clone Repository" og så limer du inn URLen. Da vil du få lastet ned koden lokalt og du kan begynne med prosjektet. Vi anbefaler at du åpner prosjektet i VS Code eller PyCharm som du hadde gjort med oppvarmingsoppgaven.
Når dere åpner prosjektet vil dere se følgende mappestruktur:
.
├── README.md
├── domainmodel.[..] <--- Her skal dere legger dere klassediagrammet dere har tegnet
├── .gitignore
├── .github
│ └── workflows
│ └── check-assignment-code.yaml
├── .git
│ └── ...
├── smarthouse
│ ├── __init__.py
│ └── domain.py <--- Her skal dere legger inn deres klasser og utvide den eksisterende koden
└── tests
├── __init__.py
├── demo_house.py <--- Her skal dere bygge opp "demohuset" ved å bruke deres klasser
└── test_part_a.py <--- Målet til slutt er å få alle tester her til å bli "grønn"
De fire relevante plassene i denne mappestrukturen er markert med kommentarer.
For mange blir det sikkert første gang at dere utvikler et større programvaresystem. Det er viktig "en dyp pust inn" før dere setter i gang. For å ikke bli overveldet, har vi lagt en steg-for-steg oppskrift hvordan denne oppgaven skal løses:
smarthouse/domain.py
.
Du kan tegne klassedigramm enten på ark/whiteboard (husk å scanne det etterpå eller ta bildet) eller et grafisk verktøy som diagrams.net eller Figma.
Klassediagrammet skal lagres enten som PDF eller bildefil (.jpg
, .png
, .svg
) og lastes opp i roten til repo'en med navn domainmodel.<filtype>
(dette skal være deres første egen commit!). smarthouse/domain.py
filen.
Dere betyr at dere skal legge til klasser som representer rom, etasjer og de forskjellige type enheter.
Tenk på hva slags attributter (dvs. de som settes i konstruktor: __init__
-funskjonen) og metodene (funksjoner innen en klasse) hver enkelt klasse trenger.SmartHouse
i smarthouse/domain.py
: Her finner dere en rekke funksjoner som mangler en korrekt implementasjon.
Deres oppgave er å skrive funksjonaliteten til hver enkelt funksjon som det er beskrevet i kommentaren ved å bruke deres nylagte klasser.tests/demo_house.py
ved å bruke de forskjellige regiser_
-funskjonene i SmartHouse
som dere har nettop implementert. tests/test_part_a.py
til å bestå. Sjekk implementasjonskravene nedenfor for å sjekke
om dere eventuelt trenger å utvide dere klasse om noen attributter eller metoder. I de gitte Unit-testene forventes det at objekter som representerer enheter tilbyr spesifikke funksjoner, konkret:
id
, supplier
, model_name
som inneholder den tekniske identifikatoren,
produsentnavn og modellnavnis_actuator()
, is_sensor()
, og get_device_type()
. Førstnevnte
returnerer en boolsk verdi som gir uttrykk for om enheten er en aktuator eller en sensor. Sistnevnte funksjon returnerer en
tekst (str
) som beskriver hva konkret type enhet det er, f.eks Heat Pump
, Smart Lock
, osv.last_measurement
som returnerer en objekt av type Measurement
. Målenheten i målingen
skal samsvare med måleenheten av sensoren (f.eks. måler en temperaturmåler in enheten celsius: "°C"
). For verdien kan du velge
en helt tilfeldig numerisk verdi (du kan f.eks. bruke random modulen) og timestamp
skal være en tekstuell representasjon av et tidspunkt (du kan f.eks. bruke ISO-8601).turn_on()
, turn_off()
, is_active()
. Sistnevnte skal returnere True
hvis enheten har blitt slått
på med turn_on()
. Tar også hensyn til at visse aktuatorer kan også gis et "target_value
" (f.eks. panelovn eller varmepumper kan settes til en ønsket temperatur).Tar gjerne en titt i testfilen for å sjekke hvilke funksjoner forventes av deres domenemodell.