ControlAlgorithm.java 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714
  1. package blackstart;
  2. import java.awt.*;
  3. import java.io.IOException;
  4. import java.nio.charset.StandardCharsets;
  5. import java.nio.file.Files;
  6. import java.nio.file.Path;
  7. import java.nio.file.Paths;
  8. import java.util.ArrayList;
  9. import java.util.LinkedList;
  10. import java.util.List;
  11. import javax.swing.*;
  12. import api.AddOn;
  13. import classes.*;
  14. import ui.controller.Control;
  15. import classes.StorageProductionController;
  16. public class ControlAlgorithm implements AddOn {
  17. // Gui Part:
  18. private Control control;
  19. private JTextArea textArea;
  20. private JPanel content = new JPanel();
  21. // ProgressBar
  22. private long startTime;
  23. private Thread runThread;
  24. private HolonObject powerplant;
  25. private TextField blackstartEnergyrequierementTextfield;
  26. private TextField blackstartSuccessTimeTextfield;
  27. private TextField powerplantMaxOutputTextfield;
  28. private TextField blackstartStartTimeTextfield;
  29. private TextField simulationDurationTextfield;
  30. private TextField storageStartCharge;
  31. private TextField carStartCharge;
  32. private TextField waitBetweenIterations;
  33. private TextField fileNameTextfield;
  34. private TextField schedulTextfield;
  35. private TextField renewableTextfield;
  36. private TextField addBatteryTextfield;
  37. private TextField addBatteryTypeTextfield;
  38. private TextField removeBatteryTextfield;
  39. private TextField removeBatteryTypeTextfield;
  40. private int blackstartSuccessTime;
  41. private int blackstartStartTime;
  42. private int blackstartRunningCounter;
  43. private float powerplantMaxOutput;
  44. private List<HolonObject> renewableProducers;
  45. private List<HolonObject> consumers;
  46. private StorageProductionController SPC;
  47. private int scheduleKind;
  48. private int totalNumberOfHouses;
  49. private Path file;
  50. private ArrayList<String> lines;
  51. public static void main(String[] args) {
  52. JFrame newFrame = new JFrame("exampleWindow");
  53. ControlAlgorithm instance = new ControlAlgorithm();
  54. newFrame.setContentPane(instance.getPanel());
  55. newFrame.pack();
  56. newFrame.setVisible(true);
  57. newFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  58. }
  59. public ControlAlgorithm() {
  60. content.setLayout(new BorderLayout());
  61. textArea = new JTextArea();
  62. textArea.setEditable(false);
  63. JScrollPane scrollPane = new JScrollPane(textArea);
  64. JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, createOptionPanel(), scrollPane);
  65. splitPane.setResizeWeight(0.0);
  66. content.add(splitPane, BorderLayout.CENTER);
  67. content.setPreferredSize(new Dimension(1000, 800));
  68. }
  69. public JPanel createOptionPanel() {
  70. JPanel optionPanel = new JPanel(new BorderLayout());
  71. JScrollPane scrollPane = new JScrollPane(createParameterPanel());
  72. scrollPane.setBorder(BorderFactory.createTitledBorder("Parameter"));
  73. optionPanel.add(scrollPane, BorderLayout.CENTER);
  74. optionPanel.add(createButtonPanel(), BorderLayout.PAGE_END);
  75. return optionPanel;
  76. }
  77. private Component createParameterPanel() {
  78. JPanel parameterPanel = new JPanel(null);
  79. parameterPanel.setPreferredSize(new Dimension(510, 300));
  80. blackstartEnergyrequierementTextfield = new TextField("5000000");
  81. blackstartEnergyrequierementTextfield.setBounds(10, 10, 95, 20);
  82. parameterPanel.add(blackstartEnergyrequierementTextfield);
  83. JLabel blackstartEnergyrequierementLabel = new JLabel("Blackstart Energyrequirement in Watt");
  84. blackstartEnergyrequierementLabel.setBounds(110, 10, 300, 20);
  85. parameterPanel.add(blackstartEnergyrequierementLabel);
  86. blackstartSuccessTimeTextfield = new TextField("30");
  87. blackstartSuccessTimeTextfield.setBounds(10, 35, 95, 20);
  88. parameterPanel.add(blackstartSuccessTimeTextfield);
  89. JLabel blackstartSuccessTimeLabel = new JLabel("Time for successfull blackstart in minutes");
  90. blackstartSuccessTimeLabel.setBounds(110, 35, 300, 20);
  91. parameterPanel.add(blackstartSuccessTimeLabel);
  92. blackstartStartTimeTextfield = new TextField("15");
  93. blackstartStartTimeTextfield.setBounds(10, 60, 95, 20);
  94. parameterPanel.add(blackstartStartTimeTextfield);
  95. JLabel blackstartStartTimeLabel = new JLabel("Starttime for the blackstart");
  96. blackstartStartTimeLabel.setBounds(110, 60, 300, 20);
  97. parameterPanel.add(blackstartStartTimeLabel);
  98. simulationDurationTextfield = new TextField("500");
  99. simulationDurationTextfield.setBounds(10, 85, 95, 20);
  100. parameterPanel.add(simulationDurationTextfield);
  101. JLabel simulationDurationLabel = new JLabel("How long should the simulation run?");
  102. simulationDurationLabel.setBounds(110, 85, 300, 20);
  103. parameterPanel.add(simulationDurationLabel);
  104. powerplantMaxOutputTextfield = new TextField("40000000");
  105. powerplantMaxOutputTextfield.setBounds(10, 110, 95, 20);
  106. parameterPanel.add(powerplantMaxOutputTextfield);
  107. JLabel powerplantMaxOutputLabel = new JLabel("Powerplant Output afer Blackstart");
  108. powerplantMaxOutputLabel.setBounds(110, 110, 300, 20);
  109. parameterPanel.add(powerplantMaxOutputLabel);
  110. storageStartCharge = new TextField("25");
  111. storageStartCharge.setBounds(10, 135, 95, 20);
  112. parameterPanel.add(storageStartCharge);
  113. JLabel storageStartChargeLabel = new JLabel("Storage soc at start in %");
  114. storageStartChargeLabel.setBounds(110, 135, 300, 20);
  115. parameterPanel.add(storageStartChargeLabel);
  116. carStartCharge = new TextField("50");
  117. carStartCharge.setBounds(10, 160, 95, 20);
  118. parameterPanel.add(carStartCharge);
  119. JLabel carStartChargeLabel = new JLabel("Car soc at start in %");
  120. carStartChargeLabel.setBounds(110, 160, 300, 20);
  121. parameterPanel.add(carStartChargeLabel);
  122. waitBetweenIterations = new TextField("0");
  123. waitBetweenIterations.setBounds(10, 205, 95, 20);
  124. parameterPanel.add(waitBetweenIterations);
  125. JLabel waitBetweenIterationsLabel = new JLabel("Wait time between iterations");
  126. waitBetweenIterationsLabel.setBounds(110, 205, 300, 20);
  127. parameterPanel.add(waitBetweenIterationsLabel);
  128. ////////collums
  129. fileNameTextfield = new TextField("Eval.txt");
  130. fileNameTextfield.setBounds(425, 10, 95, 20);
  131. parameterPanel.add(fileNameTextfield);
  132. JLabel fileNameLabel = new JLabel("Filename");
  133. fileNameLabel.setBounds(530, 10, 300, 20);
  134. parameterPanel.add(fileNameLabel);
  135. schedulTextfield = new TextField("0");
  136. schedulTextfield.setBounds(425, 35, 95, 20);
  137. parameterPanel.add(schedulTextfield);
  138. JLabel scheduleLabel = new JLabel("opt=0,simpl=1,rnd=2");
  139. scheduleLabel.setBounds(530, 35, 300, 20);
  140. parameterPanel.add(scheduleLabel);
  141. renewableTextfield = new TextField("300");
  142. renewableTextfield.setBounds(425, 60, 95, 20);
  143. parameterPanel.add(renewableTextfield);
  144. JLabel renewableLabel = new JLabel("renewable power per element in watt");
  145. renewableLabel.setBounds(530, 60, 300, 20);
  146. parameterPanel.add(renewableLabel);
  147. addBatteryTextfield = new TextField("0");
  148. addBatteryTextfield.setBounds(425, 110, 95, 20);
  149. parameterPanel.add(addBatteryTextfield);
  150. JLabel addBatteryLabel = new JLabel("add number of certain batterytype");
  151. addBatteryLabel.setBounds(530, 110, 300, 20);
  152. parameterPanel.add(addBatteryLabel);
  153. addBatteryTypeTextfield = new TextField("Car");
  154. addBatteryTypeTextfield.setBounds(425, 135, 95, 20);
  155. parameterPanel.add(addBatteryTypeTextfield);
  156. JLabel addBatteryTypeLabel = new JLabel("What kind of battery to add");
  157. addBatteryTypeLabel.setBounds(530, 135, 300, 20);
  158. parameterPanel.add(addBatteryTypeLabel);
  159. removeBatteryTextfield = new TextField("0");
  160. removeBatteryTextfield.setBounds(425, 160, 95, 20);
  161. parameterPanel.add(removeBatteryTextfield);
  162. JLabel removeBatteryLabel = new JLabel("remove number of certain batterytype");
  163. removeBatteryLabel.setBounds(530, 160, 300, 20);
  164. parameterPanel.add(removeBatteryLabel);
  165. removeBatteryTypeTextfield = new TextField("Car");
  166. removeBatteryTypeTextfield.setBounds(425, 205, 95, 20);
  167. parameterPanel.add(removeBatteryTypeTextfield);
  168. JLabel removeBatteryTypeLabel = new JLabel("What kind of battery to remove");
  169. removeBatteryTypeLabel.setBounds(530, 205, 300, 20);
  170. parameterPanel.add(removeBatteryTypeLabel);
  171. return parameterPanel;
  172. }
  173. public JPanel createButtonPanel() {
  174. JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
  175. JButton runButton = new JButton("Run");
  176. runButton.addActionListener(actionEvent -> {
  177. Runnable task = this::run;
  178. runThread = new Thread(task);
  179. runThread.start();
  180. });
  181. buttonPanel.add(runButton);
  182. return buttonPanel;
  183. }
  184. private void run() {
  185. clear();
  186. disableGuiInput(true);
  187. startTimer();
  188. initAlgo();
  189. printElapsedTime();
  190. disableGuiInput(false);
  191. }
  192. private void disableGuiInput(boolean bool) {
  193. control.guiDisable(bool);
  194. }
  195. @Override
  196. public JPanel getPanel() {
  197. return content;
  198. }
  199. @Override
  200. public void setController(Control control) {
  201. this.control = control;
  202. }
  203. private void clear() {
  204. textArea.setText("");
  205. }
  206. private void println(String message) {
  207. lines.add(message);
  208. textArea.append(message + "\n");
  209. }
  210. private void startTimer() {
  211. startTime = System.currentTimeMillis();
  212. }
  213. private void printElapsedTime() {
  214. long elapsedMilliSeconds = System.currentTimeMillis() - startTime;
  215. println("Execution Time of Algo in Milliseconds:" + elapsedMilliSeconds);
  216. }
  217. ///////////////////////////////////////////////////////////////////////////////////
  218. /**
  219. *
  220. */
  221. private void initAlgo() {
  222. try {
  223. // init
  224. renewableProducers = getRenewableProducers();
  225. consumers = getConsumers();
  226. addCertainKindOfBatteries(Integer.parseInt(addBatteryTextfield.getText()),addBatteryTypeTextfield.getText());
  227. removeCertainKindOfBatteries(Integer.parseInt(removeBatteryTextfield.getText()), removeBatteryTypeTextfield.getText());
  228. totalNumberOfHouses = consumers.size();
  229. powerplant = control.getSimManager().getPowerplant();// DANGER DONT GIVE NULL
  230. setPowerPlantBlackstartResistance(-Float.parseFloat(blackstartEnergyrequierementTextfield.getText()));
  231. SPC = new StorageProductionController(getStorageElements(), getEnergyRequiredForPowerplantBlackstart());// DANGER DONT GIVE NULL
  232. if(powerplant == null){
  233. println("No Power Plant in Model");
  234. return;
  235. }
  236. control.getModel().setResistanceCalculator(new ResistanceCalculator(
  237. 230,
  238. 10000,
  239. 35, 25,0.017, 0.017));
  240. control.getModel().getResistanceCalculator().setDistancesToCalcResistance(powerplant);
  241. blackstartRunningCounter = 0;
  242. deactivateBlackstart();
  243. control.getModel().setCurIteration(0);
  244. // prepare model
  245. /////////
  246. setRenewableElements(Float.parseFloat(renewableTextfield.getText()));
  247. disablePowerplantProduction();
  248. enableAllConsumers();
  249. SPC.setAllStorageToStandy();
  250. // TODO: prios?
  251. /////////
  252. // Get parameters from textfields
  253. scheduleKind = Integer.parseInt(schedulTextfield.getText());
  254. setPowerPlantBlackstartResistance(-Float.parseFloat(blackstartEnergyrequierementTextfield.getText()));
  255. blackstartSuccessTime = Integer.parseInt(blackstartSuccessTimeTextfield.getText());
  256. powerplantMaxOutput = Float.parseFloat(powerplantMaxOutputTextfield.getText());
  257. blackstartStartTime = Integer.parseInt(blackstartStartTimeTextfield.getText());
  258. control.getModel().setIterations(Integer.parseInt(simulationDurationTextfield.getText()));
  259. for (StorageElement se : getStorageElements()) {
  260. if (se.getEleName().startsWith("Car")) {
  261. se.setStateOfCharge(Float.parseFloat(carStartCharge.getText()));
  262. } else {
  263. se.setStateOfCharge(Float.parseFloat(storageStartCharge.getText()));
  264. }
  265. }
  266. lines = new ArrayList<String>();
  267. lines.add(fileNameTextfield.getText());
  268. file = Paths.get(fileNameTextfield.getText());
  269. updateVisual();
  270. if (blackstartStartTime + blackstartSuccessTime > control.getModel().getIterations() - 1) {
  271. println("No Time for the blackstart, use working numbers");
  272. } else {
  273. blackstartMain(control.getModel().getCurIteration());
  274. }
  275. } catch (NumberFormatException e) {
  276. println("Worng Input, only numbers please");
  277. }
  278. }
  279. private void blackstartMain(int curIteration) {
  280. try {
  281. Thread.sleep(Integer.parseInt(waitBetweenIterations.getText()));
  282. } catch (InterruptedException e) {
  283. e.printStackTrace();
  284. }
  285. control.getModel().setCurIteration(curIteration);
  286. if (control.getSimManager().blackstartRunning()) {
  287. if (!blackstartAlgo()) {
  288. // blackstart for this iteration was not successfull
  289. deactivateBlackstart();
  290. updateVisual();
  291. println("Simulation of blackstart failed in Iteration: " + curIteration);
  292. writeOutputTxt();
  293. } else {
  294. // blackstart for this iteration was successfull
  295. blackstartRunningCounter++;
  296. if (blackstartRunningCounter == blackstartSuccessTime) {
  297. // blackstart was successfull for the needed iterations
  298. SPC.setAllStorageToStandy();
  299. deactivateBlackstart();
  300. enableAllConsumers();
  301. updateVisual();
  302. println("Simulation of blackstart Successfull in Iteration: " + curIteration);
  303. writeOutputTxt();
  304. } else {
  305. // blackstart not finished yet
  306. updateVisual();
  307. blackstartMain(curIteration + 1);
  308. }
  309. }
  310. } else {
  311. // blackstart has not started yet
  312. if (curIteration == blackstartStartTime) {
  313. activateBlackstart();
  314. disableConsumers();
  315. blackstartMain(curIteration);
  316. } else {
  317. updateVisual();
  318. blackstartMain(curIteration + 1);
  319. }
  320. }
  321. }
  322. /**
  323. * TODO: global resistance calculator?
  324. *
  325. *
  326. * maybes:
  327. * * TODO: prios fuer elemente anschalten
  328. * * TODO: batterie status wechesel fuehrt zu unterversorgung in GUI FIX?: in storage if bei charge auskommentieren
  329. * * TODO: batterie laden prios? entfernung? doppelt sortieren
  330. *
  331. * @return true or false depending on whether the blackstart was successful for
  332. * this iteration
  333. */
  334. private boolean blackstartAlgo() {
  335. printCurrentEnergyState();
  336. if (currentRenewableProduction() < getEnergyRequiredForPowerplantBlackstart()) {
  337. // renewable energy production is not sufficient for the blackstart
  338. if (SPC.currentPossibleStorageProduction() >= getEnergyRequiredForPowerplantBlackstart()
  339. - currentRenewableProduction()) {// is there currently enough power available from storage?
  340. SPC.setAllStorageToStandy();//TODO: placement
  341. SPC.scheduleDischarging(getEnergyRequiredForPowerplantBlackstart() - currentRenewableProduction(), scheduleKind);
  342. rampUpPowerplant();
  343. enableConsumers(getPowerplantProduction());
  344. return true;
  345. } else {
  346. // blackstart has failed
  347. SPC.setAllStorageToStandy();
  348. println("Not enough storage energy available");
  349. return false;
  350. }
  351. } else {try {
  352. Files.write(file, lines, StandardCharsets.UTF_8);
  353. } catch (IOException e) {
  354. e.printStackTrace();
  355. }
  356. //TODO: disable storage?
  357. // renewable energy production is sufficient for the blackstart
  358. rampUpPowerplant();
  359. enableConsumers(
  360. currentRenewableProduction() - getEnergyRequiredForPowerplantBlackstart() + getPowerplantProduction());
  361. return true;
  362. }
  363. }
  364. private ArrayList<StorageElement> getStorageElements() {
  365. ArrayList<StorageElement> storageElements = new ArrayList<>();
  366. for (HolonObject holonObject : control.getModel().getAllHolonObjectsOnCanvas()) {
  367. for (HolonElement ele : holonObject.getElements()) {
  368. if(ele instanceof StorageElement){
  369. storageElements.add((StorageElement) ele);
  370. }
  371. }
  372. }
  373. return storageElements;
  374. }
  375. private void disableConsumers() {
  376. // TODO: disableBatteryLoading? will ich das wirklich?
  377. // SPC.disableStorageProduction();
  378. for (HolonObject consumer : consumers) {
  379. for (HolonElement ele : consumer.getElements()) {
  380. if (ele.isActive() && ele.isConsumer()) {
  381. ele.setActive(false);
  382. }
  383. }
  384. }
  385. }
  386. private void enableConsumers(float energyAvailable) {
  387. // println("current pp production: " + getPowerplantProduction());
  388. // println("energy available for consumers" + energyAvailable);
  389. // Damit wir immer die gleiche ausgangslage haben //TODO: wirklich?
  390. disableConsumers();
  391. // TODO: das ganze lieber mit prirotaeten
  392. for (HolonObject consumer : consumers) {
  393. for (HolonElement ele : consumer.getElements()) {
  394. if (energyAvailable > 0
  395. && energyAvailable - Math.abs(ele.getEnergyPerElement() * ele.getAmount()) >= 0) {//TODO: getenergy ist hier falsch
  396. if (!ele.isActive()) {
  397. ele.setActive(true);
  398. energyAvailable = energyAvailable - Math.abs(ele.getEnergyPerElement() * ele.getAmount());// +
  399. // since
  400. // its
  401. // negative
  402. }
  403. } else {
  404. return;
  405. }
  406. }
  407. }
  408. }
  409. private void enableAllConsumers() {
  410. for (HolonObject consumer : consumers) {
  411. for (HolonElement ele : consumer.getElements()) {
  412. if (!ele.isActive() && ele.isConsumer()) {
  413. ele.setActive(true);
  414. }
  415. }//TODO: storage?
  416. }
  417. }
  418. private void setRenewableElements(float energy){
  419. for (HolonObject house : renewableProducers) {
  420. for (HolonElement ele : house.getElements()) {
  421. if (ele.getEleName().equals("Solar Panels")) {// TODO: hier muss noch mehr dazu
  422. ele.setEnergyPerElement(
  423. control.getModel().getResistanceCalculator().calcEnergyAfterResistance(
  424. energy,
  425. ele.getLowDistance(),
  426. ele.getHighDistance(),
  427. getEnergyRequiredForPowerplantBlackstart()));
  428. }
  429. }
  430. }
  431. }
  432. private float currentRenewableProduction() {
  433. float production = 0;
  434. for (HolonObject house : renewableProducers) {
  435. for (HolonElement ele : house.getElements()) {
  436. if (ele.getEleName().equals("Solar Panels")) {// TODO: hier muss noch mehr dazu
  437. production = production + ele.getEnergyAtTimeStep(control.getModel().getCurIteration());
  438. }
  439. }
  440. }
  441. return production;
  442. }
  443. private void rampUpPowerplant() {
  444. for (HolonElement ele : powerplant.getElements()) {
  445. if (ele.getEleName().equals("Power")) {
  446. ele.setEnergyPerElement(ele.getEnergyPerElement() + powerplantMaxOutput / blackstartSuccessTime);
  447. }
  448. }
  449. }
  450. private float getPowerplantProduction() {
  451. float totalProduction = 0;
  452. for (HolonElement ele : powerplant.getElements()) {
  453. if (ele.getEleName().equals("Power")) {
  454. totalProduction = ele.getEnergyPerElement();
  455. }
  456. }
  457. return totalProduction;
  458. }
  459. private void disablePowerplantProduction() {
  460. for (HolonElement ele : powerplant.getElements()) {
  461. if (ele.getEleName().equals("Power")) {
  462. ele.setEnergyPerElement(0);
  463. }
  464. }
  465. }
  466. private float getEnergyRequiredForPowerplantBlackstart() {
  467. for (HolonElement ele : powerplant.getElements()) {
  468. if (ele.getEleName().equals("Blackstart")) {
  469. return -ele.getEnergyPerElement();
  470. }
  471. }
  472. return 0;
  473. }
  474. private void setPowerPlantBlackstartResistance(float resistance) {
  475. for (HolonElement ele : powerplant.getElements()) {
  476. if (ele.getEleName().equals("Blackstart")) {
  477. ele.setEnergyPerElement(resistance);
  478. }
  479. }
  480. }
  481. private void activateBlackstart() {
  482. for (HolonElement ele : powerplant.getElements()) {
  483. if (ele.getEleName().equals("Blackstart")) {
  484. ele.setActive(true);
  485. }
  486. }
  487. }
  488. private void deactivateBlackstart() {
  489. for (HolonElement ele : powerplant.getElements()) {
  490. if (ele.getEleName().equals("Blackstart")) {
  491. ele.setActive(false);
  492. }
  493. }
  494. }
  495. private LinkedList<HolonObject> getRenewableProducers() {
  496. LinkedList<HolonObject> list = new LinkedList<>();
  497. for (HolonObject holonObject : control.getModel().getAllHolonObjectsOnCanvas()) {
  498. if (holonObject.getObjName().contentEquals("House")) {// TODO: das reicht so nicht da muss noch gecheckt
  499. // werden ob es renewables gibt
  500. list.add(holonObject);
  501. }
  502. }
  503. return list;
  504. }
  505. private LinkedList<HolonObject> getConsumers() {
  506. LinkedList<HolonObject> list = new LinkedList<>();
  507. for (HolonObject holonObject : control.getModel().getAllHolonObjectsOnCanvas()) {
  508. if (holonObject.getObjName().contentEquals("House")) {// TODO: das reicht so nicht da muss noch gecheckt
  509. // werden ob es consumer gibt
  510. list.add(holonObject);
  511. }
  512. }
  513. return list;
  514. }
  515. private void removeCertainKindOfBatteries(int amount, String kind){
  516. int start = highestAmountOfBatteriesOfCertainKindInALLHouse(kind);
  517. while(amount > 0){
  518. for (HolonObject hO : consumers){
  519. if(numberOfCertainKindOfBatteryPerHouse(hO, kind) == start) {
  520. if (delSingleElem(hO, kind)) {
  521. amount--;
  522. }
  523. }
  524. if(amount == 0){
  525. return;
  526. }
  527. }
  528. start--;
  529. }
  530. }
  531. private boolean delSingleElem(HolonObject hO, String kind){
  532. for(HolonElement ele : hO.getElements()){
  533. if(ele.getEleName().startsWith(kind)){
  534. // control.deleteElementCanvas(hO.getId(),ele.getId());
  535. hO.getElements().remove(ele);
  536. return true;
  537. }
  538. }
  539. return false;
  540. }
  541. private int highestAmountOfBatteriesOfCertainKindInALLHouse(String kind){
  542. int count = 0;
  543. for (HolonObject hO : consumers){
  544. int eleCount = numberOfCertainKindOfBatteryPerHouse(hO, kind);
  545. if(eleCount > count){
  546. count = eleCount;
  547. };
  548. }
  549. return count;
  550. }
  551. private void addCertainKindOfBatteries(int amount, String kind){
  552. int start = 0;
  553. while(amount > 0){
  554. for (HolonObject hO : consumers){
  555. if(numberOfCertainKindOfBatteryPerHouse(hO, kind) <= start){
  556. if(kind.startsWith("Car")){
  557. hO.addElement(new StorageElement(kind + start,
  558. 1,
  559. 0,
  560. control.getModel(),
  561. 75000,
  562. 22000,
  563. 22000));
  564. }else{
  565. hO.addElement(new StorageElement(kind + start,
  566. 1,
  567. 0,
  568. control.getModel(),
  569. 13500,
  570. 46000,
  571. 4600));
  572. }
  573. amount--;
  574. }
  575. if(amount == 0){
  576. return;
  577. }
  578. }
  579. start++;
  580. }
  581. }
  582. private int numberOfCertainKindOfBatteryPerHouse(HolonObject house, String kind){
  583. int count = 0;
  584. for(HolonElement ele : house.getElements()){
  585. if(ele.getEleName().startsWith(kind)){
  586. count++;
  587. }
  588. }
  589. return count;
  590. }
  591. private void writeOutputTxt(){
  592. println("totalSOC: " + SPC.getTotalSoc() + "W/m");
  593. try {
  594. Files.write(file, lines, StandardCharsets.UTF_8);
  595. } catch (IOException e) {
  596. e.printStackTrace();
  597. }
  598. }
  599. private void printCurrentEnergyState(){
  600. println("CURRENT ALGORITHM ITERATION: "+ control.getModel().getCurIteration());
  601. println("blackstart resi: " + getEnergyRequiredForPowerplantBlackstart());
  602. println("renewable: " + currentRenewableProduction());
  603. println("totalnumber of houses: " + totalNumberOfHouses);
  604. println("totalcars: " + SPC.getTotalCarNumber() + " totalhomebatteries: " + SPC.getTotalHomeBatteryNumber());
  605. println("possiblestorage: " + SPC.currentPossibleStorageProduction());
  606. println("totalSOC: " + SPC.getTotalSoc() + "W/m");
  607. for (StorageElement ele :
  608. getStorageElements()) {
  609. println(ele.getEleName() + " " + ele.getId() + ", SOC: " + (ele.getStateOfCharge()/60)/1000 + "kWh,"
  610. + " SOC%: " + ele.getStateOfChargeInPercent() *100 +"%"
  611. /*+ " SOC: " + ele.getStateOfCharge() + " watt/min"*/
  612. // + " nominal power: " + ele.getNominalOutRatio()/1000 + " kW, "
  613. + " OutPower: "+ ele.getCurrentMaxOutRatio()/1000 + " kW,"
  614. + " dist: " + (ele.getLowDistance()+ele.getHighDistance()));
  615. }
  616. }
  617. /**
  618. * To let the User See the current state without touching the Canvas.
  619. */
  620. private void updateVisual() {
  621. // System.out.println("Start updateVisual in Iteration: " + control.getModel().getCurIteration());
  622. control.calculateStateAndVisualForCurrentTimeStep();
  623. control.updateCanvas();
  624. // System.out.println("Finish updateVisual in Iteration: " + control.getModel().getCurIteration());
  625. }
  626. }