Onderzoek naar de toepassing van een Agent voor de verrijzeniskapel.
Ogo 3.2 project
Chao Ming Chen (0556510) Niek van Erk (0549121) Coen Hoogervorst (0547548)
Eindhoven, 24 februari 2006
Voorwoord Het ingenieursbureau IntellAgent is begin december 2005 begonnen met een onderzoek naar de toepassing van een agent voor het automatiseren van het huurverhuur systeem en alles daaromheen van de Verrijzeniskapel in Eindhoven. In het begin was het nog enigszins onduidelijk wat de agent precies moest kunnen en wat het precieze doel van het project was. Maar uiteindelijk is het allemaal duidelijk geworden en zijn er mooie resultaten behaald. Dit rapport is bedoeld voor de gemeente Eindhoven om inzicht te geven over de toepasbaarheid van agenten in het Verrijzeniskapel. Enige kennis van de programmeertaal JAVA is gewenst om de opzet van het programmeeronderdeel van de ketel goed te begrijpen. Wij bedanken Dr. ir. M.A. van Houten en ir. G. Boxem voor de begeleiding en verstrekken van informatie tijdens dit project.
Eindhoven, 24 februari 2006
Studenten 3de jaar Installatietechnologie
2
Inhoudsopgave Hoofdstuk Voorwoord
Pagina 2
Inhoudsopgave
3
Samenvatting
4
Hoofdstuk 1 Inleiding 1.1 Aanleiding en vorige onderzoeken 1.2 Plan van aanpak 1.3 Leeswijzer
5 5 5 6
Hoofdstuk 2 Verrijzeniskapel 2.1 Wensen van de gemeente 2.2 Wensen van de gebruikers
7 7 8
Hoofdstuk 3 Agenten
9
Hoofdstuk 4 Ontwerp systeem 4.1 Het ontstaan van het systeem 4.2 Agenten 4.3 Scenario’s
13 13 17 18
Hoofdstuk 5 5.1 Programmeren agent ketelaansturing 5.2 Testen agent
22 22 24
Literatuurlijst
26
Bijlagen
3
Samenvatting De gemeente Eindhoven bezit een aantal gebouwen in Eindhoven, waaronder de Verrijzeniskapel. Dit is een monumentaal gebouw waar bepaalde eisen aan gesteld zijn voor het gebruik ervan. De gemeente verhuurt dit gebouw aan verschillende gebruikers die gebruik willen maken van de ruimtes in dit gebouw. Op dit moment wordt alle administratie bijgehouden door de hoofdhuurder. De gemeente wil echter naar een modern systeem waarbij alles automatisch verwerkt wordt. Een agent zou hierbij de uitkomst moeten bieden. Dit systeem moet ervoor zorgen dat: de wensen van de gemeente en de gebruikers vastgelegd worden, gebruikers via internet zalen kunnen reserveren, de zalen op tijd op gewenste temperatuur moeten zijn en een database bijgehouden wordt van verschillende onderdelen die benodigd zijn voor de automatisering van het huur-verhuur systeem. De laatste stap is het programmeren van het systeem. Eerst zijn er scenario’s opgesteld om er zeker van te zijn dat het systeem op ieder moment de juiste handelingen verricht. Vervolgens is een deel van het systeem geprogrammeerd, namelijk de ketel. Om de laatste stap richting praktijk te zetten is de ketelagent geprogrammeerd in JAVA. Er is een vereenvoudiging gemaakt van de werkelijkheid: de ketel heeft twee standen, aan en uit. Er zijn twee kleppen geplaatst, die kunnen sturen welke ruimte verwarmd moet worden. De ruimtes worden verwarmd met 2 graden Kelvin per uur als de ketel in bedrijf is, en de klep naar de ruimte open staat. Als de ruimtes niet verwarmd worden koelen ze met 1 graad per uur af. Zo is een opwarmstrategie voor de ruimtes bepaald, en in JAVA geprogrammeerd. Er is tijdens de simulatie duidelijk te zien wat er gebeurd. Er wordt op het scherm weergegeven wat de temperatuur van de ruimtes is, de klepstanden en de bedrijfstoestand van de ketel. De tijd tot de volgende reservering is weergegeven evenals de gewenste temperatuur op dat moment. Ook is geprobeerd met JAVA een duidelijke grafiek te maken, maar dit bleek veel beter te gaan met Matlab.
4
Hoofdstuk 1 Inleiding 1.1 Aanleiding en vorige onderzoeken De verrijzeniskapel aan de Kanaalstraat in Eindhoven is een monumentaal gebouw. Toch wil de gemeente dit gebouw in gebruik houden en verhuurt het aan verschillende gebruikers. Zo wordt het onder andere gebruikt voor tangolessen, de toneelvereniging en de studentenkerk. Al deze gebruikers hebben verschillende wensen en willen het gebouw zo efficiënt mogelijk gebruiken, waarbij alles op een eerlijke manier geregeld wordt. Het liefst zelfs op een manier dat er niet avondenlang papierwerk gedaan hoeft te worden. Daarom heeft de gemeente besloten deze kapel een modern tintje te geven door hem uit te rusten met een intelligent gebouwbeheersysteem. Dit systeem moet zorg dragen voor een goed binnenklimaat van de ruimtes, een goede samenspraak welke huurder op welk moment de ruimte mag gebruiken en het berekenen van de gemaakte kosten. De gemeente heeft gevraagd aan de Technische Universiteit te Eindhoven dit project op zich te nemen. Voordat dit onderzoek tot stand is gekomen, zijn er twee eerdere onderzoeken uitgevoerd. Master studente Building Services N. Dubytska heeft onderzoek gedaan naar de wensen van de gebruikers en de gemeente [2]. Het andere onderzoek in dit pand is gedaan naar het comfort van het gebouw [3],[9]. Dit onderzoek heeft tot doel een intelligent gebouwbeheersysteem te ontwerpen voor de Verrijzeniskapel door gebruik te maken van agenten.
1.2 Plan van aanpak Om tot goede resultaten te kunnen komen bij dit onderzoek moeten eerst alle gebruikerswensen uiteengezet worden. Met behulp van het verslag van N. Dubytska wordt een programma van Eisen gemaakt, wat gebruikt wordt om het systeem samen te stellen. Eerst wordt er een totaalplaatje gemaakt welke gebruikers er zijn en wat de bevoegdheden worden van de gebruikers. Als het systeem vergeleken wordt met een C-box kan er een diagram gemaakt worden die de richting van de informatiestromen aangeeft. Hierbij moet rekening gehouden worden met vragen als: welke gebruiker kan in welke database en kan deze gebruiker daar alleen in lezen of ook gegevens in schrijven? Als laatste stap naar het programmeren van de agenten wordt het systeem in UML geplaatst, waarin duidelijk wordt welke verschillende objecten er zijn en welke functies deze moeten kunnen vervullen. Voordat er geprogrammeerd gaat worden, is een aantal scenario’s uitgewerkt. Dit is gedaan om duidelijk weer te geven welke stappen er achtereenvolgens genomen worden als een gebruiker iets wil veranderen in het systeem. Tevens is het een test en controle voor de ontwerpers of het systeem aan de eisen voldoet. Tot slot kan het systeem geprogrammeerd worden. Dit zal gebeuren in de object georiënteerde taal JAVA. Voordat de programmatuur afgeleverd kan worden, moet deze eerst worden getest en moet een demo gemaakt worden om visueel weer te kunnen geven wat de mogelijkheden van het systeem zijn.
5
1.3 Leeswijzer “Eerst gedaan en dan bedacht, heeft menigeen verdriet gebracht.” Vandaar dat ook dit onderzoek is begonnen met een literatuurstudie. De gebruikerswensen zijn bepaald en er is informatie gevonden over wat een agent is. Dit is te vinden in de hoofdstukken 2 en 3. Met de gebruikerswensen kan het programma van eisen geschreven worden. De mogelijkheden van het systeem zijn te vinden in hoofdstuk 4. Verder wordt in dit hoofdstuk de laatste stap gezet richting het programmeren; het maken van schema’s in UML. Tevens worden met behulp van scenario’s de mogelijke situaties weergegeven. Dit is een soort theoretische controle of het systeem aan alle eisen voldoet. Aan de hand van de gemaakte UML diagrammen wordt in hoofdstuk 5 een deel van de agenten geprogrammeerd in JAVA en uitgewerkt. Hier staan ook de resultaten van de controle en het testen.
6
Hoofdstuk 2 Verrijzeniskapel De Verrijzeniskapel wordt, zoals eerder vermeld is, verhuurd aan verschillende verenigingen zoals de tangovereniging, de studentenkerk en de toneelvereniging. Helaas is er geen overzichtelijk systeem voor de verhuur, kostenbeheer en de toegang. Om het gebruikersgemak te verhogen zou een dergelijk systeem wenselijk zijn. Nu is de hoofdhuurder de aangewezen persoon om deze zaken op te lossen, terwijl dit ook door een computer geregeld kan worden. Om een goed systeem te kunnen ontwerpen moeten de wensen van de gebruikers bekend zijn. Deze gebruikerswensen zijn uiteengezet in het verslag van het master project 1.2 van N. Dubytska [2].
2.1 Wensen van de gemeente -
De toegang moet per gebruiker geregeld worden. Een gebruiker heeft alleen toegang tot de ruimtes die hij nodig heeft. Het gebouw moet toegankelijk zijn voor minder validen. Gebruikers die er behoefte aan hebben moeten een bergruimte krijgen. Consumpties moeten verrekend worden aan de desbetreffende gebruiker. De energiekosten moeten per gebruiker berekend worden. Er moet een handig systeem komen van sleutelbeheer, reserveringen en rekeningen. Goede contractvorming van de gemeente en de hoofdgebruiker met betrekking tot het huurdersonderhoud en eigenaarsonderhoud.
De toegang per gebruiker regelen is op te lossen door middel van een elektronische sleutel. Een pasje op credit-card formaat met een code waarvan het systeem weet welke gebruiker het is en daaraan koppelt welke rechten deze gebruiker heeft is voldoende. De toegang voor minder validen en het aanbrengen van afgesloten bergruimte zijn bouwkundige aanpassingen. In dit project wordt daar verder geen aandacht aan geschonken. Voor het eerlijk berekenen van de genomen consumpties kan een koelkast-automaat geplaatst worden. Door middel van de elektronische sleutel of chipgeld kunnen de kosten eerlijk toegekend worden. Een andere mogelijkheid is dat het systeem bijhoudt hoeveel de voorraad is gedaald in een bepaalde periode en de kosten gaan naar de gebruiker die op dat moment de ruimte heeft gereserveerd. Dit moet in nader overleg besloten worden met de gemeente en andere belanghebbenden. Door meetpunten te installeren voor de verbruikte energie (gas- en elektriciteit) kan per gebruiker berekend worden wat de energiekosten zijn. De verbruikte elektriciteit per gebruiker is alleen dat deel tijdens zijn aanwezigheid. Omdat er een intelligent systeem ontworpen dient te worden waarbij de gehuurde ruimte op temperatuur is als de gebruiker binnenkomt, moet een eerlijke verdeelsleutel bedacht worden voor het berekenen van de gebruikte hoeveelheid aardgas. Het zou bijvoorbeeld oneerlijk zijn in het geval dat er twee gebruikers na elkaar een ruimte huren, de gemaakte stookkosten voor het opwarmen toe te rekenen aan de eerste gebruiker en dat de tweede gebruiker ervan profiteert. Een systeem voor sleutelbeheer, reserveringen, rekeningen en contractenbeheer wordt gemaakt door een schakeling van databanken. Door middel van een interface kan elke gebruiker zijn eigen gegevens inzien en aanpassen. De hoofdhuurder krijgt hierbij de meeste rechten, hij heeft in het wijzigen van de gegevens altijd het laatste woord.
7
2.2 Wensen van de gebruikers -
De binnentemperatuur moet beter geregeld worden, grote temperatuurverschillen zijn niet wenselijk vanwege de muziekinstrumenten. De vluchtroute en brandveiligheidsinstallaties zijn niet helemaal volgens de normen. Bij het houden van de kerkdienst moeten de sanitaire voorzieningen gebruikt kunnen worden. Gebruikers zouden toegang moeten krijgen tot de keuken. De kosten moeten beter verdeeld worden. Er moet een regeling komen voor de schoonmaak Er moet een betere afstemming komen met de andere gebruikers van het gebouw Nieuwe huurders moeten zich aan kunnen melden en een ruimte kunnen huren. Bij storingen moet automatisch een servicemonteur gewaarschuwd worden
Voor het binnenklimaat zal in het systeem een ‘agent’ aangemaakt worden. Deze zal waken voor een goede binnentemperatuur en een goede hoeveelheid ventilatie. Het aanpassen van vluchtroutes behoort niet tot deze opdracht. Ook het onderzoeken en eventueel verbeteren van de brandveiligheid is een bouwkundige aanpassing, wat niet tot deze opdracht behoort. Het gebruik van sanitaire voorzieningen en de keuken moet geregeld worden. De toegang van deze ruimtes moet ingesteld kunnen worden, waarna de gebruikers toegang hiertoe kunnen krijgen. Er moet een agent komen die de kosten registreert en met een goede verdeelsleutel aan de gebruikers toerekent. Voor de schoonmaak moet een regeling komen. De kosten hiervan moeten worden verrekend naar de gebruikers. De gebruikers moeten een ruimte kunnen reserveren in een digitale agenda. Hierin kunnen ze tevens zien welke andere ruimtes op hetzelfde tijdstip gereserveerd zijn. De gebruikers kunnen dan zelf zorgen voor een goede afstemming. Nieuwe huurders moeten zich aan kunnen melden via het systeem. De hoofdhuurder moet bepalen of de nieuwe gebruiker toestemming krijgt en na invullen van een contract moet deze een ruimte kunnen gebruiken. In het systeem moet een actieve agent zijn die storingen waarneemt en indien nodig een servicemonteur waarschuwt. De servicemonteur kan vanaf zijn werkplek inloggen in het systeem en bij een kleine storing deze verhelpen op afstand. Deze wensen en eisen zijn verwerkt en hiermee is een systeem ontworpen.
8
Hoofdstuk 3 Agenten Dit hoofdstuk is een samenvatting gemaakt aan de hand van de bijlage “agenten” uit de afstudeerscriptie “Careful Building;Software agents voor een gebouwbeheersysteem” door Maarten Hommelberg [11].
De agenttechnologie is nog redelijk nieuw. Agenten worden veel toegepast maar er is nog geen duidelijke omschrijving van wat een agent moet kunnen. De eigenschappen die agentsoftware zou kunnen hebben: autonoom, adaptief, reactief, mobiel, coöperatief, interactief en sociaal zijn en een persoonlijkheid hebben [8]. Maar wat zijn agenten precies? Wat is een software agent In het boek “artificial intelligence a modern approach” [12] geven de schrijvers de volgende omschrijving van een agent: “Een agent kan beschouwd worden als iets dat zijn omgeving in de gaten kan houden door middel van sensoren en daarop kan reageren met behulp van actuatoren.” Een mens kun je in principe dus ook beschouwen als een agent. Deze bevindt zich alleen in een andere werkomgeving. De omgeving van een mens is namelijk de werkelijke wereld waarin hij dingen waarneemt met behulp van sensoren (ogen, oren, neus enz.) en daarop reageert met behulp van actuatoren (handen, voeten enz.). Een software agent werkt in de omgeving van computerprogramma en een netwerk (inclusief het internet). De sensoren zijn het binnenkomend dataverkeer en data uit het geheugen, de actuatoren bestaan uit de mogelijkheid om data aan te passen in het geheugen en het verzenden van data over het netwerk. In principe komen overal agenten voor: deze zullen in iedere huiskamer terug komen. Er zijn namelijk vele apparaten te bedenken die aan de hand van sensoren via hun actuatoren hierop reageren. Zoeken en intelligentie Intelligentie is vaak een kwestie van zoeken binnen een bepaald model van een probleem. Voor mensen is dit een mentaal model van het probleem terwijl dit in computers een computermodel is. Daarnaast pakken computers dit in veel gevallen anders aan dan mensen. Mensen zijn in staat zelf een model van een probleem te vormen en te ontdekken welke acties invloed hebben op dat specifieke probleem. De kwaliteit van mensen ligt in het ontdekken van verbanden en deze te gebruiken om nieuwe problemen op te lossen. Computers zijn echter niet in staat om verbanden te leggen. De kracht van een computer ligt in het feit dat hij erg veel berekeningen veel sneller kan uitvoeren dan een mens ooit zou kunnen. Als er een goed model voor handen is, inclusief alle mogelijke acties en hun gevolgen zijn computers in staat om erg snel te zoeken. Dit zoeken gebeurt op meerdere manieren en er zijn in de loop der tijd ontelbare zoekalgoritmen bedacht. Veel problemen kunnen ingedeeld worden in verschillende toestanden. Vanuit zo’n toestand leidt een bepaalde actie tot de volgende toestand. Het is mogelijk voor een computer een complete zoekboom uit te vouwen en elke
9
toestand in die boom te vergelijken met de gewenste toestand om zo uiteindelijk de gewenste toestand te vinden. Vaak blijkt dit niet de meest efficiënte manier om tot een oplossing te komen. Dit blijkt sneller te gaan wanneer een heuristische functie voorhanden is. Een heuristische functie is een functie die een indicatie geeft van de afstand van de huidige situatie tot de uiteindelijke oplossing. Een manier om tot een ideale instelling voor een klimaatinstallatie te komen is een zoekboom uitvouwen. Er komt dan op elk niveau binnen die zoekboom alle mogelijke instellingen voor één bepaalde installatie te staan. Dit zou tot een gigantische zoekboom leiden, omdat er vele verschillende instellingen in een gebouw kunnen zijn. Het zoeken in zo’n grote boom zou versneld kunnen worden door gebruik te maken van een heuristische functie. Maar omdat het berekenen van één zo’n heuristische functie over een heel gebouw over een bepaalde tijdsperiode erg zwaar zou worden is dit niet de goede wijze om snel tot een goede oplossing te komen. Er is ook een andere zoekmethode gevonden die op een andere manier werkt dan de hierboven beschreven methode: de Newton-Raphson methode. Wanneer deze methode gebruikt wordt voor een klimaatinstallatie dan werkt deze als volgt: alle installatie-instellingen worden als variabelen in een matrix gezet. Hierna wordt bepaald wat de invloed van de verandering van een bepaalde instelling voor invloed heeft op de oplossing. Zo wordt voor iedere variabele naar een optimum gezocht, totdat alle variabelen hun optimum hebben bereikt. Dit blijkt een efficiënte manier om voor een groot ingewikkeld systeem als een klimaatinstallatie snel tot een oplossing te komen. De intelligentie van intelligente agenten Er wordt continu over ‘intelligente agenten’ gesproken, maar wat wordt hieronder verstaan? Als men van buitenaf kijkt naar agenten lijkt hun gedrag vaak intelligent maar als er gekeken wordt naar de interne werking is er geen enkele reden om agenten intelligent te noemen. Zeker niet wanneer ze vergeleken worden met mensen. Intelligente agenten zijn in staat om dynamische problemen op te lossen die binnen hun model passen of binnen hun regelset beschreven zijn. Vaak lossen ze deze problemen sneller en beter op dan mensen dit zouden kunnen. Maar wanneer er zich een probleem voordoet dat buiten het model of regelset valt, is de agent niet meer in staat het probleem op te lossen. Dat is precies de grens waarop de rationaliteit van de agenten ophoudt en de intelligentie van mensen verder gaat. Coöperatieve en concurrerende agenten Een omgeving waarin meerdere agenten werkzaam zijn wordt ook wel een multiagent omgeving genoemd. In zo’n omgeving is het van belang hoe de verschillende agenten met elkaar omgaan en informatie uitwisselen. Hierin wordt onderscheid gemaakt tussen coöperatieve en concurrerende agenten. Concurrerende agenten zijn agenten die ieder een eigen missie hebben en deze ook nastreven. Wanneer deze een gezamenlijk doel hebben worden ze coöperatief genoemd.
10
Agent, de vervolgstap van object Een software agent is het logische gevolg van de evolutie van computerprogramma’s Conventionele computerprogramma’s bestaan uit computeropdrachten / commando’s die veelal chronologisch uitgevoerd worden. Hierna werden programma’s opgedeeld in objecten: een object is een zelfstandig stuk code met in- en uitgangen. Hoe het vanbinnen werkt is niet van belang: er wordt iets ingestopt, het doet iets en/of er komt weer iets uit. Hierbij is van belang dat een object niets doet zolang er geen input is. De volgende stap is de agent. Een agent heeft een opdracht, een missie. Een agent wordt niet geactiveerd door een toetsaanslag. Hij kan er wel op reageren, maar heeft het niet nodig om te functioneren. Agenten hebben vaak een eenvoudige werking, maar doordat er veel samenwerken kunnen ze samen toch tot grote prestaties komen. Doordat ze met zoveel tegelijk samenwerken, lijkt het net één grote efficiënte machine. Eigenshappen van een agent Agenten kunnen vele eigenschappen hebben die niet in alle situaties even interessant zijn. De volgende lijst bestaat uit eigenschappen die aan agenten kunnen worden toegekend. De lijst is afkomstig uit het artikel ‘Introduction to software agents’ van Jeff BradShaw [8]: 1. Mobiel – agenten kunnen zich verplaatsen naar daar waar zij nodig zijn, mogelijk een route volgend. 2. Reactief – agenten kunnen “real-time” gebeurtenissen opmerken en daarop anticiperen 3. Sociaal – agenten werken samen in gemeenschappen om gemeenschappelijke doelen te bereiken 4. Coöperatief – agenten coördineren en overleggen om gemeenschappelijke doelen te bereiken. Ze zijn zelforganiserend en kunnen delegeren. 5. Adaptief – agenten passen zich dynamisch aan, aan hun omgeving. Ze passen zich aan, aan onzekerheid en verandering. 6. Autonoom – agenten zijn pro-actief, doelgericht en voeren hun taken uit voor de gebruiker zonder noodzakelijke initiatie, confirmatie of notificatie van de gebruiker. 7. Interactief – agenten hebben interactie met mensen, andere agenten en informatiebronnen. 8. Persoonlijkheid – agenten laten karaktertrekken zijn zoals emoties. Vaak is met een beperkt aantal van die eigenschappen voor een agent al het gewenste eindresultaat te bereiken. Vier typen agenten Behalve op basis van eigenschappen is het ook mogelijk agenten in te delen op de manier waarop zij intern functioneren. Want er is met verschillende interne werkingen tot een agent te komen die vanaf de buitenkant ‘intelligent’ lijkt te functioneren. Reflex agent Dit is de eenvoudigste vorm om tot een agent te komen en zit ook erg eenvoudig in elkaar; hij heeft sensoren om zijn omgeving in de gaten te houden en een set regels. 11
De regels zijn voor iedere situatie apart beschreven en zijn van de vorm: als dit gebeurt dan doe ik dat. Dit maakt deze agent vooral geschikt voor beperkte taken. Model-based agent Een model-based agent heeft een intern model van zijn omgeving en past dit model aan met behulp van signalen van sensoren uit de omgeving. In het model kan de agent de gevolgen van bepaalde acties bekijken om zo tot de beste actie te komen. Een model-based agent kan in meerdere typen agenten worden gebruikt zoals een reflex of goal-based agent. Goal-based agent Een goal-based agent heeft een of meerdere doelen voor ogen en gebruikt zijn mogelijke acties zo goed mogelijk om die acties te bereiken. De agent heeft vaak meerdere plannen om een doel te bereiken en gaat daarmee een stap verder dan een reflex of model-based reflex agent. Een goal-based agent neemt namelijk ook de factor tijd mee in zijn redenatie waardor hij beter geschikt is om complexere problemen op te lossen. Utility-based agent Ook deze agent houdt rekening met de tijd maar heeft geen doel voor zichzelf gesteld. De utility-based agent verbindt aan iedere toestand waarin zijn omgeving kan verkeren een zekere utiliteit. Omdat het voor een computer moeilijk is in te schatten wat de utiliteit is wordt deze met een bepaalde utiliteitsfunctie berekend. De agent probeert altijd een zo hoog mogelijke utiliteit te bereiken wat de meest ideale toestand voor een gebruiker zou moeten zijn. De implementatie van een agentsysteem Hoewel het concept agent ‘nieuw’ is kan het gewenste effect van een agent bereikt worden met de ‘ouderwetse’, objectgeoriënteerde manier van programmeren. Dit geldt niet voor agenten die moeten functioneren binnen een ‘agent execution environment’. Deze zijn van een ander type dan de standaard besproken agenten. Als we kijken naar de toepassing van een agent in een gebouw beheer systeem dan is een op utiliteit gebaseerde marktagent vooralsnog de meest logische keus. De mogelijkheden voor het implementeren van een agentsysteem als agentsysteem binnen een gebouwbeheersysteem (GBS) wordt sterkt beperkt door: 1. De omvang en de vorm van de omgeving, het gebouw, waarbinnen de agenten moeten functioneren erg precies vastligt en als model meegegeven kan worden. 2. Er vaak niet meer dan een computer beschikbaar is waarop het GBS uitgevoerd wordt en agenten niet de mogelijkheid hebben om zich over meerdere systemen te verplaatsten. 3. Binnen een GBS alle agenten hetzelfde algoritme gebruiken om tot een utiliteit te komen en daardoor bij voorbaat de uitkomst van een markt berekend kan worden. De grootste voordelen van agenten zoals aglets (een aglet is een mobiele vorm van een agent net als je JAVA applets en normale JAVA programma’s hebt) liggen bij toepassingen binnen grote netwerken. Binnen een GBS is sprake van een LONnetwerk wat niet als groot wordt beschouwd. Daarnaast is dit alleen voor het GBS aangelegd waardoor er geen zware netwerkbelastingen zullen voorkomen en het een bedrijfszeker netwerk vormt.
12
Hoofdstuk 4 Ontwerp systeem 4.1 Het ontstaan van het systeem Om het huur-verhuur systeem van de Verrijzeniskapel geheel te automatiseren moet er een intelligent systeem ontwikkeld worden. Met behulp van dit systeem moeten verschillende gebruikers, met ieder hun eigen wensen en mogelijkheden, in kunnen loggen en vervolgens zaken kunnen regelen die voor hen van toepassing zijn. Op deze manier wordt het mogelijk om werk uit handen te nemen van de hoofdhuurder. Het systeem bestaat uit verschillende onderdelen die onderlinge relaties hebben met elkaar. Die verschillende onderdelen zijn: de gebruikers, de agenten, de databases, de sensoren en de actoren. In het kort worden de belangrijkste functies van iedere gebruiker, agent, database, sensor en actor uitgelegd. De gebruikers kunnen onderverdeeld worden in: • Gemeente De gemeente controleert of er voldaan wordt aan de strenge eisen die gesteld zijn aan dit monumentale gebouw. • Hoofdhuurder De hoofdhuurder houdt de rekeningen, contracten en reserveringen van de onderhuurders bij en kan ze indien nodig aanpassen. • Huurders De huurders kunnen een zaal huren in het gebouw. • Kandidaat huurder Een kandidaat huurder kan een aanvraag indienen om één van de huurders te worden. • Eenmalige huurder Een eenmalige huurder kan eenmalig een zaal huren in het gebouw. • Beveiliging De beveiliging kan de aanwezigheid controleren en het alarm resetten. • Maintenance De maintenance omvat de catering, de schoonmaak en het onderhoud. De agenten kunnen onderverdeeld worden in: • Aanwezigheid De agent aanwezigheid zorgt ervoor dat de gebruikers die gereserveerd hebben de juiste ruimtes kunnen betreden. • Kosten De agent kosten berekent de kosten per gebruiker. • Ketel aansturing De agent ketel aansturing zorgt ervoor dat de ruimtes op tijd op temperatuur zijn. • Onderhoud De agent onderhoud houdt de catering, de schoonmaak en het onderhoud bij. De databases kunnen onderverdeeld worden in: • Kosten Hierin staan de rekeningen per gebruiker. • Toegang Hierin staat welke gebruiker toegang heeft tot welke ruimte in het gebouw. • Aanwezigheid Hierin staan de reserveringen van de verschillende gebruikers. • Gebruikersprofiel
13
• • • • •
Hierin staan de gewenste ruimtetemperaturen van de gebruiker en adresgegevens. Huurcontracten Hierin staan de contractgegevens van de verschillende gebruikers. Onderhoud Hierin staan de gegevens die betrekking hebben op onderhoud. Schoonmaak Hierin staan de gegevens die betrekking hebben op schoonmaak. Voorraad Hierin staan de voorraadgegevens van de catering. Ketel gegevens Hierin staan alle geregistreerde gegevens van de ketel.
De sensoren kunnen onderverdeeld worden in: • Aanwezigheid Deze sensor registreert de aanwezigheid in ruimtes bijvoorbeeld met behulp van bewegingssensoren. • Energieverbruik Deze sensor registreert het energieverbruik van de ketel en alle installaties in het gebouw. • Sloten Deze sensor registreert of een deur of raam open of dicht is. • Buitentemperatuur Deze sensor registreert de temperatuur buiten het gebouw. • Binnentemperatuur Deze sensor registreert de temperatuur in het gebouw. • Voorraad Deze sensor registreert de voorraden van de catering. • Ketel sensoren Deze sensoren registreren de ketelwatertemperaturen, de ketelbelasting en een eventuele error. De actoren kunnen onderverdeeld worden in: • Catering Deze actor geeft een seintje aan het cateringbedrijf als de voorraad onder een bepaalde waarde komt. • Schoonmaakbedrijf Deze actor waarschuwt het schoonmaakbedrijf als het gebouw schoongemaakt dient te worden. • Ketel Deze actor stuurt de ketel aan als een ruimte verwarmd moet worden. • Licht Deze actor zet het licht in de desbetreffende ruimte aan. • Alarm Deze actor schakelt het alarm in als er in het gebouw ingebroken wordt. • Sloten Deze actor opent het slot van een deur als de daarvoor benodigde pas erdoorheen is gehaald. • Maintenance Deze actor waarschuwt een monteursbedrijf als er iets niet in orde is of ter controle. In onderstaand figuur 4.1 staat afgebeeld wat de bevoegdheden van de verschillende gebruikers is en de verschillende soorten databases, sensoren en actoren. 14
Figuur 4.1: Een diagram met alle (mogelijke) eigenschappen van het systeem
15
Nu moet bepaald worden wat de onderlinge relaties zijn tussen de sensoren, de agenten en de databases. Dit geheel zal in een UML-diagram gezet worden.
Figuur 4.2: Het UML-diagram van het systeem (voor vergrote afbeelding, zie bijlage 1)
De richting van de pijlen maakt duidelijk in welke richting de informatie gaat. De agenten kunnen dus informatie halen uit de sensoren en vervolgens aan de hand van de gegevens in de databases de actoren aansturen. In bepaalde databases kunnen de agenten ook informatie wegschrijven. De gebruikers kunnen in het systeem inloggen via de interface. Na het inloggen kan, afhankelijk van welke bevoegdheden de gebruiker heeft, informatie gehaald worden uit en weggeschreven worden in verschillende databases. Voor het programmeren van een dergelijk systeem zullen de agenten moeten worden omgevormd tot classes met ieder hun eigen variabelen en methodes. Ook zal er één grote database moeten komen waar de verschillende classes de benodigde informatie uit kunnen halen en waar de gebruikers via een interface bij kunnen.
16
Figuur 4.3: Het UML-diagram van het systeem met de verschillende agenten uitgewerkt (voor vergrote afbeelding zie bijlage 2.
4.2 Agenten De agenten kunnen dus informatie halen uit de sensoren, data wegschrijven in de database en actoren aansturen. In totaal zijn 4 agenten bedacht die samen voor een goed werkend geautomatiseerd systeem moeten zorgen. Iedere agent heeft een andere taak in het systeem en een enkele keer is samenwerking tussen 2 agenten noodzakelijk. Hieronder volgt een beschrijving van de verschillende agenten. Agent Aanwezigheid: De agent Aanwezigheid verkrijgt informatie van de sensoren Aanwezigheid en Sloten. Met behulp van deze 2 sensoren bepaalt deze agent of er daadwerkelijk iemand in het gebouw aanwezig is. Vervolgens kan uit de database Toegang gehaald worden of deze persoon geoorloofd is om op dat tijdstip in het gebouw aanwezig te zijn. Als dit het geval is, wordt de actor Licht aangezet en aan de actor Sloten wordt, aan de hand van welke gebruiker in het gebouw is, doorgegeven welke sloten opengemaakt kunnen worden door deze gebruiker. Ook wordt in de database Aanwezigheid weggeschreven welke gebruiker op welk tijdstip in het gebouw aanwezig is geweest. Maar het kan ook zo zijn dat een persoon in het gebouw aanwezig is, maar niet geoorloofd is om aanwezig te zijn. In dit geval zal de actor Alarm aangezet worden en zal de beveiliging gewaarschuwd worden. Agent Kosten: De agent Kosten verkrijgt informatie van de sensor Energieverbruik. Met deze informatie kunnen de kosten berekend worden van het energieverbruik van het licht en de verwarming in het gebouw per gebruiker. Uit de database Voorraad kan gehaald worden hoeveel de consumptie bedraagt van een bepaalde gebruiker. Tot slot kan uit de database Aanwezigheid gelezen worden op welke tijdstippen een bepaalde gebruiker een ruimte in het gebouw gehuurd heeft. Met deze informatie kan berekend worden wat de totale kosten per gebruiker zijn voor energieverbruik, catering en reserveringen.
17
Agent Ketelaansturing: De agent Ketelaansturing verkrijgt informatie van de sensoren Buitentemperatuur, Binnentemperatuur en Ketelsensoren. Met behulp van de 2 eerstgenoemde sensoren kan bepaald worden wat de opwarmstrategie gaat worden. De sensor Ketelsensoren geeft door wat de status van de ketel is. Met behulp van de databases Aanwezigheid en Gebruikersprofiel wordt bepaald wanneer de actor Ketel aangestuurd moet worden. Alle gegevens die door de ketel geregistreerd zijn, worden in de database Ketelgegevens opgeslagen en deze kunnen ook weer opgevraagd worden. Tot slot heeft deze agent een link met de agent Onderhoud. Deze agenten kunnen informatie met elkaar uitwisselen om het onderhoud van de ketel goed in de gaten te houden. Agent Onderhoud: De agent Onderhoud verkrijgt informatie van de sensor Voorraad. Met deze sensor kan bijgehouden worden hoeveel geconsumeerd is door een gebruiker. Deze informatie wordt vervolgens weggeschreven in de database Voorraad en wanneer de voorraad te klein wordt, wordt de actor Catering aangestuurd die op zijn beurt het cateringbedrijf een seintje geeft. Wanneer uit de database Onderhoud blijkt dat het weer tijd is voor controle aan de ketel of de agent Ketelaansturing aangeeft dat er iets mis is met de ketel, zal de actor Maintenance aangestuurd worden die het monteursbedrijf waarschuwt. In het geval dat er een direct seintje komt vanaf de agent Ketelaansturing, zal de meest recente informatie uit de database Ketelgegevens gehaald worden zodat de monteur weet waar de fout gezocht moet worden. Als uit de database Schoonmaak blijkt dat het gebouw schoongemaakt moet worden, zal de actor Schoonmaak aangestuurd worden die het schoonmaakbedrijf een seintje geeft. Vervolgens zal na de schoonmaak in dezelfde database Schoonmaak weggeschreven worden wanneer de schoonmaak heeft plaatsgevonden.
4.3 Scenario’s Nu het systeem ontworpen is, kan getest worden of het systeem aan de gestelde eisen voldoet. Voordat er veel werk gestoken wordt in het programmeren ervan, moet met een grote mate van zekerheid gezegd kunnen worden dat het systeem goed gaat werken zoals het ontworpen is. Om het systeem aan een test te onderwerpen is er een aantal scenario’s uitgevoerd. In opeenvolgende stappen wordt uitgelegd welke pulsen het systeem krijgt en hoe het daarop moet reageren. Scenario 1; een kandidaat huurder wil een ruimte huren Een van de belangrijkste eisen van de gemeente is dat kandidaat huurders zich aan kunnen melden en ze een ruimte kunnen reserveren. Hieronder is dit eerste scenario schematisch weergegeven: Allereerst vraagt een kandidaat huurder om toegang te krijgen tot het systeem. Dit verzoek gaat via de interface naar de hoofdhuurder, die op zijn beurt moet bepalen of de nieuwe gebruiker toegelaten mag worden. Er wordt vanuit gegaan dat dit geen probleem is en de kandidaat huurder krijgt toegang tot het systeem. Voordat deze enige ruimte mag reserveren is het voor de goede verstandhouding noodzakelijk de contractvorming rond te krijgen. Deze stappen gaan allemaal via de interface, er komt geen agent aan te pas.
18
Figuur 4.4: Stap 1 in het UML-diagram voor scenario 1
Nu de kandidaat huurder toestemming heeft gekregen tot het systeem, mag deze volwaardig huurder genoemd worden. Het systeem heeft hem echter nog niet erkend. Daarom moeten alle gegevens zoals inlogcode, wachtwoord, naam, telefoonnummer, comforteisen en dergelijke ingevoerd worden die in de database gebruikersprofiel opgeslagen zullen worden.
Figuur 4.4 Stap 2 in het UML-diagram voor scenario 1
De huurder heeft nu alle mogelijkheden om zelf een reservering vast te leggen in de agenda, wat in de database aanwezigheid opgeslagen wordt. Hiervoor kan de huurder opvragen wanneer de ruimtes nog niet gereserveerd zijn, ofwel een verzoek tot reserveren indienen. Als het gewenste huurtijdstip niet samenvalt met een andere reservering kan de reservering compleet gemaakt worden. Het systeem slaat dan op wanneer deze gebruiker langskomt.
19
Figuur 4.5: Stap 3 in het UML-diagram voor scenario 1
Het gebruik van de ruimte is even eenvoudig als het reserveren ervan. De huurder komt het gebouw in met een digitale sleutel en zal met een code het alarm moeten deactiveren. De ruimte is op de gewenste temperatuur als de huurder de zaal betreedt, waar de agent ketel zorg voor heeft gedragen. Deze is geprogrammeerd zodat de ruimte op het juiste moment op temperatuur is en er zo energiebewust mogelijk wordt gestookt. Huurder
Interface
Hoofdhuurder Aanwezigheid - Kijkt 24 uur vooruit in agenda - Bepaalt opwarmstrategie per ruimte - Stuurt op juiste moment: - Ketel status - Te verwarmen ruimte - Ketelwater temperatuur
-Alarm : bool +Controle_slot() +Controle_alarm()
Aanwezigheid
Kosten
Sloten
Databanken:
-Kosten : double +Bereken_energie() +Bereken_consumpties() +Bereken_huur() +Bereken_maandtotaal()
Energieverbruik
Huurcontracten Toegang Voorraad Kosten
Buitentemperatuur
Ketel -error : bool
Ontvangt gegevens
Vraagt aanwezigheid & gebruikersprofiel op Slaat gegevens op
+Registreer gegevens() +Error_melding() +Ketelaansturing()
Binnentemperatuur
Aanwezigheid Gebruikersprofiel Ketelgegevens Onderhoud Schoonmaak
Onderhoud Ketelsensoren
-schoon -voorraad -ketel -onderhoud +Controleren() +Consumptie()
Voorraad
Licht
Alarm
Sloten
Ketel
Catering
Schoonmaak
Maintainance
Figuur 4.6: Stap 4 in het UML-diagram voor scenario 1
Gemaakte kosten door energieverbruik en genuttigde consumpties worden opgeslagen in de database kosten. Deze worden bijgehouden door de agent kosten die ze verrekent en aan het eind van de maand bij elkaar optelt. De huurders krijgen bericht wat hun verschuldigd bedrag is en dit moeten ze overmaken of wordt afgeschreven. De agent houdt in de gaten of de betalingen gedaan zijn en waakt dus als een penningmeester over de financiën.
20
Scenario 2; de ketel geeft een error Het is een scenario dat voorkomen dient te worden, maar als het gebeurt moet het snel verholpen worden: een storing in de ketel. Dit signaal komt van de ketelsensoren en zet de boolean 'error' in de agent ketel op positief. De agent geeft deze error door aan de agent onderhoud en schrijft de error in de databank ketelgegevens. De error is dus geregistreerd en vastgelegd. In de database staat ook het nummer van de errormelding opgeslagen, zodat teruggevonden kan worden wat er aan de hand is met de ketel. Gebruikers
Interface
Aanwezigheid -Alarm : bool +Controle_slot() +Controle_alarm()
Aanwezigheid
Kosten
Sloten
Databanken:
-Kosten : double +Bereken_energie() +Bereken_consumpties() +Bereken_huur() +Bereken_maandtotaal()
Energieverbruik
Huurcontracten Toegang Voorraad Kosten
Buitentemperatuur
Ketel
2. Schrijft error in ketelgegevens
-error : bool
Binnentemperatuur
Gebruikersprofiel
+Registreer gegevens() +Error_melding() +Ketelaansturing()
1. Ketel error
Ketelgegevens
2. Geeft error door
Onderhoud Schoonmaak
Onderhoud Ketelsensoren
Aanwezigheid
-schoon -voorraad -ketel -onderhoud +Controleren() +Consumptie()
Voorraad
Licht
Alarm
Sloten
Ketel
Catering
Schoonmaak
Maintainance
Figuur 4.7: Stap 1 in het UML-diragram voor scenario 2
De agent onderhoud bekijkt wat er aan de hand is en geeft dit door aan de servicemonteur. Deze kan op zijn beurt als gebruiker inloggen in het systeem. Hij vraagt de ketelgegevens op uit de databank ketel en ziet via de interface wat er aan de hand is. Afhankelijk van de complicaties kan de monteur beslissen om het probleem op afstand op te lossen of ter plaatse.
Figuur 4.8 Stap 2 in het UML-diagram voor scenario 2
21
Hoofdstuk 5 De ketelagent Nadat het intelligente systeem ontworpen was, is er gekeken naar de mogelijkheid om het systeem in de werkelijkheid te kunnen implementeren in een digitale omgeving. Omdat het veel werk is om het gehele systeem te programmeren is dit doel bijgesteld tot het programmeren van de ketelagent. Door dit deel te combineren met het project van een andere projectgroep die bezig is geweest met de ketelaansturing van een werkelijke ketel, zou dit geheel een goed demo-model vormen. Jammer genoeg is dit niet mogelijk geweest waardoor de situatie nogal veranderd is. Door de kleine mogelijkheden is de focus bij het programmeren veranderd. Daarom is er een doel gesteld waaraan de ketelagent zou moeten voldoen. De ketelagent zou nu namelijk niet alleen een kaal stuk software moeten worden dat de ketel zou regelen. Maar er moet nu ook een visueel stuk aan worden gekoppeld waarop de signalen naar de ketel en regelcomponenten kenbaar worden gemaakt. Daarnaast zijn er ook geen input signalen beschikbaar (zoals de ruimte temperatuur) waardoor er ook een model van de ruimte in de programmatuur moest worden aangebracht.
5.1 Programmeren agent ketelaansturing Nadat er een duidelijk doel was gesteld, is er begonnen met het programmeren van de software. Er is eerst gekeken naar de mogelijkheid om gebruik te maken van verschillende agent platforms. Deze breiden de standaard commando’s van JAVA uit waardoor het makkelijker wordt om een agent te programmeren. Er is besloten deze platforms niet te gebruiken omdat de huidige JAVA taal genoeg mogelijkheden biedt om de eerder gedefinieerde agenten te programmeren. Daarnaast zou het leren kennen van de nieuwe mogelijkheden van de platforms meer tijd kosten dan het programmeren van de extra commando’s die nodig zijn om hetzelfde resultaat te bereiken. De taken die overgenomen zijn uit het ontwerp van de agent zijn: o Het lezen van de reserveringen o Het lezen van de gebruikersprofielen o Het koppelen van de reserveringen met de gewenste temperaturen o Het aan / uit schakelen van de ketel o Het regelen van de ketel zodat de ruimtes op tijd op de gewenste temperatuur zijn o Het regelen van de ketel zodat de ruimtes op de juiste temperatuur blijven o Het regelen van de kleppen zodat de juiste ruimte wordt verwarmd De programmacode’s van de agent zijn terug te vinden in de bijlage’s 3, 4 en 5. De regeling van de ketel is erg simpel gehouden. Dit houdt in dat er alleen een aan / uit regeling is gemaakt omdat de regelparameters voor het bepalen van de ketelwatertemperatuur niet bekend waren. Daarnaast zijn er voor het verwarmen van de verschillende ruimtes 2 kleppen opgenomen in het model die ook een open/dicht regeling hebben. Het lezen uit werkelijke databases is vervangen door het lezen uit verschillende *.txt bestanden. Hier is een database reserveringen gemaakt en een database met de verschillende gebruikersprofielen. De agent is zo gemaakt dat het de eerstvolgende reservering opzoekt en bekijkt hoe lang dit nog duurt (iedere minuut). Doordat de opwarming van de ruimtes is vastgesteld op 2 oC per uur bepaalt de agent zelf wanneer hij moet gaan verwarmen.
22
Zodra de ruimte verhuurd is, wordt ervoor gezorgd dat de temperatuur op peil blijft en zodra de ruimte niet meer verhuurd wordt, start het proces opnieuw. Als blijkt dat het nog erg lang duurt voordat de ruimte weer wordt gehuurd, gaat de regelklep van de toevoer dicht en is er ingesteld dat de ruimte met 1oC per afkoelt. Dit geheel is te zien in een outputscherm in JAVA (fig. 5.1):
Figuur 5.1: Het outputscherm van de agent
Rechts in het figuur zijn de zogenaamde database files te zien waaruit het programma leest. Links onderin is het uitvoerscherm te zien waarop de verschillende statussen van de ketel, regelapparatuur en de ruimtetemperaturen te zien zijn. In figuur 5.2 is een uitvoerscherm te zien waarop een grafiek met de ruimte temperaturen af te lezen zijn. Jammer genoeg is het te complex om een goede grafiek te krijgen via JAVA programmeertaal waardoor de grafieken via een andere weg (uitvoeren naar een *.txt bestand en openen in Matlab) zal worden opgeroepen.
Figuur 5.2: Het uitvoerscherm met daarop een de gesimuleerde ruimte temperaturen
23
5.2 Testen agent Om te controleren dat de agent naar behoren functioneert, is er een scenario (niet realistisch maar puur om een goede indruk te krijgen hoe de agent reageert) in de databases gezet zodat dit te controleren is. Het eerste scenario is in de tabellen hieronder weergegeven: Table 5.1: reserveringen.txt Uur 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
Ruimte 1 0 5 0 4 4 4 0 0 0 5 0 0 0 0 1 1 1 0 0 0 1 1 1 5
Ruimte 2 0 0 0 0 0 0 0 0 3 2 2 0 0 0 4 4 4 0 0 0 1 1 1 5
Table 5.2: Gebruikersprofiel.txt Gebruiker 0 1 2 3 4 5 6
Gewenste temp o Niet verh. 15 C o 18 C o 20 C o 19 C o 22 C o 19 C o 20 C
Door de agent voor deze dag te laten lopen en de output van de ketel op te slaan in een apart bestand zijn er goede grafieken verkregen in Matlab van de reacties van de agent. Deze zijn te zien in figuur 5.3 en 5.4.
Figuur 5.3: De ruimte temperatuur in ruimte 1 gerealiseerd door de agent
24
Figuur 5.4: De ruimte temperatuur in ruimte 2 gerealiseerd door de agent
Te zien is dat in beide gevallen de ketelagent naar de gewenste temperatuur op het gewenste tijdstip regelt. Op de momenten dat er geen gebruikers zijn, laat de agent de temperatuur terugzakken tot 15 OC waarna hij deze op die temperatuur houdt. Als we kijken naar de tijden waarop de temperatuur constant moet worden gehouden, is er wel een probleem. Goed te zien is namelijk dat de lijn daar een stuk dikker is dan op andere tijdstippen. Dit komt omdat de temperatuur dan schommelt rond de gewenste temperatuur. Doordat de marge zo klein is ingesteld, staan de kleppen en de ketel te pendelen om de temperatuur net rond de gewenste temperatuur te houden. Als er nu gewerkt zou worden met een ketelwater temperatuur, zou deze kunnen worden teruggeregeld waardoor een stationaire situatie zou worden bereikt.Maar omdat de beperking van deze agent resulteert in een aan/uit regeling kan dit niet worden bereikt met deze agent. Verder is te concluderen dat de agent naar behoren functioneert. Maar voordat deze zou worden toegepast in een reëel agent systeem moet deze worden uitgebreid met input van sensoren en een ketelwatertemperatuur regeling.
25
Literatuurlijst 1
C.J.Warmer, I.G.Kamphuis. De C-BOX: een geïntegreerde binnenklimaatregeling gebruik makend van een ICT-netwerk. Architectuur en analyse van realisatiemogelijkheden binnen woningen. 7-2006. ECN.
2
Dubytska N. Het flexibel beheersen en gebruiken van een gebouw me meerdere gebruikers. 8-11-2006. Eindhoven, TU eindhoven.
3
E.Mertens, M.vd Heijden, B.Tuip, R.Loonen, J.Leenders. Flexibel beheer en conditionering van gebouwen met meerdere gebruikers. 1-2006. Eindhoven, TU eindhoven.
4
Ghinwa Jalloul. Uml by Example. 2004. Lebanon, Cambridge university press.
5
Hanneke van Schijndel, Jeroen Verwer, Jessica Verdonschot. Think outside the box. 3-2005. Eindhoven, TU eindhoven.
6
Ing.G.A.Jansen, H.M.A.Jansen-Groesbeek. Gebouwautomatisering. Prof.ir.W.Zeiler. 2005.
7
J.R.Balvers, G.J.A.Filippini. De B-box. Een flexibel domoticaproduct. 4-3-2005. Eindhoven, TU eindhoven.
8
Jeffrey Bradshaw. An introduction to software agents. 1-1997.
9
L.Pennings, S.ter Mors, J.Houben, P.Wijnhoven, M.Niesen. 11-2006. Eindhoven, TU eindhoven.
10
M.Keus, Ir.A.Pennings, Ir.I.Van Kessel. Telematica. Het raamwerk, de juiste bus. 12-2002. Eindhoven, TU eindhoven.
11
Maarten Hommelberg. Careful Building. Software agents voor een gebouwbeheersysteem. 2005. Eindhoven.
12
S.Russel, P.Noverig. Artificial intelligence a modern approach. 1-2002.
13
Sara Morgan Rea. Building intellegent .NET applications. Agents, Data minning, Rule-based systems, and Speech processing. 2005. Crawfordsville, Addison-Wesley.
14
Walter Savitch. JAVA an introduction to computer science en programming second edition. 1-2001.
26
Bijlage 1: UML-diagram van het systeem
Computer grens Interface
Gebruikers
Databases Sensoren
Huurcontracten Aanwezigheid Toegang
Aanwezigheid
Kosten Sloten Kosten Voorraad Energieverbruik Aanwezigheid Buiten temperatuur Ketel aansturing
Gebruikersprofiel
Binnen temperatuur Ketel gegevens Ketel sensoren
Onderhoud Onderhoud
Voorraad Schoonmaak
Licht
Alarm
Sloten
Ketel
Actoren
Catering
Schoonmaak
Maintainance
Bijlage 2: UML-diagram van het systeem met uitgewerkte agenten
Gebruikers
Interface
Aanwezigheid -Alarm : bool +Controle_slot() +Controle_alarm()
Aanwezigheid
Kosten
Sloten
Databanken:
-Kosten : double +Bereken_energie() +Bereken_consumpties() +Bereken_huur() +Bereken_maandtotaal()
Energieverbruik
Huurcontracten Toegang Voorraad Kosten
Buitentemperatuur
Ketel
Aanwezigheid
-error : bool Gebruikersprofiel
+Registreer gegevens() +Error_melding() +Ketelaansturing()
Binnentemperatuur
Ketelgegevens Onderhoud Schoonmaak
Onderhoud Ketelsensoren
-schoon -voorraad -ketel -onderhoud +Controleren() +Consumptie()
Voorraad
Licht
Alarm
Sloten
Ketel
Catering
Schoonmaak
Maintainance
Bijlage 3 Programmacode ketel-agent import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; public class Reservering extends Thread{ int ruimte1 = 0; int ruimte2 = 0; int tijd1; int tijdm1; int tijd2; int tijdm2; int gtemp1; int gtemp2; float ruimteTemp1=16; float ruimteTemp2=15; boolean ketelst = false; boolean ketelst1 = false; boolean ketelst2 = false; boolean klep1 = false; boolean klep2 = false; int tijdh = 0; int tijdm = 0; static ShowGridLayout5 grid; static File f1; static File f2; static File f3; static File f4; float rTemp1[]= new float[1440]; float rTemp2[]= new float[1440]; int rTempg1[]= new int[1440]; int rTempg2[]= new int[1440]; public static void main(String[] args) { Reservering ketelstatus = new Reservering(); f1 = new File("tempruimte1_.txt"); f2 = new File("tempruimte2_.txt"); f3 = new File("gewtempruimte1_.txt"); f4 = new File("gewtempruimte2_.txt"); ketelstatus.klokken(); ketelstatus.aanmaken(); System.exit(0); } public void opvragen1(){ try{ String s = null; BufferedReader br = new BufferedReader(new FileReader("reservering.txt")); //open bestand for(int x = 0; x
I
public void opvragen2(){ try{ String s = null; BufferedReader br = new BufferedReader(new FileReader("reservering.txt")); //open bestand for(int x = 0; x
opwarmtemp){ ketelst1 = true; klep1 = true; } else{ ketelst1 = false; klep1=false; }
II
} else{ if(ruimteTemp1>gtemp1){ ketelst1 = false; klep1 = false; } else{ ketelst1 = true; klep1 = true; } } //ruimte 2 if (tijd2!=0){ if(ruimteTemp2 < 15){ // ruimte 2 kouder dan 15 graden = opwarmen ketelst2 = true; klep2 = true; } else if((gtemp2-ruimteTemp2)/tijdm2>opwarmtemp){ ketelst2 = true; klep2 = true; } else{ ketelst2 = false; klep2=false; } } else{ if(ruimteTemp2>gtemp2){ ketelst2 = false; klep2 = false; } else{ ketelst2 = true; klep2 = true; } } if(ketelst1 == true || ketelst2 == true){ ketelst = true; } else{ ketelst = false; } if(ketelst == true){ System.out.println("de ketel is actief"); } else{ System.out.println("de ketel is non-actief"); } System.out.println("Ruimte 1 is " + ruimteTemp1 +" graden Celcius"); System.out.println("Ruimte 2 is " + ruimteTemp2 +" graden Celcuis"); if(klep1 == true && klep2 == false){ System.out.println("ruimte 1 wordt verwarmd en ruimte 2 niet"); ruimteTemp1 = ruimteTemp1 +opwarmtemp; ruimteTemp2 = ruimteTemp2 -afkoeltemp; } if(klep2 == true && klep1 == false){ System.out.println("ruimte 2 wordt verwarmd en ruimte 1 niet"); ruimteTemp2 = ruimteTemp2 +opwarmtemp; ruimteTemp1 = ruimteTemp1 -afkoeltemp; } if(klep2 == true && klep1 == true){ System.out.println("ruimte 1 en 2 worden verwarmd"); ruimteTemp1 = ruimteTemp1 +opwarmtemp; ruimteTemp2 = ruimteTemp2 +opwarmtemp; } if(klep2 == false && klep1 == false){ System.out.println("ruimte 1 en 2 worden niet verwarmd"); ruimteTemp1 = ruimteTemp1 -afkoeltemp; ruimteTemp2 = ruimteTemp2 -afkoeltemp; } System.out.println(""); } public void aanmaken(){
III
PrintWriter dos = null; try{ dos = new PrintWriter(new FileOutputStream(f1), true); for(int i=0;i<1440;i++){ dos.write(rTemp1[i] + " "); } } catch(IOException ex){ System.err.println("Something went wrong while writing ruimtetemp1"); } finally{ if (dos != null) dos.close(); } PrintWriter das = null; try{ das = new PrintWriter(new FileOutputStream(f2), true); for(int i=0;i<1440;i++){ das.write(rTemp2[i] + " "); } } catch(IOException ex){ System.err.println("Something went wrong while writing ruimtetemp2"); } finally{ if (das != null) das.close(); } PrintWriter dis = null; try{ dis = new PrintWriter(new FileOutputStream(f3), true); for(int i=0;i<1440;i++){ dis.write(rTempg1[i] + " "); } } catch(IOException ex){ System.err.println("Something went wrong while writing gewruimtetemp1"); } finally{ if (dis != null) dis.close(); } PrintWriter des = null; try{ des = new PrintWriter(new FileOutputStream(f4), true); for(int i=0;i<1440;i++){ des.write(rTempg2[i] + " "); } } catch(IOException ex){ System.err.println("Something went wrong while writing gewruimtetemp2"); } finally{ if (des != null) des.close(); } } public void matrix(){ rTemp1[(60*tijdh+tijdm)]=ruimteTemp1; rTemp2[(60*tijdh+tijdm)]=ruimteTemp2; rTempg1[(60*tijdh+tijdm)]=gtemp1; rTempg2[(60*tijdh+tijdm)]=gtemp2; } public void klokken(){ grid = new ShowGridLayout5(); grid.start(); while(tijdh<24){ //Tijd in Uren opvragen1(); opvragen2(); actief(); matrix(); grid.frame.text1.setText(String.valueOf(ruimteTemp1)); grid.frame.text2.setText(String.valueOf(ruimteTemp2));
IV
if(ketelst == true){ grid.frame.text3.setText("aan"); } else{ grid.frame.text3.setText("uit"); } if(tijdm<10){ grid.frame.text4.setText(String.valueOf(tijdh)+":0"+String.valueOf(tijdm)); } else{ grid.frame.text4.setText(String.valueOf(tijdh)+":"+String.valueOf(tijdm)); } if(klep1 == true){ grid.frame.text5.setText("open"); } else{ grid.frame.text5.setText("dicht"); } if(klep2 == true){ grid.frame.text6.setText("open"); } else{ grid.frame.text6.setText("dicht"); } grid.frame.text7.setText(String.valueOf(gtemp1)); grid.frame.text8.setText(String.valueOf(gtemp2)); if(tijd1==0){ grid.frame.text9.setText("gereserveerd"); } else if((tijdm1%60)<10){ grid.frame.text9.setText(String.valueOf(tijd11)+":0"+String.valueOf((tijdm1%60))); } else{ grid.frame.text9.setText(String.valueOf(tijd1-1)+":"+String.valueOf((tijdm1%60))); } if(tijd2==0){ grid.frame.text10.setText("gereserveerd"); } else if((tijdm2%60)<10){ grid.frame.text10.setText(String.valueOf(tijd21)+":0"+String.valueOf((tijdm2%60))); } else{ grid.frame.text10.setText(String.valueOf(tijd21)+":"+String.valueOf((tijdm2%60))); } try{ Thread.sleep(500); } catch(InterruptedException e){ System.err.println("Something went wrong with timer"); } // Tijd in Minuten while(tijdm<60){ actief(); matrix(); grid.frame.text1.setText(String.valueOf(ruimteTemp1)); grid.frame.text2.setText(String.valueOf(ruimteTemp2)); if(ketelst == true){ grid.frame.text3.setText("aan"); } else{ grid.frame.text3.setText("uit"); } if(tijdm<10){ grid.frame.text4.setText(String.valueOf(tijdh)+":0"+String.valueOf(tijdm)); } else{ grid.frame.text4.setText(String.valueOf(tijdh)+":"+String.valueOf(tijdm)); } if(klep1 == true){ grid.frame.text5.setText("open");
V
} else{ grid.frame.text5.setText("dicht"); } if(klep2 == true){ grid.frame.text6.setText("open"); } else{ grid.frame.text6.setText("dicht"); } grid.frame.text7.setText(String.valueOf(gtemp1)); grid.frame.text8.setText(String.valueOf(gtemp2)); if(tijd1==0){ grid.frame.text9.setText("gereserveerd"); } else if((tijdm1%60)<10){ grid.frame.text9.setText(String.valueOf(tijd11)+":0"+String.valueOf((tijdm1%60))); } else{ grid.frame.text9.setText(String.valueOf(tijd11)+":"+String.valueOf((tijdm1%60))); } if(tijd2==0){ grid.frame.text10.setText("gereserveerd"); } else if((tijdm2%60)<10){ grid.frame.text10.setText(String.valueOf(tijd21)+":0"+String.valueOf((tijdm2%60))); } else{ grid.frame.text10.setText(String.valueOf(tijd21)+":"+String.valueOf((tijdm2%60))); } try{ Thread.sleep(500); } catch(InterruptedException e){ System.err.println("Something went wrong with timer"); } tijdm++; System.out.println("de tijd op dit moment is " + tijdh+ " uren en "+tijdm+" minuten."); } //Tijd in Uren tijdh++; tijdm=0; } } }
VI
Bijlage 4 Programmacode Grafiek import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.util.*; class Grafiek extends JPanel{ int hoogte1=300; int hoogte2=300; int tijd=0; static Grafiek panel; float temp1[]=new float[1440]; float temp2[]=new float[1440]; int temp3[]=new int[1440]; int temp4[]=new int[1440]; public static void main(String[] args){ panel = new Grafiek(); panel.uitlezen(); JFrame frame = new JFrame("Grafiek"); frame.getContentPane().add(panel); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(1500, 600); frame.setVisible(true); } public void paintComponent(Graphics g){ g.setColor(Color.green); for (int i=0;i<1440;i++){ g.fillOval(i,((int)(701-(20*temp1[i]))),1,1); } // ruimte 2 g.setColor(Color.red); for (int i=0;i<1440;i++){ g.fillOval(i,((int)(700-(20*temp2[i]))),1,1); } g.setColor(Color.blue); for (int i=0;i<1440;i++){ g.fillOval(i,((int)(699-(20*temp3[i]))),1,1); } g.setColor(Color.yellow); for (int i=0;i<1440;i++){ g.fillOval(i,((int)(698-(20*temp4[i]))),1,1); } } public void uitlezen(){ try{ BufferedReader br = new BufferedReader(new FileReader("tempruimte1.txt")); String s1 = null; s1 = br.readLine(); StringTokenizer t1 = new StringTokenizer(s1); // leest teken for(int i=0;i<1440;i++){ temp1[i] = Float.parseFloat(t1.nextToken()); //gebruikersnummer } br.close(); } catch(IOException e){ System.err.println("Something went wrong while reading ruimtetemp1.txt"); } try{ BufferedReader br = new BufferedReader(new FileReader("tempruimte2.txt")); String s2 = null; s2 = br.readLine(); StringTokenizer t2 = new StringTokenizer(s2); // leest teken for(int i=0;i<1440;i++){ temp2[i] = Float.parseFloat(t2.nextToken()); //gebruikersnummer } br.close(); } catch(IOException e){
VII
System.err.println("Something went wrong while reading ruimtetemp2.txt"); } try{ BufferedReader br = new BufferedReader(new FileReader("gewtempruimte1.txt")); String s3 = null; s3 = br.readLine(); StringTokenizer t3 = new StringTokenizer(s3); // leest teken for(int i=0;i<1440;i++){ temp3[i] = Integer.parseInt(t3.nextToken()); //gebruikersnummer } br.close(); } catch(IOException e){ System.err.println("Something went wrong while reading gewruimtetemp1.txt"); } try{ BufferedReader br = new BufferedReader(new FileReader("gewtempruimte2.txt")); String s4 = null; s4 = br.readLine(); StringTokenizer t4 = new StringTokenizer(s4); // leest teken for(int i=0;i<1440;i++){ temp4[i] = Integer.parseInt(t4.nextToken()); //gebruikersnummer } br.close(); } catch(IOException e){ System.err.println("Something went wrong while reading gewruimtetemp2.txt"); } } }
VIII
Bijlage 5 Programmacode Outputscherm import javax.swing.*; import java.awt.*; public class ShowGridLayout5 extends JFrame { private JLabel textLabel; JLabel text1; JLabel text2; JLabel text3; JLabel text4; JLabel text5; JLabel text6; JLabel text7; JLabel text8; JLabel text9; JLabel text10; ShowGridLayout5 frame; public ShowGridLayout5() { Container container = getContentPane(); container.setLayout(new GridLayout(5, 4, 5, 5)); text4 = new JLabel ("0:00"); container.add(text4); textLabel = new JLabel ("ruimte 1"); container.add(textLabel); textLabel = new JLabel ("ruimte 2"); container.add(textLabel); textLabel = new JLabel ("ketelstatus"); container.add(textLabel); textLabel = new JLabel ("Kleppenstand"); container.add(textLabel); text5 = new JLabel ("dicht"); container.add(text5); text6 = new JLabel ("dicht"); container.add(text6); text3 = new JLabel ("aan"); container.add(text3); textLabel = new JLabel ("huidige temp."); container.add(textLabel); text1 = new JLabel ("15"); container.add(text1); text2 = new JLabel ("15"); container.add(text2); textLabel = new JLabel (""); container.add(textLabel); textLabel = new JLabel ("Eerstvolgende"+'\n'+" gewenste temp"); container.add(textLabel); text7 = new JLabel (""); container.add(text7); text8 = new JLabel (""); container.add(text8); textLabel = new JLabel (""); container.add(textLabel); textLabel = new JLabel ("Tot volgende res."); container.add(textLabel); text9 = new JLabel (""); container.add(text9); text10 = new JLabel (""); container.add(text10); } public void start() { frame = new ShowGridLayout5(); frame.setTitle("ketelstatus"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(500, 300); frame.setVisible(true); } }
IX