1
0

Do a bit SmartControler but regulation won't really work

This commit is contained in:
Rémi Heredero 2023-06-11 18:34:35 +02:00
parent 0fdcbba01b
commit c97d428935
2 changed files with 128 additions and 62 deletions

View File

@ -1,5 +1,7 @@
package ch.hevs.isi;
import ch.hevs.isi.core.DataPoint;
import ch.hevs.isi.core.FloatDataPoint;
import ch.hevs.isi.db.DatabaseConnector;
import ch.hevs.isi.field.FieldConnector;
import ch.hevs.isi.utils.Utility;
@ -124,9 +126,16 @@ public class MinecraftController {
}
if(!stateGrid) {
System.out.println("Grid is not fine");
System.exit(0);
//System.exit(0);
} else {
System.out.println("Grid is fine");
//System.out.println("Grid is fine");
}
FloatDataPoint score = (FloatDataPoint) DataPoint.getDataPointOnListFromLabel("SCORE");
if(score != null) {
if(score.getValue() >= 100) {
System.out.println("Game finished with score: " + score.getValue());
System.exit(0);
}
}
Thread.sleep(SmartControl.TIME_BETWEEN_UPDATES);
}

View File

@ -6,10 +6,12 @@ import ch.hevs.isi.core.FloatDataPoint;
public class SmartControl {
private static final float BATTERY_LEVEL_LOW = 0.1f;
private static final float BATTERY_LEVEL_HIGH = 0.9f;
private static final float BATTERY_POWER_MAX = 2500f;
private static final float BATTERY_LEVEL_LOW = 0.4f;
private static final float BATTERY_LEVEL_HIGH = 0.85f;
private static final float BATTERY_POWER_MAX = 1000f;
private static final float COAL_AMOUNT_DAY = (1f-0.2f)/3f;
private static final float COAL_POWER_MAX = 500f;
private static final float FACTORY_POWER_MAX = 1000f;
private static final float GRID_VOLTAGE_MIN = 750f;
private static final float GRID_VOLTAGE_MAX = 900f;
private static final float GRID_VOLTAGE_NOMINAL = 800f;
@ -17,7 +19,7 @@ public class SmartControl {
private static final float PV_PANEL_NOMINAL = 1000f;
private static final float PV_PANEL_NOMINAL_RAINING = 500f;
public static final long TIME_BETWEEN_UPDATES = 10;
public static final long TIME_BETWEEN_UPDATES = 20;
@ -30,21 +32,6 @@ public class SmartControl {
private FloatDataPoint coalAmount;
private void defineDataPoints(){
clock = (FloatDataPoint) DataPoint.getDataPointOnListFromLabel("CLOCK_FLOAT");
battChrg = (FloatDataPoint) DataPoint.getDataPointOnListFromLabel("BATT_CHRG_FLOAT");
battPwrIn = (FloatDataPoint) DataPoint.getDataPointOnListFromLabel("BATT_P_FLOAT");
remoteCoalSp = (FloatDataPoint) DataPoint.getDataPointOnListFromLabel("REMOTE_COAL_SP");
remoteFactorySp = (FloatDataPoint) DataPoint.getDataPointOnListFromLabel("REMOTE_FACTORY_SP");
coalAmount = (FloatDataPoint) DataPoint.getDataPointOnListFromLabel("COAL_AMOUNT");
gridVoltage = (FloatDataPoint) DataPoint.getDataPointOnListFromLabel("GRID_U_FLOAT");
}
float getValue(FloatDataPoint fdp){
if(fdp == null) return 0f;
return fdp.getValue();
}
// Emergency data points
private FloatDataPoint gridVoltage;
@ -53,16 +40,45 @@ public class SmartControl {
private float igpCoalAmount = 0f;
// Time variables
private int day = 0;
private float previousTime;
final float kpiFactory = 1f;
final float kpiCoal = 1f;
private int day = 2; // TODO : Change to 1
private boolean dayChanged = false;
private float previousCoalAmount = 0f;
private float initialTime;
final float kpiFactory = 0.5f;
final float kpiCoal = 0.5f;
final float kpiCoalBatt = 0.8f;
private void defineDataPoints(){
do {
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
clock = (FloatDataPoint) DataPoint.getDataPointOnListFromLabel("CLOCK_FLOAT");
battChrg = (FloatDataPoint) DataPoint.getDataPointOnListFromLabel("BATT_CHRG_FLOAT");
battPwrIn = (FloatDataPoint) DataPoint.getDataPointOnListFromLabel("BATT_P_FLOAT");
remoteCoalSp = (FloatDataPoint) DataPoint.getDataPointOnListFromLabel("REMOTE_COAL_SP");
remoteFactorySp = (FloatDataPoint) DataPoint.getDataPointOnListFromLabel("REMOTE_FACTORY_SP");
coalAmount = (FloatDataPoint) DataPoint.getDataPointOnListFromLabel("COAL_AMOUNT");
gridVoltage = (FloatDataPoint) DataPoint.getDataPointOnListFromLabel("GRID_U_FLOAT");
System.out.println("Test if data points are defined");
} while (!testIfDataPointsAreDefined());
}
private boolean testIfDataPointsAreDefined(){
if(clock == null) return false;
if(battChrg == null) return false;
if(battPwrIn == null) return false;
if(remoteCoalSp == null) return false;
if(remoteFactorySp == null) return false;
if(coalAmount == null) return false;
if(gridVoltage == null) return false;
return true;
}
private float getTimeOfTheDay(){
float timeOfTheDay = getValue(clock);
float timeOfTheDay = clock.getValue();
timeOfTheDay %= 1;
timeOfTheDay *= 24;
return timeOfTheDay;
@ -74,9 +90,9 @@ public class SmartControl {
FloatDataPoint wind = (FloatDataPoint) DataPoint.getDataPointOnListFromLabel("WIND_P_FLOAT");
FloatDataPoint coal = (FloatDataPoint) DataPoint.getDataPointOnListFromLabel("COAL_P_FLOAT");
producerPower += getValue(solar);
producerPower += getValue(wind);
producerPower += getValue(coal);
producerPower += solar.getValue();
producerPower += wind.getValue();
producerPower += coal.getValue();
return producerPower;
}
@ -87,9 +103,9 @@ public class SmartControl {
FloatDataPoint factory = (FloatDataPoint) DataPoint.getDataPointOnListFromLabel("FACTORY_P_FLOAT");
FloatDataPoint bunker = (FloatDataPoint) DataPoint.getDataPointOnListFromLabel("BUNKER_P_FLOAT");
consumerPower += getValue(home);
consumerPower += getValue(factory);
consumerPower += getValue(bunker);
consumerPower += home.getValue();
consumerPower += factory.getValue();
consumerPower += bunker.getValue();
return consumerPower;
}
@ -97,23 +113,23 @@ public class SmartControl {
boolean gridIsFine = true;
// Grid voltage is too high
if(getValue(gridVoltage) > (GRID_VOLTAGE_MAX-GRID_VOLTAGE_TOLERANCE)) {
if(gridVoltage.getValue() > (GRID_VOLTAGE_MAX-GRID_VOLTAGE_TOLERANCE)) {
gridIsFine = false;
new BooleanDataPoint("SOLAR_CONNECT_ST", true).setValue(false);
new BooleanDataPoint("WIND_CONNECT_ST", true).setValue(false);
remoteCoalSp.setValue(0f);
if(getValue(gridVoltage) > GRID_VOLTAGE_MAX) {
if(gridVoltage.getValue() > GRID_VOLTAGE_MAX) {
remoteFactorySp.setValue(1f);
}
}
// Grid voltage is too low
if(getValue(gridVoltage) < (GRID_VOLTAGE_MIN+GRID_VOLTAGE_TOLERANCE)) {
if(gridVoltage.getValue() < (GRID_VOLTAGE_MIN+GRID_VOLTAGE_TOLERANCE)) {
gridIsFine = false;
new BooleanDataPoint("SOLAR_CONNECT_ST", true).setValue(true);
new BooleanDataPoint("WIND_CONNECT_ST", true).setValue(true);
remoteCoalSp.setValue(1f);
if(getValue(gridVoltage) < GRID_VOLTAGE_MIN) {
if(gridVoltage.getValue() < GRID_VOLTAGE_MIN) {
remoteFactorySp.setValue(0f);
}
}
@ -176,57 +192,96 @@ public class SmartControl {
default:
break;
}
igpCoalAmountForTheDay += day;
igpCoalAmountForTheDay += (3-day);
igpCoalAmountForTheDay /= 3f;
igpCoalAmount = igpCoalAmountForTheDay;
}
public SmartControl() {
defineDataPoints();
previousTime = getTimeOfTheDay();
// start the solar and wind power plants
new BooleanDataPoint("REMOTE_SOLAR_SW", true).setValue(true);
new BooleanDataPoint("REMOTE_WIND_SW", true).setValue(true);
new FloatDataPoint("REMOTE_COAL_SP", true).setValue(0f);
new FloatDataPoint("REMOTE_FACTORY_SP", true).setValue(0f);
defineDataPoints();
initialTime = getTimeOfTheDay();
}
public boolean run() {
defineDataPoints();
float spCoal = getValue(remoteCoalSp);
float spFactory = getValue(remoteFactorySp);
float spCoal = remoteCoalSp.getValue();
float spFactory = remoteFactorySp.getValue();
if (getTimeOfTheDay() < previousTime) {
previousTime = getTimeOfTheDay();
if (getTimeOfTheDay() < 1f && !dayChanged) {
dayChanged = true;
day++;
day %= 3;
}
if (getPeriodOfDay() > 23f) {
dayChanged = false;
}
if(coalAmount.getValue() > previousCoalAmount) {
day = 1;
}
defineIGPbatteryLevel();
defineIGPcoalAmount(day);
if (getValue(battChrg) < igpBatteryLevel) {
spFactory -= (igpBatteryLevel - getValue(battChrg)) * kpiFactory;
spCoal += (igpBatteryLevel - getValue(battChrg)) * kpiCoal;
new FloatDataPoint("IGP_BATTERY_LEVEL", true).setValue(igpBatteryLevel);
new FloatDataPoint("IGP_COAL_AMOUNT", true).setValue(igpCoalAmount);
String debug = "Day " + day + " - ";
//debug += "IGP battery level: " + igpBatteryLevel;
//debug += " IGP coal amount: " + igpCoalAmount;
// debug += " - ";
float battDiff = battChrg.getValue() - igpBatteryLevel;
new FloatDataPoint("BATT_DIFF", true).setValue(battDiff);
debug += "Batt. diff.: " + battDiff + " - ";
float igpEnergyBattery = battDiff * BATTERY_POWER_MAX / 0.4f; // Over energy in battery
new FloatDataPoint("IGP_ENERGY_BATTERY", true).setValue(igpEnergyBattery);
debug += "IGP en. batt.: " + igpEnergyBattery + " - ";
float powerDiff = getProducerPower() - getConsumerPower();
new FloatDataPoint("POWER_DIFF", true).setValue(powerDiff);
debug += "Power diff: " + powerDiff + " - ";
float balance = powerDiff + igpEnergyBattery; // Energy to use
new FloatDataPoint("BALANCE", true).setValue(balance);
debug += "Balance: " + balance + " - ";
float coalDiff = coalAmount.getValue() - igpCoalAmount; // Over coal in storage
new FloatDataPoint("COAL_DIFF", true).setValue(coalDiff);
//debug += "Coal diff.: " + coalDiff + " - ";
if(balance < 0){ // Produce more energy or consume less
if(coalDiff > 0){ // Produce more energy
spCoal += kpiCoal * (balance / COAL_POWER_MAX);
debug += "Produce more energy";
} else { // Consume less energy
spFactory -= kpiFactory * (balance / FACTORY_POWER_MAX);
debug += "Consume less energy";
}
} else { // Produce less energy or consume more
if(coalDiff > 0){ // Produce less energy
spCoal -= kpiCoal * (balance / COAL_POWER_MAX);
debug += "Produce less energy";
} else { // Consume more energy
spFactory += kpiFactory * (balance / FACTORY_POWER_MAX);
debug += "Consume more energy";
}
}
if (getValue(battChrg) > igpBatteryLevel) {
spFactory += (getValue(battChrg) - igpBatteryLevel) * kpiFactory;
spCoal -= (getValue(battChrg) - igpBatteryLevel) * kpiCoal;
}
if (getValue(coalAmount) < igpCoalAmount) {
spFactory -= (igpCoalAmount - getValue(coalAmount)) * kpiFactory;
spCoal += (igpCoalAmount - getValue(coalAmount)) * kpiCoal;
}
if (getValue(coalAmount) > igpCoalAmount) {
spFactory += (getValue(coalAmount) - igpCoalAmount) * kpiFactory;
spCoal -= (getValue(coalAmount) - igpCoalAmount) * kpiCoal;
}
if (spFactory > 1f) spFactory = 1f;
if (spFactory < 0f) spFactory = 0f;
@ -236,6 +291,8 @@ public class SmartControl {
remoteFactorySp.setValue(spFactory);
remoteCoalSp.setValue(spCoal);
System.out.println(debug);
return checkIfGridIsFine();
}
}