Deployed 0cd98c6 with MkDocs version: 1.6.1

This commit is contained in:
github-actions[bot]
2025-10-30 23:07:10 +00:00
parent 1cf6dd2f0a
commit 15be0aba0d
23 changed files with 293 additions and 259 deletions

View File

@@ -697,21 +697,21 @@
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="alignment-references"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.</span> Alignment References</h1>
<p>The alignment references are used in every round to re-align the taken image to the reference coordinates.
<p>The alignment references are used in every round to re-align the taken image to the reference coordinates.
Two alignment structures must be defined and the taken image then in each round is shifted and rotated according to their position
with the target to be in exactly the same position as the reference image.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>The alignment structures needs to be unique and have a good contrast.
<p>The alignment structures needs to be unique and have a good contrast.
It is advised to have them as far apart as possible.</p>
</div>
<h2 id="precondition"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1</span> Precondition</h2>
<p>Please make sure to have setup your camera properly and taken a good <a href="../Reference-Image/">Reference Image</a>.</p>
<h2 id="define-two-reference-images"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.2</span> Define two Reference Images</h2>
<p><img alt="" src="../img/initial_setup_2_alignment_marks.jpg" style="width:500px"/></p>
<p><img alt="Initial Setup Alignment Marks" src="../img/initial_setup_2_alignment_marks.jpg" style="width:500px"/></p>
<p>You can switch between this two marks with <code>(1)</code>.</p>
<p>Then define the reference area in the image by either directly drag and drop with the mouse or use the input boxes below.
To apply the currently marked image part you need to push <code>"Update Reference" (2)</code>. </p>
To apply the currently marked image part you need to push <code>"Update Reference" (2)</code>.</p>
<p>In some cases it might be useful to use a reference with a higher contrast. This can be achieved by pushing <code>Enhance Contrast" (3)</code>.
The result will be calculated on the ESP32 - so be a bit patient, before you see it active.</p>
<p>To save push <code>"Save to config.ini" (4)</code>.</p>

View File

@@ -828,7 +828,7 @@ For more technical/deeper explanations have a look on <a href="../Neural-Network
<p><strong>continuous</strong> means, that there is no discrete model, that has discreate states, but there is a different mechanism, that provides a not discrete value in the interval between [0, 1[.</p>
<h3 id="dig-class11"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.1</span> <code>dig-class11</code></h3>
<p>This model can recognize <strong>full digits</strong>. It was the first model version. All intermediate states shown a <code>N</code> for not-a-number (aka. <code>NaN</code>). But in post process it uses older values to fill up the <code>N</code> values if possible.</p>
<p><img alt="" src="../img/dig-class11.png" style="width:300px"/></p>
<p><img alt="Dig Class11" src="../img/dig-class11.png" style="width:300px"/></p>
<p>It's possibly a good fallback, if <code>dig-cont</code> or <code>dig-class100</code> results are not good.</p>
<p>Main features:</p>
<ul>
@@ -837,7 +837,7 @@ For more technical/deeper explanations have a look on <a href="../Neural-Network
</ul>
<h3 id="dig-class100-and-dig-cont"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.2</span> <code>dig-class100</code> and <code>dig-cont</code></h3>
<p>These models are used to get a <strong>continuous reading</strong> with intermediate states. To see what the models are doing, you can go to the Recognition page of your device.</p>
<p><img alt="" src="../img/dig-class100.png" style="width:300px"/></p>
<p><img alt="Did Class100" src="../img/dig-class100.png" style="width:300px"/></p>
<p>Main features:</p>
<ul>
<li>suitable for all digit displays.</li>
@@ -854,10 +854,10 @@ The <code>dig-class100</code> is a standard classification model. Each tenth ste
<p>Look <a href="https://jomjol.github.io/neural-network-digital-counter-readout">here</a> for a list of digit images used for the training.</p>
<h2 id="analog-pointer-models"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.2</span> Analog pointer models</h2>
<p>For pointers on water meters use the analog models:</p>
<p><img alt="" src="../img/ana-class100.png" style="width:250px"/></p>
<p><img alt="ANA Class100" src="../img/ana-class100.png" style="width:250px"/></p>
<p>You can choose between two models:</p>
<ul>
<li><code>ana-class100</code> </li>
<li><code>ana-class100</code></li>
<li><code>ana-cont</code></li>
</ul>
<p>Both do mainly the same.

View File

@@ -867,12 +867,12 @@
<h2 id="expert-parameters"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1</span> Expert Parameters</h2>
<p>Some parameters are treated as <strong>Expert Parameters</strong> and are hidden by default.
Tick the checkbox in the top left corner to enable them:</p>
<p><img alt="" src="../img/expert-parameters.png"> </img></p>
<p><img alt="Expert Parameters" src="../img/expert-parameters.png"> </img></p>
<p>The <strong>Expert Parameters</strong> then will be shown with a red background:
<img alt="" src="../img/expert-parameters2.png"> </img></p>
<img alt="Second Expert Parameters" src="../img/expert-parameters2.png"> </img></p>
<h2 id="manual-editing-of-the-config-file"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.2</span> Manual Editing of the Config File</h2>
<p>Even more configuration parameters can be edited manually in the <code>config.ini</code>:</p>
<p><img alt="" src="../img/manual-config-editing.png"> </img></p>
<p><img alt="Manual Config Editing" src="../img/manual-config-editing.png"> </img></p>
<p>To edit the <code>config.ini</code> file directly, click on the <code>Edit Config.ini directly</code> button.</p>
<h2 id="background-information"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.3</span> Background Information</h2>
<div class="admonition note">
@@ -897,7 +897,7 @@ But you might be interested in it.</p>
<h4 id="6-mqtt"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.3.1.6</span> 6. <code>[MQTT]</code></h4>
<p>Transfer of the readings to a MQTT server.</p>
<h4 id="7-autotimer"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.3.1.7</span> 7. <code>[AutoTimer]</code></h4>
<p>Configuration of the automated flow start at the start up of the ESP32. </p>
<p>Configuration of the automated flow start at the start up of the ESP32.</p>
<h4 id="8-debug"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.3.1.8</span> 8. <code>[Debug]</code></h4>
<p>Configuration for debugging details</p>
</article>

View File

@@ -360,7 +360,7 @@
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix="">
<li class="md-nav__item">
<a class="md-nav__link" href="#terms-and-definitions">1.0.1
<a class="md-nav__link" href="#terms-and-definitions">1.1
<span class="md-ellipsis">
Terms and definitions
</span>
@@ -368,35 +368,37 @@
<nav aria-label="Terms and definitions" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#prevalue">1.0.1.0.1
<a class="md-nav__link" href="#prevalue">1.1.1
<span class="md-ellipsis">
PreValue
</span>
</a>
</li>
<nav aria-label="PreValue" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#digits">1.0.1.0.2
<a class="md-nav__link" href="#digits">1.1.1.1
<span class="md-ellipsis">
Digits
</span>
</a>
</li>
<nav aria-label="Digits" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#analogs">1.0.1.0.3
<a class="md-nav__link" href="#analogs">1.1.1.1.1
<span class="md-ellipsis">
Analogs
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#checkdigitincreaseconsistency">1.0.1.0.4
<a class="md-nav__link" href="#checkdigitincreaseconsistency">1.1.1.1.2
<span class="md-ellipsis">
CheckDigitIncreaseConsistency
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#allownegativerates">1.0.1.0.5
<a class="md-nav__link" href="#allownegativerates">1.1.1.1.3
<span class="md-ellipsis">
AllowNegativeRates
</span>
@@ -404,35 +406,35 @@
<nav aria-label="AllowNegativeRates" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#decimalshift">1.0.1.0.5.1
<a class="md-nav__link" href="#decimalshift">1.1.1.1.3.1
<span class="md-ellipsis">
DecimalShift
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#analogtodigittransitionstart">1.0.1.0.5.2
<a class="md-nav__link" href="#analogtodigittransitionstart">1.1.1.1.3.2
<span class="md-ellipsis">
AnalogToDigitTransitionStart
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#maxratevalue-and-maxratetype">1.0.1.0.5.3
<a class="md-nav__link" href="#maxratevalue-and-maxratetype">1.1.1.1.3.3
<span class="md-ellipsis">
MaxRateValue and MaxRateType
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#extendedresolution">1.0.1.0.5.4
<a class="md-nav__link" href="#extendedresolution">1.1.1.1.3.4
<span class="md-ellipsis">
ExtendedResolution
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#ignoreleadingnan">1.0.1.0.5.5
<a class="md-nav__link" href="#ignoreleadingnan">1.1.1.1.3.5
<span class="md-ellipsis">
IgnoreLeadingNaN
</span>
@@ -441,8 +443,11 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#flow-chart">1.0.1.1
<a class="md-nav__link" href="#flow-chart">1.1.1.2
<span class="md-ellipsis">
Flow Chart
</span>
@@ -451,8 +456,11 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#checkdigitincreaseconsistency-algorithm">1.1
<a class="md-nav__link" href="#checkdigitincreaseconsistency-algorithm">1.2
<span class="md-ellipsis">
CheckDigitIncreaseConsistency Algorithm
</span>
@@ -761,7 +769,7 @@
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix="">
<li class="md-nav__item">
<a class="md-nav__link" href="#terms-and-definitions">1.0.1
<a class="md-nav__link" href="#terms-and-definitions">1.1
<span class="md-ellipsis">
Terms and definitions
</span>
@@ -769,35 +777,37 @@
<nav aria-label="Terms and definitions" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#prevalue">1.0.1.0.1
<a class="md-nav__link" href="#prevalue">1.1.1
<span class="md-ellipsis">
PreValue
</span>
</a>
</li>
<nav aria-label="PreValue" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#digits">1.0.1.0.2
<a class="md-nav__link" href="#digits">1.1.1.1
<span class="md-ellipsis">
Digits
</span>
</a>
</li>
<nav aria-label="Digits" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#analogs">1.0.1.0.3
<a class="md-nav__link" href="#analogs">1.1.1.1.1
<span class="md-ellipsis">
Analogs
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#checkdigitincreaseconsistency">1.0.1.0.4
<a class="md-nav__link" href="#checkdigitincreaseconsistency">1.1.1.1.2
<span class="md-ellipsis">
CheckDigitIncreaseConsistency
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#allownegativerates">1.0.1.0.5
<a class="md-nav__link" href="#allownegativerates">1.1.1.1.3
<span class="md-ellipsis">
AllowNegativeRates
</span>
@@ -805,35 +815,35 @@
<nav aria-label="AllowNegativeRates" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#decimalshift">1.0.1.0.5.1
<a class="md-nav__link" href="#decimalshift">1.1.1.1.3.1
<span class="md-ellipsis">
DecimalShift
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#analogtodigittransitionstart">1.0.1.0.5.2
<a class="md-nav__link" href="#analogtodigittransitionstart">1.1.1.1.3.2
<span class="md-ellipsis">
AnalogToDigitTransitionStart
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#maxratevalue-and-maxratetype">1.0.1.0.5.3
<a class="md-nav__link" href="#maxratevalue-and-maxratetype">1.1.1.1.3.3
<span class="md-ellipsis">
MaxRateValue and MaxRateType
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#extendedresolution">1.0.1.0.5.4
<a class="md-nav__link" href="#extendedresolution">1.1.1.1.3.4
<span class="md-ellipsis">
ExtendedResolution
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#ignoreleadingnan">1.0.1.0.5.5
<a class="md-nav__link" href="#ignoreleadingnan">1.1.1.1.3.5
<span class="md-ellipsis">
IgnoreLeadingNaN
</span>
@@ -842,8 +852,11 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#flow-chart">1.0.1.1
<a class="md-nav__link" href="#flow-chart">1.1.1.2
<span class="md-ellipsis">
Flow Chart
</span>
@@ -852,8 +865,11 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#checkdigitincreaseconsistency-algorithm">1.1
<a class="md-nav__link" href="#checkdigitincreaseconsistency-algorithm">1.2
<span class="md-ellipsis">
CheckDigitIncreaseConsistency Algorithm
</span>
@@ -874,51 +890,51 @@
<li>The replacement of the "N" with a previous value could be not sufficient, due to the fact, that it might have changed.</li>
<li>There is a misreading of one one of the numbers. This can always happen in case of neural network processing.</li>
</ol>
<h3 id="terms-and-definitions"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.1</span> Terms and definitions</h3>
<h5 id="prevalue"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.1.0.1</span> PreValue</h5>
<h2 id="terms-and-definitions"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1</span> Terms and definitions</h2>
<h3 id="prevalue"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.1</span> PreValue</h3>
<p>The last correct read value. PreValue is here a bit missleading, because normally it is the same as the last value. In the next round of reading it will be used to check negative rates, high rates (MaxRateValue / MaxRateType) and CCheckDigitIncreaseConsistency (dig-class11 only). Either from a previous correctly identified value or manual setting by the user.</p>
<h5 id="digits"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.1.0.2</span> Digits</h5>
<p>Value that are digitized from a digit number. There are 11 allowed values for this: </p>
<h4 id="digits"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.1.1</span> Digits</h4>
<p>Value that are digitized from a digit number. There are 11 allowed values for this:</p>
<ol>
<li>Digits: 0, 1, 2, ... 9</li>
<li>N = Not-a-Number - representing a not unique state between two numbers</li>
</ol>
<h5 id="analogs"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.1.0.3</span> Analogs</h5>
<h5 id="analogs"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.1.1.1</span> Analogs</h5>
<p>This are value derived from a pointer like meter. This never has the state "N".</p>
<h5 id="checkdigitincreaseconsistency"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.1.0.4</span> CheckDigitIncreaseConsistency</h5>
<h5 id="checkdigitincreaseconsistency"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.1.1.2</span> CheckDigitIncreaseConsistency</h5>
<p>If this is enabled an "intelligent" algorithm is used to derive from zero-crossing of discrete digit positions, if the number should have been increased. This is relevant because in some of the digit meters, the increase of a digit to the next number can be seen, before the sub-digit has gone through zero.</p>
<p>For example: 16.6 --&gt; 16.7 --&gt; 1N.8 --&gt; <strong>17.9</strong> corrected to 16.9 --&gt; 17.0 --&gt; 17.1 </p>
<p>For example: 16.6 --&gt; 16.7 --&gt; 1N.8 --&gt; <strong>17.9</strong> corrected to 16.9 --&gt; 17.0 --&gt; 17.1</p>
<p>As you can see, the 17.9 is a false reading as the 7 is assumed to be already readable, although the sub-digit has not crossed the zero. In this case the CheckDigitIncreaseConsistency algorithm will correct this to 16.9</p>
<p>A detailed description of the algorithm can be found below (not yet ready!)</p>
<h5 id="allownegativerates"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.1.0.5</span> <code>AllowNegativeRates</code></h5>
<h5 id="allownegativerates"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.1.1.3</span> <code>AllowNegativeRates</code></h5>
<p>Most of the meters only have increasing numbers and do not count backwards. Therefore a negative rate (= negative change compared to the PreValue) is surely a false value. This can be checked an flagged as false reading</p>
<p>The <code>AllowNegativeRates</code> property ensures that the result does not become negative in the event of incorrect readings. This can happen, for example, if the alignment of the image did not work properly. But also the neural networks sometimes flip between two states for similar images.</p>
<p>If <code>AllowNegativeRates = true</code>, the result is discarded if it is smaller than the pre-value of the last readout and the output shows an error "Negative rate.."</p>
<p>If the <code>ExtendedResolution</code> setting is true, there is an exception where the value does not become smaller, but no error is output. This only applies if the value +/- 0.2 of the last digit is inaccurate.</p>
<h6 id="decimalshift"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.1.0.5.1</span> <code>DecimalShift</code></h6>
<h6 id="decimalshift"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.1.1.3.1</span> <code>DecimalShift</code></h6>
<p>The <code>DecimalShift</code> setting puts the decimal point in the right place. It acts like a shift. Negative values shift the decimal point to the left. Positive values move the decimal point to the right, filling with zero.</p>
<h6 id="analogtodigittransitionstart"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.1.0.5.2</span> <code>AnalogToDigitTransitionStart</code></h6>
<h6 id="analogtodigittransitionstart"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.1.1.3.2</span> <code>AnalogToDigitTransitionStart</code></h6>
<p>For detailed description see <a href="../Watermeter-specific-analog---digit-transition/">Analog-digit-transition</a>.</p>
<h6 id="maxratevalue-and-maxratetype"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.1.0.5.3</span> <code>MaxRateValue</code> and <code>MaxRateType</code></h6>
<h6 id="maxratevalue-and-maxratetype"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.1.1.3.3</span> <code>MaxRateValue</code> and <code>MaxRateType</code></h6>
<p>Here the maximum change from one to the next reading can be limited. If a false reading of the neural network results in a change larger than this, the reading is flagged as false. There a two types of comparisons possible</p>
<p>1) <strong>AbsolutChange</strong>: Here the difference between the PreValue and the current reading is compared directly, independent how much time has passed since the last reading.
2) <strong>RelativeRate</strong>: in this case a change rate in the unit of change/minute is calculated, taking the time between the last and the current reading into account. Be careful, that with increasing time, the absolute allowed change increases.
Example: relative rate of 0.05 m³/minute --&gt; after 20 minutes a maximum change of 20 minutes * 0.05 m³/minute = 1 m³ is possible. That means that a false reading of 1 m³ cannot be detected false after about 20 minutes in this case
Assume, that there might be no change in the meter for hours (e.g. during the night) a much bigger change could also be accepted. </p>
<h6 id="extendedresolution"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.1.0.5.4</span> <code>ExtendedResolution</code></h6>
<p>Newer models such as dig-cont and dig-class100 have a high resolution of the values and can thus represent another digit by using the value of the last digit or pointer (ex. 7.8 in the last digit). </p>
<p>If the value is set to true, the result of the last digit is used completely. </p>
Assume, that there might be no change in the meter for hours (e.g. during the night) a much bigger change could also be accepted.</p>
<h6 id="extendedresolution"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.1.1.3.4</span> <code>ExtendedResolution</code></h6>
<p>Newer models such as dig-cont and dig-class100 have a high resolution of the values and can thus represent another digit by using the value of the last digit or pointer (ex. 7.8 in the last digit).</p>
<p>If the value is set to true, the result of the last digit is used completely.</p>
<p>When using dig-class11 models, the setting is ignored.</p>
<p>Due to inaccuracies of the neural networks, it sometimes happens that the results jump back and forth between two decimal places. Therefore, when using <code>ÀllowNegatives</code>= false, no error is output if the value is only off by 0.2. Nevertheless, the value then remains at the higher determined value.</p>
<h6 id="ignoreleadingnan"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.1.0.5.5</span> <code>IgnoreLeadingNaN</code></h6>
<h6 id="ignoreleadingnan"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.1.1.3.5</span> <code>IgnoreLeadingNaN</code></h6>
<p>The parameter is only be used, if a dig-class11 model is selected. <code>ÌgnoreLeadingNaN</code> removes in the CheckDigitIncreaseConsistency process the leading <code>N</code> values.</p>
<h4 id="flow-chart"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.1.1</span> Flow Chart</h4>
<p><img alt="" src="../img/correct_algo_1.jpg"/></p>
<p><img alt="" src="../img/correct_algo_2.jpg"/></p>
<p><img alt="" src="../img/correct_algo_3.jpg"/></p>
<h2 id="checkdigitincreaseconsistency-algorithm"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1</span> CheckDigitIncreaseConsistency Algorithm</h2>
<h4 id="flow-chart"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.1.2</span> Flow Chart</h4>
<p><img alt="Correction Algorithm 1" src="../img/correct_algo_1.jpg"/></p>
<p><img alt="Correction Algorithm 2" src="../img/correct_algo_2.jpg"/></p>
<p><img alt="Correction Algorithm 3" src="../img/correct_algo_3.jpg"/></p>
<h2 id="checkdigitincreaseconsistency-algorithm"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.2</span> CheckDigitIncreaseConsistency Algorithm</h2>
<p>The check digit increase consistency algorithm is functional for the digits only. Due to the fact, that the rotation might be a little bit earlier or later compared to the zero crossing of the digit before, errors during the reading before and after a zero crossing can be wrong. Therefore a simple algorithm can be applied, checking the consistency of zero crossing and changes in the following digit. This is applied to one after the other digit, starting with the lowest priority digits.</p>
<p><img alt="" src="../img/correct_algo_zero_crossing.jpg"/></p>
<p><img alt="Correction Algorithm Zero Crossing" src="../img/correct_algo_zero_crossing.jpg"/></p>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>

View File

@@ -819,12 +819,12 @@
<ul>
<li>The jpg files can have any name</li>
<li>The jpg files must be smaller than 30'000 bytes</li>
<li>The <code>files.txt</code> must contains a list of those files, eg:<div class="language-text highlight"><pre><span></span><code>520.8983.jpg
520.9086.jpg
520.9351.jpg
</code></pre></div>
</li>
<li>The <code>files.txt</code> must contains a list of those files, eg:</li>
</ul>
<div class="language-text highlight"><pre><span></span><code><span id="__span-1-1"><a href="#__codelineno-1-1" id="__codelineno-1-1" name="__codelineno-1-1"></a> 520.8983.jpg
</span><span id="__span-1-2"><a href="#__codelineno-1-2" id="__codelineno-1-2" name="__codelineno-1-2"></a> 520.9086.jpg
</span><span id="__span-1-3"><a href="#__codelineno-1-3" id="__codelineno-1-3" name="__codelineno-1-3"></a> 520.9351.jpg
</span></code></pre></div>
<h2 id="collecting-images-of-your-device"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.2</span> Collecting images of your device</h2>
<p>There are several ways to collect images from your device:</p>
<ol>
@@ -832,32 +832,32 @@
<li>Use the Webhook to send the raw image on each round to a dedicated server, see <a href="../Webhook">Webhook</a> resp. <a href="Parameters/#parameter-uploadimg">../Parameter <code>UploadImg</code></a>.</li>
<li>
<p>Another option is to pull the images periodically from <code>http://&lt;IP&gt;/img_tmp/raw.jpg</code>. Eg. with an external service. Below is a (Linux)-Bash script to do it:</p>
<div class="language-Bash highlight"><pre><span></span><code><span id="__span-1-1"><a href="#__codelineno-1-1" id="__codelineno-1-1" name="__codelineno-1-1"></a><span class="ch">#!/bin/bash</span>
</span><span id="__span-1-2"><a href="#__codelineno-1-2" id="__codelineno-1-2" name="__codelineno-1-2"></a><span class="k">while</span><span class="w"> </span><span class="o">[[</span><span class="w"> </span><span class="nb">true</span><span class="w"> </span><span class="o">]]</span><span class="p">;</span><span class="w"> </span><span class="k">do</span>
</span><span id="__span-1-3"><a href="#__codelineno-1-3" id="__codelineno-1-3" name="__codelineno-1-3"></a><span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">"fetching value..."</span>
</span><span id="__span-1-4"><a href="#__codelineno-1-4" id="__codelineno-1-4" name="__codelineno-1-4"></a><span class="w"> </span>wget<span class="w"> </span>-q<span class="w"> </span>http://192.168.1.151/value<span class="w"> </span>-O<span class="w"> </span>value.txt
</span><span id="__span-1-5"><a href="#__codelineno-1-5" id="__codelineno-1-5" name="__codelineno-1-5"></a>
</span><span id="__span-1-6"><a href="#__codelineno-1-6" id="__codelineno-1-6" name="__codelineno-1-6"></a><span class="w"> </span><span class="nv">value</span><span class="o">=</span><span class="sb">`</span>cat<span class="w"> </span>value.txt<span class="sb">`</span>
</span><span id="__span-1-7"><a href="#__codelineno-1-7" id="__codelineno-1-7" name="__codelineno-1-7"></a><span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">"Value: </span><span class="nv">$value</span><span class="s2">"</span>
</span><span id="__span-1-8"><a href="#__codelineno-1-8" id="__codelineno-1-8" name="__codelineno-1-8"></a>
</span><span id="__span-1-9"><a href="#__codelineno-1-9" id="__codelineno-1-9" name="__codelineno-1-9"></a><span class="w"> </span><span class="nv">diff</span><span class="o">=</span><span class="sb">`</span>diff<span class="w"> </span>value.txt<span class="w"> </span>value_previous.txt<span class="sb">`</span>
</span><span id="__span-1-10"><a href="#__codelineno-1-10" id="__codelineno-1-10" name="__codelineno-1-10"></a><span class="w"> </span><span class="nv">changed</span><span class="o">=</span><span class="nv">$?</span>
</span><span id="__span-1-11"><a href="#__codelineno-1-11" id="__codelineno-1-11" name="__codelineno-1-11"></a><span class="w"> </span><span class="c1">#echo "Diff: $diff"</span>
</span><span id="__span-1-12"><a href="#__codelineno-1-12" id="__codelineno-1-12" name="__codelineno-1-12"></a>
</span><span id="__span-1-13"><a href="#__codelineno-1-13" id="__codelineno-1-13" name="__codelineno-1-13"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="o">[[</span><span class="w"> </span><span class="nv">$changed</span><span class="w"> </span>-ne<span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="o">]]</span><span class="p">;</span><span class="w"> </span><span class="k">then</span>
</span><span id="__span-1-14"><a href="#__codelineno-1-14" id="__codelineno-1-14" name="__codelineno-1-14"></a><span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">"Value changed:"</span>
</span><span id="__span-1-15"><a href="#__codelineno-1-15" id="__codelineno-1-15" name="__codelineno-1-15"></a><span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="nv">$diff</span>
</span><span id="__span-1-16"><a href="#__codelineno-1-16" id="__codelineno-1-16" name="__codelineno-1-16"></a><span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">"fetching image..."</span>
</span><span id="__span-1-17"><a href="#__codelineno-1-17" id="__codelineno-1-17" name="__codelineno-1-17"></a><span class="w"> </span>wget<span class="w"> </span>-q<span class="w"> </span>http://192.168.1.151/img_tmp/raw.jpg<span class="w"> </span>-O<span class="w"> </span><span class="nv">$value</span>.jpg
</span><span id="__span-1-18"><a href="#__codelineno-1-18" id="__codelineno-1-18" name="__codelineno-1-18"></a><span class="w"> </span><span class="k">else</span>
</span><span id="__span-1-19"><a href="#__codelineno-1-19" id="__codelineno-1-19" name="__codelineno-1-19"></a><span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">"Value did not change, skipping image fetching!"</span>
</span><span id="__span-1-20"><a href="#__codelineno-1-20" id="__codelineno-1-20" name="__codelineno-1-20"></a><span class="w"> </span><span class="k">fi</span>
</span><span id="__span-1-21"><a href="#__codelineno-1-21" id="__codelineno-1-21" name="__codelineno-1-21"></a>
</span><span id="__span-1-22"><a href="#__codelineno-1-22" id="__codelineno-1-22" name="__codelineno-1-22"></a><span class="w"> </span>cp<span class="w"> </span>value.txt<span class="w"> </span>value_previous.txt
</span><span id="__span-1-23"><a href="#__codelineno-1-23" id="__codelineno-1-23" name="__codelineno-1-23"></a>
</span><span id="__span-1-24"><a href="#__codelineno-1-24" id="__codelineno-1-24" name="__codelineno-1-24"></a><span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">"waiting 60s..."</span>
</span><span id="__span-1-25"><a href="#__codelineno-1-25" id="__codelineno-1-25" name="__codelineno-1-25"></a><span class="w"> </span>sleep<span class="w"> </span><span class="m">60</span>
</span><span id="__span-1-26"><a href="#__codelineno-1-26" id="__codelineno-1-26" name="__codelineno-1-26"></a><span class="k">done</span>
<div class="language-Bash highlight"><pre><span></span><code><span id="__span-2-1"><a href="#__codelineno-2-1" id="__codelineno-2-1" name="__codelineno-2-1"></a><span class="ch">#!/bin/bash</span>
</span><span id="__span-2-2"><a href="#__codelineno-2-2" id="__codelineno-2-2" name="__codelineno-2-2"></a><span class="k">while</span><span class="w"> </span><span class="o">[[</span><span class="w"> </span><span class="nb">true</span><span class="w"> </span><span class="o">]]</span><span class="p">;</span><span class="w"> </span><span class="k">do</span>
</span><span id="__span-2-3"><a href="#__codelineno-2-3" id="__codelineno-2-3" name="__codelineno-2-3"></a><span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">"fetching value..."</span>
</span><span id="__span-2-4"><a href="#__codelineno-2-4" id="__codelineno-2-4" name="__codelineno-2-4"></a><span class="w"> </span>wget<span class="w"> </span>-q<span class="w"> </span>http://192.168.1.151/value<span class="w"> </span>-O<span class="w"> </span>value.txt
</span><span id="__span-2-5"><a href="#__codelineno-2-5" id="__codelineno-2-5" name="__codelineno-2-5"></a>
</span><span id="__span-2-6"><a href="#__codelineno-2-6" id="__codelineno-2-6" name="__codelineno-2-6"></a><span class="w"> </span><span class="nv">value</span><span class="o">=</span><span class="sb">`</span>cat<span class="w"> </span>value.txt<span class="sb">`</span>
</span><span id="__span-2-7"><a href="#__codelineno-2-7" id="__codelineno-2-7" name="__codelineno-2-7"></a><span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">"Value: </span><span class="nv">$value</span><span class="s2">"</span>
</span><span id="__span-2-8"><a href="#__codelineno-2-8" id="__codelineno-2-8" name="__codelineno-2-8"></a>
</span><span id="__span-2-9"><a href="#__codelineno-2-9" id="__codelineno-2-9" name="__codelineno-2-9"></a><span class="w"> </span><span class="nv">diff</span><span class="o">=</span><span class="sb">`</span>diff<span class="w"> </span>value.txt<span class="w"> </span>value_previous.txt<span class="sb">`</span>
</span><span id="__span-2-10"><a href="#__codelineno-2-10" id="__codelineno-2-10" name="__codelineno-2-10"></a><span class="w"> </span><span class="nv">changed</span><span class="o">=</span><span class="nv">$?</span>
</span><span id="__span-2-11"><a href="#__codelineno-2-11" id="__codelineno-2-11" name="__codelineno-2-11"></a><span class="w"> </span><span class="c1">#echo "Diff: $diff"</span>
</span><span id="__span-2-12"><a href="#__codelineno-2-12" id="__codelineno-2-12" name="__codelineno-2-12"></a>
</span><span id="__span-2-13"><a href="#__codelineno-2-13" id="__codelineno-2-13" name="__codelineno-2-13"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="o">[[</span><span class="w"> </span><span class="nv">$changed</span><span class="w"> </span>-ne<span class="w"> </span><span class="m">0</span><span class="w"> </span><span class="o">]]</span><span class="p">;</span><span class="w"> </span><span class="k">then</span>
</span><span id="__span-2-14"><a href="#__codelineno-2-14" id="__codelineno-2-14" name="__codelineno-2-14"></a><span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">"Value changed:"</span>
</span><span id="__span-2-15"><a href="#__codelineno-2-15" id="__codelineno-2-15" name="__codelineno-2-15"></a><span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="nv">$diff</span>
</span><span id="__span-2-16"><a href="#__codelineno-2-16" id="__codelineno-2-16" name="__codelineno-2-16"></a><span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">"fetching image..."</span>
</span><span id="__span-2-17"><a href="#__codelineno-2-17" id="__codelineno-2-17" name="__codelineno-2-17"></a><span class="w"> </span>wget<span class="w"> </span>-q<span class="w"> </span>http://192.168.1.151/img_tmp/raw.jpg<span class="w"> </span>-O<span class="w"> </span><span class="nv">$value</span>.jpg
</span><span id="__span-2-18"><a href="#__codelineno-2-18" id="__codelineno-2-18" name="__codelineno-2-18"></a><span class="w"> </span><span class="k">else</span>
</span><span id="__span-2-19"><a href="#__codelineno-2-19" id="__codelineno-2-19" name="__codelineno-2-19"></a><span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">"Value did not change, skipping image fetching!"</span>
</span><span id="__span-2-20"><a href="#__codelineno-2-20" id="__codelineno-2-20" name="__codelineno-2-20"></a><span class="w"> </span><span class="k">fi</span>
</span><span id="__span-2-21"><a href="#__codelineno-2-21" id="__codelineno-2-21" name="__codelineno-2-21"></a>
</span><span id="__span-2-22"><a href="#__codelineno-2-22" id="__codelineno-2-22" name="__codelineno-2-22"></a><span class="w"> </span>cp<span class="w"> </span>value.txt<span class="w"> </span>value_previous.txt
</span><span id="__span-2-23"><a href="#__codelineno-2-23" id="__codelineno-2-23" name="__codelineno-2-23"></a>
</span><span id="__span-2-24"><a href="#__codelineno-2-24" id="__codelineno-2-24" name="__codelineno-2-24"></a><span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">"waiting 60s..."</span>
</span><span id="__span-2-25"><a href="#__codelineno-2-25" id="__codelineno-2-25" name="__codelineno-2-25"></a><span class="w"> </span>sleep<span class="w"> </span><span class="m">60</span>
</span><span id="__span-2-26"><a href="#__codelineno-2-26" id="__codelineno-2-26" name="__codelineno-2-26"></a><span class="k">done</span>
</span></code></pre></div>
</li>
</ol>

View File

@@ -823,10 +823,10 @@ Most likely they are caused by a hardware issue!</p>
<h3 id="0x00000001-psram-bad"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.1</span> <code>0x00000001</code> PSRAM bad</h3>
<p>Your device most likely has no PSRAM at all or it is too small (needs to have at least 4 MBytes)!
See <a href="../Hardware-Compatibility/">Hardware Compatibility</a>.</p>
<p>Usually the log shows something like this:
<p>Usually the log shows something like this:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-0-1"><a href="#__codelineno-0-1" id="__codelineno-0-1" name="__codelineno-0-1"></a>psram: PSRAM ID read error: 0xffffffff
</span><span id="__span-0-2"><a href="#__codelineno-0-2" id="__codelineno-0-2" name="__codelineno-0-2"></a>cpu_start: Failed to init external RAM!
</span></code></pre></div></p>
</span></code></pre></div>
<h3 id="0x00000002-heap-too-small"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.2</span> <code>0x00000002</code> Heap too small</h3>
<p>The firmware failed to allocate enough memory. This most likely is a consequential error of a bad PSRAM!</p>
<h3 id="0x00000004-cam-bad"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.3</span> <code>0x00000004</code> Cam bad</h3>

View File

@@ -743,7 +743,7 @@
<p><img height="40%" src="https://user-images.githubusercontent.com/108122193/188265470-001a392f-d1f4-46a3-b1e8-f29ec41c8621.png" width="40%"/></p>
<ol>
<li>First, check that your ROI are correctly defined (yey!)</li>
<li>Second, verify that the name of your ROI analog and digit ROIs are different </li>
<li>Second, verify that the name of your ROI analog and digit ROIs are different</li>
</ol>
<h2 id="recognition-is-working-well-but-number-arent-sorted-correctly"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.4</span> Recognition is working well, but number aren't sorted correctly</h2>
<p>You have to sort your ROI correctly (Bigger to smaller). Select your ROI and click either "move next" or "move previous". Repeat until your ROI are correctly sorted</p>

View File

@@ -703,12 +703,12 @@ To circumvent this problem, it is now possible to control external LEDs, which t
<p>There is also a new <a href="https://www.thingiverse.com/thing:5028229">meter adapter</a> available. This has two features: designed for <strong>small clearings</strong> in front of the meter and prepared for <strong>WS2812 LEDs</strong>.</p>
<p><img src="https://raw.githubusercontent.com/jomjol/ai-on-the-edge-device/master/images/Power_Meter_Mounted.jpg" width="500"/></p>
<h2 id="1-hardware-installation-of-the-led-stripe"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1</span> 1. Hardware installation of the LED stripe</h2>
<p>The control line of the LED stripe is connected with a 470 Ohm resistor to the GPIO12.
<p>The control line of the LED stripe is connected with a 470 Ohm resistor to the GPIO12.
For power supply stabilization a capacitor between 5V and ground is recommended. Here a 470µF polymer capacitor is used. As a power supply a 5V from the ESP32 is used like in the following wiring.</p>
<p><img src="https://raw.githubusercontent.com/jomjol/ai-on-the-edge-device/master/images/install_external_led.jpg" width="500"/> </p>
<p><img src="https://raw.githubusercontent.com/jomjol/ai-on-the-edge-device/master/images/install_external_led.jpg" width="500"/></p>
<h2 id="2-software-configuration"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.2</span> 2. Software configuration</h2>
<p>The handling of the WS2812 LED controller needs some other libraries, therefore it is controlled within a dedicated section called <code>GPIO Settings</code>. The external LED stripe is connected to GPIO12. After activating the "GPIO Settings" section, the internal flash is per default disabled. In order to activate the external LED, you need to activate <code>GPIO 12 state</code> and select <code>"extern flash light ws281x ..."</code>. </p>
<p><img src="https://raw.githubusercontent.com/jomjol/ai-on-the-edge-device/master/images/external_GPIO_settings.jpg" width="700"/> </p>
<p>The handling of the WS2812 LED controller needs some other libraries, therefore it is controlled within a dedicated section called <code>GPIO Settings</code>. The external LED stripe is connected to GPIO12. After activating the "GPIO Settings" section, the internal flash is per default disabled. In order to activate the external LED, you need to activate <code>GPIO 12 state</code> and select <code>"extern flash light ws281x ..."</code>.</p>
<p><img src="https://raw.githubusercontent.com/jomjol/ai-on-the-edge-device/master/images/external_GPIO_settings.jpg" width="700"/></p>
<table>
<thead>
<tr>
@@ -731,7 +731,7 @@ For power supply stabilization a capacitor between 5V and ground is recommended.
</tr>
</tbody>
</table>
<p>Enabling the GPIO settings automatically disables the flash LED. Therefore you can enable it here manually by checking GPIO4 and choose <code>"build-in led flash light"</code>. It is not recommended to use both illumination parallel. </p>
<p>Enabling the GPIO settings automatically disables the flash LED. Therefore you can enable it here manually by checking GPIO4 and choose <code>"build-in led flash light"</code>. It is not recommended to use both illumination parallel.</p>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>

View File

@@ -823,7 +823,7 @@
<ul>
<li>ESP32CAM hardware antenna design is very poor in connection with camera frequency.</li>
<li>Simple test: When the device is in operation, putting your thumb on the camera connector and the directly adjacent components should make the device respond more quickly.</li>
<li>Possible optimization: Here, an attempt was made to dampen the frequency influences somewhat by shielding.
<li>Possible optimization: Here, an attempt was made to dampen the frequency influences somewhat by shielding.
<a href="https://www.reddit.com/r/esp32/comments/r9g5jc/fixing_ymmv_the_poor_frame_rate_on_the_esp32cam/">Shielding Example</a></li>
<li>WLAN channel: Preferably use channel 1, 6 or 11</li>
<li>Performance can vary depending on the AP manufacturer. If necessary, check with a mobile hotspot or other device to exclude AP influence</li>
@@ -843,7 +843,7 @@
<li>Are you trying to read digits, an analog dial, or both?</li>
<li>etc.</li>
</ul>
<p>Anecdotally, the authors of this page have great success with the meter. While the AI algorithm itself is not perfect and sometimes returns <code>NaN</code> or incorrect values, other post-processing / prevalue / sanity checks help ensure such invalid values are filtered out. With the correct settings, one author has been running this device for 1 month without any incorrect values reported. </p>
<p>Anecdotally, the authors of this page have great success with the meter. While the AI algorithm itself is not perfect and sometimes returns <code>NaN</code> or incorrect values, other post-processing / prevalue / sanity checks help ensure such invalid values are filtered out. With the correct settings, one author has been running this device for 1 month without any incorrect values reported.</p>
<p>See the FAQs below for more details and configuration hints.</p>
<h2 id="my-numbers-are-not-correctly-detected-what-can-i-do"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.4</span> My numbers are not correctly detected. What can I do?</h2>
<ul>
@@ -867,32 +867,32 @@
<p>The neutral position (no rolling) is not perfectly at zero, but rather at something like 7.9 or 8.1, even if it should be exactly 8</p>
</li>
<li>
<p>The "PostProcessingAlgo" is trying to judge out of the individual readings, what number it should be. </p>
<p>The "PostProcessingAlgo" is trying to judge out of the individual readings, what number it should be.</p>
</li>
<li>
<p>For example if the previous number is a "1", but the next number seems to be a "8.9", most probably there was a "zero crossing" and the number is a "9" and not still an "8"</p>
</li>
<li>
<p>Currently the setting of the algorithm is set to fit most of the meters and cases. But the parameters do not fit perfectly for all situations. Therefore there might be intermediate states, where the reading is false.
<p>Currently the setting of the algorithm is set to fit most of the meters and cases. But the parameters do not fit perfectly for all situations. Therefore there might be intermediate states, where the reading is false.
This is especially the case, at the positions, where the roll over (zero crossing) is just starting.</p>
</li>
<li>To prevent a sending of false parameters, there is the possibility to limit the maximum allowed change (MaxRateChange).
Usually after some time and movement of the counters a bit further, the reading is getting back to a stable reading.</li>
<li>To handle this, a parametrized setting would be needed. This is rather complicated to implement as subtle changes make a relevant difference. Currently this is not implemented.
<li>To handle this, a parametrized setting would be needed. This is rather complicated to implement as subtle changes make a relevant difference. Currently this is not implemented.
So please be a bit patient with your meter :-)</li>
</ul>
<h2 id="pre-value"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.7</span> Pre-Value</h2>
<p>PreValue is here a bit missleading, because normally it is the same as the last value. In the next round of reading it will be used to check negative rates, high rates (MaxRateValue / MaxRateType) and CheckDigitIncreaseConsistency (dig-class11 only). Either from a previous correctly identified value or manual setting by the user.</p>
<p>If you use post processes, enable the pre-value. The pre-value must be set at first time. Set it to the current raw value. </p>
<p>If you use post processes, enable the pre-value. The pre-value must be set at first time. Set it to the current raw value.</p>
<p>If the device runs in errors, the pre-value will not be updated, as long as the <code>preValueAgeStartup</code> time between the last valid value (or startup time) and current time is not exceeded. After it the preValue will be set again, if no other error occured. So the device can not run in an endless error, like high rate.</p>
<h2 id="rate-too-high-read"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.8</span> "Rate too high - Read: ..."</h2>
<p>In configuration you can set the <code>MaxRateValue</code> and <code>MaxRateType</code>. The settings suppress improbably high values that can come from false readings. To do this, the value must be set correctly depending on your meter.</p>
<p>Before doing this, you should be clear about the type of rating you want to use.</p>
<ul>
<li><code>Absolute change</code> is the interval between two readings - no matter how often the readings happen. </li>
<li><code>RateChange</code> is the change per minute. This is calculated from the time difference between the last and the current reading. </li>
<li><code>Absolute change</code> is the interval between two readings - no matter how often the readings happen.</li>
<li><code>RateChange</code> is the change per minute. This is calculated from the time difference between the last and the current reading.</li>
</ul>
<p>If there is an interval of 5 minutes between readings and a MaxRateValue of 1, an error "Rate too high - Read: ..." if </p>
<p>If there is an interval of 5 minutes between readings and a MaxRateValue of 1, an error "Rate too high - Read: ..." if</p>
<ul>
<li>Absolute change: the difference is <code>&gt; 1</code></li>
<li>RateChange: the difference is <code>&gt; 1 / 5</code></li>

View File

@@ -450,7 +450,7 @@
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix="">
<li class="md-nav__item">
<a class="md-nav__link" href="#sporadic-random-reboots">1.0.1
<a class="md-nav__link" href="#sporadic-random-reboots">1.1
<span class="md-ellipsis">
Sporadic random reboots
</span>
@@ -458,14 +458,15 @@
<nav aria-label="Sporadic random reboots" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#system-instabilities">1.0.1.0.1
<a class="md-nav__link" href="#system-instabilities">1.1.1
<span class="md-ellipsis">
System instabilities
</span>
</a>
</li>
<nav aria-label="System instabilities" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#overload-during-html-access">1.0.1.1
<a class="md-nav__link" href="#overload-during-html-access">1.1.1.1
<span class="md-ellipsis">
Overload during HTML access
</span>
@@ -473,7 +474,7 @@
<nav aria-label="Overload during HTML access" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#bad-or-insufficient-power-supply">1.0.1.1.1
<a class="md-nav__link" href="#bad-or-insufficient-power-supply">1.1.1.1.1
<span class="md-ellipsis">
Bad or insufficient power supply
</span>
@@ -486,7 +487,7 @@
</nav>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#repeating-boot-loops">1.0.2
<a class="md-nav__link" href="#repeating-boot-loops">1.1.2
<span class="md-ellipsis">
Repeating boot loops
</span>
@@ -494,7 +495,7 @@
<nav aria-label="Repeating boot loops" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#sd-card-related-issues">1.0.2.0.1
<a class="md-nav__link" href="#sd-card-related-issues">1.1.2.1
<span class="md-ellipsis">
SD card related issues
</span>
@@ -502,21 +503,22 @@
<nav aria-label="SD card related issues" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#sd-card-wrong-filesystem-only-fat32-is-supported">1.0.2.0.1.1
<a class="md-nav__link" href="#sd-card-wrong-filesystem-only-fat32-is-supported">1.1.2.1.1
<span class="md-ellipsis">
SD card: Wrong filesystem (only FAT32 is supported)
</span>
</a>
</li>
<nav aria-label="SD card: Wrong filesystem (only FAT32 is supported)" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#sd-card-not-detected-not-supported">1.0.2.0.1.2
<a class="md-nav__link" href="#sd-card-not-detected-not-supported">1.1.2.1.1.1
<span class="md-ellipsis">
SD card not detected / not supported
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#sd-card-detected-but-files-are-not-readable-writeable">1.0.2.0.1.3
<a class="md-nav__link" href="#sd-card-detected-but-files-are-not-readable-writeable">1.1.2.1.1.2
<span class="md-ellipsis">
SD card detected but files are not readable / writeable
</span>
@@ -526,7 +528,7 @@
</nav>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#ram-related-issues">1.0.2.0.2
<a class="md-nav__link" href="#ram-related-issues">1.1.2.1.2
<span class="md-ellipsis">
RAM related issues
</span>
@@ -534,7 +536,7 @@
<nav aria-label="RAM related issues" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#too-less-external-ram-psram">1.0.2.0.2.1
<a class="md-nav__link" href="#too-less-external-ram-psram">1.1.2.1.2.1
<span class="md-ellipsis">
Too less external RAM (PSRAM)
</span>
@@ -544,7 +546,7 @@
</nav>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#configuration-related-issues">1.0.2.0.3
<a class="md-nav__link" href="#configuration-related-issues">1.1.2.1.3
<span class="md-ellipsis">
Configuration related issues
</span>
@@ -552,14 +554,14 @@
<nav aria-label="Configuration related issues" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#folders-and-files-missing">1.0.2.0.3.1
<a class="md-nav__link" href="#folders-and-files-missing">1.1.2.1.3.1
<span class="md-ellipsis">
Folders and files missing
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#cnn-model-file-not-available-corrupt">1.0.2.0.3.2
<a class="md-nav__link" href="#cnn-model-file-not-available-corrupt">1.1.2.1.3.2
<span class="md-ellipsis">
CNN model file not available / corrupt
</span>
@@ -574,6 +576,12 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../Demo-Mode/">
<span class="md-ellipsis">
@@ -784,7 +792,7 @@
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix="">
<li class="md-nav__item">
<a class="md-nav__link" href="#sporadic-random-reboots">1.0.1
<a class="md-nav__link" href="#sporadic-random-reboots">1.1
<span class="md-ellipsis">
Sporadic random reboots
</span>
@@ -792,14 +800,15 @@
<nav aria-label="Sporadic random reboots" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#system-instabilities">1.0.1.0.1
<a class="md-nav__link" href="#system-instabilities">1.1.1
<span class="md-ellipsis">
System instabilities
</span>
</a>
</li>
<nav aria-label="System instabilities" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#overload-during-html-access">1.0.1.1
<a class="md-nav__link" href="#overload-during-html-access">1.1.1.1
<span class="md-ellipsis">
Overload during HTML access
</span>
@@ -807,7 +816,7 @@
<nav aria-label="Overload during HTML access" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#bad-or-insufficient-power-supply">1.0.1.1.1
<a class="md-nav__link" href="#bad-or-insufficient-power-supply">1.1.1.1.1
<span class="md-ellipsis">
Bad or insufficient power supply
</span>
@@ -820,7 +829,7 @@
</nav>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#repeating-boot-loops">1.0.2
<a class="md-nav__link" href="#repeating-boot-loops">1.1.2
<span class="md-ellipsis">
Repeating boot loops
</span>
@@ -828,7 +837,7 @@
<nav aria-label="Repeating boot loops" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#sd-card-related-issues">1.0.2.0.1
<a class="md-nav__link" href="#sd-card-related-issues">1.1.2.1
<span class="md-ellipsis">
SD card related issues
</span>
@@ -836,21 +845,22 @@
<nav aria-label="SD card related issues" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#sd-card-wrong-filesystem-only-fat32-is-supported">1.0.2.0.1.1
<a class="md-nav__link" href="#sd-card-wrong-filesystem-only-fat32-is-supported">1.1.2.1.1
<span class="md-ellipsis">
SD card: Wrong filesystem (only FAT32 is supported)
</span>
</a>
</li>
<nav aria-label="SD card: Wrong filesystem (only FAT32 is supported)" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#sd-card-not-detected-not-supported">1.0.2.0.1.2
<a class="md-nav__link" href="#sd-card-not-detected-not-supported">1.1.2.1.1.1
<span class="md-ellipsis">
SD card not detected / not supported
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#sd-card-detected-but-files-are-not-readable-writeable">1.0.2.0.1.3
<a class="md-nav__link" href="#sd-card-detected-but-files-are-not-readable-writeable">1.1.2.1.1.2
<span class="md-ellipsis">
SD card detected but files are not readable / writeable
</span>
@@ -860,7 +870,7 @@
</nav>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#ram-related-issues">1.0.2.0.2
<a class="md-nav__link" href="#ram-related-issues">1.1.2.1.2
<span class="md-ellipsis">
RAM related issues
</span>
@@ -868,7 +878,7 @@
<nav aria-label="RAM related issues" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#too-less-external-ram-psram">1.0.2.0.2.1
<a class="md-nav__link" href="#too-less-external-ram-psram">1.1.2.1.2.1
<span class="md-ellipsis">
Too less external RAM (PSRAM)
</span>
@@ -878,7 +888,7 @@
</nav>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#configuration-related-issues">1.0.2.0.3
<a class="md-nav__link" href="#configuration-related-issues">1.1.2.1.3
<span class="md-ellipsis">
Configuration related issues
</span>
@@ -886,14 +896,14 @@
<nav aria-label="Configuration related issues" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#folders-and-files-missing">1.0.2.0.3.1
<a class="md-nav__link" href="#folders-and-files-missing">1.1.2.1.3.1
<span class="md-ellipsis">
Folders and files missing
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#cnn-model-file-not-available-corrupt">1.0.2.0.3.2
<a class="md-nav__link" href="#cnn-model-file-not-available-corrupt">1.1.2.1.3.2
<span class="md-ellipsis">
CNN model file not available / corrupt
</span>
@@ -907,6 +917,12 @@
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
@@ -927,7 +943,7 @@
<li>Repeating boot loops (reoccuring, always stop working after same precondition)</li>
</ol>
<hr/>
<h3 id="sporadic-random-reboots"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.1</span> Sporadic random reboots</h3>
<h2 id="sporadic-random-reboots"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1</span> Sporadic random reboots</h2>
<p>Sporadic random reboots could have the following reasons:</p>
<ul>
<li>In general: Unstable system due to software issues (e.g. overload during HTML access, ...)
@@ -936,8 +952,8 @@
--&gt; The power supply need to stable to ensure proper operation of the device. If it's not stable the device tents to sporadic reboots (brownout detection)</li>
</ul>
<p>In general: There are several mechanisms in the firmware (like saving previous values), to have a "smooth" reboot without too many notable disturbance.</p>
<h5 id="system-instabilities"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.1.0.1</span> System instabilities</h5>
<p>If your system is sometimes running smoothly over several runs and sometimes reboots obviously randomly, you have an partially unstable device. </p>
<h3 id="system-instabilities"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.1</span> System instabilities</h3>
<p>If your system is sometimes running smoothly over several runs and sometimes reboots obviously randomly, you have an partially unstable device.</p>
<p>You can check this in the standard log file on the SD card:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-0-1"><a href="#__codelineno-0-1" id="__codelineno-0-1" name="__codelineno-0-1"></a>2021-12-26T06:34:09: task_autodoFlow - round done
</span><span id="__span-0-2"><a href="#__codelineno-0-2" id="__codelineno-0-2" name="__codelineno-0-2"></a>2021-12-26T06:34:09: CPU Temperature: 56.1
@@ -945,40 +961,40 @@
</span></code></pre></div>
<p>Here you see, that the round #23 is starting, so obviously there were no reboots in the last 22 rounds. There is hardware (ESP32CAM), where only 2-3 stable rounds are possible and others, where way more than 100 rounds without any reboots is possible.
There is noting you can do about it, beside testing different hardware.</p>
<h4 id="overload-during-html-access"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.1.1</span> Overload during HTML access</h4>
<p>If you frequently access the web server over HTML requests, the firmware tends to reboot. This especially happens during the first run and when the ESP32 is busy with the digitization flow. </p>
<h4 id="overload-during-html-access"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.1.1</span> Overload during HTML access</h4>
<p>If you frequently access the web server over HTML requests, the firmware tends to reboot. This especially happens during the first run and when the ESP32 is busy with the digitization flow.</p>
<p>The reason for this are running out of memory during a flow, minor memory leakage in combination with missing error handling.</p>
<p>There is noting you can do about this kind of reboot, beside two thing:</p>
<ol>
<li>Support the firmware development with improved and tested part of code</li>
<li>Be patient :-)</li>
</ol>
<h5 id="bad-or-insufficient-power-supply"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.1.1.1</span> Bad or insufficient power supply</h5>
<h5 id="bad-or-insufficient-power-supply"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.1.1.1</span> Bad or insufficient power supply</h5>
<p>A good and stabilized power supply is essential to have error free operation. The device is quite picky in terms of proper power supply. Especially the wifi module have some load spikes which the power supply needs to cover. If the power is not stable enough, the brwonout mechanism is protecting against strange behaviour and force a reboot whenever the voltage drops below a specific level. You can see this in random reboots which indication is logfile: --&gt; Reset reason: Brownout</p>
<h3 id="repeating-boot-loops"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.2</span> Repeating boot loops</h3>
<h3 id="repeating-boot-loops"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.2</span> Repeating boot loops</h3>
<p>Repeating boot loops at the same situation during the flow has a systematic problem either in the hardware or the configuration. It usually happens during initialization state or processing the first round as there all needed parts of the firmware have been loaded for the first time.</p>
<p>To identify the root cause the logfiles, the reduced web interface, the red board LED or the serial log of the UART interface (no remote access, USB access needed) is helpful. </p>
<p>To identify the root cause the logfiles, the reduced web interface, the red board LED or the serial log of the UART interface (no remote access, USB access needed) is helpful.</p>
<p>Possible issues:</p>
<ul>
<li>SD card related issues</li>
<li>RAM related issues</li>
<li>Configuration related issues</li>
</ul>
<h5 id="sd-card-related-issues"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.2.0.1</span> SD card related issues</h5>
<h4 id="sd-card-related-issues"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.2.1</span> SD card related issues</h4>
<p>The ESP32CAM is a little bit "picky" with the supported SD cards. Due to the limited availability of GPIOs the SD card can only be accessed via 1-wire mode. Therefore not all SD cards are supported. The following error cases can occur:</p>
<h6 id="sd-card-wrong-filesystem-only-fat32-is-supported"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.2.0.1.1</span> SD card: Wrong filesystem (only FAT32 is supported)</h6>
<h5 id="sd-card-wrong-filesystem-only-fat32-is-supported"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.2.1.1</span> SD card: Wrong filesystem (only FAT32 is supported)</h5>
<p>If this SD card error is detected only the following indications are available. No web interface will be accessible.</p>
<ul>
<li>Red board LED is blinking. The blinking codes are described here: <a href="https://jomjol.github.io/AI-on-the-edge-device-docs/StatusLED-BlinkCodes/">Status LED Blinkcodes</a></li>
<li>Error messages on serial log (UART interface)</li>
</ul>
<h6 id="sd-card-not-detected-not-supported"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.2.0.1.2</span> SD card not detected / not supported</h6>
<h6 id="sd-card-not-detected-not-supported"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.2.1.1.1</span> SD card not detected / not supported</h6>
<p>If this SD card error is detected the following indication are available. No web interface will be accessible.</p>
<ul>
<li>Red board LED is blinking. The blinking codes are described here: <a href="https://jomjol.github.io/AI-on-the-edge-device-docs/StatusLED-BlinkCodes/">Status LED Blinkcodes</a></li>
<li>Error messages on serial log (UART interface)</li>
</ul>
<h6 id="sd-card-detected-but-files-are-not-readable-writeable"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.2.0.1.3</span> SD card detected but files are not readable / writeable</h6>
<h6 id="sd-card-detected-but-files-are-not-readable-writeable"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.2.1.1.2</span> SD card detected but files are not readable / writeable</h6>
<p>The SD card is detected, but the files cannot be read or written. A basic SD card check for SD reading / writing is performed on every boot. This not 100% guarantee that SD card is working but it's at least a indication.</p>
<p>If this SD card error is detected the following indications are available:</p>
<ul>
@@ -987,10 +1003,10 @@ There is noting you can do about it, beside testing different hardware.</p>
<li>Red board LED is blinking. The blinking codes are described here: <a href="https://jomjol.github.io/AI-on-the-edge-device-docs/StatusLED-BlinkCodes/">Status LED Blinkcodes</a></li>
<li>Error messages on serial log (UART interface)</li>
</ul>
<h5 id="ram-related-issues"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.2.0.2</span> RAM related issues</h5>
<h5 id="ram-related-issues"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.2.1.2</span> RAM related issues</h5>
<p>In order to run the firmware, 4 MB of external RAM (PSRAM) are mandatory. Usually, the ESP32CAM is equipped with 8MB (64Mbit) PSRAM chip, whereof only 4MB can be used effectively (direct addressable).
Unfortunately, there is hardware around, where no PSRAM or only 2MB of PSRAM is present - <strong>even if you have bought a device where a 8MB PSRAM was promoted</strong>. These modules are not suiable for this firmware because the external RAM is needed to handle the CNN files and camera images. There is nothing to do, than to buy a new ESP32CAM with <strong>really</strong> 64MBit of PSRAM. </p>
<h6 id="too-less-external-ram-psram"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.2.0.2.1</span> Too less external RAM (PSRAM)</h6>
Unfortunately, there is hardware around, where no PSRAM or only 2MB of PSRAM is present - <strong>even if you have bought a device where a 8MB PSRAM was promoted</strong>. These modules are not suiable for this firmware because the external RAM is needed to handle the CNN files and camera images. There is nothing to do, than to buy a new ESP32CAM with <strong>really</strong> 64MBit of PSRAM.</p>
<h6 id="too-less-external-ram-psram"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.2.1.2.1</span> Too less external RAM (PSRAM)</h6>
<p>During the boot process the available RAM is going to be checked.</p>
<p>If there is too less RAM (PSRAM or total HEAP &lt; 4MB) detected, the follwoing indications are available:</p>
<ul>
@@ -999,8 +1015,8 @@ Unfortunately, there is hardware around, where no PSRAM or only 2MB of PSRAM is
<li>Red board LED is blinking. The blinking codes are described here: <a href="https://jomjol.github.io/AI-on-the-edge-device-docs/StatusLED-BlinkCodes/">Status LED Blinkcodes</a></li>
<li>Error messages on serial log (UART interface)</li>
</ul>
<h5 id="configuration-related-issues"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.2.0.3</span> Configuration related issues</h5>
<h6 id="folders-and-files-missing"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.2.0.3.1</span> Folders and files missing</h6>
<h5 id="configuration-related-issues"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.2.1.3</span> Configuration related issues</h5>
<h6 id="folders-and-files-missing"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.2.1.3.1</span> Folders and files missing</h6>
<p>Most of the relevant folders and files are checked during boot. The complete list can be found here: <a href="https://jomjol.github.io/AI-on-the-edge-device-docs/Error-Codes/">Error codes on reduced webinterface</a></p>
<p>If a relevant folder or file is missing the following indications are available:</p>
<ul>
@@ -1009,13 +1025,13 @@ Unfortunately, there is hardware around, where no PSRAM or only 2MB of PSRAM is
<li>Red board LED is blinking. The blinking codes are described here: <a href="https://jomjol.github.io/AI-on-the-edge-device-docs/StatusLED-BlinkCodes/">Status LED Blinkcodes</a></li>
<li>Error messages on serial log (UART interface)</li>
</ul>
<h6 id="cnn-model-file-not-available-corrupt"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.0.2.0.3.2</span> CNN model file not available / corrupt</h6>
<h6 id="cnn-model-file-not-available-corrupt"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.2.1.3.2</span> CNN model file not available / corrupt</h6>
<p>Additionally for operation CNN model files on SD card are mandatory, one CNN model file for analog counter and for for digit numbers each.</p>
<ul>
<li><code>/config/XXXXX.tflite</code> (XXXXX is the file name, that is written in the <code>config.ini</code>)</li>
</ul>
<p>If the files which are configured in <code>config.ini</code> are not present or corrupt, the process is going to be interrupted (or at worst case a device crash occurs). Please check logs files to have an indicator for the root cause.</p>
<p>This a logfile extract (DEBUB log level) where digit CNN model file is not present. The system is initializing the system and trying to load the model files:
<p>This a logfile extract (DEBUB log level) where digit CNN model file is not present. The system is initializing the system and trying to load the model files:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-1-1"><a href="#__codelineno-1-1" id="__codelineno-1-1" name="__codelineno-1-1"></a>[0d00h05m11s] 2023-03-27T12:25:14 [TFLITE] CTfLiteClass::LoadModel
</span><span id="__span-1-2"><a href="#__codelineno-1-2" id="__codelineno-1-2" name="__codelineno-1-2"></a>[0d00h05m11s] 2023-03-27T12:25:14 [TFLITE] CTfLiteClass::ReadFileToModel: /sdcard
</span><span id="__span-1-3"><a href="#__codelineno-1-3" id="__codelineno-1-3" name="__codelineno-1-3"></a>[0d00h05m11s] 2023-03-27T12:25:14 [PSRAM] Failed to allocate 0 bytes in PSRAM for 'TFLITE-&gt;modelfile'!
@@ -1032,12 +1048,12 @@ Unfortunately, there is hardware around, where no PSRAM or only 2MB of PSRAM is
</span><span id="__span-1-14"><a href="#__codelineno-1-14" id="__codelineno-1-14" name="__codelineno-1-14"></a>[0d00h05m12s] 2023-03-27T12:25:15 [TFLITE] CTfLiteClass::MakeAllocate
</span><span id="__span-1-15"><a href="#__codelineno-1-15" id="__codelineno-1-15" name="__codelineno-1-15"></a>[0d00h05m12s] 2023-03-27T12:25:15 [PSRAM] Freeing memory in PSRAM used for 'TFLITE-&gt;modelfile'...
</span><span id="__span-1-16"><a href="#__codelineno-1-16" id="__codelineno-1-16" name="__codelineno-1-16"></a>[0d00h05m12s] 2023-03-27T12:25:15 [PSRAM] Freeing memory in PSRAM used for 'TFLITE-&gt;tensor_arena'...
</span></code></pre></div></p>
</span></code></pre></div>
<ul>
<li>Bad config example:</li>
<li>
<p><code>[0d00h05m11s] 2023-03-27T12:25:14 [TFLITE] CTfLiteClass::ReadFileToModel: /sdcard</code>
--&gt; model file missing: check configuration or file presence </p>
--&gt; model file missing: check configuration or file presence</p>
</li>
<li>
<p>Good config example:</p>

View File

@@ -965,11 +965,11 @@
<h3 id="esp32-cam"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.1</span> ESP32-CAM</h3>
<ul>
<li>OV2640 camera module</li>
<li>Micro SD card slot </li>
<li>4 or 8 MB PSRAM. </li>
<li>Micro SD card slot</li>
<li>4 or 8 MB PSRAM.</li>
</ul>
<p>It can be easily found on the typical internet stores, searching for ESP32-CAM for less than 10 EUR.
How ever since the hardware is cheap and coming from China, you unluckily could pick a malfunctioning device. See <a href="../Hardware-Compatibility/">Hardware Compatibility</a> for further advice! </p>
How ever since the hardware is cheap and coming from China, you unluckily could pick a malfunctioning device. See <a href="../Hardware-Compatibility/">Hardware Compatibility</a> for further advice!</p>
<h3 id="usb-uart-interface"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.2</span> USB-&gt;UART interface</h3>
<p>For first time flashing the firmware a USB -&gt; UART connector is needed. Later firmware upgrades than can be flashed via OTA.</p>
<h3 id="power-supply"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.3</span> Power supply</h3>
@@ -980,8 +980,8 @@ How ever since the hardware is cheap and coming from China, you unluckily could
</div>
<h3 id="housing"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.4</span> Housing</h3>
<p>A small 3D-printable example for a very small case can be found in Thingiverse here: <a href="https://www.thingiverse.com/thing:4571627">https://www.thingiverse.com/thing:4571627</a></p>
<p><img alt="" src="../img/main.jpg" style="width:200px">
<img alt="" src="../img/size.png" style="width:200px"/></img></p>
<p><img alt="Main" src="../img/main.jpg" style="width:200px">
<img alt="Size" src="../img/size.png" style="width:200px"/></img></p>
<h3 id="focusing-the-lense"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.5</span> Focusing the lense</h3>
<p>The focus of the OV2640 needs to be adjusted, as it is normally set from ~40cm to infinity. In order to get an image that is big enough, it needs to be changed to about 10cm.
Therefore the sealing glue on the objective ring needs to be removed with a scalpel or sharp knife. Afterwards the objective can be rotated clockwise until the image is sharp again.</p>
@@ -991,19 +991,19 @@ Therefore the sealing glue on the objective ring needs to be removed with a scal
</div>
<p>There are some useful 3D-printable tools available, see <a href="https://www.printables.com/model/877739-esp32-cam-ov2640-focus-adjustment-wrench/comments">esp32-cam OV2640 focus adjustment wrench</a> or <a href="https://www.etsy.com/ch/listing/4313477325/esp32-cam-ov2640-fokus-einstellring">ETSY shop</a> if you don't have a 3D printer.
Also check the discussions for some hints, eg. <a href="https://github.com/jomjol/AI-on-the-edge-device/discussions/3777">discussion 3777</a>.</p>
<p><img alt="" src="../img/focus_adjustment.jpg" style="width:200px"/></p>
<p><img alt="Focus Adjustment" src="../img/focus_adjustment.jpg" style="width:200px"/></p>
<h3 id="wiring"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.6</span> Wiring</h3>
<p>Beside the 5V power supply, only for the first flashing a connection to the USB-UART connector, including a short cut of GPIO0 to GND for bootloader start.</p>
<p>A example for wiring can be found here:</p>
<p><img alt="" src="../img/wiring.png"/></p>
<p><img alt="" src="../img/progammer_manual.jpg"/></p>
<p><img alt="Wiring" src="../img/wiring.png"/></p>
<p><img alt="Programmer Manual" src="../img/progammer_manual.jpg"/></p>
<p>It is also possible to use external LEDs for the illumination instead of the internal flash LED. This is described <a href="../External-LED/">here</a></p>
<h2 id="2-firmware"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.2</span> 2. Firmware</h2>
<h3 id="web-installer"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.2.1</span> Web Installer</h3>
<p>There is a Web Installer available which will work right out of the web browser Edge and Chrome.
You can access it with the following link: <a href="https://jomjol.github.io/AI-on-the-edge-device">Web Installer</a></p>
<p><strong>This is the preferred way for beginners</strong> as it also allows access to the USB Log:</p>
<p><a href="../img/web-console.png"><img alt="" src="../img/web-console.png"/></a></p>
<p><a href="../img/web-console.png"><img alt="Web Console" src="../img/web-console.png"/></a></p>
<h3 id="manual-flashing"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.2.2</span> Manual Flashing</h3>
<h4 id="files"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.2.2.1</span> Files</h4>
<p>Grab the firmware from the</p>
@@ -1019,7 +1019,7 @@ You can access it with the following link: <a href="https://jomjol.github.io/AI-
</ul>
<h4 id="flashing-using-the-flash-tool-from-espressif-gui"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.2.2.2</span> Flashing using the Flash Tool from Espressif (GUI)</h4>
<p>Get the <a href="https://www.espressif.com/en/support/download/other-tools">Flash Download Tool</a> from Espressif.</p>
<p>Download and extract the Flash tool, after starting choose "Developer Mode", then "ESP32-DownloadTool" and you are in the setup of the flashing tool. Connect the ESP32-CAM with the USB-UART connection and identify the COM-Port. </p>
<p>Download and extract the Flash tool, after starting choose "Developer Mode", then "ESP32-DownloadTool" and you are in the setup of the flashing tool. Connect the ESP32-CAM with the USB-UART connection and identify the COM-Port.</p>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>If you are re-flashing the code again, it is strongly recommended to erase the flash memory before flashing the firmware. Especially if you used OTA in between, which might cause remaining information on the flash, to still boot from an old image in the OTA-area, which is not erased by a normal flash.</p>
@@ -1047,24 +1047,26 @@ You can access it with the following link: <a href="https://jomjol.github.io/AI-
</tr>
</tbody>
</table>
<p><img alt="" src="../img/Flash_Settings.png"/></p>
<p><img alt="Flash Settings" src="../img/Flash_Settings.png"/></p>
<h4 id="flashing-using-the-python-based-esptool-console"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.2.2.3</span> Flashing using the Python based esptool (Console)</h4>
<p>For this you need a python environment (e.g. Anaconda in Win10).
<p>For this you need a python environment (e.g. Anaconda in Win10).
Here you need to install the esptool:</p>
<p><div class="language-text highlight"><pre><span></span><code><span id="__span-0-1"><a href="#__codelineno-0-1" id="__codelineno-0-1" name="__codelineno-0-1"></a>pip install esptool
<div class="language-text highlight"><pre><span></span><code><span id="__span-0-1"><a href="#__codelineno-0-1" id="__codelineno-0-1" name="__codelineno-0-1"></a>pip install esptool
</span></code></pre></div>
Then connect the ESP32 with the USB-UART connector to the system, put it in boot mode and with the following command you can erase the flash and flash bootloader, partitions and firmware in two steps:</p>
<p><div class="language-text highlight"><pre><span></span><code><span id="__span-1-1"><a href="#__codelineno-1-1" id="__codelineno-1-1" name="__codelineno-1-1"></a>esptool erase_flash
<p>Then connect the ESP32 with the USB-UART connector to the system, put it in boot mode and with the following command you can erase the flash and flash bootloader, partitions and firmware in two steps:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-1-1"><a href="#__codelineno-1-1" id="__codelineno-1-1" name="__codelineno-1-1"></a>esptool erase_flash
</span><span id="__span-1-2"><a href="#__codelineno-1-2" id="__codelineno-1-2" name="__codelineno-1-2"></a>esptool write_flash 0x01000 bootloader.bin 0x08000 partitions.bin 0x10000 firmware.bin
</span></code></pre></div>
- Maybe you need to specify the COM-port if it is not detected by default.
- If the erase command throws the error <code>A fatal error occurred: ESP32 ROM does not support function erase_flash.</code>, your <code>esptool</code> might be too old, see <a href="https://techoverflow.net/2022/02/08/how-to-fix-esp32-a-fatal-error-occurred-esp32-rom-does-not-support-function-erase_flash/">https://techoverflow.net/2022/02/08/how-to-fix-esp32-a-fatal-error-occurred-esp32-rom-does-not-support-function-erase_flash/</a></p>
<ul>
<li>Maybe you need to specify the COM-port if it is not detected by default.</li>
<li>If the erase command throws the error <code>A fatal error occurred: ESP32 ROM does not support function erase_flash.</code>, your <code>esptool</code> might be too old, see <a href="https://techoverflow.net/2022/02/08/how-to-fix-esp32-a-fatal-error-occurred-esp32-rom-does-not-support-function-erase_flash/">https://techoverflow.net/2022/02/08/how-to-fix-esp32-a-fatal-error-occurred-esp32-rom-does-not-support-function-erase_flash/</a></li>
</ul>
<p>With some Python installations this may not work and youll receive an error, try <code>python -m pip install esptool</code> or <code>pip3 install esptool</code>.</p>
<p>Further recommendations can be found on the <a href="https://docs.espressif.com/projects/esptool/en/latest/esp32/installation.html">espressif webpage</a>.</p>
<h2 id="3-sd-card"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.3</span> 3. SD Card</h2>
<p>The software expects an SD card prepared with certain directory and file structure in order to work properly.
SD card most top directory should look like this:</p>
<p><img alt="" src="../sd-card-content.png"/> </p>
<p><img alt="SD Card Content" src="../sd-card-content.png"/> </p>
<p>This initial setup needs only to be done <strong>once</strong> as further updates (Firmware as well as SD card content) are possible with the <a href="../ota/">Over-The-Air Update</a> mechanism.</p>
<h4 id="notes"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.3.0.1</span> Notes</h4>
<ul>
@@ -1074,7 +1076,7 @@ SD card most top directory should look like this:</p>
<li>Some ESP32 devices share their SD-card and/or camera GPIOs with the pins for TX and RX. If you see errors like “Failed to connect” then your chip is probably not entering the bootloader properly. Remove the respective modules temporarily to free the GPIOs for flashing. You may find more information about troubleshooting on the <a href="https://docs.espressif.com/projects/esptool/en/latest/esp8266/troubleshooting.html">homepage of Espressif</a>.</li>
</ul>
<p><strong>The ESP32 indicates problems with the SD card during startup with a fast, endless blinking.</strong>
<strong>In this case, please try another SD card.</strong> </p>
<strong>In this case, please try another SD card.</strong></p>
<h3 id="manual-setup-with-an-sd-card-reader-on-a-pc"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.3.1</span> Manual Setup with an SD Card Reader on a PC</h3>
<ol>
<li>Take the <code>AI-on-the-edge-device__manual-setup__*.zip</code> from the <a href="https://github.com/jomjol/AI-on-the-edge-device/releases">Release</a> page.</li>
@@ -1096,19 +1098,19 @@ If not, the ESP32 switches to a special mode. In this mode, it provides a Wifi A
<li>Take the <code>AI-on-the-edge-device__remote-setup__*.zip</code> from the <a href="https://github.com/jomjol/AI-on-the-edge-device/releases">Release</a> page.</li>
<li>
<p>Connect to Access Point of the device. The SSID is "AI-on-the-Edge" and you can access it without any password:</p>
<p><img alt="" src="../img/access-point.png"/></p>
<p><img alt="Access Point" src="../img/access-point.png"/></p>
<p>The device has the following fixed IP: <a href="http://192.168.4.1">http://192.168.4.1</a>.</p>
</li>
<li>
<p>Upload initial configuration to SD card</p>
<p><img alt="" src="../img/setup-config.png"/></p>
<p><img alt="Setup Config" src="../img/setup-config.png"/></p>
<p>Use the <code>select file</code> and <code>upload</code> button to start the upload.
A warning will show up if you have chosen a possible wrong file (without default configuration).</p>
</li>
<li>
<p>Store WLAN access information.</p>
<p>After the upload, a new page will be shown:</p>
<p><img alt="" src="../img/setup-wlan.png"/></p>
<p><img alt="Setup WLAN" src="../img/setup-wlan.png"/></p>
<p>Enter your SSID and password.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
@@ -1126,7 +1128,7 @@ A warning will show up if you have chosen a possible wrong file (without default
<li>
<p>Reboot</p>
<p>The final step is the reboot:</p>
<p><img alt="" src="../img/setup-reboot.png"/></p>
<p><img alt="Setup Reboot" src="../img/setup-reboot.png"/></p>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>It will take up to 3 minutes. Afterwards you can find your device in the local network. Check your router for the IP. You can find it also in the USB Console output.</p>

View File

@@ -806,7 +806,7 @@
<img alt="grafik" src="https://user-images.githubusercontent.com/1783586/199352619-217df627-4b87-4fa0-86a2-f5347c452fdb.png"/></img></p>
<h3 id="using-mqtt-manually-setup-entities"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.1</span> Using MQTT (Manually Setup Entities)</h3>
<p>First make sure with an MQTT client (for example <a href="http://mqtt-explorer.com/">MQTT Explorer</a>) that MQTT works as expected and to get a list of the available topics!</p>
<p>Then add a sensor for each property:
<p>Then add a sensor for each property:</p>
<div class="language-yaml highlight"><pre><span></span><code><span id="__span-0-1"><a href="#__codelineno-0-1" id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="nt">mqtt</span><span class="p">:</span>
</span><span id="__span-0-2"><a href="#__codelineno-0-2" id="__codelineno-0-2" name="__codelineno-0-2"></a><span class="w"> </span><span class="nt">sensor</span><span class="p">:</span>
</span><span id="__span-0-3"><a href="#__codelineno-0-3" id="__codelineno-0-3" name="__codelineno-0-3"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">state_topic</span><span class="p">:</span><span class="w"> </span><span class="s">"wasserzaehler/main/value"</span>
@@ -851,7 +851,7 @@
</span><span id="__span-0-42"><a href="#__codelineno-0-42" id="__codelineno-0-42" name="__codelineno-0-42"></a><span class="w"> </span><span class="nt">payload_available</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">connected</span>
</span><span id="__span-0-43"><a href="#__codelineno-0-43" id="__codelineno-0-43" name="__codelineno-0-43"></a><span class="w"> </span><span class="nt">payload_not_available</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">connection lost</span>
</span></code></pre></div>
If you run the discovery once, you can also extract the information from there (MQTT Info, untested):
<p>If you run the discovery once, you can also extract the information from there (MQTT Info, untested):</p>
<div class="language-yaml highlight"><pre><span></span><code><span id="__span-1-1"><a href="#__codelineno-1-1" id="__codelineno-1-1" name="__codelineno-1-1"></a><span class="nt">mqtt</span><span class="p">:</span><span class="w"> </span><span class="c1"># Extracted form the Discovery but untested!</span>
</span><span id="__span-1-2"><a href="#__codelineno-1-2" id="__codelineno-1-2" name="__codelineno-1-2"></a><span class="w"> </span><span class="nt">sensor</span><span class="p">:</span>
</span><span id="__span-1-3"><a href="#__codelineno-1-3" id="__codelineno-1-3" name="__codelineno-1-3"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">Value</span>
@@ -864,8 +864,8 @@ If you run the discovery once, you can also extract the information from there (
</span><span id="__span-1-10"><a href="#__codelineno-1-10" id="__codelineno-1-10" name="__codelineno-1-10"></a><span class="w"> </span><span class="nt">availability_topic</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">wasserzaehler/connection</span>
</span><span id="__span-1-11"><a href="#__codelineno-1-11" id="__codelineno-1-11" name="__codelineno-1-11"></a><span class="w"> </span><span class="nt">payload_available</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">connected</span>
</span><span id="__span-1-12"><a href="#__codelineno-1-12" id="__codelineno-1-12" name="__codelineno-1-12"></a><span class="w"> </span><span class="nt">payload_not_available</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">connection lost</span>
</span></code></pre></div></p>
<p>If you want to convert the <code></code> to <code>l</code>, use a template sensor:
</span></code></pre></div>
<p>If you want to convert the <code></code> to <code>l</code>, use a template sensor:</p>
<div class="language-yaml highlight"><pre><span></span><code><span id="__span-2-1"><a href="#__codelineno-2-1" id="__codelineno-2-1" name="__codelineno-2-1"></a><span class="nt">template</span><span class="p">:</span>
</span><span id="__span-2-2"><a href="#__codelineno-2-2" id="__codelineno-2-2" name="__codelineno-2-2"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">sensor</span><span class="p">:</span>
</span><span id="__span-2-3"><a href="#__codelineno-2-3" id="__codelineno-2-3" name="__codelineno-2-3"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s">"Watermeter</span><span class="nv"> </span><span class="s">in</span><span class="nv"> </span><span class="s">l"</span>
@@ -874,7 +874,7 @@ If you run the discovery once, you can also extract the information from there (
</span><span id="__span-2-6"><a href="#__codelineno-2-6" id="__codelineno-2-6" name="__codelineno-2-6"></a><span class="w"> </span><span class="nt">state</span><span class="p">:</span><span class="w"> </span><span class="s">"{{</span><span class="nv"> </span><span class="s">states('sensor.watermeter_value')|float(default=0)</span><span class="nv"> </span><span class="s">*</span><span class="nv"> </span><span class="s">1000</span><span class="nv"> </span><span class="s">}}"</span><span class="w"> </span><span class="c1"># Convert 1 m3 =&gt; 1000 l</span>
</span><span id="__span-2-7"><a href="#__codelineno-2-7" id="__codelineno-2-7" name="__codelineno-2-7"></a><span class="w"> </span><span class="nt">unit_of_measurement</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">l</span>
</span><span id="__span-2-8"><a href="#__codelineno-2-8" id="__codelineno-2-8" name="__codelineno-2-8"></a><span class="w"> </span><span class="nt">availability</span><span class="p">:</span><span class="w"> </span><span class="s">"{{</span><span class="nv"> </span><span class="s">states('sensor.watermeter_value')</span><span class="nv"> </span><span class="s">not</span><span class="nv"> </span><span class="s">in</span><span class="nv"> </span><span class="s">['unknown',</span><span class="nv"> </span><span class="s">'unavailable',</span><span class="nv"> </span><span class="s">'none']</span><span class="nv"> </span><span class="s">}}"</span>
</span></code></pre></div></p>
</span></code></pre></div>
<p>If you you want to have the consumption per day, you can use an <a href="https://www.home-assistant.io/integrations/utility_meter/">Utility Meter</a>.
it is a helper and can be used to reset the total increasing values once a day</p>
<div class="language-yaml highlight"><pre><span></span><code><span id="__span-3-1"><a href="#__codelineno-3-1" id="__codelineno-3-1" name="__codelineno-3-1"></a><span class="nt">utility_meter</span><span class="p">:</span>
@@ -896,7 +896,7 @@ it is a helper and can be used to reset the total increasing values once a day</
<p>Note that there seems to be a bug in the graph, see <a href="https://github.com/home-assistant/frontend/issues/13995">https://github.com/home-assistant/frontend/issues/13995</a>!</p>
<h3 id="influxdb-graphs"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1.4</span> InfluxDb Graphs</h3>
<p>See also <a href="../Influx-DB/">Influx-DB</a>.</p>
<p>If you have setup InfluxDB already, it is also possible to fetch statistics from there, e.g. daily usage:
<p>If you have setup InfluxDB already, it is also possible to fetch statistics from there, e.g. daily usage:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-4-1"><a href="#__codelineno-4-1" id="__codelineno-4-1" name="__codelineno-4-1"></a>from(bucket: "HomeAssistant")
</span><span id="__span-4-2"><a href="#__codelineno-4-2" id="__codelineno-4-2" name="__codelineno-4-2"></a>|&gt; range(start: v.timeRangeStart, stop: v.timeRangeStop)
</span><span id="__span-4-3"><a href="#__codelineno-4-3" id="__codelineno-4-3" name="__codelineno-4-3"></a> |&gt; filter(fn: (r) =&gt; r["entity_id"] == "wasserverbrauch_tag")
@@ -904,14 +904,14 @@ it is a helper and can be used to reset the total increasing values once a day</
</span><span id="__span-4-5"><a href="#__codelineno-4-5" id="__codelineno-4-5" name="__codelineno-4-5"></a> |&gt; timeShift(duration: -1d)
</span><span id="__span-4-6"><a href="#__codelineno-4-6" id="__codelineno-4-6" name="__codelineno-4-6"></a> |&gt; aggregateWindow(every: 1d, fn: max, createEmpty: false)
</span><span id="__span-4-7"><a href="#__codelineno-4-7" id="__codelineno-4-7" name="__codelineno-4-7"></a> |&gt; yield(name: "mean")
</span></code></pre></div></p>
</span></code></pre></div>
<p><img alt="grafik" src="https://user-images.githubusercontent.com/1783586/193473347-c81fc301-c52f-4af0-9fcb-56fab12cacac.png"/></p>
<h2 id="using-rest"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.2</span> Using REST</h2>
<p>When using REST, Home Assistant has to periodically call an URL on the ESP32 which in return provides the requested data.</p>
<p>See <a href="../REST-API/">REST API</a> for a list of available URLs.</p>
<p>The most practical one is the <code>json</code> entrypoint which provides the most relevant data JSON formatted:
<code>http://&lt;IP&gt;/json</code>
This would return:
This would return:</p>
<div class="language-JSON highlight"><pre><span></span><code><span id="__span-5-1"><a href="#__codelineno-5-1" id="__codelineno-5-1" name="__codelineno-5-1"></a><span class="p">{</span>
</span><span id="__span-5-2"><a href="#__codelineno-5-2" id="__codelineno-5-2" name="__codelineno-5-2"></a><span class="nt">"main"</span><span class="p">:</span>
</span><span id="__span-5-3"><a href="#__codelineno-5-3" id="__codelineno-5-3" name="__codelineno-5-3"></a><span class="w"> </span><span class="p">{</span>
@@ -923,8 +923,8 @@ This would return:
</span><span id="__span-5-9"><a href="#__codelineno-5-9" id="__codelineno-5-9" name="__codelineno-5-9"></a><span class="w"> </span><span class="p">[</span><span class="err">..</span><span class="p">]</span>
</span><span id="__span-5-10"><a href="#__codelineno-5-10" id="__codelineno-5-10" name="__codelineno-5-10"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-5-11"><a href="#__codelineno-5-11" id="__codelineno-5-11" name="__codelineno-5-11"></a><span class="p">}</span>
</span></code></pre></div></p>
<p>To do such a REST call, you need to create a REST sensor:
</span></code></pre></div>
<p>To do such a REST call, you need to create a REST sensor:</p>
<div class="language-yaml highlight"><pre><span></span><code><span id="__span-6-1"><a href="#__codelineno-6-1" id="__codelineno-6-1" name="__codelineno-6-1"></a><span class="nt">sensor</span><span class="p">:</span>
</span><span id="__span-6-2"><a href="#__codelineno-6-2" id="__codelineno-6-2" name="__codelineno-6-2"></a>
</span><span id="__span-6-3"><a href="#__codelineno-6-3" id="__codelineno-6-3" name="__codelineno-6-3"></a><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">platform</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">rest</span>
@@ -952,7 +952,7 @@ This would return:
</span><span id="__span-6-25"><a href="#__codelineno-6-25" id="__codelineno-6-25" name="__codelineno-6-25"></a><span class="w"> </span><span class="nt">device_class</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">water</span>
</span><span id="__span-6-26"><a href="#__codelineno-6-26" id="__codelineno-6-26" name="__codelineno-6-26"></a><span class="w"> </span><span class="nt">state_class</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">total_increasing</span>
</span><span id="__span-6-27"><a href="#__codelineno-6-27" id="__codelineno-6-27" name="__codelineno-6-27"></a><span class="w"> </span><span class="nt">icon</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">mdi:gauge</span>
</span></code></pre></div></p>
</span></code></pre></div>
<p>The 2nd way is to use the html api call from value.html : </p>
<p><code>sensor:
- platform: rest

View File

@@ -1065,13 +1065,13 @@
</thead>
<tbody>
<tr>
<td><strong>Digits</strong> <br/><img alt="" src="../img/0_arbitrary.jpg"/></td>
<td><strong>Digits</strong> <br/><img alt="Arbitrary" src="../img/0_arbitrary.jpg"/></td>
<td><strong>dig-class11</strong>_XXX.tflite</td>
<td><strong>dig-class100</strong>_XXX.tflite</td>
<td><strong>dig-cont</strong>_XXX.tflite</td>
</tr>
<tr>
<td><strong>Analog Pointers</strong> <br/><img alt="" src="../img/ana-examp.jpg"/></td>
<td><strong>Analog Pointers</strong> <br/><img alt="ANA Example" src="../img/ana-examp.jpg"/></td>
<td></td>
<td><strong>ana-class100</strong>_XXX.tflite</td>
<td><strong>ana-cont</strong>_XXX.tflite</td>
@@ -1112,15 +1112,15 @@
</thead>
<tbody>
<tr>
<td><img alt="" src="../img/ana-cont/examp-ana1.jpg"/></td>
<td><img alt="" src="../img/ana-cont/examp-ana2.jpg"/></td>
<td><img alt="" src="../img/ana-cont/examp-ana3.jpg"/></td>
<td><img alt="" src="../img/ana-cont/examp-ana4.jpg"/></td>
<td><img alt="Example ana1" src="../img/ana-cont/examp-ana1.jpg"/></td>
<td><img alt="Example ana2" src="../img/ana-cont/examp-ana2.jpg"/></td>
<td><img alt="Example ana3" src="../img/ana-cont/examp-ana3.jpg"/></td>
<td><img alt="Example ana4" src="../img/ana-cont/examp-ana4.jpg"/></td>
</tr>
<tr>
<td><img alt="" src="../img/ana-cont/examp-ana5.jpg"/></td>
<td><img alt="" src="../img/ana-cont/examp-ana6.jpg"/></td>
<td><img alt="" src="../img/ana-cont/examp-ana7.jpg"/></td>
<td><img alt="Example ana5" src="../img/ana-cont/examp-ana5.jpg"/></td>
<td><img alt="Example ana6" src="../img/ana-cont/examp-ana6.jpg"/></td>
<td><img alt="Example ana7" src="../img/ana-cont/examp-ana7.jpg"/></td>
<td></td>
</tr>
</tbody>
@@ -1165,21 +1165,21 @@
</thead>
<tbody>
<tr>
<td><img alt="" src="../img/dig-class11/examp-dig1.jpg"/></td>
<td><img alt="" src="../img/dig-class11/examp-dig2.jpg"/></td>
<td><img alt="" src="../img/dig-class11/examp-dig3.jpg"/></td>
<td><img alt="" src="../img/dig-class11/examp-dig4.jpg"/></td>
<td><img alt="" src="../img/dig-class11/examp-dig13.jpg"/></td>
<td><img alt="" src="../img/dig-class11/examp-dig12.jpg"/></td>
<td><img alt="" src="../img/dig-class11/examp-dig9.jpg"/></td>
<td><img alt="Example Dig 1" src="../img/dig-class11/examp-dig1.jpg"/></td>
<td><img alt="Example Dig 2" src="../img/dig-class11/examp-dig2.jpg"/></td>
<td><img alt="Example Dig 3" src="../img/dig-class11/examp-dig3.jpg"/></td>
<td><img alt="Example Dig 4" src="../img/dig-class11/examp-dig4.jpg"/></td>
<td><img alt="Example Dig 13" src="../img/dig-class11/examp-dig13.jpg"/></td>
<td><img alt="Example Dig 12" src="../img/dig-class11/examp-dig12.jpg"/></td>
<td><img alt="Example Dig 9" src="../img/dig-class11/examp-dig9.jpg"/></td>
</tr>
<tr>
<td><img alt="" src="../img/dig-class11/examp-dig5.jpg"/></td>
<td><img alt="" src="../img/dig-class11/examp-dig6.jpg"/></td>
<td><img alt="" src="../img/dig-class11/examp-dig7.jpg"/></td>
<td><img alt="" src="../img/dig-class11/examp-dig8.jpg"/></td>
<td><img alt="" src="../img/dig-class11/examp-dig11.jpg"/></td>
<td><img alt="" src="../img/dig-class11/examp-dig10.jpg"/></td>
<td><img alt="Example Dig 5" src="../img/dig-class11/examp-dig5.jpg"/></td>
<td><img alt="Example Dig 6" src="../img/dig-class11/examp-dig6.jpg"/></td>
<td><img alt="Example Dig 7" src="../img/dig-class11/examp-dig7.jpg"/></td>
<td><img alt="Example Dig 8" src="../img/dig-class11/examp-dig8.jpg"/></td>
<td><img alt="Example Dig 11" src="../img/dig-class11/examp-dig11.jpg"/></td>
<td><img alt="Example Dig 10" src="../img/dig-class11/examp-dig10.jpg"/></td>
<td></td>
</tr>
</tbody>
@@ -1219,9 +1219,9 @@
</thead>
<tbody>
<tr>
<td><img alt="" src="../img/dig-cont/dig-cont_1.jpg"/></td>
<td><img alt="" src="../img/dig-cont/dig-cont_2a.jpg"/> <img alt="" src="../img/dig-cont/dig-cont_2b.jpg"/></td>
<td><img alt="" src="../img/dig-cont/dig-cont_3a.jpg"/> <img alt="" src="../img/dig-cont/dig-cont_3b.jpg"/> <img alt="" src="../img/dig-cont/dig-cont_3c.jpg"/></td>
<td><img alt="Digi Cont 1" src="../img/dig-cont/dig-cont_1.jpg"/></td>
<td><img alt="Dig Cont 2a" src="../img/dig-cont/dig-cont_2a.jpg"/> <img alt="Dig Cont 2b" src="../img/dig-cont/dig-cont_2b.jpg"/></td>
<td><img alt="Dig Cont 3a" src="../img/dig-cont/dig-cont_3a.jpg"/> <img alt="Dig Cont 3b" src="../img/dig-cont/dig-cont_3b.jpg"/> <img alt="Dig Cont 3c" src="../img/dig-cont/dig-cont_3c.jpg"/></td>
<td></td>
</tr>
</tbody>

View File

@@ -705,7 +705,7 @@ There are several ways for it:</p>
<li>Log into your Github account on <a href="https://github.com">Github</a>.</li>
<li>Go to <a href="https://github.com/jomjol/AI-on-the-edge-device">AI-on-the-edge-device</a>.</li>
<li>On the top right side, click onto <code>Watch</code> and select <code>Custom</code>:
<img alt="" src="../img/release-notification.png"> </img></li>
<img alt="Release Notification" src="../img/release-notification.png"> </img></li>
<li>Select <code>Releases</code>.</li>
</ol>
<p>You will get an email when a new release gets created.</p>

View File

@@ -650,10 +650,10 @@
<h1 id="password-protection"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.</span> Password Protection</h1>
<p>The Web Interface and the REST API can be protected by a password.</p>
<p>To do so, you have to set the username and password in the <code>wlan.ini</code> file on the SD-Card.
Uncomment (remove the leading <code>;</code>) and update the two lines with <code>http_username</code> and <code>http_password</code>:
Uncomment (remove the leading <code>;</code>) and update the two lines with <code>http_username</code> and <code>http_password</code>:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-0-1"><a href="#__codelineno-0-1" id="__codelineno-0-1" name="__codelineno-0-1"></a>http_username = "myusername"
</span><span id="__span-0-2"><a href="#__codelineno-0-2" id="__codelineno-0-2" name="__codelineno-0-2"></a>http_password = "mypassword"
</span></code></pre></div></p>
</span></code></pre></div>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>This is be a WEAK and INSECURE way to protect the Web Interface and the REST API.

View File

@@ -846,7 +846,7 @@ There are several precautions to detect this. For details see the section <code>
<p>For each digit or analog pointer, a ROI must be defined.</p>
<p>You can even have multiple independent <strong>Numbers</strong> (eg. electerical meters mostly have 2 numbers for the high and low tariff). </p>
<p>Depending if you have only one of those types, you can enable/disable <code>(1)</code> it on the top left corner: </p>
<p><img alt="" src="../img/initial_setup_3_rois.jpg" style="width:500px"/></p>
<p><img alt="Initial Setup ROI" src="../img/initial_setup_3_rois.jpg" style="width:500px"/></p>
<p>You can switch between the individual ROIs with the Drop down box <code>(2)</code>.
If you need additional ROIs or delete them you can do this with the control at <code>(3)</code>.
Like for the <a href="../Alignment/">Alignment References</a>, you can change the position, size and name of a ROI in the text fields or define them via drag and drop through the mouse button.
@@ -869,7 +869,7 @@ The ratio between <code>x</code> and <code>y</code> might need adjustment. But m
<p>For analog counters the ROI setting is rather straight forward as the meter is usually quadratic with a clear center.
The circle should exactly fit to the outer size of the meter and the cross should be in the middle of the pointer.</p>
<p>Here is an example with the details for the ROI <code>ana1</code>: </p>
<p><img alt="" src="../img/initial_setup_3_analog_example.jpg" style="width:500px"/></p>
<p><img alt="Initial Setup Analog Example" src="../img/initial_setup_3_analog_example.jpg" style="width:500px"/></p>
<h3 id="digits"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.2.2</span> Digits</h3>
<p>For the Digit Meters it is a little bit more complicated, as there are different options of digit models which can be choosen.</p>
<h4 id="correct-size-for-roi"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.2.2.1</span> Correct Size for ROI</h4>
@@ -910,18 +910,18 @@ For a first run you can choose the following general settings: </p>
<tbody>
<tr>
<td>✔️ <strong>Okay</strong></td>
<td><img alt="" src="../img/cont_img_ok.png" style="width:80px"/></td>
<td><img alt="" src="../img/wb_okay.jpg" style="width:80px"/></td>
<td><img alt="Image Okay" src="../img/cont_img_ok.png" style="width:80px"/></td>
<td><img alt="WB Okay" src="../img/wb_okay.jpg" style="width:80px"/></td>
</tr>
<tr>
<td><strong>Not</strong> Okay</td>
<td><img alt="" src="../img/bw_not_okay_small.jpg" style="width:80px"/></td>
<td><img alt="" src="../img/wb_not_okay_small.jpg" style="width:80px"/></td>
<td><img alt="BW Not Okay Small" src="../img/bw_not_okay_small.jpg" style="width:80px"/></td>
<td><img alt="WB Not Okay Small" src="../img/wb_not_okay_small.jpg" style="width:80px"/></td>
</tr>
<tr>
<td><strong>Not</strong> Okay</td>
<td><img alt="" src="../img/bw_not_okay_big.jpg" style="width:80px"/></td>
<td><img alt="" src="../img/wb_not_okay_big.jpg" style="width:80px"/></td>
<td><img alt="BW Not Okay Big" src="../img/bw_not_okay_big.jpg" style="width:80px"/></td>
<td><img alt="WB Not Okay Big" src="../img/wb_not_okay_big.jpg" style="width:80px"/></td>
</tr>
</tbody>
</table>
@@ -940,18 +940,18 @@ For a first run you can choose the following general settings: </p>
<tbody>
<tr>
<td>✔️ <strong>Okay</strong></td>
<td><img alt="" src="../img/bw_okay.jpg"/></td>
<td><img alt="" src="../img/wb_okay.jpg"/></td>
<td><img alt="BW Okay" src="../img/bw_okay.jpg"/></td>
<td><img alt="WB Okay" src="../img/wb_okay.jpg"/></td>
</tr>
<tr>
<td><strong>Not</strong> Okay</td>
<td><img alt="" src="../img/bw_not_okay_small.jpg"/></td>
<td><img alt="" src="../img/wb_not_okay_small.jpg"/></td>
<td><img alt="BW Not Okay Small" src="../img/bw_not_okay_small.jpg"/></td>
<td><img alt="WB Not Okay Small" src="../img/wb_not_okay_small.jpg"/></td>
</tr>
<tr>
<td><strong>Not</strong> Okay</td>
<td><img alt="" src="../img/bw_not_okay_big.jpg"/></td>
<td><img alt="" src="../img/wb_not_okay_big.jpg"/></td>
<td><img alt="BW Not Okay Big" src="../img/bw_not_okay_big.jpg"/></td>
<td><img alt="WB Not Okay Big" src="../img/wb_not_okay_big.jpg"/></td>
</tr>
</tbody>
</table>

View File

@@ -718,7 +718,7 @@
<p>At first an example image is shown.
To define a new reference image push the button <code>"Create new Reference" (2)</code> and afterwards <code>"Take Image" (2)</code>. It might take some seconds for processing, then your actual camera image should be shown.
Then play with the provided parameters to get a good result.</p>
<p><img alt="" src="../img/initial_setup_1_reference_image.jpg" style="width:500px"/></p>
<p><img alt="Initial Setup Reference Image" src="../img/initial_setup_1_reference_image.jpg" style="width:500px"/></p>
<h2 id="focus"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1</span> Focus</h2>
<p>This is the first time, where you have access to the camera image. It most likely is out of focus and not sharp!
Ensure a sharp image of the camera by adjusting the focal length of the ESP OV2640 camera.</p>
@@ -742,7 +742,7 @@ Make sure <strong>not</strong> to rotate the whole camera as this can damage the
<p class="admonition-title">Warning</p>
<p>This modification will render the camera unsuitable for general, web-cam type applications unless the focal length is changed back to the original setting.</p>
</div>
<p><img alt="" src="../img/focus_adjustment.jpg"/></p>
<p><img alt="Focus Adjustment" src="../img/focus_adjustment.jpg"/></p>
<h2 id="correct-horizontal-alignment"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.2</span> Correct Horizontal Alignment</h2>
<p>Ensure an <strong>exact horizontal alignment</strong> of the number:</p>
<table>
@@ -754,8 +754,8 @@ Make sure <strong>not</strong> to rotate the whole camera as this can damage the
</thead>
<tbody>
<tr>
<td><img alt="" src="../img/alignment_okay.jpg"/></td>
<td><img alt="" src="../img/alignment_not_okay.jpg"/></td>
<td><img alt="Alignment Okay" src="../img/alignment_okay.jpg"/></td>
<td><img alt="Alignment Not Okay" src="../img/alignment_not_okay.jpg"/></td>
</tr>
</tbody>
</table>

View File

@@ -648,10 +648,10 @@
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="scripted-file-upload"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.</span> Scripted File Upload</h1>
<p>To upload a file e.g. using <code>curl</code>, you first have to delete it and then upload it:
<p>To upload a file e.g. using <code>curl</code>, you first have to delete it and then upload it:</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-0-1"><a href="#__codelineno-0-1" id="__codelineno-0-1" name="__codelineno-0-1"></a>curl -d '' http://192.168.1.153/delete/html/index.html
</span><span id="__span-0-2"><a href="#__codelineno-0-2" id="__codelineno-0-2" name="__codelineno-0-2"></a>curl --data-binary @ota_page.html http://192.168.1.153/upload/html/index.html
</span></code></pre></div></p>
</span></code></pre></div>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>

View File

@@ -756,7 +756,7 @@
<p>The neural network is trained based on a set of images that have already been collected over time. If your digits are included or at least very similar to included images, the chance is very high that the neural network is working fine for you as well.</p>
<p>The neural network configuration is stored in the TensorFlow Lite format as <code>*.tfl</code> or <code>*.tflite</code> in the <code>/config</code> directory on the SD card. A model can be updated (or a new one added) by uploading the new file and activating it on the configuration page or in the config file <code>/config/config.ini</code>.</p>
<p>In order to incorporate new digits a training set of images is required. The training images needs to be collected in the final setup with the help of the <code>Digits</code> or <code>Analog</code> log settings (not to be confused with the <code>Data</code> or <code>Debug</code> log). Enable the logging of the images on the configuration page or in the config file <code>/config/config.ini</code>:</p>
<p><img alt="" src="../img/enable_log_image.jpg"/></p>
<p><img alt="Enable Log Image" src="../img/enable_log_image.jpg"/></p>
<p>Now be patient! You have to wait until it has collected an image of each digit of every type. They will be placed on the SD card in the folder <code>/log/digit/</code> resp. <code>/log/analog/</code>.</p>
<p>After some days, there will be a lot of images, many of them very similar. Because of this, it is important to select only a subset of them for the model training.</p>
<p>The tools shown below can help you with that.</p>

View File

@@ -766,13 +766,13 @@ Here this edge computing is brought into a practice-oriented example, where a AI
<h2 id="idea"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.2</span> Idea</h2>
<p><img alt="Idea" src="img/idea.jpg" style="width:600px"/></p>
<h3 id="hardware"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.2.1</span> Hardware</h3>
<p><img alt="" src="img/watermeter_all.jpg" style="width:200px">
<img alt="" src="img/main.jpg" style="width:200px"/>
<img alt="" src="img/size.png" style="width:200px"/></img></p>
<p><img alt="Watermeter All" src="img/watermeter_all.jpg" style="width:200px">
<img alt="Main" src="img/main.jpg" style="width:200px"/>
<img alt="Size" src="img/size.png" style="width:200px"/></img></p>
<h3 id="web-interface"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.2.2</span> Web interface</h3>
<p><img alt="" src="img/watermeter.jpg" style="width:600px"/></p>
<p><img alt="Watermeter" src="img/watermeter.jpg" style="width:600px"/></p>
<h3 id="configuration-interface"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.2.3</span> Configuration Interface</h3>
<p><img alt="" src="img/edit_reference.jpg" style="width:600px"/></p>
<p><img alt="Edit Reference" src="img/edit_reference.jpg" style="width:600px"/></p>
<p><strong>Have fun in studying the new possibilities and ideas</strong></p>
<p>This is about image recognition and digitization, done totally on a cheap ESP32 board using artificial intelligence in form of convolutional neural networks (CNN). Everything, from image capture (OV2640), image preprocessing (auto alignment, ROI identification) all the way down to the image recognition (CNN structure) and result plausibility is done on a cheap 10 EUR device.</p>
<p>This all is integrated in an easy to do setup and use environment, taking care for all the background processing and handling, including regular job scheduler. The user interface is an integrated web server, that can be easily adjusted and offers the data as an API in different options.</p>

View File

@@ -698,7 +698,7 @@
<article class="md-content__inner md-typeset">
<h1 id="initial-setup"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.</span> Initial Setup</h1>
<p>After setting up the device (firmware, SD card, WLAN) the device will connect to the wifi access point and start in an initial setup configuration:</p>
<p><img alt="" src="../img/setup_initial_welcome.png" style="width:500px"/></p>
<p><img alt="Setup Initial Welcome" src="../img/setup_initial_welcome.png" style="width:500px"/></p>
<p>With the buttons on the top you can navigate through 5 steps which guide you through the necessary setup:</p>
<ol>
<li>Create the <a href="../Reference-Image/">Reference Image</a>. It is the base for the position referencing and the identification of the digits and counters.</li>
@@ -714,10 +714,10 @@
</div>
<h2 id="finish-the-setup-and-change-to-the-normal-operation-mode"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.1</span> Finish the Setup and change to the Normal Operation mode</h2>
<p>With the last step <code>(1)</code> you leave the <strong>Setup Mode</strong> and reboot to the <strong>Normal Operation mode</strong>.</p>
<p><img alt="" src="../img/initial_setup_6_finish_reboot.jpg" style="width:500px"/></p>
<p><img alt="Initial Setup Finish Boot" src="../img/initial_setup_6_finish_reboot.jpg" style="width:500px"/></p>
<h2 id="access-to-the-setup-pages-in-the-normal-operation-mode"><span class="enumerate-headings-plugin enumerate-heading-plugin">1.2</span> Access to the Setup Pages in the Normal Operation mode</h2>
<p>You always can access all the settings during the normal operation mode via the <code>Settings</code> menu:</p>
<p><img alt="" src="../img/initial_setup_7_access_normal_mode.jpg" style="width:500px"/></p>
<p><img alt="Initial Setup Normal Mode" src="../img/initial_setup_7_access_normal_mode.jpg" style="width:500px"/></p>
<ul>
<li><code>(1)</code> Access to the <a href="../Configuration/">General Settings</a>.</li>
<li><code>(2)</code> Update of the <a href="../Reference-Image/">Reference Image</a>.</li>

File diff suppressed because one or more lines are too long

View File

@@ -691,9 +691,9 @@
<p>Ok, then grab the latest <code>main</code> build from <a href="https://github.com/jomjol/AI-on-the-edge-device/actions/workflows/build.yaml?query=branch%3Amain">Github Actions</a> Page and proceed as following:</p>
<ol>
<li>Pick the most top successful (green) build:
<img alt="" src="../actions.png"> </img></li>
<img alt="Actions" src="../actions.png"> </img></li>
<li>Scroll down and download the <code>AI-on-the-edge-device__update__*.zip</code>:
<img alt="" src="../update-artifact.png"> </img></li>
<img alt="Update Artifact" src="../update-artifact.png"> </img></li>
<li>Flash the zip file using the <a href="../ota/">OTA Update</a> page of your device.</li>
</ol>
</article>