private void btnSchedule_Click(object sender, EventArgs e)
        {
            Int32  liDeviceID        = Convert.ToInt32(ddlScheduleDevice.SelectedValue);
            Int32  liObjectID        = Convert.ToInt32(Convert.ToString(ddlScheduleObject.SelectedValue).Split('|')[1]);
            string lsNewPresentvalue = Convert.ToString(txtScheduleValue.Text);
            Int32  liDaySelected     = Convert.ToInt32(ddlScheduleDay.SelectedValue);

            if (liDeviceID > -1 && liObjectID > -1 && !string.IsNullOrEmpty(lsNewPresentvalue) &&
                !string.IsNullOrEmpty(txtScheduleHours.Text) &&
                !string.IsNullOrEmpty(txtScheduleMinutes.Text) &&
                !string.IsNullOrEmpty(txtScheduleSeconds.Text))
            {
                using (var loESDLutronEntities = new ESDLutronEntities())
                {
                    var loBACnetDeviceDetail = loESDLutronEntities.BACnetDevices
                                               .Where(x => x.device_id == liDeviceID &&
                                                      x.object_type.ToUpper() == LutronFloorObjectType.Device)
                                               .Select(x => x).FirstOrDefault();


                    int?liTopInstanceID = loESDLutronEntities.BACnetDevices
                                          .Where(x => x.device_id == liDeviceID &&
                                                 x.object_type.ToUpper() == LutronFloorObjectType.SCHEDULE)
                                          .Select(x => x.object_instance).OrderByDescending(x => x.Value).FirstOrDefault();


                    BacnetAddress loBacnetAddress;
                    loBacnetAddress = new BacnetAddress(BacnetAddressTypes.IP, loBACnetDeviceDetail.network_id);
                    loBacnetAddress.RoutedSource = new BacnetAddress(BacnetAddressTypes.IP, loBACnetDeviceDetail.routed_source, (ushort)loBACnetDeviceDetail.routed_net);

                    //var deviceObjId = new BacnetObjectId(BacnetObjectTypes.OBJECT_DEVICE, (uint)liDeviceID);
                    //var objectIdList = await moBacnetClient.ReadPropertyAsync(loBacnetAddress, deviceObjId, BacnetPropertyIds.PROP_OBJECT_LIST);

                    //IList<BacnetValue> loDeviceObject;
                    //moBacnetClient.ReadPropertyRequest(loBacnetAddress, new BacnetObjectId(BacnetObjectTypes.OBJECT_DEVICE, (uint)liDeviceID), BacnetPropertyIds.PROP_OBJECT_LIST, out loDeviceObject);

                    //IList<BacnetValue> loScheduleValues;
                    //moBacnetClient.ReadPropertyRequest(loBacnetAddress, new BacnetObjectId(BacnetObjectTypes.OBJECT_SCHEDULE, (uint)11), BacnetPropertyIds.PROP_LIST_OF_OBJECT_PROPERTY_REFERENCES, out loScheduleValues);


                    //IList<BacnetValue> loWeekValues;
                    //moBacnetClient.ReadPropertyRequest(loBacnetAddress, new BacnetObjectId(BacnetObjectTypes.OBJECT_SCHEDULE, (uint)11), BacnetPropertyIds.PROP_WEEKLY_SCHEDULE, out loWeekValues);



                    //IList<BacnetValue> loObjectName;
                    //moBacnetClient.ReadPropertyRequest(loBacnetAddress, new BacnetObjectId(BacnetObjectTypes.OBJECT_SCHEDULE, (uint)11), BacnetPropertyIds.PROP_OBJECT_NAME, out loObjectName);


                    //var loData = values
                    //              .Where(x => ((BacnetObjectId)values[0].Value).Type == BacnetObjectTypes.OBJECT_SCHEDULE)
                    //              .Select(x => x.Value.GetType().GetProperty("Instance"))


                    IList <BacnetValue> loScheduleValues;
                    moBacnetClient.ReadPropertyRequest(loBacnetAddress, new BacnetObjectId(BacnetObjectTypes.OBJECT_SCHEDULE, (uint)2), BacnetPropertyIds.PROP_EXCEPTION_SCHEDULE, out loScheduleValues);



                    ICollection <BacnetPropertyValue> loBacnetPropertyValueList = new List <BacnetPropertyValue>();

                    BacnetPropertyValue loNewPropertyValue = new BacnetPropertyValue();
                    List <BacnetValue>  loBacnetValue      = new List <BacnetValue>();


                    #region set schedule

                    ////    Create new instance id based on largest available
                    //if(liTopInstanceID)
                    liTopInstanceID = liTopInstanceID != null ? liTopInstanceID + 1 : 1;

                    //// Set schedule object name
                    loBacnetValue      = new List <BacnetValue>();
                    loNewPropertyValue = new BacnetPropertyValue();
                    loBacnetValue.Add(new BacnetValue(BacnetApplicationTags.BACNET_APPLICATION_TAG_CHARACTER_STRING, "Schedule" + " " + liTopInstanceID));

                    loNewPropertyValue.value    = loBacnetValue;
                    loNewPropertyValue.property = new BacnetPropertyReference((uint)BacnetPropertyIds.PROP_OBJECT_NAME, ASN1.BACNET_ARRAY_ALL);

                    loBacnetPropertyValueList.Add(loNewPropertyValue);


                    //// Set effective period for schedule object
                    loBacnetValue      = new List <BacnetValue>();
                    loNewPropertyValue = new BacnetPropertyValue();
                    loBacnetValue.Add(new BacnetValue(BacnetApplicationTags.BACNET_APPLICATION_TAG_DATE, DateTime.Today.AddDays(-1)));
                    loBacnetValue.Add(new BacnetValue(BacnetApplicationTags.BACNET_APPLICATION_TAG_DATE, DateTime.Today.AddMonths(1)));

                    loNewPropertyValue.value    = loBacnetValue;
                    loNewPropertyValue.property = new BacnetPropertyReference((uint)BacnetPropertyIds.PROP_EFFECTIVE_PERIOD, ASN1.BACNET_ARRAY_ALL);

                    loBacnetPropertyValueList.Add(loNewPropertyValue);
                    #endregion


                    //// Set object reference to update it's value with schedule object
                    loBacnetValue      = new List <BacnetValue>();
                    loNewPropertyValue = new BacnetPropertyValue();

                    BacnetDeviceObjectPropertyReference loPropertyReference = new BacnetDeviceObjectPropertyReference();


                    //BACnetCalendarEntry loBACnetCalendarEntry = new BACnetCalendarEntry();


                    //// Add AV 1 present value change
                    loPropertyReference.ArrayIndex = -1;
                    loPropertyReference.DeviceId   = new BacnetObjectId(BacnetObjectTypes.OBJECT_DEVICE, (uint)liDeviceID);
                    loPropertyReference.ObjectId   = new BacnetObjectId(BacnetObjectTypes.OBJECT_ANALOG_VALUE, (uint)liObjectID);
                    loPropertyReference.PropertyId = BacnetPropertyIds.PROP_PRESENT_VALUE;

                    loBacnetValue.Add(new BacnetValue(BacnetApplicationTags.BACNET_APPLICATION_TAG_OBJECT_PROPERTY_REFERENCE,
                                                      loPropertyReference));

                    // Add AV 2 present value change
                    loPropertyReference            = new BacnetDeviceObjectPropertyReference();
                    loPropertyReference.ArrayIndex = -1;
                    loPropertyReference.DeviceId   = new BacnetObjectId(BacnetObjectTypes.OBJECT_DEVICE, (uint)liDeviceID);
                    loPropertyReference.ObjectId   = new BacnetObjectId(BacnetObjectTypes.OBJECT_ANALOG_VALUE, (uint)2);
                    loPropertyReference.PropertyId = BacnetPropertyIds.PROP_PRESENT_VALUE;

                    loBacnetValue.Add(new BacnetValue(BacnetApplicationTags.BACNET_APPLICATION_TAG_OBJECT_PROPERTY_REFERENCE,
                                                      loPropertyReference));

                    loNewPropertyValue.value    = loBacnetValue;
                    loNewPropertyValue.property = new BacnetPropertyReference((uint)BacnetPropertyIds.PROP_LIST_OF_OBJECT_PROPERTY_REFERENCES, ASN1.BACNET_ARRAY_ALL);

                    loBacnetPropertyValueList.Add(loNewPropertyValue);



                    //// Add weekly schedule for object
                    loBacnetValue      = new List <BacnetValue>();
                    loNewPropertyValue = new BacnetPropertyValue();

                    //// setup weekday to add schedule (0 = Monday, 1 = Tuesday ....., 6 = Sunday)
                    BacnetWeeklySchedule loBacnetWeeklySchedule = new BacnetWeeklySchedule();
                    loBacnetWeeklySchedule.days[liDaySelected] = new List <DaySchedule>();

                    //// Schedule to update AV 1,2 at specified time
                    loBacnetWeeklySchedule.days[liDaySelected].Add(
                        new DaySchedule(new DateTime(1, 1, 1, Convert.ToInt32(txtScheduleHours.Text),
                                                     Convert.ToInt32(txtScheduleMinutes.Text), Convert.ToInt32(txtScheduleSeconds.Text)),
                                        Convert.ToSingle((new Random()).Next(100, 999))));

                    //// Schedule to update AV 1,2 after 5 mins of schedule
                    loBacnetWeeklySchedule.days[liDaySelected].Add(new DaySchedule(DateTime.Now.AddMinutes(1), Convert.ToSingle(lsNewPresentvalue)));


                    loBacnetValue.Add(new BacnetValue(BacnetApplicationTags.BACNET_APPLICATION_TAG_WEEKLY_SCHEDULE, loBacnetWeeklySchedule));

                    loNewPropertyValue.value    = loBacnetValue;
                    loNewPropertyValue.property = new BacnetPropertyReference((uint)BacnetPropertyIds.PROP_WEEKLY_SCHEDULE, ASN1.BACNET_ARRAY_ALL);

                    loBacnetPropertyValueList.Add(loNewPropertyValue);



                    //// Add exception schedule
                    //loBacnetValue = new List<BacnetValue>();
                    //loNewPropertyValue = new BacnetPropertyValue();

                    //loBacnetValue.Add(new BacnetValue(BacnetApplicationTags.BACNET_APPLICATION_TAG_TIME, new DateTime(2017,9,11,15,10,0)));
                    //loBacnetValue.Add(new BacnetValue(BacnetApplicationTags.BACNET_APPLICATION_TAG_REAL, 333));
                    //loBacnetValue.Add(new BacnetValue(BacnetApplicationTags.BACNET_APPLICATION_TAG_DATE, DateTime.Today.Date));


                    //loNewPropertyValue.value = loBacnetValue;
                    //loNewPropertyValue.property = new BacnetPropertyReference((uint)BacnetPropertyIds.PROP_EXCEPTION_SCHEDULE, ASN1.BACNET_ARRAY_ALL);
                    //loBacnetPropertyValueList.Add(loNewPropertyValue);



                    loBacnetValue      = new List <BacnetValue>();
                    loNewPropertyValue = new BacnetPropertyValue();

                    BacnetWeeklyExceptionSchedule loBacnetWeeklyExceptionSchedule = new BacnetWeeklyExceptionSchedule();

                    List <ExceptionScheduleTimeValue>[] loExceptionSchedulTimeValue = new List <ExceptionScheduleTimeValue> [1];
                    loExceptionSchedulTimeValue[0] = new List <ExceptionScheduleTimeValue>();
                    loExceptionSchedulTimeValue[0].Add(new ExceptionScheduleTimeValue(DateTime.Now.AddMinutes(2), Convert.ToSingle(111)));


                    loBacnetWeeklyExceptionSchedule.loExceptionScheduleArray    = new List <ExceptionScheduleArray> [1];
                    loBacnetWeeklyExceptionSchedule.loExceptionScheduleArray[0] = new List <ExceptionScheduleArray>();
                    loBacnetWeeklyExceptionSchedule.loExceptionScheduleArray[0].Add(new ExceptionScheduleArray(new DateTime(1, 1, 1, 18, 30, 1), loExceptionSchedulTimeValue));

                    loBacnetValue.Add(new BacnetValue(BacnetApplicationTags.BACNET_APPLICATION_TAG_SPECIAL_EVENT, loBacnetWeeklyExceptionSchedule));

                    loNewPropertyValue.value    = loBacnetValue;
                    loNewPropertyValue.property = new BacnetPropertyReference((uint)BacnetPropertyIds.PROP_EXCEPTION_SCHEDULE, ASN1.BACNET_ARRAY_ALL);

                    loBacnetPropertyValueList.Add(loNewPropertyValue);

                    moBacnetClient.CreateObjectRequest(loBacnetAddress, new BacnetObjectId(BacnetObjectTypes.OBJECT_SCHEDULE, (uint)liTopInstanceID), loBacnetPropertyValueList);
                }
            }
            else
            {
                if (liDeviceID < 0)
                {
                    MessageBox.Show("Please select device");
                }
                else if (liObjectID < 0)
                {
                    MessageBox.Show("Please select object");
                }
                else
                {
                    MessageBox.Show("Schedule is not setup properly, please review.");
                }
            }
        }