Upgrade dsmr_parser to 0.11 ()

pull/9521/merge
Fabian Affolter 2017-09-25 22:19:44 +02:00 committed by Pascal Vizeli
parent a298b0790b
commit fafc4a6042
3 changed files with 17 additions and 38 deletions

View File

@ -1,29 +1,8 @@
"""
Support for Dutch Smart Meter Requirements.
Also known as: Smartmeter or P1 port.
Support for Dutch Smart Meter (also known as Smartmeter or P1 port).
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/sensor.dsmr/
Technical overview:
DSMR is a standard to which Dutch smartmeters must comply. It specifies that
the smartmeter must send out a 'telegram' every 10 seconds over a serial port.
The contents of this telegram differ between version but they generally consist
of lines with 'obis' (Object Identification System, a numerical ID for a value)
followed with the value and unit.
This module sets up a asynchronous reading loop using the `dsmr_parser` module
which waits for a complete telegram, parser it and puts it on an async queue as
a dictionary of `obis`/object mapping. The numeric value and unit of each value
can be read from the objects attributes. Because the `obis` are know for each
DSMR version the Entities for this component are create during bootstrap.
Another loop (DSMR class) is setup which reads the telegram queue,
stores/caches the latest telegram and notifies the Entities that the telegram
has been updated.
"""
import asyncio
from datetime import timedelta
@ -40,7 +19,7 @@ import voluptuous as vol
_LOGGER = logging.getLogger(__name__)
REQUIREMENTS = ['dsmr_parser==0.8']
REQUIREMENTS = ['dsmr_parser==0.11']
CONF_DSMR_VERSION = 'dsmr_version'
CONF_RECONNECT_INTERVAL = 'reconnect_interval'
@ -54,6 +33,7 @@ ICON_POWER = 'mdi:flash'
# Smart meter sends telegram every 10 seconds
MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=10)
RECONNECT_INTERVAL = 5
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
@ -98,7 +78,7 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
else:
gas_obis = obis_ref.GAS_METER_READING
# add gas meter reading and derivative for usage
# Add gas meter reading and derivative for usage
devices += [
DSMREntity('Gas Consumption', gas_obis),
DerivativeDSMREntity('Hourly Gas Consumption', gas_obis),
@ -107,7 +87,7 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
async_add_devices(devices)
def update_entities_telegram(telegram):
"""Update entities with latests telegram & trigger state update."""
"""Update entities with latests telegram and trigger state update."""
# Make all device entities aware of new telegram
for device in devices:
device.telegram = telegram
@ -127,7 +107,7 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
@asyncio.coroutine
def connect_and_reconnect():
"""Connect to DSMR and keep reconnecting until HA stops."""
"""Connect to DSMR and keep reconnecting until Home Assistant stops."""
while hass.state != CoreState.stopping:
# Start DSMR asyncio.Protocol reader
try:
@ -135,26 +115,26 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
reader_factory())
except (serial.serialutil.SerialException, ConnectionRefusedError,
TimeoutError):
# log any error while establishing connection and drop to retry
# Log any error while establishing connection and drop to retry
# connection wait
_LOGGER.exception("Error connecting to DSMR")
transport = None
if transport:
# register listener to close transport on HA shutdown
# Register listener to close transport on HA shutdown
stop_listerer = hass.bus.async_listen_once(
EVENT_HOMEASSISTANT_STOP, transport.close)
# wait for reader to close
# Wait for reader to close
yield from protocol.wait_closed()
if hass.state != CoreState.stopping:
# unexpected disconnect
# Unexpected disconnect
if transport:
# remove listerer
stop_listerer()
# reflect disconnect state in devices state by setting an
# Reflect disconnect state in devices state by setting an
# empty telegram resulting in `unknown` states
update_entities_telegram({})
@ -162,7 +142,7 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None):
yield from asyncio.sleep(config[CONF_RECONNECT_INTERVAL],
loop=hass.loop)
# Cannot be hass.async_add_job because job runs forever
# Can't be hass.async_add_job because job runs forever
hass.loop.create_task(connect_and_reconnect())
@ -181,7 +161,7 @@ class DSMREntity(Entity):
if self._obis not in self.telegram:
return None
# get the attribute value if the object has it
# Get the attribute value if the object has it
dsmr_object = self.telegram[self._obis]
return getattr(dsmr_object, attribute, None)
@ -237,7 +217,6 @@ class DerivativeDSMREntity(DSMREntity):
Gas readings are only reported per hour and don't offer a rate only
the current meter reading. This entity converts subsequents readings
into a hourly rate.
"""
_previous_reading = None
@ -265,11 +244,11 @@ class DerivativeDSMREntity(DSMREntity):
current_reading = self.get_dsmr_object_attr('value')
if self._previous_reading is None:
# can't calculate rate without previous datapoint
# Can't calculate rate without previous datapoint
# just store current point
pass
else:
# recalculate the rate
# Recalculate the rate
diff = current_reading - self._previous_reading
self._state = diff

View File

@ -193,7 +193,7 @@ dnspython3==1.15.0
dovado==0.4.1
# homeassistant.components.sensor.dsmr
dsmr_parser==0.8
dsmr_parser==0.11
# homeassistant.components.dweet
# homeassistant.components.sensor.dweet

View File

@ -37,7 +37,7 @@ aiohttp_cors==0.5.3
apns2==0.1.1
# homeassistant.components.sensor.dsmr
dsmr_parser==0.8
dsmr_parser==0.11
# homeassistant.components.sensor.season
ephem==3.7.6.0