# ExNrel
[![Build Status](https://semaphoreci.com/api/v1/techgaun/ex_nrel/branches/master/badge.svg)](https://semaphoreci.com/techgaun/ex_nrel) [![Hex version](https://img.shields.io/hexpm/v/ex_nrel.svg "Hex version")](https://hex.pm/packages/ex_nrel) ![Hex downloads](https://img.shields.io/hexpm/dt/ex_nrel.svg "Hex downloads")
> NREL(https://developer.nrel.gov/) Api client for Elixir
## Installation
You can install it from hex as below:
- Add `ex_nrel` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[{:ex_nrel, "~> 0.2.0"}]
end
```
- Ensure `ex_nrel` is started before your application:
```elixir
def application do
[applications: [:ex_nrel]]
end
```
## Usage
### Configuration
In your configuration, add the following block:
```
config :ex_nrel,
api_key: System.get_env("NREL_API_KEY"),
format: "json"
```
Output can be either `json` or `xml`. You can also specify `format` as part of your queries in any of the API calls to get the data of specific format. For example, `ExNrel.Electricity.UtilityRate.get(lat: 39.323, lon: -94.23, format: "json")` explicitly returns `json` overriding the default configuration.
ExNrel supports following APIs offered by NREL.
### [Buildings](http://developer.nrel.gov/docs/buildings/)
#### [Commerial Building Resources](http://developer.nrel.gov/docs/buildings/commercial-building-resource-database-v1/) (resources, events and vocabularies)
```elixir
iex> ExNrel.Buildings.CBR.get(portal: "Energy")
iex> ExNrel.Buildings.CBR.events(portal: 5)
iex> ExNrel.Buildings.CBR.vocabularies(name: "audience-types")
```
### [Electricity](http://developer.nrel.gov/docs/electricity/)
#### [Energy Incentives (Version 2)](http://developer.nrel.gov/docs/electricity/energy-incentives-v2/)
```elixir
iex> ExNrel.Electricity.EnergyIncentives.get(lat: 39.323, lon: -94.23)
iex> ExNrel.Electricity.EnergyIncentives.get(lat: 39.323, lon: -94.23, category: "hvac")
iex> ExNrel.Electricity.EnergyIncentives.get(lat: 39.323, lon: -94.23, category: "hvac", technology: "air_conditioners")
iex> ExNrel.Electricity.EnergyIncentives.get(address: "1712 Main Street, Kansas City")
```
#### [Utility Rates](http://developer.nrel.gov/docs/electricity/utility-rates-v3/)
```elixir
iex> ExNrel.Electricity.UtilityRate.get(lat: 39.323, lon: -94.23)
iex> ExNrel.Electricity.UtilityRate.get(address: "1712 Main Street, Kansas City")
```
#### [Utility Rates by Census Region](http://developer.nrel.gov/docs/electricity/census-rate-v3/)
```elixir
iex> ExNrel.Electricity.CensusRate.get(id: 101, lat: 39.323, lon: -94.23)
iex> ExNrel.Electricity.CensusRate.get(id: 101, address: "1712 Main Street, Kansas City")
```
### [Solar](http://developer.nrel.gov/docs/solar/)
#### [PVWatts (Version 5)](https://developer.nrel.gov/docs/solar/pvwatts-v5/)
```elixir
iex> ExNrel.Solar.PVWatts.get(lat: 39.323, lon: -94.23)
iex> ExNrel.Solar.PVWatts.get(address: "1712 Main Street, Kansas City")
iex> ExNrel.Solar.PVWatts.get(lat: 39.323, lon: -94.23, timeframe: "hourly")
```
#### [Solar Dataset Query](http://developer.nrel.gov/docs/solar/data-query-v1/)
```elixir
iex> ExNrel.Solar.Dataset.get(lat: 39.323, lon: -94.23, radius: 20)
iex> ExNrel.Solar.Dataset.get(address: "1712 Main Street, Kansas City")
iex> ExNrel.Solar.Dataset.get(lat: 39.323, lon: -94.23, all: 1)
```
#### [Solar Resource Data](http://developer.nrel.gov/docs/solar/solar-resource-v1/)
```elixir
iex> ExNrel.Solar.Resources.get(lat: 39.323, lon: -94.23)
iex> ExNrel.Solar.Resources.get(address: "1712 Main Street, Kansas City")
```
### API Response
The response from the API is parsed through a simple parser. For JSON, the `poison` package does the job and for XML, currently ExNrel returns the body as string.
The response can be one of:
```elixir
{:ok, body, [total_limit: api_rate_limit, remaining_limit: api_remaining_limit]}
{:error, %{reason: "failure_reason"}}
```
## Contribution
- You can add support for remaining APIs or fix the bug in existing ones.
- ~~The XML parsing is not in-place.~~
- ~~Rate limiting headers might be useful to handle rate limiting issues.~~ (Part of response in ExNrel >= 0.2.0)
## Author
- [techgaun](https://github.com/techgaun)