* Initial implemenation of DSMR component. * Fix linting * Remove protocol V2.2 support until merged upstream. * Generate requirements using script. * Use updated dsmr-parser with protocol 2.2 support. * Add tests. * Isort and input validation. * Add entities for gas and actual meter reading. Error handling. Use Throttle. * Implement non-blocking serial reader. * Improve logging. * Merge entities into one, add icons, fix tests for asyncio. * Add error logging for serial reader. * Refactoring and documentation. - refactor asyncio reader task to make sure it stops with HA - document general principle of this component - refactor entity reading to be more clear - remove cruft from split entity implementation * Use `port` configuration key. * DSMR V2.2 seems to conflict in explaining which tariff is high and low. http://www.netbeheernederland.nl/themas/hotspot/hotspot-documenten/?dossierid=11010056&title=Slimme%20meter&onderdeel=Documenten > DSMR v2.2 Final P1 >> 6.1: table vs table note Meter Reading electricity delivered to client normal tariff) in 0,01 kWh - 1-0:1.8.1.255 Meter Reading electricity delivered to client (low tariff) in 0,01 kWh - 1-0:1.8.2.255 Note: Tariff code 1 is used for low tariff and tariff code 2 is used for normal tariff. * Refactor to use asyncio.Protocol instead of loop+queue. * Fix requirements * Close transport when HA stops. * Cleanup. * Include as dependency for testing (until merged upstream.) * Fix style. * Update setup.cfg
64 lines
2.2 KiB
Python
64 lines
2.2 KiB
Python
"""Test for DSMR components.
|
|
|
|
Tests setup of the DSMR component and ensure incoming telegrams cause Entity
|
|
to be updated with new values.
|
|
"""
|
|
|
|
import asyncio
|
|
from decimal import Decimal
|
|
from unittest.mock import Mock
|
|
|
|
from homeassistant.bootstrap import async_setup_component
|
|
from tests.common import assert_setup_component
|
|
|
|
|
|
@asyncio.coroutine
|
|
def test_default_setup(hass, monkeypatch):
|
|
"""Test the default setup."""
|
|
from dsmr_parser.obis_references import (
|
|
CURRENT_ELECTRICITY_USAGE,
|
|
ELECTRICITY_ACTIVE_TARIFF,
|
|
)
|
|
from dsmr_parser.objects import CosemObject
|
|
|
|
config = {'platform': 'dsmr'}
|
|
|
|
telegram = {
|
|
CURRENT_ELECTRICITY_USAGE: CosemObject([
|
|
{'value': Decimal('0.1'), 'unit': 'kWh'}
|
|
]),
|
|
ELECTRICITY_ACTIVE_TARIFF: CosemObject([
|
|
{'value': '0001', 'unit': ''}
|
|
]),
|
|
}
|
|
|
|
# mock for injecting DSMR telegram
|
|
dsmr = Mock(return_value=Mock())
|
|
monkeypatch.setattr('dsmr_parser.protocol.create_dsmr_reader', dsmr)
|
|
|
|
with assert_setup_component(1):
|
|
yield from async_setup_component(hass, 'sensor',
|
|
{'sensor': config})
|
|
|
|
telegram_callback = dsmr.call_args_list[0][0][2]
|
|
|
|
# make sure entities have been created and return 'unknown' state
|
|
power_consumption = hass.states.get('sensor.power_consumption')
|
|
assert power_consumption.state == 'unknown'
|
|
assert power_consumption.attributes.get('unit_of_measurement') is None
|
|
|
|
# simulate a telegram pushed from the smartmeter and parsed by dsmr_parser
|
|
telegram_callback(telegram)
|
|
|
|
# after receiving telegram entities need to have the chance to update
|
|
yield from asyncio.sleep(0, loop=hass.loop)
|
|
|
|
# ensure entities have new state value after incoming telegram
|
|
power_consumption = hass.states.get('sensor.power_consumption')
|
|
assert power_consumption.state == '0.1'
|
|
assert power_consumption.attributes.get('unit_of_measurement') is 'kWh'
|
|
|
|
# tariff should be translated in human readable and have no unit
|
|
power_tariff = hass.states.get('sensor.power_tariff')
|
|
assert power_tariff.state == 'low'
|
|
assert power_tariff.attributes.get('unit_of_measurement') is None
|