Features β’ Tech Stack β’ Getting Started β’ API Documentation β’ Architecture
SmartAgroPlan is a comprehensive precision agriculture platform that leverages data-driven insights and scientific models to optimize farm operations. Built with modern .NET technologies, it provides farmers and agronomists with actionable recommendations for:
- π§ Irrigation Management - FAO-56 based evapotranspiration calculations and soil moisture tracking
- π§ͺ Fertilization Planning - Nutrient requirement analysis, product optimization, and application scheduling
- πΎ Crop Management - Variety selection, phenological stage tracking, and yield forecasting
- π¦οΈ Weather Integration - Real-time and historical weather data from OpenMeteo API
- π Field Analytics - Soil analysis, nutrient balance, and field condition monitoring
- π Geospatial Support - NetTopologySuite for field boundary management
- Season Planning: Generate complete fertilization plans based on crop requirements
- Nutrient Calculations: Scientific nutrient requirement and soil supply analysis
- Product Optimization: AI-driven fertilizer product selection
- Application Tracking: Record and monitor actual fertilizer applications
- Nutrient Analysis: Real-time deficit detection and balance monitoring
- FAO-56 Methodology: Scientifically accurate evapotranspiration calculations
- Smart Scheduling: Weather-aware irrigation recommendations
- Batch Processing: Multi-field recommendation generation
- Soil Moisture Tracking: Real-time field water status monitoring
- Crop Variety Database: Comprehensive crop coefficient definitions
- Field Monitoring: Track soil conditions, history, and phenological stages
- Geospatial Data: GeoJSON field boundary support with NetTopologySuite
- Historical Tracking: Complete crop rotation and application history
- Current Conditions: Real-time weather data
- 7-Day Forecast: Detailed weather predictions
- Historical Data: Access past weather patterns for analysis
- .NET 9 - Latest .NET platform with native AOT support
- ASP.NET Core - High-performance REST API framework
- C# 13 - Modern language features and null safety
- MediatR (v13.0) - CQRS implementation for clean command/query separation
- AutoMapper (v15.0) - Object-to-object mapping for DTOs
- FluentValidation (v12.0) - Strongly-typed validation rules
- FluentResults (v4.0) - Railway-oriented programming for error handling
- PostgreSQL - Robust relational database with spatial support
- Entity Framework Core (v9.0.8) - Modern ORM with migrations
- Npgsql.EntityFrameworkCore.PostgreSQL (v9.0.4) - PostgreSQL provider
- NetTopologySuite (v2.6) - Geospatial data support (GeoJSON, geometries)
- Scalar (v2.7.2) - Modern OpenAPI/Swagger documentation UI
- OpenAPI - API specification (ASP.NET Core 9)
- xUnit (v2.9.3) - Unit testing framework
- Moq (v4.20.72) - Mocking library
- FluentAssertions (v8.6.0) - Expressive test assertions
- Coverlet (v6.0.4) - Code coverage analysis
- Serilog (v9.0.0) - Structured logging with file and console sinks
- Serilog.Expressions (v5.0.0) - Advanced log filtering
- SonarCloud - Continuous code quality and security analysis
- GitHub Actions - CI/CD pipeline automation
- Code Coverage - Automated test coverage reporting
- Rider / Visual Studio - JetBrains and Microsoft IDEs
- Docker - Containerization (planned)
- User Secrets - Secure local configuration management
Ensure you have the following installed:
- .NET 9 SDK (latest version)
- PostgreSQL 15+
- Git
- IDE: Visual Studio 2022 / JetBrains Rider / VS Code
- Clone the repository
git clone https://github.com/Skiper29/SmartAgroPlan.git
cd SmartAgroPlan- Configure the database connection
Create appsettings.Development.json in SmartAgroPlan.WebAPI/:
{
"ConnectionStrings": {
"DefaultConnection": "Host=localhost;Port=5432;Database=SmartAgroPlan;Username=postgres;Password=yourpassword"
},
"OpenMeteo": {
"BaseUrl": "https://api.open-meteo.com/v1"
}
}- Apply database migrations
cd SmartAgroPlan.WebAPI
dotnet ef database update- Run the application
dotnet runThe API will start at:
- HTTPS:
https://localhost:7001 - HTTP:
http://localhost:5000
- Access API Documentation
Navigate to:
- Scalar UI:
https://localhost:7001/scalar/v1 - OpenAPI JSON:
https://localhost:7001/openapi/v1.json
dotnet testdotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=opencoverdotnet test SmartAgroPlan.XUnitTestThe test suite includes:
- β Unit tests for business logic (BLL)
- β Repository tests with in-memory database (DAL)
- β Controller integration tests (WebAPI)
- β Validation tests with FluentValidation
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/crop |
Get all crop varieties |
GET |
/api/crop/{id} |
Get crop variety by ID |
POST |
/api/crop |
Create new crop variety |
PUT |
/api/crop |
Update crop variety |
DELETE |
/api/crop/{id} |
Delete crop variety |
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/field |
Get all fields |
GET |
/api/field/{id} |
Get field by ID |
POST |
/api/field |
Create new field |
PUT |
/api/field |
Update field |
DELETE |
/api/field/{id} |
Delete field |
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/fieldcondition |
Get all field conditions |
GET |
/api/fieldcondition/{id} |
Get condition by ID |
GET |
/api/fieldcondition/{fieldId} |
Get conditions for field |
POST |
/api/fieldcondition |
Create field condition record |
DELETE |
/api/fieldcondition/{id} |
Delete condition record |
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/soil |
Get all soil types |
GET |
/api/soil/{id} |
Get soil by ID |
GET |
/api/soil/{soilType} |
Get soil by type |
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/irrigation/recommendation/{fieldId} |
Get irrigation recommendation |
POST |
/api/irrigation/recommendations/batch |
Get batch recommendations |
GET |
/api/irrigation/schedule/weekly/{fieldId} |
Get weekly irrigation schedule |
Query Parameters:
includeForecast- Include weather forecast in calculationsforecastDays- Number of forecast days (default: 7)startDate- Schedule start date
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/fertilizer/planning/season-plan |
Calculate season fertilizer plan |
POST |
/api/fertilizer/planning/season-plan |
Save season plan to database |
GET |
/api/fertilizer/planning/current-recommendation |
Get current stage recommendation |
GET |
/api/fertilizer/planning/season-plan/saved |
Get saved season plan |
Query Parameters:
fieldId- Field identifiertargetYield- Target yield (tons/ha)sowingDate- Sowing date
| Method | Endpoint | Description |
|---|---|---|
POST |
/api/fertilizer/applications |
Record fertilizer application |
GET |
/api/fertilizer/applications/history |
Get application history |
GET |
/api/fertilizer/applications/{recordId} |
Get application details |
PUT |
/api/fertilizer/applications/{recordId} |
Update application record |
DELETE |
/api/fertilizer/applications/{recordId} |
Delete application record |
GET |
/api/fertilizer/applications/upcoming |
Get upcoming applications |
GET |
/api/fertilizer/applications/date-range |
Get applications by date range |
GET |
/api/fertilizer/applications/summary |
Get nutrient application summary |
GET |
/api/fertilizer/applications/plans |
Get saved application plans |
PUT |
/api/fertilizer/applications/plans/{planId} |
Update application plan |
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/fertilizer/calculations/nutrient-requirement |
Calculate nutrient requirements |
GET |
/api/fertilizer/calculations/soil-nutrient-supply |
Calculate soil nutrient supply |
POST |
/api/fertilizer/calculations/optimize-products |
Optimize product selection |
Query Parameters:
cropVarietyId- Crop variety IDtargetYield- Target yield (tons/ha)fieldAreaHa- Field area in hectaresfieldId- Field identifier
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/fertilizer/analysis/nutrient-balance |
Get nutrient balance analysis |
GET |
/api/fertilizer/analysis/nutrient-deficit |
Analyze nutrient deficits |
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/fertilizer/products |
Get all fertilizer products |
GET |
/api/fertilizer/products/by-type |
Get products by type |
GET |
/api/fertilizer/products/search |
Search products |
GET |
/api/fertilizer/products/{productId} |
Get product by ID |
POST |
/api/fertilizer/products |
Create new product |
PUT |
/api/fertilizer/products/{productId} |
Update product |
DELETE |
/api/fertilizer/products/{productId} |
Delete product |
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/weather/current |
Get current weather |
GET |
/api/weather/forecast |
Get weather forecast |
GET |
/api/weather/historical |
Get historical weather data |
Query Parameters:
lat- Latitudelon- Longitudedays- Forecast days (default: 7)startDate- Historical data startendDate- Historical data end
SmartAgroPlan/
β
βββ SmartAgroPlan.WebAPI/ # π Presentation Layer
β βββ Controllers/ # API endpoints
β βββ Extensions/ # Service configuration extensions
β βββ Data/ # CSV datasets for seeding
β βββ Program.cs # Application entry point
β
βββ SmartAgroPlan.BLL/ # πΌ Business Logic Layer
β βββ Services/ # Business services
β β βββ Crops/ # Crop coefficient calculations
β β βββ Irrigation/ # FAO-56 irrigation logic
β β βββ FertilizerForecasting/ # Fertilizer calculations
β β βββ Weather/ # OpenMeteo integration
β β βββ Caching/ # Phenology caching
β βββ MediatR/ # CQRS commands and queries
β β βββ Crops/
β β βββ Fields/
β β βββ Irrigation/
β β βββ FertilizerForecasting/
β βββ DTO/ # Data transfer objects
β βββ Validators/ # FluentValidation rules
β βββ Mapping/ # AutoMapper profiles
β βββ Models/ # Business models
β βββ Utils/ # Helper utilities
β βββ Interfaces/ # Service contracts
β βββ Attributes/ # Custom attributes
β βββ PipelineBehaviour/ # MediatR behaviors
β
βββ SmartAgroPlan.DAL/ # ποΈ Data Access Layer
β βββ Entities/ # Database entities
β β βββ Crops/
β β βββ Fields/
β β βββ Irrigation/
β β βββ FertilizerForecasting/
β β βββ Calendar/
β βββ Configurations/ # EF Core entity configurations
β βββ Repositories/ # Data repositories
β βββ Migrations/ # EF Core migrations
β βββ Persistence/ # DbContext
β βββ Enums/ # Database enums
β βββ Helpers/ # Data helpers
β
βββ SmartAgroPlan.XUnitTest/ # π§ͺ Testing Layer
βββ BLL_Tests/ # Business logic tests
βββ DAL_Tests/ # Repository tests
βββ WebAPI_Tests/ # Controller tests
- π― CQRS - Command Query Responsibility Segregation with MediatR
- ποΈ Repository Pattern - Data access abstraction
- π Pipeline Behavior - Cross-cutting concerns (validation, caching)
- π Factory Pattern - Object creation strategies
- π¦ Dependency Injection - Built-in ASP.NET Core DI
- 𧬠Domain-Driven Design - Rich domain models
- π Railway-Oriented Programming - FluentResults for error handling
Request β Validation Behavior β Caching Behavior β Handler β Response
- Phenology-based cache invalidation
- Field-related request tracking
- Automatic cache refresh on data changes
- Reference evapotranspiration (ETβ)
- Crop coefficient calculations
- Soil water balance
- Management allowed depletion (MAD)
- Nutrient requirement calculations
- Soil supply analysis
- Linear programming for product mix
- Multi-stage fertilization planning
{
"ConnectionStrings": {
"DefaultConnection": "Host=localhost;Port=5432;Database=SmartAgroPlan;Username=youruser;Password=yourpassword"
}
}{
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"System": "Warning"
}
},
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "./logs/log-.txt",
"rollingInterval": "Day"
}
},
{
"Name": "Console"
}
]
}
}{
"CORS": {
"AllowedOrigins": "*",
"AllowedHeaders": "*",
"AllowedMethods": "*"
}
}{
"OpenMeteo": {
"BaseUrl": "https://api.open-meteo.com/v1"
}
}This project maintains high code quality standards through continuous analysis:
- β Maintainability Rating - A-grade maintainable code
- π Security Rating - Vulnerability-free codebase
- π Bug Detection - Zero critical bugs
- π Test Coverage - >80% code coverage
π View Live Dashboard
GitHub Actions workflow includes:
- Build verification
- Unit test execution
- Code coverage analysis
- SonarCloud quality gate
- Security scanning
- Core API infrastructure with .NET 9
- PostgreSQL + EF Core setup with migrations
- MediatR CQRS implementation
- FAO-56 irrigation calculations
- Fertilizer planning and optimization
- OpenMeteo weather integration
- NetTopologySuite geospatial support
- Scalar API documentation
- SonarCloud integration
- Comprehensive unit tests
- Advanced caching with Redis
- Real-time notifications with SignalR
- Machine learning yield predictions
- Frontend dashboard (React/Blazor)
- Satellite imagery integration
- IoT sensor integration (soil moisture, weather stations)
- Multi-tenant organization support
- Advanced reporting and analytics
- Export to Excel/PDF
Contributions are welcome! Please follow these steps:
- Fork the repository
- Create a feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
Please ensure:
- Code passes all tests
- Code coverage remains above 80%
- SonarCloud quality gate passes
- Follows C# coding conventions
This project is licensed under the MIT License - see the LICENSE file for details.
Skiper29 - Initial work - GitHub Profile
- Lviv Polytechnic National University - Academic supervision
- Open-Meteo - Free weather API
- FAO - Irrigation methodology (FAO-56)
- Microsoft - .NET platform and tooling
- JetBrains - Rider IDE
- SonarCloud - Code quality analysis
- Open-source community for amazing libraries
- π Issues: GitHub Issues
- π¬ Discussions: GitHub Discussions
Made with β€οΈ for sustainable agriculture
β Star this repo if you find it useful!