Compare commits

...

11 Commits

Author SHA1 Message Date
CaCO3
0a4560ea95 Update Changelog.md 2024-10-07 00:21:07 +02:00
CaCO3
b44db21714 Update esp32-camera submodule to v2.0.13 (#3316)
Co-authored-by: CaCO3 <caco@ruinelli.ch>
2024-10-07 00:20:38 +02:00
CaCO3
34796ed091 Update build.yaml 2024-10-07 00:19:47 +02:00
CaCO3
a46dfd1c23 Add demo files (#3315)
* updated changelog

* add demo files

* Update build.yaml

* Update build.yaml

* Update build.yaml

* added missing files

* .

* .

---------

Co-authored-by: CaCO3 <caco@ruinelli.ch>
2024-10-07 00:06:03 +02:00
CaCO3
32eb583036 Add contributor list (#3317)
* feat: #3310 Automatically Update Contributor List  (#3312)

* Create main.yml

* Update README.md

* docs(contributor): contrib-readme-action has updated readme

* Update main.yml

* docs(contributor): contrib-readme-action has updated readme

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Update build.yaml

* docs(contributor): contrib-readme-action has updated readme

* Delete .github/workflows/main.yml

* Update README.md

* docs(contributor): contrib-readme-action has updated readme

* Update README.md

* docs(contributor): contrib-readme-action has updated readme

* Update build.yaml

* Update README.md

---------

Co-authored-by: Ayush Jhawar <111112495+Ayushjhawar8@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-10-06 23:25:19 +02:00
michael
6ee83b8413 Update ClassControllCamera.cpp (#3313)
https://github.com/jomjol/AI-on-the-edge-device/issues/3300#issuecomment-2395561022
2024-10-06 22:42:27 +02:00
CaCO3
f034232f36 Update config.ini 2024-10-06 22:33:24 +02:00
CaCO3
b80e43dfe9 Update config.ini 2024-10-06 22:31:56 +02:00
CaCO3
40c7c253ea Update config.ini 2024-10-06 22:29:06 +02:00
CaCO3
d11b312a96 Typos (#3309)
* Update edit_reference.html

* Update edit_config_template.html

* Update edit_config_template.html

* Update edit_reference.html
2024-10-06 16:57:26 +02:00
Naman Tyagi
2c1e531ed2 Fix grammar and typos in README.md for clarity and consistency (#3308) 2024-10-06 16:53:16 +02:00
28 changed files with 273 additions and 20 deletions

View File

@@ -53,6 +53,7 @@ jobs:
./code/.pio/build/esp32cam/partitions.bin
./code/.pio/build/esp32cam/bootloader.bin
./html/*
./demo/*
key: generated-files-${{ github.run_id }}
restore-keys: generated-files # This matches above key as it is only used as a prefix. it the restores the nearest cache, see https://github.com/restore-keys:/blob/main/tips-and-workarounds.md#update-a-cache
@@ -87,6 +88,11 @@ jobs:
echo "Replacing variables..."
cd html; find . -type f -exec sed -i 's/$COMMIT_HASH/${{ steps.vars.outputs.sha_short }}/g' {} \;
- name: Prepare Demo mode files
run: |
rm -rf ./demo
mkdir demo
cp -r ./sd-card/demo/* ./demo/
#########################################################################################
## Pack for Update
@@ -97,6 +103,7 @@ jobs:
# - /firmware.bin
# - (optional) /html/* (inkl. subfolders)
# - (optional) /config/*.tfl
# - (optional) /demo/*
runs-on: ubuntu-latest
needs: build
@@ -111,6 +118,7 @@ jobs:
./code/.pio/build/esp32cam/partitions.bin
./code/.pio/build/esp32cam/bootloader.bin
./html/*
./demo/*
key: generated-files-${{ github.run_id }}
restore-keys: generated-files # This matches above key as it is only used as a prefix. it the restores the nearest cache, see https://github.com/restore-keys:/blob/main/tips-and-workarounds.md#update-a-cache
@@ -135,6 +143,9 @@ jobs:
- name: Add Web UI to update
run: cp -r ./html ./update/
- name: Add Demo mode files to update
run: cp -r ./demo ./update/
- name: Add CNN to update
run: |
@@ -158,6 +169,7 @@ jobs:
# remote_setup__version.zip file with following content:
# - /firmware.bin
# - /html/* (inkl. subfolders)
# - /demo/*
# - /config/*
runs-on: ubuntu-latest
needs: build
@@ -173,6 +185,7 @@ jobs:
./code/.pio/build/esp32cam/partitions.bin
./code/.pio/build/esp32cam/bootloader.bin
./html/*
./demo/*
key: generated-files-${{ github.run_id }}
restore-keys: generated-files # This matches above key as it is only used as a prefix. it the restores the nearest cache, see https://github.com/restore-keys:/blob/main/tips-and-workarounds.md#update-a-cache
@@ -197,6 +210,9 @@ jobs:
- name: Add Web UI to remote_setup
run: cp -r ./html ./remote_setup/
- name: Add Demo mode files to update
run: cp -r ./demo ./update/
- name: Add whole config folder to remote_setup
run: |
rm -rf ./remote_setup/config/
@@ -229,6 +245,7 @@ jobs:
./code/.pio/build/esp32cam/partitions.bin
./code/.pio/build/esp32cam/bootloader.bin
./html/*
./demo/*
key: generated-files-${{ github.run_id }}
restore-keys: generated-files # This matches above key as it is only used as a prefix. it the restores the nearest cache, see https://github.com/restore-keys:/blob/main/tips-and-workarounds.md#update-a-cache
@@ -257,7 +274,9 @@ jobs:
cp -f "./code/.pio/build/esp32cam/bootloader.bin" "manual_setup/bootloader.bin"
cp -f "./code/.pio/build/esp32cam/partitions.bin" "manual_setup/partitions.bin"
rm -rf ./sd-card/html
rm -rf ./sd-card/demo
cp -r ./html ./sd-card/ # Overwrite the Web UI with the preprocessed files
cp -r ./demo ./sd-card/
cd sd-card; zip -r ../manual_setup/sd-card.zip *; cd ..
cd ./manual_setup
@@ -271,7 +290,7 @@ jobs:
#########################################################################################
## Prepare and create release
#########################################################################################
release:
prepare-release:
runs-on: ubuntu-latest
needs: [pack-for-update, pack-for-manual_setup, pack-for-remote_setup]
if: startsWith(github.ref, 'refs/tags/')
@@ -371,13 +390,34 @@ jobs:
# git push origin HEAD:master
#########################################################################################
## Update Contributors List in README.md on a release
#########################################################################################
contrib-readme-job:
if: github.event_name == 'release' && github.event.action == 'published' # Only run on release but not on prerelease
needs: [prepare-release]
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- name: Contribute List
uses: akhilmhdh/contributors-readme-action@v2.3.10
with:
image_size: 50
use_username: true
columns_per_row: 8
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
#########################################################################################
## Update the Web Installer on a release
#########################################################################################
# Make sure to also update update-webinstaller.yml!
update-web-installer:
if: github.event_name == 'release' && github.event.action == 'published' # Only run on release but not on prerelease
needs: [release]
needs: [prepare-release]
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}

View File

@@ -1,3 +1,39 @@
## [16.0.0-RC4] - 2024-10-06
For a full list of changes see [Full list of changes](https://github.com/jomjol/AI-on-the-edge-device/compare/v15.7.0...v16.0.0-RC1)
#### Known issues
Please check the [issues](https://github.com/jomjol/AI-on-the-edge-device/issues) and
[discussions](https://github.com/jomjol/AI-on-the-edge-device/discussions) before reporting a new issue.
#### Core Changes
Only changes since RC2 are listed:
- Update esp32-camera submodule to `v2.0.13` (#3316)
- Added contributor list (#3317)
- Added files for demo mode (#3315)
#### Bug Fixes
Only changes since RC2 are listed:
- Added delay in InitCam (#3313) to fix `Camera not detected` issues
## [16.0.0-RC3] - 2024-10-05
For a full list of changes see [Full list of changes](https://github.com/jomjol/AI-on-the-edge-device/compare/v15.7.0...v16.0.0-RC1)
#### Known issues
Please check the [issues](https://github.com/jomjol/AI-on-the-edge-device/issues) and
[discussions](https://github.com/jomjol/AI-on-the-edge-device/discussions) before reporting a new issue.
#### Core Changes
Only changes since RC2 are listed:
- Renamed MQTT topic from `rate_per_digitalization_round` to `rate_per_digitization_round` (change happened already in RC1)
#### Bug Fixes
Only changes since RC2 are listed:
- Re-did revertion of TFlite submodule update as certain modules crash with it (#3269) (change was lost)
## [16.0.0-RC2] - 2024-10-04
For a full list of changes see [Full list of changes](https://github.com/jomjol/AI-on-the-edge-device/compare/v15.7.0...v16.0.0-RC1)

View File

@@ -2,11 +2,11 @@
<img src="images/icon/watermeter.svg" width="100px">
Artificial intelligence based systems have become established in our everyday lives. Just think of speech or image recognition. Most of the systems rely on either powerful processors or a direct connection to the cloud for doing the calculations there. With the increasing power of modern processors, the AI systems are coming closer to the end user which is usually called **edge computing**.
Here, this edge computing is put into a practically oriented example, where an AI network is implemented on an ESP32 device so: **AI on the edge**.
In this project, edge computing is demonstrated through a practical example, where an AI network is implemented on an ESP32 device, hence: **AI on the edge**.
This project allows you to digitize your **analog** water, gas, power and other meters using cheap and easily available hardware.
All you need is an [ESP32 board with a supported camera](https://jomjol.github.io/AI-on-the-edge-device-docs/Hardware-Compatibility/) and something of a practical hand.
All you need is an [ESP32 board with a supported camera](https://jomjol.github.io/AI-on-the-edge-device-docs/Hardware-Compatibility/) and some practical skills.
<img src="images/esp32-cam.png" width="200px">
@@ -17,13 +17,13 @@ All you need is an [ESP32 board with a supported camera](https://jomjol.github.i
- Integrated camera and illumination
- Web interface for administration and control
- OTA interface for updating directly via the web interface
- Full integration into Homeassistant
- Full integration with Home Assistant
- Support for Influx DB 1 and 2
- MQTT
- REST API
## Workflow
The device takes a photo of your meter at a defined interval. It then extracts the Regions of Interest (ROIs) from the image and runs them through artificial intelligence. As a result, you get the digitized value of your meter.
The device captures a photo of your meter at set intervals. It then extracts the Regions of Interest (ROIs) from the image and runs them through artificial intelligence. As a result, you get the digitized value of your meter.
There are several options for what to do with that value. Either send it to an MQTT broker, write it to an InfluxDb or simply provide access to it via a REST API.
@@ -74,7 +74,7 @@ See the [documentation](https://jomjol.github.io/AI-on-the-edge-device-docs/Inst
### Flashing the SD Card
The SD card can be setup automatically after the firmware got installed. See the [documentation](https://jomjol.github.io/AI-on-the-edge-device-docs/Installation/#remote-setup-using-the-built-in-access-point) for details. For this to work, the SD card must be FAT formated (which is the default on a new SD card).
Alternatively the SD card still can be setup manually, see the [documentation](https://jomjol.github.io/AI-on-the-edge-device-docs/Installation/#3-sd-card) for details!
Alternatively, the SD card still can be set up manually, see the [documentation](https://jomjol.github.io/AI-on-the-edge-device-docs/Installation/#3-sd-card) for details!
## Casing
Various 3D-printable housing can be found here:
@@ -89,7 +89,7 @@ If you would like to support the developer with a cup of coffee, you can do that
<a href="https://www.paypal.com/donate?hosted_button_id=8TRSVYNYKDSWL"><img border="0" src="images/paypal.png" width="200px" target="_blank"></a>
## Support
If you have any technical problems please search the [discussions](https://github.com/jomjol/AI-on-the-edge-device/discussions). In case you found a ug or have a feature request, please open an [issue](https://github.com/jomjol/AI-on-the-edge-device/issues).
If you have any technical problems please search the [discussions](https://github.com/jomjol/AI-on-the-edge-device/discussions). In case you found a bug or have a feature request, please open an [issue](https://github.com/jomjol/AI-on-the-edge-device/issues).
In other cases you can contact the developer via email: <img src="https://raw.githubusercontent.com/jomjol/AI-on-the-edge-device/master/images/mail.jpg" height="25">
@@ -106,3 +106,10 @@ See [Build Instructions](code/README.md).
## Additional Ideas
There are some ideas and feature requests which are not currently being pursued mainly due to capacity reasons on the part of the developers.
They features are collected in the [issues](https://github.com/jomjol/AI-on-the-edge-device/issues) and in [FeatureRequest.md](FeatureRequest.md).
## Our Contributors ❤️
<!-- Autogenerated table, do not manually update!
It gets automatically updated on the next release.
See https://github.com/marketplace/actions/contribute-list -->
<!-- readme: contributors -start -->
<!-- readme: contributors -end -->

View File

@@ -122,12 +122,18 @@ esp_err_t CCamera::InitCam(void)
{
ESP_LOGD(TAG, "Init Camera");
TickType_t cam_xDelay = 100 / portTICK_PERIOD_MS;
CCstatus.ImageQuality = camera_config.jpeg_quality;
CCstatus.ImageFrameSize = camera_config.frame_size;
// De-init in case it was already initialized
esp_camera_deinit();
vTaskDelay(cam_xDelay);
// initialize the camera
esp_camera_deinit(); // De-init in case it was already initialized
esp_err_t err = esp_camera_init(&camera_config);
vTaskDelay(cam_xDelay);
if (err != ESP_OK)
{
@@ -280,8 +286,8 @@ esp_err_t CCamera::setSensorDatenFromCCstatus(void)
s->set_dcw(s, CCstatus.ImageDcw); // 0 = disable , 1 = enable
TickType_t xDelay2 = 100 / portTICK_PERIOD_MS;
vTaskDelay(xDelay2);
TickType_t cam_xDelay = 100 / portTICK_PERIOD_MS;
vTaskDelay(cam_xDelay);
return ESP_OK;
}

View File

@@ -38,7 +38,7 @@ Demo = false
InitialRotate = 0.0
SearchFieldX = 20
SearchFieldY = 20
AlignmentAlgo = Default
AlignmentAlgo = default
/config/ref0.jpg 103 271
/config/ref1.jpg 442 142
@@ -91,16 +91,17 @@ HomeassistantDiscovery = false
;[InfluxDB]
;Uri = undefined
;Database = undefined
;Measurement = undefined
;user = undefined
;password = undefined
;main.Measurement = undefined
;main.Field = undefined
;[InfluxDBv2]
;Uri = undefined
;Bucket = undefined
;Measurement = undefined
;Org = undefined
;Token = undefined
;main.Measurement = undefined
;main.Field = undefined
;[Webhook]
@@ -115,7 +116,7 @@ HomeassistantDiscovery = false
;IO3 = input disabled 10 false false
;IO4 = built-in-led disabled 10 false false
;IO12 = input-pullup disabled 10 false false
;IO13 = input-pullup disabled 10 false false
;IO13 = input-pullup disabled 10 false false
LEDType = WS2812
LEDNumbers = 2
LEDColor = 150 150 150
@@ -138,4 +139,5 @@ TimeZone = CET-1CEST,M3.5.0,M10.5.0/3
;Hostname = undefined
RSSIThreshold = -75
CPUFrequency = 160
Tooltip = true
SetupMode = true

BIN
sd-card/demo/530.07077.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
sd-card/demo/530.07325.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
sd-card/demo/530.12067.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
sd-card/demo/530.21419.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
sd-card/demo/530.48435.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
sd-card/demo/530.70265.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
sd-card/demo/530.95675.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
sd-card/demo/531.10877.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
sd-card/demo/531.24108.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
sd-card/demo/531.38301.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
sd-card/demo/531.63071.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
sd-card/demo/531.82235.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

137
sd-card/demo/config.ini Normal file
View File

@@ -0,0 +1,137 @@
[TakeImage]
;RawImagesLocation = /log/source
;RawImagesRetention = 15
WaitBeforeTakingPicture = 2
CamGainceiling = x8
CamQuality = 10
CamBrightness = 0
CamContrast = 0
CamSaturation = 0
CamSharpness = 0
CamAutoSharpness = false
CamSpecialEffect = no_effect
CamWbMode = auto
CamAwb = true
CamAwbGain = true
CamAec = true
CamAec2 = true
CamAeLevel = 2
CamAecValue = 600
CamAgc = true
CamAgcGain = 8
CamBpc = true
CamWpc = true
CamRawGma = true
CamLenc = true
CamHmirror = false
CamVflip = false
CamDcw = true
CamDenoise = 0
CamZoom = false
CamZoomOffsetX = 0
CamZoomOffsetY = 0
CamZoomSize = 0
LEDIntensity = 0
Demo = true
[Alignment]
InitialRotate = -34.6
SearchFieldX = 20
SearchFieldY = 20
AlignmentAlgo = default
/config/ref0.jpg 30 189
/config/ref1.jpg 536 113
[Digits]
Model = /config/dig-cont_0710_s3_q.tflite
CNNGoodThreshold = 0.5
;ROIImagesLocation = /log/digit
;ROIImagesRetention = 3
main.dig1 438 62 49 71 false
[Analog]
Model = /config/ana-cont_1300_s2.tflite
;ROIImagesLocation = /log/analog
;ROIImagesRetention = 3
main.ana1 452 199 120 120 false
[PostProcessing]
main.DecimalShift = 0
;main.AnalogToDigitTransitionStart =
main.ChangeRateThreshold = 2
PreValueUse = true
PreValueAgeStartup = 720
main.AllowNegativeRates = true
;main.MaxRateValue = 0
;main.MaxRateType = AbsoluteChange
main.ExtendedResolution = true
main.IgnoreLeadingNaN = false
ErrorMessage = true
CheckDigitIncreaseConsistency = false
;[MQTT]
;Uri = mqtt://IP-ADRESS:1883
;MainTopic = watermeter
;ClientID = watermeter
;user = USERNAME
;password = PASSWORD
RetainMessages = false
HomeassistantDiscovery = false
;MeterType = other
;CACert = /config/certs/RootCA.pem
;ClientCert = /config/certs/client.pem.crt
;ClientKey = /config/certs/client.pem.key
;[InfluxDB]
;Uri = undefined
;Database = undefined
;user = undefined
;password = undefined
;main.Measurement = undefined
;main.Field =
;[InfluxDBv2]
;Uri = undefined
;Bucket = undefined
;Org = undefined
;Token = undefined
;main.Measurement = undefined
;main.Field = undefined
;[Webhook]
;Uri = undefined
;ApiKey = undefined
;UploadImg = 0
;[GPIO]
;IO0 = input disabled 10 false false
;IO1 = input disabled 10 false false
;IO3 = input disabled 10 false false
;IO4 = built-in-led disabled 10 false false
;IO12 = input-pullup disabled 10 false false
;IO13 = input-pullup disabled 10 false false
LEDType = WS2812
LEDNumbers = 2
LEDColor = 150 150 150
[AutoTimer]
AutoStart = true
Interval = 1
[DataLogging]
DataLogActive = false
DataFilesRetention = 3
[Debug]
LogLevel = 3
LogfilesRetention = 3
[System]
Tooltip = true
TimeZone = CET-1CEST,M3.5.0,M10.5.0/3
;TimeServer = pool.ntp.org
;Hostname = undefined
RSSIThreshold = -75
CPUFrequency = 160
SetupMode = false

12
sd-card/demo/files.txt Normal file
View File

@@ -0,0 +1,12 @@
530.07077.jpg
530.07325.jpg
530.12067.jpg
530.21419.jpg
530.48435.jpg
530.70265.jpg
530.95675.jpg
531.10877.jpg
531.24108.jpg
531.38301.jpg
531.63071.jpg
531.82235.jpg

View File

View File

@@ -0,0 +1 @@
main 2024-10-06T23:02:42+0200 0.05

12
sd-card/demo/readme.txt Normal file
View File

@@ -0,0 +1,12 @@
This folder contains a prepared demo setup.
All you need to do is:
1. Copy the following files to the config folder of your SD-Card:
- config.ini
- ref0.jpg
- ref1.jpg
- reference.jpg
- prevalue.ini
1. Restart the device
More details at https://jomjol.github.io/AI-on-the-edge-device-docs/Demo-Mode

BIN
sd-card/demo/ref0.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
sd-card/demo/ref1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
sd-card/demo/reference.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

View File

@@ -2555,7 +2555,7 @@ function UpdateExpertModus() {
_style_pur = '';
_hidden = false;
document.getElementById("Button_Edit_Config_Raw").style.display = "";
firework.launch("Expert view activated. Please use carefully", 'warning', 5000);
firework.launch("Expert view activated. Please use it carefully", 'warning', 5000);
}
else {
document.getElementById("Button_Edit_Config_Raw").style.display = "none";
@@ -2821,7 +2821,7 @@ function camSettingsSet(){
}
catch (error){}
document.getElementById("overlaytext").innerHTML = "Device is busy, plase waiting...<br><br>Current step: " + _xhttp.responseText;
document.getElementById("overlaytext").innerHTML = "Device is busy, please wait.<br><br>Current step: " + _xhttp.responseText;
console.log("Device is busy, waiting 2s then checking again...");
await sleep(2000);
}

View File

@@ -617,7 +617,7 @@
}
catch (error){}
document.getElementById("overlaytext").innerHTML = "Device is busy, plase waiting...<br><br>Current step: " + _xhttp.responseText;
document.getElementById("overlaytext").innerHTML = "Device is busy, please wait.<br><br>Current step: " + _xhttp.responseText;
console.log("Device is busy, waiting 5s then checking again...");
await sleep(2000);
}
@@ -1053,7 +1053,7 @@
if (document.getElementById("ExpertModus_enabled").checked) {
_style_pur = '';
_hidden = false;
firework.launch("Expert parameter view activated. Please use carefully", 'warning', 5000);
firework.launch("Expert parameter view activated. Please use it carefully", 'warning', 5000);
}
const expert = document.querySelectorAll(".expert");