From b0de37b7629835d4016638eadc91ab26730e083c Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Fri, 24 Feb 2023 18:36:26 +0100 Subject: [PATCH 01/18] Move parameter doc to use tooltips generated using the online documentation (#2059) * prework * add tooltips * . * Update build.yaml * remove tooltip link and embed it directly * embedd tooltip directly * . * . * . * . * . * . * . * . * . * . * fix disabled tooltips * fix disabled tooltips * renamed Parameter in UI, added units, fixed labels * . * . * . --------- Co-authored-by: CaCO3 --- .github/workflows/build.yaml | 19 +- .gitignore | 3 + sd-card/html/edit_config_param.html | 729 +- sd-card/html/help.png | Bin 0 -> 5918 bytes sd-card/html/param_tooltips/github.min.css | 1 + sd-card/html/param_tooltips/readme.md | 1 + sd-card/html/param_tooltips/theme.css | 6883 +++++++++++++++++ sd-card/html/param_tooltips/theme_extra.css | 187 + .../generate-param-doc-tooltips.py | 80 + .../generate-param-doc-tooltips.sh | 15 + .../html/css/github.min.css | 1 + .../html/css/readme.md | 1 + .../html/css/theme.css | 11 + .../html/css/theme_extra.css | 191 + 14 files changed, 7662 insertions(+), 460 deletions(-) create mode 100644 sd-card/html/help.png create mode 100644 sd-card/html/param_tooltips/github.min.css create mode 100644 sd-card/html/param_tooltips/readme.md create mode 100644 sd-card/html/param_tooltips/theme.css create mode 100644 sd-card/html/param_tooltips/theme_extra.css create mode 100644 tools/parameter-tooltip-generator/generate-param-doc-tooltips.py create mode 100755 tools/parameter-tooltip-generator/generate-param-doc-tooltips.sh create mode 100644 tools/parameter-tooltip-generator/html/css/github.min.css create mode 100644 tools/parameter-tooltip-generator/html/css/readme.md create mode 100644 tools/parameter-tooltip-generator/html/css/theme.css create mode 100644 tools/parameter-tooltip-generator/html/css/theme_extra.css diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index efbdd670..c48406bd 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -70,15 +70,24 @@ jobs: #run: echo "Testing... ${{ github.ref_name }}, ${{ steps.vars.outputs.sha_short }}" > ./sd-card/html/version.txt; mkdir -p ./code/.pio/build/esp32cam/; cd ./code/.pio/build/esp32cam/; echo "${{ steps.vars.outputs.sha_short }}" > firmware.bin; cp firmware.bin partitions.bin; cp firmware.bin bootloader.bin # Testing run: cd code; platformio run --environment esp32cam - - name: Prepare Web UI (copy data from repo and update hashes in all files) + - name: Prepare Web UI (copy data from repo, generate tooltip pages and update hashes in all files) run: | rm -rf ./html mkdir html - cp ./sd-card/html/* ./html/ + cp -r ./sd-card/html/* ./html/ + + python -m pip install markdown + mkdir html/param-tooltips + cd tools/parameter-tooltip-generator + bash generate-param-doc-tooltips.sh + cd ../.. + + cp -r ./sd-card/html/* ./html/ + + echo "Replacing variables..." cd html; find . -type f -exec sed -i 's/$COMMIT_HASH/${{ steps.vars.outputs.sha_short }}/g' {} \; - ######################################################################################### ## Pack for Update ######################################################################################### @@ -86,7 +95,7 @@ jobs: # New OTA concept # update__version.zip file with following content: # - /firmware.bin - # - (optional) /html/* + # - (optional) /html/* (inkl. subfolders) # - (optional) /config/*.tfl runs-on: ubuntu-latest needs: build @@ -149,7 +158,7 @@ jobs: # New Remote Setup concept # remote_setup__version.zip file with following content: # - /firmware.bin - # - /html/* + # - /html/* (inkl. subfolders) # - /config/* runs-on: ubuntu-latest needs: build diff --git a/.gitignore b/.gitignore index 089c9ea4..f9165b4b 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,6 @@ CTestTestfile.cmake _deps code/edgeAI.code-workspace .DS_Store +tools/parameter-tooltip-generator/html +tools/parameter-tooltip-generator/AI-on-the-edge-device-docs +sd-card/html/param_tooltips diff --git a/sd-card/html/edit_config_param.html b/sd-card/html/edit_config_param.html index 154a1274..acfb5b06 100644 --- a/sd-card/html/edit_config_param.html +++ b/sd-card/html/edit_config_param.html @@ -44,7 +44,7 @@ textarea { } .disabled { - color:lightgrey; + color:rgb(122, 122, 122); } .smallSelect { @@ -71,7 +71,44 @@ textarea { padding-left: 69px; } +.tooltip { + position: relative; + display: inline-block; +} + +.tooltip .tooltiptext { + visibility: hidden; + width: 600px; + background-color: #fcfcfc; + + padding: 5px; + padding-bottom: 0; + + border: solid black 2px; + + /* Position the tooltip */ + position: absolute; + z-index: 1; + top: 100%; + left: 100%; + margin-left: -600px; +} + +.tooltip:hover .tooltiptext { + visibility: visible; +} + +.tooltip-content { + width: calc(100% - 2px); + height: calc(100% - 2px); + padding: 1px; +} + + + + + @@ -79,6 +116,9 @@ textarea {

Configuration

+

The documentation of each parameter can be shown with hovering over the icon.
+ The latest version of the documentation is available on jomjol.github.io/AI-on-the-edge-device-docs/Parameters.

+

@@ -86,14 +126,14 @@ textarea { - @@ -103,26 +143,22 @@ textarea { - + - + - + - + - + - + - + @@ -200,10 +221,7 @@ textarea { - + @@ -213,10 +231,7 @@ textarea { - + @@ -226,15 +241,12 @@ textarea { - + - + @@ -253,30 +263,26 @@ textarea { - + - + - + - + - + @@ -326,7 +326,7 @@ textarea { @@ -337,54 +337,45 @@ textarea { - + - + - + - + @@ -395,24 +386,25 @@ textarea { - + - + + + - - + + + @@ -420,7 +412,7 @@ textarea { - + - + - + - + @@ -486,7 +470,7 @@ textarea { - + - + - + - + - + - + - + @@ -594,72 +562,56 @@ textarea { - + - + - + - + - + - + - + - + @@ -724,20 +667,18 @@ textarea { - + - + - + - + - + - + - + - + - + - + - + @@ -893,7 +815,7 @@ textarea { - + - + - - + + - + - + - + @@ -969,7 +877,7 @@ textarea { - + - + - - + + - + - + - + @@ -1043,7 +939,7 @@ textarea { - + - + - - + + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - - + + - + - + - + - + - - + - + - + - + - - + @@ -1312,7 +1165,7 @@ textarea { - + - + - - + + - + - + - + @@ -1387,7 +1228,7 @@ textarea { - + - + - + - + - + @@ -1456,20 +1289,16 @@ textarea { - + - + @@ -1478,31 +1307,22 @@ textarea { - + - + + + + +
+ Parameter Value - Information + Documentation
- + - Location to store raw camera images - $TOOLTIP_TakeImage_RawImagesLocation
- + - - - Time to keep the raw image (in days, resp. "0" = forever) + Days $TOOLTIP_TakeImage_RawImagesRetention
@@ -134,40 +170,30 @@ textarea { - Enable to use demo images instead of the real camera images.
- Make sure to have a demo folder on your SD-Card! - Check the documentation for details. -
$TOOLTIP_TakeImage_Demo
- WaitBeforeTakingPicture + Wait Before Taking Picture - - - Wait time between switching illumination on and taking the picture (in seconds) + Seconds $TOOLTIP_TakeImage_WaitBeforeTakingPicture
- ImageQuality + Image Quality - Image quality index (default = 12)
- Input range: 8 [highest quality] ... 63 [lowest quality]
- Remark: Value < 12 could result in system instabilities! -
$TOOLTIP_TakeImage_ImageQuality
- ImageSize + Image Size - Size of camera picture (default = "VGA") - $TOOLTIP_TakeImage_ImageSize
- LEDIntensity + LED Intensity - Internal LED Flash Intensity (PWM from 0% - 100%).
- Remark: as the camera autoillumination settings are used, this is rather for energy saving, than reducing reflections. -
$TOOLTIP_TakeImage_LEDIntensity
- Image brightness (default = 0)
- Input range: -2 ... 2 -
$TOOLTIP_TakeImage_Brightness
- Image contrast (default = 0)
- Input range: -2 ... 2 -
$TOOLTIP_TakeImage_Contrast
- Image saturation (default = 0)
- Input range: -2 ... 2 -
$TOOLTIP_TakeImage_Saturation
- FixedExposure + Fixed Exposure - Fixes the illumination setting of camera at the startup and uses this later --> individual round is faster - $TOOLTIP_TakeImage_FixedExposure
- SearchFieldX + Search Field X - - - x size (width) in which the reference is searched (default = "20") + Pixel $TOOLTIP_Alignment_SearchFieldX
- SearchFieldY + Search Field Y - - - y size (height) in which the reference is searched (default = "20") + Pixel $TOOLTIP_Alignment_SearchFieldY
- + - "Default" = use only R-Channel, "HighAccuracy" = use all Channels (RGB, 3x slower),
"Fast" (First time RGB, then only check if image is shifted) -
$TOOLTIP_Alignment_AlignmentAlgo
- FlipImageSize + Flip Image Size - Rotate the viewport together with the alignment rotation. - $TOOLTIP_Alignment_FlipImageSize
- InitialMirror + Initial Mirror - Rotate the viewport together with the alignment rotation. - $TOOLTIP_Alignment_InitialMirror

-

+
- Path to CNN model file for image recognition.
- Check the documentation for details. -
$TOOLTIP_Digits_Model
- + - EXPERIMENTAL - NOT WORKING FOR ALL CNNs! - Threshold above which the classification should be to accept the value (only for digits meaningfull) - $TOOLTIP_Digits_CNNGoodThreshold
- + - Location to store separated digits for logging - $TOOLTIP_Digits_ROIImagesLocation
- + - - - Time to keep the separated digit images (in days, resp. "0" = forever) + Days $TOOLTIP_Digits_ROIImagesRetention

-

+
Path to CNN model file for image recognition.
- Check the documentation for details.
$TOOLTIP_Analog_Model
- Location to store separated digits for logging $TOOLTIP_Analog_ROIImagesLocation
- Time to keep the separated digit images (in days, resp. "0" = forever) Days$TOOLTIP_Analog_ROIImagesRetention
- + - Enable to use the previous read value for consistency checks - also on reboots - $TOOLTIP_PostProcessing_PreValueUse
- + - - - Time (in minutes), how long a previous read value is valid after reboot (default = 720 min) + Seconds $TOOLTIP_PostProcessing_PreValueAgeStartup
- + - Do not show error message in return value - in error case, the last valid number will be send out - $TOOLTIP_PostProcessing_ErrorMessage
- + - Enable additional consistency check - especially zero crossing check between digits - $TOOLTIP_PostProcessing_CheckDigitIncreaseConsistency
- + - Set to "false" to ensure, that only positive changes are accepted (typically for counter) - $TOOLTIP_PostProcessing_NUMBER.AllowNegativeRates
- + - Shift the decimal separator (positiv or negativ).
- Eg. to move from 'm³' to 'l' (Multiply by 1000), you need to set it to +3. -
$TOOLTIP_PostProcessing_NUMBER.DecimalShift
- + - If you have false Values, but the recognition is correct. Look for the start of changing of the first digit and note the analog pointer value behind. Set it here. - Only used on combination of digits and analog pointers. Default=9.2 - $TOOLTIP_PostProcessing_NUMBER.AnalogDigitalTransitionStart
- + - Maximum change of a reading - if treated as absolute or relative change see next parameter. - $TOOLTIP_PostProcessing_NUMBER.MaxRateValue
- + - Defines if the change rate compared to the previous value is calculated as absolute change (AbsoluteChange) or as rate normalized to the interval (RateChange = change/minute). - $TOOLTIP_PostProcessing_NUMBER.MaxRateType
- + - Enable to use the decimal place of the last analog counter - $TOOLTIP_PostProcessing_NUMBER.ExtendedResolution
- + - Leading "N"'s will be deleted before further processing - $TOOLTIP_PostProcessing_NUMBER.IgnoreLeadingNaN
- + - URI to the MQTT broker including port e.g.: mqtt://IP-Address:Port - $TOOLTIP_MQTT_Uri
- + - MQTT main topic, under which the counters are published.
- The single value will be published with the following key: MAINTOPIC/VALUE_NAME/PARAMETER where -
    -
  • VALUE_NAME is the name of the value (a meter might have more than one value) as defined during analog and digital ROI configuration (defaults to "main")
  • -
  • and PARAMETERS are: value, rate, timestamp, error
  • -
- The general connection status can be found in MAINTOPIC/CONNECTION -
$TOOLTIP_MQTT_MainTopic
- + - ClientID to connect to the MQTT broker - $TOOLTIP_MQTT_ClientID
- + - User for MQTT authentication - $TOOLTIP_MQTT_user
- + - Password for MQTT authentication - $TOOLTIP_MQTT_password
- + - Enable or disable the retain flag for all MQTT entries - $TOOLTIP_MQTT_RetainMessages
@@ -688,9 +638,7 @@ textarea { - Enable or disable the Homeassistant Discovery - $TOOLTIP_MQTT_HomeassistantDiscovery
@@ -711,12 +659,7 @@ textarea { - Select the meter type so the sensors have the right units in Homeassistant.
- Note: For 'Watermeter' you need to have Homeassistant 2022.11 or never!
- Please also make sure that it matches the dimention of the value provided by the meter! Eg. if your meter provides m3, you need to also set it to m3. - Alternatively you could set 'DecimalShift' to '3' so the value is converted to 'l'! -
$TOOLTIP_MQTT_MeterType

-

Only InfluxDB v1.x is supported as of now
+
For InfluxDB v2.x see below [InfluxDBv2]
- + - URI of the HTTP interface to InfluxDB, without traililing slash, e.g. http://IP-Address:Port - $TOOLTIP_InfluxDB_Uri
@@ -747,9 +688,7 @@ textarea { - Database name in which to publish the read value. - $TOOLTIP_InfluxDB_Database
@@ -759,53 +698,45 @@ textarea { - Measurement name to use to publish the read value. - $TOOLTIP_InfluxDB_Measurement
- + - User for InfluxDB authentication - $TOOLTIP_InfluxDB_user
- + - Password for InfluxDB authentication - $TOOLTIP_InfluxDB_password

-

Only InfluxDB v2.x is configured here, v1.x see above [InfluxDB]
+
For InfluxDB v1.x see above [InfluxDBv1]
- + - URI of the HTTP interface to InfluxDB (Version2), without traililing slash, e.g. http://IP-Address:Port - $TOOLTIP_InfluxDBv2_Uri
@@ -815,9 +746,7 @@ textarea { - Database name in which to publish the read value. - $TOOLTIP_InfluxDBv2_Database
@@ -827,21 +756,17 @@ textarea { - Measurement name to use to publish the read value. - $TOOLTIP_InfluxDBv2_Measurement
- + - Organisation (Org) for InfluxDBv2 authentication - $TOOLTIP_InfluxDBv2_Org
@@ -851,9 +776,7 @@ textarea { - Token for InfluxDB authentication - $TOOLTIP_InfluxDBv2_Token
@@ -874,18 +797,17 @@ textarea { - Fieldname to use for saving. - $TOOLTIP_InfluxDBv2_NUMBER.Fieldname

-

-
Enabling GPIO handler, disable by default integrated flash light.
Please enable it with GPIO4 (internal flash LED) settings or GPIO12 (external LED). -
+
By default GPIO4 is used for the built-in flash LED! If you enable the GPIO Settings, + you have to explicitely enable it again on GPIO4 or on GPIO12 with an external LED!
+
- + - GPIO 0 Usable with restrictions.
- Must be disabled when camera is used.
- Pin is used to activate flash mode and must therefore be HIGH when booting. -
$TOOLTIP_GPIO_IO0
- GPIO 0 use interrupt + GPIO 0 Use Interrupt - GPIO 0 enable interrupt trigger -
- GPIO 0 PWM duty resolution - - GPIO 0 LEDC PWM duty resolution in bit + GPIO 0 PWM Duty Cycle Resolution Bits
- GPIO 0 enable MQTT + GPIO 0 Enable MQTT - GPIO 0 enable MQTT publishing/subscribing -
- GPIO 0 enable HTTP + GPIO 0 Enable HTTP - GPIO 0 enable HTTP write/read -
- GPIO 0 name + GPIO 0 Name - GPIO 0 MQTT topic name (empty = GPIO0). Allowed characters (a-z, A-Z, 0-9, _, -) -
- GPIO 1 state + - GPIO 1
Used by default for serial communication as TX pin.
Required for seriales monitor.
-
$TOOLTIP_GPIO_IO1
- GPIO 1 use interrupt + GPIO 1 Use Interrupt - GPIO 1 enable interrupt trigger -
- GPIO 1 PWM duty resolution - - GPIO 1 LEDC PWM duty resolution in bit + GPIO 1 PWM Duty Cycle Resolution Bits
- GPIO 1 enable MQTT + GPIO 1 Enable MQTT - GPIO 1 enable MQTT publishing/subscribing -
- GPIO 1 enable HTTP + GPIO 1 Enable HTTP - GPIO 1 enable HTTP write/read -
- GPIO 1 name + GPIO 1 Name - GPIO 1 MQTT topic name (empty = GPIO1). Allowed characters (a-z, A-Z, 0-9, _, -) -
- GPIO 3 state + - GPIO 3 Used by default for serial communication as RX pin. - $TOOLTIP_GPIO_IO3
- GPIO 3 use interrupt + GPIO 3 Use Interrupt - GPIO 3 Used by default for serial communication as RX pin. -
- GPIO 3 PWM duty resolution - - GPIO 3 LEDC PWM duty resolution in bit + GPIO 3 PWM Duty Cycle Resolution Bits
- GPIO 3 enable MQTT + GPIO 3 Enable MQTT - GPIO 3 enable MQTT publishing/subscribing -
- GPIO 3 enable HTTP + GPIO 3 Enable HTTP - GPIO 3 enable HTTP write/read -
- GPIO 3 name + GPIO 3 Name - GPIO 3 MQTT topic name (empty = GPIO3). Allowed characters (a-z, A-Z, 0-9, _, -) -
- + - GPIO 4 Usable with restrictions.
- Pin is used for build-in flash light. -
$TOOLTIP_GPIO_IO4
- GPIO 4 use interrupt + GPIO 4 Use Interrupt - GPIO 4 enable interrupt trigger -
- GPIO 4 PWM duty resolution - - GPIO 4 LEDC PWM duty resolution in bit + GPIO 4 PWM Duty Cycle Resolution Bits
- GPIO 4 enable MQTT + GPIO 4 Enable MQTT - GPIO 4 enable MQTT publishing/subscribing -
- GPIO 4 enable HTTP + GPIO 4 Enable HTTP - GPIO 4 enable HTTP write/read -
- GPIO 4 name + GPIO 4 Name - GPIO 4 MQTT topic name (empty = GPIO4). Allowed characters (a-z, A-Z, 0-9, _, -) -
- + - GPIO 12 is usable without restrictions - $TOOLTIP_GPIO_IO12
- GPIO 12 use interrupt + GPIO 12 Use Interrupt - GPIO 12 enable interrupt trigger -
- GPIO 12 PWM duty resolution - - GPIO 12 LEDC PWM duty resolution in bit + GPIO 12 PWM Duty Cycle Resolution Bits
- GPIO 12 enable MQTT + GPIO 12 Enable MQTT - GPIO 12 enable MQTT publishing/subscribing -
- GPIO 12 enable HTTP + GPIO 12 Enable HTTP - GPIO 12 enable HTTP write/read -
- GPIO 12 name + GPIO 12 Name - GPIO 12 MQTT topic name (empty = GPIO12). Allowed characters (a-z, A-Z, 0-9, _, -) -
- LED-Type + LED Type (NeoPixel) - + - Type of WS2812x, that is connected to GPIO12 - $TOOLTIP_GPIO_LEDType
- Numbers of LEDs + Numbers of LEDs - Number of LEDs on the external LED-stripe - $TOOLTIP_GPIO_LEDNumbers
- LED Color + LED Color + R G B - Color of LEDs in (R)ed, (G)reen (B)lue from 0...255 - $TOOLTIP_GPIO_LEDColor
- GPIO 13 state + - GPIO 13 is usable without restrictions - $TOOLTIP_GPIO_IO13
- GPIO 13 use interrupt + GPIO 13 Use Interrupt - GPIO 13 enable interrupt trigger -
- GPIO 13 PWM duty resolution - - GPIO 13 LEDC PWM duty resolution in bit + GPIO 13 PWM Duty Cycle Resolution Bits
- GPIO 13 enable MQTT + GPIO 13 Enable MQTT - GPIO 13 enable MQTT publishing/subscribing -
- GPIO 13 enable HTTP + GPIO 13 Enable HTTP - GPIO 13 enable HTTP write/read -
- GPIO 13 name + GPIO 13 Name - GPIO 13 MQTT topic name (empty = GPIO13). Allowed characters (a-z, A-Z, 0-9, _, -) -
- AutoStart + Automatically Round Start - Start the image recognition immediatly after power up. false is basically for debugging. - $TOOLTIP_AutoTimer_AutoStart
- Interval + Round Interval - - - Interval in which the number(s) are read (in minutes). If a digitalization round takes longer than this interval, the next run gets postponed until the current run completes. + Minutes $TOOLTIP_AutoTimer_Interval

DataLogging

Data Logging

- DataLogActive + Data Logging - Activate data log to SD card - $TOOLTIP_DataLogging_DataLogActive
- DataFilesRetention + Data Files Retention - - - Time to keep the data files (in days - "0" = forever) + Days $TOOLTIP_DataLogging_DataFilesRetention
- Set the level of the logging to the SD-Card.
Warning: DEBUG or INFO might damage the SD-Card if enabled longterm due to excessive writes to the SD-Card! -
$TOOLTIP_Debug_LogLevel
LogfilesRetention - - - Time to keep the log files (in days - "0" = forever) + Days $TOOLTIP_Debug_LogfilesRetention
- + - Time zone in POSIX syntax (Europe/Berlin = "CET-1CEST,M3.5.0,M10.5.0/3" - incl. daylight saving)
- Use this table to find the settings for your region. -
$TOOLTIP_System_TimeZone
- + - Time server to synchronize system time. If it is disabled or "undefined", "pool.ntp.org" will be used.
- You can also set it to the IP of your router. Many routers like - Fritzboxes can act as a local NTP server.
- To disable NTP, you need to activate it but set the TimeServer config to be empty. In such case the time always starts at 01.01.1970 after each power cycle! -
$TOOLTIP_System_TimeServer
@@ -1511,21 +1331,20 @@ textarea { - - Hostname for server - will be transfered to wlan.ini at next startup) $TOOLTIP_System_Hostname
- + - - - WLAN Mesh Parameter: Threshold for RSSI value to check for start switching access point in a mesh system. - Possible values: -100 to 0, 0 = disabled - Value will be transfered to wlan.ini at next startup) + dBm $TOOLTIP_System_RSSIThreshold
@@ -1739,7 +1558,7 @@ function InvertEnableItem(_cat, _param) _zw = _cat + "_" + _param + "_enabled"; _isOn = document.getElementById(_zw).checked; - _color = "color:lightgrey;"; + _color = "color: rgb(122, 122, 122);"; if (_isOn) { _color = "color:black;"; } @@ -1757,7 +1576,7 @@ function InvertEnableItem(_cat, _param) } function setEnabled(className, enabled) { - _color = "color:lightgrey;"; + _color = "color: rgb(122, 122, 122);"; if (enabled) { _color = "color:black;"; } @@ -1800,7 +1619,7 @@ function EnDisableItem(_status, _param, _category, _cat, _name, _optional, _numb { _status = _category[_cat]["enabled"]; - _color = "color:lightgrey;"; + _color = "color: rgb(122, 122, 122);"; if (_status) { _color = "color:black;"; } @@ -1813,13 +1632,13 @@ function EnDisableItem(_status, _param, _category, _cat, _name, _optional, _numb if (_number == -1){ if (!_param[_cat][_name]["enabled"]) { _status = false; - _color = "color:lightgrey;"; + _color = "color: rgb(122, 122, 122);"; } } else if (!NUMBERS[_number][_cat][_name]["enabled"]) { _status = false; - _color = "color:lightgrey;"; + _color = "color: rgb(122, 122, 122);"; } diff --git a/sd-card/html/help.png b/sd-card/html/help.png new file mode 100644 index 0000000000000000000000000000000000000000..ff7d7d12b465c97b3bc11049eaa12b6a8b85a539 GIT binary patch literal 5918 zcmV+(7vboMP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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