Пример #1
0
    def test_login(self):
        """Test login method."""
        mock_vesync = mock.Mock()
        mock_vesync.login.return_value = True
        self.assertTrue(mock_vesync.login())
        mock_vesync.login.return_value = False
        self.assertFalse(mock_vesync.login())

        with patch('pyvesync_v2.helpers.Helpers.call_api') as mocked_post:
            d = {
                "result": {
                    "accountID": "12346536",
                    "userType": "1",
                    "token": "somevaluehere"
                },
                "code": 0
            }
            mocked_post.return_value = (d, 200)

            data = self.vesync_1.login()
            body = Helpers.req_body(self.vesync_1, 'login')
            body['email'] = self.vesync_1.username
            body['password'] = Helpers.hash_password(self.vesync_1.password)
            mocked_post.assert_called_with('/cloud/v1/user/login',
                                           'post',
                                           json=body)
            self.assertTrue(data)
Пример #2
0
    def set_brightness(self, brightness: int):
        """Set brightness of dimmable bulb."""
        if self.dimmable_feature:
            if brightness > 0 and brightness <= 100:
                body = helpers.req_body(self.manager, 'devicestatus')
                body['uuid'] = self.uuid
                body['status'] = 'on'
                body['brightNess'] = str(brightness)
                r, _ = helpers.call_api(
                    '/SmartBulb/v1/device/updateBrightness',
                    'put',
                    headers=helpers.req_headers(self.manager),
                    json=body)

                if helpers.check_response(r, 'bulb_toggle'):
                    self._brightness = brightness
                    return True
                else:
                    logger.debug('Error setting brightness for {}'.format(
                        self.device_name))
                    return False
            else:
                logger.warning('Invalid brightness')
                return False
        else:
            logger.debug('%s is not dimmable', self.device_name)
Пример #3
0
    def set_brightness(self, brightness: int) -> bool:
        """Set brightness of tunable bulb."""
        if not self.dimmable_feature:
            logger.debug('%s is not dimmable', self.device_name)
            return False
        if brightness <= 0 or brightness > 100:
            logger.debug('Invalid brightness')
            return False

        body = helpers.req_body(self.manager, 'bypass')
        body['cid'] = self.cid
        body['configModule'] = self.config_module
        if self.device_status == 'off':
            light_dict = {'action': 'on', 'brightness': brightness}
        else:
            light_dict = {'brightness': brightness}
        body['jsonCmd'] = {'light': light_dict}
        r, _ = helpers.call_api('/cloud/v1/deviceManaged/bypass',
                                'post',
                                headers=helpers.req_headers(self.manager),
                                json=body)

        if helpers.code_check(r):
            self._brightness = brightness
            return True
        else:
            self.device_status = 'off'
            self.connection_status = 'offline'
            logger.debug('%s offline', self.device_name)

        logger.debug('Error setting brightness for %s', self.device_name)
        return False
Пример #4
0
 def get_details(self):
     """Get details of tunable bulb."""
     body = helpers.req_body(self.manager, 'bypass')
     body['cid'] = self.cid
     body['jsonCmd'] = {'getLightStatus': 'get'}
     body['configModule'] = self.config_module
     r, _ = helpers.call_api('/cloud/v1/deviceManaged/bypass',
                             'post',
                             headers=helpers.req_headers(self.manager),
                             json=body)
     if r.get('code') == 0 and r.get('result').get('light') is not None:
         light = r.get('result').get('light')
         self.connection_status = 'online'
         self.device_status = light.get('action', 'off')
         if self.dimmable_feature:
             self._brightness = light.get('brightness')
         if self.color_temp_feature:
             self._color_temp = light.get('colorTempe')
     elif r.get('code') == -11300027:
         logger.debug('%s device offline', self.device_name)
         self.connection_status = 'offline'
         self.device_status = 'off'
     else:
         logger.warning('%s - Unknown return code - %d with message %s',
                        self.device_name, r.get('code'), r.get('msg'))
Пример #5
0
    def get_devices(self) -> tuple:
        """Return tuple listing outlets, switches, and fans of devices."""
        outlets = []
        switches = []
        fans = []
        bulbs = []
        if not self.enabled:
            return None

        self.in_process = True

        response, _ = helpers.call_api('/cloud/v1/deviceManaged/devices',
                                       'post',
                                       headers=helpers.req_headers(self),
                                       json=helpers.req_body(
                                           self, 'devicelist'))

        if response and helpers.code_check(response):
            if 'result' in response and 'list' in response['result']:
                device_list = response['result']['list']
                outlets, switches, fans, bulbs = self.process_devices(
                    device_list)
            else:
                logger.error('Device list in response not found')
        else:
            logger.warning('Error retrieving device list')

        self.in_process = False

        return (outlets, switches, fans, bulbs)
Пример #6
0
    def set_brightness(self, brightness: int):
        """Set brightness of dimmable bulb."""
        if not self.dimmable_feature:
            logger.debug('%s is not dimmable', self.device_name)
            return False
        if isinstance(brightness, int) and (brightness <= 0
                                            or brightness > 100):
            logger.warning('Invalid brightness')
            return False

        body = helpers.req_body(self.manager, 'devicestatus')
        body['uuid'] = self.uuid
        body['status'] = 'on'
        body['brightNess'] = str(brightness)
        r, _ = helpers.call_api('/SmartBulb/v1/device/updateBrightness',
                                'put',
                                headers=helpers.req_headers(self.manager),
                                json=body)

        if helpers.code_check(r):
            self._brightness = brightness
            return True

        logger.debug('Error setting brightness for %s', self.device_name)
        return False
Пример #7
0
    def test_outdoor_outlet_onoff(self, caplog, api_mock):
        """Test Outdoor Outlet Device On/Off Methods."""
        self.mock_api.return_value = ({"code": 0}, 200)
        outdoor_outlet = VeSyncOutdoorPlug(DEV_LIST_DETAIL, self.vesync_obj)
        head = helpers.req_headers(self.vesync_obj)
        body = helpers.req_body(self.vesync_obj, 'devicestatus')

        body['status'] = 'on'
        body['uuid'] = outdoor_outlet.uuid
        body['switchNo'] = outdoor_outlet.sub_device_no
        on = outdoor_outlet.turn_on()
        self.mock_api.assert_called_with(
            '/outdoorsocket15a/v1/device/devicestatus',
            'put',
            headers=head,
            json=body)
        assert on
        off = outdoor_outlet.turn_off()
        body['status'] = 'off'
        self.mock_api.assert_called_with(
            '/outdoorsocket15a/v1/device/devicestatus',
            'put',
            headers=head,
            json=body)
        assert off
Пример #8
0
 def test_airpur_onoff(self, caplog, api_mock):
     """Test Air Purifier Device On/Off Methods."""
     self.mock_api.return_value = ({"code": 0}, 200)
     fan = VeSyncAir131(DEV_LIST_DETAIL, self.vesync_obj)
     head = helpers.req_headers(self.vesync_obj)
     body = helpers.req_body(self.vesync_obj, 'devicestatus')
     fan.device_status = 'off'
     body['status'] = 'on'
     body['uuid'] = fan.uuid
     on = fan.turn_on()
     self.mock_api.assert_called_with(
         '/131airPurifier/v1/device/deviceStatus',
         'put',
         json=body,
         headers=head)
     call_args = self.mock_api.call_args_list[0][0]
     assert call_args[0] == '/131airPurifier/v1/device/deviceStatus'
     assert call_args[1] == 'put'
     assert on
     fan.device_status = 'on'
     off = fan.turn_off()
     body['status'] = 'off'
     self.mock_api.assert_called_with(
         '/131airPurifier/v1/device/deviceStatus',
         'put',
         json=body,
         headers=head)
     assert off
Пример #9
0
    def set_color_temp(self, color_temp: int) -> bool:
        """Set Color Temperature of Bulb in pct (1 - 100)."""
        if color_temp < 0 or color_temp > 100:
            logger.debug('Invalid color temperature - only between 0 and 100')
            return False
        body = helpers.req_body(self.manager, 'bypass')
        body['cid'] = self.cid
        body['jsonCmd'] = {'light': {}}
        if self.device_status == 'off':
            light_dict = {'action': 'on', 'colorTempe': color_temp}
        else:
            light_dict = {'colorTempe': color_temp}
        body['jsonCmd']['light'] = light_dict
        r, _ = helpers.call_api('/cloud/v1/deviceManaged/bypass',
                                'post',
                                headers=helpers.req_headers(self.manager),
                                json=body)

        if r.get('code') == -11300027:
            logger.debug('%s device offline', self.device_name)
            self.connection_status = 'offline'
            self.device_status = 'off'
            return False
        elif r.get('code') == 0:
            self.device_status = 'on'
            self._color_temp = color_temp
            return True
        else:
            logger.warning('%s - Unknown return code - %d with message %s',
                           self.device_name, r.get('code'), r.get('msg'))
        return False
Пример #10
0
    def rgb_color_status(self,
                         status: str,
                         red: int = None,
                         blue: int = None,
                         green: int = None) -> bool:
        """Set faceplate RGB color."""
        body = helpers.req_body(self.manager, 'devicestatus')
        body['status'] = status
        body['uuid'] = self.uuid
        head = helpers.req_headers(self.manager)
        if red is not None and blue is not None and green is not None:
            body['rgbValue'] = {'red': red, 'blue': blue, 'green': green}

        r, _ = helpers.call_api('/dimmer/v1/device/devicergbstatus',
                                'put',
                                headers=head,
                                json=body)

        if r is not None and helpers.code_check(r):
            self._rgb_status = status
            if body.get('rgbValue') is not None:
                self._rgb_value = {'red': red, 'blue': blue, 'green': green}
            return True
        logger.warning('Error turning %s off', self.device_name)
        return False
Пример #11
0
    def get_details(self):
        """Get 15A outlet details."""
        body = helpers.req_body(self.manager, 'devicedetail')
        body['uuid'] = self.uuid

        r, _ = helpers.call_api(
            '/15a/v1/device/devicedetail',
            'post',
            headers=helpers.req_headers(self.manager),
            json=body
        )

        attr_list = ('deviceStatus', 'activeTime', 'energy', 'power',
                     'voltage', 'nightLightStatus', 'nightLightAutomode',
                     'nightLightBrightness')

        if (helpers.check_response(r, '15a_detail')
                and all(k in r for k in attr_list)):

            self.device_status = r.get('deviceStatus')
            self.connection_status = r.get('connectionStatus')
            self.details = helpers.build_details_dict(r)
        else:
            logger.debug(
                'Unable to get {0} details'.format(self.device_name)
            )
Пример #12
0
 def test_hash_password(self):
     """Test password hash method."""
     self.assertEqual(Helpers.hash_password(self.vesync_1.password),
                      '5f4dcc3b5aa765d61d8327deb882cf99')
     self.assertEqual(Helpers.hash_password(self.vesync_5.password),
                      'd41d8cd98f00b204e9800998ecf8427e')
     with self.assertRaises(AttributeError):
         Helpers.hash_password(self.vesync_6.password)
Пример #13
0
    def test_api_exception(self, api_mock, caplog):
        """Test call_api method exception handling."""
        caplog.set_level(logging.DEBUG)
        api_mock.return_value.raiseError.side_effect = Mock(
            side_effect=Exception)

        Helpers.call_api('/call/location', method='get')

        assert len(caplog.records) == 2
Пример #14
0
    def get_yearly_energy(self):
        """Get 7A outlet yearly energy info and build yearly energy dict."""
        r, _ = helpers.call_api('/v1/device/' + self.cid + '/energy/year',
                                'get',
                                headers=helpers.req_headers(self.manager))

        if r is not None and all(x in r for x in self.energy_keys):
            self.energy['year'] = helpers.build_energy_dict(r)
        else:
            _LOGGER.debug('Unable to get %s yearly data', self.device_name)
Пример #15
0
    def get_config(self):
        """Get 7A outlet configuration info."""
        r, _ = helpers.call_api(
            '/v1/device/' + self.cid + '/configurations',
            'get',
            headers=helpers.req_headers(self.manager)
        )

        if 'currentFirmVersion' in r:
            self.config = helpers.build_config_dict(r)
Пример #16
0
    def get_config(self):
        """Get 7A outlet configuration info."""
        r, _ = helpers.call_api('/v1/device/' + self.cid + '/configurations',
                                'get',
                                headers=helpers.req_headers(self.manager))

        if 'currentFirmVersion' in r:
            self.config = helpers.build_config_dict(r)
        else:
            _LOGGER.debug("Error getting configuration info for %s",
                          self.device_name)
Пример #17
0
    def get_config(self):
        """Get configuration and firmware info of tunable bulb."""
        body = helpers.req_body(self.manager, 'bypass_config')
        body['uuid'] = self.uuid

        r, _ = helpers.call_api('/cloud/v1/deviceManaged/configurations',
                                'post',
                                headers=helpers.req_headers(self.manager),
                                json=body)

        if helpers.check_response(r, 'config'):
            self.config = helpers.build_config_dict(r)
Пример #18
0
    def get_monthly_energy(self):
        """Get 7A outlet monthly energy info and buld monthly energy dict."""
        r, _ = helpers.call_api(
            '/v1/device/' + self.cid + '/energy/month',
            'get',
            headers=helpers.req_headers(self.manager)
        )

        if r is not None and all(x in r for x in self.energy_keys):
            self.energy['month'] = helpers.build_energy_dict(r)
        else:
            logger.warning('Unable to get %s monthly data', self.device_name)
Пример #19
0
 def toggle(self, status):
     """Toggle dimmable bulb."""
     body = helpers.req_body(self.manager, 'devicestatus')
     body['uuid'] = self.uuid
     body['status'] = status
     r, _ = helpers.call_api('/SmartBulb/v1/device/devicestatus',
                             'put',
                             headers=helpers.req_headers(self.manager),
                             json=body)
     if helpers.code_check(r):
         self.device_status = status
         return True
     return False
Пример #20
0
    def get_yearly_energy(self):
        """Get 7A outlet yearly energy info and build yearly energy dict."""
        r, _ = helpers.call_api(
            '/v1/device/' + self.cid + '/energy/year',
            'get',
            headers=helpers.req_headers(self.manager)
        )

        if r is not None and helpers.check_response(r, '7a_energy'):
            self.energy['year'] = helpers.build_energy_dict(r)
        else:
            logger.debug(
                'Unable to get {0} yearly data'.format(self.device_name))
Пример #21
0
    def get_config(self):
        """Get configuration of dimmable bulb."""
        body = helpers.req_body(self.manager, 'devicedetail')
        body['method'] = 'configurations'
        body['uuid'] = self.uuid

        r, _ = helpers.call_api('/SmartBulb/v1/device/configurations',
                                'post',
                                headers=helpers.req_headers(self.manager),
                                json=body)

        if helpers.check_response(r, 'config'):
            self.config = helpers.build_config_dict(r)
Пример #22
0
    def turn_off(self):
        """Turn 7A outlet off - return True if successful."""
        _, status_code = helpers.call_api(
            '/v1/wifi-switch-1.3/' + self.cid + '/status/off',
            'put',
            headers=helpers.req_headers(self.manager))

        if status_code is not None and status_code == 200:
            self.device_status = 'off'

            return True
        _LOGGER.warning('Error turning %s off', self.device_name)
        return False
Пример #23
0
    def turn_off_nightlight(self):
        """Turn Off Nightlight."""
        body = helpers.req_body(self.manager, 'devicestatus')
        body['uuid'] = self.uuid
        body['mode'] = 'manual'

        response, _ = helpers.call_api(
            '/15a/v1/device/nightlightstatus',
            'put',
            headers=helpers.req_headers(self.manager),
            json=body
        )

        return helpers.check_response(response, '15a_ntlight')
Пример #24
0
    def get_config(self):
        """Get switch device configuration info."""
        body = helpers.req_body(self.manager, 'devicedetail')
        body['method'] = 'configurations'
        body['uuid'] = self.uuid

        r, _ = helpers.call_api(
            '/inwallswitch/v1/device/configurations',
            'post',
            headers=helpers.req_headers(self.manager),
            json=body)

        if helpers.check_response(r, 'config'):
            self.config = helpers.build_config_dict(r)
Пример #25
0
    def get_config(self):
        """Get configuration and firmware info of tunable bulb."""
        body = helpers.req_body(self.manager, 'bypass_config')
        body['uuid'] = self.uuid

        r, _ = helpers.call_api('/cloud/v1/deviceManaged/configurations',
                                'post',
                                headers=helpers.req_headers(self.manager),
                                json=body)

        if helpers.code_check(r):
            self.config = helpers.build_config_dict(r)
        else:
            logger.debug("Error getting %s config info", self.device_name)
Пример #26
0
    def get_config(self):
        """Get switch device configuration info."""
        body = helpers.req_body(self.manager, 'devicedetail')
        body['method'] = 'configurations'
        body['uuid'] = self.uuid

        r, _ = helpers.call_api('/inwallswitch/v1/device/configurations',
                                'post',
                                headers=helpers.req_headers(self.manager),
                                json=body)

        if helpers.code_check(r):
            self.config = helpers.build_config_dict(r)
        else:
            logger.warning("Unable to get %s config info", self.device_name)
Пример #27
0
    def get_monthly_energy(self):
        """Get 10A outlet monthly energy info and populate energy dict."""
        body = helpers.req_body(self.manager, 'energy_month')
        body['uuid'] = self.uuid

        response, _ = helpers.call_api('/10a/v1/device/energymonth',
                                       'post',
                                       headers=helpers.req_headers(
                                           self.manager),
                                       json=body)

        if helpers.code_check(response):
            self.energy['month'] = helpers.build_energy_dict(response)
        else:
            _LOGGER.debug('Unable to get %s monthly data', self.device_name)
Пример #28
0
    def get_config(self):
        """Get configuration info for outdoor outlet."""
        body = helpers.req_body(self.manager, 'devicedetail')
        body['method'] = 'configurations'
        body['uuid'] = self.uuid

        r, _ = helpers.call_api('/outdoorsocket15a/v1/device/configurations',
                                'post',
                                headers=helpers.req_headers(self.manager),
                                json=body)

        if helpers.code_check(r):
            self.config = helpers.build_config_dict(r)
        else:
            _LOGGER.debug("Error getting %s config info", self.device_name)
Пример #29
0
    def turn_off_nightlight(self):
        """Turn Off Nightlight."""
        body = helpers.req_body(self.manager, 'devicestatus')
        body['uuid'] = self.uuid
        body['mode'] = 'manual'

        response, _ = helpers.call_api('/15a/v1/device/nightlightstatus',
                                       'put',
                                       headers=helpers.req_headers(
                                           self.manager),
                                       json=body)

        if helpers.code_check(response):
            return True
        _LOGGER.debug("Error turning off %s nightlight", self.device_name)
Пример #30
0
    def get_yearly_energy(self):
        """Get outdoor outlet yearly energy info and populate energy dict."""
        body = helpers.req_body(self.manager, 'energy_year')
        body['uuid'] = self.uuid

        response, _ = helpers.call_api(
            '/outdoorsocket15a/v1/device/energyyear',
            'post',
            headers=helpers.req_headers(self.manager),
            json=body)

        if helpers.code_check(response):
            self.energy['year'] = helpers.build_energy_dict(response)
        else:
            _LOGGER.debug('Unable to get %s yearly data', self.device_name)