diff --git a/.coveragerc b/.coveragerc index 0b4306633e90f78c428301a2dfaf83b56159c7ba..9ec3d70699075161ca79cee7e8d9832da7484102 100644 --- a/.coveragerc +++ b/.coveragerc @@ -477,6 +477,7 @@ omit = homeassistant/components/sensor/xbox_live.py homeassistant/components/sensor/yweather.py homeassistant/components/sensor/zamg.py + homeassistant/components/shiftr.py homeassistant/components/spc.py homeassistant/components/switch/acer_projector.py homeassistant/components/switch/anel_pwrctrl.py diff --git a/homeassistant/components/shiftr.py b/homeassistant/components/shiftr.py new file mode 100644 index 0000000000000000000000000000000000000000..42c455acd49300ca1e577c89e17a4cb984e28fd6 --- /dev/null +++ b/homeassistant/components/shiftr.py @@ -0,0 +1,77 @@ +""" +Support for Shiftr.io. + +For more details about this component, please refer to the documentation at +https://home-assistant.io/components/shiftr/ +""" +import logging + +import voluptuous as vol + +import homeassistant.helpers.config_validation as cv +from homeassistant.const import ( + CONF_PASSWORD, CONF_USERNAME, EVENT_STATE_CHANGED, + EVENT_HOMEASSISTANT_STOP) +from homeassistant.helpers import state as state_helper + +REQUIREMENTS = ['paho-mqtt==1.2.3'] + +_LOGGER = logging.getLogger(__name__) + +DOMAIN = 'shiftr' + +SHIFTR_BROKER = 'broker.shiftr.io' + +CONFIG_SCHEMA = vol.Schema({ + DOMAIN: vol.Schema({ + vol.Required(CONF_USERNAME): cv.string, + vol.Required(CONF_PASSWORD): cv.string, + }), +}, extra=vol.ALLOW_EXTRA) + + +def setup(hass, config): + """Initialize the Shiftr.io MQTT consumer.""" + import paho.mqtt.client as mqtt + conf = config[DOMAIN] + username = conf.get(CONF_USERNAME) + password = conf.get(CONF_PASSWORD) + + client_id = 'HomeAssistant' + port = 1883 + keepalive = 600 + + mqttc = mqtt.Client(client_id, protocol=mqtt.MQTTv311) + mqttc.username_pw_set(username, password=password) + mqttc.connect(SHIFTR_BROKER, port=port, keepalive=keepalive) + + def stop_shiftr(event): + """Stop the Shiftr.io MQTT component.""" + mqttc.disconnect() + + hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, stop_shiftr) + + def shiftr_event_listener(event): + """Listen for new messages on the bus and sends them to Shiftr.io.""" + state = event.data.get('new_state') + topic = state.entity_id.replace('.', '/') + + try: + _state = state_helper.state_as_number(state) + except ValueError: + _state = state.state + + try: + mqttc.publish(topic, _state, qos=0, retain=False) + + if state.attributes: + for attribute, data in state.attributes.items(): + mqttc.publish( + '/{}/{}'.format(topic, attribute), str(data), qos=0, + retain=False) + except RuntimeError: + pass + + hass.bus.listen(EVENT_STATE_CHANGED, shiftr_event_listener) + + return True diff --git a/requirements_all.txt b/requirements_all.txt index 2aeb6f1d42fc005b4099a2599ea4c736ddea794e..77719422c0ba10268877467b0ed80d5086b3321b 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -419,6 +419,7 @@ openhomedevice==0.4.2 orvibo==1.1.1 # homeassistant.components.mqtt +# homeassistant.components.shiftr paho-mqtt==1.2.3 # homeassistant.components.media_player.panasonic_viera diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 49b6f2ae2f5d37c76432f75dae4064d4593d5f96..d1b226eda3eeada0e249d036e0f6206dd1c983ec 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -72,6 +72,7 @@ libsoundtouch==0.3.0 mficlient==0.3.0 # homeassistant.components.mqtt +# homeassistant.components.shiftr paho-mqtt==1.2.3 # homeassistant.components.device_tracker.aruba