processing simplified (processNewWeekForecasts removed)

add option to specify inverter as central inverter and apply limits when summarizing in adapter
#24
This commit is contained in:
woheller69 2024-07-13 06:59:04 +02:00
parent 2974b4b156
commit 5337da4e67
18 changed files with 79 additions and 92 deletions

View file

@ -19,12 +19,13 @@ public class SolarPowerPlant {
double diffuseEfficiency;
double inverterPowerLimit;
double inverterEfficiency;
boolean isCentralInverter;
double azimuthAngle;
double tiltAngle;
private final int[] shadingElevation;
private final int[] shadingOpacity;
public SolarPowerPlant(double latitude, double longitude, double cellsMaxPower, double cellsArea, double cellsEfficiency, double cellsTempCoeff, double diffuseEfficiency, double inverterPowerLimit, double inverterEfficiency, double azimuthAngle, double tiltAngle, int[] shadingElevation, int[] shadingOpacity, double albedo ) {
public SolarPowerPlant(double latitude, double longitude, double cellsMaxPower, double cellsArea, double cellsEfficiency, double cellsTempCoeff, double diffuseEfficiency, double inverterPowerLimit, double inverterEfficiency,boolean isCentralInverter, double azimuthAngle, double tiltAngle, int[] shadingElevation, int[] shadingOpacity, double albedo ) {
this.albedo = albedo;
this.latitude = latitude;
this.longitude = longitude;
@ -39,6 +40,7 @@ public class SolarPowerPlant {
this.shadingElevation = shadingElevation;
this.shadingOpacity = shadingOpacity;
this.cellsTempCoeff = cellsTempCoeff / 100;
this.isCentralInverter = isCentralInverter;
}
@ -111,7 +113,11 @@ public class SolarPowerPlant {
dcPower = totalRadiationOnCell/1000 * (1+(cellTemperature - 25)*cellsTempCoeff) * cellsMaxPower;
}
double acPower = Math.min(dcPower * inverterEfficiency, inverterPowerLimit);
double acPower;
if (!isCentralInverter)
acPower = Math.min(dcPower * inverterEfficiency, inverterPowerLimit);
else
acPower = dcPower * inverterEfficiency; //do limiting on system level
return (float) acPower;
}

View file

@ -219,12 +219,7 @@ public class ForecastCityActivity extends NavigationActivity implements IUpdatea
}
@Override
public void processNewWeekForecasts(List<WeekForecast> forecasts) {
stopRefreshAnimation();
}
@Override
public void processNewForecasts(List<HourlyForecast> hourlyForecasts) {
public void processNewForecasts(List<HourlyForecast> hourlyForecasts, List<WeekForecast> weekForecasts) {
stopRefreshAnimation();
}

View file

@ -18,6 +18,7 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
@ -202,6 +203,7 @@ public class ManageLocationsActivity extends NavigationActivity {
EditText editAlbedo = (EditText) dialogView.findViewById(R.id.EditLocation_Albedo);
EditText editInverterPowerLimit = (EditText) dialogView.findViewById(R.id.EditLocation_Inverter_Power_Limit);
EditText editInverterEfficiency = (EditText) dialogView.findViewById(R.id.EditLocation_Inverter_Efficiency);
CheckBox editIsCentralInverter = (CheckBox) dialogView.findViewById(R.id.EditLocation_Central_Inverter);
TextView currentAzimuth = (TextView) dialogView.findViewById(R.id.edit_current_azi_ele);
Long time = System.currentTimeMillis()/1000;
@ -251,6 +253,7 @@ public class ManageLocationsActivity extends NavigationActivity {
editAlbedo.setFilters(new InputFilter[]{ new InputFilterMinMax(0,1)});
editInverterPowerLimit.setText(Float.toString(city.getInverterPowerLimit()));
editInverterEfficiency.setText(Float.toString(city.getInverterEfficiency()));
editIsCentralInverter.setChecked(city.isCentralInverter());
editInverterEfficiency.setFilters(new InputFilter[]{ new InputFilterMinMax(0, 100)});
editTilt.addTextChangedListener(new TextWatcher() {
@Override
@ -285,6 +288,7 @@ public class ManageLocationsActivity extends NavigationActivity {
Float.parseFloat(editAlbedo.getText().toString().isEmpty() ? "0" : editAlbedo.getText().toString()),
Float.parseFloat(editInverterPowerLimit.getText().toString().isEmpty() ? "0" : editInverterPowerLimit.getText().toString()),
Float.parseFloat(editInverterEfficiency.getText().toString().isEmpty() ? "0" : editInverterEfficiency.getText().toString()),
editIsCentralInverter.isChecked(),
shadingElevation,
shadingOpacity
);
@ -321,6 +325,7 @@ public class ManageLocationsActivity extends NavigationActivity {
Float.parseFloat(editAlbedo.getText().toString().isEmpty() ? "0" : editAlbedo.getText().toString()),
Float.parseFloat(editInverterPowerLimit.getText().toString().isEmpty() ? "0" : editInverterPowerLimit.getText().toString()),
Float.parseFloat(editInverterEfficiency.getText().toString().isEmpty() ? "0" : editInverterEfficiency.getText().toString()),
editIsCentralInverter.isChecked(),
shadingElevation,
shadingOpacity
);

View file

@ -24,6 +24,7 @@ public class CityToWatch {
private float azimuthAngle;
private float tiltAngle;
private float albedo;
private boolean isCentralInverter;
private int rank;
private int[] shadingElevation = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
private int[] shadingOpacity = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
@ -147,6 +148,11 @@ public class CityToWatch {
this.inverterPowerLimit = inverterPowerLimit;
}
public void setIsCentralInverter(boolean isCentralInverter) {
this.isCentralInverter = isCentralInverter;
}
public boolean isCentralInverter() {return isCentralInverter;}
public void setDiffuseEfficiency(float diffuseEfficiency) {
this.diffuseEfficiency = diffuseEfficiency;
}

View file

@ -20,7 +20,7 @@ import static androidx.core.app.JobIntentService.enqueueWork;
*/
public class SQLiteHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 3;
private static final int DATABASE_VERSION = 4;
private Context context;
private List<City> allCities = new ArrayList<>();
@ -55,6 +55,7 @@ public class SQLiteHelper extends SQLiteOpenHelper {
private static final String CITIES_TO_WATCH_SHADING_OPACITY = "shading_opacity";
private static final String CITIES_TO_WATCH_CELLS_TEMP_COEFF = "cells_temp_coeff";
private static final String CITIES_TO_WATCH_ALBEDO = "albedo";
private static final String CITIES_TO_WATCH_IS_CENTRAL_INVERTER = "is_central_inverter";
//Names of columns in TABLE_FORECAST
private static final String FORECAST_ID = "forecast_id";
@ -139,7 +140,8 @@ public class SQLiteHelper extends SQLiteOpenHelper {
CITIES_TO_WATCH_SHADING_ELEVATION + " VARCHAR(255) NOT NULL," +
CITIES_TO_WATCH_SHADING_OPACITY + " VARCHAR(255) NOT NULL," +
CITIES_TO_WATCH_CELLS_TEMP_COEFF + " REAL NOT NULL," +
CITIES_TO_WATCH_ALBEDO + " REAL NOT NULL)";
CITIES_TO_WATCH_ALBEDO + " REAL NOT NULL," +
CITIES_TO_WATCH_IS_CENTRAL_INVERTER + " INTEGER)";
public static SQLiteHelper getInstance(Context context) {
if (instance == null && context != null) {
@ -170,6 +172,8 @@ public class SQLiteHelper extends SQLiteOpenHelper {
// we want both updates, so no break statement here...
case 2:
db.execSQL("ALTER TABLE "+TABLE_CITIES_TO_WATCH+" ADD COLUMN "+CITIES_TO_WATCH_ALBEDO+" REAL DEFAULT 0");
case 3:
db.execSQL("ALTER TABLE "+TABLE_CITIES_TO_WATCH+" ADD COLUMN "+CITIES_TO_WATCH_IS_CENTRAL_INVERTER+" INTEGER DEFAULT 0");
}
}
@ -199,6 +203,7 @@ public class SQLiteHelper extends SQLiteOpenHelper {
values.put(CITIES_TO_WATCH_SHADING_OPACITY,city.getShadingOpacityString());
values.put(CITIES_TO_WATCH_CELLS_TEMP_COEFF,city.getCellsTempCoeff());
values.put(CITIES_TO_WATCH_ALBEDO,city.getAlbedo());
values.put(CITIES_TO_WATCH_IS_CENTRAL_INVERTER,city.isCentralInverter() ? 1 : 0);
long id=database.insert(TABLE_CITIES_TO_WATCH, null, values);
@ -234,6 +239,7 @@ public class SQLiteHelper extends SQLiteOpenHelper {
", " + CITIES_TO_WATCH_SHADING_OPACITY +
", " + CITIES_TO_WATCH_CELLS_TEMP_COEFF +
", " + CITIES_TO_WATCH_ALBEDO +
", " + CITIES_TO_WATCH_IS_CENTRAL_INVERTER +
", " + CITIES_TO_WATCH_COLUMN_RANK +
" FROM " + TABLE_CITIES_TO_WATCH +
" WHERE " + CITIES_TO_WATCH_CITY_ID + " = ?", arguments);
@ -258,7 +264,8 @@ public class SQLiteHelper extends SQLiteOpenHelper {
cityToWatch.setShadingOpacity(cursor.getString(14));
cityToWatch.setCellsTempCoeff(Float.parseFloat(cursor.getString(15)));
cityToWatch.setAlbedo(Float.parseFloat(cursor.getString(16)));
cityToWatch.setRank(Integer.parseInt(cursor.getString(17)));
cityToWatch.setIsCentralInverter(Integer.parseInt(cursor.getString(17)) == 1);
cityToWatch.setRank(Integer.parseInt(cursor.getString(18)));
cursor.close();
}
@ -291,6 +298,7 @@ public class SQLiteHelper extends SQLiteOpenHelper {
", " + CITIES_TO_WATCH_SHADING_OPACITY +
", " + CITIES_TO_WATCH_CELLS_TEMP_COEFF +
", " + CITIES_TO_WATCH_ALBEDO +
", " + CITIES_TO_WATCH_IS_CENTRAL_INVERTER +
", " + CITIES_TO_WATCH_COLUMN_RANK +
" FROM " + TABLE_CITIES_TO_WATCH
, new String[]{});
@ -317,7 +325,8 @@ public class SQLiteHelper extends SQLiteOpenHelper {
cityToWatch.setShadingOpacity(cursor.getString(14));
cityToWatch.setCellsTempCoeff(Float.parseFloat(cursor.getString(15)));
cityToWatch.setAlbedo(Float.parseFloat(cursor.getString(16)));
cityToWatch.setRank(Integer.parseInt(cursor.getString(17)));
cityToWatch.setIsCentralInverter(Integer.parseInt(cursor.getString(17)) == 1);
cityToWatch.setRank(Integer.parseInt(cursor.getString(18)));
cityToWatchList.add(cityToWatch);
} while (cursor.moveToNext());
@ -349,6 +358,7 @@ public class SQLiteHelper extends SQLiteOpenHelper {
values.put(CITIES_TO_WATCH_SHADING_OPACITY,cityToWatch.getShadingOpacityString());
values.put(CITIES_TO_WATCH_CELLS_TEMP_COEFF,cityToWatch.getCellsTempCoeff());
values.put(CITIES_TO_WATCH_ALBEDO,cityToWatch.getAlbedo());
values.put(CITIES_TO_WATCH_IS_CENTRAL_INVERTER,cityToWatch.isCentralInverter() ? 1 : 0);
database.update(TABLE_CITIES_TO_WATCH, values, CITIES_TO_WATCH_ID + " = ?",
new String[]{String.valueOf(cityToWatch.getId())});

View file

@ -12,6 +12,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.db.chart.Tools;
import com.db.chart.model.BarSet;
@ -62,27 +63,30 @@ public class CityWeatherAdapter extends RecyclerView.Adapter<CityWeatherAdapter.
List<HourlyForecast> hourlyForecasts = database.getForecastsByCityId(generalDataList.getCity_id());
List<WeekForecast> weekforecasts = database.getWeekForecastsByCityId(generalDataList.getCity_id());
updateForecastData(hourlyForecasts);
updateWeekForecastData(weekforecasts);
updateForecastData(hourlyForecasts, weekforecasts);
}
// function update 3-hour or 1-hour forecast list
public void updateForecastData(List<HourlyForecast> hourlyForecasts) {
if (hourlyForecasts.isEmpty()) return;
public void updateForecastData(List<HourlyForecast> hourlyForecasts, List<WeekForecast> weekForecasts) {
if (hourlyForecasts.isEmpty() || weekForecasts.isEmpty()) return;
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
int cityId = hourlyForecasts.get(0).getCity_id();
SQLiteHelper dbHelper = SQLiteHelper.getInstance(context.getApplicationContext());
CityToWatch requestedCity = dbHelper.getCityToWatch(cityId);
Float centralInverterLimit = requestedCity.isCentralInverter() ? requestedCity.getInverterPowerLimit() : 0;
if (sp.getBoolean("pref_summarize",false)){
int cityId = hourlyForecasts.get(0).getCity_id();
ArrayList<Integer> CityIDList = new ArrayList<Integer>();
SQLiteHelper dbHelper = SQLiteHelper.getInstance(context.getApplicationContext());
hourlyForecasts = dbHelper.getForecastsByCityId(cityId); //get fresh values from database to make sure we do add new values to sum values from last update
List<CityToWatch> citiesToWatch = dbHelper.getAllCitiesToWatch();
CityToWatch requestedCity = dbHelper.getCityToWatch(cityId);
for (int i = 0; i < citiesToWatch.size(); i++) {
CityToWatch city = citiesToWatch.get(i);
if (city.getCityId()!=requestedCity.getCityId() && city.getLatitude() == requestedCity.getLatitude() && city.getLongitude() == requestedCity.getLongitude()) {
CityIDList.add(city.getCityId());
if (city.isCentralInverter()) centralInverterLimit += city.getInverterPowerLimit();
}
}
if (CityIDList.size()>0){
@ -97,6 +101,7 @@ public class CityWeatherAdapter extends RecyclerView.Adapter<CityWeatherAdapter.
}
}
Toast.makeText(context, "Central Inverter Limit: "+centralInverterLimit, Toast.LENGTH_SHORT).show();
courseDayList = new ArrayList<>();
float energyCumulated=0;
@ -104,6 +109,7 @@ public class CityWeatherAdapter extends RecyclerView.Adapter<CityWeatherAdapter.
int stepCounter = 0; // Counter to track the number of steps taken in the loop
for (HourlyForecast f : hourlyForecasts) {
if (centralInverterLimit>0) f.setPower(Math.min(f.getPower(),centralInverterLimit)); //apply central inverter limit if there is one
float power = f.getPower();
if (stepCounter > 0) energyCumulated += power; //Ignore first value because power values are for preceding hour
f.setEnergyCum(energyCumulated);
@ -119,47 +125,25 @@ public class CityWeatherAdapter extends RecyclerView.Adapter<CityWeatherAdapter.
energyCumulated = 0;
}
}
notifyDataSetChanged();
//Now calculate weekForecasts from hourlyForecasts
for (WeekForecast weekForecast: weekForecasts){
float totalEnergy = 0;
long timeNoon = weekForecast.getForecastTime();
for (HourlyForecast hourlyForecast: hourlyForecasts){
if ((hourlyForecast.getForecastTime()>=timeNoon-11*3600*1000L) && (hourlyForecast.getForecastTime()< timeNoon + 13*3600*1000L)){ //values are for preceding hour!
totalEnergy+=hourlyForecast.getPower();
}
}
weekForecast.setEnergyDay(totalEnergy/1000);
}
// function for week forecast list
public void updateWeekForecastData(List<WeekForecast> forecasts) {
if (forecasts.isEmpty()) return;
int cityId = forecasts.get(0).getCity_id();
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
if (sp.getBoolean("pref_summarize",false)){
ArrayList<Integer> CityIDList = new ArrayList<Integer>();
SQLiteHelper dbHelper = SQLiteHelper.getInstance(context.getApplicationContext());
forecasts = dbHelper.getWeekForecastsByCityId(cityId); //get fresh values from database to make sure we do add new values to sum values from last update
List<CityToWatch> citiesToWatch = dbHelper.getAllCitiesToWatch();
CityToWatch requestedCity = dbHelper.getCityToWatch(cityId);
for (int i = 0; i < citiesToWatch.size(); i++) {
CityToWatch city = citiesToWatch.get(i);
if (city.getCityId()!=requestedCity.getCityId() && city.getLatitude() == requestedCity.getLatitude() && city.getLongitude() == requestedCity.getLongitude()) {
CityIDList.add(city.getCityId());
}
}
if (CityIDList.size()>0){
for (int c=0; c<CityIDList.size();c++) {
int iteratorCityId = CityIDList.get(c);
List<WeekForecast> wfc = dbHelper.getWeekForecastsByCityId(iteratorCityId);
if (wfc.size() != forecasts.size()) break; //maybe something went wrong during update or city is not yet updated
for (int i=0;i<wfc.size();i++){
forecasts.get(i).setEnergyDay(forecasts.get(i).getEnergyDay()+wfc.get(i).getEnergyDay());
}
}
}
}
weekForecastList = forecasts;
weekForecastList = weekForecasts;
notifyDataSetChanged();
}
static class ViewHolder extends RecyclerView.ViewHolder {
ViewHolder(View v) {
super(v);

View file

@ -128,7 +128,7 @@ public class RecyclerOverviewListAdapter extends RecyclerView.Adapter<ItemViewHo
public CityToWatch getCitytoWatch(int position){
return cities.get(position);
}
public void updateCity(CityToWatch cityToWatch, String cityName, float latitude, float longitude, float azimuth, float tilt, float cellsMaxPower, float cellsArea, float cellsEfficiency, float cellsTempCoeff, float diffuseEfficiency, float albedo, float inverterPowerLimit, float inverterEfficiency, int[] shadingElevation, int[] shadingOpacity) {
public void updateCity(CityToWatch cityToWatch, String cityName, float latitude, float longitude, float azimuth, float tilt, float cellsMaxPower, float cellsArea, float cellsEfficiency, float cellsTempCoeff, float diffuseEfficiency, float albedo, float inverterPowerLimit, float inverterEfficiency, boolean isCentralInverter, int[] shadingElevation, int[] shadingOpacity) {
cityToWatch.setCityName(cityName);
cityToWatch.setLatitude(latitude);
cityToWatch.setLongitude(longitude);
@ -142,6 +142,7 @@ public class RecyclerOverviewListAdapter extends RecyclerView.Adapter<ItemViewHo
cityToWatch.setAlbedo(albedo);
cityToWatch.setInverterPowerLimit(inverterPowerLimit);
cityToWatch.setInverterEfficiency(inverterEfficiency);
cityToWatch.setIsCentralInverter(isCentralInverter);
cityToWatch.setShadingElevation(shadingElevation);
cityToWatch.setShadingOpacity(shadingOpacity);
database.updateCityToWatch(cityToWatch);

View file

@ -128,19 +128,10 @@ public class WeatherCityFragment extends Fragment implements IUpdateableCityUI {
}
@Override
public void processNewForecasts(List<HourlyForecast> hourlyForecasts) {
public void processNewForecasts(List<HourlyForecast> hourlyForecasts, List<WeekForecast> weekForecasts) {
if (hourlyForecasts != null && hourlyForecasts.size() > 0 && hourlyForecasts.get(0).getCity_id() == mCityId) {
if (mAdapter != null) {
mAdapter.updateForecastData(hourlyForecasts);
}
}
}
@Override
public void processNewWeekForecasts(List<WeekForecast> forecasts) {
if (forecasts != null && forecasts.size() > 0 && forecasts.get(0).getCity_id() == mCityId) {
if (mAdapter != null) {
mAdapter.updateWeekForecastData(forecasts);
mAdapter.updateForecastData(hourlyForecasts, weekForecasts);
}
}
}

View file

@ -12,7 +12,6 @@ import java.util.List;
public interface IUpdateableCityUI {
void processNewGeneralData(GeneralData data);
void processNewForecasts(List<HourlyForecast> hourlyForecasts);
void processNewForecasts(List<HourlyForecast> hourlyForecasts, List<WeekForecast> weekForecasts);
void processNewWeekForecasts(List<WeekForecast> forecasts);
}

View file

@ -31,17 +31,11 @@ public class ViewUpdater {
}
}
public static void updateWeekForecasts(List<WeekForecast> forecasts) {
ArrayList<IUpdateableCityUI> subcopy = new ArrayList<>(subscribers);
for (IUpdateableCityUI sub : subcopy) {
sub.processNewWeekForecasts(forecasts);
}
}
public static void updateForecasts(List<HourlyForecast> hourlyForecasts) {
public static void updateForecasts(List<HourlyForecast> hourlyForecasts, List<WeekForecast> weekForecasts) {
ArrayList<IUpdateableCityUI> subcopy = new ArrayList<>(subscribers);
for (IUpdateableCityUI sub : subcopy) {
sub.processNewForecasts(hourlyForecasts);
sub.processNewForecasts(hourlyForecasts, weekForecasts);
}
}
}

View file

@ -118,14 +118,10 @@ public class WeatherPagerAdapter extends FragmentStateAdapter implements IUpdate
}
@Override
public void processNewForecasts(List<HourlyForecast> hourlyForecasts) {
public void processNewForecasts(List<HourlyForecast> hourlyForecasts, List<WeekForecast> weekForecasts) {
//empty because Fragments are subscribers themselves
}
@Override
public void processNewWeekForecasts(List<WeekForecast> forecasts) {
//empty because Fragments are subscribers themselves
}
public int getCityIDForPos(int pos) {
CityToWatch city = cities.get(pos);

View file

@ -75,7 +75,7 @@ public class OMDataExtractor implements IDataExtractor {
SQLiteHelper dbhelper = SQLiteHelper.getInstance(context);
CityToWatch city = dbhelper.getCityToWatch(cityID);
SolarPowerPlant spp = new SolarPowerPlant(city.getLatitude(), city.getLongitude(), city.getCellsMaxPower(), city.getCellsArea(), city.getCellsEfficiency(), city.getCellsTempCoeff(), city.getDiffuseEfficiency(), city.getInverterPowerLimit(), city.getInverterEfficiency(), city.getAzimuthAngle(), city.getTiltAngle(), city.getShadingElevation(), city.getShadingOpacity(), city.getAlbedo());
SolarPowerPlant spp = new SolarPowerPlant(city.getLatitude(), city.getLongitude(), city.getCellsMaxPower(), city.getCellsArea(), city.getCellsEfficiency(), city.getCellsTempCoeff(), city.getDiffuseEfficiency(), city.getInverterPowerLimit(), city.getInverterEfficiency(), city.isCentralInverter(), city.getAzimuthAngle(), city.getTiltAngle(), city.getShadingElevation(), city.getShadingOpacity(), city.getAlbedo());
IApiToDatabaseConversion conversion = new OMToDatabaseConversion();

View file

@ -141,8 +141,7 @@ public class ProcessOMweatherAPIRequest implements IProcessHttpRequest {
dbHelper.addWeekForecasts(weekforecasts);
if (c == CityIDList.size()-1) ViewUpdater.updateGeneralDataData(generalData); // Call Viewupdater if last (requested) city is updated
if (c == CityIDList.size()-1) ViewUpdater.updateWeekForecasts(weekforecasts);
if (c == CityIDList.size()-1) ViewUpdater.updateForecasts(hourlyforecasts);
if (c == CityIDList.size()-1) ViewUpdater.updateForecasts(hourlyforecasts, weekforecasts);
} catch (JSONException e) {
e.printStackTrace();
@ -194,17 +193,6 @@ public class ProcessOMweatherAPIRequest implements IProcessHttpRequest {
}
}
for (WeekForecast weekForecast: weekforecasts){
float totalEnergy = 0;
Long timeNoon = weekForecast.getForecastTime();
for (HourlyForecast hourlyForecast: hourlyforecasts){
if ((hourlyForecast.getForecastTime()>=timeNoon-11*3600*1000L) && (hourlyForecast.getForecastTime()< timeNoon + 13*3600*1000L)){ //values are for preceding hour!
totalEnergy+=hourlyForecast.getPower();
}
}
weekForecast.setEnergyDay(totalEnergy/1000);
}
return weekforecasts;
}

View file

@ -168,7 +168,15 @@
android:layout_height="wrap_content"
android:inputType="numberDecimal"
android:hint="@string/edit_location_hint_inverter_efficiency"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
android:hint="@string/edit_location_hint_central_inverter"/>
<CheckBox
android:id="@+id/EditLocation_Central_Inverter"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<LinearLayout
android:id="@+id/edit_Location_shading"
android:layout_width="match_parent"

View file

@ -110,4 +110,5 @@
<string name="edit_location_hint_albedo">Albedo [0..1]</string>
<string name="settings_server_urls">Server URLs</string>
<string name="settings_server_summary">Nur ändern, wenn Sie Ihre eigenen Server betreiben wollen</string>
<string name="edit_location_hint_central_inverter">Zentralwechselrichter</string>
</resources>

View file

@ -113,5 +113,6 @@
<string name="github" translatable="false">GitHub</string>
<string name="settings_server_urls">Server URLs</string>
<string name="settings_server_summary">Cambia solo se vuoi ospitare un tuo server</string>
<string name="edit_location_hint_central_inverter">Invertitore centrale</string>
</resources>

View file

@ -109,4 +109,5 @@
<string name="edit_location_hint_albedo">Albedo [0..1]</string>
<string name="settings_server_urls">Sunucu URL\'leri</string>
<string name="settings_server_summary">Yalnızca kendi sunucularınızı barındırmak istiyorsanız değiştirin</string>
<string name="edit_location_hint_central_inverter">Merkezi invertör</string>
</resources>

View file

@ -113,5 +113,6 @@
<string name="github" translatable="false">GitHub</string>
<string name="settings_server_urls">Server URLs</string>
<string name="settings_server_summary">Only change if you want to host your own servers</string>
<string name="edit_location_hint_central_inverter">Central Inverter</string>
</resources>