internal void CompressPingDelay(DataAccess.Entity.Component component)
 {
     //If something change let's archive it
     if (component.CurrentValue != component.LastHistoricalValue)
     {
         if (component.LastHistoricalValue != null)
         {
             var delta = Math.Abs(Convert.ToDouble(component.CurrentValue) - Convert.ToDouble(component.LastHistoricalValue));
             if (delta >= Convert.ToDouble(component.Compression) | Convert.ToDouble(component.CurrentValue) == -1 | Convert.ToDouble(component.LastHistoricalValue) == -1)
             {
                 var nHistory = new DataAccess.Entity.ComponentValueHistory()
                 {
                     Component = component,
                     TimeStamp = DateTime.Now,
                     Value     = component.CurrentValue
                 };
                 DataAccess.DatabaseFacade.DatabaseManager.ComponentValueHistory.Insert(nHistory);
                 component.LastHistoricalValue   = nHistory.Value;
                 component.LastHistoricalContact = nHistory.TimeStamp;
             }
         }
         else
         {
             var nHistory = new DataAccess.Entity.ComponentValueHistory()
             {
                 Component = component,
                 TimeStamp = DateTime.Now,
                 Value     = component.CurrentValue
             };
             DataAccess.DatabaseFacade.DatabaseManager.ComponentValueHistory.Insert(nHistory);
             component.LastHistoricalValue   = nHistory.Value;
             component.LastHistoricalContact = nHistory.TimeStamp;
         }
     }
 }
 public void StartPing(RunWorkerCompletedEventHandler EndPingEventHandler, DataAccess.Entity.Component component)
 {
     worker = new BackgroundWorker();
     worker.RunWorkerCompleted += EndPingEventHandler;
     worker.DoWork             += worker_DoWork;
     worker.RunWorkerAsync(component);
 }
        public ActionResult Create(String id, FormCollection collection)
        {
            try {
                // TODO: Add insert logic here
                DataAccess.Entity.Component nComponent = new DataAccess.Entity.Component();

                nComponent.Name = "New";

                //Get the associated device
                var bSonId = new MongoDB.Bson.ObjectId(id);
                var query  = Query <HomeAutomation.DataAccess.Entity.Device> .EQ(e => e.Id, bSonId);

                nComponent.Device = DataAccess.DatabaseFacade.DatabaseManager.Devices.FindOne(query);

                nComponent.Type = DataAccess.DatabaseFacade.DatabaseManager.ComponentTypes.AsQueryable().Single(u => u.Category == collection["Type"] & u.Mode == collection["SubType"]);
                if (nComponent.Type.TemplateOptions != null)
                {
                    nComponent.Options = new Dictionary <string, string>(nComponent.Type.TemplateOptions);
                }
                nComponent.IsActive = false;

                DataAccess.DatabaseFacade.DatabaseManager.Components.Insert(nComponent);

                var device = nComponent.Device;
                device.ComponentIds.Add(new MongoDB.Driver.MongoDBRef("Component", nComponent.Id));

                DataAccess.DatabaseFacade.DatabaseManager.Devices.Save(device);

                return(RedirectToAction("Edit", new { id = nComponent.Id }));
                //return View("Edit", nComponent);
            } catch {
                return(View());
            }
        }
        private void GetSensorValue(DataAccess.Entity.Component component)
        {
            String substringXML;

            try {
                if (component.Options.ContainsKey("SensorName"))
                {
                    if (SensorsWebResponse.ContainsKey(component.Device.IPAddress))
                    {
                        substringXML = SensorsWebResponse[component.Device.IPAddress];
                    }
                    else
                    {
                        WebClient wc = new WebClient();

                        if (component.Options.ContainsKey("User"))
                        {
                            if (!String.IsNullOrEmpty(component.Options["User"]))
                            {
                                wc.Credentials = new NetworkCredential(component.Options["User"], component.Options["Password"]);//TODO - Encrypt Password
                            }
                        }

                        String str = wc.DownloadString(new Uri("https://" + component.Device.IPAddress + "/mob/?moid=ha-host&doPath=runtime.healthSystemRuntime.systemHealthInfo.numericSensorInfo"));

                        substringXML = str.Substring(str.IndexOf("<xml"), str.IndexOf("</xml>") - str.IndexOf("<xml") + 6);
                        SensorsWebResponse.Add(component.Device.IPAddress, substringXML);
                    }

                    XDocument xdoc = XDocument.Parse(substringXML);

                    var SensorsInfos = from lv1 in xdoc.Root.Descendants("{urn:vim25}HostNumericSensorInfo")
                                       select new Helpers.HostNumericSensorInfo()
                    {
                        Name = lv1.Descendants("{urn:vim25}name").FirstOrDefault().Value,
                        //UnitModifier = Convert.ToInt32(lv1.Descendants("{urn:vim25}unitModifier").FirstOrDefault().Value),
                        //BaseUnits = lv1.Descendants("{urn:vim25}baseUnits").FirstOrDefault().Value,
                        //SensorType = lv1.Descendants("{urn:vim25}sensorType").FirstOrDefault().Value,
                        CurrentReading = Convert.ToInt32(lv1.Descendants("{urn:vim25}currentReading").FirstOrDefault().Value)
                    };

                    var SensorInfo = SensorsInfos.Where(u => u.Name.Contains(component.Options["SensorName"])).FirstOrDefault();
                    if (SensorInfo != null)
                    {
                        component.SetNewValue(Math.Abs(SensorInfo.CurrentReading / 100));
                        component.LastContact = DateTime.Now;

                        CompressionManager.Instance.CompressStandard(component);
                        DataAccess.DatabaseFacade.DatabaseManager.Components.Save(component);
                    }
                }
            } catch (Exception ex) {
                var logFile = new System.IO.StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "error.log", true);
                logFile.WriteLine(ex.ToString());
                logFile.WriteLine("Adress: '" + "https://" + component.Device.IPAddress + "/mob/?moid=ha-host&doPath=runtime.healthSystemRuntime.systemHealthInfo.numericSensorInfo" + "'");
                logFile.Close();
            }
        }
        private void GetPercentageLeft(DataAccess.Entity.Component component)
        {
            if (component.Options.ContainsKey("Disk"))
            {
                var DiskToSearch          = component.Options["Disk"];
                var oldValue              = component.CurrentValue;
                ConnectionOptions options = null;

                if (component.Options.ContainsKey("User"))
                {
                    if (!String.IsNullOrEmpty(component.Options["User"]))
                    {
                        options          = new ConnectionOptions();
                        options.Username = component.Options["User"];
                        options.Password = component.Options["Password"]; //TODO Encrypt Password
                    }
                }
                ManagementScope scope;
                if (options != null)
                {
                    scope = new ManagementScope(@"\\" + component.Device.IPAddress + @"\root\cimv2", options);
                }
                else
                {
                    scope = new ManagementScope(@"\\" + component.Device.IPAddress + @"\root\cimv2");
                }
                SelectQuery query = new SelectQuery();
                query.QueryString = "SELECT * FROM Win32_LogicalDisk";
                ManagementObjectSearcher   searcher        = new ManagementObjectSearcher(scope, query);
                ManagementObjectCollection queryCollection = searcher.Get();
                foreach (ManagementObject m in queryCollection)
                {
                    if ((string)m.Properties["DeviceID"].Value == DiskToSearch)
                    {
                        component.SetNewValue(Convert.ToDouble(m.Properties["FreeSpace"].Value) / Convert.ToDouble(m.Properties["Size"].Value) * 100);
                        component.LastContact = DateTime.Now;
                        break;
                    }
                }
                CompressionManager.Instance.CompressStandard(component);
                DataAccess.DatabaseFacade.DatabaseManager.Components.Save(component);
            }
        }
        private void PingDelay(DataAccess.Entity.Component component)
        {
            var systemPing = new Ping();
            var reply      = systemPing.Send(component.Device.IPAddress);
            var oldValue   = component.CurrentValue;

            if (reply.Status == IPStatus.Success)
            {
                component.SetNewValue(reply.RoundtripTime);
                component.LastContact = DateTime.Now;
            }
            else
            {
                component.SetNewValue(-1);
                //component.LastContact = DateTime.Now;
            }

            CompressionManager.Instance.CompressPingDelay(component);

            DataAccess.DatabaseFacade.DatabaseManager.Components.Save(component);
        }
 private void GetCustomProp(DataAccess.Entity.Component component)
 {
     throw new NotImplementedException();
 }
        private void GetMemSpaceLeft(DataAccess.Entity.Component component)
        {
            var oldValue = component.CurrentValue;

            ConnectionOptions options = null;

            if (component.Options.ContainsKey("User"))
            {
                if (!String.IsNullOrEmpty(component.Options["User"]))
                {
                    options          = new ConnectionOptions();
                    options.Username = component.Options["User"];
                    options.Password = component.Options["Password"]; //TODO Encrypt Password
                }
            }
            ManagementScope scope;

            if (options != null)
            {
                scope = new ManagementScope(@"\\" + component.Device.IPAddress + @"\root\cimv2", options);
            }
            else
            {
                scope = new ManagementScope(@"\\" + component.Device.IPAddress + @"\root\cimv2");
            }
            SelectQuery query = new SelectQuery();

            query.QueryString = "SELECT * FROM Win32_OperatingSystem";
            ManagementObjectSearcher   searcher        = new ManagementObjectSearcher(scope, query);
            ManagementObjectCollection queryCollection = searcher.Get();

            foreach (ManagementObject m in queryCollection)
            {
                var value = Convert.ToDouble(m.Properties["FreePhysicalMemory"].Value);
                if (component.Options.ContainsKey("Unit"))
                {
                    switch (component.Options["Unit"])
                    {
                    case "KB":
                        break;

                    case "MB":
                        value = value / 1024;
                        break;

                    case "GB":
                        value = value / 1024 / 1024;
                        break;

                    case "TB":
                        value = value / 1024 / 1024 / 1024;
                        break;

                    default:
                        break;
                    }
                }
                component.SetNewValue(value);
                component.LastContact = DateTime.Now;

                break;
            }
            CompressionManager.Instance.CompressStandard(component);
            DataAccess.DatabaseFacade.DatabaseManager.Components.Save(component);
        }