Initial commit: weather-or-not scaffold
This commit is contained in:
89
README.md
Normal file
89
README.md
Normal file
@@ -0,0 +1,89 @@
|
||||
# 🌤️ Weather or Not
|
||||
|
||||
A weather-based activity decision engine that tells you whether to ride your motorcycle or mow the lawn today.
|
||||
|
||||
## Features
|
||||
|
||||
- **Motorcycle ride check** — evaluates temperature, precipitation, wind, humidity, and road conditions
|
||||
- **Lawn mowing check** — evaluates weather conditions AND tracks when you last mowed (with configurable cooldown)
|
||||
- **Extensible** — add new activities by implementing `BaseActivity`
|
||||
- **CLI tool** — run from terminal or schedule via cron
|
||||
- **Notifications** — sends results via Mattermost or Hermes
|
||||
|
||||
## Quick Start
|
||||
|
||||
```bash
|
||||
# Install
|
||||
pip install -e .
|
||||
|
||||
# Run a check (uses config.yaml for location)
|
||||
weather-or-not
|
||||
|
||||
# With verbose output
|
||||
weather-or-not -v
|
||||
|
||||
# Override location
|
||||
weather-or-not --lat 48.8566 --lon 2.3522 # Paris
|
||||
|
||||
# Record that you performed an activity
|
||||
weather-or-not record mow_lawn
|
||||
weather-or-not record motorcycle_ride
|
||||
|
||||
# Send notification
|
||||
weather-or-not notify send
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
Copy `config.yaml` and customize:
|
||||
|
||||
```yaml
|
||||
location:
|
||||
latitude: 40.7128 # Your latitude
|
||||
longitude: -74.0060 # Your longitude
|
||||
|
||||
activities:
|
||||
motorcycle_ride:
|
||||
enabled: true
|
||||
min_temp_c: 10
|
||||
max_temp_c: 35
|
||||
max_precipitation_mm: 0
|
||||
max_wind_speed_kmh: 30
|
||||
mow_lawn:
|
||||
enabled: true
|
||||
cooldown_days: 3
|
||||
max_precipitation_today_mm: 0
|
||||
max_precipitation_past_24h_mm: 5
|
||||
```
|
||||
|
||||
## Adding New Activities
|
||||
|
||||
Create a new file in `src/weather_or_not/` that extends `BaseActivity`:
|
||||
|
||||
```python
|
||||
from weather_or_not.activities import BaseActivity, RuleResult, Verdict
|
||||
from weather_or_not.weather import WeatherForecast
|
||||
|
||||
class MyActivity(BaseActivity):
|
||||
name = "my_activity"
|
||||
description = "Check if it's good for my activity"
|
||||
|
||||
async def check_rules(self, weather: WeatherForecast) -> list[RuleResult]:
|
||||
return [
|
||||
RuleResult(
|
||||
rule_name="My Rule",
|
||||
passed=weather.current_temp_c > 15,
|
||||
message="Temperature is above 15°C",
|
||||
),
|
||||
]
|
||||
```
|
||||
|
||||
Then register it in `cli.py`'s `run_check()` function.
|
||||
|
||||
## Data Storage
|
||||
|
||||
Activity history is stored in `~/.local/share/weather-or-not/history.json`.
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
||||
Reference in New Issue
Block a user