private string GetQueryResultFrame(DevicePersistenceData data, IFrameType frameType,
                                           QueryDuration duration, IFrameGrouping grouping)
        {
            StringBuilder stb       = new StringBuilder();
            string        iFrameUrl = null;

            HSHelper hSHelper   = new HSHelper(HS);
            string   deviceName = hSHelper.GetName(data.DeviceRefId);

            switch (frameType)
            {
            case IFrameType.TableHistory:
                var query = InfluxDbQueryBuilder.GetDeviceHistoryTabQuery(data, deviceName, duration);
                iFrameUrl = BuildTableUri(query, 10);
                break;

            case IFrameType.ChartHistory:
                var chartQuery = InfluxDbQueryBuilder.GetGroupedDeviceHistoryTabQuery(data, deviceName, duration,
                                                                                      pluginConfig.DBLoginInformation,
                                                                                      GetTimeSpan(grouping)).ResultForSync();
                iFrameUrl = BuildChartUri(chartQuery, string.Empty);
                break;

            case IFrameType.AverageStats:
                var statsQuery = InfluxDbQueryBuilder.GetStatsQuery(data, duration,
                                                                    pluginConfig.DBLoginInformation,
                                                                    GetTimeSpan(grouping)).ResultForSync();
                iFrameUrl = BuildStatsUri(statsQuery);
                break;

            case IFrameType.Histogram:
                var histogramQuery = InfluxDbQueryBuilder.GetDeviceHistogramTabQuery(data, duration, pluginConfig.DBLoginInformation).ResultForSync();
                iFrameUrl = BuildHistogramUri(histogramQuery, duration);
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(frameType));
            }
            stb.Append(@"<style>iframe{width: 1px;min-width: 100%;border: none; width: 100%; height: 475px}</style>");
            stb.Append(Invariant($"<iframe id=\"tableFrame\" src=\"{iFrameUrl}\" scrolling=\"no\"></iframe>"));
            stb.Append(Invariant($"<script>iFrameResize({{log:false}}, '#{TableFrameId}')</script>"));

            return(stb.ToString());
        }
        private static TimeSpan?GetTimeSpan(IFrameGrouping grouping)
        {
            switch (grouping)
            {
            case IFrameGrouping.Auto:
                return(null);

            case IFrameGrouping.I1s:
                return(TimeSpan.FromSeconds(1));

            case IFrameGrouping.I5s:
                return(TimeSpan.FromSeconds(5));

            case IFrameGrouping.I15s:
                return(TimeSpan.FromSeconds(15));

            case IFrameGrouping.I1m:
                return(TimeSpan.FromMinutes(1));

            case IFrameGrouping.I5m:
                return(TimeSpan.FromMinutes(5));

            case IFrameGrouping.I30m:
                return(TimeSpan.FromMinutes(30));

            case IFrameGrouping.I1h:
                return(TimeSpan.FromHours(1));

            case IFrameGrouping.I12h:
                return(TimeSpan.FromHours(12));

            case IFrameGrouping.I1d:
                return(TimeSpan.FromDays(1));

            default:
                throw new ArgumentOutOfRangeException(nameof(grouping));
            }
        }
        public string GetDeviceHistoryTab(int refId)
        {
            var dataKeyPair = pluginConfig.DevicePersistenceData.FirstOrDefault(x => x.Value.DeviceRefId == refId);
            var data        = dataKeyPair.Value;

            if ((data != null) && !string.IsNullOrWhiteSpace(pluginConfig.DBLoginInformation.DB))
            {
                bool           hasNumericData   = !string.IsNullOrWhiteSpace(data.Field);
                IFrameType     DefaultFrameType = hasNumericData ? IFrameType.ChartHistory : IFrameType.TableHistory;
                QueryDuration  DefaultDuration  = QueryDuration.D6h;
                IFrameGrouping DefaultGrouping  = IFrameGrouping.Auto;
                StringBuilder  stb = new StringBuilder();
                IncludeDataTableFiles(stb);
                IncludeResourceScript(stb, "iframeSizer.min.js");

                stb.Append(@"<table style='width:100%;border-spacing:0px;'");
                stb.Append("<tr height='5'><td></td></tr>");
                stb.Append("<tr><td>");
                stb.Append("Type:");

                NameValueCollection iframeType = new NameValueCollection();
                AddEnumValue(iframeType, IFrameType.TableHistory);
                if (hasNumericData)
                {
                    AddEnumValue(iframeType, IFrameType.ChartHistory);
                    AddEnumValue(iframeType, IFrameType.AverageStats);
                }

                stb.Append(FormDropDown(IFrameTypeId, iframeType, DefaultFrameType.ToString(),
                                        150, string.Empty, true, DeviceUtiltyPageName));

                stb.Append("&nbsp;Duration:");
                NameValueCollection duration = CreateNameValueCreation <QueryDuration>();
                stb.Append(FormDropDown(IFrameDurationId, duration, DefaultDuration.ToString(),
                                        100, string.Empty, true, DeviceUtiltyPageName));

                stb.Append("&nbsp;Grouping:");
                NameValueCollection grouping = CreateNameValueCreation <IFrameGrouping>();
                stb.Append(FormDropDown(IFrameGroupingId, grouping, DefaultGrouping.ToString(),
                                        100, string.Empty, true, DeviceUtiltyPageName, hasNumericData));

                stb.Append("</td></tr>");
                stb.Append("<tr height='5'><td></td></tr>");

                stb.Append("<tr><td class='tablecell'>");
                stb.Append(DivStart(resultsDivPartId, string.Empty));
                stb.Append(GetQueryResultFrame(data, DefaultFrameType, DefaultDuration, DefaultGrouping));
                stb.Append(DivEnd());

                stb.Append("</td></tr>");
                stb.Append("<tr height='5'><td></td></tr>");
                stb.Append("<tr><td>");
                stb.Append(PageTypeButton(Invariant($"Edit{data.Id}"), "Edit", EditDevicePageType, id: data.Id));
                stb.Append("&nbsp;");
                stb.Append(PageTypeButton(Invariant($"Queries{data.Id}"), "More Queries", HistoryDevicePageType, id: data.Id));
                stb.Append("&nbsp;");
                stb.Append(FormButton(DoneButtonId, "Done", string.Empty, DeviceUtiltyPageName));
                stb.Append("</td></tr>");
                stb.Append("</table>");

                return(stb.ToString());
            }

            return(string.Empty);
        }