# Copyright 2026 Kemal Yaylali # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """The dashboard: six tabs in the header, one viewport, no scrolling. Layout contract. The page is a fixed three-row grid pinned to the viewport height: header, tab bar, then a content region that takes the remaining space and never overflows the fold. Each tab lays its panels out on an internal grid sized in fractions of that region, so nothing depends on content height. Where a panel genuinely holds more than fits (the daily records table, the methods prose) that individual panel scrolls internally while the page frame stays put. Below 1024 px the constraint is released, because pinning five panels into a phone viewport produces unreadable eight-pixel type, and a phone user expects to scroll anyway. Visual language carries over unchanged from the previous station page: slate-950 ground, glass panels, Jakarta for prose and JetBrains Mono for anything numeric. The one new structural device is the tab bar, and it earns its place. Five distinct questions (what is it doing, what will it do, what did it do, is the model any good, how does it work) were previously one long scroll where the important things sat below the fold. The signature element is the estimator internals panel on the Live tab. Most weather dashboards show numbers. This one shows the state estimator working: self-heating coefficient, Kalman innovation, novelty distance and drift pressure, all ticking at 2 Hz. It is the part of the system that is normally invisible, and watching a filter converge is the most honest possible demonstration that there is real machinery underneath. """ DASHBOARD_HTML = r""" Ashvale Station

Ashvale Station

- · 0 d logged · k=-

health --:--:--

Seven day outlook

climatology plus decaying anomaly, not a synoptic forecast

warming up
Temperature KALMAN
--°C
rate--
raw / cpu--
Humidity HTS221
--%
dew point--
depression--
Barometer MSL
--hPa
tendency--
character--
Sky
--clr
cloud index--
sun / cct--

Observed and forecast

90% band

Conditions ahead

Zambretti prior + online logistic

--
--
Z=- · -
rain probability--
prior -learner -trust -
Was it wet in the last hour?
0 confirmed observations
pressure, last 24 h --

Slope, not level, drives the forecast.

wet bulb
--
vpd
--
abs hum
--
heat idx
--
solar el
--
pitch
--
roll
--
yaw
--
compass
--
accel z
--

-

Records

Verification scorecard

skill above zero means it beats persistence · p/c/l is the ensemble weight

No matured forecasts yet. Rows appear as each horizon reaches its validity time: 15 minutes first, 24 hours tomorrow.

Temperature

self-heating
coefficient k--
cpu offset--
Enter a trusted thermometer reading in °C. One good reading is enough.

Humidity

element bias
offset--
psychrometric--
Enter a trusted hygrometer reading in %. The psychrometric term is derived, not fitted.

Estimator

novelty d²--
drift pressure--

Storage and weights

Station log

Kalman bank

NIS near 1 means honestly tuned

Compensators

Learner bank

18 independent RLS heads

Feature attribution

largest |θ| after standardisation, so these are comparable

Detectors

Climatology

Precipitation

Reliability

realised coverage against the 90% nominal

Surroundings

a change here marks a discontinuity and queues a retrain

--
where it lives

Indoors the building governs temperature and humidity, not the sky. Pressure passes through walls, which is why precipitation runs on tendency.

enclosure

Closing a door changes how strongly the sensor couples to outside. The heads carry about 55 hours of memory, so tell them rather than waiting two days.

Matrix

8x8 display
frame rate--

24 costs about 11% of one core. 16 is still fluid and a third cheaper. Below 12 the crossfades judder.

Site and model

altitude feeds the sea-level reduction on every row

Psychrometric humidity correction

Moves RH from the element's temperature onto air temperature. Off by default: measured against a reference this board read 75.4% where the truth was 50.4%, so it reads high and this would push it higher.

Maintenance

How it is wired

select a stage to read its rationale

"""