PowerDale is a small town with around 100 residents. Most houses have a smart meter installed that can save and send information about how much power a house is drawing/using.
There are three major providers of energy in town that charge different amounts for the power they supply.
- Dr Evil's Dark Energy
- The Green Eco
- Power for Everyone
JOI Energy is a new start-up in the energy industry. Rather than selling energy they want to differentiate themselves from the market by recording their customers' energy usage from their smart meters and recommending the best supplier to meet their needs.
You have been placed into their development team, whose current goal is to produce an API which their customers and smart meters will interact with.
Unfortunately, two members of the team are on annual leave, and another one has called in sick! You are left with another ThoughtWorker to progress with the current user stories on the story wall. This is your chance to make an impact on the business, improve the code base and deliver value.
At JOI energy the development team use a story wall or Kanban board to keep track of features or "stories" as they are worked on.
The wall you will be working from today has 7 columns:
- Backlog
- Ready for Dev
- In Dev
- Ready for Testing
- In Testing
- Ready for sign off
- Done
Examples can be found here https://leankit.com/learn/kanban/kanban-board/
To trial the new JOI software 5 people from the JOI accounts team have agreed to test the service and share their energy data.
User | Smart Meter ID | Power Supplier |
---|---|---|
Sarah | smart-meter-0 |
Dr Evil's Dark Energy |
Peter | smart-meter-1 |
The Green Eco |
Charlie | smart-meter-2 |
Dr Evil's Dark Energy |
Andrea | smart-meter-3 |
Power for Everyone |
Alex | smart-meter-4 |
The Green Eco |
These values are used in the code and in the following examples too.
The project requires 2.7.1. We recommend to use rbenv to manage ruby versions.
The project makes use of rake to help you out carrying some common tasks, such as building the project or running it.
Install bundler, and all needed gems with:
$ gem install bundler
$ bundle install
$ bundle exec rake specs
Run the application which will be listening on port 9292
.
-
Start the server
$ bundle exec rake server:start
-
Restart an already running server
$ bundle exec rake server:restart
-
Stop an already running server
$ bundle exec rake server:stop
Below is a list of API endpoints with their respective input and output. Please note that the application needs to be running for the following endpoints to work. For more information about how to run the application, please refer to run the application section above.
Endpoint
POST /readings/store
Example of body
{
"smartMeterId": <smartMeterId>,
"electricityReadings": [
{ "time": <time>, "reading": <reading> },
{ "time": <time>, "reading": <reading> },
...
]
}
Parameters
Parameter | Description |
---|---|
smartMeterId |
One of the smart meters' id listed above |
time |
The date/time (as ISO 8601) when the reading is taken |
reading |
The consumption in kW at the time of the reading |
Example readings
Date (GMT ) |
ISO 8601 | Reading (kW ) |
---|---|---|
2020-11-11 8:00 |
2020-11-11T08:00+00 |
0.0503 |
2020-11-12 8:00 |
2020-11-12T08:00+00 |
0.0213 |
In the above example, 0.0213 kW
were being consumed at 2020-11-12 8:00
. The reading indicates the powered being used at the time of the reading. If no power is being used at the time of reading, then the reading value will be 0
. Given that 0
may introduce new challenges, we can assume that there is always some consumption and we will never have a 0
reading value.
Posting readings using CURL
$ curl \
-X POST \
-H "Content-Type: application/json" \
"http://localhost:9292/readings/store" \
-d '{"smartMeterId":"smart-meter-0","electricityReadings":[{"time":"2020-11-11T08:00+00","reading":0.0503},{"time":"2020-11-12T08:00+00","reading":0.0213}]}'
The above command does not return anything.
Endpoint
GET /readings/read/<smartMeterId>
Parameters
Parameter | Description |
---|---|
smartMeterId |
One of the smart meters' id listed above |
Retrieving readings using CURL
$ curl "http://localhost:9292/readings/read/smart-meter-0"
Example output
[
{ "time": "2020-11-11T08:00+00", "reading": 0.0503 },
{ "time": "2020-11-12T08:00+00", "reading": 0.0213 },
...
]
Endpoint
GET /price-plans/compare-all/<smartMeterId>
Parameters
Parameter | Description |
---|---|
smartMeterId |
One of the smart meters' id listed above |
Retrieving readings using CURL
$ curl "http://localhost:9292/price-plans/compare-all/smart-meter-0"
Example output
{
"pricePlanComparisons": {
"price-plan-2": 13.824,
"price-plan-1": 27.648,
"price-plan-0": 138.24
},
"pricePlanId": "price-plan-0"
}
Endpoint
GET /price-plans/recommend/<smartMeterId>[?limit=<limit>]
Parameters
Parameter | Description |
---|---|
smartMeterId |
One of the smart meters' id listed above |
limit |
(Optional) limit the number of plans to be displayed |
Retrieving readings using CURL
$ curl "http://localhost:9292/price-plans/recommend/smart-meter-0?limit=2"
Example output
[{ "price-plan-2": 13.824 }, { "price-plan-1": 27.648 }]