mirror of
https://github.com/espressif/esp-rainmaker.git
synced 2026-01-15 04:18:10 +00:00
ESP Daylight Component
A standalone C library for calculating sunrise and sunset times using NOAA Solar Calculator equations. This component provides accurate solar calculations for any location and date, designed for integration with ESP-IDF projects.
Features
- Accurate NOAA calculations: Uses proven NOAA Solar Calculator equations
- Global coverage: Works for any location worldwide (handles polar regions)
- Lightweight: Minimal memory footprint and dependencies
- ESP-IDF ready: Designed for embedded systems
- Time zone agnostic: Returns UTC timestamps for easy conversion
API Reference
Core Functions
bool esp_daylight_calc_sunrise_sunset_utc(int year, int month, int day,
double latitude, double longitude,
time_t *sunrise_utc, time_t *sunset_utc);
Calculate sunrise and sunset times for a specific date and location.
Parameters:
year: Year (e.g., 2024)month: Month (1-12)day: Day of month (1-31)latitude: Latitude in decimal degrees (-90 to +90, positive North)longitude: Longitude in decimal degrees (-180 to +180, positive East)sunrise_utc: Output sunrise time as UTC timestampsunset_utc: Output sunset time as UTC timestamp
Returns: true on success, false if sun doesn't rise/set (polar regions)
Helper Functions
time_t esp_daylight_apply_offset(time_t base_time, int offset_minutes);
Apply time offset to a base timestamp.
bool esp_daylight_get_sunrise_today(const esp_daylight_location_t *location, time_t *sunrise_utc);
bool esp_daylight_get_sunset_today(const esp_daylight_location_t *location, time_t *sunset_utc);
Get sunrise/sunset for current date at given location.
Usage Example
#include "esp_daylight.h"
void calculate_solar_times(void) {
time_t sunrise_utc, sunset_utc;
// Calculate for Pune, India on August 29, 2025
bool ok = esp_daylight_calc_sunrise_sunset_utc(
2025, 8, 29, // Date
18.5204, 73.8567, // Pune coordinates
&sunrise_utc, &sunset_utc
);
if (ok) {
// Apply offset: 30 minutes before sunset
time_t light_on_time = esp_daylight_apply_offset(sunset_utc, -30);
struct tm *tm_info = gmtime(&light_on_time);
printf("Turn on light at: %02d:%02d:%02d UTC\n",
tm_info->tm_hour, tm_info->tm_min, tm_info->tm_sec);
} else {
printf("No sunrise/sunset for this location and date\n");
}
}
Location Coordinates
Popular Cities
| City | Latitude | Longitude |
|---|---|---|
| New York | 40.7128 | -74.0060 |
| London | 51.5074 | -0.1278 |
| Pune | 18.5204 | 73.8567 |
| Shanghai | 31.2304 | 121.4737 |
| Sydney | -33.8688 | 151.2093 |
Coordinate Format
- Latitude: -90 to +90 degrees (positive = North, negative = South)
- Longitude: -180 to +180 degrees (positive = East, negative = West)
Integration with ESP Schedule
This component integrates seamlessly with ESP Schedule for solar-based scheduling:
esp_schedule_config_t schedule_config = {
.name = "sunset_light",
.trigger.type = ESP_SCHEDULE_TYPE_SUNSET,
.trigger.solar.latitude = 18.5204,
.trigger.solar.longitude = 73.8567,
.trigger.solar.offset_minutes = -30, // 30 min before sunset
.trigger.solar.repeat_days = ESP_SCHEDULE_DAY_EVERYDAY,
.trigger_cb = light_control_callback,
};
Algorithm Details
The component implements the NOAA Solar Calculator algorithm with:
- Zenith angle: 90.833° (accounts for atmospheric refraction)
- Precision: Typically accurate to within 1-2 minutes
- Edge cases: Handles polar day/night conditions gracefully
Dependencies
- ESP-IDF (esp_common)
- Standard C math library (
-lm)
Component Structure
esp_daylight/
├── CMakeLists.txt
├── include/
│ └── esp_daylight.h
├── src/
│ └── esp_daylight.c
└── README.md