Compare commits
23 commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
10aced4a5d | ||
![]() |
02b78a99c9 | ||
![]() |
10f7c2f9f5 | ||
![]() |
09eef2bee4 | ||
![]() |
8479bcd741 | ||
![]() |
972de5739d | ||
![]() |
786e9c27a5 | ||
![]() |
9ab548b9ee | ||
![]() |
5337da4e67 | ||
![]() |
2974b4b156 | ||
![]() |
71e9cbe08d | ||
![]() |
786635b7b8 | ||
![]() |
87905209b6 | ||
![]() |
a4b936ac79 | ||
![]() |
0d53115e68 | ||
![]() |
5039510970 | ||
![]() |
117adab1c6 | ||
![]() |
836376d7dd | ||
![]() |
5b43313882 | ||
![]() |
62321e0e4f | ||
![]() |
d586517236 | ||
![]() |
84224c863f | ||
![]() |
975065f84f |
26
README.md
|
@ -1,5 +1,10 @@
|
||||||
<pre>Send a coffee to woheller69@t-online.de
|
<pre>Send a coffee to
|
||||||
<a href= "https://www.paypal.com/signin"><img align="left" src="https://www.paypalobjects.com/webstatic/de_DE/i/de-pp-logo-150px.png"></a></pre>
|
woheller69@t-online.de
|
||||||
|
<a href= "https://www.paypal.com/signin"><img align="left" src="https://www.paypalobjects.com/webstatic/de_DE/i/de-pp-logo-150px.png"></a>
|
||||||
|
|
||||||
|
|
||||||
|
Or via this link (with fees)
|
||||||
|
<a href="https://www.paypal.com/donate?hosted_button_id=XVXQ54LBLZ4AA"><img align="left" src="https://img.shields.io/badge/Donate%20with%20Debit%20or%20Credit%20Card-002991?style=plastic"></a></pre>
|
||||||
|
|
||||||
|
|
||||||
| **RadarWeather** | **Gas Prices** | **Smart Eggtimer** |
|
| **RadarWeather** | **Gas Prices** | **Smart Eggtimer** |
|
||||||
|
@ -9,10 +14,14 @@
|
||||||
| [<img src="https://github.com/woheller69/Level/blob/master/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.level/) | [<img src="https://github.com/woheller69/audiometry/blob/new/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.audiometry/) | [<img src="https://github.com/woheller69/gpscockpit/blob/master/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.gpscockpit/) |
|
| [<img src="https://github.com/woheller69/Level/blob/master/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.level/) | [<img src="https://github.com/woheller69/audiometry/blob/new/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.audiometry/) | [<img src="https://github.com/woheller69/gpscockpit/blob/master/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.gpscockpit/) |
|
||||||
| **Audio Analyzer** | **LavSeeker** | **TimeLapseCam** |
|
| **Audio Analyzer** | **LavSeeker** | **TimeLapseCam** |
|
||||||
| [<img src="https://github.com/woheller69/audio-analyzer-for-android/blob/master/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.audio_analyzer_for_android/) |[<img src="https://github.com/woheller69/lavatories/blob/master/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.lavatories/) | [<img src="https://github.com/woheller69/TimeLapseCamera/blob/master/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.TimeLapseCam/) |
|
| [<img src="https://github.com/woheller69/audio-analyzer-for-android/blob/master/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.audio_analyzer_for_android/) |[<img src="https://github.com/woheller69/lavatories/blob/master/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.lavatories/) | [<img src="https://github.com/woheller69/TimeLapseCamera/blob/master/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.TimeLapseCam/) |
|
||||||
| **Arity** | **omWeather** | **solXpect** |
|
| **Arity** | **Cirrus** | **solXpect** |
|
||||||
| [<img src="https://github.com/woheller69/arity/blob/master/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.arity/) | [<img src="https://github.com/woheller69/omweather/blob/master/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.omweather/) | [<img src="https://github.com/woheller69/solXpect/blob/main/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.solxpect/) |
|
| [<img src="https://github.com/woheller69/arity/blob/master/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.arity/) | [<img src="https://github.com/woheller69/omweather/blob/master/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.omweather/) | [<img src="https://github.com/woheller69/solXpect/blob/main/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.solxpect/) |
|
||||||
| **gptAssist** | | |
|
| **gptAssist** | **dumpSeeker** | **huggingAssist** |
|
||||||
| [<img src="https://github.com/woheller69/gptassist/blob/master/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.gptassist/) | | |
|
| [<img src="https://github.com/woheller69/gptassist/blob/master/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.gptassist/) | [<img src="https://github.com/woheller69/dumpseeker/blob/main/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.dumpseeker/) | [<img src="https://github.com/woheller69/huggingassist/blob/master/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.hugassist/) |
|
||||||
|
| **FREE Browser** | **whoBIRD** | **PeakOrama** |
|
||||||
|
| [<img src="https://github.com/woheller69/browser/blob/newmaster/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.browser/) | [<img src="https://github.com/woheller69/whoBIRD/blob/master/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.whobird/) | [<img src="https://github.com/woheller69/PeakOrama/blob/master/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.PeakOrama/) |
|
||||||
|
| **Whisper** | **Seamless** | |
|
||||||
|
| [<img src="https://github.com/woheller69/whisperIME/blob/master/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.whisper/) | [<img src="https://github.com/woheller69/seamless/blob/master/fastlane/metadata/android/en-US/images/icon.png" width="50">](https://f-droid.org/packages/org.woheller69.seemless/) | |
|
||||||
|
|
||||||
# solXpect
|
# solXpect
|
||||||
|
|
||||||
|
@ -70,11 +79,14 @@ Specify the average albedo for your environment to take reflections into account
|
||||||
Examples: Fresh snow: 0.8, green gras: 0.25, asphalt: 0.1
|
Examples: Fresh snow: 0.8, green gras: 0.25, asphalt: 0.1
|
||||||
You probably need to optimize this parameter.
|
You probably need to optimize this parameter.
|
||||||
|
|
||||||
|
#### Inverter efficiency [%]
|
||||||
|
Enter the efficiency of your inverter.
|
||||||
|
|
||||||
#### Inverter power [W]
|
#### Inverter power [W]
|
||||||
Specify the maximum power of your inverter. If it is lower than the maximum power of your panels, the output power of your system will be limited by this parameter.
|
Specify the maximum power of your inverter. If it is lower than the maximum power of your panels, the output power of your system will be limited by this parameter.
|
||||||
|
|
||||||
#### Inverter efficiency [%]
|
#### Central inverter
|
||||||
Enter the efficiency of your inverter.
|
Select this checkbox to apply the inverter limit to the entire system. When in 'show sum' mode, the power limits of all inverters with this checkbox enabled will be aggregated and used as the system-wide power limit.
|
||||||
|
|
||||||
#### Shading
|
#### Shading
|
||||||
In this section you can define the shading on your solar panels.
|
In this section you can define the shading on your solar panels.
|
||||||
|
|
|
@ -2,16 +2,31 @@ apply plugin: 'com.android.application'
|
||||||
|
|
||||||
android {
|
android {
|
||||||
|
|
||||||
compileSdkVersion 33
|
lintOptions {
|
||||||
|
disable 'MissingTranslation'
|
||||||
|
}
|
||||||
|
|
||||||
|
dependenciesInfo {
|
||||||
|
// Disable including dependency metadata when building APKs
|
||||||
|
includeInApk = false
|
||||||
|
// Disable including dependency metadata when building Android App Bundles
|
||||||
|
includeInBundle = false
|
||||||
|
}
|
||||||
|
|
||||||
|
compileSdk 35
|
||||||
|
android.buildFeatures.buildConfig true
|
||||||
|
namespace 'org.woheller69.weather'
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "org.woheller69.solxpect"
|
applicationId "org.woheller69.solxpect"
|
||||||
minSdkVersion 26
|
minSdkVersion 26
|
||||||
targetSdkVersion 33
|
targetSdk 35
|
||||||
versionCode 20
|
versionCode 27
|
||||||
versionName "2.0"
|
versionName "2.7"
|
||||||
|
|
||||||
buildConfigField "String", "BASE_URL", "\"https://api.open-meteo.com/v1/\""
|
buildConfigField "String", "BASE_URL", "\"https://api.open-meteo.com/v1/\""
|
||||||
|
buildConfigField "String", "TILES_URL","\"https://tile.openstreetmap.org/\""
|
||||||
|
buildConfigField "String", "GEOCODING_URL","\"https://geocoding-api.open-meteo.com/\""
|
||||||
buildConfigField "String", "GITHUB_URL","\"https://github.com/woheller69/solxpect/\""
|
buildConfigField "String", "GITHUB_URL","\"https://github.com/woheller69/solxpect/\""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,16 +42,14 @@ dependencies {
|
||||||
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
implementation 'com.diogobernardino:williamchart:2.2'
|
implementation 'com.diogobernardino:williamchart:2.2'
|
||||||
implementation 'net.e175.klaus:solarpositioning:0.1.10'
|
implementation 'net.e175.klaus:solarpositioning:0.1.10'
|
||||||
implementation 'androidx.preference:preference:1.2.0'
|
implementation 'androidx.preference:preference:1.2.1'
|
||||||
implementation 'androidx.appcompat:appcompat:1.5.1'
|
implementation 'androidx.appcompat:appcompat:1.7.1'
|
||||||
implementation 'com.google.android.material:material:1.6.1'
|
implementation 'com.google.android.material:material:1.12.0'
|
||||||
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
|
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
|
||||||
implementation 'com.android.volley:volley:1.2.1'
|
implementation 'com.android.volley:volley:1.2.1'
|
||||||
implementation 'androidx.recyclerview:recyclerview:1.2.1'
|
implementation 'androidx.recyclerview:recyclerview:1.4.0'
|
||||||
implementation 'androidx.cardview:cardview:1.0.0'
|
implementation 'androidx.cardview:cardview:1.0.0'
|
||||||
implementation 'net.lingala.zip4j:zip4j:2.9.1'
|
implementation 'net.lingala.zip4j:zip4j:2.9.1'
|
||||||
implementation "androidx.lifecycle:lifecycle-viewmodel:2.5.1" //needed due to duplicate class error
|
implementation 'com.github.woheller69:CompassView:948f3db329'
|
||||||
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1" //needed due to duplicate class error
|
|
||||||
implementation 'com.github.woheller69:CompassView:a63c67da90'
|
|
||||||
implementation 'androidx.webkit:webkit:1.5.0'
|
implementation 'androidx.webkit:webkit:1.5.0'
|
||||||
}
|
}
|
|
@ -1,6 +1,5 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
package="org.woheller69.weather">
|
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||||
|
|
|
@ -50,11 +50,14 @@ Geben Sie die durchschnittliche Albedo für Ihre Umgebung an, um Reflexionen zu
|
||||||
Beispiele: Frischer Schnee: 0.8, grünes Gras: 0.25, Asphalt: 0.1
|
Beispiele: Frischer Schnee: 0.8, grünes Gras: 0.25, Asphalt: 0.1
|
||||||
Sie müssen diesen Parameter wahrscheinlich optimieren.
|
Sie müssen diesen Parameter wahrscheinlich optimieren.
|
||||||
|
|
||||||
|
<h3>Wechselrichtereffizienz [%]</h3>
|
||||||
|
Geben Sie den Wirkungsgrad Ihres Wechselrichters ein.
|
||||||
|
|
||||||
<h3>Wechselrichterleistung [W]</h3>
|
<h3>Wechselrichterleistung [W]</h3>
|
||||||
Geben Sie die maximale Leistung Ihres Wechselrichters an. Wenn diese geringer ist als die maximale Leistung Ihrer Module, wird die Ausgangsleistung Ihres Systems durch diesen Parameter begrenzt.
|
Geben Sie die maximale Leistung Ihres Wechselrichters an. Wenn diese geringer ist als die maximale Leistung Ihrer Module, wird die Ausgangsleistung Ihres Systems durch diesen Parameter begrenzt.
|
||||||
|
|
||||||
<h3>Wechselrichtereffizienz [%]</h3>
|
<h3>Zentralwechselrichter</h3>
|
||||||
Geben Sie den Wirkungsgrad Ihres Wechselrichters ein.
|
Wählen Sie dieses Kontrollkästchen, um die Wechselrichter-Begrenzung auf das gesamte System anzuwenden. Im "Summe anzeigen"-Modus, werden die Leistungsbegrenzungen aller Wechselrichter mit gesetztem Kontrollkästchen aggregiert und als systemweite Leistungsbegrenzung verwendet.
|
||||||
|
|
||||||
<h3>Abschattung</h3>
|
<h3>Abschattung</h3>
|
||||||
In diesem Abschnitt können Sie die Beschattung Ihrer Solarmodule definieren.
|
In diesem Abschnitt können Sie die Beschattung Ihrer Solarmodule definieren.
|
||||||
|
|
|
@ -50,11 +50,14 @@ Specify the average albedo for your environment to take reflections into account
|
||||||
Examples: Fresh snow: 0.8, green gras: 0.25, asphalt: 0.1
|
Examples: Fresh snow: 0.8, green gras: 0.25, asphalt: 0.1
|
||||||
You probably need to optimize this parameter.
|
You probably need to optimize this parameter.
|
||||||
|
|
||||||
|
<h3>Inverter efficiency [%]</h3>
|
||||||
|
Enter the efficiency of your inverter.
|
||||||
|
|
||||||
<h3>Inverter power [W]</h3>
|
<h3>Inverter power [W]</h3>
|
||||||
Specify the maximum power of your inverter. If it is lower than the maximum power of your panels, the output power of your system will be limited by this parameter.
|
Specify the maximum power of your inverter. If it is lower than the maximum power of your panels, the output power of your system will be limited by this parameter.
|
||||||
|
|
||||||
<h3>Inverter efficiency [%]</h3>
|
<h3>Central Inverter</h3>
|
||||||
Enter the efficiency of your inverter.
|
Select this checkbox to apply the inverter limit to the entire system. When in 'show sum' mode, the power limits of all inverters with this checkbox enabled will be aggregated and used as the system-wide power limit.
|
||||||
|
|
||||||
<h3>Shading</h3>
|
<h3>Shading</h3>
|
||||||
In this section you can define the shading on your solar panels.
|
In this section you can define the shading on your solar panels.
|
||||||
|
|
66
app/src/main/assets/help/help-it.html
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
<h2>Introduzione</h2>
|
||||||
|
|
||||||
|
Questa app fa previsioni sulla produzione del tuo impianto fotovoltaico usando i dati di radiazione luminosa diretta e indiretta prodotti da Open-Meteo.com, calcolando la posizione del sole e proiettando la radiazione sul tuo pannello solare.
|
||||||
|
Viene mostrata la stima di produzione del tuo impianto fotovoltaico per i prossimi 16 giorni, con valori orari calcolati per l’ora precedente. Ad esempio: se alle 11:00 viene mostrato il dato 150 Wh significa che devi aspettarti 150 Wh tra le 10:00 e le 11:00.
|
||||||
|
I valori con il simbolo ∑ si riferiscono all’energia accumulata dalla mezzanotte del primo giorno.
|
||||||
|
Per usare solXpect devi conoscere alcuni parametri del tuo impianto: la latitudine, la longitudine, l’azimuth (orientamento misurato in gradi rispetto alla direzione del nord), l’inclinazione, la potenza di picco e la potenza massima dell’inverter.
|
||||||
|
Per migliorare la stima puoi anche personalizzare altri dati ad esempio l’efficienza di conversione dell’inverter, l’efficienza dei pannelli, il coefficiente di temperatura e l’area dell’impianto.
|
||||||
|
Infine solXpect gestisce anche gli eventuali ombreggiamenti del tuo impianto, infatti è possibile specificare l’elevazione minima del sole necessaria per illuminare i pannelli e la percentuale di ombreggiamento per le elevazioni minori di questo valore.
|
||||||
|
|
||||||
|
<h2>Parametri</h2>
|
||||||
|
|
||||||
|
<h3>Nome</h3>
|
||||||
|
Scegli un nome per l’impianto.
|
||||||
|
Se hai pannelli dello stesso impianto con direzione, inclinazione o ombreggiamento diversi puoi inserirli come impianti diversi e poi usare la funzione 'Mostra totale' per mostrare la produzione complessiva.
|
||||||
|
In questo caso devi scegliere i nomi degli impianti come "mioFV | sezione 1", "mioFV | sezione 2", ... 'Mostra totale' utilizzerà "mioFV" come nome dell’impianto in quanto il carattere '|' viene considerato come separatore tra le diverse parti.
|
||||||
|
|
||||||
|
<h3>Latitudine [°]</h3>
|
||||||
|
Indica la coordinata nord-sud del tuo impianto, può variare tra i valori -90° (polo sud) e 90° (polo nord).
|
||||||
|
|
||||||
|
<h3>Longitudine [°]</h3>
|
||||||
|
Indica La coordinata est-ovest del tuo impianto, 0° è il meridiano di Greenwich, valori positivi indicato posizioni a est di tale meridiano, negativi l’ovest.
|
||||||
|
|
||||||
|
<h3>Azimuth [°]</h3>
|
||||||
|
Indica come è orientato sul piano orizzontale il tuo impianto, 0° indicano il Nord, 90° l’Est, 180° il Sud e 270° l’Ovest.
|
||||||
|
|
||||||
|
<h3>Inclinazione [°]</h3>
|
||||||
|
Indica l’inclinazione sul piano verticale del tuo impianto, se l’impianto punta direttamente il cielo sarà 0°, invece sarà 90° per pannelli verticali.
|
||||||
|
|
||||||
|
<h3>Potenza di picco [W]</h3>
|
||||||
|
Indica la massima potenza del tuo impianto, spesso nel progetto dell’impianto è indicata con l’unità di misura Wp. Attualmente questo valore viene utilizzato solo se è il valore dell’efficienza delle celle o dell’area è 0.
|
||||||
|
In questo caso si suppone che che le il valore di picco delle celle si raggiunga con un’irradianza di 1000W/mq.
|
||||||
|
|
||||||
|
<h3>Efficienza dei pannelli [%]</h3>
|
||||||
|
Indica la porzione di energia luminosa che viene convertita in elettricità dai pannelli.
|
||||||
|
|
||||||
|
<h3>Coefficiente di temperatura [%/K]</h3>
|
||||||
|
Indica la dipendenza della potenza dei pannelli dalla temperatura, tipicamente è un valore attorno a -0.4%/K. La temperatura dei pannelli viene stimata in base alla temperatura ambientale e all’irradianza totale.
|
||||||
|
|
||||||
|
<h3>Area dei pannelli [m<sup>2</sup>]</h3>
|
||||||
|
Indica l’area totale del tuo impianto.
|
||||||
|
|
||||||
|
<h3>Efficienza della radiazione diffusa [%]</h3>
|
||||||
|
Indica la capacità di catturare la radiazione diffusa. Per impianti poco inclinati si avvicina al 100%, per impianti molto inclinati potrebbe essere del 50% o meno, in base all’ambiente circostante.
|
||||||
|
|
||||||
|
<h3>Albedo [0..1]</h3>
|
||||||
|
Indica la capacità dell’ambiente circostante il tuo impianto di riflettere la luce solare. I valori variano da 0 (tutta la luce viene assorbita), a 1 (tutta la radiazione viene riflessa).
|
||||||
|
Esempi: neve fresca: 0,8 ; erba verde: 0,25 ; asfalto: 0,1 .
|
||||||
|
|
||||||
|
<h3>Efficienza dell’inverter [%]</h3>
|
||||||
|
Indica l’efficienza di conversione dell’inverter.
|
||||||
|
|
||||||
|
<h3>Potenza dell’inverter [W]</h3>
|
||||||
|
Indica la potenza massima gestita dall’inverter. Se è minore della potenza massima dei pannelli, la produzione dell’impianto verrà limitata da questo parametro.
|
||||||
|
|
||||||
|
<h3>Invertitore centrale</h3>
|
||||||
|
Seleziona questa casella di controllo per applicare il limite dell'invertitore all'intero sistema. Quando si è in modalità "mostra totale", i limiti di potenza di tutti gli invertitori con questa casella di controllo abilitata verranno aggregati e utilizzati come limite di potenza dell'intero sistema.
|
||||||
|
|
||||||
|
<h3>Ombreggiamenti</h3>
|
||||||
|
In questa sezione puoi definire gli ombreggiamenti dei pannelli.
|
||||||
|
Per ogni intervallo di azimuth è possibile specificare a quale altezza minima il sole illumina i pannelli.
|
||||||
|
Per altezze minori di questo valore è possibile impostare la percentuale di ombreggiamento. Ad esempio un edificio riduce la radiazione solare del 100%, un albero circa del 60%.
|
||||||
|
Per impostare questi valori è possibile utilizzare i dati correnti di azimuth e altezza del sole che vengono mostrati premendo l’icona con il simbolo del sole che si trova nella schermata principale.
|
||||||
|
</body>
|
||||||
|
</html>
|
68
app/src/main/assets/help/help-tr.html
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
<h2>Genel Bakış</h2>
|
||||||
|
|
||||||
|
Bu uygulama, Open-Meteo.com'dan doğrudan ve dağınık radyasyon verilerini kullanarak, güneşin konumunu hesaplayarak ve radyasyonu güneş panelinize yansıtarak güneş enerjisi santralinizin çıktısını tahmin eder.
|
||||||
|
Bir önceki saat için hesaplanan saatlik değerlerle birlikte önümüzdeki 16 gün için tahmini enerji üretimini gösterir. Örnek olarak, 11:00'de 150 Wh gösteriliyorsa bu, 10:00 ile 11:00 arasında 150 Wh bekleyebileceğiniz anlamına gelir.
|
||||||
|
∑ ile başlayan değerler ilk günün gece yarısından itibaren biriken enerjiyi göstermektedir.
|
||||||
|
solXpect'i kullanmak için enlem ve boylam koordinatlarınızın yanı sıra güneş panelinizin azimut ve eğimini girmeniz yeterlidir.
|
||||||
|
Ayrıca güneş panelinizin tepe gücü, verimliliği, sıcaklık katsayısı ve alanı ile invertörünüzün maksimum gücü ve verimliliği hakkındaki bilgileri de girebilirsiniz.
|
||||||
|
Öte yandan solXpect, güneşin güneş panellerine vurması için gereken minimum güneş yüksekliğini ve bu değerin altındaki yükseklikler için gölgeleme yüzdesini belirleyerek güneş panellerinizdeki gölgelemeyi tanımlamanıza olanak tanır.
|
||||||
|
|
||||||
|
<h2>Parametreler</h2>
|
||||||
|
|
||||||
|
<h3>İsim</h3>
|
||||||
|
Konum için bir ad tanımlayın.
|
||||||
|
Aynı enlem ve boylama sahip fakat farklı yönleri işaret eden birden fazla güneş paneliniz varsa, bunları ayrı konumlar olarak tanımlayabilir ve çıktılarını özetlemek için 'Toplamı göster' özelliğini kullanabilirsiniz.
|
||||||
|
Bu durumda konum adlarınızı 'PVkaydım | part1', 'PVkaydım | part2' vb. olarak tanımlamalısınız. 'Toplamı göster' modunda konum daha sonra 'PVkaydım' olarak gösterilir ve bu durumda '|' sınırlayıcı olarak alınır.
|
||||||
|
<h3>Enlem [°]</h3>
|
||||||
|
Güney kutbunda -90° ile kuzey kutbunda 90° arasında değişen güneş enerjisi santralinizin kuzey-güney konumunu girin.
|
||||||
|
|
||||||
|
<h3>Boylam [°]</h3>
|
||||||
|
Güneş enerjisi santralinizin doğu-batı konumunu girin, 0° ana meridyen olarak tanımlanır. Pozitif boylamlar ana meridyenin doğusunda, negatif olanlar ise batısındadır.
|
||||||
|
|
||||||
|
<h3>Azimut [°]</h3>
|
||||||
|
Güneş enerjisi santralinizin yatay yönünü 0° Kuzeye, 90° Doğuya, 180° Güneye ve 270° Batıya karşılık gelecek şekilde belirtin.
|
||||||
|
|
||||||
|
<h3>Eğim [°]</h3>
|
||||||
|
Güneş enerjisi santralinizin dikey yönünü belirtin; 0° gökyüzüne doğru yukarı bakacak ve 90° ufka doğru dikey bir yön gösterecek şekilde.
|
||||||
|
|
||||||
|
<h3>Hücrelerin tepe gücü [W]</h3>
|
||||||
|
Güneş hücrelerinizin (tüm hücrelerin toplamı) sağlayabileceği maksimum gücü girin. Şu anda bu değer yalnızca hücre verimliliği veya hücre alanı için 0 değeri belirtilmişse kullanılmaktadır.
|
||||||
|
Bu durumda, hücrelerin tepe gücünün 1000W/m2 ışınımda verildiği varsayılır.
|
||||||
|
|
||||||
|
<h3>Hücre verimliliği [%]</h3>
|
||||||
|
Güneş ışığı formundaki enerjinin güneş pili tarafından elektriğe dönüştürülebilecek kısmını belirtin.
|
||||||
|
|
||||||
|
<h3>Sıcaklık katsayısı [%/K]</h3>
|
||||||
|
Hücre gücünün sıcaklığa bağımlılığını girin, genellikle -%0,4/K aralığındadır. Hücre sıcaklığı, ortam sıcaklığı ve toplam ışınımdan tahmin edilir.
|
||||||
|
|
||||||
|
<h3>Hücre alanı [m<sup>2</sup>]</h3>
|
||||||
|
Güneş panellerinizin boyutunu girin. (tüm hücrelerin toplamı)
|
||||||
|
|
||||||
|
<h3>Dağınık radyasyon verimliliği [%]</h3>
|
||||||
|
Dağınık radyasyon için güneş enerjisi santralinizin verimliliğini belirtin. Yukarı bakarken %100 civarında olmalıdır, ancak ufka doğru bakarken ortama bağlı olarak %50 veya daha az olabilir.
|
||||||
|
Muhtemelen bu parametreyi optimize etmeniz gerekir.
|
||||||
|
|
||||||
|
<h3>Yansıtabilirlik [0..1]</h3>
|
||||||
|
Yansımaları hesaba katmak için ortamınız için ortalama albedoyu belirtin. Değer 0 (tüm radyasyon emilir) ile 1 (tüm radyasyon yansıtılır) arasında değişir.
|
||||||
|
Örnek: Taze kar: 0.8, yeşil ot: 0.25, asfalt: 0.1
|
||||||
|
Muhtemelen bu parametreyi optimize etmeniz gerekir.
|
||||||
|
|
||||||
|
<h3>İnvertör verimliliği [%]</h3>
|
||||||
|
İnvertörünüzün verimliliğini girin.
|
||||||
|
|
||||||
|
<h3>İnvertör gücü [W]</h3>
|
||||||
|
İnvertörünüzün maksimum gücünü belirtin. Panellerinizin maksimum gücünden daha düşükse, sisteminizin çıkış gücü bu parametre ile sınırlandırılacaktır.
|
||||||
|
|
||||||
|
<h3>Merkezi invertör</h3>
|
||||||
|
İnvertör limitini tüm sisteme uygulamak için bu onay kutusunu seçin. "Toplamı göster" modundayken, bu onay kutusu etkinleştirilmiş olan tüm invertörlerin güç limitleri toplanacak ve tüm sistemin güç limiti olarak kullanılacaktır.
|
||||||
|
|
||||||
|
<h3>Gölgelendirme</h3>
|
||||||
|
Bu bölümde güneş panellerinizdeki gölgelendirmeyi tanımlayabilirsiniz.
|
||||||
|
Her bir azimut açısı aralığı için, güneşin güneş panellerine çarpması için gerekli olan minimum güneş yüksekliğini belirleyebilirsiniz.
|
||||||
|
Bu değerin altındaki yükseklikler için gölgeleme yüzdesini ayarlayabilirsiniz. Örneğin, bir bina radyasyonu %100 oranında azaltırken, bir ağaç sadece %60 oranında azaltabilir.
|
||||||
|
Ana penceredeki güneş simgesi düğmesini kullanarak güneşin mevcut azimutu ve yüksekliği hakkında bilgi alabilir ve güneşin binaların veya ağaçların üzerinde hangi yükseklikte olduğunu belirleyebilirsiniz.
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -1,7 +0,0 @@
|
||||||
/*
|
|
||||||
Leaflet.TileLayer.ColorFilter
|
|
||||||
(c) 2018, Claudio T. Kawakani
|
|
||||||
A simple and lightweight Leaflet plugin to apply CSS filters on map tiles.
|
|
||||||
https://github.com/xtk93x/Leaflet.TileLayer.ColorFilter
|
|
||||||
*/
|
|
||||||
"use strict";L.TileLayer.ColorFilter=L.TileLayer.extend({intialize:function(t,i){L.TileLayer.prototype.initialize.call(this,t,i)},colorFilter:function(){var r=["blur:px","brightness:%","bright:brightness:%","bri:brightness:%","contrast:%","con:contrast:%","grayscale:%","gray:grayscale:%","hue-rotate:deg","hue:hue-rotate:deg","hue-rotation:hue-rotate:deg","invert:%","inv:invert:%","opacity:%","op:opacity:%","saturate:%","saturation:saturate:%","sat:saturate:%","sepia:%","sep:sepia:%"];return(this.options.filter?this.options.filter:[]).map(function(t){var i=t.toLowerCase().split(":");if(2===i.length){var e=r.find(function(t){return t.split(":")[0]===i[0]});if(e)return e=e.split(":"),i[1]+=/^\d+$/.test(i[1])?e[e.length-1]:"","".concat(e[e.length-2],"(").concat(i[1],")")}return""}).join(" ")},_initContainer:function(){L.TileLayer.prototype._initContainer.call(this);this._container.style.filter=this.colorFilter()},updateFilter:function(t){this.options.filter=t,this._container&&(this._container.style.filter=this.colorFilter())}}),L.tileLayer.colorFilter=function(t,i){return new L.TileLayer.ColorFilter(t,i)};
|
|
|
@ -34,7 +34,7 @@ var map = L.map('mapid', {
|
||||||
}).setView([getUrlParameter('lat'), getUrlParameter('lon')], 10); //zoom factor 10
|
}).setView([getUrlParameter('lat'), getUrlParameter('lon')], 10); //zoom factor 10
|
||||||
|
|
||||||
|
|
||||||
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
L.tileLayer(getUrlParameter('tiles')+'{z}/{x}/{y}.png', {
|
||||||
attribution: 'Map data ©<a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
|
attribution: 'Map data ©<a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
|
||||||
}).addTo(map);
|
}).addTo(map);
|
||||||
|
|
||||||
|
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 48 KiB |
|
@ -19,12 +19,13 @@ public class SolarPowerPlant {
|
||||||
double diffuseEfficiency;
|
double diffuseEfficiency;
|
||||||
double inverterPowerLimit;
|
double inverterPowerLimit;
|
||||||
double inverterEfficiency;
|
double inverterEfficiency;
|
||||||
|
boolean isCentralInverter;
|
||||||
double azimuthAngle;
|
double azimuthAngle;
|
||||||
double tiltAngle;
|
double tiltAngle;
|
||||||
private final int[] shadingElevation;
|
private final int[] shadingElevation;
|
||||||
private final int[] shadingOpacity;
|
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.albedo = albedo;
|
||||||
this.latitude = latitude;
|
this.latitude = latitude;
|
||||||
this.longitude = longitude;
|
this.longitude = longitude;
|
||||||
|
@ -39,6 +40,7 @@ public class SolarPowerPlant {
|
||||||
this.shadingElevation = shadingElevation;
|
this.shadingElevation = shadingElevation;
|
||||||
this.shadingOpacity = shadingOpacity;
|
this.shadingOpacity = shadingOpacity;
|
||||||
this.cellsTempCoeff = cellsTempCoeff / 100;
|
this.cellsTempCoeff = cellsTempCoeff / 100;
|
||||||
|
this.isCentralInverter = isCentralInverter;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,12 +69,39 @@ public class SolarPowerPlant {
|
||||||
efficiency = Math.max(0, efficiency); //scalar product is negative if sun points to back of module. set 0 in this case
|
efficiency = Math.max(0, efficiency); //scalar product is negative if sun points to back of module. set 0 in this case
|
||||||
|
|
||||||
if (efficiency > 0) {
|
if (efficiency > 0) {
|
||||||
//Calculate shading in 10 degree ranges, total 36 ranges
|
double shFactor=0;
|
||||||
int shadingIndex = ((((int) Math.round((solarAzimuth + 5) / 10)) - 1) % 36 + 36) % 36;
|
Instant sh;
|
||||||
if (shadingElevation[shadingIndex] > solarElevation) {
|
ZonedDateTime shDateTime;
|
||||||
efficiency *= (double) (100 - shadingOpacity[shadingIndex])/100;
|
AzimuthZenithAngle shPosition;
|
||||||
|
double shSolarAzimuth;
|
||||||
|
double shSolarElevation;
|
||||||
|
|
||||||
|
//Calculate shading in 6 intervals per hour -> 10min steps xx:05 / xx:15 / xx:25 / xx:35 / xx:45 / xx:55
|
||||||
|
int numSteps = 6;
|
||||||
|
long interval = 3600 / numSteps;
|
||||||
|
for (int j=0; j<numSteps;j++){
|
||||||
|
sh = Instant.ofEpochSecond(epochTimeSeconds-(numSteps-1)*interval/2+j*interval);
|
||||||
|
shDateTime = ZonedDateTime.ofInstant(sh, ZoneId.of("GMT")); //currentTimeMillis is in GMT
|
||||||
|
|
||||||
|
shPosition = Grena3.calculateSolarPosition(
|
||||||
|
shDateTime,
|
||||||
|
latitude,
|
||||||
|
longitude,
|
||||||
|
DeltaT.estimate(shDateTime.toLocalDate())); // delta T (s)
|
||||||
|
|
||||||
|
shSolarAzimuth = shPosition.getAzimuth();
|
||||||
|
shSolarElevation = 90 - shPosition.getZenithAngle();
|
||||||
|
|
||||||
|
//shading values are provided in 10 degree ranges -> total of 36 ranges
|
||||||
|
int shadingIndex = ((((int) Math.round((shSolarAzimuth + 5) / 10)) - 1) % 36 + 36) % 36;
|
||||||
|
if (shadingElevation[shadingIndex] > shSolarElevation) {
|
||||||
|
shFactor += (double) (100 - shadingOpacity[shadingIndex])/(numSteps*100);
|
||||||
|
} else {
|
||||||
|
shFactor += (double) 100/(numSteps*100); //numSteps iterations with no shading give 100%
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
efficiency *= shFactor;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
double totalRadiationOnCell = solarPowerNormal * efficiency + solarPowerDiffuse * diffuseEfficiency + shortwaveRadiation * (0.5-0.5*Math.cos(tiltAngle/180*Math.PI)) * albedo; //flat plate equivalent of the solar irradiance
|
double totalRadiationOnCell = solarPowerNormal * efficiency + solarPowerDiffuse * diffuseEfficiency + shortwaveRadiation * (0.5-0.5*Math.cos(tiltAngle/180*Math.PI)) * albedo; //flat plate equivalent of the solar irradiance
|
||||||
|
@ -84,7 +113,11 @@ public class SolarPowerPlant {
|
||||||
dcPower = totalRadiationOnCell/1000 * (1+(cellTemperature - 25)*cellsTempCoeff) * cellsMaxPower;
|
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;
|
return (float) acPower;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
package org.woheller69.weather.activities;
|
package org.woheller69.weather.activities;
|
||||||
|
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.method.LinkMovementMethod;
|
import android.text.method.LinkMovementMethod;
|
||||||
|
import android.view.WindowInsetsController;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import org.woheller69.weather.BuildConfig;
|
import org.woheller69.weather.BuildConfig;
|
||||||
|
@ -15,7 +17,12 @@ public class AboutActivity extends NavigationActivity {
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setContentView(R.layout.activity_about);
|
setContentView(R.layout.activity_about);
|
||||||
overridePendingTransition(0, 0);
|
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
||||||
|
getWindow().getInsetsController().setSystemBarsAppearance(
|
||||||
|
WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS,
|
||||||
|
WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
((TextView) findViewById(R.id.openmeteoURL)).setMovementMethod(LinkMovementMethod.getInstance());
|
((TextView) findViewById(R.id.openmeteoURL)).setMovementMethod(LinkMovementMethod.getInstance());
|
||||||
((TextView) findViewById(R.id.githubURL)).setMovementMethod(LinkMovementMethod.getInstance());
|
((TextView) findViewById(R.id.githubURL)).setMovementMethod(LinkMovementMethod.getInstance());
|
||||||
|
|
|
@ -9,6 +9,7 @@ import android.os.Bundle;
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
import android.view.Gravity;
|
import android.view.Gravity;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.view.WindowInsetsController;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import androidx.activity.result.ActivityResultLauncher;
|
import androidx.activity.result.ActivityResultLauncher;
|
||||||
|
@ -33,7 +34,12 @@ public class BackupRestoreActivity extends NavigationActivity{
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setContentView(R.layout.activity_backuprestore);
|
setContentView(R.layout.activity_backuprestore);
|
||||||
|
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
||||||
|
getWindow().getInsetsController().setSystemBarsAppearance(
|
||||||
|
WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS,
|
||||||
|
WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
ActionBar actionBar = getSupportActionBar();
|
ActionBar actionBar = getSupportActionBar();
|
||||||
if (actionBar != null) {
|
if (actionBar != null) {
|
||||||
|
@ -58,6 +64,7 @@ public class BackupRestoreActivity extends NavigationActivity{
|
||||||
File intData;
|
File intData;
|
||||||
intData = new File(Environment.getDataDirectory()+"//data//" + this.getPackageName() + "//databases//");
|
intData = new File(Environment.getDataDirectory()+"//data//" + this.getPackageName() + "//databases//");
|
||||||
extStorage = Environment.getExternalStoragePublicDirectory(DIRECTORY_DOCUMENTS);
|
extStorage = Environment.getExternalStoragePublicDirectory(DIRECTORY_DOCUMENTS);
|
||||||
|
if (!extStorage.exists()) extStorage.mkdir();
|
||||||
String filesBackup = getResources().getString(R.string.app_name)+".zip";
|
String filesBackup = getResources().getString(R.string.app_name)+".zip";
|
||||||
final File dbBackup = new File(extStorage, filesBackup);
|
final File dbBackup = new File(extStorage, filesBackup);
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||||
|
|
|
@ -3,6 +3,7 @@ package org.woheller69.weather.activities;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
|
@ -16,6 +17,7 @@ import androidx.viewpager2.widget.ViewPager2;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.view.WindowInsetsController;
|
||||||
import android.view.animation.Animation;
|
import android.view.animation.Animation;
|
||||||
import android.view.animation.LinearInterpolator;
|
import android.view.animation.LinearInterpolator;
|
||||||
import android.view.animation.RotateAnimation;
|
import android.view.animation.RotateAnimation;
|
||||||
|
@ -93,7 +95,12 @@ public class ForecastCityActivity extends NavigationActivity implements IUpdatea
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
context=this;
|
context=this;
|
||||||
setContentView(R.layout.activity_forecast_city);
|
setContentView(R.layout.activity_forecast_city);
|
||||||
overridePendingTransition(0, 0);
|
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
||||||
|
getWindow().getInsetsController().setSystemBarsAppearance(
|
||||||
|
WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS,
|
||||||
|
WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
initResources();
|
initResources();
|
||||||
|
|
||||||
|
@ -220,12 +227,7 @@ public class ForecastCityActivity extends NavigationActivity implements IUpdatea
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void processNewWeekForecasts(List<WeekForecast> forecasts) {
|
public void processNewForecasts(List<HourlyForecast> hourlyForecasts, List<WeekForecast> weekForecasts) {
|
||||||
stopRefreshAnimation();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void processNewForecasts(List<HourlyForecast> hourlyForecasts) {
|
|
||||||
stopRefreshAnimation();
|
stopRefreshAnimation();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ package org.woheller69.weather.activities;
|
||||||
import android.content.res.AssetManager;
|
import android.content.res.AssetManager;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.view.WindowInsetsController;
|
||||||
import android.webkit.WebView;
|
import android.webkit.WebView;
|
||||||
import org.woheller69.weather.R;
|
import org.woheller69.weather.R;
|
||||||
|
|
||||||
|
@ -20,6 +21,13 @@ public class HelpActivity extends NavigationActivity{
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setContentView(R.layout.activity_help);
|
setContentView(R.layout.activity_help);
|
||||||
|
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
||||||
|
getWindow().getInsetsController().setSystemBarsAppearance(
|
||||||
|
WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS,
|
||||||
|
WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
WebView view = findViewById(R.id.help);
|
WebView view = findViewById(R.id.help);
|
||||||
|
|
||||||
if(WebViewFeature.isFeatureSupported(WebViewFeature.ALGORITHMIC_DARKENING)) {
|
if(WebViewFeature.isFeatureSupported(WebViewFeature.ALGORITHMIC_DARKENING)) {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package org.woheller69.weather.activities;
|
package org.woheller69.weather.activities;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||||
import com.redinput.compassview.CompassView;
|
import com.redinput.compassview.CompassView;
|
||||||
|
@ -17,7 +18,9 @@ import android.text.TextWatcher;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.view.WindowInsetsController;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
|
import android.widget.CheckBox;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
@ -61,7 +64,13 @@ public class ManageLocationsActivity extends NavigationActivity {
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setContentView(R.layout.activity_manage_locations);
|
setContentView(R.layout.activity_manage_locations);
|
||||||
overridePendingTransition(0, 0);
|
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
||||||
|
getWindow().getInsetsController().setSystemBarsAppearance(
|
||||||
|
WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS,
|
||||||
|
WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
context=this;
|
context=this;
|
||||||
database = SQLiteHelper.getInstance(getApplicationContext());
|
database = SQLiteHelper.getInstance(getApplicationContext());
|
||||||
|
|
||||||
|
@ -203,6 +212,7 @@ public class ManageLocationsActivity extends NavigationActivity {
|
||||||
EditText editAlbedo = (EditText) dialogView.findViewById(R.id.EditLocation_Albedo);
|
EditText editAlbedo = (EditText) dialogView.findViewById(R.id.EditLocation_Albedo);
|
||||||
EditText editInverterPowerLimit = (EditText) dialogView.findViewById(R.id.EditLocation_Inverter_Power_Limit);
|
EditText editInverterPowerLimit = (EditText) dialogView.findViewById(R.id.EditLocation_Inverter_Power_Limit);
|
||||||
EditText editInverterEfficiency = (EditText) dialogView.findViewById(R.id.EditLocation_Inverter_Efficiency);
|
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);
|
TextView currentAzimuth = (TextView) dialogView.findViewById(R.id.edit_current_azi_ele);
|
||||||
|
|
||||||
Long time = System.currentTimeMillis()/1000;
|
Long time = System.currentTimeMillis()/1000;
|
||||||
|
@ -252,6 +262,7 @@ public class ManageLocationsActivity extends NavigationActivity {
|
||||||
editAlbedo.setFilters(new InputFilter[]{ new InputFilterMinMax(0,1)});
|
editAlbedo.setFilters(new InputFilter[]{ new InputFilterMinMax(0,1)});
|
||||||
editInverterPowerLimit.setText(Float.toString(city.getInverterPowerLimit()));
|
editInverterPowerLimit.setText(Float.toString(city.getInverterPowerLimit()));
|
||||||
editInverterEfficiency.setText(Float.toString(city.getInverterEfficiency()));
|
editInverterEfficiency.setText(Float.toString(city.getInverterEfficiency()));
|
||||||
|
editIsCentralInverter.setChecked(city.isCentralInverter());
|
||||||
editInverterEfficiency.setFilters(new InputFilter[]{ new InputFilterMinMax(0, 100)});
|
editInverterEfficiency.setFilters(new InputFilter[]{ new InputFilterMinMax(0, 100)});
|
||||||
editTilt.addTextChangedListener(new TextWatcher() {
|
editTilt.addTextChangedListener(new TextWatcher() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -286,6 +297,7 @@ public class ManageLocationsActivity extends NavigationActivity {
|
||||||
Float.parseFloat(editAlbedo.getText().toString().isEmpty() ? "0" : editAlbedo.getText().toString()),
|
Float.parseFloat(editAlbedo.getText().toString().isEmpty() ? "0" : editAlbedo.getText().toString()),
|
||||||
Float.parseFloat(editInverterPowerLimit.getText().toString().isEmpty() ? "0" : editInverterPowerLimit.getText().toString()),
|
Float.parseFloat(editInverterPowerLimit.getText().toString().isEmpty() ? "0" : editInverterPowerLimit.getText().toString()),
|
||||||
Float.parseFloat(editInverterEfficiency.getText().toString().isEmpty() ? "0" : editInverterEfficiency.getText().toString()),
|
Float.parseFloat(editInverterEfficiency.getText().toString().isEmpty() ? "0" : editInverterEfficiency.getText().toString()),
|
||||||
|
editIsCentralInverter.isChecked(),
|
||||||
shadingElevation,
|
shadingElevation,
|
||||||
shadingOpacity
|
shadingOpacity
|
||||||
);
|
);
|
||||||
|
@ -322,6 +334,7 @@ public class ManageLocationsActivity extends NavigationActivity {
|
||||||
Float.parseFloat(editAlbedo.getText().toString().isEmpty() ? "0" : editAlbedo.getText().toString()),
|
Float.parseFloat(editAlbedo.getText().toString().isEmpty() ? "0" : editAlbedo.getText().toString()),
|
||||||
Float.parseFloat(editInverterPowerLimit.getText().toString().isEmpty() ? "0" : editInverterPowerLimit.getText().toString()),
|
Float.parseFloat(editInverterPowerLimit.getText().toString().isEmpty() ? "0" : editInverterPowerLimit.getText().toString()),
|
||||||
Float.parseFloat(editInverterEfficiency.getText().toString().isEmpty() ? "0" : editInverterEfficiency.getText().toString()),
|
Float.parseFloat(editInverterEfficiency.getText().toString().isEmpty() ? "0" : editInverterEfficiency.getText().toString()),
|
||||||
|
editIsCentralInverter.isChecked(),
|
||||||
shadingElevation,
|
shadingElevation,
|
||||||
shadingOpacity
|
shadingOpacity
|
||||||
);
|
);
|
||||||
|
|
|
@ -81,7 +81,6 @@ public class NavigationActivity extends AppCompatActivity implements OnNavigatio
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
overridePendingTransition(0, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -4,6 +4,7 @@ package org.woheller69.weather.activities;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.view.WindowInsetsController;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.RequiresApi;
|
import androidx.annotation.RequiresApi;
|
||||||
|
@ -40,8 +41,12 @@ public class SettingsActivity extends NavigationActivity implements SharedPrefer
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
setContentView(R.layout.activity_settings);
|
setContentView(R.layout.activity_settings);
|
||||||
|
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
||||||
overridePendingTransition(0, 0);
|
getWindow().getInsetsController().setSystemBarsAppearance(
|
||||||
|
WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS,
|
||||||
|
WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -24,6 +24,7 @@ public class CityToWatch {
|
||||||
private float azimuthAngle;
|
private float azimuthAngle;
|
||||||
private float tiltAngle;
|
private float tiltAngle;
|
||||||
private float albedo;
|
private float albedo;
|
||||||
|
private boolean isCentralInverter;
|
||||||
private int rank;
|
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[] 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};
|
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;
|
this.inverterPowerLimit = inverterPowerLimit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setIsCentralInverter(boolean isCentralInverter) {
|
||||||
|
this.isCentralInverter = isCentralInverter;
|
||||||
|
}
|
||||||
|
public boolean isCentralInverter() {return isCentralInverter;}
|
||||||
|
|
||||||
public void setDiffuseEfficiency(float diffuseEfficiency) {
|
public void setDiffuseEfficiency(float diffuseEfficiency) {
|
||||||
this.diffuseEfficiency = diffuseEfficiency;
|
this.diffuseEfficiency = diffuseEfficiency;
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ import static androidx.core.app.JobIntentService.enqueueWork;
|
||||||
*/
|
*/
|
||||||
public class SQLiteHelper extends SQLiteOpenHelper {
|
public class SQLiteHelper extends SQLiteOpenHelper {
|
||||||
|
|
||||||
private static final int DATABASE_VERSION = 3;
|
private static final int DATABASE_VERSION = 4;
|
||||||
private Context context;
|
private Context context;
|
||||||
|
|
||||||
private List<City> allCities = new ArrayList<>();
|
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_SHADING_OPACITY = "shading_opacity";
|
||||||
private static final String CITIES_TO_WATCH_CELLS_TEMP_COEFF = "cells_temp_coeff";
|
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_ALBEDO = "albedo";
|
||||||
|
private static final String CITIES_TO_WATCH_IS_CENTRAL_INVERTER = "is_central_inverter";
|
||||||
|
|
||||||
//Names of columns in TABLE_FORECAST
|
//Names of columns in TABLE_FORECAST
|
||||||
private static final String FORECAST_ID = "forecast_id";
|
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_ELEVATION + " VARCHAR(255) NOT NULL," +
|
||||||
CITIES_TO_WATCH_SHADING_OPACITY + " 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_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) {
|
public static SQLiteHelper getInstance(Context context) {
|
||||||
if (instance == null && context != null) {
|
if (instance == null && context != null) {
|
||||||
|
@ -170,6 +172,8 @@ public class SQLiteHelper extends SQLiteOpenHelper {
|
||||||
// we want both updates, so no break statement here...
|
// we want both updates, so no break statement here...
|
||||||
case 2:
|
case 2:
|
||||||
db.execSQL("ALTER TABLE "+TABLE_CITIES_TO_WATCH+" ADD COLUMN "+CITIES_TO_WATCH_ALBEDO+" REAL DEFAULT 0");
|
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_SHADING_OPACITY,city.getShadingOpacityString());
|
||||||
values.put(CITIES_TO_WATCH_CELLS_TEMP_COEFF,city.getCellsTempCoeff());
|
values.put(CITIES_TO_WATCH_CELLS_TEMP_COEFF,city.getCellsTempCoeff());
|
||||||
values.put(CITIES_TO_WATCH_ALBEDO,city.getAlbedo());
|
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);
|
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_SHADING_OPACITY +
|
||||||
", " + CITIES_TO_WATCH_CELLS_TEMP_COEFF +
|
", " + CITIES_TO_WATCH_CELLS_TEMP_COEFF +
|
||||||
", " + CITIES_TO_WATCH_ALBEDO +
|
", " + CITIES_TO_WATCH_ALBEDO +
|
||||||
|
", " + CITIES_TO_WATCH_IS_CENTRAL_INVERTER +
|
||||||
", " + CITIES_TO_WATCH_COLUMN_RANK +
|
", " + CITIES_TO_WATCH_COLUMN_RANK +
|
||||||
" FROM " + TABLE_CITIES_TO_WATCH +
|
" FROM " + TABLE_CITIES_TO_WATCH +
|
||||||
" WHERE " + CITIES_TO_WATCH_CITY_ID + " = ?", arguments);
|
" WHERE " + CITIES_TO_WATCH_CITY_ID + " = ?", arguments);
|
||||||
|
@ -258,7 +264,8 @@ public class SQLiteHelper extends SQLiteOpenHelper {
|
||||||
cityToWatch.setShadingOpacity(cursor.getString(14));
|
cityToWatch.setShadingOpacity(cursor.getString(14));
|
||||||
cityToWatch.setCellsTempCoeff(Float.parseFloat(cursor.getString(15)));
|
cityToWatch.setCellsTempCoeff(Float.parseFloat(cursor.getString(15)));
|
||||||
cityToWatch.setAlbedo(Float.parseFloat(cursor.getString(16)));
|
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();
|
cursor.close();
|
||||||
}
|
}
|
||||||
|
@ -291,6 +298,7 @@ public class SQLiteHelper extends SQLiteOpenHelper {
|
||||||
", " + CITIES_TO_WATCH_SHADING_OPACITY +
|
", " + CITIES_TO_WATCH_SHADING_OPACITY +
|
||||||
", " + CITIES_TO_WATCH_CELLS_TEMP_COEFF +
|
", " + CITIES_TO_WATCH_CELLS_TEMP_COEFF +
|
||||||
", " + CITIES_TO_WATCH_ALBEDO +
|
", " + CITIES_TO_WATCH_ALBEDO +
|
||||||
|
", " + CITIES_TO_WATCH_IS_CENTRAL_INVERTER +
|
||||||
", " + CITIES_TO_WATCH_COLUMN_RANK +
|
", " + CITIES_TO_WATCH_COLUMN_RANK +
|
||||||
" FROM " + TABLE_CITIES_TO_WATCH
|
" FROM " + TABLE_CITIES_TO_WATCH
|
||||||
, new String[]{});
|
, new String[]{});
|
||||||
|
@ -317,7 +325,8 @@ public class SQLiteHelper extends SQLiteOpenHelper {
|
||||||
cityToWatch.setShadingOpacity(cursor.getString(14));
|
cityToWatch.setShadingOpacity(cursor.getString(14));
|
||||||
cityToWatch.setCellsTempCoeff(Float.parseFloat(cursor.getString(15)));
|
cityToWatch.setCellsTempCoeff(Float.parseFloat(cursor.getString(15)));
|
||||||
cityToWatch.setAlbedo(Float.parseFloat(cursor.getString(16)));
|
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);
|
cityToWatchList.add(cityToWatch);
|
||||||
} while (cursor.moveToNext());
|
} 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_SHADING_OPACITY,cityToWatch.getShadingOpacityString());
|
||||||
values.put(CITIES_TO_WATCH_CELLS_TEMP_COEFF,cityToWatch.getCellsTempCoeff());
|
values.put(CITIES_TO_WATCH_CELLS_TEMP_COEFF,cityToWatch.getCellsTempCoeff());
|
||||||
values.put(CITIES_TO_WATCH_ALBEDO,cityToWatch.getAlbedo());
|
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 + " = ?",
|
database.update(TABLE_CITIES_TO_WATCH, values, CITIES_TO_WATCH_ID + " = ?",
|
||||||
new String[]{String.valueOf(cityToWatch.getId())});
|
new String[]{String.valueOf(cityToWatch.getId())});
|
||||||
|
|
|
@ -6,6 +6,7 @@ import android.app.AlertDialog;
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
@ -24,8 +25,10 @@ import android.widget.AutoCompleteTextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
import androidx.core.os.ConfigurationCompat;
|
import androidx.core.os.ConfigurationCompat;
|
||||||
import androidx.fragment.app.DialogFragment;
|
import androidx.fragment.app.DialogFragment;
|
||||||
|
import androidx.preference.PreferenceManager;
|
||||||
|
|
||||||
import com.android.volley.Response;
|
import com.android.volley.Response;
|
||||||
import com.android.volley.VolleyError;
|
import com.android.volley.VolleyError;
|
||||||
|
@ -53,16 +56,24 @@ public class AddLocationDialogOmGeocodingAPI extends DialogFragment {
|
||||||
Activity activity;
|
Activity activity;
|
||||||
View rootView;
|
View rootView;
|
||||||
SQLiteHelper database;
|
SQLiteHelper database;
|
||||||
|
private WebView webview;
|
||||||
|
|
||||||
private AutoCompleteTextView autoCompleteTextView;
|
private AutoCompleteTextView autoCompleteTextView;
|
||||||
City selectedCity;
|
City selectedCity;
|
||||||
|
|
||||||
private static final int TRIGGER_AUTO_COMPLETE = 100;
|
private static final int TRIGGER_AUTO_COMPLETE = 100;
|
||||||
private static final long AUTO_COMPLETE_DELAY = 300;
|
private static final long AUTO_COMPLETE_DELAY = 300;
|
||||||
|
private static final int TRIGGER_HIDE_KEYBOARD = 200;
|
||||||
|
private static final long HIDE_KEYBOARD_DELAY = 3000;
|
||||||
private Handler handler;
|
private Handler handler;
|
||||||
private AutoSuggestAdapter autoSuggestAdapter;
|
private AutoSuggestAdapter autoSuggestAdapter;
|
||||||
String url="https://geocoding-api.open-meteo.com/v1/search?name=";
|
String urlSuffix="v1/search?name=";
|
||||||
String lang="default";
|
String url="";
|
||||||
|
String lang="en";
|
||||||
|
|
||||||
|
public AddLocationDialogOmGeocodingAPI() {
|
||||||
|
setRetainInstance(true);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAttach(@NonNull Context context) {
|
public void onAttach(@NonNull Context context) {
|
||||||
|
@ -72,28 +83,46 @@ public class AddLocationDialogOmGeocodingAPI extends DialogFragment {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
if (savedInstanceState != null) dismiss();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
handler.removeMessages(TRIGGER_HIDE_KEYBOARD);
|
||||||
|
if(selectedCity != null && webview != null) {
|
||||||
|
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(activity);
|
||||||
|
String osmTiles = sp.getString("pref_OsmTiles_URL", BuildConfig.TILES_URL);
|
||||||
|
webview.loadUrl("file:///android_asset/map.html?lat=" + selectedCity.getLatitude() + "&lon=" + selectedCity.getLongitude() + "&tiles=" + osmTiles);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@SuppressLint("SetJavaScriptEnabled")
|
@SuppressLint("SetJavaScriptEnabled")
|
||||||
@Override
|
@Override
|
||||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||||
|
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(activity);
|
||||||
|
url = sp.getString("pref_OMGEO_URL",BuildConfig.GEOCODING_URL);
|
||||||
|
url = url + urlSuffix;
|
||||||
Locale locale = ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0);
|
Locale locale = ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0);
|
||||||
lang=locale.getLanguage();
|
if (locale != null) lang=locale.getLanguage();
|
||||||
|
|
||||||
LayoutInflater inflater = getActivity().getLayoutInflater();
|
LayoutInflater inflater = activity.getLayoutInflater();
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
|
||||||
View view = inflater.inflate(R.layout.dialog_add_location, null);
|
View view = inflater.inflate(R.layout.dialog_add_location, null);
|
||||||
|
|
||||||
rootView = view;
|
rootView = view;
|
||||||
|
|
||||||
builder.setView(view);
|
builder.setView(view);
|
||||||
builder.setTitle(getActivity().getString(R.string.dialog_add_label));
|
builder.setTitle(activity.getString(R.string.dialog_add_label));
|
||||||
|
|
||||||
this.database = SQLiteHelper.getInstance(getActivity());
|
this.database = SQLiteHelper.getInstance(activity);
|
||||||
|
|
||||||
|
|
||||||
final WebView webview= rootView.findViewById(R.id.webViewAddLocation);
|
webview = rootView.findViewById(R.id.webViewAddLocation);
|
||||||
webview.getSettings().setJavaScriptEnabled(true);
|
webview.getSettings().setJavaScriptEnabled(true);
|
||||||
webview.getSettings().setUserAgentString(BuildConfig.APPLICATION_ID+"/"+BuildConfig.VERSION_NAME);
|
webview.getSettings().setUserAgentString(BuildConfig.APPLICATION_ID+"/"+BuildConfig.VERSION_NAME);
|
||||||
webview.setBackgroundColor(0x00000000);
|
webview.setBackgroundColor(0x00000000);
|
||||||
|
@ -115,10 +144,11 @@ public class AddLocationDialogOmGeocodingAPI extends DialogFragment {
|
||||||
int position, long id) {
|
int position, long id) {
|
||||||
selectedCity=autoSuggestAdapter.getObject(position);
|
selectedCity=autoSuggestAdapter.getObject(position);
|
||||||
//Hide keyboard to have more space
|
//Hide keyboard to have more space
|
||||||
final InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
|
final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||||
imm.hideSoftInputFromWindow(rootView.getWindowToken(), 0);
|
imm.hideSoftInputFromWindow(rootView.getWindowToken(), 0);
|
||||||
//Show city on map
|
//Show city on map
|
||||||
webview.loadUrl("file:///android_asset/map.html?lat=" + selectedCity.getLatitude() + "&lon=" + selectedCity.getLongitude());
|
String osmTiles = sp.getString("pref_OsmTiles_URL", BuildConfig.TILES_URL);
|
||||||
|
webview.loadUrl("file:///android_asset/map.html?lat=" + selectedCity.getLatitude() + "&lon=" + selectedCity.getLongitude() + "&tiles=" + osmTiles);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -133,8 +163,9 @@ public class AddLocationDialogOmGeocodingAPI extends DialogFragment {
|
||||||
public void onTextChanged(CharSequence s, int start, int before,
|
public void onTextChanged(CharSequence s, int start, int before,
|
||||||
int count) {
|
int count) {
|
||||||
handler.removeMessages(TRIGGER_AUTO_COMPLETE);
|
handler.removeMessages(TRIGGER_AUTO_COMPLETE);
|
||||||
handler.sendEmptyMessageDelayed(TRIGGER_AUTO_COMPLETE,
|
handler.sendEmptyMessageDelayed(TRIGGER_AUTO_COMPLETE, AUTO_COMPLETE_DELAY);
|
||||||
AUTO_COMPLETE_DELAY);
|
handler.removeMessages(TRIGGER_HIDE_KEYBOARD);
|
||||||
|
handler.sendEmptyMessageDelayed(TRIGGER_HIDE_KEYBOARD, HIDE_KEYBOARD_DELAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -143,9 +174,7 @@ public class AddLocationDialogOmGeocodingAPI extends DialogFragment {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
handler = new Handler(Looper.getMainLooper(), new Handler.Callback() {
|
handler = new Handler(Looper.getMainLooper(), msg -> {
|
||||||
@Override
|
|
||||||
public boolean handleMessage(Message msg) {
|
|
||||||
if (msg.what == TRIGGER_AUTO_COMPLETE) {
|
if (msg.what == TRIGGER_AUTO_COMPLETE) {
|
||||||
if (!TextUtils.isEmpty(autoCompleteTextView.getText())) {
|
if (!TextUtils.isEmpty(autoCompleteTextView.getText())) {
|
||||||
try {
|
try {
|
||||||
|
@ -154,12 +183,15 @@ public class AddLocationDialogOmGeocodingAPI extends DialogFragment {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if (msg.what == TRIGGER_HIDE_KEYBOARD) {
|
||||||
|
//Hide keyboard to show entries behind the keyboard
|
||||||
|
final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||||
|
imm.hideSoftInputFromWindow(rootView.getWindowToken(), 0);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
builder.setPositiveButton(getActivity().getString(R.string.dialog_add_add_button), new DialogInterface.OnClickListener() {
|
builder.setPositiveButton(activity.getString(R.string.dialog_add_add_button), new DialogInterface.OnClickListener() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
@ -167,7 +199,7 @@ public class AddLocationDialogOmGeocodingAPI extends DialogFragment {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
builder.setNegativeButton(getActivity().getString(android.R.string.cancel), null);
|
builder.setNegativeButton(activity.getString(android.R.string.cancel), null);
|
||||||
|
|
||||||
return builder.create();
|
return builder.create();
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.Window;
|
import android.view.Window;
|
||||||
|
import android.view.WindowInsetsController;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
|
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
|
@ -46,7 +47,12 @@ public class TutorialActivity extends AppCompatActivity {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
setContentView(R.layout.activity_tutorial);
|
setContentView(R.layout.activity_tutorial);
|
||||||
|
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
||||||
|
getWindow().getInsetsController().setSystemBarsAppearance(
|
||||||
|
WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS,
|
||||||
|
WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
|
||||||
|
);
|
||||||
|
}
|
||||||
viewPager = (ViewPager) findViewById(R.id.view_pager);
|
viewPager = (ViewPager) findViewById(R.id.view_pager);
|
||||||
dotsLayout = (LinearLayout) findViewById(R.id.layoutDots);
|
dotsLayout = (LinearLayout) findViewById(R.id.layoutDots);
|
||||||
btnNext = (Button) findViewById(R.id.btn_next);
|
btnNext = (Button) findViewById(R.id.btn_next);
|
||||||
|
@ -62,8 +68,6 @@ public class TutorialActivity extends AppCompatActivity {
|
||||||
// adding bottom dots
|
// adding bottom dots
|
||||||
addBottomDots(0);
|
addBottomDots(0);
|
||||||
|
|
||||||
// making notification bar transparent
|
|
||||||
changeStatusBarColor();
|
|
||||||
|
|
||||||
myViewPagerAdapter = new MyViewPagerAdapter();
|
myViewPagerAdapter = new MyViewPagerAdapter();
|
||||||
viewPager.setAdapter(myViewPagerAdapter);
|
viewPager.setAdapter(myViewPagerAdapter);
|
||||||
|
@ -158,17 +162,6 @@ public class TutorialActivity extends AppCompatActivity {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Making notification bar transparent
|
|
||||||
*/
|
|
||||||
private void changeStatusBarColor() {
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
|
||||||
Window window = getWindow();
|
|
||||||
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
|
|
||||||
window.setStatusBarColor(Color.TRANSPARENT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* View pager adapter
|
* View pager adapter
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -2,7 +2,6 @@ package org.woheller69.weather.ui.RecycleList;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
import androidx.core.content.res.ResourcesCompat;
|
|
||||||
import androidx.preference.PreferenceManager;
|
import androidx.preference.PreferenceManager;
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
@ -13,6 +12,7 @@ import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
import com.db.chart.Tools;
|
import com.db.chart.Tools;
|
||||||
import com.db.chart.model.BarSet;
|
import com.db.chart.model.BarSet;
|
||||||
|
@ -38,6 +38,8 @@ public class CityWeatherAdapter extends RecyclerView.Adapter<CityWeatherAdapter.
|
||||||
private int[] dataSetTypes;
|
private int[] dataSetTypes;
|
||||||
private List<HourlyForecast> courseDayList;
|
private List<HourlyForecast> courseDayList;
|
||||||
private List<WeekForecast> weekForecastList;
|
private List<WeekForecast> weekForecastList;
|
||||||
|
private float producedToday;
|
||||||
|
private float remainingToday;
|
||||||
|
|
||||||
private Context context;
|
private Context context;
|
||||||
private ViewGroup mParent;
|
private ViewGroup mParent;
|
||||||
|
@ -63,27 +65,30 @@ public class CityWeatherAdapter extends RecyclerView.Adapter<CityWeatherAdapter.
|
||||||
List<HourlyForecast> hourlyForecasts = database.getForecastsByCityId(generalDataList.getCity_id());
|
List<HourlyForecast> hourlyForecasts = database.getForecastsByCityId(generalDataList.getCity_id());
|
||||||
List<WeekForecast> weekforecasts = database.getWeekForecastsByCityId(generalDataList.getCity_id());
|
List<WeekForecast> weekforecasts = database.getWeekForecastsByCityId(generalDataList.getCity_id());
|
||||||
|
|
||||||
updateForecastData(hourlyForecasts);
|
updateForecastData(hourlyForecasts, weekforecasts);
|
||||||
updateWeekForecastData(weekforecasts);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// function update 3-hour or 1-hour forecast list
|
// function update 3-hour or 1-hour forecast list
|
||||||
public void updateForecastData(List<HourlyForecast> hourlyForecasts) {
|
public void updateForecastData(List<HourlyForecast> hourlyForecasts, List<WeekForecast> weekForecasts) {
|
||||||
if (hourlyForecasts.isEmpty()) return;
|
if (hourlyForecasts.isEmpty() || weekForecasts.isEmpty()) return;
|
||||||
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
|
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)){
|
if (sp.getBoolean("pref_summarize",false)){
|
||||||
int cityId = hourlyForecasts.get(0).getCity_id();
|
|
||||||
ArrayList<Integer> CityIDList = new ArrayList<Integer>();
|
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
|
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();
|
List<CityToWatch> citiesToWatch = dbHelper.getAllCitiesToWatch();
|
||||||
CityToWatch requestedCity = dbHelper.getCityToWatch(cityId);
|
|
||||||
for (int i = 0; i < citiesToWatch.size(); i++) {
|
for (int i = 0; i < citiesToWatch.size(); i++) {
|
||||||
CityToWatch city = citiesToWatch.get(i);
|
CityToWatch city = citiesToWatch.get(i);
|
||||||
if (city.getCityId()!=requestedCity.getCityId() && city.getLatitude() == requestedCity.getLatitude() && city.getLongitude() == requestedCity.getLongitude()) {
|
if (city.getCityId()!=requestedCity.getCityId() && city.getLatitude() == requestedCity.getLatitude() && city.getLongitude() == requestedCity.getLongitude()) {
|
||||||
CityIDList.add(city.getCityId());
|
CityIDList.add(city.getCityId());
|
||||||
|
if (city.isCentralInverter()) centralInverterLimit += city.getInverterPowerLimit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (CityIDList.size()>0){
|
if (CityIDList.size()>0){
|
||||||
|
@ -101,58 +106,52 @@ public class CityWeatherAdapter extends RecyclerView.Adapter<CityWeatherAdapter.
|
||||||
courseDayList = new ArrayList<>();
|
courseDayList = new ArrayList<>();
|
||||||
|
|
||||||
float energyCumulated=0;
|
float energyCumulated=0;
|
||||||
|
boolean isDebugMode = sp.getBoolean("pref_debug", false);
|
||||||
|
int stepCounter = 0; // Counter to track the number of steps taken in the loop
|
||||||
|
|
||||||
for (HourlyForecast f : hourlyForecasts) {
|
for (HourlyForecast f : hourlyForecasts) {
|
||||||
energyCumulated+=f.getPower();
|
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);
|
f.setEnergyCum(energyCumulated);
|
||||||
if (sp.getBoolean("pref_debug",false)) {
|
|
||||||
courseDayList.add(f);
|
// In debug mode show all values, otherwise only future values
|
||||||
} else {
|
if (isDebugMode || f.getForecastTime() >= System.currentTimeMillis()) {
|
||||||
if (f.getForecastTime() >= System.currentTimeMillis()) {
|
|
||||||
courseDayList.add(f);
|
courseDayList.add(f);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
if (f.getForecastTime() < System.currentTimeMillis() && stepCounter <= 24) producedToday = f.getEnergyCum();
|
||||||
notifyDataSetChanged();
|
if (f.getForecastTime() > System.currentTimeMillis() && f.getForecastTime() < System.currentTimeMillis() + 3600000 && stepCounter <= 24) {
|
||||||
|
long millisRemainingThisHour = f.getForecastTime() - System.currentTimeMillis();
|
||||||
|
long millisSoFarThisHour = 3600000 - millisRemainingThisHour;
|
||||||
|
producedToday = producedToday + (f.getEnergyCum()-producedToday) * millisSoFarThisHour/3600000;
|
||||||
}
|
}
|
||||||
|
|
||||||
// function for week forecast list
|
stepCounter++;
|
||||||
public void updateWeekForecastData(List<WeekForecast> forecasts) {
|
// if not in debug mode: Reset energyCumulated after every 24 hours if next step is 01:00 am because values are for previous hour
|
||||||
if (forecasts.isEmpty()) return;
|
if (!isDebugMode && stepCounter % 24 == 1) {
|
||||||
int cityId = forecasts.get(0).getCity_id();
|
energyCumulated = 0;
|
||||||
|
|
||||||
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;
|
//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);
|
||||||
|
}
|
||||||
|
remainingToday = weekForecasts.get(0).getEnergyDay()*1000 - producedToday;
|
||||||
|
weekForecastList = weekForecasts;
|
||||||
|
|
||||||
notifyDataSetChanged();
|
notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static class ViewHolder extends RecyclerView.ViewHolder {
|
static class ViewHolder extends RecyclerView.ViewHolder {
|
||||||
ViewHolder(View v) {
|
ViewHolder(View v) {
|
||||||
super(v);
|
super(v);
|
||||||
|
@ -160,15 +159,17 @@ public class CityWeatherAdapter extends RecyclerView.Adapter<CityWeatherAdapter.
|
||||||
}
|
}
|
||||||
|
|
||||||
public class OverViewHolder extends ViewHolder {
|
public class OverViewHolder extends ViewHolder {
|
||||||
TextView temperature;
|
TextView produced;
|
||||||
|
TextView remaining;
|
||||||
TextView updatetime;
|
TextView updatetime;
|
||||||
TextView sun;
|
TextView sun;
|
||||||
|
|
||||||
OverViewHolder(View v) {
|
OverViewHolder(View v) {
|
||||||
super(v);
|
super(v);
|
||||||
this.temperature = v.findViewById(R.id.card_overview_temperature);
|
|
||||||
this.sun=v.findViewById(R.id.card_overview_sunrise_sunset);
|
this.sun=v.findViewById(R.id.card_overview_sunrise_sunset);
|
||||||
this.updatetime=v.findViewById(R.id.card_overview_update_time);
|
this.updatetime=v.findViewById(R.id.card_overview_update_time);
|
||||||
|
this.produced=v.findViewById(R.id.card_overview_produced_today);
|
||||||
|
this.remaining=v.findViewById(R.id.card_overview_remaining_today);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -286,6 +287,8 @@ public class CityWeatherAdapter extends RecyclerView.Adapter<CityWeatherAdapter.
|
||||||
|
|
||||||
holder.updatetime.setText("("+StringFormatUtils.formatTimeWithoutZone(context, updateTime)+")");
|
holder.updatetime.setText("("+StringFormatUtils.formatTimeWithoutZone(context, updateTime)+")");
|
||||||
|
|
||||||
|
holder.produced.setText(StringFormatUtils.formatEnergyCum(context, producedToday));
|
||||||
|
holder.remaining.setText(StringFormatUtils.formatEnergyCum(context, remainingToday));
|
||||||
|
|
||||||
} else if (viewHolder.getItemViewType() == WEEK) {
|
} else if (viewHolder.getItemViewType() == WEEK) {
|
||||||
|
|
||||||
|
@ -308,6 +311,7 @@ public class CityWeatherAdapter extends RecyclerView.Adapter<CityWeatherAdapter.
|
||||||
new RecyclerItemClickListener(context, holder.recyclerView, new RecyclerItemClickListener.OnItemClickListener() {
|
new RecyclerItemClickListener(context, holder.recyclerView, new RecyclerItemClickListener.OnItemClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onItemClick(View view, int position) {
|
public void onItemClick(View view, int position) {
|
||||||
|
if (position == -1) return;
|
||||||
SQLiteHelper database = SQLiteHelper.getInstance(context.getApplicationContext());
|
SQLiteHelper database = SQLiteHelper.getInstance(context.getApplicationContext());
|
||||||
List<WeekForecast> weekforecasts = database.getWeekForecastsByCityId(generalDataList.getCity_id());
|
List<WeekForecast> weekforecasts = database.getWeekForecastsByCityId(generalDataList.getCity_id());
|
||||||
long time = weekforecasts.get(position).getForecastTime(); //time of clicked week item
|
long time = weekforecasts.get(position).getForecastTime(); //time of clicked week item
|
||||||
|
@ -338,20 +342,11 @@ public class CityWeatherAdapter extends RecyclerView.Adapter<CityWeatherAdapter.
|
||||||
mCourseOfDay.getLayoutManager().scrollToPosition(i);
|
mCourseOfDay.getLayoutManager().scrollToPosition(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
highlightSelected(view);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void highlightSelected(View view) {
|
|
||||||
for (int j=0;j<courseDayList.size();j++){ //reset all items
|
|
||||||
if (holder.recyclerView.getLayoutManager().getChildAt(j)!=null){
|
|
||||||
holder.recyclerView.getLayoutManager().getChildAt(j).setBackground(ResourcesCompat.getDrawable(context.getResources(),R.drawable.rounded_transparent,null));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
view.setBackground(ResourcesCompat.getDrawable(context.getResources(),R.drawable.rounded_highlight,null)); //highlight selected item
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onLongItemClick(View view, int position) {
|
public void onLongItemClick(View view, int position) {
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@ public class CourseOfDayAdapter extends RecyclerView.Adapter<CourseOfDayAdapter.
|
||||||
this.courseOfDayList = courseOfDayList;
|
this.courseOfDayList = courseOfDayList;
|
||||||
this.recyclerViewHeader=recyclerViewHeader;
|
this.recyclerViewHeader=recyclerViewHeader;
|
||||||
this.recyclerView=recyclerView;
|
this.recyclerView=recyclerView;
|
||||||
if (courseOfDayList.size()!=0 && courseOfDayList.get(0)!=null) {
|
if (courseOfDayList!=null && courseOfDayList.size()!=0 && courseOfDayList.get(0)!=null) {
|
||||||
this.courseOfDayHeaderDate = new Date(courseOfDayList.get(0).getLocalForecastTime(context));
|
this.courseOfDayHeaderDate = new Date(courseOfDayList.get(0).getLocalForecastTime(context));
|
||||||
}else this.courseOfDayHeaderDate=new Date(); //fallback if no data available
|
}else this.courseOfDayHeaderDate=new Date(); //fallback if no data available
|
||||||
}
|
}
|
||||||
|
@ -141,7 +141,8 @@ public class CourseOfDayAdapter extends RecyclerView.Adapter<CourseOfDayAdapter.
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getItemCount() {
|
public int getItemCount() {
|
||||||
return courseOfDayList.size();
|
if (courseOfDayList==null) return 0;
|
||||||
|
else return courseOfDayList.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
class CourseOfDayViewHolder extends RecyclerView.ViewHolder {
|
class CourseOfDayViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
|
@ -128,7 +128,7 @@ public class RecyclerOverviewListAdapter extends RecyclerView.Adapter<ItemViewHo
|
||||||
public CityToWatch getCitytoWatch(int position){
|
public CityToWatch getCitytoWatch(int position){
|
||||||
return cities.get(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.setCityName(cityName);
|
||||||
cityToWatch.setLatitude(latitude);
|
cityToWatch.setLatitude(latitude);
|
||||||
cityToWatch.setLongitude(longitude);
|
cityToWatch.setLongitude(longitude);
|
||||||
|
@ -142,6 +142,7 @@ public class RecyclerOverviewListAdapter extends RecyclerView.Adapter<ItemViewHo
|
||||||
cityToWatch.setAlbedo(albedo);
|
cityToWatch.setAlbedo(albedo);
|
||||||
cityToWatch.setInverterPowerLimit(inverterPowerLimit);
|
cityToWatch.setInverterPowerLimit(inverterPowerLimit);
|
||||||
cityToWatch.setInverterEfficiency(inverterEfficiency);
|
cityToWatch.setInverterEfficiency(inverterEfficiency);
|
||||||
|
cityToWatch.setIsCentralInverter(isCentralInverter);
|
||||||
cityToWatch.setShadingElevation(shadingElevation);
|
cityToWatch.setShadingElevation(shadingElevation);
|
||||||
cityToWatch.setShadingOpacity(shadingOpacity);
|
cityToWatch.setShadingOpacity(shadingOpacity);
|
||||||
database.updateCityToWatch(cityToWatch);
|
database.updateCityToWatch(cityToWatch);
|
||||||
|
|
|
@ -3,6 +3,7 @@ package org.woheller69.weather.ui;
|
||||||
import static org.woheller69.weather.ui.RecycleList.CityWeatherAdapter.CHART;
|
import static org.woheller69.weather.ui.RecycleList.CityWeatherAdapter.CHART;
|
||||||
import static org.woheller69.weather.ui.RecycleList.CityWeatherAdapter.DAY;
|
import static org.woheller69.weather.ui.RecycleList.CityWeatherAdapter.DAY;
|
||||||
import static org.woheller69.weather.ui.RecycleList.CityWeatherAdapter.EMPTY;
|
import static org.woheller69.weather.ui.RecycleList.CityWeatherAdapter.EMPTY;
|
||||||
|
import static org.woheller69.weather.ui.RecycleList.CityWeatherAdapter.OVERVIEW;
|
||||||
import static org.woheller69.weather.ui.RecycleList.CityWeatherAdapter.WEEK;
|
import static org.woheller69.weather.ui.RecycleList.CityWeatherAdapter.WEEK;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
|
@ -38,7 +39,7 @@ public class WeatherCityFragment extends Fragment implements IUpdateableCityUI {
|
||||||
|
|
||||||
private int mCityId = -1;
|
private int mCityId = -1;
|
||||||
private int[] mDataSetTypes = new int[]{};
|
private int[] mDataSetTypes = new int[]{};
|
||||||
private static int[] mFull = {DAY, WEEK, CHART}; //TODO Make dynamic from Settings
|
private static int[] mFull = {OVERVIEW, DAY, WEEK, CHART}; //TODO Make dynamic from Settings
|
||||||
private static int[] mEmpty = {EMPTY};
|
private static int[] mEmpty = {EMPTY};
|
||||||
private CityWeatherAdapter mAdapter;
|
private CityWeatherAdapter mAdapter;
|
||||||
|
|
||||||
|
@ -128,19 +129,10 @@ public class WeatherCityFragment extends Fragment implements IUpdateableCityUI {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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 (hourlyForecasts != null && hourlyForecasts.size() > 0 && hourlyForecasts.get(0).getCity_id() == mCityId) {
|
||||||
if (mAdapter != null) {
|
if (mAdapter != null) {
|
||||||
mAdapter.updateForecastData(hourlyForecasts);
|
mAdapter.updateForecastData(hourlyForecasts, weekForecasts);
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,6 @@ import java.util.List;
|
||||||
public interface IUpdateableCityUI {
|
public interface IUpdateableCityUI {
|
||||||
void processNewGeneralData(GeneralData data);
|
void processNewGeneralData(GeneralData data);
|
||||||
|
|
||||||
void processNewForecasts(List<HourlyForecast> hourlyForecasts);
|
void processNewForecasts(List<HourlyForecast> hourlyForecasts, List<WeekForecast> weekForecasts);
|
||||||
|
|
||||||
void processNewWeekForecasts(List<WeekForecast> forecasts);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
ArrayList<IUpdateableCityUI> subcopy = new ArrayList<>(subscribers);
|
||||||
for (IUpdateableCityUI sub : subcopy) {
|
for (IUpdateableCityUI sub : subcopy) {
|
||||||
sub.processNewForecasts(hourlyForecasts);
|
sub.processNewForecasts(hourlyForecasts, weekForecasts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,14 +118,10 @@ public class WeatherPagerAdapter extends FragmentStateAdapter implements IUpdate
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void processNewForecasts(List<HourlyForecast> hourlyForecasts) {
|
public void processNewForecasts(List<HourlyForecast> hourlyForecasts, List<WeekForecast> weekForecasts) {
|
||||||
//empty because Fragments are subscribers themselves
|
//empty because Fragments are subscribers themselves
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void processNewWeekForecasts(List<WeekForecast> forecasts) {
|
|
||||||
//empty because Fragments are subscribers themselves
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getCityIDForPos(int pos) {
|
public int getCityIDForPos(int pos) {
|
||||||
CityToWatch city = cities.get(pos);
|
CityToWatch city = cities.get(pos);
|
||||||
|
|
|
@ -75,7 +75,7 @@ public class OMDataExtractor implements IDataExtractor {
|
||||||
|
|
||||||
SQLiteHelper dbhelper = SQLiteHelper.getInstance(context);
|
SQLiteHelper dbhelper = SQLiteHelper.getInstance(context);
|
||||||
CityToWatch city = dbhelper.getCityToWatch(cityID);
|
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();
|
IApiToDatabaseConversion conversion = new OMToDatabaseConversion();
|
||||||
|
|
|
@ -19,13 +19,12 @@ import java.util.List;
|
||||||
public class OMHttpRequest {
|
public class OMHttpRequest {
|
||||||
|
|
||||||
protected String getUrlForQueryingOMweatherAPI(Context context, float lat, float lon) {
|
protected String getUrlForQueryingOMweatherAPI(Context context, float lat, float lon) {
|
||||||
AppPreferencesManager prefManager =
|
|
||||||
new AppPreferencesManager(PreferenceManager.getDefaultSharedPreferences(context));
|
|
||||||
SharedPreferences sharedPreferences=PreferenceManager.getDefaultSharedPreferences(context);
|
SharedPreferences sharedPreferences=PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
|
||||||
return String.format(
|
return String.format(
|
||||||
"%sforecast?latitude=%s&longitude=%s&forecast_days=%s&hourly=temperature_2m,diffuse_radiation,direct_normal_irradiance,shortwave_radiation,weathercode&daily=weathercode,sunrise,sunset,&timeformat=unixtime&timezone=auto",
|
"%sforecast?latitude=%s&longitude=%s&forecast_days=%s&hourly=temperature_2m,diffuse_radiation,direct_normal_irradiance,shortwave_radiation,weathercode&daily=weathercode,sunrise,sunset,&timeformat=unixtime&timezone=auto",
|
||||||
BuildConfig.BASE_URL,
|
sharedPreferences.getString("pref_OM_URL", BuildConfig.BASE_URL),
|
||||||
lat,
|
lat,
|
||||||
lon,
|
lon,
|
||||||
sharedPreferences.getInt("pref_number_days",7)
|
sharedPreferences.getInt("pref_number_days",7)
|
||||||
|
|
|
@ -141,8 +141,7 @@ public class ProcessOMweatherAPIRequest implements IProcessHttpRequest {
|
||||||
dbHelper.addWeekForecasts(weekforecasts);
|
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.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, weekforecasts);
|
||||||
if (c == CityIDList.size()-1) ViewUpdater.updateForecasts(hourlyforecasts);
|
|
||||||
|
|
||||||
} catch (JSONException e) {
|
} catch (JSONException e) {
|
||||||
e.printStackTrace();
|
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-12*3600*1000L) && (hourlyForecast.getForecastTime()< timeNoon + 12*3600*1000L)){
|
|
||||||
totalEnergy+=hourlyForecast.getPower();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
weekForecast.setEnergyDay(totalEnergy/1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
return weekforecasts;
|
return weekforecasts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 9.8 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 59 KiB |
|
@ -34,7 +34,7 @@
|
||||||
android:strokeColor="#00000000"
|
android:strokeColor="#00000000"
|
||||||
android:fillType="evenOdd"/>
|
android:fillType="evenOdd"/>
|
||||||
<path
|
<path
|
||||||
android:pathData="M5241,13000L3431,9674 6088,9439 7898,12766 5241,13000Z"
|
android:pathData="M5351,13078L3541,9752 6198,9517 8008,12844 5351,13078Z"
|
||||||
android:strokeLineJoin="round"
|
android:strokeLineJoin="round"
|
||||||
android:strokeWidth="28.222"
|
android:strokeWidth="28.222"
|
||||||
android:fillColor="#192072"
|
android:fillColor="#192072"
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
android:id="@+id/drawer_layout"
|
android:id="@+id/drawer_layout"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:fitsSystemWindows="true"
|
|
||||||
tools:openDrawer="start">
|
tools:openDrawer="start">
|
||||||
|
|
||||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
android:id="@+id/drawer_layout"
|
android:id="@+id/drawer_layout"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:fitsSystemWindows="true"
|
|
||||||
tools:openDrawer="start">
|
tools:openDrawer="start">
|
||||||
|
|
||||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
android:id="@+id/drawer_layout"
|
android:id="@+id/drawer_layout"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:fitsSystemWindows="true"
|
|
||||||
tools:openDrawer="start">
|
tools:openDrawer="start">
|
||||||
|
|
||||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
android:id="@+id/drawer_layout"
|
android:id="@+id/drawer_layout"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:fitsSystemWindows="true"
|
|
||||||
tools:openDrawer="start">
|
tools:openDrawer="start">
|
||||||
|
|
||||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
android:id="@+id/drawer_layout"
|
android:id="@+id/drawer_layout"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:fitsSystemWindows="true"
|
|
||||||
tools:openDrawer="start">
|
tools:openDrawer="start">
|
||||||
|
|
||||||
<include
|
<include
|
||||||
|
|
|
@ -1,40 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
tools:context=".activities.RainViewerActivity"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="50dp"
|
|
||||||
android:background="@color/backgroundBlue"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<ImageButton
|
|
||||||
android:id="@+id/rainviewer_prev"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:src="@drawable/ic_skip_previous_24px"
|
|
||||||
android:layout_height="wrap_content" />
|
|
||||||
<ImageButton
|
|
||||||
android:id="@+id/rainviewer_startstop"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_weight="3"
|
|
||||||
android:src="@drawable/ic_playpause"
|
|
||||||
android:layout_height="wrap_content" />
|
|
||||||
<ImageButton
|
|
||||||
android:id="@+id/rainviewer_next"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:src="@drawable/ic_skip_next_24px"
|
|
||||||
android:layout_height="wrap_content" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<WebView
|
|
||||||
android:id="@+id/webView"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="fill_parent" />
|
|
||||||
</LinearLayout>
|
|
|
@ -5,7 +5,6 @@
|
||||||
android:id="@+id/drawer_layout"
|
android:id="@+id/drawer_layout"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:fitsSystemWindows="true"
|
|
||||||
tools:openDrawer="start">
|
tools:openDrawer="start">
|
||||||
|
|
||||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent"
|
||||||
|
android:fitsSystemWindows="true">
|
||||||
|
|
||||||
|
|
||||||
<androidx.viewpager.widget.ViewPager
|
<androidx.viewpager.widget.ViewPager
|
||||||
|
|
|
@ -5,40 +5,38 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="@dimen/card_margin">
|
android:layout_margin="@dimen/card_margin">
|
||||||
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:textColor="#fafafa"
|
|
||||||
android:layout_marginTop="5dp"
|
|
||||||
android:layout_marginStart="7dp"
|
|
||||||
android:textSize="12dp"
|
|
||||||
android:text="Weather data by Open-Meteo.com" />
|
|
||||||
|
|
||||||
<RelativeLayout
|
<RelativeLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center_vertical">
|
android:layout_gravity="center_vertical"
|
||||||
|
android:background="@color/backgroundBlue">
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/card_overview_temperature"
|
android:id="@+id/card_overview_header"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_alignParentEnd="true"
|
android:layout_marginStart="10dp"
|
||||||
android:layout_centerVertical="true"
|
android:layout_marginTop="10dp"
|
||||||
android:layout_marginEnd="10dp"
|
android:layout_marginEnd="10dp"
|
||||||
android:background="@drawable/rounded_corner"
|
android:layout_marginBottom="10dp"
|
||||||
android:paddingLeft="7dp"
|
android:gravity="center"
|
||||||
android:paddingRight="7dp"
|
android:text="@string/card_today_heading"
|
||||||
|
android:textAllCaps="true"
|
||||||
android:textColor="@color/colorPrimaryDark"
|
android:textColor="@color/colorPrimaryDark"
|
||||||
android:textSize="45dp" />
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:id="@+id/card_overview_header_spacer"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="1dp"
|
||||||
|
android:layout_below="@id/card_overview_header"
|
||||||
|
android:background="@color/white" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/card_overview_update_time"
|
android:id="@+id/card_overview_update_time"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_alignParentTop="true"
|
android:layout_alignBaseline="@id/card_overview_header"
|
||||||
android:layout_alignParentEnd="true"
|
android:layout_alignParentEnd="true"
|
||||||
android:layout_marginEnd="10dp"
|
android:layout_marginEnd="10dp"
|
||||||
android:paddingLeft="7dp"
|
android:paddingLeft="7dp"
|
||||||
|
@ -46,18 +44,77 @@
|
||||||
android:textColor="#fafafa"
|
android:textColor="#fafafa"
|
||||||
android:textSize="18dp" />
|
android:textSize="18dp" />
|
||||||
|
|
||||||
</RelativeLayout>
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/card_overview_sunrise_sunset"
|
android:id="@+id/card_overview_sunrise_sunset"
|
||||||
|
android:layout_alignBaseline="@id/card_overview_remaining_today"
|
||||||
|
android:layout_alignParentEnd="true"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="bottom|right"
|
|
||||||
android:textSize="15dp"
|
android:textSize="15dp"
|
||||||
android:textColor="@color/colorPrimaryDark"
|
android:textColor="@color/colorPrimaryDark"
|
||||||
android:background="@drawable/rounded_corner"
|
|
||||||
android:layout_marginEnd="10dp"
|
android:layout_marginEnd="10dp"
|
||||||
android:layout_marginBottom="5dp"
|
|
||||||
android:paddingRight="7dp"
|
android:paddingRight="7dp"
|
||||||
android:paddingLeft="7dp" />
|
android:paddingLeft="7dp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/card_overview_credits"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@id/card_overview_sunrise_sunset"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:textColor="#fafafa"
|
||||||
|
android:layout_marginStart="7dp"
|
||||||
|
android:textSize="12dp"
|
||||||
|
android:text="Weather data by Open-Meteo.com" />
|
||||||
|
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/card_overview_produced_today_header"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@id/card_overview_header_spacer"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||||
|
android:textColor="@color/colorPrimaryDark"
|
||||||
|
android:layout_marginTop="5dp"
|
||||||
|
android:layout_marginStart="7dp"
|
||||||
|
android:text="@string/card_today_produced" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/card_overview_produced_today"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@id/card_overview_header_spacer"
|
||||||
|
android:layout_toEndOf="@id/card_overview_produced_today_header"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||||
|
android:textColor="@color/colorPrimaryDark"
|
||||||
|
android:layout_marginTop="5dp"
|
||||||
|
android:layout_marginStart="7dp"
|
||||||
|
android:text="1500 Wh" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/card_overview_remaining_today_header"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@id/card_overview_produced_today"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||||
|
android:textColor="@color/colorPrimaryDark"
|
||||||
|
android:layout_marginTop="5dp"
|
||||||
|
android:layout_marginStart="7dp"
|
||||||
|
android:text="@string/card_today_remaining" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/card_overview_remaining_today"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@id/card_overview_produced_today"
|
||||||
|
android:layout_toEndOf="@id/card_overview_remaining_today_header"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||||
|
android:textColor="@color/colorPrimaryDark"
|
||||||
|
android:layout_marginTop="5dp"
|
||||||
|
android:layout_marginStart="7dp"
|
||||||
|
android:text="1500 Wh" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
</androidx.cardview.widget.CardView>
|
</androidx.cardview.widget.CardView>
|
|
@ -146,6 +146,17 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:inputType="numberDecimal"
|
android:inputType="numberDecimal"
|
||||||
android:hint="@string/edit_location_hint_albedo"/>
|
android:hint="@string/edit_location_hint_albedo"/>
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textStyle="bold"
|
||||||
|
android:hint="@string/edit_location_hint_inverter_efficiency"/>
|
||||||
|
<androidx.appcompat.widget.AppCompatEditText
|
||||||
|
android:id="@+id/EditLocation_Inverter_Efficiency"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:inputType="numberDecimal"
|
||||||
|
android:hint="@string/edit_location_hint_inverter_efficiency"/>
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
@ -161,14 +172,11 @@
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
android:hint="@string/edit_location_hint_inverter_efficiency"/>
|
android:hint="@string/edit_location_hint_central_inverter"/>
|
||||||
<androidx.appcompat.widget.AppCompatEditText
|
<CheckBox
|
||||||
android:id="@+id/EditLocation_Inverter_Efficiency"
|
android:id="@+id/EditLocation_Central_Inverter"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content" />
|
||||||
android:inputType="numberDecimal"
|
|
||||||
android:hint="@string/edit_location_hint_inverter_efficiency"/>
|
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:id="@+id/edit_Location_shading"
|
android:id="@+id/edit_Location_shading"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|
|
@ -89,6 +89,14 @@
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
|
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
|
||||||
tools:visibility="visible" />
|
tools:visibility="visible" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/city_inverter_efficiency"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:text="@string/edit_location_hint_inverter_efficiency"
|
||||||
|
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/city_inverter_power_limit"
|
android:id="@+id/city_inverter_power_limit"
|
||||||
|
@ -99,14 +107,6 @@
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
|
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
|
||||||
tools:visibility="visible" />
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/city_inverter_efficiency"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:text="@string/edit_location_hint_inverter_efficiency"
|
|
||||||
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
|
|
||||||
tools:visibility="visible" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,6 @@
|
||||||
<item
|
<item
|
||||||
android:id="@+id/star_on_github"
|
android:id="@+id/star_on_github"
|
||||||
android:icon="@drawable/baseline_star_rate_24"
|
android:icon="@drawable/baseline_star_rate_24"
|
||||||
android:title="Star on GitHub" />
|
android:title="@string/github" />
|
||||||
</group>
|
</group>
|
||||||
</menu>
|
</menu>
|
||||||
|
|
Before Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 5.9 KiB |
Before Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 8.6 KiB |
Before Width: | Height: | Size: 8.5 KiB |
Before Width: | Height: | Size: 8.6 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
|
@ -1,6 +1,5 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">solXpect</string>
|
|
||||||
<string name="about">Über</string>
|
<string name="about">Über</string>
|
||||||
<string name="about_privacy_heading">Privatsphäre-Informationen</string>
|
<string name="about_privacy_heading">Privatsphäre-Informationen</string>
|
||||||
<string name="about_more_info">Mehr Informationen können gefunden werden auf:</string>
|
<string name="about_more_info">Mehr Informationen können gefunden werden auf:</string>
|
||||||
|
@ -108,6 +107,10 @@
|
||||||
<string name="itemRemoved">ENTFERNT:\u0020\u0020%s</string>
|
<string name="itemRemoved">ENTFERNT:\u0020\u0020%s</string>
|
||||||
<string name="undo">WIEDERHERSTELLEN</string>
|
<string name="undo">WIEDERHERSTELLEN</string>
|
||||||
<string name="edit_location_hint_albedo">Albedo [0..1]</string>
|
<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>
|
||||||
|
<string name="card_today_heading">Heute</string>
|
||||||
|
<string name="card_today_produced">Produziert:</string>
|
||||||
|
<string name="card_today_remaining">Verbleibend:</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
117
app/src/main/res/values-it/strings.xml
Normal file
|
@ -0,0 +1,117 @@
|
||||||
|
<resources>
|
||||||
|
<string name="activity_about">Info</string>
|
||||||
|
<string name="activity_settings">Impostazioni</string>
|
||||||
|
<string name="activity_weather">Previsione</string>
|
||||||
|
<string name="activity_manage">Gestisci luoghi</string>
|
||||||
|
<string name="action_refresh">Ricarica</string>
|
||||||
|
<string name="navigation_drawer_open">Apri pannello di navigazione</string>
|
||||||
|
<string name="navigation_drawer_close">Chiudi pannello di navigazione</string>
|
||||||
|
<string name="next">Prossimo</string>
|
||||||
|
<string name="okay">OK</string>
|
||||||
|
<string name="slide1_heading">Benvenuto!</string>
|
||||||
|
<string name="slide1_text">solXpect prevede la produzione del tuo impianto fotovoltaico</string>
|
||||||
|
<string name="slide2_heading" translatable="false">Github</string>
|
||||||
|
<string name="slide2_text">Il codice sorgente di questa app è disponibile su GitHub. Ulteriori dettagli si trovano nella pagina Info.</string>
|
||||||
|
<string name="card_week_heading">Settimana</string>
|
||||||
|
<string name="card_error_heading">Errore nel recuperare i dati meteo</string>
|
||||||
|
<string name="card_error_content">Prova a aggiornare!</string>
|
||||||
|
<string name="about_privacy_heading">Privacy Info</string>
|
||||||
|
<string name="about">Info</string>
|
||||||
|
<string name="version_number">Versione</string>
|
||||||
|
<string name="about_license">Licenza</string>
|
||||||
|
<string name="about_license_text">Questa applicazione è derivata da Privacy Friendly Weather, sviluppata dal gruppo di ricerca SECUSO. Il codice sorgente è rilasciato con licenza GPLv3. L\u0027app usa icone da Google Material Design Icons distruite con licenza Apache License Version 2.0, inoltre usa le seguenti librerie: Leaflet con licenza 2-clause BSD License, AutoSuggestTextViewAPICall con licenza Apache License Version 2.0, Solarpositioning (net.e175.klaus:solarpositioning) con licenza MIT License, Zip4j (https://github.com/srikanth-lingala/zip4j) con licenza Apache License Version 2.0, CompassView (https://github.com/kix2902/CompassView) con licenza Apache License Version 2.0, and WilliamChart library (com.db.chart) con licenza Apache License Version 2.0</string>
|
||||||
|
<string name="about_more_info">Altre informazioni si possono trovare su:</string>
|
||||||
|
<string name="about_github" translatable="false"><a href="https://github.com/woheller69/solxpect">Github-Repo</a></string>
|
||||||
|
<string name="about_openmeteo" translatable="false"><a href="https://open-meteo.com">Open-Meteo \n(Attribution 4.0 International CC BY 4.0)</a></string>
|
||||||
|
<string name="activity_settings_title">Impostazioni</string>
|
||||||
|
<string name="abbreviation_monday">Lu.</string>
|
||||||
|
<string name="abbreviation_tuesday">Ma.</string>
|
||||||
|
<string name="abbreviation_wednesday">Me.</string>
|
||||||
|
<string name="abbreviation_thursday">Gio.</string>
|
||||||
|
<string name="abbreviation_friday">Ve.</string>
|
||||||
|
<string name="abbreviation_saturday">Sa.</string>
|
||||||
|
<string name="abbreviation_sunday">Do.</string>
|
||||||
|
<string name="dialog_add_label">Inserisci il luogo da aggiungere:</string>
|
||||||
|
<string name="dialog_add_no_city_found">Nessun luogo corrisponde al testo immesso. Si raccommanda di selezionare uno degli elementi dalla lista.</string>
|
||||||
|
<string name="dialog_add_add_button">Aggiungi</string>
|
||||||
|
<string name="error_convert_to_json">I dati meteo scaricati hanno un formato errato.</string>
|
||||||
|
<string name="error_no_internet">Il dispositivo non è collegato a internet</string>
|
||||||
|
<string name="error_fetch_forecast">Errore nell\u0027aggiornare le previsioni, riprova!</string>
|
||||||
|
<string name="error_no_city_selected">Nessun luogo selezionato. Per scegliere un luog va su \"Gestisci luoghi\".</string>
|
||||||
|
<string name="settings_interval_quarter">15 min</string>
|
||||||
|
<string name="settings_interval_half">30 min</string>
|
||||||
|
<string name="settings_interval_one">1 h</string>
|
||||||
|
<string name="settings_interval_two">2 h</string>
|
||||||
|
<string name="settings_interval_six">6 h</string>
|
||||||
|
<string name="settings_interval_twelve">12 h</string>
|
||||||
|
<string name="settings_interval_twentyfour">24 h</string>
|
||||||
|
<string name="settings_intervals">Intervalli</string>
|
||||||
|
<string name="settings_update_interval">Aggiorna intervalli</string>
|
||||||
|
<string name="settings_interval_summary">Imposta l\u0027intervallo di tempo per l\u0027aggionamento automatico</string>
|
||||||
|
<string name="about_privacy_answer">solXpect usa solo il permisso \"Internet\" per scaricare i dati meteo. Non include nessun meccanismo di tracciamento o pubblicitario.</string>
|
||||||
|
<string name="about_where_from">Da dove vengono scaricati i dati meteo?</string>
|
||||||
|
<string name="about_where_from_answer">I dati meteo vengono scaricati da</string>
|
||||||
|
<string name="long_press_text">Tenere premuto e trascinare per ordinare.</string>
|
||||||
|
<string name="swipe_to_delete">Passare il dito per eliminare</string>
|
||||||
|
<string name="settings_title_display_options">Opzioni di visualizzazione</string>
|
||||||
|
<string name="infoProvider">I dati meteo sono scaricati da Open-Meteo.com</string>
|
||||||
|
<string name="monday">Lunedì</string>
|
||||||
|
<string name="tuesday">Martedì</string>
|
||||||
|
<string name="wednesday">Mercoledì</string>
|
||||||
|
<string name="thursday">Giovedì</string>
|
||||||
|
<string name="friday">Venerdì</string>
|
||||||
|
<string name="saturday">Sabato</string>
|
||||||
|
<string name="sunday">Domenica</string>
|
||||||
|
<string name="chart">Grafico</string>
|
||||||
|
<string name="units_kWh">kWh</string>
|
||||||
|
<string name="dialog_edit_change_button">Salva</string>
|
||||||
|
<string name="edit_location_hint_name">Nome</string>
|
||||||
|
<string name="settings_search">Cerca</string>
|
||||||
|
<string name="settings_darkmode">Modalità scura per Android 10+</string>
|
||||||
|
<string name="settings_time24h">Ore in formato 24h</string>
|
||||||
|
<string name="summary_time24h">Sovrascrivi le impostazioni di sistema</string>
|
||||||
|
<string name="dialog_OK_button">OK</string>
|
||||||
|
<string name="dialog_NO_button">No</string>
|
||||||
|
<string name="dialog_Later_button">Forse dopo</string>
|
||||||
|
<string name="dialog_StarOnGitHub">Ti piace questa app? Per favore assegnale una stella su GitHub e regala un caffè allo sviluppatore con PayPal.</string>
|
||||||
|
<string name="slide3_heading">Open-Meteo</string>
|
||||||
|
<string name="settings_forecast_days">Numero di giorni nelle previsioni</string>
|
||||||
|
<string name="edit_location_hint_latitude">Latitudine [°]</string>
|
||||||
|
<string name="edit_location_hint_longitude">Longitudine [°]</string>
|
||||||
|
<string name="edit_location_hint_azimuth">Azimuth [°]</string>
|
||||||
|
<string name="edit_location_hint_tilt">Inclinazione [°]</string>
|
||||||
|
<string name="edit_location_hint_cells_max_power">Potenza di picco delle celle [W]</string>
|
||||||
|
<string name="edit_location_hint_cells_efficiency">Efficienza delle celle [%]</string>
|
||||||
|
<string name="edit_location_hint_cells_area">Area delle celle [m\u00b2]</string>
|
||||||
|
<string name="edit_location_hint_diffuse_efficiency">Efficienza da radiazione diffusa [%]</string>
|
||||||
|
<string name="edit_location_hint_inverter_power_limit">Potenza dell\u0027inverter [W]</string>
|
||||||
|
<string name="edit_location_hint_inverter_efficiency">Efficienza dell\u0027inverter [%]</string>
|
||||||
|
<string name="units_Wh">Wh</string>
|
||||||
|
<string name="edit_location_title">Modifica luogo</string>
|
||||||
|
<string name="edit_location_shading_azimuth_heading">Intervallo di Azimuth [°]</string>
|
||||||
|
<string name="edit_location_shading_solar_elevation_heading">Elevazione solare min. [°]</string>
|
||||||
|
<string name="edit_location_shading_opacity_heading">Ombra al di sotto di questa elevazione [%]</string>
|
||||||
|
<string name="edit_location_shading_heading">Ombreggiamento</string>
|
||||||
|
<string name="activity_help">Instruzioni</string>
|
||||||
|
<string name="action_sun_position">Posizione attuale del sole</string>
|
||||||
|
<string name="action_sun_elevation">Elevazione [°]</string>
|
||||||
|
<string name="edit_location_hint_cells_temp_coeff">Coefficiente di temperatura [%/K]</string>
|
||||||
|
<string name="activity_backuprestore">Backup/Ripristino</string>
|
||||||
|
<string name="backup_database">Backup database</string>
|
||||||
|
<string name="restore_database">Ripristina database</string>
|
||||||
|
<string name="permission_required">Permessi richiesti</string>
|
||||||
|
<string name="permission_message">%s deve accedere allo spazio di archiviazione esterno. Accetta i permessi e riprova.</string>
|
||||||
|
<string name="toast_delete">Cancella il file e riprova</string>
|
||||||
|
<string name="restore_database_message">Ripristina i dati dalla cartella Documenti. Apri la cartella \'Documenti\' e seleziona solXpect.zip se rchiesto!</string>
|
||||||
|
<string name="settings_summarize">Mostra somma</string>
|
||||||
|
<string name="summary_summarize">Somma i valori dei moduli con la stessa latitudine and longitudine.</string>
|
||||||
|
<string name="dialog_add_clone_button">Clona</string>
|
||||||
|
<string name="itemRemoved">RIMOSSO:\u0020\u0020%s</string>
|
||||||
|
<string name="undo">ANNULLA</string>
|
||||||
|
<string name="edit_location_hint_albedo">Albedo [0..1]</string>
|
||||||
|
<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>
|
|
@ -1,6 +1,5 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<color name="colorStatusBar">#181818</color>
|
|
||||||
<color name="colorPrimary">#181818</color>
|
<color name="colorPrimary">#181818</color>
|
||||||
<color name="colorPrimaryDark">#777777</color>
|
<color name="colorPrimaryDark">#777777</color>
|
||||||
<color name="colorAccent">#a0a0a0</color>
|
<color name="colorAccent">#a0a0a0</color>
|
||||||
|
|
112
app/src/main/res/values-tr/strings.xml
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
<resources>
|
||||||
|
<string name="activity_about">Hakkında</string>
|
||||||
|
<string name="activity_settings">Ayarlar</string>
|
||||||
|
<string name="activity_weather">Tahmin</string>
|
||||||
|
<string name="activity_manage">Konumu yönet</string>
|
||||||
|
<string name="action_refresh">Yenile</string>
|
||||||
|
<string name="navigation_drawer_open">Navigasyon bölümünü aç</string>
|
||||||
|
<string name="navigation_drawer_close">Navigasyon bölümünü kapat</string>
|
||||||
|
<string name="next">Sıradaki</string>
|
||||||
|
<string name="okay">Tamam</string>
|
||||||
|
<string name="slide1_heading">Hoşgeldin!</string>
|
||||||
|
<string name="slide1_text">solXpect güneş enerjisi santralinizin üretimini tahmin eder</string>
|
||||||
|
<string name="slide2_text">Bu uygulamanın kaynak kodu GitHub\'da mevcuttur. Daha fazla açıklama için Hakkında Sayfası\'na bir göz atın.</string>
|
||||||
|
<string name="card_week_heading">Hafta</string>
|
||||||
|
<string name="card_error_heading">Hava durumu verisini getirirken hata oluştu</string>
|
||||||
|
<string name="card_error_content">Lütfen güncellemeyi deneyin!</string>
|
||||||
|
<string name="about_privacy_heading">Gizlilik Bilgisi</string>
|
||||||
|
<string name="about">Hakkında</string>
|
||||||
|
<string name="version_number">Sürüm</string>
|
||||||
|
<string name="about_license">Lisans</string>
|
||||||
|
<string name="about_license_text">Bu uygulama, SECUSO araştırma grubu tarafından geliştirilen Privacy Friendly Weather\'dan türetilmiştir. Kaynak kodu GPLv3 altında lisanslanmıştır. Uygulama, Apache Lisansı Sürüm 2.0 altında lisanslanan Google Material Design Icons, 2 maddelik BSD Lisansı altında lisanslanan Leaflet kütüphanesi, Apache Lisansı Sürüm 2.0 altında lisanslanan AutoSuggestTextViewAPICall, MIT Lisansı altında lisanslanan Solarpositioning (net.e175.klaus:solarpositioning), Zip4j (https://github. com/srikanth-lingala/zip4j) Apache Lisansı Sürüm 2.0 altında, CompassView (https://github.com/kix2902/CompassView) Apache Lisansı Sürüm 2.0 altında ve WilliamChart kütüphanesi (com.db.chart) Apache Lisansı Sürüm 2.0 altında lisanslanmıştır.</string>
|
||||||
|
<string name="about_more_info">Daha fazla bilgi için:</string>
|
||||||
|
<string name="activity_settings_title">Ayarlar</string>
|
||||||
|
<string name="abbreviation_monday">Pzt.</string>
|
||||||
|
<string name="abbreviation_tuesday">Sal.</string>
|
||||||
|
<string name="abbreviation_wednesday">Çrş.</string>
|
||||||
|
<string name="abbreviation_thursday">Perş.</string>
|
||||||
|
<string name="abbreviation_friday">Cum.</string>
|
||||||
|
<string name="abbreviation_saturday">Cts.</string>
|
||||||
|
<string name="abbreviation_sunday">Paz.</string>
|
||||||
|
<string name="dialog_add_label">Eklemek için konum girin:</string>
|
||||||
|
<string name="dialog_add_no_city_found">Girdiğiniz bilgilerle eşleşen bir konum bulunamadı. listedeki öğelerden birini seçebilirsiniz. </string>
|
||||||
|
<string name="dialog_add_add_button">Ekle</string>
|
||||||
|
<string name="error_convert_to_json">Alınan hava durumu verileri iyi biçimlendirilmemiştir. </string>
|
||||||
|
<string name="error_no_internet">Cihazınız internete bağlı değil</string>
|
||||||
|
<string name="error_fetch_forecast">Tahmini güncellerken bir hata oluştu, tekrar deneyin!</string>
|
||||||
|
<string name="error_no_city_selected">Seçili bir konum yok. Bir konum seçmek için \"Konumları yönet\" bölümüne gidin.</string>
|
||||||
|
<string name="settings_interval_quarter">15 dk</string>
|
||||||
|
<string name="settings_interval_half">30 dk</string>
|
||||||
|
<string name="settings_interval_one">1 sa</string>
|
||||||
|
<string name="settings_interval_two">2 sa</string>
|
||||||
|
<string name="settings_interval_six">6 sa</string>
|
||||||
|
<string name="settings_interval_twelve">12 sa</string>
|
||||||
|
<string name="settings_interval_twentyfour">24 sa</string>
|
||||||
|
<string name="settings_intervals">Aralıklar</string>
|
||||||
|
<string name="settings_update_interval">Aralığı güncelle</string>
|
||||||
|
<string name="settings_interval_summary">Otomatik güncellemelerin aralığını ayarla</string>
|
||||||
|
<string name="about_privacy_answer">solXpect hava durumu verilerini almak için yalnızca \"İnternet\" iznini kullanır. Ayrıca herhangi bir izleme mekanizması veya reklam içermez.</string>
|
||||||
|
<string name="about_where_from">Hava durumu bilgileri nereden geliyor?</string>
|
||||||
|
<string name="about_where_from_answer">Hava durumu bilgilerinin alındığı yer</string>
|
||||||
|
<string name="long_press_text">Sıralamak için basılı tutun ve sürükleyin.</string>
|
||||||
|
<string name="swipe_to_delete">Silmek için kaydırın</string>
|
||||||
|
<string name="settings_title_display_options">Ekran seçenekleri</string>
|
||||||
|
<string name="infoProvider">Hava durumu bilgileri Open-Meteo.com\'dan çekilir</string>
|
||||||
|
<string name="monday">Pazartesi</string>
|
||||||
|
<string name="tuesday">Salı</string>
|
||||||
|
<string name="wednesday">Çarşamba</string>
|
||||||
|
<string name="thursday">Perşembe</string>
|
||||||
|
<string name="friday">Cuma</string>
|
||||||
|
<string name="saturday">Cumartesi</string>
|
||||||
|
<string name="sunday">Pazar</string>
|
||||||
|
<string name="chart">Grafik</string>
|
||||||
|
<string name="units_kWh">kWsa</string>
|
||||||
|
<string name="dialog_edit_change_button">Kaydet</string>
|
||||||
|
<string name="edit_location_hint_name">İsim</string>
|
||||||
|
<string name="settings_search">Ara</string>
|
||||||
|
<string name="settings_darkmode">Android 10+ Koyu Mod</string>
|
||||||
|
<string name="settings_time24h">24 saat formatı</string>
|
||||||
|
<string name="summary_time24h">Sistem ayarını geçersiz kıl</string>
|
||||||
|
<string name="dialog_OK_button">TAMAM</string>
|
||||||
|
<string name="dialog_NO_button">Hayır</string>
|
||||||
|
<string name="dialog_Later_button">Belki sonra</string>
|
||||||
|
<string name="dialog_StarOnGitHub">Bu uygulamayı beğendiniz mi? Lütfen GitHub\'da yıldız verin ve geliştiriciye PayPal ile bir kahve ısmarlayın.</string>
|
||||||
|
<string name="slide3_heading">Open-Meteo</string>
|
||||||
|
<string name="settings_forecast_days">Tahmin edilen gün sayısı</string>
|
||||||
|
<string name="edit_location_hint_latitude">Enlem [°]</string>
|
||||||
|
<string name="edit_location_hint_longitude">Boylam [°]</string>
|
||||||
|
<string name="edit_location_hint_azimuth">Azimut [°]</string>
|
||||||
|
<string name="edit_location_hint_tilt">Eğim [°]</string>
|
||||||
|
<string name="edit_location_hint_cells_max_power">Hücrelerin tepe gücü [W]</string>
|
||||||
|
<string name="edit_location_hint_cells_efficiency">Hücre verimliliği [%]</string>
|
||||||
|
<string name="edit_location_hint_cells_area">Hücre bölgesi [m\u00b2]</string>
|
||||||
|
<string name="edit_location_hint_diffuse_efficiency">Dağınık radyasyon verimliliği [%]</string>
|
||||||
|
<string name="edit_location_hint_inverter_power_limit">İnvertör gücü [W]</string>
|
||||||
|
<string name="edit_location_hint_inverter_efficiency">İnvertör verimliliği [%]</string>
|
||||||
|
<string name="units_Wh">Wh</string>
|
||||||
|
<string name="edit_location_title">Konumu düzenle</string>
|
||||||
|
<string name="edit_location_shading_azimuth_heading">Azimut menzili [°]</string>
|
||||||
|
<string name="edit_location_shading_solar_elevation_heading">Min. güneş yüksekliği [°]</string>
|
||||||
|
<string name="edit_location_shading_opacity_heading">Bu yüksekliğin altında gölgelendirme [%]</string>
|
||||||
|
<string name="edit_location_shading_heading">Gölgelendirme</string>
|
||||||
|
<string name="activity_help">Yönergeler</string>
|
||||||
|
<string name="action_sun_position">Güncel güneş konumu</string>
|
||||||
|
<string name="action_sun_elevation">Yükseklik [°]</string>
|
||||||
|
<string name="edit_location_hint_cells_temp_coeff">Sıcaklık katsayısı [%/K]</string>
|
||||||
|
<string name="activity_backuprestore">Yedekle/Geri Yükle</string>
|
||||||
|
<string name="backup_database">Yedekleme veritabanı</string>
|
||||||
|
<string name="restore_database">Geri Yükleme veritabanı</string>
|
||||||
|
<string name="permission_required">İzİn gerekli</string>
|
||||||
|
<string name="permission_message">%s harici depolama alanına erişmesi gerekiyor. Lütfen izni kabul edin ve tekrar deneyin.</string>
|
||||||
|
<string name="toast_delete">Lütfen dosyayı silin ve tekrar deneyin</string>
|
||||||
|
<string name="restore_database_message">Belgeler klasöründen Verileri Geri Yükleyin. Eğer gerekirse \'Belgeler\' klasörünü açın ve solXpect.zip dosyasını seçin!</string>
|
||||||
|
<string name="settings_summarize">Toplamı göster</string>
|
||||||
|
<string name="summary_summarize">Aynı enlem ve boylamdaki modüllerin değerlerini özetleyin.</string>
|
||||||
|
<string name="dialog_add_clone_button">Klon</string>
|
||||||
|
<string name="itemRemoved">\u0020\u0020%s KALDIRILDI</string>
|
||||||
|
<string name="undo">GERİ AL</string>
|
||||||
|
<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>
|
|
@ -1,9 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Refer to App Widget Documentation for margin information
|
|
||||||
http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout
|
|
||||||
-->
|
|
||||||
|
|
||||||
</resources>
|
|
|
@ -1,14 +0,0 @@
|
||||||
<resources>
|
|
||||||
<style name="AppTheme" parent="Theme.AppCompat.DayNight.DarkActionBar">
|
|
||||||
<!-- Customize your theme here. -->
|
|
||||||
<item name="colorPrimary">@color/colorPrimary</item>
|
|
||||||
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
|
||||||
<item name="colorAccent">@color/colorAccent</item>
|
|
||||||
<item name="android:statusBarColor">@color/colorStatusBar</item>
|
|
||||||
</style>
|
|
||||||
<style name="AppTheme.NoActionBar">
|
|
||||||
<item name="windowActionBar">false</item>
|
|
||||||
<item name="windowNoTitle">true</item>
|
|
||||||
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
|
|
||||||
</style>
|
|
||||||
</resources>
|
|
|
@ -1,6 +0,0 @@
|
||||||
<resources>
|
|
||||||
<!-- Example customization of dimensions originally defined in res/values/dimens.xml
|
|
||||||
(such as screen margins) for screens with more than 820dp of available width. This
|
|
||||||
would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
|
|
||||||
<dimen name="activity_horizontal_margin">64dp</dimen>
|
|
||||||
</resources>
|
|
115
app/src/main/res/values-zh-rCN/strings.xml
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
<resources>
|
||||||
|
<string name="app_name">发电预测</string>
|
||||||
|
<string name="activity_about">关于</string>
|
||||||
|
<string name="activity_settings">设置</string>
|
||||||
|
<string name="activity_weather">天气预报</string>
|
||||||
|
<string name="activity_manage">管理位置</string>
|
||||||
|
<string name="action_refresh">刷新</string>
|
||||||
|
<string name="navigation_drawer_open">打开导航抽屉</string>
|
||||||
|
<string name="navigation_drawer_close">关闭导航抽屉</string>
|
||||||
|
<string name="next">下一步</string>
|
||||||
|
<string name="okay">确定</string>
|
||||||
|
<string name="slide1_heading">欢迎!</string>
|
||||||
|
<string name="slide1_text">太阳能预测可预测您的太阳能发电站输出</string>
|
||||||
|
<string name="slide2_text">本应用的源代码可在GitHub获取。更多说明请查看关于页面。</string>
|
||||||
|
<string name="card_week_heading">本周</string>
|
||||||
|
<string name="card_error_heading">获取天气数据错误</string>
|
||||||
|
<string name="card_error_content">请尝试更新!</string>
|
||||||
|
<string name="about_privacy_heading">隐私信息</string>
|
||||||
|
<string name="about">关于</string>
|
||||||
|
<string name="version_number">版本号</string>
|
||||||
|
<string name="about_license">许可证</string>
|
||||||
|
<string name="about_license_text">本应用衍生自SECUSO研究小组开发的Privacy Friendly Weather。源代码采用GPLv3许可。应用使用的图标来自Google Material Design Icons(Apache 2.0许可)、Leaflet库(BSD 2条款许可)、AutoSuggestTextViewAPICall(Apache 2.0许可)、Solarpositioning(MIT许可)、Zip4j(Apache 2.0许可)、CompassView(Apache 2.0许可)和WilliamChart库(Apache 2.0许可)</string>
|
||||||
|
<string name="about_more_info">更多信息请访问:</string>
|
||||||
|
<string name="activity_settings_title">设置</string>
|
||||||
|
<string name="abbreviation_monday">周一</string>
|
||||||
|
<string name="abbreviation_tuesday">周二</string>
|
||||||
|
<string name="abbreviation_wednesday">周三</string>
|
||||||
|
<string name="abbreviation_thursday">周四</string>
|
||||||
|
<string name="abbreviation_friday">周五</string>
|
||||||
|
<string name="abbreviation_saturday">周六</string>
|
||||||
|
<string name="abbreviation_sunday">周日</string>
|
||||||
|
<string name="dialog_add_label">输入要添加的位置:</string>
|
||||||
|
<string name="dialog_add_no_city_found">未找到匹配您输入的位置。建议从下拉列表中选择项目。</string>
|
||||||
|
<string name="dialog_add_add_button">添加</string>
|
||||||
|
<string name="error_convert_to_json">获取的天气数据格式不正确。</string>
|
||||||
|
<string name="error_no_internet">您的设备未连接到互联网</string>
|
||||||
|
<string name="error_fetch_forecast">更新预报时出错,请重试!</string>
|
||||||
|
<string name="error_no_city_selected">未选择位置。请前往\"管理位置\"进行选择。</string>
|
||||||
|
<string name="settings_interval_quarter">15分钟</string>
|
||||||
|
<string name="settings_interval_half">30分钟</string>
|
||||||
|
<string name="settings_interval_one">1小时</string>
|
||||||
|
<string name="settings_interval_two">2小时</string>
|
||||||
|
<string name="settings_interval_six">6小时</string>
|
||||||
|
<string name="settings_interval_twelve">12小时</string>
|
||||||
|
<string name="settings_interval_twentyfour">24小时</string>
|
||||||
|
<string name="settings_intervals">间隔</string>
|
||||||
|
<string name="settings_update_interval">更新间隔</string>
|
||||||
|
<string name="settings_interval_summary">设置自动更新的间隔时间</string>
|
||||||
|
<string name="about_privacy_answer">太阳能预测仅使用\"互联网\"权限获取天气数据。不包含任何跟踪机制或广告。</string>
|
||||||
|
<string name="about_where_from">天气信息来自哪里?</string>
|
||||||
|
<string name="about_where_from_answer">天气信息获取自</string>
|
||||||
|
<string name="long_press_text">长按并拖动可排序。</string>
|
||||||
|
<string name="swipe_to_delete">滑动删除</string>
|
||||||
|
<string name="settings_title_display_options">显示选项</string>
|
||||||
|
<string name="infoProvider">天气信息获取自Open-Meteo.com</string>
|
||||||
|
<string name="monday">星期一</string>
|
||||||
|
<string name="tuesday">星期二</string>
|
||||||
|
<string name="wednesday">星期三</string>
|
||||||
|
<string name="thursday">星期四</string>
|
||||||
|
<string name="friday">星期五</string>
|
||||||
|
<string name="saturday">星期六</string>
|
||||||
|
<string name="sunday">星期日</string>
|
||||||
|
<string name="chart">图表</string>
|
||||||
|
<string name="units_kWh">千瓦时</string>
|
||||||
|
<string name="dialog_edit_change_button">保存</string>
|
||||||
|
<string name="edit_location_hint_name">名称</string>
|
||||||
|
<string name="settings_search">搜索</string>
|
||||||
|
<string name="settings_darkmode">Android 10+深色模式</string>
|
||||||
|
<string name="settings_time24h">24小时制</string>
|
||||||
|
<string name="summary_time24h">覆盖系统设置</string>
|
||||||
|
<string name="dialog_OK_button">确定</string>
|
||||||
|
<string name="dialog_NO_button">否</string>
|
||||||
|
<string name="dialog_Later_button">稍后再说</string>
|
||||||
|
<string name="dialog_StarOnGitHub">喜欢这个应用吗?请在GitHub上给个星标,并通过PayPal请开发者喝杯咖啡。</string>
|
||||||
|
<string name="slide3_heading">Open-Meteo</string>
|
||||||
|
<string name="settings_forecast_days">预报天数</string>
|
||||||
|
<string name="edit_location_hint_latitude">纬度[°]</string>
|
||||||
|
<string name="edit_location_hint_longitude">经度[°]</string>
|
||||||
|
<string name="edit_location_hint_azimuth">方位角[°]</string>
|
||||||
|
<string name="edit_location_hint_tilt">倾斜角[°]</string>
|
||||||
|
<string name="edit_location_hint_cells_max_power">电池峰值功率[W]</string>
|
||||||
|
<string name="edit_location_hint_cells_efficiency">电池效率[%]</string>
|
||||||
|
<string name="edit_location_hint_cells_area">电池面积[m²]</string>
|
||||||
|
<string name="edit_location_hint_diffuse_efficiency">漫射辐射效率[%]</string>
|
||||||
|
<string name="edit_location_hint_inverter_power_limit">逆变器功率[W]</string>
|
||||||
|
<string name="edit_location_hint_inverter_efficiency">逆变器效率[%]</string>
|
||||||
|
<string name="units_Wh">瓦时</string>
|
||||||
|
<string name="edit_location_title">编辑位置</string>
|
||||||
|
<string name="edit_location_shading_azimuth_heading">方位角范围[°]</string>
|
||||||
|
<string name="edit_location_shading_solar_elevation_heading">最小太阳高度角[°]</string>
|
||||||
|
<string name="edit_location_shading_opacity_heading">此高度以下的遮阳度[%]</string>
|
||||||
|
<string name="edit_location_shading_heading">遮阳</string>
|
||||||
|
<string name="activity_help">使用说明</string>
|
||||||
|
<string name="action_sun_position">当前太阳位置</string>
|
||||||
|
<string name="action_sun_elevation">高度角[°]</string>
|
||||||
|
<string name="edit_location_hint_cells_temp_coeff">温度系数[%/K]</string>
|
||||||
|
<string name="activity_backuprestore">备份/恢复</string>
|
||||||
|
<string name="backup_database">备份数据库</string>
|
||||||
|
<string name="restore_database">恢复数据库</string>
|
||||||
|
<string name="permission_required">需要权限</string>
|
||||||
|
<string name="permission_message">%s需要访问外部存储。请授予权限后重试。</string>
|
||||||
|
<string name="toast_delete">请删除文件后重试</string>
|
||||||
|
<string name="settings_summarize">显示总和</string>
|
||||||
|
<string name="summary_summarize">汇总相同经纬度模块的值。</string>
|
||||||
|
<string name="dialog_add_clone_button">克隆</string>
|
||||||
|
<string name="itemRemoved">已删除:%s</string>
|
||||||
|
<string name="undo">撤销</string>
|
||||||
|
<string name="edit_location_hint_albedo">反照率[0..1]</string>
|
||||||
|
<string name="settings_server_urls">服务器URL</string>
|
||||||
|
<string name="settings_server_summary">仅在您想托管自己的服务器时更改</string>
|
||||||
|
<string name="edit_location_hint_central_inverter">中央逆变器</string>
|
||||||
|
<string name="card_today_heading">今日</string>
|
||||||
|
<string name="card_today_produced">已发电:</string>
|
||||||
|
<string name="card_today_remaining">剩余:</string>
|
||||||
|
</resources>
|
|
@ -1,6 +1,5 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<color name="colorStatusBar">#024265</color>
|
|
||||||
<color name="colorPrimary">#024265</color>
|
<color name="colorPrimary">#024265</color>
|
||||||
<color name="colorPrimaryDark">#024265</color>
|
<color name="colorPrimaryDark">#024265</color>
|
||||||
<color name="colorAccent">#0274b2</color>
|
<color name="colorAccent">#0274b2</color>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">solXpect</string>
|
<string name="app_name" translatable="false">solXpect</string>
|
||||||
<string name="activity_about">About</string>
|
<string name="activity_about">About</string>
|
||||||
<string name="activity_settings">Settings</string>
|
<string name="activity_settings">Settings</string>
|
||||||
<string name="activity_weather">Forecast</string>
|
<string name="activity_weather">Forecast</string>
|
||||||
|
@ -110,4 +110,11 @@
|
||||||
<string name="itemRemoved">REMOVED:\u0020\u0020%s</string>
|
<string name="itemRemoved">REMOVED:\u0020\u0020%s</string>
|
||||||
<string name="undo">UNDO</string>
|
<string name="undo">UNDO</string>
|
||||||
<string name="edit_location_hint_albedo">Albedo [0..1]</string>
|
<string name="edit_location_hint_albedo">Albedo [0..1]</string>
|
||||||
|
<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>
|
||||||
|
<string name="card_today_heading">Today</string>
|
||||||
|
<string name="card_today_produced">Produced:</string>
|
||||||
|
<string name="card_today_remaining">Remaining:</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -51,4 +51,22 @@
|
||||||
android:title="@string/settings_update_interval" />
|
android:title="@string/settings_update_interval" />
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
|
||||||
|
<PreferenceCategory android:title="@string/settings_server_urls" android:summary="@string/settings_server_summary">
|
||||||
|
<EditTextPreference
|
||||||
|
android:title="Open-Meteo API"
|
||||||
|
android:key="pref_OM_URL"
|
||||||
|
android:defaultValue="https://api.open-meteo.com/v1/"
|
||||||
|
/>
|
||||||
|
<EditTextPreference
|
||||||
|
android:title="OpenStreetMap API"
|
||||||
|
android:key="pref_OsmTiles_URL"
|
||||||
|
android:defaultValue="https://tile.openstreetmap.org/"
|
||||||
|
/>
|
||||||
|
<EditTextPreference
|
||||||
|
android:title="Open-Meteo Geocoding API"
|
||||||
|
android:key="pref_OMGEO_URL"
|
||||||
|
android:defaultValue="https://geocoding-api.open-meteo.com/"
|
||||||
|
/>
|
||||||
|
</PreferenceCategory>
|
||||||
|
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
||||||
|
|
|
@ -9,7 +9,7 @@ buildscript {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:7.1.1'
|
classpath 'com.android.tools.build:gradle:8.2.2'
|
||||||
|
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
// in the individual module build.gradle files
|
// in the individual module build.gradle files
|
||||||
|
|
2
fastlane/metadata/android/en-US/changelogs/21.txt
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
Add Turkish translation
|
||||||
|
Improved calculation for shading
|
1
fastlane/metadata/android/en-US/changelogs/22.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Add option to run own servers for APIs
|
1
fastlane/metadata/android/en-US/changelogs/23.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Update for Android 14 (SDK 34)
|
2
fastlane/metadata/android/en-US/changelogs/24.txt
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
Reset cumulated values every 24h
|
||||||
|
Bugfix
|
1
fastlane/metadata/android/en-US/changelogs/25.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Add option for central inverter
|
2
fastlane/metadata/android/en-US/changelogs/26.txt
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
Show produced / remaining information for current day
|
||||||
|
Bugfix
|
1
fastlane/metadata/android/en-US/changelogs/27.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Update for Android 15 (SDK 35)
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 48 KiB |
4
gradle/wrapper/gradle-wrapper.properties
vendored
|
@ -1,7 +1,7 @@
|
||||||
#Mon Oct 03 08:25:14 CEST 2022
|
#Mon Oct 03 08:25:14 CEST 2022
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
distributionSha256Sum=f581709a9c35e9cb92e16f585d2c4bc99b2b1a5f85d2badbd3dc6bff59e1e6dd
|
distributionSha256Sum=9631d53cf3e74bfa726893aee1f8994fee4e060c401335946dba2156f440f24c
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
|
|
@ -61,8 +61,8 @@
|
||||||
</g>
|
</g>
|
||||||
<g class="com.sun.star.drawing.PolyPolygonShape">
|
<g class="com.sun.star.drawing.PolyPolygonShape">
|
||||||
<g id="id7">
|
<g id="id7">
|
||||||
<rect class="BoundingBox" stroke="none" fill="none" x="4931" y="11438" width="4468" height="3564"/>
|
<rect class="BoundingBox" stroke="none" fill="none" x="5041" y="11516" width="4468" height="3564"/>
|
||||||
<path fill="rgb(25,32,114)" stroke="none" d="M 6741,15000 L 4931,11674 7588,11439 9398,14766 6741,15000 Z"/>
|
<path fill="rgb(25,32,114)" stroke="none" d="M 6851,15078 L 5041,11752 7698,11517 9508,14844 6851,15078 Z"/>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
<g class="com.sun.star.drawing.PolyPolygonShape">
|
<g class="com.sun.star.drawing.PolyPolygonShape">
|
||||||
|
|
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 8.6 KiB |