Plotting Cumulus Observations with JPGraph

JPGraph time-series of Cumulus temperature, pressure, and rain: axis units, missing samples, and why a graph pack existed as a scientific figure—not a download.

Back to Cumulus weather software guides

A weather graph is a scientific figure. It claims that a quantity, in named units, changed with time, and that the line between two points means the instrument actually sampled the interval. Plotting Cumulus observations with JPGraph (JpGraph / JpGraphs in community writing) was the historical TNET answer to that claim on a PHP web host. The pack did not invent the measurements. It drew a series that some other process had to keep.

This article is about the figure: temperature, pressure, and rain as time-series, axis units, missing samples, and why a graph pack existed at all. It is not a mirror of the old ZIP, not a JpGraph tutorial copied from the vendor manual, and not a substitute for Cumulus MX’s own charts. The Cumulus Wiki Toolbox still names JPGraph as a consumer of a running realtime.txt log. That citation is the reason this URL remains a pillar.

Modern TNET Weather does not maintain JpGraph, Cumulus, or the historical graph pack.

Historical context

Cumulus can show graphs inside its own interface and, depending on flavour and era, can upload images or later JSON for a default website. Community sites still wanted something else: a PHP script on the public host that read a local series and returned a PNG a template could embed. In the late 2000s that usually meant JpGraph, an object-oriented PHP library that draws charts on the server (last checked 13 August 2026). The library is third-party software with its own licenses and PHP version constraints. It is not part of Cumulus.

The missing scientific object is the series. The optional file realtime.txt is one space-separated line of current values plus unit tokens. The Cumulus Wiki realtime.txt page is explicit: the file is rebuilt often, it is not a log, and it is not the dayfile. A plot of “today’s temperature” therefore cannot read realtime.txt once. Something must append timestamped copies—historically PHP plus cron, or, on Windows loggers without server cron, a helper such as Toolbox that writes realtimelog.txt and uploads it.

The TNET JpGraphs pack sat on that homemade log. The Cumulus Wiki TNET scripts catalog lists “Cumulus JpGraph Graphs Package” among the named projects. Saratoga’s legacy scripts page still lists CU-jpgraph-graphs as a historical archive with a note that JpGraph must be installed (last checked 13 August 2026). Those pages are citations and living-upstream pointers. This hostname does not rehost the package.

A time-series figure is a contract

A useful Cumulus JPGraph image had to declare four things on the canvas, not only in a README.

1. The quantity and the unit

Temperature, station pressure, and rainfall are not interchangeable lines on one unlabeled axis. A Celsius trace and a Fahrenheit trace of the same air are different numbers. Pressure in hectopascals is not pressure in inches of mercury. Rain as a cumulative total from midnight is not rain as an instantaneous rate.

Cumulus realtime.txt carries unit tokens in the packet so a consumer does not guess. A graph pack that ignored those tokens and printed a hardcoded °C while the station was in Fahrenheit produced a figure that looked professional and was wrong. The honest figure copies the unit from the series (or from a documented station configuration) onto the axis title. If the unit changed mid-archive because the operator switched settings, the series is two experiments. It should not be one line.

2. The time base

Clock stamps on weather plots are historical facts about when the sample was taken, not decoration. A 24-hour chart needs a timezone policy: station local time, UTC, or “whatever the PHP default was.” Mixed policies look like a two-hour front that never happened. Cumulus packets include date and time fields; a homemade log that dropped the clock and trusted file order will mis-plot after a restart, a delayed FTP batch, or a daylight-saving step.

End-of-day rain totals and daily extremes belong to a meteorological day that may not start at local midnight. That is a dayfile problem, covered in the dayfile parser article. A JPGraph of high-frequency snapshots should not pretend to be that daily appendix.

3. Observed versus derived versus forecast

The line for outdoor temperature is observed (after the station’s own calibration). A “feels like” or heat-index trace, if plotted, is derived by the station software from several inputs. A Zambretti-style forecast token in the packet is scenario output. Plotting the forecast token as if it were tomorrow’s observed temperature is a category error. The figure’s legend has to say which kind of number the pen is drawing.

4. Missing samples

Personal-weather-station series have holes: USB dropouts, Wi-Fi logger gaps, FTP failures, cron not firing, the PC asleep, the Pi hung. A scientific figure shows a hole as a hole. Connecting the last point before a three-hour outage to the first point after it draws a fake ramp. Filling the hole with the last known value draws a fake calm. Both artifacts have been mistaken for weather.

Official climate archives treat missing values as missing. NOAA’s Global Historical Climatology Network daily program, for example, is built around station series whose completeness is part of the record, not something a plotting routine is free to invent (last checked 13 August 2026). A hobby JPGraph is not GHCN. It still owes the same honesty at figure scale: if the homemade log has no row for 04:10, the pen lifts.

How the pack detected a hole is an implementation detail that varied. The scientific requirement does not vary. No sample, no line.

Why a graph pack existed

Three pressures made a community JPGraph pack rational even when Cumulus already “had graphs.”

The public host, not the logger PC, was the publisher. Visitors requested graphTemp.php from a shared server. That server needed a library and a data file it could read. It could not reach the Cumulus GUI. JPGraph plus a text log matched that constraint.

The live file was the wrong shape. Templates and banners want the latest packet. Figures want history. The realtime log article is the accumulation step; this page is the figure that accumulation was for. Toolbox’s documentation makes the dependency explicit: keep a running log of realtime.txt if you want JpGraphs and you cannot cron on the server.

A named pack was a citation. Forums could say “the TNET JPGraph graphs” and mean a known set of temperature, pressure, rain, wind, and humidity scripts with a shared settings file, rather than a one-off test.php in a thread. The Cumulus Wiki Toolbox and the TNET scripts catalog both treat that name as a public object. This URL preserves the name. It does not preserve the bytes.

Later, Cumulus MX grew HTTP and JSON interfaces and example historic charts that read the vendor dayfile and logs. Independent projects such as gauge-tooltip graph scripts also use JpGraph against MX JSON or a database. Those are current-maintainer or third-party facts. They are not this historical pack, and they are not TNET software.

What the figure is not

It is not Cumulus’s built-in graph engine. Compatibility with PHP, fonts, and the log’s column order was the whole game for a host-side pack.

It is not dayfile.txt. A daily max/min/rain row is a climate appendix. Plotting it as a smooth 24-hour curve is the wrong interpolation. If the question is monthly climatology, parse the dayfile. If the question is the shape of this afternoon’s temperature, parse the high-frequency log.

It is not a Weather Display sparkline pack. Different file contract, different column map.

It is not a live observation merely because the PNG is regenerated on request. If the log stopped at 09:14, the figure is historical as of 09:14. Cache headers and a timestamp on the image are part of the science. A pretty curve with no clock is a poster.

Practical checklist for reading an old JPGraph weather image

  1. Find the series. If you cannot name the log file and the process that appended it, you cannot interpret a flat line. Missing cron looks like still air.
  2. Read the axis titles. Units must match the Cumulus packet or a documented station setting. Dual-unit plots need two axes or two panels, not one unlabeled line.
  3. Look for gaps. A perfectly continuous line through a known outage is a drawing, not a record.
  4. Separate rain total from rain rate. Cumulative rain should step; it should not recede unless the series reset at the day boundary—and that reset should be visible.
  5. Record the Cumulus version that wrote the packet. Field lists grew. A parser aligned to an old column map will plot humidity as pressure without throwing an error.
  6. Treat the PNG as derived. The evidence is the log. The image is a view.
  7. Do not run recovered PHP from an unlabeled archive. Get JpGraph from its vendor if you still need the library; get any surviving pack from a living upstream that states a license; rewrite from first principles if the rights are unclear.

Setup principles that still apply

Anyone who still draws server-side weather figures—JPGraph, another PHP library, or a later JSON chart—repeats the same experiment.

  • Input: a time-ordered table with a clock, a quantity, a unit, and an explicit missing-value token.
  • Process: map columns, convert units only with a stated factor, break the polyline at gaps, title the axes.
  • Output: an image or SVG whose legend distinguishes observed, derived, and scenario fields.
  • Failure modes: empty log, wrong delimiter, locale decimal commas, font path missing (a blank or error image, which is better than a wrong line), and stale cache.

Those principles do not require the historical TNET files. They are why the pack existed.

Modern relevance

Browser charts that fetch MX JSON are a different runtime with the same scientific duties. A Highcharts or Canvas plot can hide gaps more smoothly than a 2008 PNG. Smooth is not complete. Connection-intelligence work that later compares atmospheric series with network measurements depends on the same honesty: a missing hour is a missing hour.

The historical backlink from the Cumulus Wiki Toolbox to this path is a reminder that visualization was never a theme. It was a way to see whether the logger, the upload, and the archive were still a single experiment.

TNET research bridge

A JPGraph of Cumulus temperature, pressure, and rain is usable later only if the series has provenance: which software wrote the packets, how often they were appended, and whether gaps were drawn or erased. That is a data-source problem. TNET’s public note on data sources, quality controls, and methodology is the modern discussion of freshness, completeness, and source identity for records used in connection research. It does not document JpGraph settings, and this page does not document TNET internals.

Related pages on this host: the Cumulus projects map, realtime log accumulation, and the dayfile climate appendix. The Cumulus legacy hub lists the wider cluster.

Sources