Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,33 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]
## [0.6.0] - 2026-09-24

### Added

- `PVSystem.tracker_max_rotation_angle` — dedicated field for the maximum tracker rotation angle in degrees (default 60°). Only applies when `mounting='Tracker'`. Replaces the previous (confusing) use of `PVSystem.tilt` for this purpose.
- Pydantic models for the 3D API data model: `Rack`, `Racks`, `Tracker` (3D), `Trackers`, `InverterInput`, `ModuleString`, `SimpleTerrain`, `ShadingObjects`, and supporting geometry types (`QuadDouble`, `Vector3Double`, `IndexedObject3D`, `ModuleIndexRange`, `MiniSimpleTerrainDto`, `TerrainRowDto`, `TerrainRowStartEndColumnsDto`). These enable full composition of 3D plant layouts, including power optimizer support via `InverterInput`.
- `PVSystem.recalculate_modeling_correction_factor` field to control whether the modeling correction factor is recalculated during energy yield assessment (default `True`).
- `from_solcast` added to the Weather Utilities section of the API reference documentation.
- `TrackerAlgorithm` enum to define custom rotation strategies for tracker systems, enabling flexible rotation calculation methods beyond predefined algorithms.
- `TrackersConditionsDataset` class with Protobuf serialization support for storing and transmitting tracker rotation conditions and custom rotation data.
- `TrackerRotationID` field in the `Layout` class to support custom tracker rotation workflows.
- `dc_ohmic_connector_loss` and related DC loss resistance fields in the `Layout` class for detailed power loss modeling in tracker systems.
- CSV export functionality for tracker-specific results, providing detailed rotation and performance data for each tracker row.
- `custom_rotations` module for importing custom tracker rotation schedules from CSV files with functions `from_csv()`, `from_csv_folder()`, and `csv_to_protobuf()` to load and validate rotation data.
- Public API exports: `from_custom_rotations_csv()` and `custom_rotations_csv_to_protobuf()` for programmatic CSV rotation ingestion.
- Utilities for validating the compatibility of custom rotations and plant layout: tracker rotation IDs, checking time resolution compatibility, and verifying weather data coverage for rotation periods.

### Changed

- `PVSystem.tilt` is now fixed-tilt only. For tracker systems, set `tracker_max_rotation_angle` instead. Previously, `tilt` was silently used as the tracker rotation bound, which caused confusion.

### Fixed

- Documentation examples corrected: GCR spacing value for tracker systems in quick-start example now consistently use 0.35.
- Documentation clarified: albedo parameter in workflow-2 now shows explicit list format `[0.2] * 12` for clarity.
- API error message updated to reference latest supported API version (v7) in validation documentation.

## [0.5.0] - 2026-06-29

### Changed
Expand Down
2 changes: 1 addition & 1 deletion docs/getting-started/quick-start-examples.md
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ def create_plant(mounting_type: str) -> PVSystem:
plant.gcr = 0.35
else: # Tracker
plant.tracker_max_rotation_angle = 60.0 # Max rotation angle
plant.gcr = 0.3 # Trackers need wider spacing
plant.gcr = 0.35 # Assuming same spacing conditions

plant.add_pan_files({"Module": Path("data/module.PAN")})
plant.add_ond_files({"Inverter": Path("data/inverter.OND")})
Expand Down
2 changes: 1 addition & 1 deletion docs/getting-started/workflow-2-pvplant-builder.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ plant.soiling_loss = [0.08, 0.08, 0.07, 0.06, 0.05, 0.04,
0.04, 0.05, 0.06, 0.07, 0.08, 0.09]

# Albedo (ground reflection)
plant.albedo = 0.2 # Can be single value (expanded to 12 months) or list of 12
plant.albedo = [0.2] * 12 # Can be single value (expanded to 12 months) or list of 12

```

Expand Down
2 changes: 1 addition & 1 deletion solarfarmer/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -551,4 +551,4 @@ def build_api_url(version: str | None = None) -> str:
if re.fullmatch(r"v[1-9]\d*", version):
return f"{base}/{version}/api"

raise ValueError(f"Invalid version '{version}'. Must be 'latest' or 'vX' (e.g., 'v5').")
raise ValueError(f"Invalid version '{version}'. Must be 'latest' or 'vX' (e.g., 'v7').")
Loading