Passed Travis CI

This commit is contained in:
Aurélien Correia 2015-04-21 16:40:13 +02:00
parent 5ce95f6b88
commit 4d6555441d
3 changed files with 64 additions and 38 deletions

View File

@ -1,5 +1,3 @@
__author__ = "Aurélien Correia"
""" """
components.modbus components.modbus
~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~
@ -24,13 +22,10 @@ modbus:
parity: N parity: N
""" """
import time
import logging import logging
from homeassistant.const import EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP from homeassistant.const import (EVENT_HOMEASSISTANT_START,
import homeassistant.loader as loader EVENT_HOMEASSISTANT_STOP)
from homeassistant.helpers import validate_config
import homeassistant.components as core
# The domain of your component. Should be equal to the name of your component # The domain of your component. Should be equal to the name of your component
DOMAIN = "modbus" DOMAIN = "modbus"
@ -41,7 +36,7 @@ DEPENDENCIES = []
# Type of network # Type of network
MEDIUM = "type" MEDIUM = "type"
## if MEDIUM == "serial" # if MEDIUM == "serial"
METHOD = "method" METHOD = "method"
SERIAL_PORT = "port" SERIAL_PORT = "port"
BAUDRATE = "baudrate" BAUDRATE = "baudrate"
@ -49,7 +44,7 @@ STOPBITS = "stopbits"
BYTESIZE = "bytesize" BYTESIZE = "bytesize"
PARITY = "parity" PARITY = "parity"
## if MEDIUM == "tcp" or "udp" # if MEDIUM == "tcp" or "udp"
HOST = "host" HOST = "host"
IP_PORT = "port" IP_PORT = "port"
@ -58,13 +53,17 @@ _LOGGER = logging.getLogger(__name__)
NETWORK = None NETWORK = None
TYPE = None TYPE = None
def setup(hass, config): def setup(hass, config):
""" Setup Modbus component. """ """ Setup Modbus component. """
# Modbus connection type
# pylint: disable=global-statement, import-error
global TYPE global TYPE
TYPE = config[DOMAIN][MEDIUM] TYPE = config[DOMAIN][MEDIUM]
# Connect to Modbus network # Connect to Modbus network
# pylint: disable=global-statement, import-error
global NETWORK global NETWORK
if TYPE == "serial": if TYPE == "serial":
@ -87,9 +86,11 @@ def setup(hass, config):
return False return False
def stop_modbus(event): def stop_modbus(event):
""" Stop Modbus service"""
NETWORK.close() NETWORK.close()
def start_modbus(event): def start_modbus(event):
""" Start Modbus service"""
NETWORK.connect() NETWORK.connect()
hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, stop_modbus) hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, stop_modbus)

View File

@ -1,5 +1,3 @@
__author__ = "Aurélien Correia"
""" """
Support for Modbus sensors. Support for Modbus sensors.
@ -42,6 +40,7 @@ from homeassistant.const import (
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
def setup_platform(hass, config, add_devices, discovery_info=None): def setup_platform(hass, config, add_devices, discovery_info=None):
""" Read config and create Modbus devices """ """ Read config and create Modbus devices """
sensors = [] sensors = []
@ -52,15 +51,24 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
registers = config.get("registers") registers = config.get("registers")
for regnum, register in registers.items(): for regnum, register in registers.items():
if register.get("name"): if register.get("name"):
sensors.append(ModbusSensor(register.get("name"), slave, regnum, None, register.get("unit"))) sensors.append(ModbusSensor(register.get("name"),
slave,
regnum,
None,
register.get("unit")))
if register.get("bits"): if register.get("bits"):
bits = register.get("bits") bits = register.get("bits")
for bitnum, bit in bits.items(): for bitnum, bit in bits.items():
if bit.get("name"): if bit.get("name"):
sensors.append(ModbusSensor(bit.get("name"), slave, regnum, bitnum)) sensors.append(ModbusSensor(bit.get("name"),
slave,
regnum,
bitnum))
add_devices(sensors) add_devices(sensors)
class ModbusSensor(Entity): class ModbusSensor(Entity):
# pylint: disable=too-many-arguments
""" Represents a Modbus Sensor """ """ Represents a Modbus Sensor """
def __init__(self, name, slave, register, bit=None, unit=None): def __init__(self, name, slave, register, bit=None, unit=None):
@ -76,13 +84,16 @@ class ModbusSensor(Entity):
@property @property
def should_poll(self): def should_poll(self):
""" We should poll, because slaves are not allowed to initiate communication on Modbus networks""" """ We should poll, because slaves are not allowed to
initiate communication on Modbus networks"""
return True return True
@property @property
def unique_id(self): def unique_id(self):
""" Returns a unique id. """ """ Returns a unique id. """
return "MODBUS-SENSOR-{}-{}-{}".format(self.slave, self.register, self.bit) return "MODBUS-SENSOR-{}-{}-{}".format(self.slave,
self.register,
self.bit)
@property @property
def state(self): def state(self):
@ -113,10 +124,12 @@ class ModbusSensor(Entity):
return attr return attr
def update(self): def update(self):
result = modbus.NETWORK.read_holding_registers(unit=self.slave,address=self.register,count=1) result = modbus.NETWORK.read_holding_registers(unit=self.slave,
address=self.register,
count=1)
val = 0 val = 0
for i, e in enumerate(result.registers): for i, res in enumerate(result.registers):
val += e * (2**(i*16)) val += res * (2**(i*16))
if self.bit: if self.bit:
self._value = val & (0x0001 << self.bit) self._value = val & (0x0001 << self.bit)
else: else:

View File

@ -1,5 +1,3 @@
__author__ = "Aurélien Correia"
""" """
Support for Modbus switches. Support for Modbus switches.
@ -34,6 +32,7 @@ from homeassistant.helpers.entity import ToggleEntity
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
def setup_platform(hass, config, add_devices, discovery_info=None): def setup_platform(hass, config, add_devices, discovery_info=None):
""" Read config and create Modbus devices """ """ Read config and create Modbus devices """
switches = [] switches = []
@ -46,9 +45,13 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
bits = register.get("bits") bits = register.get("bits")
for bitnum, bit in bits.items(): for bitnum, bit in bits.items():
if bit.get("name"): if bit.get("name"):
switches.append(ModbusSwitch(bit.get("name"), slave, regnum, bitnum)) switches.append(ModbusSwitch(bit.get("name"),
slave,
regnum,
bitnum))
add_devices(switches) add_devices(switches)
class ModbusSwitch(ToggleEntity): class ModbusSwitch(ToggleEntity):
""" Represents a Modbus Switch """ """ Represents a Modbus Switch """
@ -65,13 +68,16 @@ class ModbusSwitch(ToggleEntity):
@property @property
def should_poll(self): def should_poll(self):
""" We should poll, because slaves are not allowed to initiate communication on Modbus networks""" """ We should poll, because slaves are not allowed to
initiate communication on Modbus networks"""
return True return True
@property @property
def unique_id(self): def unique_id(self):
""" Returns a unique id. """ """ Returns a unique id. """
return "MODBUS-SWITCH-{}-{}-{}".format(self.slave, self.register, self.bit) return "MODBUS-SWITCH-{}-{}-{}".format(self.slave,
self.register,
self.bit)
@property @property
def is_on(self): def is_on(self):
@ -92,18 +98,24 @@ class ModbusSwitch(ToggleEntity):
if self.register_value is None: if self.register_value is None:
self.update() self.update()
val = self.register_value | (0x0001 << self.bit) val = self.register_value | (0x0001 << self.bit)
modbus.NETWORK.write_register(unit=self.slave,address=self.register,value=val) modbus.NETWORK.write_register(unit=self.slave,
address=self.register,
value=val)
def turn_off(self, **kwargs): def turn_off(self, **kwargs):
if self.register_value is None: if self.register_value is None:
self.update() self.update()
val = self.register_value & ~(0x0001 << self.bit) val = self.register_value & ~(0x0001 << self.bit)
modbus.NETWORK.write_register(unit=self.slave,address=self.register,value=val) modbus.NETWORK.write_register(unit=self.slave,
address=self.register,
value=val)
def update(self): def update(self):
result = modbus.NETWORK.read_holding_registers(unit=self.slave,address=self.register,count=1) result = modbus.NETWORK.read_holding_registers(unit=self.slave,
address=self.register,
count=1)
val = 0 val = 0
for i, e in enumerate(result.registers): for i, res in enumerate(result.registers):
val += e * (2**(i*16)) val += res * (2**(i*16))
self.register_value = val self.register_value = val
self._is_on = (val & (0x0001 << self.bit) > 0) self._is_on = (val & (0x0001 << self.bit) > 0)