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 energy a house has used.
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 (formerly EcoMart) is a 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 in a small support team along with 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 support team are on annual leave, and another one has called in sick! You are left with another ThoughtWorker to support the application and provide value to the client by having minimum/no disruptions in the application
The immediate challenge is to increase the stability of the application by maintaining and improving the code base while in parallel the development of the API for customer and smart meter interaction is ongoing
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.
JOI Energy is a new energy company that uses data to ensure customers are able to be on the best price plan for their energy consumption.
Below is a list of API endpoints with their respective input and output. Please note that the application needs to be running. For more information about how to run the application, please refer to run the application section below.
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 time when the delta is measured |
reading |
The delta reading since the last reading |
Example readings
Date (GMT ) |
Reading (kW ) |
---|---|
2020-11-11T08:00:00.0000000+00:00 |
0.0503 |
2020-11-12T08:00:00.0000000+00:00 |
0.0213 |
In the above example, 0.0213 kW
where consumed between 2020-11-11 8:00
and 2020-11-12 8:00
.
Posting readings using CURL
$ curl \
-X POST \
-H "Content-Type: application/json" \
"http://localhost:5000/readings/store" \
-d '{"smartMeterId":"smart-meter-0","electricityReadings":[{"time":"2020-11-11T08:00:00.0000000+00:00","reading":0.0503},{"time":"2020-11-12T08:00:00.0000000+00:00","reading":0.0213}]}'
The above command returns 200 OK and {}
.
Endpoint
GET /readings/read/<smartMeterId>
Parameters
Parameter | Description |
---|---|
smartMeterId |
One of the smart meters' id listed above |
Retrieving readings using CURL
$ curl "http://localhost:5000/readings/read/smart-meter-0"
Example output
[
{ "time": "2020-11-11T08:00:00.000000Z", "reading": 0.0503 },
{ "time": "2020-11-12T08:00:00.000000Z", "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:5000/price-plans/compare-all/smart-meter-0"
Example output
{
"DrEvilsDarkEnergy": 94.87181867550794,
"TheGreenEco": 18.974363735101587,
"PowerForEveryone": 9.487181867550794
}
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:5000/price-plans/recommend/smart-meter-0?limit=2"
Example output
[
{
"key": "PowerForEveryone",
"value": 9.487181867550794
},
{
"key": "TheGreenEco",
"value": 18.974363735101587
}
]
The project requires .NET 6.0.
Tested on:
- Visual Studio 2022 (17.1)
- Visual Studio for Mac (8.10)
- Visual Studio Code (1.64)
From the terminal/shell/command line tool, use the following commands to build, test and run the API.
$ dotnet build
$ dotnet test JOIEnergy.Tests
Run the application which will be listening on port 5000
.
$ dotnet run --project JOIEnergy