Scénářovací systém
Tato stránka popisuje jak funguje scénařovací systém vytvoření pro workshop Enak.
Python knihovna umožňuje tuto funkcionalitu je dostupná na GitHub.
Vytvoření nového scénáře
Pro vytvoření nového scénáře napište nový python skript v tomto formátu
from enak.Enak import *
from random import randint
building_consumptions = {
Building.CITY_CENTER_A: (randint(550, 620), randint(350, 400)),
...
}
source_productions = {
Source.COAL: (250, 500),
...
}
def getScript():
script = Script(building_consumptions, source_productions)
#script.setVerbose(True) #set script to be verbose
...
return scriptTento skript uložte do složky WebControl/CoreAPI/src/scenarios, samotné přidání se provede v souboru CoreAPI/src/state.py následovně:
from scenarios.test_scenario import getScript as getTestScript
available_script_generators: Dict[str, Callable[[], Script]] = {
"testovací": getTestScript,
}Formát souboru skriptu
Skript musí obsahovat funkci která vrací objekt typu Enak.Script (typicky getScript()) a konfiguraci spotřeb budov a produkcí elektráren.
Skript začíná importy knihoven
from enak.Enak import *
from random import randintKonfigurace spotřeb budov
první číslo je denní spotřeba, druhé noční
building_consumptions = {
Building.CITY_CENTER_A: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_B: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_C: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_D: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_E: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_F: (randint(550, 620), randint(350, 400)),
Building.FACTORY: (400, 400),
Building.STADIUM: (250, 400),
Building.HOSPITAL: (350, 250),
Building.UNIVERSITY: (400, 200),
Building.AIRPORT: (500, 400),
Building.SHOPPING_MALL: (350, 200),
Building.TECHNOLOGY_CENTER: (300, 250),
Building.FARM: (80, 40),
Building.LIVING_QUARTER_SMALL: (70, 40),
Building.LIVING_QUARTER_LARGE: (100, 60),
Building.SCHOOL: (80, 30)
}Konfigurace produkce elektráren
čísla definují rozsah minimální a maximální produkce pro každý daný typ elektrárny
source_productions = {
Source.COAL: (250, 500),
Source.HYDRO: (0, 200),
Source.HYDRO_STORAGE: (-200, 200),
Source.GAS: (0, 500),
Source.NUCLEAR: (900, 1000),
Source.WIND: (0, 100),
Source.PHOTOVOLTAIC: (0, 100),
Source.BATTERY: (-200, 200)
}Makro CITY_CENTERS
V Enak.py je naimplementováno makro CITY_CENTERS, které obsahuje pole [CITY_CENTER_A, CITY_CENTER_B, CITY_CENTER_C, CITY_CENTER_D, CITY_CENTER_E, CITY_CENTER_F] a tak zjednodušuje inkrementální změny všech center měst, která mají jinou spotřebu pro každý z tymů.
Samotný scénář
samotný skript tvoříme ve funkci getScript() (nebo jinak vhodně pojmenované), která na začátku vytvoří objekt Script a na konci tento objekt vrací
def getScript():
script = Script(building_consumptions, source_productions)
#script.setVerbose(True)
#... zbytek scénáře zde
return skriptV samotném scénáři můžeme vytvořit 4 typy kol: Den, Noc, Slide a SlideRange. Ty se vytváří takto:
Slide
řetězec v konstruktoru Slide(str) odkazuje na soubor ve složce CoreAPI/presentations
sl = Slide("normal/24.svg")
script.addRound(sl)Slide Range
zobrazí více slidů v sekvenci, s ukazatelem na kolikátém slidu se nacházíme (dole uprostřed)
sr = SlideRange(["demo/outputname-01.png",
"normal/03.svg",
"normal/04.svg",
"normal/05.svg",
"normal/06.svg",
"normal/07.svg",
"normal/08.svg"])
script.addRound(sr)Den / Noc
jednoduché vytvoření denního kola je následovné
d = (Day()
.comment("Uhelky")
.build())
script.addRound(d)případně pouze (komentář není vyžadován)
n = Night().build()
script.addRound(n)pro dny s počasím stačí přidat
d = (Day()
.sunny()
.windy()
.build())
script.addRound(d)kde počasí je typu: sunny(), windy(), breezy(), calm(), cloudy(), partly_cloudy(), foggy(), snowy(), rainy().
Pro výpadek zdroje lze použít metodu outage(Source.TYPE), tedy například:
n = (Night()
.windy()
.outage(Source.GAS)
.build())
script.addRound(n)a lze změnit spotřebu budov pomocí .addBuildingModifier(self, building: Building, modifier: float) (pro jednu budovu), nebo například .addBuildingModifiers(self, buildings: List[Building], modifier: float) (pro více budov).
d = (Day()
.comment("MS v hokeji, porucha plyn elektrárny")
.addBuildingModifiers(CITY_CENTERS, 600)
.outage(Source.GAS)
.sunny()
.windy()
.build())
script.addRound(d)Pro manuální konfiguraci lze použít metodu setCoefficient(self, source: Source, coefficient: float).
Poznámka
Je nutné vždy po dokončení kola toto kolo přidat do skriptu za použití script.addRound(round).
Modifikace, povolení výroby
Before each added round, you can also change the consumption coefficients, and allow productions. This is done in the following manner
script.changeBuildingsConsumptions(CITY_CENTERS, (120, 60)) #změna budov pro makro CITY_CENTERS
script.allowProduction(Source.HYDRO) #povolení produkce na HYDRO
script.allowProduction(Source.HYDRO_STORAGE)
d = Day().build()
script.addRound(d)změna v changeBuildingsConsumptions (více budov), nebo changeBuildingConsumption je permanentní (promítá se do všech následujících kol), a jedná se o navýšení aktuální spotřeby a zadané budovy (den a noc).
Příklady souborů
Níže jsou uvedeny vzorové scénáře, implementované ve webové verzi enak.cz
from enak.Enak import *
from random import randint
building_consumptions = {
Building.CITY_CENTER_A: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_B: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_C: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_D: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_E: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_F: (randint(550, 620), randint(350, 400)),
Building.FACTORY: (400, 400),
Building.STADIUM: (250, 400),
Building.HOSPITAL: (350, 250),
Building.UNIVERSITY: (400, 200),
Building.AIRPORT: (500, 400),
Building.SHOPPING_MALL: (350, 200),
Building.TECHNOLOGY_CENTER: (300, 250),
Building.FARM: (80, 40),
Building.LIVING_QUARTER_SMALL: (70, 40),
Building.LIVING_QUARTER_LARGE: (100, 60),
Building.SCHOOL: (80, 30)
}
source_productions = {
#these numbers define the minimum and maximum
Source.COAL: (250, 500),
Source.HYDRO: (0, 200),
Source.HYDRO_STORAGE: (-200, 200),
Source.GAS: (0, 500),
Source.NUCLEAR: (900, 1000),
Source.WIND: (0, 100),
Source.PHOTOVOLTAIC: (0, 100),
Source.BATTERY: (-200, 200)
}
def getScript():
script = Script(building_consumptions, source_productions)
#script.setVerbose(True)
#FÁZE 1 - prezentace
sr = SlideRange(["demo/outputname-01.png",
#"demo/outputname-02.png",
"normal/03.svg",
"normal/04.svg",
"normal/05.svg",
"normal/06.svg",
"normal/07.svg",
"normal/08.svg"])
script.addRound(sr)
#FÁZE 2 - umístění dvou uhelek a jedné budovy, jednoduché vyrovnání soustavy
script.allowProduction(Source.COAL)
d = (Day()
.comment("Uhelky")
.build())
script.addRound(d)
s = Slide("normal/12.svg")
script.addRound(s)
n = Night().build()
script.addRound(n)
sl = Slide("normal/14.svg")
script.addRound(sl)
#FÁZE 3 - spotřeba města roste o 60MW ve dne, o 120MW v noci
script.changeBuildingsConsumptions(CITY_CENTERS, (120, 60))
script.allowProduction(Source.HYDRO)
script.allowProduction(Source.HYDRO_STORAGE)
d = Day().build()
script.addRound(d)
sl = Slide("normal/17.svg")
script.addRound(sl)
n = Night().build()
script.addRound(n)
sl = Slide("normal/19.svg")
script.addRound(sl)
#FÁZE 4 - JADERKY
script.allowProduction(Source.NUCLEAR)
script.changeBuildingsConsumptions(CITY_CENTERS, (150, 150))
d = Day().build()
script.addRound(d)
sl = Slide("normal/22.svg")
script.addRound(sl)
n = Night().build()
script.addRound(n)
sl = Slide("normal/24.svg")
script.addRound(sl)
#FÁZE 5 - spotřeba města roste o 100MW, plynové elektrárny
script.changeBuildingsConsumptions(CITY_CENTERS, (100, 100))
script.allowProduction(Source.GAS)
d = Day().build()
script.addRound(d)
sl = Slide("normal/27.svg")
script.addRound(sl)
n = Night().build()
script.addRound(n)
sr = SlideRange(["normal/29.svg",
"normal/30.svg",
"normal/31.svg"])
script.addRound(sr)
#FÁZE 6 - spotřeba města roste o 200 MW, nový typ OZE
script.changeBuildingsConsumptions(CITY_CENTERS, (200, 200))
script.allowProduction(Source.WIND)
script.allowProduction(Source.PHOTOVOLTAIC)
script.allowProduction(Source.BATTERY)
d = (Day()
.sunny()
.windy()
.build())
script.addRound(d)
sl = Slide("normal/34.svg")
script.addRound(sl)
n = (Night()
.windy()
.build())
script.addRound(n)
sl = Slide("normal/snowy.svg")
script.addRound(sl)
# Scénář 1: zima, zataženo, sněží, je bezvětří
d = (Day()
.snowy()
.calm()
.build())
script.addRound(d)
sl = Slide("normal/34.svg")
script.addRound(sl)
n = (Night()
.snowy()
.calm()
.build())
script.addRound(n)
sl = Slide("normal/39.svg")
script.addRound(sl)
#scénář 2: MS v hokeji, porucha plyn elektrárny
# spotřeba vyrostla o 600MW ve dne v noci o 450MW
d = (Day()
.comment("MS v hokeji, porucha plyn elektrárny")
.addBuildingModifiers(CITY_CENTERS, 600)
.outage(Source.GAS)
.sunny()
.windy()
.build())
script.addRound(d)
sl = Slide("normal/34.svg")
script.addRound(sl)
n = (Night()
.addBuildingModifiers(CITY_CENTERS, 450)
.outage(Source.GAS)
.windy()
.build())
script.addRound(n)
sr = SlideRange(["normal/36.svg",
"normal/37.svg",
"normal/38.svg"])
script.addRound(sr)
return script
if __name__ == "__main__":
s = getScript()from enak.Enak import *
from random import randint
building_consumptions = {
Building.CITY_CENTER_A: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_B: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_C: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_D: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_E: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_F: (randint(550, 620), randint(350, 400)),
Building.FACTORY: (400, 400),
Building.STADIUM: (250, 400),
Building.HOSPITAL: (350, 250),
Building.UNIVERSITY: (400, 200),
Building.AIRPORT: (500, 400),
Building.SHOPPING_MALL: (350, 200),
Building.TECHNOLOGY_CENTER: (300, 250),
Building.FARM: (80, 40),
Building.LIVING_QUARTER_SMALL: (70, 40),
Building.LIVING_QUARTER_LARGE: (100, 60),
Building.SCHOOL: (80, 30)
}
source_productions = {
#these numbers define the minimum and maximum
Source.COAL: (250, 500),
Source.HYDRO: (0, 200),
Source.HYDRO_STORAGE: (-200, 200),
Source.GAS: (0, 500),
Source.NUCLEAR: (900, 1000),
Source.WIND: (0, 100),
Source.PHOTOVOLTAIC: (0, 100),
Source.BATTERY: (-200, 200)
}
def getScript():
script = Script(building_consumptions, source_productions)
#script.setVerbose(True)
#FÁZE 1 - prezentace
sr = SlideRange(["demo/outputname-01.png",
#"demo/outputname-02.png",
"normal/03.svg",
"normal/04.svg",
"normal/05.svg",
"normal/06.svg",
"normal/07.svg",
"normal/08.svg"])
script.addRound(sr)
#FÁZE 2 - umístění dvou uhelek a jedné budovy, jednoduché vyrovnání soustavy
script.allowProduction(Source.COAL)
d = (Day()
.comment("Uhelky")
.build())
script.addRound(d)
s = Slide("normal/12.svg")
script.addRound(s)
n = Night().build()
script.addRound(n)
sl = Slide("normal/14.svg")
script.addRound(sl)
#FÁZE 3 - spotřeba města roste o 60MW ve dne, o 120MW v noci
script.changeBuildingsConsumptions(CITY_CENTERS, (120, 60))
script.allowProduction(Source.HYDRO)
script.allowProduction(Source.HYDRO_STORAGE)
d = Day().build()
script.addRound(d)
sl = Slide("normal/17.svg")
script.addRound(sl)
n = Night().build()
script.addRound(n)
sl = Slide("normal/19.svg")
script.addRound(sl)
#FÁZE 4 - JADERKY
script.allowProduction(Source.NUCLEAR)
script.changeBuildingsConsumptions(CITY_CENTERS, (150, 150))
d = Day().build()
script.addRound(d)
sl = Slide("normal/22.svg")
script.addRound(sl)
n = Night().build()
script.addRound(n)
sl = Slide("normal/24.svg")
script.addRound(sl)
#FÁZE 5 - spotřeba města roste o 100MW, plynové elektrárny
script.changeBuildingsConsumptions(CITY_CENTERS, (100, 100))
script.allowProduction(Source.GAS)
d = Day().build()
script.addRound(d)
sl = Slide("normal/27.svg")
script.addRound(sl)
n = Night().build()
script.addRound(n)
sr = SlideRange(["normal/29.svg",
"normal/30.svg",
"normal/31.svg"])
script.addRound(sr)
#FÁZE 6 - spotřeba města roste o 200 MW, nový typ OZE
script.changeBuildingsConsumptions(CITY_CENTERS, (200, 200))
script.allowProduction(Source.WIND)
script.allowProduction(Source.PHOTOVOLTAIC)
script.allowProduction(Source.BATTERY)
d = (Day()
.sunny()
.windy()
.build())
script.addRound(d)
sl = Slide("normal/34.svg")
script.addRound(sl)
n = (Night()
.windy()
.build())
script.addRound(n)
sl = Slide("normal/39.svg")
script.addRound(sl)
#scénář 2: MS v hokeji, porucha plyn elektrárny
# spotřeba vyrostla o 600MW ve dne v noci o 450MW
d = (Day()
.comment("MS v hokeji, porucha plyn elektrárny")
.addBuildingModifiers(CITY_CENTERS, 600)
.outage(Source.GAS)
.partly_cloudy()
.windy()
.build())
script.addRound(d)
sl = Slide("normal/34.svg")
script.addRound(sl)
n = (Night()
.addBuildingModifiers(CITY_CENTERS, 450)
.outage(Source.GAS)
.breezy()
.build())
script.addRound(n)
sr = SlideRange(["normal/36.svg",
"normal/37.svg",
"normal/38.svg"])
script.addRound(sr)
return script
if __name__ == "__main__":
s = getScript()from enak.Enak import *
from random import randint
building_consumptions = {
Building.CITY_CENTER_A: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_B: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_C: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_D: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_E: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_F: (randint(550, 620), randint(350, 400)),
Building.FACTORY: (400, 400),
Building.STADIUM: (250, 400),
Building.HOSPITAL: (350, 250),
Building.UNIVERSITY: (400, 200),
Building.AIRPORT: (500, 400),
Building.SHOPPING_MALL: (350, 200),
Building.TECHNOLOGY_CENTER: (300, 250),
Building.FARM: (80, 40),
Building.LIVING_QUARTER_SMALL: (70, 40),
Building.LIVING_QUARTER_LARGE: (100, 60),
Building.SCHOOL: (80, 30)
}
source_productions = {
#these numbers define the minimum and maximum
Source.COAL: (250, 500),
Source.HYDRO: (0, 200),
Source.HYDRO_STORAGE: (-200, 200),
Source.GAS: (0, 500),
Source.NUCLEAR: (900, 1000),
Source.WIND: (0, 100),
Source.PHOTOVOLTAIC: (0, 100),
Source.BATTERY: (-200, 200)
}
def getScript():
script = Script(building_consumptions, source_productions)
#script.setVerbose(True)
#FÁZE 1 - prezentace
sr = SlideRange(["demo/outputname-01.png",
#"demo/outputname-02.png",
"normal/03.svg",
"normal/04.svg",
"normal/05.svg",
"normal/06.svg",
"normal/07.svg",
"normal/08.svg"])
script.addRound(sr)
#FÁZE 2 - umístění dvou uhelek a jedné budovy, jednoduché vyrovnání soustavy
script.allowProduction(Source.COAL)
d = (Day()
.comment("Uhelky")
.build())
script.addRound(d)
s = Slide("normal/12.svg")
script.addRound(s)
n = Night().build()
script.addRound(n)
sl = Slide("normal/14.svg")
script.addRound(sl)
#FÁZE 3 - spotřeba města roste o 60MW ve dne, o 120MW v noci
script.changeBuildingsConsumptions(CITY_CENTERS, (120, 60))
script.allowProduction(Source.HYDRO)
script.allowProduction(Source.HYDRO_STORAGE)
d = Day().build()
script.addRound(d)
sl = Slide("normal/17.svg")
script.addRound(sl)
n = Night().build()
script.addRound(n)
sl = Slide("normal/19.svg")
script.addRound(sl)
#FÁZE 4 - JADERKY
script.allowProduction(Source.NUCLEAR)
script.changeBuildingsConsumptions(CITY_CENTERS, (150, 150))
d = Day().build()
script.addRound(d)
sl = Slide("normal/22.svg")
script.addRound(sl)
n = Night().build()
script.addRound(n)
sl = Slide("normal/24.svg")
script.addRound(sl)
#FÁZE 5 - spotřeba města roste o 100MW, plynové elektrárny
script.changeBuildingsConsumptions(CITY_CENTERS, (100, 100))
script.allowProduction(Source.GAS)
d = Day().build()
script.addRound(d)
sl = Slide("normal/27.svg")
script.addRound(sl)
n = Night().build()
script.addRound(n)
sr = SlideRange(["normal/29.svg",
"normal/30.svg",
"normal/31.svg"])
script.addRound(sr)
#FÁZE 6 - spotřeba města roste o 200 MW, nový typ OZE
script.changeBuildingsConsumptions(CITY_CENTERS, (200, 200))
script.allowProduction(Source.WIND)
script.allowProduction(Source.PHOTOVOLTAIC)
script.allowProduction(Source.BATTERY)
sl = Slide("normal/39.svg")
script.addRound(sl)
#scénář 2: MS v hokeji, porucha plyn elektrárny
# spotřeba vyrostla o 600MW ve dne v noci o 450MW
d = (Day()
.comment("MS v hokeji, porucha plyn elektrárny")
.addBuildingModifiers(CITY_CENTERS, 600)
.outage(Source.GAS)
.partly_cloudy()
.windy()
.build())
script.addRound(d)
sl = Slide("normal/34.svg")
script.addRound(sl)
n = (Night()
.addBuildingModifiers(CITY_CENTERS, 450)
.outage(Source.GAS)
.breezy()
.build())
script.addRound(n)
sr = SlideRange(["normal/36.svg",
"normal/37.svg",
"normal/38.svg"])
script.addRound(sr)
return script
if __name__ == "__main__":
s = getScript()from enak.Enak import *
from random import randint
building_consumptions = {
Building.CITY_CENTER_A: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_B: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_C: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_D: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_E: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_F: (randint(550, 620), randint(350, 400)),
Building.FACTORY: (400, 400),
Building.STADIUM: (250, 400),
Building.HOSPITAL: (350, 250),
Building.UNIVERSITY: (400, 200),
Building.AIRPORT: (500, 400),
Building.SHOPPING_MALL: (350, 200),
Building.TECHNOLOGY_CENTER: (300, 250),
Building.FARM: (80, 40),
Building.LIVING_QUARTER_SMALL: (70, 40),
Building.LIVING_QUARTER_LARGE: (100, 60),
Building.SCHOOL: (80, 30)
}
source_productions = {
#these numbers define the minimum and maximum
Source.COAL: (250, 500),
Source.HYDRO: (0, 200),
Source.HYDRO_STORAGE: (-200, 200),
Source.GAS: (0, 500),
Source.NUCLEAR: (900, 1000),
Source.WIND: (0, 100),
Source.PHOTOVOLTAIC: (0, 100),
Source.BATTERY: (-200, 200)
}
def getScript():
script = Script(building_consumptions, source_productions)
#script.setVerbose(True)
#FÁZE 1 - prezentace
sr = Slide("demo/outputname-01.png")
script.addRound(sr)
script.allowProduction(Source.COAL)
script.allowProduction(Source.HYDRO)
script.allowProduction(Source.HYDRO_STORAGE)
script.allowProduction(Source.NUCLEAR)
script.allowProduction(Source.GAS)
script.allowProduction(Source.WIND)
script.allowProduction(Source.PHOTOVOLTAIC)
script.allowProduction(Source.BATTERY)
sl = Slide("normal/39.svg")
script.addRound(sl)
d = (Day()
.sunny()
.windy()
.build())
script.addRound(d)
sl = Slide("normal/34.svg")
script.addRound(sl)
n = (Night()
.windy()
.build())
script.addRound(n)
return script
if __name__ == "__main__":
s = getScript()from enak.Enak import *
from random import randint
building_consumptions = {
Building.CITY_CENTER_A: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_B: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_C: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_D: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_E: (randint(550, 620), randint(350, 400)),
Building.CITY_CENTER_F: (randint(550, 620), randint(350, 400)),
Building.FACTORY: (400, 400),
Building.STADIUM: (250, 400),
Building.HOSPITAL: (350, 250),
Building.UNIVERSITY: (400, 200),
Building.AIRPORT: (500, 400),
Building.SHOPPING_MALL: (350, 200),
Building.TECHNOLOGY_CENTER: (300, 250),
Building.FARM: (80, 40),
Building.LIVING_QUARTER_SMALL: (70, 40),
Building.LIVING_QUARTER_LARGE: (100, 60),
Building.SCHOOL: (80, 30)
}
source_productions = {
#these numbers define the minimum and maximum
Source.COAL: (250, 500),
Source.HYDRO: (0, 200),
Source.HYDRO_STORAGE: (-200, 200),
Source.GAS: (0, 500),
Source.NUCLEAR: (900, 1000),
Source.WIND: (0, 100),
Source.PHOTOVOLTAIC: (0, 100),
Source.BATTERY: (-200, 200)
}
def getScript():
script = Script(building_consumptions, source_productions)
#script.setVerbose(True)
#FÁZE 1 - prezentace
sr = Slide("demo/outputname-01.png")
script.addRound(sr)
script.allowProduction(Source.COAL)
script.allowProduction(Source.HYDRO)
script.allowProduction(Source.HYDRO_STORAGE)
script.allowProduction(Source.NUCLEAR)
script.allowProduction(Source.GAS)
script.allowProduction(Source.WIND)
script.allowProduction(Source.PHOTOVOLTAIC)
script.allowProduction(Source.BATTERY)
sl = Slide("normal/39.svg")
script.addRound(sl)
d = (Day()
.sunny()
.windy()
.build())
script.addRound(d)
sl = Slide("normal/34.svg")
script.addRound(sl)
n = (Night()
.windy()
.build())
script.addRound(n)
sl = Slide("normal/39.svg")
script.addRound(sl)
d = (Day()
.comment("MS v hokeji, porucha plyn elektrárny")
.addBuildingModifiers(CITY_CENTERS, 600)
.outage(Source.GAS)
.cloudy()
.windy()
.build())
script.addRound(d)
sl = Slide("normal/34.svg")
script.addRound(sl)
n = (Night()
.addBuildingModifiers(CITY_CENTERS, 450)
.outage(Source.GAS)
.windy()
.build())
script.addRound(n)
return script
if __name__ == "__main__":
s = getScript()from enak.Enak import *
import os
# Global debug flag from environment variable
DEBUG = os.getenv('DEBUG', 'false').lower() == 'true'
building_consumptions = {
#these numbers define the (day, night) consumption of the specific buildings
Building.CITY_CENTER_A: (575, 200),
Building.CITY_CENTER_B: (600, 200),
Building.CITY_CENTER_C: (620, 200),
Building.CITY_CENTER_D: (550, 200),
Building.CITY_CENTER_E: (625, 200),
Building.CITY_CENTER_F: (550, 200),
Building.FACTORY: (400, 400),
Building.STADIUM: (250, 400),
Building.HOSPITAL: (350, 250),
Building.UNIVERSITY: (400, 200),
Building.AIRPORT: (500, 400),
Building.SHOPPING_MALL: (350, 200),
Building.TECHNOLOGY_CENTER: (300, 250),
Building.FARM: (80, 40),
Building.LIVING_QUARTER_SMALL: (70, 40),
Building.LIVING_QUARTER_LARGE: (100, 60),
Building.SCHOOL: (80, 30)
}
source_productions = {
#these numbers define the minimum and maximum
Source.COAL: (250, 500),
Source.HYDRO: (0, 100),
Source.HYDRO_STORAGE: (-200, 200),
Source.GAS: (0, 500),
Source.NUCLEAR: (900, 1000),
Source.WIND: (0, 100),
Source.PHOTOVOLTAIC: (0, 100),
Source.BATTERY: (-200, 200)
}
def getScript():
script = Script(building_consumptions, source_productions)
script.setVerbose(DEBUG)
#FÁZE 1 - prezentace
sr = SlideRange(["demo/outputname-01.png", "demo/outputname-02.png", "demo/outputname-03.png"])
script.addRound(sr)
sl = Slide("demo/outputname-04.png")
script.addRound(sl)
#FÁZE 2 - umístění dvou uhelek a jedné budovy, jednoduché vyrovnání soustavy
script.allowProduction(Source.COAL)
d = (Day()
.comment("Uhelky")
.build())
script.addRound(d)
n = Night().build()
script.addRound(n)
sl = Slide("demo/outputname-05.png")
script.addRound(sl)
#FÁZE 3 - spotřeba města roste o 60MW ve dne, o 120MW v noci
script.changeBuildingsConsumptions(CITY_CENTERS, (60, 120))
script.allowProduction(Source.HYDRO)
script.allowProduction(Source.HYDRO_STORAGE)
script.allowProduction(Source.BATTERY)
d = Day().build()
script.addRound(d)
n = Night().build()
script.addRound(n)
sl = Slide("demo/outputname-06.png")
script.addRound(sl)
#FÁZE 4 - jaderky, spotřeba roste o 100MW
script.allowProduction(Source.NUCLEAR)
script.changeBuildingsConsumptions(CITY_CENTERS, (100, 100))
d = Day().build()
script.addRound(d)
n = Night().build()
script.addRound(n)
sl = Slide("demo/outputname-07.png")
script.addRound(sl)
#FÁZE 5 - spotřeba města roste o 100MW, plynové elektrárny
script.changeBuildingsConsumptions(CITY_CENTERS, (100, 100))
script.allowProduction(Source.GAS)
d = Day().build()
script.addRound(d)
n = Night().build()
script.addRound(n)
sl = Slide("demo/outputname-08.png")
script.addRound(sl)
#FÁZE 6 - spotřeba města roste o 200 MW, nový typ OZE
script.changeBuildingsConsumptions(CITY_CENTERS, (200, 200))
script.allowProduction(Source.WIND)
script.allowProduction(Source.PHOTOVOLTAIC)
#normal calm day (average wind, average sun)
d = Day().sunny().breezy().build()
script.addRound(d)
n = Night().breezy().build()
script.addRound(n)
sl = Slide("demo/outputname-09.png")
script.addRound(sl)
#FÁZE 7 - scénáře
# Je zima, zataženo, sněží a je bezvětří.
d = (Day()
.snowy()
.calm()
.cloudy()
.build())
script.addRound(d)
n = (Night()
.snowy()
.calm()
.cloudy()
.build())
script.addRound(n)
sl = Slide("demo/outputname-10.png")
script.addRound(sl)
# MS v hokeji, více lidí ve městě, porucha plynové elektrárny
d = (Day()
.sunny()
.windy()
.outage(Source.GAS)
.addBuildingModifier(Building.STADIUM, 50)
.addBuildingModifiers(CITY_CENTERS, 600)
.comment("MS v hokeji")
.build())
script.addRound(d)
n = (Night()
.windy()
.outage(Source.GAS)
.addBuildingModifier(Building.STADIUM, 100)
.addBuildingModifiers(CITY_CENTERS, 450)
.build())
script.addRound(n)
return script
if __name__ == "__main__":
s = getScript()