Documentation • Wetter
Technical Manual & Specification
Complete engineering reference for the weather and solar PV platform: Mathematical modeling of solar yield, native Android app with home screen widget, direct Open-Meteo REST integration, and zero-tracking architecture.
Introduction & Philosophy
Wetter is a privacy-first weather and solar PV ecosystem created by Jeremy Benz. Built upon the principles of Zero-Bloat and Privacy-by-Design:
- No Relay Servers: All weather and geocoding requests are performed directly client-side against the open Open-Meteo API. No intermediate proxy logs IP addresses or coordinates.
- Zero Telemetry: Neither the web application nor the native Android app contains analytics SDKs, advertising libraries, or tracking pixels.
- Pure Performance: The web app uses HTML, CSS, and Canvas. No verified interaction latency measurement is available. The Android app uses Java without a WebView for its main interface.
Solar PV Physics Model
The following reference model from the former manual describes an idealized estimate. Check the current web app implementation separately; this formula is not a measurement. The yield calculation estimates instantaneous electrical power $P_{pv}$ (in Watts) for a 5 kWp residential photovoltaic system with monocrystalline silicon modules:
P_pv = P_peak × (G_eff / 1000 W/m²) × [1 + γ × (T_cell - 25°C)] × η_inverter
Model Parameters & Physical Coefficients:
- P_peak = 5000 W (5.0 kWp): Nominal module peak capacity under Standard Test Conditions (STC: 1000 W/m², 25°C cell temperature, AM 1.5).
- G_eff (effective irradiance): Calculated from solar elevation θ and cloud cover percentage:
G_eff = G_clearsky × (1 - 0.75 × (cloud_cover / 100)^3.4) - γ = -0.0038 / °C (-0.38 %/°C): Negative temperature power coefficient for monocrystalline silicon cells. Higher cell temperatures diminish efficiency.
- T_cell (module cell temperature): Estimated via the NOCT model (Nominal Operating Cell Temperature, 45°C):
T_cell = T_ambient + ((45 - 20) / 800) × G_eff - η_inverter = 0.96 (96%): Conversion efficiency of modern transformerless string inverters including wiring losses.
When the sun is below the horizon (θ ≤ 0°), irradiance is strictly clamped to 0.0 W. Daily cumulative yield (kWh) is calculated by integrating hourly outputs: E_day = ∑ (P_pv / 1000) × 1h.
Current design and data sources
The web app directly uses Open-Meteo weather and geocoding APIs. Direct DWD integration and DWD radar are not implemented. The weather card and daily solar chart follow the compact design of the project page; solar estimates use a 5 kWp reference system.
Adapting the Android app and its widget to this design is planned. The widget preview on the project page shows the design target, not the current Android interface.
Native Android App & Home Screen Widget
The native Android app (com.benzjeremy.wetter) provides peak performance and zero browser dependency:
Home screen widget (4x2 / 4x1)
Displays current temperature, weather emoji, min/max range, location, solar PV output, and in v1.1 a battery-efficient real-time system clock (TextClock). Includes a one-tap refresh button via PendingIntent broadcast.
Configurable refresh and caching
New in v1.1: Configurable background interval (15m, 30m, 1h, or manual/off) using Android inexact AlarmManager. Automatically scheduled on device restart (BOOT_COMPLETED). SharedPreferences caching eliminates redundant cellular requests.
Installation & F-Droid Integration:
The app is officially distributed through the myfdroid repository:
https://myfdroid.benzjeremy.pp.ua/repo/?fingerprint=A2AD027C856AE9E111B17A55DF5303BB423DBF8D447DC981BDB0E21346963CB7Current APK: GitHub Releases or myfdroid.
Open-Meteo API & WMO Codes
The system relies on standardized public REST endpoints provided by Open-Meteo without authentication:
GET https://api.open-meteo.com/v1/forecast?latitude=52.52&longitude=13.41¤t=temperature_2m,relative_humidity_2m,apparent_temperature,weather_code,surface_pressure,wind_speed_10m&hourly=temperature_2m,precipitation_probability,cloud_cover&daily=weather_code,temperature_2m_max,temperature_2m_min&timezone=autoWMO Weather Interpretation Table:
| WMO code | Symbol | Meaning |
|---|---|---|
| 0 | ☀️ | Clear sky |
| 1, 2, 3 | 🌤️ / ☁️ | Mainly clear to overcast |
| 45, 48 | 🌫️ | Fog and depositing rime fog |
| 51, 53, 55 | 🌦️ | Drizzle (light to dense) |
| 61, 63, 65 | 🌧️ | Rain (slight, moderate, heavy) |
| 71, 73, 75 | ❄️ | Snow fall |
| 80, 81, 82 | 🌦️ | Rain showers |
| 95, 96, 99 | ⛈️ | Thunderstorm (with hail) |
Web, hosting, and source
| Layer | URL | Purpose |
|---|---|---|
| Project page | https://wetter.benzjeremy.pp.ua/ | Overview and downloads |
| Web app | https://wetter.benzjeremy.pp.ua/app/ | Interactive weather station |
| Wiki | https://wiki.benzjeremy.pp.ua/wetter/ | Documentation |
| Source | GitHub main | Android source and releases |
FAQ & Troubleshooting
Why does the Android widget sometimes update with a delay?
Android enforces strict battery optimization (Doze Mode & App Standby). To preserve battery life, the weather app does not continuously poll the network in the background. You can instantly update the widget at any time by tapping the refresh icon (🔄).
How do I switch the temperature unit?
In the web application, select your preferred unit (°C, °F, or Kelvin) in the header. In the Android app, use the unit switch located directly in the dashboard header.
How accurate is the solar PV forecast?
The calculation assumes an unshaded south-facing installation with 35° roof pitch. Local shading from trees or surrounding buildings as well as snow cover can diminish real-world yields.