Git Product home page Git Product logo

daylight's Introduction

Tests Status Code Style Checks Status Code Coverage PyPI downloads MIT License

daylight or libdaylight is a library which enables you to answer daylight related questions like:

  • Irradiance - How bright is it outside, given a particular time and location?
  • What is the time of sunrise/solarnoon/sunset, given a particular time and location?

The math used in this library is mostly based on NOAA's solar calculations, which were in turn based on Astronomical Algorithms, by Jean Meeus. Also thanks to this Python implementation of these calculations by Michel Landers, which was a very useful reference while building this library.

libdaylight is written in modern C++ with bindings to python using pybind11.

daylight's python bindings provide vectorized functions - allowing for efficient analysis when dealing with lots of queries. At the same, this allows daylight to play well with established data science tooling like numpy and pandas.

โš ๏ธ Currently this library is only tested for basic use cases. For any scientific-grade use cases, or for cases where precise values are needed - this library is not extensively tested, yet. Any contributions from that aspect would be greatly appreciated.

Examples

The examples directory contains a real world usage of this library at Adonmo - for its season and location independent brightness control mechanism: Click here to read it.

Adonmo brightness control mechanism using daylight

Usage

Python

Installation

From PyPI

$ pip install daylight

From source

$ pip install git+https://github.com/adonmo/daylight

Code sample

import datetime
import pytz

import daylight

def epoch(year, month, day, hour=0, minute=0, second=0, tz=pytz.UTC):
    return int(tz.localize(datetime.datetime(year, month, day, hour, minute, second)).timestamp())

tz = pytz.timezone("Asia/Kolkata")
tz_offset = tz.utcoffset(datetime.datetime.utcnow()).total_seconds() / 3600

# Example with GPS coords for Hyderabad, India, in Indian timezone (IST)
sun = daylight.Sunclock(17.3859, 78.4867, tz_offset)

# Know the daylight strength / ambient brightness level at a given time of day
# Below call returns 0.882753920406182
sun.irradiance(epoch(2020, 5, 21, 14, 10, 35, tz))

# Know the sunrise time for a given date
# Returns unix timestamp for 5:42 AM
sun.sunrise(epoch(2020, 5, 21, tz=tz))

# Know the solar noon time for a given date
# Returns unix timestamp for 12:12 PM
sun.solar_noon(epoch(2020, 5, 21, tz=tz))

# Know the sunset time for a given date
# Returns unix timestamp for 18:42 PM
sun.sunset(epoch(2020, 5, 21, tz=tz))

# daylight's functions are vectorized as well - which means you can compute results
# for multiple parameters efficiently, while playing well with libraries like numpy/pandas
# Returns [-0.56570521  0.28650605]
sun.irradiance([
    epoch(2020, 5, 21, 3, 0, 0, tz),
    epoch(2020, 5, 21, 7, 0, 0, tz),
])

Documentation

API Reference can be found here: https://adonmo-daylight.readthedocs.io/en/latest/reference.html

Related projects

PyEphem, pvlib-python and solarpy are some libraries which have overlap with the type of problems this library solves.

Comparision between them and this library can be read on our docs

C++

#include <iostream>
#include <daylight/Sunclock.hpp>

using namespace std;


int main() {
    // Coordinates and Timezone offsets for Hyderabad
    Sunclock sun(17.3859, 78.4867, 5.5);

    // Unix timestamp for 2020-5-21 14:10:35
    auto irradiance = sun.irradiance(1590050435);

    // Since we gave afternoon - we should expect a value close to 1
    cout << irradiance << endl; // Returns 0.882754

    return 0;
}

Example

A minimal C++ app example: https://github.com/adonmo/libdaylight-cpp-example

Documentation

C++ API Reference: https://adonmo.github.io/daylight/

C

libdaylight can also be used in C through the provided C API.

Here is an example code on how to do this:

#include "daylight_c.h"
#include <stdio.h>

int main(int argc, char* argv[]) {
    struct Sunclock* s = newSunclock(17.3859, 78.4867, 5.5);
    time_t t_20200521141035 = 1590050435;
    double irradiance = Sunclock_irradiance(s, t_20200521141035);
    printf("%lf\n", irradiance);
    deleteSunclock(s);
}

Save the above file as main.c, and run the following commands to build and run it:

Note: Make sure daylight is built first before running these commands.

$ cmake -B build/capi -S capi
$ cmake --build build/capi
$ gcc -I/<path_to_daylight>/capi/include -c main.c -o main.o
$ g++ -L/<path_to_daylight>/build/capi main.o -l:libdaylight_c.so -o main
$ LD_LIBRARY_PATH=/<path_to_daylight>/build/capi ./main
0.882754

Development

libdaylight uses the CMake build system.

Building just the library

$ cmake -B build -S .
$ cmake --build build

This builds a static library file libdaylight.a

If you make any additional changes, you can just run cmake --build build again to get your changes reflected in the compiled outputs.

Running tests

$ cmake -B build/test -S test
$ cmake --build build/test
$ ./build/test/libdaylight-tests

If everything is working okay, you should see "All tests passed".

libdaylight uses the Catch2 library for its tests.

Testing the python bindings

There are no strict tests yet for the python bindings. However you can run an example script file, making this a sanity test at least.

After building, from the tests/python directory, run:

$ python test.py

If everything is working okay, you should see "All tests passed".

Building docs

Python (Sphinx)

$ pip install sphinx sphinx_rtd_theme numpy numpydoc
$ cmake -B build/docs -S documentation
$ cmake --build build/docs
$ cmake --build build/docs --target pydocs

You can then proceed to host the docs locally, for example on http://0.0.0.0:8000/

$ python -m http.server --directory documentation/python/_build/html

C++ (Doxygen)

$ cmake -B build/docs -S documentation
$ cmake --build build/docs
$ cmake --build build/docs --target cppdocs

You can then proceed to host the docs locally, for example on http://0.0.0.0:8000/

$ python -m http.server --directory build/docs/doxygen/html

Contributing

Issues and pull requests are welcome.

  • For proposing new features/improvements or reporting bugs, create an issue.
  • Check open issues for viewing existing ideas, verify if it is already proposed/being worked upon.
  • When implementing new features make sure to add relavant tests and documentation before sending pull requests.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.