Update RPi.GPIO version and code refactoring

This commit is contained in:
sfam 2016-01-15 11:59:58 +00:00
parent bb80e3a9fc
commit 8617b92d1b
6 changed files with 182 additions and 128 deletions

View file

@ -43,6 +43,7 @@ omit =
homeassistant/components/binary_sensor/arest.py homeassistant/components/binary_sensor/arest.py
homeassistant/components/binary_sensor/rest.py homeassistant/components/binary_sensor/rest.py
homeassistant/components/binary_sensor/rpi_gpio.py
homeassistant/components/browser.py homeassistant/components/browser.py
homeassistant/components/camera/* homeassistant/components/camera/*
homeassistant/components/device_tracker/actiontec.py homeassistant/components/device_tracker/actiontec.py

View file

@ -0,0 +1,73 @@
"""
homeassistant.components.binary_sensor.rpi_gpio
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Allows to configure a binary_sensor state sensor using RPi GPIO.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/binary_sensor.rpi_gpio/
"""
import logging
import homeassistant.components.rpi_gpio as rpi_gpio
from homeassistant.helpers.entity import Entity
from homeassistant.const import (STATE_ON, STATE_OFF, DEVICE_DEFAULT_NAME)
DEFAULT_PULL_MODE = "UP"
DEFAULT_BOUNCETIME = 50
DEFAULT_INVERT_LOGIC = False
DEPENDENCIES = ['rpi_gpio']
_LOGGER = logging.getLogger(__name__)
# pylint: disable=unused-argument
def setup_platform(hass, config, add_devices, discovery_info=None):
""" Sets up the Raspberry PI GPIO ports. """
pull_mode = config.get('pull_mode', DEFAULT_PULL_MODE)
bouncetime = config.get('bouncetime', DEFAULT_BOUNCETIME)
invert_logic = config.get('invert_logic', DEFAULT_INVERT_LOGIC)
binary_sensors = []
ports = config.get('ports')
for port_num, port_name in ports.items():
binary_sensors.append(RPiGPIOBinarySensor(
port_name, port_num, pull_mode, bouncetime, invert_logic))
add_devices(binary_sensors)
# pylint: disable=too-many-arguments, too-many-instance-attributes
class RPiGPIOBinarySensor(Entity):
""" Sets up the Raspberry PI GPIO ports. """
def __init__(self, name, port, pull_mode, bouncetime, invert_logic):
# pylint: disable=no-member
self._name = name or DEVICE_DEFAULT_NAME
self._port = port
self._pull_mode = pull_mode
self._bouncetime = bouncetime
self._invert_logic = invert_logic
rpi_gpio.setup_input(self._port, self._pull_mode)
self._state = rpi_gpio.read_input(self._port)
def read_gpio(port):
""" Reads state from GPIO. """
self._state = rpi_gpio.read_input(self._port)
self.update_ha_state()
rpi_gpio.edge_detect(self._port, read_gpio, self._bouncetime)
@property
def should_poll(self):
""" No polling needed. """
return False
@property
def name(self):
""" The name of the sensor. """
return self._name
@property
def state(self):
""" Returns the state of the entity. """
return STATE_ON if self._state != self._invert_logic else STATE_OFF

View file

@ -0,0 +1,68 @@
"""
homeassistant.components.switch.rpi_gpio
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Allows to control the GPIO pins of a Raspberry Pi.
For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/switch.rpi_gpio/
"""
import logging
try:
import RPi.GPIO as GPIO
except ImportError:
GPIO = None
from homeassistant.const import (EVENT_HOMEASSISTANT_START,
EVENT_HOMEASSISTANT_STOP)
REQUIREMENTS = ['RPi.GPIO==0.6.1']
DOMAIN = "rpi_gpio"
_LOGGER = logging.getLogger(__name__)
# pylint: disable=no-member
def setup(hass, config):
""" Sets up the Raspberry PI GPIO ports. """
if GPIO is None:
_LOGGER.error('RPi.GPIO not available. rpi_gpio ports ignored.')
return False
def cleanup_gpio(event):
""" Stuff to do before stop home assistant. """
GPIO.cleanup()
def prepare_gpio(event):
""" Stuff to do when home assistant starts. """
hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, cleanup_gpio)
hass.bus.listen_once(EVENT_HOMEASSISTANT_START, prepare_gpio)
GPIO.setmode(GPIO.BCM)
return True
def setup_output(port):
""" Setup a GPIO as output """
GPIO.setup(port, GPIO.OUT)
def setup_input(port, pull_mode):
""" Setup a GPIO as input """
GPIO.setup(port, GPIO.IN,
GPIO.PUD_DOWN if pull_mode == 'DOWN' else GPIO.PUD_UP)
def write_output(port, value):
""" Write a value to a GPIO"""
GPIO.output(port, value)
def read_input(port):
""" Read a value from a GPIO"""
return GPIO.input(port)
def edge_detect(port, event_callback, bounce):
""" Adds detection for RISING and FALLING events """
GPIO.add_event_detect(
port,
GPIO.BOTH,
callback=event_callback,
bouncetime=bounce)

View file

@ -6,92 +6,51 @@ Allows to configure a binary state sensor using RPi GPIO.
For more details about this platform, please refer to the documentation at For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/sensor.rpi_gpio/ https://home-assistant.io/components/sensor.rpi_gpio/
""" """
# pylint: disable=import-error
import logging
from homeassistant.helpers.entity import Entity
from homeassistant.const import (DEVICE_DEFAULT_NAME, import logging
EVENT_HOMEASSISTANT_START, from homeassistant.components.binary_sensor.rpi_gpio import RPiGPIOBinarySensor
EVENT_HOMEASSISTANT_STOP)
DEFAULT_PULL_MODE = "UP" DEFAULT_PULL_MODE = "UP"
DEFAULT_BOUNCETIME = 50
DEFAULT_VALUE_HIGH = "HIGH" DEFAULT_VALUE_HIGH = "HIGH"
DEFAULT_VALUE_LOW = "LOW" DEFAULT_VALUE_LOW = "LOW"
DEFAULT_BOUNCETIME = 50
REQUIREMENTS = ['RPi.GPIO==0.5.11'] DEPENDENCIES = ['rpi_gpio']
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
# pylint: disable=unused-argument # pylint: disable=unused-argument
def setup_platform(hass, config, add_devices, discovery_info=None): def setup_platform(hass, config, add_devices, discovery_info=None):
""" Sets up the Raspberry PI GPIO ports. """ """ Sets up the Raspberry PI GPIO ports. """
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
sensors = []
pull_mode = config.get('pull_mode', DEFAULT_PULL_MODE) pull_mode = config.get('pull_mode', DEFAULT_PULL_MODE)
bouncetime = config.get('bouncetime', DEFAULT_BOUNCETIME)
value_high = config.get('value_high', DEFAULT_VALUE_HIGH) value_high = config.get('value_high', DEFAULT_VALUE_HIGH)
value_low = config.get('value_low', DEFAULT_VALUE_LOW) value_low = config.get('value_low', DEFAULT_VALUE_LOW)
bouncetime = config.get('bouncetime', DEFAULT_BOUNCETIME)
sensors = []
ports = config.get('ports') ports = config.get('ports')
for port_num, port_name in ports.items(): for port, name in ports.items():
sensors.append(RPiGPIOSensor( sensors.append(RPiGPIOSensor(
port_name, port_num, pull_mode, name, port, pull_mode, bouncetime,
value_high, value_low, bouncetime)) value_high, value_low))
add_devices(sensors) add_devices(sensors)
def cleanup_gpio(event):
""" Stuff to do before stop home assistant. """
# pylint: disable=no-member
GPIO.cleanup()
def prepare_gpio(event):
""" Stuff to do when home assistant starts. """
hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, cleanup_gpio)
hass.bus.listen_once(EVENT_HOMEASSISTANT_START, prepare_gpio)
# pylint: disable=too-many-arguments, too-many-instance-attributes # pylint: disable=too-many-arguments, too-many-instance-attributes
class RPiGPIOSensor(Entity): class RPiGPIOSensor(RPiGPIOBinarySensor):
""" Sets up the Raspberry PI GPIO ports. """ """ Sets up the Raspberry PI GPIO ports. """
def __init__(self, port_name, port_num, pull_mode, def __init__(self, name, port, pull_mode, bouncetime,
value_high, value_low, bouncetime): value_high, value_low):
# pylint: disable=no-member
import RPi.GPIO as GPIO
self._name = port_name or DEVICE_DEFAULT_NAME
self._port = port_num
self._pull = GPIO.PUD_DOWN if pull_mode == "DOWN" else GPIO.PUD_UP
self._vhigh = value_high
self._vlow = value_low
self._bouncetime = bouncetime
GPIO.setup(self._port, GPIO.IN, pull_up_down=self._pull)
self._state = self._vhigh if GPIO.input(self._port) else self._vlow
def edge_callback(channel): self._value_high = value_high
""" port changed state """ self._value_low = value_low
# pylint: disable=no-member super().__init__(name, port, pull_mode, bouncetime, False)
self._state = self._vhigh if GPIO.input(channel) else self._vlow
self.update_ha_state()
GPIO.add_event_detect(
self._port,
GPIO.BOTH,
callback=edge_callback,
bouncetime=self._bouncetime)
@property
def should_poll(self):
""" No polling needed. """
return False
@property
def name(self):
""" The name of the sensor. """
return self._name
@property @property
def state(self): def state(self):
""" Returns the state of the entity. """ """ Returns the state of the entity. """
return self._state if self._state != self._invert_logic:
return self._value_high
else:
return self._value_low

View file

@ -7,59 +7,38 @@ For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/switch.rpi_gpio/ https://home-assistant.io/components/switch.rpi_gpio/
""" """
import logging import logging
try: import homeassistant.components.rpi_gpio as rpi_gpio
import RPi.GPIO as GPIO
except ImportError:
GPIO = None
from homeassistant.helpers.entity import ToggleEntity from homeassistant.helpers.entity import ToggleEntity
from homeassistant.const import (DEVICE_DEFAULT_NAME, from homeassistant.const import (DEVICE_DEFAULT_NAME)
EVENT_HOMEASSISTANT_START,
EVENT_HOMEASSISTANT_STOP)
DEFAULT_INVERT_LOGIC = False DEFAULT_INVERT_LOGIC = False
REQUIREMENTS = ['RPi.GPIO==0.5.11'] DEPENDENCIES = ['rpi_gpio']
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
# pylint: disable=unused-argument # pylint: disable=unused-argument
def setup_platform(hass, config, add_devices, discovery_info=None): def setup_platform(hass, config, add_devices, discovery_info=None):
""" Sets up the Raspberry PI GPIO ports. """ """ Sets up the Raspberry PI GPIO ports. """
if GPIO is None:
_LOGGER.error('RPi.GPIO not available. rpi_gpio ports ignored.') invert_logic = config.get('invert_logic', DEFAULT_INVERT_LOGIC)
return
# pylint: disable=no-member
GPIO.setmode(GPIO.BCM)
switches = [] switches = []
invert_logic = config.get('invert_logic', DEFAULT_INVERT_LOGIC)
ports = config.get('ports') ports = config.get('ports')
for port_num, port_name in ports.items(): for port, name in ports.items():
switches.append(RPiGPIOSwitch(port_name, port_num, invert_logic)) switches.append(RPiGPIOSwitch(name, port, invert_logic))
add_devices(switches) add_devices(switches)
def cleanup_gpio(event):
""" Stuff to do before stop home assistant. """
# pylint: disable=no-member
GPIO.cleanup()
def prepare_gpio(event):
""" Stuff to do when home assistant starts. """
hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, cleanup_gpio)
hass.bus.listen_once(EVENT_HOMEASSISTANT_START, prepare_gpio)
class RPiGPIOSwitch(ToggleEntity): class RPiGPIOSwitch(ToggleEntity):
""" Represents a port that can be toggled using Raspberry Pi GPIO. """ """ Represents a port that can be toggled using Raspberry Pi GPIO. """
def __init__(self, name, gpio, invert_logic): def __init__(self, name, port, invert_logic):
self._name = name or DEVICE_DEFAULT_NAME self._name = name or DEVICE_DEFAULT_NAME
self._gpio = gpio self._port = port
self._active_state = not invert_logic self._invert_logic = invert_logic
self._state = not self._active_state self._state = False
# pylint: disable=no-member rpi_gpio.setup_output(self._port)
GPIO.setup(gpio, GPIO.OUT)
@property @property
def name(self): def name(self):
@ -76,41 +55,14 @@ class RPiGPIOSwitch(ToggleEntity):
""" True if device is on. """ """ True if device is on. """
return self._state return self._state
def turn_on(self, **kwargs): def turn_on(self):
""" Turn the device on. """ """ Turn the device on. """
if self._switch(self._active_state): rpi_gpio.write_output(self._port, 0 if self._invert_logic else 1)
self._state = True self._state = True
self.update_ha_state() self.update_ha_state()
def turn_off(self, **kwargs): def turn_off(self):
""" Turn the device off. """ """ Turn the device off. """
if self._switch(not self._active_state): rpi_gpio.write_output(self._port, 1 if self._invert_logic else 0)
self._state = False self._state = False
self.update_ha_state() self.update_ha_state()
def _switch(self, new_state):
""" Change the output value to Raspberry Pi GPIO port. """
_LOGGER.info('Setting GPIO %s to %s', self._gpio, new_state)
# pylint: disable=bare-except
try:
# pylint: disable=no-member
GPIO.output(self._gpio, 1 if new_state else 0)
except:
_LOGGER.error('GPIO "%s" output failed', self._gpio)
return False
return True
# pylint: disable=no-self-use
@property
def device_state_attributes(self):
""" Returns device specific state attributes. """
return None
@property
def state_attributes(self):
""" Returns optional state attributes. """
data = {}
device_attr = self.device_state_attributes
if device_attr is not None:
data.update(device_attr)
return data

View file

@ -146,9 +146,10 @@ https://github.com/HydrelioxGitHub/netatmo-api-python/archive/43ff238a0122b0939a
# homeassistant.components.sensor.openweathermap # homeassistant.components.sensor.openweathermap
pyowm==2.3.0 pyowm==2.3.0
# homeassistant.components.binary_sensor.rpi_gpio
# homeassistant.components.sensor.rpi_gpio # homeassistant.components.sensor.rpi_gpio
# homeassistant.components.switch.rpi_gpio # homeassistant.components.switch.rpi_gpio
# RPi.GPIO==0.5.11 # RPi.GPIO==0.6.1
# homeassistant.components.sensor.sabnzbd # homeassistant.components.sensor.sabnzbd
https://github.com/jamespcole/home-assistant-nzb-clients/archive/616cad59154092599278661af17e2a9f2cf5e2a9.zip#python-sabnzbd==0.1 https://github.com/jamespcole/home-assistant-nzb-clients/archive/616cad59154092599278661af17e2a9f2cf5e2a9.zip#python-sabnzbd==0.1