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."); } } }