Fix TypeError (#21734)

* timediff is of type timedelta. Divide by timedelta does not work.

- convert a timedelta to int
- make sure the test inputs real timestamps

* Convert the total_seconds to decimal and round the result

readings are of type Decimal, so fix test to reflect that

* split line into multiple statements

Line too long

* use total_seconds instead of timediff

* Make both values float instead of Decimal
pull/21875/head
Willem Burgers 2019-03-09 17:51:15 +01:00 committed by Anders Melchiorsen
parent be989ebb7e
commit 458548daec
2 changed files with 8 additions and 6 deletions

View File

@ -351,7 +351,8 @@ class DerivativeDSMREntity(DSMREntity):
# Recalculate the rate # Recalculate the rate
diff = current_reading - self._previous_reading diff = current_reading - self._previous_reading
timediff = timestamp - self._previous_timestamp timediff = timestamp - self._previous_timestamp
self._state = diff / timediff * 3600 total_seconds = timediff.total_seconds()
self._state = round(float(diff) / total_seconds * 3600, 3)
self._previous_reading = current_reading self._previous_reading = current_reading
self._previous_timestamp = timestamp self._previous_timestamp = timestamp

View File

@ -6,6 +6,7 @@ Entity to be updated with new values.
""" """
import asyncio import asyncio
import datetime
from decimal import Decimal from decimal import Decimal
from unittest.mock import Mock from unittest.mock import Mock
@ -104,8 +105,8 @@ def test_derivative():
entity.telegram = { entity.telegram = {
'1.0.0': MBusObject([ '1.0.0': MBusObject([
{'value': 1551642213}, {'value': datetime.datetime.fromtimestamp(1551642213)},
{'value': 745.695, 'unit': 'm3'}, {'value': Decimal(745.695), 'unit': 'm3'},
]) ])
} }
yield from entity.async_update() yield from entity.async_update()
@ -115,13 +116,13 @@ def test_derivative():
entity.telegram = { entity.telegram = {
'1.0.0': MBusObject([ '1.0.0': MBusObject([
{'value': 1551642543}, {'value': datetime.datetime.fromtimestamp(1551642543)},
{'value': 745.698, 'unit': 'm3'}, {'value': Decimal(745.698), 'unit': 'm3'},
]) ])
} }
yield from entity.async_update() yield from entity.async_update()
assert abs(entity.state - 0.03272) < 0.00001, \ assert abs(entity.state - 0.033) < 0.00001, \
'state should be hourly usage calculated from first and second update' 'state should be hourly usage calculated from first and second update'
assert entity.unit_of_measurement == 'm3/h' assert entity.unit_of_measurement == 'm3/h'