{"id":967,"date":"2025-12-05T15:52:01","date_gmt":"2025-12-05T14:52:01","guid":{"rendered":"https:\/\/www.silverice.it\/IpercubeTechWP1\/?page_id=967"},"modified":"2025-12-05T15:52:01","modified_gmt":"2025-12-05T14:52:01","slug":"ups-helper","status":"publish","type":"page","link":"https:\/\/www.silverice.it\/IpercubeTechWP1\/vb-classes\/ups-helper\/","title":{"rendered":"Ups Helper"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Provides helper functions to interact with UPS devices via the external tool\u00a0<strong>upsc.exe<\/strong>\u00a0, part of NUT (Network UPS Tools).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The required\u00a0<strong>upsc.exe<\/strong>\u00a0and additional DLL can be imported in the project via the NuGet package\u00a0<strong>Ipercube.NUT.Ups.Query<\/strong>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Relies on the presence of\u00a0<strong>upsc.exe<\/strong>\u00a0in the current working directory.<\/li>\n\n\n\n<li>Used to query status and parameters of network-connected UPS devices.<\/li>\n\n\n\n<li>Supports extraction and display of key UPS metrics.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:75%\">\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column page-snippet is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Geist-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-Geist-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(3 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">VB<\/span><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Imports System.IO\nImports System.Text\n\nPublic NotInheritable Class UpsHelper\n\n    ''' &lt;summary>\n    ''' Executes &lt;c>upsc.exe&lt;\/c> for the given UPS name and returns all key\/value\n    ''' pairs as a dictionary.\n    ''' &lt;\/summary>\n    ''' &lt;category>Methods&lt;\/category>\n    ''' &lt;param name=\"upsName\">UPS name, e.g. &lt;c>\"apcups@10.69.1.42\"&lt;\/c>.&lt;\/param>\n    ''' &lt;returns>A &lt;c>Dictionary(Of String, String)&lt;\/c> with all available key\/value pairs.&lt;\/returns>\n    ''' &lt;remarks>\n    ''' &lt;list type=\"bullet\">\n    '''   &lt;item>&lt;description>Throws an exception if &lt;c>upsc.exe&lt;\/c> is missing or execution fails.&lt;\/description>&lt;\/item>\n    '''   &lt;item>&lt;description>Output is parsed line by line; expected format is &lt;c>key: value&lt;\/c>.&lt;\/description>&lt;\/item>\n    '''   &lt;item>&lt;description>If a line has no colon, it is treated as a key with empty value.&lt;\/description>&lt;\/item>\n    '''   &lt;item>&lt;description>In case of duplicate keys, the last occurrence overwrites the previous one.&lt;\/description>&lt;\/item>\n    ''' &lt;\/list>\n    ''' &lt;\/remarks>\n    Public Shared Function GetUpsInfo(upsName As String) As Dictionary(Of String, String)\n\n        If String.IsNullOrWhiteSpace(upsName) Then\n            Throw New ArgumentException(\"UPS name is empty.\", NameOf(upsName))\n        End If\n\n        If Not File.Exists(\"upsc.exe\") Then\n            Throw New FileNotFoundException(\"upsc.exe not found.\", \"upsc.exe\")\n        End If\n\n        Dim psi As New ProcessStartInfo() With {\n            .FileName = \"upsc.exe\",\n            .Arguments = upsName,\n            .UseShellExecute = False,\n            .RedirectStandardOutput = True,\n            .RedirectStandardError = True,\n            .CreateNoWindow = True\n        }\n\n        Dim output As String\n        Dim err As String\n\n        Using proc As New Process()\n            proc.StartInfo = psi\n\n            If Not proc.Start() Then\n                Throw New InvalidOperationException(\"Unable to start upsc.exe process.\")\n            End If\n\n            output = proc.StandardOutput.ReadToEnd()\n            err = proc.StandardError.ReadToEnd()\n\n            proc.WaitForExit()\n            Dim exitCode As Integer = proc.ExitCode\n\n            If exitCode &lt;> 0 Then\n                Dim msg As New StringBuilder()\n                msg.AppendLine(\"upsc.exe returned a non-zero exit code: \" &amp; exitCode.ToString())\n\n                If Not String.IsNullOrWhiteSpace(err) Then\n                    msg.AppendLine()\n                    msg.AppendLine(\"Error output:\")\n                    msg.AppendLine(err.Trim())\n                End If\n\n                Throw New ApplicationException(msg.ToString())\n            End If\n        End Using\n\n        If String.IsNullOrWhiteSpace(output) Then\n            Throw New ApplicationException(\"upsc.exe returned no data.\")\n        End If\n\n        Dim result As New Dictionary(Of String, String)(StringComparer.OrdinalIgnoreCase)\n\n        Dim lines() As String = output.Replace(vbCrLf, vbLf).Split(ControlChars.Lf)\n        For Each rawLine As String In lines\n            Dim line As String = rawLine.Trim()\n            If line.Length = 0 Then Continue For\n\n            ' Expected format: key: value\n            Dim idx As Integer = line.IndexOf(\":\"c)\n            If idx &lt;= 0 Then\n                ' Line without ':' -> store whole line as key with empty value\n                If Not result.ContainsKey(line) Then\n                    result(line) = String.Empty\n                End If\n            Else\n                Dim key As String = line.Substring(0, idx).Trim()\n                Dim value As String = line.Substring(idx + 1).Trim()\n                If Not result.ContainsKey(key) Then\n                    result(key) = value\n                Else\n                    ' In case of duplicated keys, you might want to append or overwrite.\n                    ' Here we overwrite with the last occurrence.\n                    result(key) = value\n                End If\n            End If\n        Next\n\n        Return result\n    End Function\n\n    ''' &lt;summary>\n    ''' Executes &lt;c>upsc.exe&lt;\/c> for the given UPS name and shows all key\/value pairs\n    ''' in a MessageBox, one per line. Some important keys are shown first.\n    ''' &lt;\/summary>\n    ''' &lt;category>Methods&lt;\/category>\n    ''' &lt;param name=\"upsName\">UPS name, e.g. &lt;c>\"apcups@10.69.1.42\"&lt;\/c>.&lt;\/param>\n    ''' &lt;remarks>\n    ''' &lt;list type=\"bullet\">\n    '''   &lt;item>&lt;description>Uses &lt;c>GetUpsInfo&lt;\/c> to extract data from the UPS device.&lt;\/description>&lt;\/item>\n    '''   &lt;item>&lt;description>Important keys like battery charge, voltage, and status are shown at the top.&lt;\/description>&lt;\/item>\n    '''   &lt;item>&lt;description>Remaining keys are sorted alphabetically and shown below.&lt;\/description>&lt;\/item>\n    '''   &lt;item>&lt;description>All values are formatted with units when recognized.&lt;\/description>&lt;\/item>\n    '''   &lt;item>&lt;description>Displays the result in a styled HTML MessageBox using &lt;c>ShowMessageBoxEx&lt;\/c>.&lt;\/description>&lt;\/item>\n    ''' &lt;\/list>\n    ''' &lt;\/remarks>\n    Public Shared Sub ShowUpsInfo(upsName As String)\n        Dim info As Dictionary(Of String, String)\n\n        Try\n            info = GetUpsInfo(upsName)\n        Catch ex As Exception\n            ShowMessageBoxEx(ex.Message, \"UPS info - Error\",\n                        CustomButtons.Ok, CustomIcon.ErrorBug)\n            Return\n        End Try\n\n        If info Is Nothing OrElse info.Count = 0 Then\n            ShowMessageBoxEx(\"No data returned from upsc.exe.\", \"UPS info\",\n                        CustomButtons.Ok, CustomIcon.ErrorBug)\n            Return\n        End If\n\n        ' Important keys to show first (if present)\n        Dim importantKeys As String() = {\n                                            \"ups.mfr\",\n                                            \"ups.model\",\n                                            \"ups.status\",\n                                            \"battery.charge\",\n                                            \"battery.runtime\",\n                                            \"ups.load\",\n                                            \"input.voltage\",\n                                            \"input.frequency\",\n                                            \"battery.voltage\",\n                                            \"ups.realpower.nominal\",\n                                            \"ups.delay.shutdown\"\n                                        }\n\n        Dim sb As New StringBuilder()\n        sb.AppendLine(\"Key\" &amp; vbTab &amp; \"Value\")\n\n        ' Track printed keys so they are not duplicated later\n        Dim printed As New HashSet(Of String)(StringComparer.OrdinalIgnoreCase)\n\n        ' 1) Print important keys (in fixed order)\n        For Each k As String In importantKeys\n            Dim value As String = Nothing\n            If info.TryGetValue(k, value) Then\n                value = AddUnitOfMeasure(k, value)\n                sb.AppendLine(k &amp; vbTab &amp; value)\n                printed.Add(k)\n            End If\n        Next\n\n        ' 3) Print all keys alphabetically, skipping the already printed ones\n        Dim allKeys As List(Of String) = info.Keys.ToList()\n        allKeys.Sort(StringComparer.OrdinalIgnoreCase)\n\n        For Each k As String In allKeys\n            If printed.Contains(k) Then Continue For\n\n            Dim v As String = info(k)\n            v = AddUnitOfMeasure(k, v)\n            sb.AppendLine(k &amp; vbTab &amp; v)\n        Next\n\n        Dim caption As String = \"UPS status - \" &amp; upsName\n\n        ShowMessageBoxEx(\n            ConvertTabbedString2HtmlPage(sb.ToString()),\n            caption,\n            CustomButtons.Ok,\n            CustomIcon.Statistics,\n            layoutKey:=\"ShowUpsInfo\"\n        )\n\n    End Sub\n\n    Private Shared Function AddUnitOfMeasure(Key As String, ByVal value As String) As String\n\n        Select Case Key\n            Case \"battery.runtime\"\n                Dim totalSeconds As Integer\n\n                If Integer.TryParse(Convert.ToString(value), totalSeconds) Then\n                    Dim hours As Integer = totalSeconds \\ 3600\n                    Dim minutes As Integer = totalSeconds \\ 60\n                    Dim seconds As Integer = totalSeconds Mod 60\n                    If totalSeconds &lt; 3600 Then\n                        value = $\"{minutes:00}:{seconds:00} (mm:ss)\"\n                    Else\n                        value = $\"{hours}:{minutes:00}:{seconds:00} (hh:mm:ss)\"\n                    End If\n                Else\n                    value = \"00:00\"\n                End If\n            Case \"battery.voltage.nominal\", \"input.voltage.nominal\", \"input.voltage\", \"battery.voltage\", \"input.transfer.high\", \"input.transfer.low\"\n                value += \" Volt\"\n            Case \"ups.realpower.nominal\"\n                value += \" Watt\"\n            Case \"ups.load\", \"battery.charge.low\", \"battery.charge.warning\", \"battery.charge\"\n                value += \"%\"\n            Case \"ups.delay.shutdown\", \"battery.runtime.low\", \"ups.timer.reboot\", \"driver.parameter.pollfreq\", \"driver.parameter.pollinterval\"\n                value += \" sec\"\n            Case \"ups.timer.shutdown\"\n                value = If(value.Trim = \"-1\", \"Disabled\", value &amp; \" sec\")\n            Case \"ups.status\"\n                Select Case value\n                    Case \"OL\" : value = \"On Line, AC power is available\"\n                    Case \"OB\" : value = \"Running on Battery\"\n                    Case \"LB\" : value = \"Battery level LOW\"\n                    Case \"FSD\" : value = \"Forced Shutdown\"\n                    Case Else\n                        If value.Contains(\"OB\") And value.Contains(\"OL\") Then\n                            value = \"Running on Battery, Battery level LOW\"\n                        Else\n                            value = \"Unknown status: \" &amp; value\n                        End If\n                End Select\n        End Select\n\n        Return value\n    End Function\n\nEnd Class\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">Imports System.IO<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Imports System.Text<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">Public<\/span><span style=\"color: #D4D4D4\"> NotInheritable<\/span><span style=\"color: #569CD6\"> Class <\/span><span style=\"color: #D4D4D4\">UpsHelper<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;summary&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; Executes &lt;c&gt;upsc.exe&lt;\/c&gt; for the given UPS name and returns all key\/value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; pairs as a dictionary.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;\/summary&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;category&gt;Methods&lt;\/category&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;param name=&quot;upsName&quot;&gt;UPS name, e.g. &lt;c&gt;&quot;apcups@10.69.1.42&quot;&lt;\/c&gt;.&lt;\/param&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;returns&gt;A &lt;c&gt;Dictionary(Of String, String)&lt;\/c&gt; with all available key\/value pairs.&lt;\/returns&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;remarks&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;list type=&quot;bullet&quot;&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39;   &lt;item&gt;&lt;description&gt;Throws an exception if &lt;c&gt;upsc.exe&lt;\/c&gt; is missing or execution fails.&lt;\/description&gt;&lt;\/item&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39;   &lt;item&gt;&lt;description&gt;Output is parsed line by line; expected format is &lt;c&gt;key: value&lt;\/c&gt;.&lt;\/description&gt;&lt;\/item&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39;   &lt;item&gt;&lt;description&gt;If a line has no colon, it is treated as a key with empty value.&lt;\/description&gt;&lt;\/item&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39;   &lt;item&gt;&lt;description&gt;In case of duplicate keys, the last occurrence overwrites the previous one.&lt;\/description&gt;&lt;\/item&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;\/list&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;\/remarks&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">Public<\/span><span style=\"color: #D4D4D4\"> Shared<\/span><span style=\"color: #569CD6\"> Function <\/span><span style=\"color: #DCDCAA\">GetUpsInfo<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">upsName<\/span><span style=\"color: #D4D4D4\"> As <\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\">) As <\/span><span style=\"color: #4EC9B0\">Dictionary<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">Of<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">String<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #9CDCFE\"> String<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">If<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">String<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">IsNullOrWhiteSpace<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">upsName<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #C586C0\">Then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            Throw<\/span><span style=\"color: #569CD6\"> New <\/span><span style=\"color: #DCDCAA\">ArgumentException<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;UPS name is empty.&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #DCDCAA\">NameOf<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">upsName<\/span><span style=\"color: #D4D4D4\">))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">End If<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">If<\/span><span style=\"color: #D4D4D4\"> Not File.<\/span><span style=\"color: #DCDCAA\">Exists<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;upsc.exe&quot;<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #C586C0\">Then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            Throw<\/span><span style=\"color: #569CD6\"> New <\/span><span style=\"color: #DCDCAA\">FileNotFoundException<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;upsc.exe not found.&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;upsc.exe&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">End If<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> psi <\/span><span style=\"color: #D4D4D4\">As<\/span><span style=\"color: #569CD6\"> New <\/span><span style=\"color: #DCDCAA\">ProcessStartInfo<\/span><span style=\"color: #D4D4D4\">() <\/span><span style=\"color: #C586C0\">With<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            .<\/span><span style=\"color: #9CDCFE\">FileName<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;upsc.exe&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            .<\/span><span style=\"color: #9CDCFE\">Arguments<\/span><span style=\"color: #D4D4D4\"> =<\/span><span style=\"color: #9CDCFE\"> upsName<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            .<\/span><span style=\"color: #9CDCFE\">UseShellExecute<\/span><span style=\"color: #D4D4D4\"> =<\/span><span style=\"color: #569CD6\"> False<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            .<\/span><span style=\"color: #9CDCFE\">RedirectStandardOutput<\/span><span style=\"color: #D4D4D4\"> =<\/span><span style=\"color: #569CD6\"> True<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            .<\/span><span style=\"color: #9CDCFE\">RedirectStandardError<\/span><span style=\"color: #D4D4D4\"> =<\/span><span style=\"color: #569CD6\"> True<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            .<\/span><span style=\"color: #9CDCFE\">CreateNoWindow<\/span><span style=\"color: #D4D4D4\"> =<\/span><span style=\"color: #569CD6\"> True<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> output <\/span><span style=\"color: #D4D4D4\">As <\/span><span style=\"color: #4EC9B0\">String<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> err <\/span><span style=\"color: #D4D4D4\">As <\/span><span style=\"color: #4EC9B0\">String<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        Using proc As<\/span><span style=\"color: #569CD6\"> New <\/span><span style=\"color: #DCDCAA\">Process<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            proc.<\/span><span style=\"color: #9CDCFE\">StartInfo<\/span><span style=\"color: #D4D4D4\"> =<\/span><span style=\"color: #9CDCFE\"> psi<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">If<\/span><span style=\"color: #D4D4D4\"> Not proc.<\/span><span style=\"color: #DCDCAA\">Start<\/span><span style=\"color: #D4D4D4\">() <\/span><span style=\"color: #C586C0\">Then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                Throw<\/span><span style=\"color: #569CD6\"> New <\/span><span style=\"color: #DCDCAA\">InvalidOperationException<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Unable to start upsc.exe process.&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">End If<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">output<\/span><span style=\"color: #D4D4D4\"> = proc.StandardOutput.<\/span><span style=\"color: #DCDCAA\">ReadToEnd<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">err<\/span><span style=\"color: #D4D4D4\"> = proc.StandardError.<\/span><span style=\"color: #DCDCAA\">ReadToEnd<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            proc.<\/span><span style=\"color: #DCDCAA\">WaitForExit<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> exitCode <\/span><span style=\"color: #D4D4D4\">As <\/span><span style=\"color: #4EC9B0\">Integer<\/span><span style=\"color: #D4D4D4\"> = proc.ExitCode<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">If<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">exitCode<\/span><span style=\"color: #D4D4D4\"> &lt;&gt; <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">Then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> msg <\/span><span style=\"color: #D4D4D4\">As<\/span><span style=\"color: #569CD6\"> New <\/span><span style=\"color: #DCDCAA\">StringBuilder<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                msg.<\/span><span style=\"color: #DCDCAA\">AppendLine<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;upsc.exe returned a non-zero exit code: &quot;<\/span><span style=\"color: #D4D4D4\"> &amp; exitCode.<\/span><span style=\"color: #DCDCAA\">ToString<\/span><span style=\"color: #D4D4D4\">())<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #C586C0\">If<\/span><span style=\"color: #D4D4D4\"> Not <\/span><span style=\"color: #DCDCAA\">String<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">IsNullOrWhiteSpace<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">err<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #C586C0\">Then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    msg.<\/span><span style=\"color: #DCDCAA\">AppendLine<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    msg.<\/span><span style=\"color: #DCDCAA\">AppendLine<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Error output:&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    msg.<\/span><span style=\"color: #DCDCAA\">AppendLine<\/span><span style=\"color: #D4D4D4\">(err.<\/span><span style=\"color: #DCDCAA\">Trim<\/span><span style=\"color: #D4D4D4\">())<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #C586C0\">End If<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                Throw<\/span><span style=\"color: #569CD6\"> New <\/span><span style=\"color: #DCDCAA\">ApplicationException<\/span><span style=\"color: #D4D4D4\">(msg.<\/span><span style=\"color: #DCDCAA\">ToString<\/span><span style=\"color: #D4D4D4\">())<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">End If<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #DCDCAA\">End<\/span><span style=\"color: #D4D4D4\"> Using<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">If<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">String<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">IsNullOrWhiteSpace<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">output<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #C586C0\">Then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            Throw<\/span><span style=\"color: #569CD6\"> New <\/span><span style=\"color: #DCDCAA\">ApplicationException<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;upsc.exe returned no data.&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">End If<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> result <\/span><span style=\"color: #D4D4D4\">As<\/span><span style=\"color: #569CD6\"> New <\/span><span style=\"color: #DCDCAA\">Dictionary<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">Of<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">String<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #9CDCFE\"> String<\/span><span style=\"color: #D4D4D4\">)(StringComparer.<\/span><span style=\"color: #9CDCFE\">OrdinalIgnoreCase<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> lines<\/span><span style=\"color: #D4D4D4\">() As <\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\"> = output.<\/span><span style=\"color: #DCDCAA\">Replace<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4EC9B0\">vbCrLf<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #9CDCFE\"> vbLf<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">Split<\/span><span style=\"color: #D4D4D4\">(ControlChars.<\/span><span style=\"color: #9CDCFE\">Lf<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">For<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">Each<\/span><span style=\"color: #D4D4D4\"> rawLine As <\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\"> In lines<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> line <\/span><span style=\"color: #D4D4D4\">As <\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\"> = rawLine.<\/span><span style=\"color: #DCDCAA\">Trim<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">If<\/span><span style=\"color: #D4D4D4\"> line.<\/span><span style=\"color: #9CDCFE\">Length<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">Then<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">Continue<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">For<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #6A9955\">&#39; Expected format: key: value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> idx <\/span><span style=\"color: #D4D4D4\">As <\/span><span style=\"color: #4EC9B0\">Integer<\/span><span style=\"color: #D4D4D4\"> = line.<\/span><span style=\"color: #DCDCAA\">IndexOf<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;:&quot;<\/span><span style=\"color: #9CDCFE\">c<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">If<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">idx<\/span><span style=\"color: #D4D4D4\"> &lt;= <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">Then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #6A9955\">&#39; Line without &#39;:&#39; -&gt; store whole line as key with empty value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #C586C0\">If<\/span><span style=\"color: #D4D4D4\"> Not result.<\/span><span style=\"color: #DCDCAA\">ContainsKey<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">line<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #C586C0\">Then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #DCDCAA\">result<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">line<\/span><span style=\"color: #D4D4D4\">) = <\/span><span style=\"color: #DCDCAA\">String<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #569CD6\">Empty<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #C586C0\">End If<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">Else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> key <\/span><span style=\"color: #D4D4D4\">As <\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\"> = line.<\/span><span style=\"color: #DCDCAA\">Substring<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #9CDCFE\"> idx<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">Trim<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> value <\/span><span style=\"color: #D4D4D4\">As <\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\"> = line.<\/span><span style=\"color: #DCDCAA\">Substring<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">idx<\/span><span style=\"color: #D4D4D4\"> + <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">).<\/span><span style=\"color: #DCDCAA\">Trim<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #C586C0\">If<\/span><span style=\"color: #D4D4D4\"> Not result.<\/span><span style=\"color: #DCDCAA\">ContainsKey<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">key<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #C586C0\">Then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #DCDCAA\">result<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">key<\/span><span style=\"color: #D4D4D4\">) =<\/span><span style=\"color: #9CDCFE\"> value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #C586C0\">Else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #6A9955\">&#39; In case of duplicated keys, you might want to append or overwrite.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #6A9955\">&#39; Here we overwrite with the last occurrence.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #DCDCAA\">result<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">key<\/span><span style=\"color: #D4D4D4\">) =<\/span><span style=\"color: #9CDCFE\"> value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #C586C0\">End If<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">End If<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">Next<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">Return<\/span><span style=\"color: #D4D4D4\"> result<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">End Function<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;summary&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; Executes &lt;c&gt;upsc.exe&lt;\/c&gt; for the given UPS name and shows all key\/value pairs<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; in a MessageBox, one per line. Some important keys are shown first.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;\/summary&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;category&gt;Methods&lt;\/category&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;param name=&quot;upsName&quot;&gt;UPS name, e.g. &lt;c&gt;&quot;apcups@10.69.1.42&quot;&lt;\/c&gt;.&lt;\/param&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;remarks&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;list type=&quot;bullet&quot;&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39;   &lt;item&gt;&lt;description&gt;Uses &lt;c&gt;GetUpsInfo&lt;\/c&gt; to extract data from the UPS device.&lt;\/description&gt;&lt;\/item&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39;   &lt;item&gt;&lt;description&gt;Important keys like battery charge, voltage, and status are shown at the top.&lt;\/description&gt;&lt;\/item&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39;   &lt;item&gt;&lt;description&gt;Remaining keys are sorted alphabetically and shown below.&lt;\/description&gt;&lt;\/item&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39;   &lt;item&gt;&lt;description&gt;All values are formatted with units when recognized.&lt;\/description&gt;&lt;\/item&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39;   &lt;item&gt;&lt;description&gt;Displays the result in a styled HTML MessageBox using &lt;c&gt;ShowMessageBoxEx&lt;\/c&gt;.&lt;\/description&gt;&lt;\/item&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;\/list&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #6A9955\">&#39;&#39;&#39; &lt;\/remarks&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">Public<\/span><span style=\"color: #D4D4D4\"> Shared<\/span><span style=\"color: #569CD6\"> Sub <\/span><span style=\"color: #DCDCAA\">ShowUpsInfo<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">upsName<\/span><span style=\"color: #D4D4D4\"> As <\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> info <\/span><span style=\"color: #D4D4D4\">As <\/span><span style=\"color: #4EC9B0\">Dictionary<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">Of<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">String<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #9CDCFE\"> String<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        Try<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">info<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">GetUpsInfo<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">upsName<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        Catch ex As <\/span><span style=\"color: #4EC9B0\">Exception<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">ShowMessageBoxEx<\/span><span style=\"color: #D4D4D4\">(ex.Message, <\/span><span style=\"color: #CE9178\">&quot;UPS info - Error&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                        CustomButtons.Ok, CustomIcon.<\/span><span style=\"color: #9CDCFE\">ErrorBug<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">Return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #DCDCAA\">End<\/span><span style=\"color: #D4D4D4\"> Try<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">If<\/span><span style=\"color: #D4D4D4\"> info Is<\/span><span style=\"color: #569CD6\"> Nothing<\/span><span style=\"color: #D4D4D4\"> OrElse info.<\/span><span style=\"color: #9CDCFE\">Count<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">Then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">ShowMessageBoxEx<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;No data returned from upsc.exe.&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;UPS info&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                        CustomButtons.Ok, CustomIcon.<\/span><span style=\"color: #9CDCFE\">ErrorBug<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">Return<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">End If<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">&#39; Important keys to show first (if present)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> importantKeys <\/span><span style=\"color: #D4D4D4\">As <\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\">() = {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                            <\/span><span style=\"color: #CE9178\">&quot;ups.mfr&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                            <\/span><span style=\"color: #CE9178\">&quot;ups.model&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                            <\/span><span style=\"color: #CE9178\">&quot;ups.status&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                            <\/span><span style=\"color: #CE9178\">&quot;battery.charge&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                            <\/span><span style=\"color: #CE9178\">&quot;battery.runtime&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                            <\/span><span style=\"color: #CE9178\">&quot;ups.load&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                            <\/span><span style=\"color: #CE9178\">&quot;input.voltage&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                            <\/span><span style=\"color: #CE9178\">&quot;input.frequency&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                            <\/span><span style=\"color: #CE9178\">&quot;battery.voltage&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                            <\/span><span style=\"color: #CE9178\">&quot;ups.realpower.nominal&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                            <\/span><span style=\"color: #CE9178\">&quot;ups.delay.shutdown&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                                        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> sb <\/span><span style=\"color: #D4D4D4\">As<\/span><span style=\"color: #569CD6\"> New <\/span><span style=\"color: #DCDCAA\">StringBuilder<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        sb.<\/span><span style=\"color: #DCDCAA\">AppendLine<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Key&quot;<\/span><span style=\"color: #D4D4D4\"> &amp;<\/span><span style=\"color: #9CDCFE\"> vbTab<\/span><span style=\"color: #D4D4D4\"> &amp; <\/span><span style=\"color: #CE9178\">&quot;Value&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">&#39; Track printed keys so they are not duplicated later<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> printed <\/span><span style=\"color: #D4D4D4\">As<\/span><span style=\"color: #569CD6\"> New <\/span><span style=\"color: #DCDCAA\">HashSet<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">Of<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">String<\/span><span style=\"color: #D4D4D4\">)(StringComparer.<\/span><span style=\"color: #9CDCFE\">OrdinalIgnoreCase<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">&#39; 1) Print important keys (in fixed order)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">For<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">Each<\/span><span style=\"color: #D4D4D4\"> k As <\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\"> In importantKeys<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> value <\/span><span style=\"color: #D4D4D4\">As <\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\"> =<\/span><span style=\"color: #569CD6\"> Nothing<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">If<\/span><span style=\"color: #D4D4D4\"> info.<\/span><span style=\"color: #DCDCAA\">TryGetValue<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">k<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #9CDCFE\"> value<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #C586C0\">Then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">value<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">AddUnitOfMeasure<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">k<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #9CDCFE\"> value<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                sb.<\/span><span style=\"color: #DCDCAA\">AppendLine<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">k<\/span><span style=\"color: #D4D4D4\"> &amp;<\/span><span style=\"color: #9CDCFE\"> vbTab<\/span><span style=\"color: #D4D4D4\"> &amp;<\/span><span style=\"color: #9CDCFE\"> value<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                printed.<\/span><span style=\"color: #DCDCAA\">Add<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">k<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">End If<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">Next<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\">&#39; 3) Print all keys alphabetically, skipping the already printed ones<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> allKeys <\/span><span style=\"color: #D4D4D4\">As <\/span><span style=\"color: #4EC9B0\">List<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">Of<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">String<\/span><span style=\"color: #D4D4D4\">) = info.<\/span><span style=\"color: #DCDCAA\">Keys<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">ToList<\/span><span style=\"color: #D4D4D4\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        allKeys.<\/span><span style=\"color: #DCDCAA\">Sort<\/span><span style=\"color: #D4D4D4\">(StringComparer.<\/span><span style=\"color: #9CDCFE\">OrdinalIgnoreCase<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">For<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">Each<\/span><span style=\"color: #D4D4D4\"> k As <\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\"> In allKeys<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">If<\/span><span style=\"color: #D4D4D4\"> printed.<\/span><span style=\"color: #DCDCAA\">Contains<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">k<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #C586C0\">Then<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">Continue<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">For<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> v <\/span><span style=\"color: #D4D4D4\">As <\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">info<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">k<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #9CDCFE\">v<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #DCDCAA\">AddUnitOfMeasure<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">k<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #9CDCFE\"> v<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            sb.<\/span><span style=\"color: #DCDCAA\">AppendLine<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">k<\/span><span style=\"color: #D4D4D4\"> &amp;<\/span><span style=\"color: #9CDCFE\"> vbTab<\/span><span style=\"color: #D4D4D4\"> &amp;<\/span><span style=\"color: #9CDCFE\"> v<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">Next<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> caption <\/span><span style=\"color: #D4D4D4\">As <\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;UPS status - &quot;<\/span><span style=\"color: #D4D4D4\"> &amp;<\/span><span style=\"color: #9CDCFE\"> upsName<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #DCDCAA\">ShowMessageBoxEx<\/span><span style=\"color: #D4D4D4\">(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">ConvertTabbedString2HtmlPage<\/span><span style=\"color: #D4D4D4\">(sb.<\/span><span style=\"color: #DCDCAA\">ToString<\/span><span style=\"color: #D4D4D4\">()),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            caption,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            CustomButtons.Ok,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            CustomIcon.Statistics,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            layoutKey:=<\/span><span style=\"color: #CE9178\">&quot;ShowUpsInfo&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        )<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">End Sub<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">Private<\/span><span style=\"color: #D4D4D4\"> Shared<\/span><span style=\"color: #569CD6\"> Function <\/span><span style=\"color: #DCDCAA\">AddUnitOfMeasure<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">Key<\/span><span style=\"color: #D4D4D4\"> As <\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #9CDCFE\"> ByVal<\/span><span style=\"color: #D4D4D4\"> value As <\/span><span style=\"color: #4EC9B0\">String<\/span><span style=\"color: #D4D4D4\">) As <\/span><span style=\"color: #4EC9B0\">String<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">Select<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">Case<\/span><span style=\"color: #D4D4D4\"> Key<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">Case<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;battery.runtime&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> totalSeconds <\/span><span style=\"color: #D4D4D4\">As <\/span><span style=\"color: #4EC9B0\">Integer<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #C586C0\">If<\/span><span style=\"color: #D4D4D4\"> Integer.<\/span><span style=\"color: #DCDCAA\">TryParse<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #DCDCAA\">Convert<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">ToString<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">value<\/span><span style=\"color: #D4D4D4\">),<\/span><span style=\"color: #9CDCFE\"> totalSeconds<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #C586C0\">Then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> hours <\/span><span style=\"color: #D4D4D4\">As <\/span><span style=\"color: #4EC9B0\">Integer<\/span><span style=\"color: #D4D4D4\"> =<\/span><span style=\"color: #9CDCFE\"> totalSeconds<\/span><span style=\"color: #D4D4D4\"> \\ <\/span><span style=\"color: #B5CEA8\">3600<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> minutes <\/span><span style=\"color: #D4D4D4\">As <\/span><span style=\"color: #4EC9B0\">Integer<\/span><span style=\"color: #D4D4D4\"> =<\/span><span style=\"color: #9CDCFE\"> totalSeconds<\/span><span style=\"color: #D4D4D4\"> \\ <\/span><span style=\"color: #B5CEA8\">60<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #569CD6\">Dim<\/span><span style=\"color: #9CDCFE\"> seconds <\/span><span style=\"color: #D4D4D4\">As <\/span><span style=\"color: #4EC9B0\">Integer<\/span><span style=\"color: #D4D4D4\"> =<\/span><span style=\"color: #9CDCFE\"> totalSeconds<\/span><span style=\"color: #D4D4D4\"> Mod <\/span><span style=\"color: #B5CEA8\">60<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #C586C0\">If<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #9CDCFE\">totalSeconds<\/span><span style=\"color: #D4D4D4\"> &lt; <\/span><span style=\"color: #B5CEA8\">3600<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">Then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                        <\/span><span style=\"color: #9CDCFE\">value<\/span><span style=\"color: #D4D4D4\"> = $<\/span><span style=\"color: #CE9178\">&quot;{minutes:00}:{seconds:00} (mm:ss)&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #C586C0\">Else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                        <\/span><span style=\"color: #9CDCFE\">value<\/span><span style=\"color: #D4D4D4\"> = $<\/span><span style=\"color: #CE9178\">&quot;{hours}:{minutes:00}:{seconds:00} (hh:mm:ss)&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #C586C0\">End If<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #C586C0\">Else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #9CDCFE\">value<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;00:00&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #C586C0\">End If<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">Case<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;battery.voltage.nominal&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;input.voltage.nominal&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;input.voltage&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;battery.voltage&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;input.transfer.high&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;input.transfer.low&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">value<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">&quot; Volt&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">Case<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;ups.realpower.nominal&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">value<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">&quot; Watt&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">Case<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;ups.load&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;battery.charge.low&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;battery.charge.warning&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;battery.charge&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">value<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">&quot;%&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">Case<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;ups.delay.shutdown&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;battery.runtime.low&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;ups.timer.reboot&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;driver.parameter.pollfreq&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;driver.parameter.pollinterval&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">value<\/span><span style=\"color: #D4D4D4\"> += <\/span><span style=\"color: #CE9178\">&quot; sec&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">Case<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;ups.timer.shutdown&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #9CDCFE\">value<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #C586C0\">If<\/span><span style=\"color: #D4D4D4\">(value.<\/span><span style=\"color: #DCDCAA\">Trim<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;-1&quot;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #CE9178\">&quot;Disabled&quot;<\/span><span style=\"color: #D4D4D4\">,<\/span><span style=\"color: #9CDCFE\"> value<\/span><span style=\"color: #D4D4D4\"> &amp; <\/span><span style=\"color: #CE9178\">&quot; sec&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #C586C0\">Case<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;ups.status&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #C586C0\">Select<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">Case<\/span><span style=\"color: #D4D4D4\"> value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #C586C0\">Case<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;OL&quot;<\/span><span style=\"color: #D4D4D4\"> : <\/span><span style=\"color: #9CDCFE\">value<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;On Line, AC power is available&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #C586C0\">Case<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;OB&quot;<\/span><span style=\"color: #D4D4D4\"> : <\/span><span style=\"color: #9CDCFE\">value<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;Running on Battery&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #C586C0\">Case<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;LB&quot;<\/span><span style=\"color: #D4D4D4\"> : <\/span><span style=\"color: #9CDCFE\">value<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;Battery level LOW&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #C586C0\">Case<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;FSD&quot;<\/span><span style=\"color: #D4D4D4\"> : <\/span><span style=\"color: #9CDCFE\">value<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;Forced Shutdown&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    <\/span><span style=\"color: #C586C0\">Case<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">Else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                        <\/span><span style=\"color: #C586C0\">If<\/span><span style=\"color: #D4D4D4\"> value.<\/span><span style=\"color: #DCDCAA\">Contains<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;OB&quot;<\/span><span style=\"color: #D4D4D4\">) And value.<\/span><span style=\"color: #DCDCAA\">Contains<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;OL&quot;<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #C586C0\">Then<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                            <\/span><span style=\"color: #9CDCFE\">value<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;Running on Battery, Battery level LOW&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                        <\/span><span style=\"color: #C586C0\">Else<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                            <\/span><span style=\"color: #9CDCFE\">value<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;Unknown status: &quot;<\/span><span style=\"color: #D4D4D4\"> &amp;<\/span><span style=\"color: #9CDCFE\"> value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                        <\/span><span style=\"color: #C586C0\">End If<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                <\/span><span style=\"color: #C586C0\">End Select<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">End Select<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">Return<\/span><span style=\"color: #D4D4D4\"> value<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">End Function<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">End Class<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Provides helper functions to interact with UPS devices via the external tool\u00a0upsc.exe\u00a0, part of NUT (Network UPS Tools). The required\u00a0upsc.exe\u00a0and additional DLL can be imported in the project via the NuGet package\u00a0Ipercube.NUT.Ups.Query.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":943,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-967","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/pages\/967","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/comments?post=967"}],"version-history":[{"count":2,"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/pages\/967\/revisions"}],"predecessor-version":[{"id":969,"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/pages\/967\/revisions\/969"}],"up":[{"embeddable":true,"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/pages\/943"}],"wp:attachment":[{"href":"https:\/\/www.silverice.it\/IpercubeTechWP1\/wp-json\/wp\/v2\/media?parent=967"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}