/// <summary>
        /// Toggle Lighting State
        /// </summary>
        /// <param name="fiDeviceID"></param>
        /// <param name="fbToggleStatus"></param>
        private void ToggleLutronLight(int fiDeviceID, bool fbToggleStatus)
        {
            using (var loESDLutronEntities = new ESDLutronEntities())
            {
                var loBACnetDeviceDetail = loESDLutronEntities.BACnetDevices
                                           .Where(x => x.device_id == fiDeviceID &&
                                                  x.object_instance == (int?)LutronObjectType.Lighting_State)
                                           .Select(x => x).FirstOrDefault();

                if (loBACnetDeviceDetail != null && loBACnetDeviceDetail.object_instance != null)
                {
                    BacnetAddress loBacnetAddress = new BacnetAddress(BacnetAddressTypes.IP, loBACnetDeviceDetail.network_id);
                    loBacnetAddress.RoutedSource = new BacnetAddress(BacnetAddressTypes.IP, loBACnetDeviceDetail.routed_source, (ushort)loBACnetDeviceDetail.routed_net);

                    IList <BacnetValue> loBacnetValueList;
                    moBacnetClient.ReadPropertyRequest(loBacnetAddress, new BacnetObjectId(BacnetObjectTypes.OBJECT_BINARY_VALUE, (uint)loBACnetDeviceDetail.object_instance), BacnetPropertyIds.PROP_PRESENT_VALUE, out loBacnetValueList);


                    BacnetValue   loBacnetNewValue = new BacnetValue(BacnetApplicationTags.BACNET_APPLICATION_TAG_ENUMERATED, fbToggleStatus == true ? 1 : 0);
                    BacnetValue[] loWriteValue     = { loBacnetNewValue };

                    moBacnetClient.WritePropertyRequest(loBacnetAddress, new BacnetObjectId(BacnetObjectTypes.OBJECT_BINARY_VALUE, (uint)loBACnetDeviceDetail.object_instance), BacnetPropertyIds.PROP_PRESENT_VALUE, loWriteValue);

                    //BacnetValue[] loNewBacnetValue = { new BacnetValue(Convert.ToSingle(111)) };

                    ////bacnet_client.WritePropertyRequest(loBacnetAddress, new BacnetObjectId(BacnetObjectTypes.OBJECT_BINARY_VALUE, (uint)loBACnetDeviceDetail.object_instance), BacnetPropertyIds.PROP_ACTION, loNewBacnetValue);
                    ////bacnet_client.WritePropertyRequest(loBacnetAddress, new BacnetObjectId(BacnetObjectTypes.OBJECT_ANALOG_INPUT, 0), BacnetPropertyIds.PROP_PRESENT_VALUE, loNewBacnetValue);
                    //bacnet_client.WritePropertyRequest(loBacnetAddress, new BacnetObjectId(BacnetObjectTypes.OBJECT_ANALOG_INPUT, 0), BacnetPropertyIds.PROP_PRESENT_VALUE, loNewBacnetValue);
                }
            }

            //bool ret = WriteScalarValue(1, new BacnetObjectId(BacnetObjectTypes.OBJECT_ANALOG_VALUE, 2), BacnetPropertyIds.PROP_PRESENT_VALUE, loNewValue);
        }
        /// <summary>
        /// Get current lightlign level from simulator will be between 1 to 100
        /// </summary>
        /// <param name="fiDeviceID"></param>
        /// <returns></returns>
        private string GetLutronLightLevel(Int32 fiDeviceID)
        {
            IList <BacnetValue> loBacnetValueList;

            using (var loESDLutronEntities = new ESDLutronEntities())
            {
                var loBACnetDeviceDetail = loESDLutronEntities.BACnetDevices
                                           .Where(x => x.device_id == fiDeviceID &&
                                                  x.object_instance == (int?)LutronObjectType.Lighting_Level)
                                           .Select(x => x).FirstOrDefault();


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

                moBacnetClient.ReadPropertyRequest(loBacnetAddress, new BacnetObjectId(BacnetObjectTypes.OBJECT_ANALOG_VALUE, (uint)loBACnetDeviceDetail.object_instance), BacnetPropertyIds.PROP_PRESENT_VALUE, out loBacnetValueList);
            }

            if (loBacnetValueList != null && loBacnetValueList.Count > 0)
            {
                return(loBacnetValueList[0].Value.ToString());
            }
            else
            {
                return(string.Empty);
            }
        }
        public void FillAvailableDevicesForSchedule()
        {
            var loAvailableDevices = new BindingList <KeyValuePair <string, string> >();

            loAvailableDevices.Add(new KeyValuePair <string, string>("-1", "Select device"));

            using (var loDataContext = new ESDLutronEntities())
            {
                var loDeviceList = loDataContext
                                   .BACnetDevices
                                   .Where(x => x.object_type == LutronFloorObjectType.Device)
                                   .Select(x => new { x.object_name, x.device_id }).Distinct().ToList();

                if (loDeviceList != null && loDeviceList.Count > 0)
                {
                    foreach (var loDevice in loDeviceList)
                    {
                        loAvailableDevices.Add(new KeyValuePair <string, string>(Convert.ToString(loDevice.device_id), Convert.ToString(loDevice.object_name)));
                    }
                }
            }

            ddlScheduleDevice.DataSource    = loAvailableDevices;
            ddlScheduleDevice.ValueMember   = "Key";
            ddlScheduleDevice.DisplayMember = "Value";
        }
        /// <summary>
        /// Get current light state for device
        /// </summary>
        /// <param name="fiDeviceID"></param>
        /// <returns></returns>
        private bool GetLutronLightState(Int32 fiDeviceID)
        {
            IList <BacnetValue> loBacnetValueList;

            using (var loESDLutronEntities = new ESDLutronEntities())
            {
                var loBACnetDeviceDetail = loESDLutronEntities.BACnetDevices
                                           .Where(x => x.device_id == fiDeviceID &&
                                                  x.object_type.ToUpper() == LutronFloorObjectType.Lighting_State)
                                           .Select(x => x).FirstOrDefault();


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

                moBacnetClient.ReadPropertyRequest(loBacnetAddress, new BacnetObjectId(BacnetObjectTypes.OBJECT_BINARY_VALUE, (uint)loBACnetDeviceDetail.object_instance), BacnetPropertyIds.PROP_PRESENT_VALUE, out loBacnetValueList);
            }

            if (loBacnetValueList != null && loBacnetValueList.Count > 0)
            {
                return(Convert.ToBoolean(Convert.ToInt32(loBacnetValueList[0].Value)));
            }
            else
            {
                return(false);
            }
        }
        /// <summary>
        /// Register COV event which we want to get, Here AV is registered for COV notification
        /// </summary>
        /// <param name="fiDeviceID"></param>
        private void RegisterCOVForObjectsOfDevice(Int32 fiDeviceID)
        {
            using (var loESDLutronEntities = new ESDLutronEntities())
            {
                var loBACnetDeviceDetail = loESDLutronEntities.BACnetDevices
                                           .Where(x => x.device_id == fiDeviceID &&
                                                  x.object_instance == (int?)LutronObjectType.Lighting_Level)
                                           .Select(x => x).FirstOrDefault();


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

                moBacnetClient.SubscribeCOVRequest(loBacnetAddress, new BacnetObjectId(BacnetObjectTypes.OBJECT_ANALOG_VALUE, (uint)loBACnetDeviceDetail.object_instance), 0, false, false, 60);
            }
        }
        private void ddlScheduleDevice_SelectedIndexChanged(object sender, EventArgs e)
        {
            int liDeviceID;

            if (ddlScheduleDevice.SelectedValue.GetType() == typeof(KeyValuePair <string, string>))
            {
                System.Reflection.PropertyInfo loPropertyInfo = ddlScheduleDevice.SelectedValue.GetType().GetProperty("Key");
                String lsSelectedValue = (String)(loPropertyInfo.GetValue(ddlScheduleDevice.SelectedValue, null));
                liDeviceID = Convert.ToInt32(lsSelectedValue);

                string lsSecondFloorPresentValue = GetLutronLightLevel(2);
                ChangeLightBrightnessForSecondFloor(Convert.ToInt32(lsSecondFloorPresentValue));
            }
            else
            {
                liDeviceID = Convert.ToInt32(ddlScheduleDevice.SelectedValue);
            }


            var loAvailableObjects = new BindingList <KeyValuePair <string, string> >();

            loAvailableObjects.Add(new KeyValuePair <string, string>("PlaceHolder|-1", "Select object"));

            using (var loDataContext = new ESDLutronEntities())
            {
                var loObjectList = loDataContext
                                   .BACnetDevices
                                   .Where(x => x.device_id == liDeviceID &&
                                          (x.object_type == LutronFloorObjectType.Lighting_Level || x.object_type == LutronFloorObjectType.Lighting_State))
                                   .Select(x => new { x.object_instance, x.object_name, x.object_type }).Distinct().ToList();

                if (loObjectList != null && loObjectList.Count > 0)
                {
                    foreach (var loObject in loObjectList)
                    {
                        loAvailableObjects.Add(new KeyValuePair <string, string>(Convert.ToString(loObject.object_type + "|" + loObject.object_instance), Convert.ToString(loObject.object_name)));
                    }
                }
            }

            ddlScheduleObject.DataSource    = loAvailableObjects;
            ddlScheduleObject.ValueMember   = "Key";
            ddlScheduleObject.DisplayMember = "Value";
        }
        /// <summary>
        /// Set Lighting Level as per trackbar value between 1 to 100
        /// </summary>
        /// <param name="fiDeviceID"></param>
        private void ChangeLutronLightLevel(Int32 fiDeviceID)
        {
            using (var loESDLutronEntities = new ESDLutronEntities())
            {
                var loBACnetDeviceDetail = loESDLutronEntities.BACnetDevices
                                           .Where(x => x.device_id == fiDeviceID &&
                                                  x.object_instance == (int?)LutronObjectType.Lighting_Level)
                                           .Select(x => x).FirstOrDefault();


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

                BacnetValue   loNewBacnetValue           = new BacnetValue(BacnetApplicationTags.BACNET_APPLICATION_TAG_REAL, Convert.ToSingle(trackBarLightingLevel.Value));
                BacnetValue[] loWriteNewBacnetValueValue = { loNewBacnetValue };
                moBacnetClient.WritePropertyRequest(loBacnetAddress, new BacnetObjectId(BacnetObjectTypes.OBJECT_ANALOG_VALUE, (uint)loBACnetDeviceDetail.object_instance), BacnetPropertyIds.PROP_PRESENT_VALUE, loWriteNewBacnetValueValue);
            }
        }
        /// <summary>
        /// Temporary method
        /// </summary>
        /// <param name="fiDeviceID"></param>
        /// <param name="foBacnetObjectId"></param>
        /// <param name="foBacnetPropertyIds"></param>
        /// <param name="foBacnetValue"></param>
        /// <returns></returns>
        static bool WriteScalarValue(int fiDeviceID, BacnetObjectId foBacnetObjectId, BacnetPropertyIds foBacnetPropertyIds, BacnetValue foBacnetValue)
        {
            using (var loESDLutronEntities = new ESDLutronEntities())
            {
                var loBACnetDeviceDetail = loESDLutronEntities.BACnetDevices
                                           .Where(x => x.device_id == fiDeviceID &&
                                                  x.object_instance == (int?)LutronObjectType.Lighting_State)
                                           .Select(x => x).FirstOrDefault();


                BacnetAddress adr;

                //// Looking for the device
                adr = new BacnetAddress(BacnetAddressTypes.IP, loBACnetDeviceDetail.network_id);
                if (adr == null)
                {
                    return(false);              // not found
                }
                adr.RoutedSource = new BacnetAddress(BacnetAddressTypes.IP, loBACnetDeviceDetail.routed_source, (ushort)loBACnetDeviceDetail.routed_net);

                //// Property Write


                IList <BacnetValue> NoScalarValue;
                moBacnetClient.ReadPropertyRequest(adr, foBacnetObjectId, foBacnetPropertyIds, out NoScalarValue);

                //var loWirteList = NoScalarValue.ToList();
                //loWirteList[0].Value = 5;

                //NoScalarValue[0].Value = 5;
                //List<BacnetValue> loWriteValue = new List<BacnetValue>();
                //loWriteValue.Add(new BacnetValue(BacnetApplicationTags.BACNET_APPLICATION_TAG_REAL, 5));

                BacnetValue   loBacnetNewValue = new BacnetValue(BacnetApplicationTags.BACNET_APPLICATION_TAG_REAL, Convert.ToSingle(foBacnetValue.Value));
                BacnetValue[] loWriteValue     = { loBacnetNewValue };

                moBacnetClient.WritePropertyRequest(adr, foBacnetObjectId, foBacnetPropertyIds, loWriteValue);

                return(true);
            }
        }
        /// <summary>
        ///  Change light level for floor (AV)
        /// </summary>
        /// <param name="fiFloorID"></param>
        private void ChangeLutronLightLevel(Int32 fiFloorID)
        {
            using (var loESDLutronEntities = new ESDLutronEntities())
            {
                //var loBACnetDeviceDetail = loESDLutronEntities.BACnetDevices
                //                            .Where(x => x.device_id == fiDeviceID
                //                                  && x.object_type == LutronFloorObjectType.Lighting_Level)
                //                             .Select(x => x).FirstOrDefault();


                var loBACnetDeviceDetail = (from DM in loESDLutronEntities.BACnetDeviceMappings
                                            join D in loESDLutronEntities.BACnetDevices on DM.device_id equals D.device_id
                                            where DM.floor_id == fiFloorID &&
                                            D.object_type.ToUpper() == LutronFloorObjectType.Lighting_Level &&
                                            D.object_instance != 7    //// 7 is for alarm event
                                            select new
                {
                    network_id = D.network_id,
                    device_id = D.device_id,
                    object_instance = D.object_instance,
                    object_name = D.object_name,
                    routed_source = D.routed_source,
                    routed_net = D.routed_net
                }).Distinct().ToList();


                if (loBACnetDeviceDetail != null && loBACnetDeviceDetail.Count > 0)
                {
                    foreach (var loData in loBACnetDeviceDetail)
                    {
                        BacnetAddress loBacnetAddress;
                        loBacnetAddress = new BacnetAddress(BacnetAddressTypes.IP, loData.network_id);
                        loBacnetAddress.RoutedSource = new BacnetAddress(BacnetAddressTypes.IP, loData.routed_source, (ushort)loData.routed_net);

                        BacnetValue   loNewBacnetValue           = new BacnetValue(BacnetApplicationTags.BACNET_APPLICATION_TAG_REAL, Convert.ToSingle(trbkLightSense.Value));
                        BacnetValue[] loWriteNewBacnetValueValue = { loNewBacnetValue };
                        moBacnetClient.WritePropertyRequest(loBacnetAddress, new BacnetObjectId(BacnetObjectTypes.OBJECT_ANALOG_VALUE, (uint)loData.object_instance), BacnetPropertyIds.PROP_PRESENT_VALUE, loWriteNewBacnetValueValue);
                    }
                }
            }
        }
        /// <summary>
        /// get current light level for floor
        /// </summary>
        /// <param name="fiFloorID"></param>
        /// <returns></returns>
        private string GetLutronLightLevel(Int32 fiFloorID)
        {
            IList <BacnetValue> loBacnetValueList;

            using (var loESDLutronEntities = new ESDLutronEntities())
            {
                var loBACnetDeviceDetail = (from DM in loESDLutronEntities.BACnetDeviceMappings
                                            join D in loESDLutronEntities.BACnetDevices on DM.device_id equals D.device_id
                                            where DM.floor_id == fiFloorID &&
                                            D.object_type.ToUpper() == LutronFloorObjectType.Lighting_Level
                                            select new
                {
                    network_id = D.network_id,
                    device_id = D.device_id,
                    object_instance = D.object_instance,
                    object_name = D.object_name,
                    routed_source = D.routed_source,
                    routed_net = D.routed_net
                }).Distinct().FirstOrDefault();


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

                moBacnetClient.ReadPropertyRequest(loBacnetAddress, new BacnetObjectId(BacnetObjectTypes.OBJECT_ANALOG_VALUE, (uint)loBACnetDeviceDetail.object_instance), BacnetPropertyIds.PROP_PRESENT_VALUE, out loBacnetValueList);
            }

            if (loBacnetValueList != null && loBacnetValueList.Count > 0)
            {
                return(loBacnetValueList[0].Value.ToString());
            }
            else
            {
                return(string.Empty);
            }
        }
        /// <summary>
        /// InIt bacnet and UI
        /// </summary>
        public LutronLight()
        {
            InitializeComponent();

            chkLightOnOff.Appearance  = Appearance.Button;
            chkLightOnOff.TextAlign   = ContentAlignment.MiddleCenter;
            chkLightOnOff.MinimumSize = new Size(75, 25); //To prevent shrinkage!

            //// Bacnet on UDP/IP/Ethernet
            moBacnetClient = new BacnetClient(new BacnetIpUdpProtocolTransport(47808, false)); // (0xBAC0, false));
            moBacnetClient.Start();                                                            // go

            //// Set handler for OnCOVNotification
            moBacnetClient.OnCOVNotification += new BacnetClient.COVNotificationHandler(handler_OnCOVNotification);

            using (var loESDLutronEntities = new ESDLutronEntities())
            {
                ddlDeviceList.DataSource    = loESDLutronEntities.BACnetDevices.Select(x => new { id = x.device_id, name = x.device_id }).Distinct().OrderBy(x => x.id).ToList();
                ddlDeviceList.ValueMember   = "id";
                ddlDeviceList.DisplayMember = "name";
            }

            RegisterCOVForObjectsOfDevice((Int32)ddlDeviceList.SelectedValue);
        }
        /// <summary>
        /// handler to assign alarm enrolment instance on event notification
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="adr"></param>
        /// <param name="low_limit"></param>
        /// <param name="high_limit"></param>
        static void handler_OnWhoIs(BacnetClient sender, BacnetAddress adr, int low_limit, int high_limit)
        {
            if (low_limit != -1 && 1 < low_limit)
            {
                return;
            }
            else if (high_limit != -1 && 1 > high_limit)
            {
                return;
            }

            using (var loESDLutronEntities = new ESDLutronEntities())
            {
                Int32?liAlarmEnrolment = loESDLutronEntities.BACnetDevices
                                         .Where(x => x.device_id == 1 &&
                                                x.object_type.ToUpper() == LutronFloorObjectType.ALERT_ENROLLMENT)
                                         .Select(x => x.object_instance).FirstOrDefault();

                if (liAlarmEnrolment != null)
                {
                    sender.Iam((uint)liAlarmEnrolment, new BacnetSegmentations());
                }
            }
        }
        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.");
                }
            }
        }
Beispiel #14
0
        /// <summary>
        /// Get all object & object's instance detail of available devices
        /// Insert network, device, object & object's instance into DB
        /// </summary>
        static void InsertBACnetDeviceDetailInDB()
        {
            if (loBACnetDeviceModel != null && loBACnetDeviceModel.loBACnetDeviceList.Count > 0)
            {
                using (var loESDLutronEntities = new ESDLutronEntities())
                {
                    //// Declare list to instert device in DB
                    List <BACnetDevice>        loInsertBACnetDeviceList    = new List <BACnetDevice>();
                    List <BACnetDeviceMapping> loInsertBACnetDeviceMapping = new List <BACnetDeviceMapping>();

                    //// Remove all exists device on each application run
                    loESDLutronEntities.BACnetDevices.RemoveRange(loESDLutronEntities.BACnetDevices.AsEnumerable());
                    loESDLutronEntities.BACnetDeviceMappings.RemoveRange(loESDLutronEntities.BACnetDeviceMappings.AsEnumerable());

                    foreach (var loBacnetDevice in loBACnetDeviceModel.loBACnetDeviceList)
                    {
                        //// Get all bacnet object available for device
                        IList <BacnetValue> loObjectValueList;
                        moBacnetClient.ReadPropertyRequest(loBacnetDevice.loBACnetAddress, new BacnetObjectId(BacnetObjectTypes.OBJECT_DEVICE, loBacnetDevice.inDeviceID), BacnetPropertyIds.PROP_OBJECT_LIST, out loObjectValueList);

                        foreach (BacnetValue loObjectValue in loObjectValueList)
                        {
                            //// Get each object's instance details and object name to store in DB
                            IList <BacnetValue> loObjectNameList;
                            moBacnetClient.ReadPropertyRequest(loBacnetDevice.loBACnetAddress,
                                                               new BacnetObjectId((BacnetObjectTypes)((BacnetObjectId)loObjectValue.Value).Type, ((BacnetObjectId)loObjectValue.Value).Instance),
                                                               BacnetPropertyIds.PROP_OBJECT_NAME, out loObjectNameList);

                            //string lsObjectType = ((BacnetObjectId)loObjectValue.Value).type.ToString();
                            //string lsObjectInstanceNumber = ((BacnetObjectId)loObjectValue.Value).Instance.ToString();

                            //// add to entity model for DB bulk insert
                            loInsertBACnetDeviceList.Add(
                                new BACnetDevice
                            {
                                network_id      = loBacnetDevice.loBACnetAddress.ToString(),
                                device_id       = Convert.ToInt32(loBacnetDevice.inDeviceID),
                                object_type     = ((BacnetObjectId)loObjectValue.Value).type.ToString(),
                                object_instance = Convert.ToInt32(((BacnetObjectId)loObjectValue.Value).Instance.ToString()),
                                object_name     = loObjectNameList != null && loObjectNameList.Count > 0 ? loObjectNameList[0].Value.ToString() : null,
                                routed_source   = loBacnetDevice.loBACnetAddress.RoutedSource.ToString(),
                                routed_net      = loBacnetDevice.loBACnetAddress.RoutedSource.net
                            });

                            int?liSuiteID = null, liRoomID = null;

                            if (((BacnetObjectId)loObjectValue.Value).type.ToString().ToUpper() == "OBJECT_ANALOG_VALUE")
                            {
                                if (Convert.ToInt32(((BacnetObjectId)loObjectValue.Value).Instance.ToString()) < 4)
                                {
                                    liSuiteID = 1;
                                }
                                else
                                {
                                    liSuiteID = 2;
                                }

                                liRoomID = Convert.ToInt32(((BacnetObjectId)loObjectValue.Value).Instance.ToString());
                            }

                            loInsertBACnetDeviceMapping.Add(
                                new BACnetDeviceMapping
                            {
                                device_id       = Convert.ToInt32(loBacnetDevice.inDeviceID),
                                object_instance = Convert.ToInt32(((BacnetObjectId)loObjectValue.Value).Instance.ToString()),
                                floor_id        = Convert.ToInt32(loBacnetDevice.inDeviceID),
                                suite_id        = liSuiteID,
                                room_id         = liRoomID,
                            });
                        }
                    }

                    //// Insert into DB (table: BACnetDevices)
                    if (loInsertBACnetDeviceList != null && loInsertBACnetDeviceList.Count > 0)
                    {
                        loESDLutronEntities.BACnetDevices.AddRange(loInsertBACnetDeviceList);
                        loESDLutronEntities.BACnetDeviceMappings.AddRange(loInsertBACnetDeviceMapping);
                        loESDLutronEntities.SaveChanges();
                    }
                }
            }
        }