private static RoomEnvironment CalcAvg(DateTime cursorEnd, List <RoomEnvironment> current, string k)
        {
            double tsum = 0;
            double hsum = 0;

            foreach (var cr in current)
            {
                tsum += cr.temperature;
                hsum += cr.humidity;
            }
            var avg = new RoomEnvironment()
            {
                deviceid    = k,
                temperature = tsum / current.Count,
                humidity    = hsum / current.Count,
                time        = cursorEnd
            };

            return(avg);
        }
        async Task SendData(List <RoomEnvironment> data)
        {
            double   duration   = 10000;
            TimeSpan delta10sec = TimeSpan.FromMilliseconds(duration);

            var avgs = new List <RoomEnvironment>();

            DateTime startTime = data.First().time;
            DateTime endTime   = data.Last().time;

            int      index     = 0;
            DateTime cursor    = startTime;
            DateTime cursorEnd = cursor + delta10sec;
            var      current   = new Dictionary <string, List <RoomEnvironment> >();

            while (cursor <= endTime && index < data.Count)
            {
                var re = data[index++];
                if (re.time > cursorEnd)
                {
                    foreach (var k in current.Keys)
                    {
                        if (current[k].Count > 0)
                        {
                            RoomEnvironment avg = CalcAvg(cursorEnd, current[k], k);
                            avgs.Add(avg);
                        }
                        current[k].Clear();
                    }
                    cursor     = cursorEnd;
                    cursorEnd += delta10sec;
                    current[re.deviceid].Add(re);
                }
                else
                {
                    if (!current.ContainsKey(re.deviceid))
                    {
                        current.Add(re.deviceid, new List <RoomEnvironment>());
                    }
                    current[re.deviceid].Add(re);
                }
            }
            foreach (var k in current.Keys)
            {
                if (current[k].Count > 0)
                {
                    RoomEnvironment avg = CalcAvg(cursorEnd, current[k], k);
                    avgs.Add(avg);
                }
            }
            var hubConnection = new Microsoft.AspNet.SignalR.Client.HubConnection(tbURL.Text);
            var proxy         = hubConnection.CreateHubProxy("EnvHub");
            await hubConnection.Start();

            foreach (var re in avgs)
            {
                tbData.Text = string.Format("{0}@{1}:T={2},H={3}", re.deviceid, re.time, re.temperature, re.humidity);
                await proxy.Invoke("Environment", re);

                Thread.Sleep((int)(duration / currentSpeed));
            }
            tbData.Text = "End";
        }