Skip to main content

The Zambretti Algorithm for weather forecasting

Project description

Zambretti Weather Forecasting in Python

This is a Python implementation of the Zambretti Weather Forecaster

The code is heavily based on the Zambretti Algorithm for Weather Forecasting ESP example

Further reading: Short-Range Local Forecasting with a Digital Barograph using an Algorithm based on the Zambretti Forecaster.

Python Package

This repository is available as a package in PyPi: https://pypi.org/project/zambretti-py/

Usage notes

To calculate for forecast, the Zambretti algorithm requires:

  • elevation above sea level
  • current temperature
  • pressure data from the last three hours, or less.
    • data points older than three hours will be removed
    • the pressure data is expected to be provided as a list of tuples, each tuple consisting of a datetime.datetime object, and the pressure as float
  • optional wind direction, denoting the direction from which the wind is flowing. This has a minor effect on the forecast and can be omitted.

The result will be a text description of the forecasted weather.

Pressure data must be provided in millibars or hPa (those are equivalent). Elevation must be provided in meters. Temperature must be provided in degrees Celsius.

Minimum 6 readings of atmospheric pressure are required. Best results are when the pressure readings span the last three hours, but the code will run on any timespan.

Technical notes

This project has no dependencies, uses only functions from the Python Standard Library. It should run both in Python and MicroPython.

Examples

Example usage with provided pressure data:

import datetime

from zambretti_py import PressureData, WindDirection, Zambretti

now = datetime.datetime.now()
pressure_data = PressureData(
    [
        (now - datetime.timedelta(hours=2, minutes=59), 1050.0),
        (now - datetime.timedelta(hours=2, minutes=49), 1040.0),
        (now - datetime.timedelta(hours=2, minutes=39), 1030.0),
        (now - datetime.timedelta(hours=2, minutes=12), 1020.0),
        (now - datetime.timedelta(hours=1, minutes=19), 1010.0),
        (now - datetime.timedelta(minutes=20), 1000.0),
    ]
)
zambretti = Zambretti()

forecast = zambretti.forecast(
    elevation=90,
    temperature=25,
    pressure_data=pressure_data,
    wind_direction=WindDirection.NORTH,
)
print(forecast)

Example usage with loading pressure data from a CSV file:

If you have the pressure history in a CSV file such as this one:

state last_changed
988.6 2024-11-19T11:33:32.706Z
988.5 2024-11-19T11:34:06.863Z
988.4 2024-11-19T11:37:06.887Z

That file can be loaded into PressureData by using a PressureData.from_csv_file:

from zambretti_py import PressureData, WindDirection, Zambretti

pressure_data = PressureData.from_csv_file(
    fname="history.csv",
    timestamp_column_position=1,
    pressure_column_position=0,
    skip_header_rows=1,
    strptime_template="%Y-%m-%dT%H:%M:%S.%fZ",
)

zambretti = Zambretti()

forecast = zambretti.forecast(
    elevation=75,
    temperature=3,
    pressure_data=pressure_data,
    wind_direction=WindDirection.SOUTH,
)
print(forecast)

Example usage with a CSV file generated in Home Assistant:

When you have a sensor in Home Assistant, you can export its history from the web interface, the result will be a CSV file with this schema:

entity_id state last_changed
sensor.pressure 988.6 2024-11-19T11:33:32.706Z
sensor.pressure 988.5 2024-11-19T11:34:06.863Z
sensor.pressure 988.4 2024-11-19T11:37:06.887Z

That file can be loaded into PressureData by using PressureData.from_home_assistant_csv:

from zambretti_py import PressureData, WindDirection, Zambretti

pressure_data = PressureData.from_home_assistant_csv("history.csv")

zambretti = Zambretti()

forecast = zambretti.forecast(
    elevation=75,
    temperature=3,
    pressure_data=pressure_data,
    wind_direction=WindDirection.SOUTH,
)
print(forecast)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

zambretti_py-0.0.5.tar.gz (6.9 kB view details)

Uploaded Source

Built Distribution

zambretti_py-0.0.5-py3-none-any.whl (6.1 kB view details)

Uploaded Python 3

File details

Details for the file zambretti_py-0.0.5.tar.gz.

File metadata

  • Download URL: zambretti_py-0.0.5.tar.gz
  • Upload date:
  • Size: 6.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for zambretti_py-0.0.5.tar.gz
Algorithm Hash digest
SHA256 6ddb1e4b34b276af360812020640671370f0488553231bb69670be44cfa0db03
MD5 8cf9f641277dcbb19f801f63000bfb87
BLAKE2b-256 9210f5d2f4b456b877252abcf496aef8c15e5a696fe9a4f326e1cf5a8de0c360

See more details on using hashes here.

File details

Details for the file zambretti_py-0.0.5-py3-none-any.whl.

File metadata

File hashes

Hashes for zambretti_py-0.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 6c90c2f00ead4c68a0738f05145b25fc183df22296686f826b75662fe589213c
MD5 449405ff748000933e436a4da4147061
BLAKE2b-256 25002d3fe13431bb313c8259b1984590b0937ff7d2afe2364aa53d7d0a792019

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page