Hi all,
I'd like to (belatedly, in one case) introduce three extensions that work alone or together: weewx-skyfield, a drop-in Skyfield replacement for WeeWX's built-in almanac; weewx-loopdata, which updates report tags on every loop packet; and weewx-celestial, a live celestial page that shows what the two can do together. Everything below is running right now at paloaltoweather.com, so you can click through and see it live.
weewx-skyfield — a drop-in replacement for the built-in almanac
https://github.com/chaunceygardiner/weewx-skyfield
WeeWX's almanac tags are computed by PyEphem, a library its own author has deprecated in favor of his successor library, Skyfield. weewx-skyfield registers a Skyfield almanac ahead of the built-in one, so on WeeWX 5.2 or later every almanac tag your reports already use — $almanac.sunrise, $almanac.moon.transit, $almanac(horizon=-6).sun(use_center=1).rise, $almanac.next_full_moon, $almanac.rigel.mag — is computed with Skyfield and JPL's DE421 ephemeris. It really is drop-in: no skin changes, no configuration. Install it, restart WeeWX, and the Seasons skin's Celestial page (and everything else) is computed by Skyfield.
Installation is three steps:
pip install 'skyfield>=1.47' into your WeeWX virtual environment (or sudo apt install python3-skyfield on a package install — Debian 13 or later; bookworm's 1.45 is too old).weectl extension install weewx-skyfield.zip (download from the release page).Compatibility was a first-class goal. The extension natively computes everything the built-in almanac serves plus a lot it doesn't (constellations, eclipses visible from your station, all 412 IAU-named stars — or all 118,218 Hipparcos stars if you drop in the full catalog). The test suite includes two permanent audits: one proves that with PyEphem installed, every tag the built-in almanac could evaluate still evaluates (anything weewx-skyfield doesn't compute falls through to PyEphem); the other proves that on a system with no PyEphem at all, every tag used by WeeWX's standard skins — and much more — works with Skyfield alone.
So was performance. The DE421 ephemeris ships in the extension zip and is read fully into memory at startup — nothing is downloaded at runtime, and the page keeps working offline. Results are cached aggressively, so the expensive rise/set searches are paid once, not every report cycle; it runs comfortably on a Raspberry Pi.
Why DE421 and not the newer, bigger DE440? Because the extra accuracy disappears the moment the light hits the atmosphere. DE440's corrections amount to well under an arcsecond as seen from Earth for every body this almanac serves — an arcsecond moves a rise or set time by about a fifteenth of a second — while atmospheric refraction at the horizon, which no ephemeris can predict, makes every real rise and set uncertain by tens of seconds. At the precision reports display, the two are indistinguishable, and DE421 is half the size.
Why are there two Skyfield almanacs for WeeWX? You may know weewx-skyfield-almanac, Johanna Roedenbeck's independent extension that also replaces the built-in almanac with Skyfield. The two grew up independently with different design philosophies, and I think the choice is genuinely useful. weewx-skyfield-almanac is configurable and self-updating: you choose the ephemerides and catalogs, and it downloads and refreshes them at runtime. weewx-skyfield is self-contained: everything it needs is in the zip, nothing is ever fetched at runtime, and the emphasis is on strict compatibility with the built-in almanac (audited by the test suite) and on report-cycle speed. If you want to pick your own ephemeris, use weewx-skyfield-almanac; if you want batteries included and PyEphem-parity guarantees, use weewx-skyfield. Install one or the other, not both.
The Sky page. Installing weewx-skyfield also installs a one-page, planetarium-style report, computed for your station's location:

A sky dome of everything above your horizon right now, rise & set ribbons over twilight bands, today's sun path, the solar year, the current lunation, an orrery, an analemma, eclipse and equinox countdowns, and a full almanac table. It's self-contained HTML and inline SVG — no JavaScript libraries, no web fonts, nothing fetched at run time.
And if you like any single panel, you can have it: every panel is rendered by a standard search-list extension ($sky_page.*) and can be dropped into your own skin's template — add one line to skin.conf, copy the CSS classes you need, done. The bundled template shows every panel in use. A few examples:



weewx-loopdata — make the almanac (and everything else) come alive
https://github.com/chaunceygardiner/weewx-loopdata
A WeeWX report is a snapshot: it shows the values from the last archive interval until the next page reload. LoopData changes that. LoopData itself isn't new — it has been quietly keeping pages alive for years — but recent releases dramatically enhanced it: it now supports nearly any tag you would use in a report, including almanac tags, which is what makes everything below possible. You list the tags you care about — current observations, trends, day/week/month/year aggregates, rolling windows from one minute to 24 hours (10m.windGust.max, 24h.rain.sum), almanac tags — in weewx.conf, and on every loop packet (every 2 seconds with a Vantage) LoopData writes them to a small JSON file, loop-data.txt, every value already unit-converted and formatted exactly as your report would render it. A few lines of JavaScript in your template fetch that file and the page comes alive: $current.outTemp, $day.outTemp.max, $almanac.sun.alt — all ticking in real time. And if you rsync your reports to a public web server, LoopData will rsync loop-data.txt to that same server on every loop, so remotely hosted pages are just as alive as local ones (paloaltoweather.com works exactly this way).
The sample report included with the extension is a NOAA-style windrose and eleven gauges, drawn by a few hundred lines of dependency-free canvas JavaScript — every needle, petal and readout redraws on every loop packet:

weewx-celestial — the two together
https://github.com/chaunceygardiner/weewx-celestial
weewx-celestial is a sample report that ties weewx-skyfield and weewx-loopdata together: the almanac computes the sky, LoopData publishes it on every loop packet, and the page moves. See it live: https://www.paloaltoweather.com/celestial/

Earth sits at the center; the sun, moon, eight planets and Proxima Centauri are placed by compass bearing and log distance, the moon at its true phase, bodies below the horizon dimmed and dashed, an hour of motion trail behind every dot. Beside the dial, each body gets an odometer distance readout that ticks between loop refreshes at the body's true radial rate — watch Mercury recede ~28 km every second while Saturn approaches at the same pace. One computation engine (the registered almanac) serves both the report tags and the live page, so they always agree.
What you can build with this
The pages above are the bundled samples. For what these extensions look like worked into a full skin, paloaltoweather.com is the demo site:
Requirements in brief: weewx-skyfield needs WeeWX 5.2+, Python 3.9+, and Skyfield 1.47+ (PyEphem not required); weewx-loopdata needs WeeWX 4 or 5 and Python 3.7+; weewx-celestial needs weewx-loopdata 5.0+ and (strongly recommended) weewx-skyfield. Each README has full installation instructions.
Take these extensions for a spin and let me know what you think. Questions, bug reports and suggestions welcome — here or on the GitHub issue trackers.
Cheers,
John Kline
On Jul 23, 2026, at 10:52 PM, Karen K <kk44...@gmail.com> wrote:
One remark: I did not include the ephemerides into the package, because I guess it is not allowed to do so.--
You received this message because you are subscribed to the Google Groups "weewx-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email to weewx-user+...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/weewx-user/e4452499-63ba-4482-b6d7-557cb5f1c665n%40googlegroups.com.



On Jul 27, 2026, at 5:49 PM, Jo Hunter <futu...@gmail.com> wrote:
Thank you so much for this Skyfield extension! It’s awesome.
--
You received this message because you are subscribed to the Google Groups "weewx-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email to weewx-user+...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/weewx-user/12cc23e2-c9f7-4627-8517-f071e2ba4ec3n%40googlegroups.com.


====================================================================================================== test session starts =======================================================================================================
platform linux -- Python 3.11.2, pytest-9.1.1, pluggy-1.6.0
rootdir: /home/meteo/weewx-skyfield-main
collected 428 items
tests/test_almanac.py .........................................................F.......................................................................................................................................... [ 45%]
........................................................................................................................................................................................... [ 89%]
tests/test_sky_page.py ............................................. [100%]
============================================================================================================ FAILURES ============================================================================================================
___________________________________________________________________________________ TestPhysicalAttributes.test_magnitudes_agree_with_pyephem ____________________________________________________________________________________
self = <test_almanac.TestPhysicalAttributes object at 0x7fff290fb0d0>, almanac = <weewx.almanac.Almanac object at 0x7fff28c7cd10>
def test_magnitudes_agree_with_pyephem(self, almanac):
ephem = pytest.importorskip('ephem')
observer = pyephem_observer()
for planet in ('mercury', 'venus', 'mars', 'jupiter', 'saturn', 'uranus', 'neptune',
'sun', 'moon', 'pluto'):
body = getattr(ephem, planet.title())()
body.compute(observer)
# PyEphem uses older magnitude models, so agreement is loose.
> assert getattr(almanac, planet).mag == pytest.approx(body.mag, abs=0.6), planet
E AssertionError: moon
E assert np.float64(-8.420329067365575) == -10.9 ± 0.6
E
E comparison failed
E Obtained: -8.420329067365575
E Expected: -10.9 ± 0.6
tests/test_almanac.py:656: AssertionError
======================================================================================================== warnings summary ========================================================================================================
Thanks for the report — and for the link to your live page, which helped a lot.
Here is what I can see from your page: everything is being computed correctly
except the durations. Rise, set and transit times, altitudes, azimuths, the
constellations, even the widths of the bars in the day-timeline panel (which
are drawn from the same rise/set times) are all right. Only the durations
derived from the almanac's visible tag — the Daylight line, the "Up for"
column, and the timeline tooltips — show 0h 00m.
I have not been able to reproduce it. I ran the v1.13 code at your
coordinates for July 28/29 under every Skyfield release the extension supports
(1.47 through 1.54, including Debian trixie's Skyfield 1.53 + NumPy 2.2
combination), and visible comes out correct in every case (about 14h56m for
the sun). So the difference must be something about your system, and I'd like
to ask for a few details:
python3 -c "import skyfield, numpy; print(skyfield.VERSION, numpy.__version__)"weectl extension list — in particular, issudo journalctl -u weewx | grep -i skyfieldlang/fr.conf, or edit the template or wxskyfield_sky.py directly?If you're up for one more test, temporarily add this line anywhere inskins/Skyfield/index.html.tmpl and report what it prints:
<p>$almanac.sun.visible.raw</p>
That is the raw number of seconds behind the Daylight line; today it should
print about 53800.
One request in return: the next release will ship a French translation of the
Sky page and of the almanac's body and constellation names (marked Beta —
the words await native-speaker review). Since you know the material and have
already translated the page for yourself, would you be willing to look it
over? I've attached the proposed lang/fr.conf (you will need to unzip it); corrections from a native
speaker would be very welcome, and it should also spare you maintaining your
own translation going forward.
Thanks,
John
On Jul 29, 2026, at 9:40 AM, Jacques Terrettaz <jterr...@gmail.com> wrote:
John,
--
You received this message because you are subscribed to the Google Groups "weewx-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email to weewx-user+...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/weewx-user/C72B29DD-F726-4F21-87C8-7E55EF6A63B2%40gmail.com.
On Jul 29, 2026, at 9:59 AM, John Kline <jo...@johnkline.com> wrote:
You received this message because you are subscribed to a topic in the Google Groups "weewx-user" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/weewx-user/q2B2QNqJIc8/unsubscribe.
To unsubscribe from this group and all its topics, send an email to weewx-user+...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/weewx-user/B6A87C8B-1635-4138-AA07-1AB80071EFBA%40johnkline.com.
Hi Jacques,
The root cause: your WeeWX unit settings include group_deltatime = hour
(a perfectly valid preference), and the Sky page assumed seconds when
reading the almanac's raw duration values, so every duration collapsed
to 0h 00m. weewx-skyfield 1.14 fixes this — the page now renders
identically whatever unit preferences your reports set. You can keep
your configuration exactly as it is.
To upgrade, download weewx-skyfield.zip from
weewx-skyfield v1.14
and install it right over 1.13:
weectl extension install weewx-skyfield.zip
then restart WeeWX. 1.14 also ships the complete French translation we
discussed (lang = fr in the [[SkyfieldReport]] stanza — one note:
installing replaces the skin's lang/ files, so save a copy of your ownfr.conf first if you want to compare). And the test suite now passes
on your system's older PyEphem — that magnitude failure you found is
guarded.
French also shipped today in the two companion extensions, in case they
interest you:
All three French translations are marked Beta pending a native
speaker's review — so your offer to look over fr.conf stands very
much appreciated, and corrections will land in the next release.
Cheers,
John
On Jul 29, 2026, at 11:09 AM, Jacques Terrettaz <jac...@terrettaz.net> wrote:
Hi John,
To view this discussion visit https://groups.google.com/d/msgid/weewx-user/938A2586-E08F-458B-9FF2-3BD2D31E90AC%40terrettaz.net.
On Jul 29, 2026, at 11:54 PM, Ian <weathe...@gmail.com> wrote:
Hi again John,
--
You received this message because you are subscribed to the Google Groups "weewx-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email to weewx-user+...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/weewx-user/96983ce1-6398-447d-9f19-1aeeae74faf3n%40googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/weewx-user/4c9254cf-005f-4895-97ea-c009f2da6130n%40googlegroups.com.
On Aug 1, 2026, at 4:50 AM, gert.a...@gmail.com <gert.a...@gmail.com> wrote:
To view this discussion visit https://groups.google.com/d/msgid/weewx-user/08be1cfd-62ad-4c22-8491-37ec8ffa0a03n%40googlegroups.com.
<Slowly.jpg><da.txt>
On Aug 1, 2026, at 5:39 AM, John Kline <jo...@johnkline.com> wrote: