<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Advanced on GbbOptimizer — Manual</title><link>https://krzysztofhajdamowicz.github.io/rewrite-GbbOptimizer-manual/en/advanced/</link><description>Recent content in Advanced on GbbOptimizer — Manual</description><generator>Hugo</generator><language>en</language><atom:link href="https://krzysztofhajdamowicz.github.io/rewrite-GbbOptimizer-manual/en/advanced/index.xml" rel="self" type="application/rss+xml"/><item><title>C# IoT Procedures</title><link>https://krzysztofhajdamowicz.github.io/rewrite-GbbOptimizer-manual/en/advanced/csharp-procedures/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krzysztofhajdamowicz.github.io/rewrite-GbbOptimizer-manual/en/advanced/csharp-procedures/</guid><description>&lt;h1 id="c-iot-procedures"&gt;C# IoT Procedures&lt;a class="anchor" href="#c-iot-procedures"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;GbbOptimizer allows you to create custom procedures in C# that control IoT devices based on forecasts, energy prices, and consumption history.&lt;/p&gt;
&lt;blockquote class='book-hint warning'&gt;
&lt;p&gt;A procedure must run in &lt;strong&gt;no more than 100 ms&lt;/strong&gt; and must not interfere with the program&amp;rsquo;s operation. Otherwise it will be suspended.&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id="the-app-object"&gt;The App Object&lt;a class="anchor" href="#the-app-object"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Each IoT procedure receives an &lt;code&gt;App&lt;/code&gt; object as a parameter. The available properties are listed below.&lt;/p&gt;
&lt;h3 id="main-properties"&gt;Main Properties&lt;a class="anchor" href="#main-properties"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Property&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;App.CurrDate&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;DateTime?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Date for which the device should be turned on/off&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;App.CurrHour&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Hour (12:30 = 12.5; 12:45 = 12.75)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;App.CurrForecastIndex&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;int?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Index in &lt;code&gt;App.Forecast&lt;/code&gt; for the current date and hour&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;App.StringVariables&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;Dictionary&amp;lt;string, string?&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;User string variables (persistent between calls)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;App.DecimalVariables&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;Dictionary&amp;lt;string, decimal?&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;User numeric variables (persistent between calls)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="forecast"&gt;Forecast&lt;a class="anchor" href="#forecast"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Property&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;App.Forecast&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;IForecast[]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Battery forecast array. &lt;code&gt;[0]&lt;/code&gt; = current hour, &lt;code&gt;[1]&lt;/code&gt; = next hour, etc.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.Date&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;DateTime&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Forecast date&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.DateNo&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;int&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;0 = today, 1 = tomorrow, etc.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.Hour&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Forecast hour&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.HourNo&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Hour counted from the start of the forecast (&lt;code&gt;[0].HourNo == 0&lt;/code&gt; always)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.StartBattery_kWhAC&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;kWh in battery (AC) at the start of the hour&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.StartBattery_kWh&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;kWh in battery (DC) at the start of the hour&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.Prod_KWhAC&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Production (PV + wind) in the given hour&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.Loads_kWhAC&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Consumption in the given hour&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.GridCharge_kWhAC&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;kWh from grid to battery (grid side)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.GridCharge_kWh&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;kWh from grid to battery (battery side)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.Discharge_kWhAC&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;kWh from battery to grid (grid side)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.Discharge_kWh&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;kWh from battery to grid (battery side)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.EndBattery_kWhAC&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;kWh in battery (AC) at the end of the hour&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.EndBattery_kWh&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;kWh in battery (DC) at the end of the hour&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.Meteo_SOC&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;null = no weather warnings; value = target SOC for the warning&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.Temperature_C&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Temperature (°C) in the given hour&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.ExtraLoads_kWh&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Total extra loads&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.FromGrid_kWh&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;kWh from grid&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.PurchasePrice&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Purchase price&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.PurchaseAmount&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Purchase amount&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.ToGrid_kWh&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;kWh to grid&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.SalePrice&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Sale price&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.SaleAmount&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Sale amount&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="prices"&gt;Prices&lt;a class="anchor" href="#prices"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Property&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;App.Prices&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;Dictionary&amp;lt;(DateTime, decimal), IPrice&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Prices for yesterday, today, and tomorrow&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.Day&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;DateTime&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Price date&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.Hour&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Price hour&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.PurchasePrice&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Purchase price&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.SalesPrice&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Sale price&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.Imported_PurchasePrice&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Purchase price imported from price source&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.Imported_SalesPrice&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Sale price imported from price source&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="history"&gt;History&lt;a class="anchor" href="#history"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Property&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;App.History&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;IHistory[]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Historical data. &lt;code&gt;[0]&lt;/code&gt; = hour before current, &lt;code&gt;[1]&lt;/code&gt; = two hours before, etc.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.Date&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;DateTime&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Date&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.Hour&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Hour&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.FromGrid_kWh&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;kWh from grid&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.PurchasePrice&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Purchase price&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.PurchaseAmount&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Purchase amount&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.ToGrid_kWh&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;kWh to grid&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.SalePrice&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Sale price&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.SaleAmount&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Sale amount&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.Loads_kWh&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Consumption (kWh)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.LoadsPrice&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Consumption energy price&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.LoadsAmount&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Consumption energy amount&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.PV_kWh&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;PV production (kWh)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.SOC_Start&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;SOC at the start of the hour&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.SOC_End&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;SOC at the end of the hour&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.ExtraLoads_Price&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Extra loads price&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.ExtraLoads_kWh&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;decimal?&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Total extra loads (kWh)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="iot-devices"&gt;IoT Devices&lt;a class="anchor" href="#iot-devices"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Property&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;App.IoTDevices&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;Dictionary&amp;lt;string, IIoTDevice&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;List of IoT devices&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.Name&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Device name&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.IsOn&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bool&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Current switch state&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="special-functions"&gt;Special Functions&lt;a class="anchor" href="#special-functions"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Function&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;void App.ToLog(string message)&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Display a message in the Log menu&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;bool App.IsInLowerPrices(DateTime CurrDate, decimal CurrHour, int LowerHours, bool Purchase)&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Is the given hour among the lowest-price hours of the day?&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;bool App.IsInHigherPrices(DateTime CurrDate, decimal CurrHour, int HigherHours, bool Purchase)&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Is the given hour among the highest-price hours of the day?&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="available-libraries"&gt;Available Libraries&lt;a class="anchor" href="#available-libraries"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mscorlib.dll&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;system.runtime.dll&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;System.Text.RegularExpressions.dll&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;system.linq.dll&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;System.Collections.dll&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="example"&gt;Example&lt;a class="anchor" href="#example"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;bool&lt;/span&gt; IoTDevice_0036_IsOn(IApp App)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; App.IsInLowerPrices(App.CurrDate, App.CurrHour, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; || App.Forecast[App.CurrForecastIndex].FromGrid_kWh &amp;gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This example turns the device on when:&lt;/p&gt;</description></item><item><title>GBB Shunt</title><link>https://krzysztofhajdamowicz.github.io/rewrite-GbbOptimizer-manual/en/advanced/gbb-shunt/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://krzysztofhajdamowicz.github.io/rewrite-GbbOptimizer-manual/en/advanced/gbb-shunt/</guid><description>&lt;h1 id="gbb-shunt"&gt;GBB Shunt&lt;a class="anchor" href="#gbb-shunt"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;GBB Shunt is a GbbOptimizer module designed for installations with lead-acid batteries (flooded, gel, AGM).&lt;/p&gt;
&lt;h2 id="what-is-gbb-shunt"&gt;What is GBB Shunt?&lt;a class="anchor" href="#what-is-gbb-shunt"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In installations with lead-acid batteries, the standard &lt;a href="https://krzysztofhajdamowicz.github.io/rewrite-GbbOptimizer-manual/en/references/glossary/#soc" class="glossary-term" title="State of Charge — battery level as a percentage (0–100%)"&gt;SOC&lt;/a&gt; measurement by the inverter can be inaccurate. GBB Shunt enables more accurate tracking of the battery state of charge based on current measurement through a shunt (coulomb counter).&lt;/p&gt;
&lt;h2 id="key-features"&gt;Key Features&lt;a class="anchor" href="#key-features"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Accurate SOC measurement&lt;/strong&gt; — based on current measurement (coulomb counting), not voltage&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Temperature compensation&lt;/strong&gt; — accounts for the effect of temperature on lead-acid battery capacity&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Battery protection&lt;/strong&gt; — prevents deep discharges that shorten the life of lead-acid batteries&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="when-to-use"&gt;When to Use?&lt;a class="anchor" href="#when-to-use"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;GBB Shunt is recommended if:&lt;/p&gt;</description></item></channel></rss>