Skip to content

About

AganetWX — a configurable, sensor-agnostic WeeWX 5.x skin (modern dashboard + classic meteo.gr layouts, interactive charts, i18n, dark mode).

Topics

Resources

Stars

2 stars

Watchers

2 watching

Forks

Repository files navigation

AganetWX, a WeeWX skin

A weather dashboard skin for WeeWX 5.x. There are several great skins out there, but I wanted the exact layout and data I had in mind, so I gave making my own a try. Interactive charts, a page per time period, it shows whatever sensors you have, and it translates. Everything is set in weewx.conf; you never edit a template.

Source and releases: github.com/aganet/weewx-aganetwx

Live demo: aganet.gr

Modern layout (default)

Classic layout and dark mode (each one config line)

layout = classic switches to a warm, compact label-row look:

Classic layout

mode = dark:

Dark theme


Highlights

  • Seven pages behind a top nav: Current, Yesterday, Week, Month, Year, Last Year, Archive (plus About).
  • An interactive chart per metric, drawn with Apache ECharts (self-hosted, no CDN): temperature and its friends (dew point, apparent, heat index, wind chill), humidity, barometer, wind speed and gust, wind direction, wind rose, rain, UV, solar radiation, evapotranspiration and cloud base.
  • A current-conditions hero with the big temperature, feels-like and today's high/low. By default it tints by temperature, ice-blue when freezing through to deep red when hot, and shows a little weather-mood face with a one-word caption (Brrr! ... Perfect ... Melting!). Turn either off if you prefer.
  • Trend arrows (rising / steady / falling) next to temperature, humidity and UV, and a 3-hour pressure tendency under the barometer.
  • Threshold highlighting: give a value a high/low limit and its row lights up red or blue when it crosses. Ships with defaults tuned for a warm climate; change them in weewx.conf.
  • An all-time records card: the highest and lowest temperature, wind gust, humidity, barometer and rain rate in your archive, each with the date it happened. There's also a "last rain" line.
  • A "today in one sentence" summary in plain language, built from the station's own data, with active weather alerts (heat, frost, strong wind, heavy rain, high UV, humidity) appended when today crosses your thresholds. On by default.
  • A "compared to the past" card: today vs yesterday, this month's rain vs the same month in prior years, and today vs this date last year, all from your own archive. Off by default; richer with more history.
  • An optional History page (own nav tab): overlay any metric across every year in your archive, either day-by-day for a chosen month or across all twelve months of each year, to see which years ran hot, wet or windy. Pick years with checkboxes; each year has its own colour (shown as a swatch) and the newest is drawn bold. Off by default.
  • A stale-data banner when the station goes quiet for over an hour (configurable). It runs in the browser off an absolute timestamp, so it still shows if report generation has stopped, and it is right in any visitor's timezone.
  • Sensor-agnostic. It discovers whatever your station records, extra temperature and humidity channels, soil, leaf, air quality, lightning, battery, with no hardcoded list, so it looks complete on a Davis, an Ecowitt, a Tempest, or a bare thermometer.
  • Theming from weewx.conf: colours, gradient, font, density, and light / dark / auto mode. A header switcher lets visitors flip between Modern, Classic and Dark, and their choice sticks.
  • Seven languages built in (English, Greek, Spanish, French, German, Italian, Portuguese), with a header dropdown that relabels the whole page, charts included, without a reload. The browser language is picked on the first visit. Adding one is a single lang/<code>.conf file, no template edits.
  • NOAA monthly and yearly reports, linked from the Archive page.
  • An About page that reads the station hardware, coordinates, altitude and software versions on its own, plus your own prose and contact fields. One toggle hides the exact coordinates.
  • An optional webcam banner above the nav on the Current page. It only reloads the image when the frame actually changed (or stays static), shows a countdown, and opens full-size in a lightbox on click. Size, position and a click-through link are yours to set. For more than one camera, a separate Cameras page (own nav tab) shows a configurable grid, leaving the main banner untouched.
  • A "Useful Links" card, a few external links (a lightning map, Windy, a satellite view; Greek by default) you edit in config.
  • An optional HF propagation card for radio amateurs: solar flux, sunspots, A- and K-index, and a colour-coded band-conditions table from HamQSL. Off unless you turn it on.
  • It follows your WeeWX units (us, metric or metricwx) and timezone rather than imposing its own, so every value, axis and label matches the rest of your setup. Override per-report if you want this one page to differ.

Requirements

  • WeeWX 5.x (Python 3).
  • No external services. Charts and all assets are self-hosted.

Install

Install straight from the latest release (no download step needed):

sudo weectl extension install https://github.com/aganet/weewx-aganetwx/releases/latest/download/AganetWX-1.8.26.zip
sudo systemctl restart weewx          # or: sudo /etc/init.d/weewx restart

Or, if you already downloaded the zip, point at its full path:

sudo weectl extension install /path/to/AganetWX-1.8.26.zip

This adds a [[AganetWXReport]] report under [StdReport], installs the skin to skins/AganetWX, and the sensor-discovery helper to bin/user/aganetwx_extras.py. Output lands in public_html/aganetwx/; browse to .../aganetwx/.

Running alongside another skin

WeeWX runs every enabled report under [StdReport], so AganetWX can sit next to your existing skin instead of replacing it. It writes to its own subfolder (HTML_ROOT = aganetwx), so nothing collides: your current skin stays at its usual address and AganetWX appears at .../aganetwx/. To make it primary instead, set HTML_ROOT to your site root. To turn it off without uninstalling, set enable = false in [[AganetWXReport]].

Uninstall

weectl extension uninstall AganetWX

Configuration

Everything is optional. Defaults live in skins/AganetWX/skin.conf; override any of them per-report in weewx.conf under [StdReport] [[AganetWXReport]], without touching a template.

Put your settings in weewx.conf, not in skin.conf. An extension update overwrites skin.conf, so edits there are lost on the next upgrade. Values in weewx.conf are never touched by updates and take precedence over the skin defaults. Mirror the [[[Extras]]] structure under [[AganetWXReport]].

Example:

[StdReport]
    [[AganetWXReport]]
        skin = AganetWX
        HTML_ROOT = aganetwx
        lang = en                     # default language (en el es fr de it pt)
        # unit_system inherited from your WeeWX config; set here only to differ.

        [[[Extras]]]
            languages = en, el, es, fr, de, it, pt  # in-page switcher
            extra_sensors = true      # auto-discovered sensors panel

            [[[[theme]]]]
                layout = modern       # classic (compact rows) | modern (card tiles)
                mode = dark           # light | dark | auto
                accent = "#00d8ff"
                gradient_top = "#243447"
                gradient_bottom = "#1a2531"
                font = "Verdana, Geneva, sans-serif"
                density = compact     # comfortable | compact

            [[[[nav]]]]               # show/hide period tabs
                lastyear = false
                archive = true

            [[[[charts]]]]            # show/hide individual charts
                cloudbase = false

            [[[[rows]]]]              # show/hide rows (all three left-column boxes)
                heatindex = false

            [[[[branding]]]]
                show_footer_coords = true
                link_url = "https://example.com"
                link_text = "My site"
                show_theme_credit = false   # remove the "theme by anegio.com" footer credit

            [[[[analytics]]]]         # optional tracking snippet
                # One line; triple quotes keep the snippet's own quotes.
                head = '''<script defer src="https://umami.example.com/script.js" data-website-id="your-id"></script>'''

            [[[[support]]]]           # optional support button
                enable = true
                url = "https://ko-fi.com/yourname"
                # text = "Buy me a coffee"  # unset = "Support this station"; "" = icon only
                # tooltip = ""              # hover text; empty = "Support this weather station"

Note that lang must come before [[[Extras]]]: any key placed after a subsection is parsed as part of that subsection, so a lang below it is silently ignored.

Config reference

Setting Values Default Effect
lang en,el,es,fr,de,it,pt en Server-rendered default language (loads lang/<code>.conf)
unit_system us,metric,metricwx (inherited) Optional per-report override; by default follows your WeeWX config
Extras.languages code list all 7 Languages in the in-page switcher; single code hides it
Extras.extra_sensors bool true Auto-discovered extra-sensor panel
Extras.extra_sensor_groups group list all Limit which sensor groups show in that panel, in order (temp,humidity,soil,leaf,air,lightning,other,status); empty shows all
Extras.temp_chart_series obs list default Which series the Temperature chart draws, in order, incl. extra sensors (e.g. outTemp, extraTemp2); empty = default set
Extras.header_subtitle_show bool false Show the header sub-line under the station name; off by default
Extras.header_subtitle string empty Text for that sub-line; empty uses the station hardware from WeeWX (e.g. "Davis Vantage Pro2"), or set your own
Extras.update_check bool false Check GitHub once a day (client-side, cached) for a newer AganetWX release and show an "update available" link next to the version in the footer
Extras.hero bool true Current-conditions hero card (Current page)
Extras.summary bool true "Today in one sentence" plain-language summary with active weather alerts (Current page)
Extras.compare bool false "Compared to the past" card: vs yesterday, vs the monthly average, vs this date last year (Current page)
Extras.compare_page bool false History page (own nav tab): overlay a metric across every year, day-by-day for a chosen month
Extras.compare_refresh seconds 86400 How often the History page's whole-archive aggregation is rebuilt (cached on disk)
Extras.monthly_records bool false History page: all-time monthly records tables (hottest/coldest, wettest/average rain). Needs compare_page
Extras.records_temp bool true Show the temperature records table (when monthly_records is on)
Extras.records_rain bool true Show the rain records table (when monthly_records is on)
Extras.celestial bool true Sun and Moon card
Extras.disclaimer bool true Amateur-station disclaimer in the footer
Extras.auto_refresh auto,seconds,off auto Auto-reload the page to follow new data
Extras.stale_alert_secs seconds 3600 Warn (banner) when the latest observation is older than this; 0 disables
Extras.chart_tz IANA zone auto Timezone for chart-time labels (e.g. Europe/Athens); empty auto-detects from the server. Set it if charts are offset for visitors in another timezone
theme.layout modern,classic modern flat card-tile dashboard vs. compact rows
theme.mode light,dark,auto light auto follows the visitor's OS preference
theme.switcher bool true Header dropdown to switch Modern/Classic/Dark (remembered per browser)
theme.hero_dynamic_color bool true Tint the hero by temperature: ice-blue when freezing, blue when mild, amber to deep red when hot
theme.hero_mood bool true Weather-mood face + caption in the hero (Brrr! to Melting!)
theme.accent CSS color #0a5ca8 Chart titles, links, headings
theme.gradient_top / gradient_bottom CSS color gold/cream Header and panel gradient
theme.page_bg CSS color #FFFDCA Page background
theme.font CSS font stack system stack Body font
theme.base_font_size CSS size 9.5pt Base font size for the page
theme.density comfortable,compact comfortable Row and chart sizing
theme.dark_bg / dark_panel / dark_ink CSS color dark-blue palette Dark-mode page background, panel background, and text colour
theme.dark_gradient_top / dark_gradient_bottom CSS color dark-blue palette Dark-mode header/panel gradient
nav.<tab> bool true Show/hide a tab (current,yesterday,week,month,year,lastyear,archive,about)
charts.<metric> bool true Show/hide a chart (temp,humidity,pressure,windspeed,windvec,windvector,windrose,rain,rainrate,uv,radiation,et,cloudbase)
rows.<row> bool true Show/hide a metric across all three left-column boxes (Current Values, Today's Hi/Lows, All-Time Records). Names: humidity,dewpoint,wind,barometer,rain_today,rain_rate,rain_month,rain_year,last_rain,et,windchill,heatindex,apptemp,uv,radiation (the full list is the [[rows]] block in skin.conf)
rows.last_rain_date bool false Last Rain row shows just "N days ago" (default); true also shows the date/time
Extras.rows_show_range bool true Today's high/low (with time) beside each current value
Extras.baro_trend_words bool false Barometer 3h trend as just the arrow and the 3h change (minimalist, default); true adds the "Rising/Falling/Steady" word
Extras.records bool true All-time records card (below Today's Hi/Lows)
Extras.solar bool false HF propagation card (HamQSL solar data + band conditions)
Extras.solar_refresh seconds 3600 How often the HamQSL reading is re-fetched (cached on disk between fetches)
Extras.solar_timeout seconds 15 Timeout for the server-side HamQSL fetch
alerts.<obs>.high / .low number Greek-climate defaults Highlight a Current-Values row when the value crosses this limit (in your displayed units); defaults set for temp, apparent temp, wind, humidity, rain rate, UV
about.prose_en / prose_el string empty About-page description (inline HTML ok)
about.operator / website_url / website_text / email string empty About-page contact fields
about.hardware string empty Override the hardware label (else WeeWX's value)
about.show_coordinates bool true Show exact coords and map link on About; false for privacy
analytics.head string empty Tracking / verification snippet injected verbatim just before </head> on every page. Any provider (Umami, Plausible, Matomo, GA4, self-hosted). Empty = nothing loads
analytics.body string empty Same, injected just before </body> (for snippets that ask to go at the end of the body)
branding.show_footer_coords bool true Lat/long/altitude in footer
branding.link_url / link_text string empty Optional footer link
branding.show_skin_credit bool true Show the "AganetWX <version> theme by anegio.com" footer line; false removes the whole line
branding.show_theme_credit bool true Within that line, show the "theme by anegio.com" part; false keeps "AganetWX <version>" but drops the credit
Extras.back_to_top bool true Floating "back to top" arrow (bottom right, appears once scrolled); false removes it
support.enable bool false Floating support button in the bottom right corner (a cup with a heart); the back-to-top arrow stacks above it
support.url string empty Link target: Ko-fi, Buy Me a Coffee, GitHub Sponsors, PayPal, any URL. Empty hides the button even when enabled. A plain link: no third-party script loads
support.text string unset Button label. Unset uses "Support this station" (English in every language); set your own ("Buy me a coffee", "Tip on Ko-fi"); set to "" for a compact icon-only button
support.tooltip string empty Hover text and accessible name; empty uses "Support this weather station" (English in every language)
links.show bool true Show the "Useful Links" card (bottom of the left column)
links.<entry> url,text Greece maps Each [[[entry]]] adds a link; edit/add/remove freely
webcam.enable bool false Show the webcam banner above the nav
webcam.url string cam.jpg Image path (relative to the site) or full URL
webcam.auto_refresh bool true Reload the image periodically (cache-busted) with a live countdown badge; false for a static image
webcam.refresh seconds 30 Refresh interval when auto_refresh is on
webcam.max_width px empty Cap the image width; empty = full content width
webcam.height px 380 Cap the display height
webcam.align left,center,right center Position a narrower image
webcam.title / link string empty Optional caption and click-through URL
cameras_page.enable bool false Dedicated Cameras page (own nav tab) for extra cameras, separate from the main banner
cameras_page.columns 1..6 0 Cameras-page grid columns; 0/empty fits as many as sensible per row
cameras_page.[[[name]]] section none One per extra camera: url, title, link, optional per-camera refresh/height/etc.

Units

The skin follows your WeeWX unit_system (us, metric, or metricwx) and does not override it. The metric systems differ: metric uses km/h + cm + mbar, metricwx uses m/s + mm + mbar. For the everyday km/h + mm + hPa combo, set the individual groups in your WeeWX config (not the skin):

[StdReport]
    [[Defaults]]
        unit_system = metric
        [[[Units]]]
            [[[[Groups]]]]
                group_rain = mm
                group_rainrate = mm_per_hour
                group_pressure = hPa

Threshold highlighting

Give any current value high/low limits and its row lights up when it crosses them (red above high, blue below low). Limits are in your displayed units. The skin ships with sensible defaults for a warm Mediterranean/Greek climate (temperature, apparent temperature, wind, humidity, rain rate, UV); override or remove them for your own climate by editing the [[[[alerts]]]] block in weewx.conf (delete a subsection to stop highlighting that value).

[StdReport]
    [[AganetWXReport]]
        [[[Extras]]]
            [[[[alerts]]]]
                [[[[[outTemp]]]]]
                    high = 38
                    low = 0
                [[[[[windSpeed]]]]]
                    high = 55
                [[[[[outHumidity]]]]]
                    high = 90

Alerts work for any observation shown in Current Values (for example outTemp, outHumidity, dewpoint, windSpeed, barometer).

All-time records

An "All-Time Records" card (below Today's Hi/Lows on the Current page) shows the highest and lowest values ever recorded in your archive, with the date each happened: temperature, wind gust, humidity, barometer and rain rate. Set Extras.records = false to hide it. The current temperature, humidity and UV rows also show a small rising / steady / falling trend arrow, and a "Last Rain" row shows when it last rained and how many days ago.

The [[rows]] toggles apply across all three left-column boxes together, so hiding, say, barometer drops it from Current Values, Today's Hi/Lows and All-Time Records at once (Ian's "synchronise" idea). For UV and solar radiation, only the daily high is shown in the Hi/Lows (the low is always zero at night, so it carries no information). Two more knobs: Extras.baro_trend_words = false shows the barometer trend as just an arrow plus the 3h change (no "Rising" word), and rows.last_rain_date = false reduces the Last Rain row to "N days ago" without the date/time.

Today in one sentence

A plain-language summary near the top of the Current page, e.g. "A warm day so far. High so far 32.5C, gusts to 25.7 km/h, no rain yet.", built entirely from this station's own data. The wording says "so far" because it reflects midnight until now, not a finished day.

When today's own extremes cross the limits you set in [[alerts]] (the same limits used for row highlighting), a short alert is appended to the sentence, for example "Strong wind, gusts to 55 km/h." or "Extreme heat 38.4C.". Covered: heat, frost, strong wind, heavy rain, very high UV and very high humidity.

On by default. Turn it off with:

[StdReport]
    [[AganetWXReport]]
        [[[Extras]]]
            summary = false

Compared to the past

An optional card that puts today in context using your own archive:

  • vs yesterday, the temperature difference at the same time of day (a fair like-for-like, not today-so-far against a whole day).
  • vs this date last year, how today's high compares with the same calendar date a year ago. A single-day curiosity, not a climate trend.
  • vs a typical month so far, this month's average temperature and its rainfall total against the same month up to the same day and time in previous years (needs at least two prior years).

Every comparison is like-for-like (each year cut at the same point of the month). The more history your archive holds, the more appears; each line is hidden when there is not enough data. Off by default:

[StdReport]
    [[AganetWXReport]]
        [[[Extras]]]
            compare = true

History page

An optional page (its own History tab) for exploring your whole archive: it overlays a chosen metric across every year, day-by-day for a chosen month, so you can see at a glance which Julys were hottest or which winters were wettest.

A toggle at the top picks the view. "By month" overlays a chosen month day by day; "Whole year" overlays all twelve months, one line per year, where rain is the monthly total and every other metric the monthly average. Pick the metric (temperature, rain, wind, humidity, pressure, UV, solar radiation) from a dropdown, and tick the years to show (with All / None buttons). Each year has its own distinct colour, shown as a swatch next to its checkbox, so you can map any line to its year at a glance; the most recent year is also drawn bold.

It aggregates the whole archive, so the result is cached on disk and rebuilt only once a day by default (set compare_refresh in seconds), which keeps report generation fast even on many years of data. Off by default:

[StdReport]
    [[AganetWXReport]]
        [[[Extras]]]
            compare_page = true
            compare_refresh = 86400

Monthly records

Optionally, the History page can show all-time records per calendar month, drawn from the same cached aggregation (so no extra cost). Two tables: temperature (hottest and coldest for each month, with the year in the cell and the exact date on hover) and rain (wettest monthly total, with its year, plus the average monthly total). Off by default; needs compare_page on. Each table can be turned off on its own:

        [[[Extras]]]
            compare_page = true
            monthly_records = true    # show the records tables
            records_temp = true       # temperature table (default true)
            records_rain = true       # rain table (default true)

Choosing sensors and temperature-chart series

Two settings let you tailor what shows without editing any template:

  • extra_sensor_groups limits the Extra Sensors panel to the groups you list, in order, e.g. extra_sensor_groups = temp for temperatures only. Empty shows every group that was discovered.
  • temp_chart_series sets exactly which series the Temperature chart draws, in order, and can include your own extra temperature sensors. For example temp_chart_series = outTemp, extraTemp2 compares outside air with a soil probe. Empty keeps the default set (outTemp, dewpoint, apparent, heat index, wind chill).
[StdReport]
    [[AganetWXReport]]
        [[[Extras]]]
            extra_sensor_groups = temp
            temp_chart_series = outTemp, extraTemp2

Languages

English, Greek, Spanish, French, German, Italian and Portuguese ship complete (en, el, es, fr, de, it, pt). Every word, including chart labels, lives only in lang/<code>.conf.

In-page language switcher. List the languages you want in Extras.languages (default: all seven). The header then shows a language dropdown: visitors pick their language and every label and chart relabels instantly, with no page reload. The browser language is auto-selected on the first visit and the choice is remembered (localStorage). All languages ride in one build (a small strings dictionary per language, a few KB each), so there is no duplicated per-language output. Set lang = <code> for the server-rendered default and fallback; leave Extras.languages with a single code to pin one language and hide the switcher.

Changing wording (headings, sub-heading, disclaimer)

Every visible label is a key under [Texts] in lang/<code>.conf, so you can reword or blank any of them. Common ones people ask about:

What you see Key in lang/<code>.conf
The "Diagrams" column heading "Diagrams"
The sub-heading under the station name ("Observations are powered by a Personal Weather Station") "Weather Station"
The amateur-station disclaimer text "Disclaimer"

To change the wording, edit the right-hand side of the key in every language file you serve (at least en):

[Texts]
    "Diagrams"        = "Charts"
    "Weather Station" = "Live data from my back garden"
    "Disclaimer"      = "Hobby station. Data may be inaccurate; do not use for any critical decision."

To hide the text instead of rewording it, set the value to an empty string ("Diagrams" = ""). The disclaimer bar has its own on/off switch: Extras.disclaimer = false (in weewx.conf) removes it entirely.

Note: lang/*.conf is part of the skin, so an extension update overwrites these edits. Keep a copy of your changed keys and reapply them after an upgrade. I plan to make these overridable from weewx.conf so they survive updates.

To add a language:

  1. Copy skins/AganetWX/lang/en.conf to skins/AganetWX/lang/<code>.conf.
  2. Translate the right-hand side of each entry under [Texts] and [Labels][[Generic]] (keep the left-hand keys in English). Any entry left untranslated falls back to English.
  3. Add <code> to Extras.languages (and/or set lang = <code>).

No template editing. PRs adding languages are welcome.

Note on SEO: the switcher swaps labels client-side, so crawlers index the server-rendered lang. For a weather station that is fine (the searchable content, station name and location, is identical in every language). If you need each language separately crawlable, generate one report per language into its own folder with hreflang alternates instead.

Customizing the About page

The About page shows station facts automatically and takes prose/contact from [Extras][[about]]. For richer content, copy skins/AganetWX/about.inc.example to about.inc in the same directory: when present it replaces the config prose, accepts full HTML, and expands WeeWX tags like $station.hardware. Delete it to fall back. Set about.show_coordinates = false to hide exact coordinates.

Webcam

Enable a webcam banner above the navigation on the Current page (aligned to the content width, off by default):

[StdReport]
    [[AganetWXReport]]
        [[[Extras]]]
            [[[[webcam]]]]
                enable = true
                url = "cam.jpg"       # local file or full URL
                auto_refresh = true   # reload periodically, cache-busted
                refresh = 30          # seconds
                max_width = ""        # px; empty = full content width
                height = 380          # px
                align = center        # left | center | right
                title = ""            # optional caption
                link = ""             # optional click-through URL

With auto_refresh = true the image is checked every refresh seconds and reloaded only when the frame actually changed (a lightweight Last-Modified check, so identical frames are not re-downloaded), with a live "Refreshing in Ns" countdown badge. Set auto_refresh = false for a static image. Clicking the image opens it full-size in a lightbox (unless a click-through link is set); close with Escape, a click on the backdrop, or the close button. On phones the banner runs edge to edge. If a frame fails to load the banner doesn't panic: it keeps the last good image, retries, and comes back on its own once the camera does, so a brief network hiccup won't leave you staring at a gap.

Cameras page (multiple cameras)

The [[webcam]] banner above is a single camera on the Current page. For more cameras, use the separate [[cameras_page]] block: it adds a dedicated Cameras tab with a grid of cameras, and leaves the main banner exactly as it is. Both are independent and off by default, so nothing changes for a single-camera setup. Add a sub-section per camera (any name); each keeps the same refresh, countdown and lightbox behaviour as the main banner and can override the shared values. columns sets the grid width (1..6; 0 or empty fits as many as sensible per row). The tab appears only when this block is enabled and has at least one camera.

        [[[Extras]]]
            [[[[webcam]]]]              # main camera, Current page (unchanged)
                enable = true
                url = "cam.jpg"
                title = "Main view"

            [[[[cameras_page]]]]        # dedicated Cameras page
                enable = true
                columns = 2
                refresh = 30            # shared default
                [[[[[garden]]]]]
                    url = "cam-garden.jpg"
                    title = "Garden"
                [[[[[sky]]]]]
                    url = "cam-sky.jpg"
                    title = "Sky"
                    refresh = 60        # per-camera override

Both the webcam refresh and the whole-page auto-reload stop after about 60 minutes so a forgotten, idle tab does not keep polling; the webcam badge then shows "Paused". Reloading the page starts a fresh 60-minute session.

Useful Links card

A "Useful Links" card sits at the bottom of the left column with external links (a lightning map, Windy, and a satellite view, defaulting to Greece-wide maps). Edit, add, remove, or hide them from weewx.conf, no template editing:

[StdReport]
    [[AganetWXReport]]
        [[[Extras]]]
            [[[[links]]]]
                show = true
                [[[[[lightning]]]]]
                    text = "Lightning map"
                    url = "https://www.lightningmaps.org/"
                [[[[[windy]]]]]
                    text = "Windy"
                    url = "https://www.windy.com/"

Each [[[[[entry]]]]] needs a url and text; order is the display order. Set show = false to hide the card.

HF propagation card

An optional card for amateur-radio operators showing current solar-terrestrial conditions: solar flux, sunspot number, A-index, K-index, and a colour-coded HF band-conditions table (80m-40m, 30m-20m, 17m-15m, 12m-10m; day and night; Good/Fair/Poor). Data comes from HamQSL (N0NBH).

It is fetched server-side once per report cycle, so the generated page makes no client-side external request. The last good reading is cached, so a temporary fetch failure reuses it; the card stays hidden until the first successful fetch. It is off by default:

[StdReport]
    [[AganetWXReport]]
        [[[Extras]]]
            solar = true
            solar_timeout = 15

Troubleshooting

The History page (or its Monthly records tables) is empty after enabling it, or shows old data. The whole-archive aggregation behind the History page is cached on disk (/tmp/aganetwx_compare.json) and rebuilt only once a day (compare_refresh). Right after you turn something on (compare_page, monthly_records), the cache from before your change is still served, so the page can look empty. Clear the cache and run the reports once to rebuild it now:

sudo rm -f /tmp/aganetwx_compare.json
sudo weectl report run

Use weectl report run with no report name so it also runs the FTP/upload step if you publish that way. After the rebuild the data appears (hard-refresh the page once if your browser cached the old version).

Charts don't show up. Load the page through your web server (http://.../aganetwx/), not by double-clicking the HTML file. The charts pull their data with fetch(), and browsers refuse that on a file:// URL. If they are still missing over HTTP, open the browser console: an error on data/<period>.json means the server isn't serving the data/ folder (wrong path, or the wrong MIME type).

A sensor shows the wrong unit (a temperature reading as %, say, or a value with no unit at all). The skin prints whatever unit group WeeWX has attached to that reading, so a wrong unit means the reading is filed under the wrong group in WeeWX itself, not here. WeeWX 5.x still can't set that from weewx.conf, so you fix it with a small service. Drop this in bin/user/fix_groups.py:

import weewx.units
from weewx.engine import StdService

class FixGroups(StdService):
    def __init__(self, engine, config_dict):
        super().__init__(engine, config_dict)
        weewx.units.obs_group_dict['extraTemp2'] = 'group_temperature'

then tell WeeWX to load it:

[Engine]
    [[Services]]
        prep_services = weewx.engine.StdTimeSynch, user.fix_groups.FixGroups

Restart WeeWX and the value comes back as a temperature. Pick the group that matches the sensor: group_temperature, group_percent, group_moisture, and so on.

How it works

  • Pages are thin templates that include shared partials (_head.inc, _nav.inc, _periodbody.inc, _foot.inc); each sets its WeeWX period binder.
  • Charts read per-period JSON the skin writes each report cycle (data/<period>.json), rendered client-side by aganetwx.js + lib/echarts.min.js.
  • Extra sensors come from a Search List Extension (user/aganetwx_extras.py) that inspects the archive schema/record at generation time.
  • Theme variables are injected into :root from config by _head.inc; the CSS is fully variable-driven, so a config change re-skins everything.

License

AganetWX is a skin for WeeWX, released under the GNU GPL v3. Bundled Apache ECharts is under the Apache-2.0 license.

Acknowledgments

Special thanks to Ian (IanR24now) for his valuable testing and feedback, which shaped several features and fixes in this skin.

About

AganetWX — a configurable, sensor-agnostic WeeWX 5.x skin (modern dashboard + classic meteo.gr layouts, interactive charts, i18n, dark mode).

Topics

Resources

Stars

2 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages