Skip to content

Commit 0bd7458

Browse files
API voor live gas verbruik #562
1 parent 61565d2 commit 0bd7458

File tree

5 files changed

+79
-5
lines changed

5 files changed

+79
-5
lines changed

docs/changelog.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ v2.1.0 - 2019-**-**
2121
**Tickets resolved in this release:**
2222

2323

24-
- [`#xxxxxxxxx <https://github.com/dennissiemensma/dsmr-reader/issues/xxxxxxxxxx>`_] yyyyyyyyyyyyyyy
24+
- [`#562 <https://github.com/dennissiemensma/dsmr-reader/issues/562>`_] API voor live gas verbruik
2525

2626

2727
----

dsmr_api/tests/v2/test_consumption.py

+36-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from dsmr_api.tests.v2 import APIv2TestCase
66
from dsmr_consumption.models.energysupplier import EnergySupplierPrice
77
from dsmr_datalogger.models.statistics import MeterStatistics
8+
from dsmr_consumption.models.consumption import GasConsumption
89

910

1011
class TestToday(APIv2TestCase):
@@ -49,7 +50,7 @@ def test_get(self, now_mock):
4950

5051
# Without prices.
5152
result = self._request('electricity-live')
52-
self.assertEqual(result['timestamp'], '2016-07-01T20:00:00Z')
53+
self.assertEqual(result['timestamp'], '2016-07-01T22:00:00+02:00')
5354
self.assertEqual(result['currently_returned'], 123)
5455
self.assertEqual(result['currently_delivered'], 1123)
5556

@@ -63,12 +64,45 @@ def test_get(self, now_mock):
6364
MeterStatistics.objects.update(electricity_tariff=1)
6465

6566
result = self._request('electricity-live')
66-
self.assertEqual(result['timestamp'], '2016-07-01T20:00:00Z')
67+
self.assertEqual(result['timestamp'], '2016-07-01T22:00:00+02:00')
6768
self.assertEqual(result['currently_returned'], 123)
6869
self.assertEqual(result['currently_delivered'], 1123)
6970
self.assertEqual(result['cost_per_hour'], '0.02')
7071

7172

73+
class GasLive(APIv2TestCase):
74+
@mock.patch('django.utils.timezone.now')
75+
def test_get(self, now_mock):
76+
now_mock.return_value = timezone.make_aware(timezone.datetime(2019, 4, 20))
77+
GasConsumption.objects.create(**{
78+
"read_at": "2019-04-19T12:00:00+02:00",
79+
"delivered": "123.456",
80+
"currently_delivered": "0.000"
81+
})
82+
GasConsumption.objects.create(**{
83+
"read_at": "2019-04-19T13:00:00+02:00",
84+
"delivered": "125.000",
85+
"currently_delivered": "1.544"
86+
})
87+
88+
# Without prices.
89+
result = self._request('gas-live')
90+
self.assertEqual(result['timestamp'], '2019-04-19T13:00:00+02:00')
91+
self.assertEqual(result['currently_delivered'], 1.544)
92+
93+
# Now with prices.
94+
EnergySupplierPrice.objects.create(
95+
start=timezone.now().date(),
96+
end=(timezone.now() + timezone.timedelta(hours=24)).date(),
97+
gas_price=0.50,
98+
)
99+
100+
result = self._request('gas-live')
101+
self.assertEqual(result['timestamp'], '2019-04-19T13:00:00+02:00')
102+
self.assertEqual(result['currently_delivered'], 1.544)
103+
self.assertEqual(result['cost_per_hour'], '0.78')
104+
105+
72106
class TestElectricity(APIv2TestCase):
73107
fixtures = ['dsmr_api/test_electricity_consumption.json']
74108

dsmr_api/urls/v2.py

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
path('gas', views.GasConsumptionViewSet.as_view({'get': 'list'}), name='gas-consumption'),
1919
path('today', views.TodayConsumptionView.as_view(), name='today-consumption'),
2020
path('electricity-live', views.ElectricityLiveView.as_view(), name='electricity-live'),
21+
path('gas-live', views.GasLiveView.as_view(), name='gas-live'),
2122
]
2223

2324
statistics_url_patterns = [

dsmr_api/views/v2.py

+6
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@ def get(self, request):
7171
return Response(dsmr_consumption.services.live_electricity_consumption(use_naturaltime=False))
7272

7373

74+
class GasLiveView(APIView):
75+
""" Returns the current gas usage. """
76+
def get(self, request):
77+
return Response(dsmr_consumption.services.live_gas_consumption())
78+
79+
7480
class ElectricityConsumptionViewSet(viewsets.ReadOnlyModelViewSet):
7581
""" Lists electricity consumption. """
7682
FIELD = 'read_at'

dsmr_consumption/services.py

+35-2
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ def day_consumption(day):
282282

283283

284284
def live_electricity_consumption(use_naturaltime=True):
285-
""" Returns the current latest/live consumption. """
285+
""" Returns the current latest/live electricity consumption. """
286286
data = {}
287287

288288
try:
@@ -291,7 +291,7 @@ def live_electricity_consumption(use_naturaltime=True):
291291
# Don't even bother when no data available.
292292
return data
293293

294-
latest_timestamp = latest_reading.timestamp
294+
latest_timestamp = timezone.localtime(latest_reading.timestamp)
295295

296296
# In case the smart meter is running a clock in the future.
297297
if latest_timestamp > timezone.now():
@@ -327,6 +327,39 @@ def live_electricity_consumption(use_naturaltime=True):
327327
data['cost_per_hour'] = formats.number_format(
328328
round_decimal(cost_per_hour)
329329
)
330+
331+
return data
332+
333+
334+
def live_gas_consumption():
335+
""" Returns the current latest/live gas consumption. """
336+
data = {}
337+
338+
try:
339+
latest_data = GasConsumption.objects.all().order_by('-read_at')[0]
340+
except IndexError:
341+
# Don't even bother when no data available.
342+
return data
343+
344+
latest_timestamp = timezone.localtime(latest_data.read_at)
345+
346+
# In case the smart meter is running a clock in the future.
347+
if latest_timestamp > timezone.now():
348+
latest_timestamp = timezone.now()
349+
350+
data['timestamp'] = latest_timestamp
351+
data['currently_delivered'] = latest_data.currently_delivered
352+
353+
try:
354+
# This WILL fail when we either have no prices at all or conflicting ranges.
355+
prices = EnergySupplierPrice.objects.by_date(target_date=timezone.now().date())
356+
except (EnergySupplierPrice.DoesNotExist, EnergySupplierPrice.MultipleObjectsReturned):
357+
return data
358+
359+
data['cost_per_hour'] = formats.number_format(
360+
round_decimal(latest_data.currently_delivered * prices.gas_price)
361+
)
362+
330363
return data
331364

332365

0 commit comments

Comments
 (0)