From eb473600f60735897020a7fada732b4738b9ef3d Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 17 May 2017 23:03:27 -0700 Subject: [PATCH 1/8] Version bump to 0.45 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index 5b2367db718..65a8eb070c6 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -2,7 +2,7 @@ """Constants used by Home Assistant components.""" MAJOR_VERSION = 0 MINOR_VERSION = 45 -PATCH_VERSION = '0.dev0' +PATCH_VERSION = '0' __short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION) __version__ = '{}.{}'.format(__short_version__, PATCH_VERSION) REQUIRED_PYTHON_VER = (3, 4, 2) From 6662b7f52d5705f401f62efbfeba17d4c7a7f259 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 18 May 2017 17:40:49 -0700 Subject: [PATCH 2/8] Update frontend --- homeassistant/components/frontend/version.py | 2 +- .../www_static/home-assistant-polymer | 2 +- .../www_static/panels/ha-panel-zwave.html | 648 +++++++++++++++++- .../www_static/panels/ha-panel-zwave.html.gz | Bin 6135 -> 12987 bytes 4 files changed, 649 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/frontend/version.py b/homeassistant/components/frontend/version.py index e0fd270b81b..d232f027f84 100644 --- a/homeassistant/components/frontend/version.py +++ b/homeassistant/components/frontend/version.py @@ -18,6 +18,6 @@ FINGERPRINTS = { "panels/ha-panel-iframe.html": "d920f0aa3c903680f2f8795e2255daab", "panels/ha-panel-logbook.html": "6dd6a16f52117318b202e60f98400163", "panels/ha-panel-map.html": "31c592c239636f91e07c7ac232a5ebc4", - "panels/ha-panel-zwave.html": "84fb45638d2a69bac343246a687f647c", + "panels/ha-panel-zwave.html": "19336d2c50c91dd6a122acc0606ff10d", "websocket_test.html": "575de64b431fe11c3785bf96d7813450" } diff --git a/homeassistant/components/frontend/www_static/home-assistant-polymer b/homeassistant/components/frontend/www_static/home-assistant-polymer index ffe0b22d772..ad3b3ce3dce 160000 --- a/homeassistant/components/frontend/www_static/home-assistant-polymer +++ b/homeassistant/components/frontend/www_static/home-assistant-polymer @@ -1 +1 @@ -Subproject commit ffe0b22d772c619efabc43ae56d94e1564f9f6e6 +Subproject commit ad3b3ce3dce3811cdc06e87585914c60c91e02af diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-zwave.html b/homeassistant/components/frontend/www_static/panels/ha-panel-zwave.html index 6af056b0db4..70e5cc64177 100644 --- a/homeassistant/components/frontend/www_static/panels/ha-panel-zwave.html +++ b/homeassistant/components/frontend/www_static/panels/ha-panel-zwave.html @@ -1 +1,647 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-zwave.html.gz b/homeassistant/components/frontend/www_static/panels/ha-panel-zwave.html.gz index fec3a4f832bf9f5816f13564203a6ced55ac4e5e..86b8d15fd5d715f1bab8e0b4dcf6fcfed41408f4 100644 GIT binary patch literal 12987 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 literal 6135 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 J;dTdI001U%0Sy2E From 4a3d9a956d7f778c40e461be30b137c77df4c6cc Mon Sep 17 00:00:00 2001 From: John Arild Berentsen Date: Fri, 19 May 2017 02:39:31 +0200 Subject: [PATCH 3/8] Final tweaks for Zwave panel (#7652) * # This is a combination of 3 commits. # The first commit's message is: Add seperate zwave panel # The 2nd commit message will be skipped: # unused import # The 3rd commit message will be skipped: # Use get for config * Add seperate zwave panel * Modify set_config_parameter to accept setting string values * descriptions * Tweaks * Tweaks * Tweaks * Tweaks * lint * Fallback if no config parameteres are available * Update services.yaml * review changes --- homeassistant/components/zwave/__init__.py | 40 ++++++++++---------- homeassistant/components/zwave/services.yaml | 4 +- tests/components/zwave/test_init.py | 33 +++++++--------- 3 files changed, 36 insertions(+), 41 deletions(-) diff --git a/homeassistant/components/zwave/__init__.py b/homeassistant/components/zwave/__init__.py index c49983b3178..30867706a30 100755 --- a/homeassistant/components/zwave/__init__.py +++ b/homeassistant/components/zwave/__init__.py @@ -78,8 +78,8 @@ RENAME_NODE_SCHEMA = vol.Schema({ SET_CONFIG_PARAMETER_SCHEMA = vol.Schema({ vol.Required(const.ATTR_NODE_ID): vol.Coerce(int), vol.Required(const.ATTR_CONFIG_PARAMETER): vol.Coerce(int), - vol.Required(const.ATTR_CONFIG_VALUE): vol.Coerce(int), - vol.Optional(const.ATTR_CONFIG_SIZE): vol.Coerce(int) + vol.Required(const.ATTR_CONFIG_VALUE): vol.Any(vol.Coerce(int), cv.string), + vol.Optional(const.ATTR_CONFIG_SIZE, default=2): vol.Coerce(int) }) PRINT_CONFIG_PARAMETER_SCHEMA = vol.Schema({ vol.Required(const.ATTR_NODE_ID): vol.Coerce(int), @@ -410,28 +410,28 @@ def setup(hass, config): node = network.nodes[node_id] param = service.data.get(const.ATTR_CONFIG_PARAMETER) selection = service.data.get(const.ATTR_CONFIG_VALUE) - size = service.data.get(const.ATTR_CONFIG_SIZE, 2) - i = 0 + size = service.data.get(const.ATTR_CONFIG_SIZE) for value in ( node.get_values(class_id=const.COMMAND_CLASS_CONFIGURATION) .values()): - if value.index == param and value.type == const.TYPE_LIST: - _LOGGER.debug("Values for parameter %s: %s", param, - value.data_items) - i = len(value.data_items) - 1 - if i == 0: - node.set_config_param(param, selection, size) - else: - if selection > i: - _LOGGER.error("Config parameter selection does not exist! " - "Please check zwcfg_[home_id].xml in " - "your homeassistant config directory. " - "Available selections are 0 to %s", i) + if value.index != param: + continue + if value.type in [const.TYPE_LIST, const.TYPE_BOOL]: + value.data = selection + _LOGGER.info("Setting config list parameter %s on Node %s " + "with selection %s", param, node_id, + selection) return - node.set_config_param(param, selection, size) - _LOGGER.info("Setting config parameter %s on Node %s " - "with selection %s and size=%s", param, node_id, - selection, size) + else: + value.data = int(selection) + _LOGGER.info("Setting config parameter %s on Node %s " + "with selection %s", param, node_id, + selection) + return + node.set_config_param(param, selection, size) + _LOGGER.info("Setting unknown config parameter %s on Node %s " + "with selection %s", param, node_id, + selection) def print_config_parameter(service): """Print a config parameter from a node.""" diff --git a/homeassistant/components/zwave/services.yaml b/homeassistant/components/zwave/services.yaml index 166bd4e6f81..feacf8229aa 100644 --- a/homeassistant/components/zwave/services.yaml +++ b/homeassistant/components/zwave/services.yaml @@ -47,9 +47,9 @@ set_config_parameter: parameter: description: Parameter number to set (integer). value: - description: Value to set on parameter. (integer). + description: Value to set for parameter. (String value for list and bool parameters, integer for others). size: - description: (Optional) The size of the value. Defaults to 2. + description: (Optional) Set the size of the parameter value. Only needed if no parameters are available. print_config_parameter: description: Prints a Z-Wave node config parameter value to log. diff --git a/tests/components/zwave/test_init.py b/tests/components/zwave/test_init.py index 57fd31be28f..17fac86c748 100644 --- a/tests/components/zwave/test_init.py +++ b/tests/components/zwave/test_init.py @@ -897,6 +897,7 @@ class TestZWaveServices(unittest.TestCase): value = MockValue( index=12, command_class=const.COMMAND_CLASS_CONFIGURATION, + type=const.TYPE_BYTE, ) value_list = MockValue( index=13, @@ -911,38 +912,32 @@ class TestZWaveServices(unittest.TestCase): self.hass.services.call('zwave', 'set_config_parameter', { const.ATTR_NODE_ID: 14, const.ATTR_CONFIG_PARAMETER: 13, - const.ATTR_CONFIG_VALUE: 1, + const.ATTR_CONFIG_VALUE: 'item3', }) self.hass.block_till_done() - assert node.set_config_param.called - assert len(node.set_config_param.mock_calls) == 1 - assert node.set_config_param.mock_calls[0][1][0] == 13 - assert node.set_config_param.mock_calls[0][1][1] == 1 - assert node.set_config_param.mock_calls[0][1][2] == 2 - node.set_config_param.reset_mock() - - self.hass.services.call('zwave', 'set_config_parameter', { - const.ATTR_NODE_ID: 14, - const.ATTR_CONFIG_PARAMETER: 13, - const.ATTR_CONFIG_VALUE: 7, - }) - self.hass.block_till_done() - - assert not node.set_config_param.called - node.set_config_param.reset_mock() + assert value_list.data == 'item3' self.hass.services.call('zwave', 'set_config_parameter', { const.ATTR_NODE_ID: 14, const.ATTR_CONFIG_PARAMETER: 12, + const.ATTR_CONFIG_VALUE: 7, + }) + self.hass.block_till_done() + + assert value.data == 7 + + self.hass.services.call('zwave', 'set_config_parameter', { + const.ATTR_NODE_ID: 14, + const.ATTR_CONFIG_PARAMETER: 19, const.ATTR_CONFIG_VALUE: 0x01020304, - const.ATTR_CONFIG_SIZE: 4, + const.ATTR_CONFIG_SIZE: 4 }) self.hass.block_till_done() assert node.set_config_param.called assert len(node.set_config_param.mock_calls) == 1 - assert node.set_config_param.mock_calls[0][1][0] == 12 + assert node.set_config_param.mock_calls[0][1][0] == 19 assert node.set_config_param.mock_calls[0][1][1] == 0x01020304 assert node.set_config_param.mock_calls[0][1][2] == 4 node.set_config_param.reset_mock() From c4da921cb53b3d47e6256d671f8c80aecaead834 Mon Sep 17 00:00:00 2001 From: Robbie Trencheny Date: Thu, 18 May 2017 23:49:15 -0700 Subject: [PATCH 4/8] Add network_key as a config option (#7637) * Add network_key as a config option * Update __init__.py --- homeassistant/components/zwave/__init__.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/homeassistant/components/zwave/__init__.py b/homeassistant/components/zwave/__init__.py index 30867706a30..79067c0d2ef 100755 --- a/homeassistant/components/zwave/__init__.py +++ b/homeassistant/components/zwave/__init__.py @@ -54,6 +54,7 @@ CONF_REFRESH_DELAY = 'delay' CONF_DEVICE_CONFIG = 'device_config' CONF_DEVICE_CONFIG_GLOB = 'device_config_glob' CONF_DEVICE_CONFIG_DOMAIN = 'device_config_domain' +CONF_NETWORK_KEY = 'network_key' ATTR_POWER = 'power_consumption' @@ -125,6 +126,7 @@ CONFIG_SCHEMA = vol.Schema({ DOMAIN: vol.Schema({ vol.Optional(CONF_AUTOHEAL, default=DEFAULT_CONF_AUTOHEAL): cv.boolean, vol.Optional(CONF_CONFIG_PATH): cv.string, + vol.Optional(CONF_NETWORK_KEY): cv.string, vol.Optional(CONF_DEVICE_CONFIG, default={}): vol.Schema({cv.entity_id: DEVICE_CONFIG_SCHEMA_ENTRY}), vol.Optional(CONF_DEVICE_CONFIG_GLOB, default={}): @@ -245,6 +247,10 @@ def setup(hass, config): config_path=config[DOMAIN].get(CONF_CONFIG_PATH)) options.set_console_output(use_debug) + + if CONF_NETWORK_KEY in config[DOMAIN]: + options.addOption("NetworkKey", config[DOMAIN][CONF_NETWORK_KEY]) + options.lock() network = hass.data[ZWAVE_NETWORK] = ZWaveNetwork(options, autostart=False) From de85d38aa56ce3d4988f3bb0a65d2c581a8b08db Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 20 May 2017 08:07:32 -0700 Subject: [PATCH 5/8] Update frontend --- homeassistant/components/frontend/version.py | 2 +- .../www_static/home-assistant-polymer | 2 +- .../panels/ha-panel-automation.html | 2 +- .../panels/ha-panel-automation.html.gz | Bin 43960 -> 44908 bytes 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/frontend/version.py b/homeassistant/components/frontend/version.py index d232f027f84..f4af26cc376 100644 --- a/homeassistant/components/frontend/version.py +++ b/homeassistant/components/frontend/version.py @@ -6,7 +6,7 @@ FINGERPRINTS = { "frontend.html": "fbb9d6bdd3d661db26cad9475a5e22f1", "mdi.html": "f407a5a57addbe93817ee1b244d33fbe", "micromarkdown-js.html": "93b5ec4016f0bba585521cf4d18dec1a", - "panels/ha-panel-automation.html": "f9a6727e2354224577298fc0f2dadc2e", + "panels/ha-panel-automation.html": "21cba0a4fee9d2b45dda47f7a1dd82d8", "panels/ha-panel-config.html": "59d9eb28758b497a4d9b2428f978b9b1", "panels/ha-panel-dev-event.html": "2db9c218065ef0f61d8d08db8093cad2", "panels/ha-panel-dev-info.html": "61610e015a411cfc84edd2c4d489e71d", diff --git a/homeassistant/components/frontend/www_static/home-assistant-polymer b/homeassistant/components/frontend/www_static/home-assistant-polymer index ad3b3ce3dce..6858555c86f 160000 --- a/homeassistant/components/frontend/www_static/home-assistant-polymer +++ b/homeassistant/components/frontend/www_static/home-assistant-polymer @@ -1 +1 @@ -Subproject commit ad3b3ce3dce3811cdc06e87585914c60c91e02af +Subproject commit 6858555c86f18eb0ab176008e9aa2c3842fec7ce diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-automation.html b/homeassistant/components/frontend/www_static/panels/ha-panel-automation.html index 6453b12b24d..453d631c1da 100644 --- a/homeassistant/components/frontend/www_static/panels/ha-panel-automation.html +++ b/homeassistant/components/frontend/www_static/panels/ha-panel-automation.html @@ -1,2 +1,2 @@ \ No newline at end of file +return performance.now()};else var t=function(){return Date.now()};var e=function(t,e,i){this.target=t,this.currentTime=e,this.timelineTime=i,this.type="cancel",this.bubbles=!1,this.cancelable=!1,this.currentTarget=t,this.defaultPrevented=!1,this.eventPhase=Event.AT_TARGET,this.timeStamp=Date.now()},i=window.Element.prototype.animate;window.Element.prototype.animate=function(n,r){var o=i.call(this,n,r);o._cancelHandlers=[],o.oncancel=null;var a=o.cancel;o.cancel=function(){a.call(this);var i=new e(this,null,t()),n=this._cancelHandlers.concat(this.oncancel?[this.oncancel]:[]);setTimeout(function(){n.forEach(function(t){t.call(i.target,i)})},0)};var s=o.addEventListener;o.addEventListener=function(t,e){"function"==typeof e&&"cancel"==t?this._cancelHandlers.push(e):s.call(this,t,e)};var u=o.removeEventListener;return o.removeEventListener=function(t,e){if("cancel"==t){var i=this._cancelHandlers.indexOf(e);i>=0&&this._cancelHandlers.splice(i,1)}else u.call(this,t,e)},o}}}(),function(t){var e=document.documentElement,i=null,n=!1;try{var r=getComputedStyle(e).getPropertyValue("opacity"),o="0"==r?"1":"0";i=e.animate({opacity:[o,o]},{duration:1}),i.currentTime=0,n=getComputedStyle(e).getPropertyValue("opacity")==o}catch(t){}finally{i&&i.cancel()}if(!n){var a=window.Element.prototype.animate;window.Element.prototype.animate=function(e,i){return window.Symbol&&Symbol.iterator&&Array.prototype.from&&e[Symbol.iterator]&&(e=Array.from(e)),Array.isArray(e)||null===e||(e=t.convertToArrayForm(e)),a.call(this,e,i)}}}(c),function(t,e,i){function n(t){var i=e.timeline;i.currentTime=t,i._discardAnimations(),0==i._animations.length?o=!1:requestAnimationFrame(n)}var r=window.requestAnimationFrame;window.requestAnimationFrame=function(t){return r(function(i){e.timeline._updateAnimationsPromises(),t(i),e.timeline._updateAnimationsPromises()})},e.AnimationTimeline=function(){this._animations=[],this.currentTime=void 0},e.AnimationTimeline.prototype={getAnimations:function(){return this._discardAnimations(),this._animations.slice()},_updateAnimationsPromises:function(){e.animationsWithPromises=e.animationsWithPromises.filter(function(t){return t._updatePromises()})},_discardAnimations:function(){this._updateAnimationsPromises(),this._animations=this._animations.filter(function(t){return"finished"!=t.playState&&"idle"!=t.playState})},_play:function(t){var i=new e.Animation(t,this);return this._animations.push(i),e.restartWebAnimationsNextTick(),i._updatePromises(),i._animation.play(),i._updatePromises(),i},play:function(t){return t&&t.remove(),this._play(t)}};var o=!1;e.restartWebAnimationsNextTick=function(){o||(o=!0,requestAnimationFrame(n))};var a=new e.AnimationTimeline;e.timeline=a;try{Object.defineProperty(window.document,"timeline",{configurable:!0,get:function(){return a}})}catch(t){}try{window.document.timeline=a}catch(t){}}(0,e),function(t,e,i){e.animationsWithPromises=[],e.Animation=function(e,i){if(this.id="",e&&e._id&&(this.id=e._id),this.effect=e,e&&(e._animation=this),!i)throw new Error("Animation with null timeline is not supported");this._timeline=i,this._sequenceNumber=t.sequenceNumber++,this._holdTime=0,this._paused=!1,this._isGroup=!1,this._animation=null,this._childAnimations=[],this._callback=null,this._oldPlayState="idle",this._rebuildUnderlyingAnimation(),this._animation.cancel(),this._updatePromises()},e.Animation.prototype={_updatePromises:function(){var t=this._oldPlayState,e=this.playState;return this._readyPromise&&e!==t&&("idle"==e?(this._rejectReadyPromise(),this._readyPromise=void 0):"pending"==t?this._resolveReadyPromise():"pending"==e&&(this._readyPromise=void 0)),this._finishedPromise&&e!==t&&("idle"==e?(this._rejectFinishedPromise(),this._finishedPromise=void 0):"finished"==e?this._resolveFinishedPromise():"finished"==t&&(this._finishedPromise=void 0)),this._oldPlayState=this.playState,this._readyPromise||this._finishedPromise},_rebuildUnderlyingAnimation:function(){this._updatePromises();var t,i,n,r,o=!!this._animation;o&&(t=this.playbackRate,i=this._paused,n=this.startTime,r=this.currentTime,this._animation.cancel(),this._animation._wrapper=null,this._animation=null),(!this.effect||this.effect instanceof window.KeyframeEffect)&&(this._animation=e.newUnderlyingAnimationForKeyframeEffect(this.effect),e.bindAnimationForKeyframeEffect(this)),(this.effect instanceof window.SequenceEffect||this.effect instanceof window.GroupEffect)&&(this._animation=e.newUnderlyingAnimationForGroup(this.effect),e.bindAnimationForGroup(this)),this.effect&&this.effect._onsample&&e.bindAnimationForCustomEffect(this),o&&(1!=t&&(this.playbackRate=t),null!==n?this.startTime=n:null!==r?this.currentTime=r:null!==this._holdTime&&(this.currentTime=this._holdTime),i&&this.pause()),this._updatePromises()},_updateChildren:function(){if(this.effect&&"idle"!=this.playState){var t=this.effect._timing.delay;this._childAnimations.forEach(function(i){this._arrangeChildren(i,t),this.effect instanceof window.SequenceEffect&&(t+=e.groupChildDuration(i.effect))}.bind(this))}},_setExternalAnimation:function(t){if(this.effect&&this._isGroup)for(var e=0;e \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-automation.html.gz b/homeassistant/components/frontend/www_static/panels/ha-panel-automation.html.gz index 20c4710b2c45b2ede9866a3a0cf05e77ca80dea5..f3137a76bca5cdfdd68d1572b03e766f701a20cf 100644 GIT binary patch delta 17064 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 delta 16106 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 From 45b4ef46ccd0a59ad4ee02a8478f52538c1c749e Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Thu, 18 May 2017 09:57:38 +0200 Subject: [PATCH 6/8] Align with OpenALPR platform for naming conf variables (#7650) --- homeassistant/components/image_processing/seven_segments.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/image_processing/seven_segments.py b/homeassistant/components/image_processing/seven_segments.py index 07b9b9d5d80..9b9c327f822 100644 --- a/homeassistant/components/image_processing/seven_segments.py +++ b/homeassistant/components/image_processing/seven_segments.py @@ -21,7 +21,7 @@ _LOGGER = logging.getLogger(__name__) CONF_DIGITS = 'digits' CONF_HEIGHT = 'height' -CONF_SSOCR_BIN = 'ssocr' +CONF_SSOCR_BIN = 'ssocr_bin' CONF_THRESHOLD = 'threshold' CONF_WIDTH = 'width' CONF_X_POS = 'x_position' From 23c5fc0aad84b3aaf32074585e949e8f09d262b4 Mon Sep 17 00:00:00 2001 From: John Arild Berentsen Date: Fri, 19 May 2017 13:40:26 +0200 Subject: [PATCH 7/8] Bugfix #7586 (#7661) --- homeassistant/components/lock/zwave.py | 5 +++-- tests/components/lock/test_zwave.py | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/lock/zwave.py b/homeassistant/components/lock/zwave.py index a46406e8361..7654d354a31 100644 --- a/homeassistant/components/lock/zwave.py +++ b/homeassistant/components/lock/zwave.py @@ -141,9 +141,10 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): class_id=zwave.const.COMMAND_CLASS_USER_CODE).values(): if value.index != code_slot: continue - if len(str(usercode)) > 4: + if len(str(usercode)) < 4: _LOGGER.error("Invalid code provided: (%s) " - "usercode must %s or less digits", + "usercode must be atleast 4 and at most" + " %s digits", usercode, len(value.data)) break value.data = str(usercode) diff --git a/tests/components/lock/test_zwave.py b/tests/components/lock/test_zwave.py index 9fb634f49e2..b0e9456b8a8 100644 --- a/tests/components/lock/test_zwave.py +++ b/tests/components/lock/test_zwave.py @@ -173,8 +173,8 @@ def test_lock_set_usercode_service(hass, mock_openzwave): """Test the zwave lock set_usercode service.""" mock_network = hass.data[zwave.zwave.ZWAVE_NETWORK] = MagicMock() node = MockNode(node_id=12) - value0 = MockValue(data=None, node=node, index=0) - value1 = MockValue(data=None, node=node, index=1) + value0 = MockValue(data=' ', node=node, index=0) + value1 = MockValue(data=' ', node=node, index=1) yield from zwave.async_setup_platform( hass, {}, MagicMock()) @@ -202,7 +202,7 @@ def test_lock_set_usercode_service(hass, mock_openzwave): yield from hass.services.async_call( zwave.DOMAIN, zwave.SERVICE_SET_USERCODE, { const.ATTR_NODE_ID: node.node_id, - zwave.ATTR_USERCODE: '12345', + zwave.ATTR_USERCODE: '123', zwave.ATTR_CODE_SLOT: 1, }) yield from hass.async_block_till_done() From 943958b140718bdc2ecf3762bde396333558dfad Mon Sep 17 00:00:00 2001 From: Marcelo Moreira de Mello Date: Thu, 18 May 2017 04:06:24 -0400 Subject: [PATCH 8/8] Added support to Amcrest camera to feed using RTSP via ffmpeg (#7646) * Implemented ffmpeg option on Amcrest camera and upgraded to version 1.2.0 * Added ffmpeg arguments and binary options to Amcrest camera * Added ffmpeg as dependencies * Makes lint happy and fixed requirements_all.txt * Inherent the ffmpeg.binary configuration from ffmpeg component * Update amcrest.py --- homeassistant/components/camera/amcrest.py | 42 ++++++++++++++++------ homeassistant/components/sensor/amcrest.py | 2 +- requirements_all.txt | 2 +- 3 files changed, 33 insertions(+), 13 deletions(-) diff --git a/homeassistant/components/camera/amcrest.py b/homeassistant/components/camera/amcrest.py index 72d3120c77a..8f8b7e5f9f5 100644 --- a/homeassistant/components/camera/amcrest.py +++ b/homeassistant/components/camera/amcrest.py @@ -12,18 +12,22 @@ import voluptuous as vol import homeassistant.loader as loader from homeassistant.components.camera import (Camera, PLATFORM_SCHEMA) +from homeassistant.components.ffmpeg import DATA_FFMPEG from homeassistant.const import ( CONF_HOST, CONF_NAME, CONF_USERNAME, CONF_PASSWORD, CONF_PORT) from homeassistant.helpers import config_validation as cv from homeassistant.helpers.aiohttp_client import ( - async_get_clientsession, async_aiohttp_proxy_web) + async_get_clientsession, async_aiohttp_proxy_web, + async_aiohttp_proxy_stream) -REQUIREMENTS = ['amcrest==1.1.9'] +REQUIREMENTS = ['amcrest==1.2.0'] +DEPENDENCIES = ['ffmpeg'] _LOGGER = logging.getLogger(__name__) CONF_RESOLUTION = 'resolution' CONF_STREAM_SOURCE = 'stream_source' +CONF_FFMPEG_ARGUMENTS = 'ffmpeg_arguments' DEFAULT_NAME = 'Amcrest Camera' DEFAULT_PORT = 80 @@ -40,7 +44,8 @@ RESOLUTION_LIST = { STREAM_SOURCE_LIST = { 'mjpeg': 0, - 'snapshot': 1 + 'snapshot': 1, + 'rtsp': 2, } CONTENT_TYPE_HEADER = 'Content-Type' @@ -56,6 +61,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, vol.Optional(CONF_STREAM_SOURCE, default=DEFAULT_STREAM_SOURCE): vol.All(vol.In(STREAM_SOURCE_LIST)), + vol.Optional(CONF_FFMPEG_ARGUMENTS): cv.string, }) @@ -92,8 +98,9 @@ class AmcrestCam(Camera): super(AmcrestCam, self).__init__() self._camera = camera self._base_url = self._camera.get_base_url() - self._hass = hass self._name = device_info.get(CONF_NAME) + self._ffmpeg = hass.data[DATA_FFMPEG] + self._ffmpeg_arguments = device_info.get(CONF_FFMPEG_ARGUMENTS) self._resolution = RESOLUTION_LIST[device_info.get(CONF_RESOLUTION)] self._stream_source = STREAM_SOURCE_LIST[ device_info.get(CONF_STREAM_SOURCE) @@ -117,15 +124,28 @@ class AmcrestCam(Camera): yield from super().handle_async_mjpeg_stream(request) return - # Otherwise, stream an MJPEG image stream directly from the camera - websession = async_get_clientsession(self.hass) - streaming_url = '{0}mjpg/video.cgi?channel=0&subtype={1}'.format( - self._base_url, self._resolution) + elif self._stream_source == STREAM_SOURCE_LIST['mjpeg']: + # stream an MJPEG image stream directly from the camera + websession = async_get_clientsession(self.hass) + streaming_url = self._camera.mjpeg_url(typeno=self._resolution) + stream_coro = websession.get( + streaming_url, auth=self._token, timeout=TIMEOUT) - stream_coro = websession.get( - streaming_url, auth=self._token, timeout=TIMEOUT) + yield from async_aiohttp_proxy_web(self.hass, request, stream_coro) - yield from async_aiohttp_proxy_web(self.hass, request, stream_coro) + else: + # streaming via fmpeg + from haffmpeg import CameraMjpeg + + streaming_url = self._camera.rtsp_url(typeno=self._resolution) + stream = CameraMjpeg(self._ffmpeg.binary, loop=self.hass.loop) + yield from stream.open_camera( + streaming_url, extra_cmd=self._ffmpeg_arguments) + + yield from async_aiohttp_proxy_stream( + self.hass, request, stream, + 'multipart/x-mixed-replace;boundary=ffserver') + yield from stream.close() @property def name(self): diff --git a/homeassistant/components/sensor/amcrest.py b/homeassistant/components/sensor/amcrest.py index 40556fbe5ad..23f7fc4dfbe 100644 --- a/homeassistant/components/sensor/amcrest.py +++ b/homeassistant/components/sensor/amcrest.py @@ -19,7 +19,7 @@ import homeassistant.loader as loader from requests.exceptions import HTTPError, ConnectTimeout -REQUIREMENTS = ['amcrest==1.1.9'] +REQUIREMENTS = ['amcrest==1.2.0'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index a859a526305..c8f8c5aafd9 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -56,7 +56,7 @@ alarmdecoder==0.12.1.0 # homeassistant.components.camera.amcrest # homeassistant.components.sensor.amcrest -amcrest==1.1.9 +amcrest==1.2.0 # homeassistant.components.media_player.anthemav anthemav==1.1.8