diff --git a/404.html b/404.html index ea914a1..4689dd0 100644 --- a/404.html +++ b/404.html @@ -7,13 +7,13 @@ - +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- + \ No newline at end of file diff --git a/assets/js/3865d09d.68864eb6.js b/assets/js/3865d09d.68864eb6.js new file mode 100644 index 0000000..b4df8de --- /dev/null +++ b/assets/js/3865d09d.68864eb6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelegantota_docs=self.webpackChunkelegantota_docs||[]).push([[739],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>f});var a=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=a.createContext({}),c=function(e){var t=a.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=c(r),m=n,f=u["".concat(s,".").concat(m)]||u[m]||d[m]||i;return r?a.createElement(f,o(o({ref:t},p),{},{components:r})):a.createElement(f,o({ref:t},p))}));function f(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:n,o[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var a=r(7462),n=(r(7294),r(3905));const i={title:"Hardware ID",sidebar_label:"Hardware ID (Pro)",sidebar_position:10},o=void 0,l={unversionedId:"hardware-id",id:"hardware-id",title:"Hardware ID",description:"This feature is only available in ElegantOTA Pro.",source:"@site/docs/hardware-id.md",sourceDirName:".",slug:"/hardware-id",permalink:"/hardware-id",draft:!1,tags:[],version:"current",sidebarPosition:10,frontMatter:{title:"Hardware ID",sidebar_label:"Hardware ID (Pro)",sidebar_position:10},sidebar:"tutorialSidebar",previous:{title:"Disable Filesystem OTA (Pro)",permalink:"/disable-filesystem-ota"},next:{title:"Firmware Version (Pro)",permalink:"/firmware-version"}},s={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Example Usage:",id:"example-usage",level:3},{value:"Best Practices",id:"best-practices",level:2}],p={toc:c},u="wrapper";function d(e){let{components:t,...r}=e;return(0,n.kt)(u,(0,a.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("div",{className:"pro-label"},(0,n.kt)("i",null,(0,n.kt)("h4",{style:{fontWeight:"500",marginBottom:5}},"This feature is only available in ",(0,n.kt)("a",{target:"_blank",style:{color:"red"},href:"https://elegantota.pro"},"ElegantOTA Pro"),"."))),(0,n.kt)("br",null),(0,n.kt)("br",null),(0,n.kt)("img",{src:"/v3/img/hardware-id.png",alt:"Hardware ID",width:"400px"}),(0,n.kt)("br",null),(0,n.kt)("h2",{id:"introduction"},"Introduction"),(0,n.kt)("p",null,"The Hardware ID feature in ElegantOTA is shown on the ElegantOTA Pro portal. This ID should be a unique string that helps you easily identify the specific hardware device among others in your network."),(0,n.kt)("h3",{id:"example-usage"},"Example Usage:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-cpp"},'#include \n\nvoid setup() {\n // Initialize your hardware and other configurations here\n\n // Set the Hardware ID\n ElegantOTA.setID("my_device_001");\n\n // Additional setup code\n}\n\nvoid loop() {\n // Your main loop code here\n}\n')),(0,n.kt)("p",null,"In the above example, the ",(0,n.kt)("inlineCode",{parentName:"p"},'ElegantOTA.setID("my_device_001");'),' function call assigns the Hardware ID "my_device_001" to the device.'),(0,n.kt)("h2",{id:"best-practices"},"Best Practices"),(0,n.kt)("p",null,"To make the most of the Hardware ID feature, consider the following best practices:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Choose a Hardware ID that is unique to each device to avoid conflicts.")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Avoid using special characters or spaces in the Hardware ID, as these might cause issues when used in network communication or file naming.")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Document and keep track of the Hardware IDs for all your devices to ensure proper management.")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},"Ensure that the Hardware ID is set during the device's initialization phase, such as in the ",(0,n.kt)("inlineCode",{parentName:"p"},"setup()")," function, to guarantee that it is properly configured before any network or communication activities."))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3865d09d.f3bb47dd.js b/assets/js/3865d09d.f3bb47dd.js deleted file mode 100644 index 6cfa70a..0000000 --- a/assets/js/3865d09d.f3bb47dd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelegantota_docs=self.webpackChunkelegantota_docs||[]).push([[739],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>f});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=c(r),m=a,f=u["".concat(s,".").concat(m)]||u[m]||d[m]||i;return r?n.createElement(f,o(o({ref:t},p),{},{components:r})):n.createElement(f,o({ref:t},p))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:a,o[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const i={title:"Hardware ID",sidebar_label:"Hardware ID (Pro)",sidebar_position:10},o=void 0,l={unversionedId:"hardware-id",id:"hardware-id",title:"Hardware ID",description:"This feature is only available in ElegantOTA Pro.",source:"@site/docs/hardware-id.md",sourceDirName:".",slug:"/hardware-id",permalink:"/hardware-id",draft:!1,tags:[],version:"current",sidebarPosition:10,frontMatter:{title:"Hardware ID",sidebar_label:"Hardware ID (Pro)",sidebar_position:10},sidebar:"tutorialSidebar",previous:{title:"Disable Filesystem OTA (Pro)",permalink:"/disable-filesystem-ota"},next:{title:"Firmware Version (Pro)",permalink:"/firmware-version"}},s={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Example Usage:",id:"example-usage",level:3},{value:"Best Practices",id:"best-practices",level:2}],p={toc:c},u="wrapper";function d(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("div",{className:"pro-label"},(0,a.kt)("i",null,(0,a.kt)("h4",{style:{fontWeight:"500",marginBottom:5}},"This feature is only available in ",(0,a.kt)("a",{target:"_blank",style:{color:"red"},href:"https://elegantota.pro"},"ElegantOTA Pro"),"."))),(0,a.kt)("h2",{id:"introduction"},"Introduction"),(0,a.kt)("p",null,"The Hardware ID feature in ElegantOTA is shown on the ElegantOTA Pro portal. This ID should be a unique string that helps you easily identify the specific hardware device among others in your network."),(0,a.kt)("h3",{id:"example-usage"},"Example Usage:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-cpp"},'#include \n\nvoid setup() {\n // Initialize your hardware and other configurations here\n\n // Set the Hardware ID\n ElegantOTA.setID("my_device_001");\n\n // Additional setup code\n}\n\nvoid loop() {\n // Your main loop code here\n}\n')),(0,a.kt)("p",null,"In the above example, the ",(0,a.kt)("inlineCode",{parentName:"p"},'ElegantOTA.setID("my_device_001");'),' function call assigns the Hardware ID "my_device_001" to the device.'),(0,a.kt)("h2",{id:"best-practices"},"Best Practices"),(0,a.kt)("p",null,"To make the most of the Hardware ID feature, consider the following best practices:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Choose a Hardware ID that is unique to each device to avoid conflicts.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Avoid using special characters or spaces in the Hardware ID, as these might cause issues when used in network communication or file naming.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Document and keep track of the Hardware IDs for all your devices to ensure proper management.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Ensure that the Hardware ID is set during the device's initialization phase, such as in the ",(0,a.kt)("inlineCode",{parentName:"p"},"setup()")," function, to guarantee that it is properly configured before any network or communication activities."))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/64b0ce6a.3edddec3.js b/assets/js/64b0ce6a.3edddec3.js deleted file mode 100644 index 366ef7f..0000000 --- a/assets/js/64b0ce6a.3edddec3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelegantota_docs=self.webpackChunkelegantota_docs||[]).push([[861],{3905:(e,t,o)=>{o.d(t,{Zo:()=>d,kt:()=>m});var a=o(7294);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function n(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,a)}return o}function i(e){for(var t=1;t=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var p=a.createContext({}),s=function(e){var t=a.useContext(p),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},d=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var o=e.components,r=e.mdxType,n=e.originalType,p=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=s(o),g=r,m=u["".concat(p,".").concat(g)]||u[g]||c[g]||n;return o?a.createElement(m,i(i({ref:t},d),{},{components:o})):a.createElement(m,i({ref:t},d))}));function m(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=o.length,i=new Array(n);i[0]=g;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:r,i[1]=l;for(var s=2;s{o.r(t),o.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>c,frontMatter:()=>n,metadata:()=>l,toc:()=>s});var a=o(7462),r=(o(7294),o(3905));const n={title:"Branding",sidebar_label:"Branding (Pro)",sidebar_position:13},i=void 0,l={unversionedId:"branding",id:"branding",title:"Branding",description:"This feature is only available in ElegantOTA Pro.",source:"@site/docs/branding.md",sourceDirName:".",slug:"/branding",permalink:"/branding",draft:!1,tags:[],version:"current",sidebarPosition:13,frontMatter:{title:"Branding",sidebar_label:"Branding (Pro)",sidebar_position:13},sidebar:"tutorialSidebar",previous:{title:"Custom Title (Pro)",permalink:"/custom-title"},next:{title:"Commercial License",permalink:"/commercial-license"}},p={},s=[{value:"Step 1: Prepare Your Logo",id:"step-1-prepare-your-logo",level:3},{value:"Step 2: Convert Logo Image to a Byte Array",id:"step-2-convert-logo-image-to-a-byte-array",level:3},{value:"Step 3: Modify logo.h",id:"step-3-modify-logoh",level:3},{value:"Step 4: Modify logo.cpp",id:"step-4-modify-logocpp",level:3},{value:"Step 5: Upload the Modified Library",id:"step-5-upload-the-modified-library",level:3},{value:"Using the Custom Logo",id:"using-the-custom-logo",level:2}],d={toc:s},u="wrapper";function c(e){let{components:t,...o}=e;return(0,r.kt)(u,(0,a.Z)({},d,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("div",{className:"pro-label"},(0,r.kt)("i",null,(0,r.kt)("h4",{style:{fontWeight:"500",marginBottom:5}},"This feature is only available in ",(0,r.kt)("a",{target:"_blank",style:{color:"red"},href:"https://elegantota.pro"},"ElegantOTA Pro"),"."))),(0,r.kt)("br",null),(0,r.kt)("br",null),(0,r.kt)("h1",{id:"overview"},"Overview"),(0,r.kt)("p",null,"Branding in this context refers to the custom logo that is displayed on the ElegantOTA portal during the OTA update process. You can customize the logo by defining the logo image as a byte array in the ",(0,r.kt)("inlineCode",{parentName:"p"},"logo.h")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"logo.cpp")," files of the library's source code."),(0,r.kt)("p",null,"To add your custom logo on the ElegantOTA portal, follow these steps:"),(0,r.kt)("h3",{id:"step-1-prepare-your-logo"},"Step 1: Prepare Your Logo"),(0,r.kt)("p",null,"First, you need to create or obtain the logo image you want to display on the ElegantOTA portal during OTA updates. Ensure that the logo image is in a suitable format, such as a SVG (recommended) / PNG or JPG file and make sure your image is optimized & small in file size."),(0,r.kt)("h3",{id:"step-2-convert-logo-image-to-a-byte-array"},"Step 2: Convert Logo Image to a Byte Array"),(0,r.kt)("p",null,"To include the logo in your library, you'll need to convert the image into a byte array."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Go to ",(0,r.kt)("a",{parentName:"li",href:"https://file2raw.labrat.one/"},"File2Raw utility")," ( I created this utility a few years back for the purpose of converting files into byte array for C++ applications )."),(0,r.kt)("li",{parentName:"ol"},"Select your logo."),(0,r.kt)("li",{parentName:"ol"},'Select "Gzip Compress" & "Use PROGMEM (Arduino)".'),(0,r.kt)("li",{parentName:"ol"},'Click "Convert".')),(0,r.kt)("h3",{id:"step-3-modify-logoh"},"Step 3: Modify ",(0,r.kt)("inlineCode",{parentName:"h3"},"logo.h")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Open the ",(0,r.kt)("inlineCode",{parentName:"p"},"logo.h")," file in your ElegantOTA library source code.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Locate the ",(0,r.kt)("inlineCode",{parentName:"p"},"ELEGANTOTA_LOGO")," byte array declaration, which should look like this:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-cpp"},"extern const uint8_t ELEGANTOTA_LOGO[];\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Replace the length of the ",(0,r.kt)("inlineCode",{parentName:"p"},"ELEGANTOTA_LOGO")," array with your custom logo's byte array length.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Locate the ",(0,r.kt)("inlineCode",{parentName:"p"},"ELEGANTOTA_LOGO_MIME")," variable, which defines the MIME type of your logo image. By default, it is set to ",(0,r.kt)("inlineCode",{parentName:"p"},"image/png"),". If your logo is in a different format (e.g., JPEG), update the ",(0,r.kt)("inlineCode",{parentName:"p"},"ELEGANTOTA_LOGO_MIME")," variable to the appropriate MIME type.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Set ",(0,r.kt)("inlineCode",{parentName:"p"},"ELEGANTOTA_LOGO_WIDTH")," & ",(0,r.kt)("inlineCode",{parentName:"p"},"ELEGANTOTA_LOGO_HEIGHT")," according to your desired size which will be displayed on the webpage."))),(0,r.kt)("h3",{id:"step-4-modify-logocpp"},"Step 4: Modify ",(0,r.kt)("inlineCode",{parentName:"h3"},"logo.cpp")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Open the ",(0,r.kt)("inlineCode",{parentName:"p"},"logo.cpp")," file in your ElegantOTA library source code.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Replace the contents of the ",(0,r.kt)("inlineCode",{parentName:"p"},"ELEGANTOTA_LOGO")," array with your custom logo's byte array generated in File2Raw utility."))),(0,r.kt)("h3",{id:"step-5-upload-the-modified-library"},"Step 5: Upload the Modified Library"),(0,r.kt)("p",null,"After making these changes, compile and upload the modified ElegantOTA library to your device."),(0,r.kt)("h2",{id:"using-the-custom-logo"},"Using the Custom Logo"),(0,r.kt)("p",null,"Once you have uploaded the modified ElegantOTA library to your device, the custom logo will be displayed on the ElegantOTA Portal webpage during OTA updates."),(0,r.kt)("p",null,"That's it! You have successfully added custom branding to the ElegantOTA portal by defining the logo as a byte array in the ",(0,r.kt)("inlineCode",{parentName:"p"},"logo.h")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"logo.cpp")," files. Your logo will now be displayed on the ElegantOTA portal."),(0,r.kt)("p",null,"Please note that branding, including logos and images, may be subject to copyright and trademark laws. Ensure you have the necessary rights or permissions to use any branding elements in your project."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/64b0ce6a.c832846e.js b/assets/js/64b0ce6a.c832846e.js new file mode 100644 index 0000000..d084efa --- /dev/null +++ b/assets/js/64b0ce6a.c832846e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelegantota_docs=self.webpackChunkelegantota_docs||[]).push([[861],{3905:(e,t,o)=>{o.d(t,{Zo:()=>d,kt:()=>m});var a=o(7294);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function n(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,a)}return o}function i(e){for(var t=1;t=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var p=a.createContext({}),s=function(e){var t=a.useContext(p),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},d=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},u="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},g=a.forwardRef((function(e,t){var o=e.components,r=e.mdxType,n=e.originalType,p=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=s(o),g=r,m=u["".concat(p,".").concat(g)]||u[g]||c[g]||n;return o?a.createElement(m,i(i({ref:t},d),{},{components:o})):a.createElement(m,i({ref:t},d))}));function m(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var n=o.length,i=new Array(n);i[0]=g;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l[u]="string"==typeof e?e:r,i[1]=l;for(var s=2;s{o.r(t),o.d(t,{assets:()=>p,contentTitle:()=>i,default:()=>c,frontMatter:()=>n,metadata:()=>l,toc:()=>s});var a=o(7462),r=(o(7294),o(3905));const n={title:"Branding",sidebar_label:"Branding (Pro)",sidebar_position:13},i=void 0,l={unversionedId:"branding",id:"branding",title:"Branding",description:"This feature is only available in ElegantOTA Pro.",source:"@site/docs/branding.md",sourceDirName:".",slug:"/branding",permalink:"/branding",draft:!1,tags:[],version:"current",sidebarPosition:13,frontMatter:{title:"Branding",sidebar_label:"Branding (Pro)",sidebar_position:13},sidebar:"tutorialSidebar",previous:{title:"Custom Title (Pro)",permalink:"/custom-title"},next:{title:"Commercial License",permalink:"/commercial-license"}},p={},s=[{value:"Step 1: Prepare Your Logo",id:"step-1-prepare-your-logo",level:3},{value:"Step 2: Convert Logo Image to a Byte Array",id:"step-2-convert-logo-image-to-a-byte-array",level:3},{value:"Step 3: Modify logo.h",id:"step-3-modify-logoh",level:3},{value:"Step 4: Modify logo.cpp",id:"step-4-modify-logocpp",level:3},{value:"Step 5: Upload the Modified Library",id:"step-5-upload-the-modified-library",level:3},{value:"Using the Custom Logo",id:"using-the-custom-logo",level:2}],d={toc:s},u="wrapper";function c(e){let{components:t,...o}=e;return(0,r.kt)(u,(0,a.Z)({},d,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("div",{className:"pro-label"},(0,r.kt)("i",null,(0,r.kt)("h4",{style:{fontWeight:"500",marginBottom:5}},"This feature is only available in ",(0,r.kt)("a",{target:"_blank",style:{color:"red"},href:"https://elegantota.pro"},"ElegantOTA Pro"),"."))),(0,r.kt)("br",null),(0,r.kt)("br",null),(0,r.kt)("img",{src:"/v3/img/branding.png",alt:"Branding",width:"400px"}),(0,r.kt)("br",null),(0,r.kt)("br",null),(0,r.kt)("h1",{id:"overview"},"Overview"),(0,r.kt)("p",null,"Branding in this context refers to the custom logo that is displayed on the ElegantOTA portal during the OTA update process. You can customize the logo by defining the logo image as a byte array in the ",(0,r.kt)("inlineCode",{parentName:"p"},"logo.h")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"logo.cpp")," files of the library's source code."),(0,r.kt)("p",null,"To add your custom logo on the ElegantOTA portal, follow these steps:"),(0,r.kt)("h3",{id:"step-1-prepare-your-logo"},"Step 1: Prepare Your Logo"),(0,r.kt)("p",null,"First, you need to create or obtain the logo image you want to display on the ElegantOTA portal during OTA updates. Ensure that the logo image is in a suitable format, such as a SVG (recommended) / PNG or JPG file and make sure your image is optimized & small in file size."),(0,r.kt)("h3",{id:"step-2-convert-logo-image-to-a-byte-array"},"Step 2: Convert Logo Image to a Byte Array"),(0,r.kt)("p",null,"To include the logo in your library, you'll need to convert the image into a byte array."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Go to ",(0,r.kt)("a",{parentName:"li",href:"https://file2raw.labrat.one/"},"File2Raw utility")," ( I created this utility a few years back for the purpose of converting files into byte array for C++ applications )."),(0,r.kt)("li",{parentName:"ol"},"Select your logo."),(0,r.kt)("li",{parentName:"ol"},'Select "Gzip Compress" & "Use PROGMEM (Arduino)".'),(0,r.kt)("li",{parentName:"ol"},'Click "Convert".')),(0,r.kt)("h3",{id:"step-3-modify-logoh"},"Step 3: Modify ",(0,r.kt)("inlineCode",{parentName:"h3"},"logo.h")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Open the ",(0,r.kt)("inlineCode",{parentName:"p"},"logo.h")," file in your ElegantOTA library source code.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Locate the ",(0,r.kt)("inlineCode",{parentName:"p"},"ELEGANTOTA_LOGO")," byte array declaration, which should look like this:"),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre",className:"language-cpp"},"extern const uint8_t ELEGANTOTA_LOGO[];\n"))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Replace the length of the ",(0,r.kt)("inlineCode",{parentName:"p"},"ELEGANTOTA_LOGO")," array with your custom logo's byte array length.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Locate the ",(0,r.kt)("inlineCode",{parentName:"p"},"ELEGANTOTA_LOGO_MIME")," variable, which defines the MIME type of your logo image. By default, it is set to ",(0,r.kt)("inlineCode",{parentName:"p"},"image/png"),". If your logo is in a different format (e.g., JPEG), update the ",(0,r.kt)("inlineCode",{parentName:"p"},"ELEGANTOTA_LOGO_MIME")," variable to the appropriate MIME type.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Set ",(0,r.kt)("inlineCode",{parentName:"p"},"ELEGANTOTA_LOGO_WIDTH")," & ",(0,r.kt)("inlineCode",{parentName:"p"},"ELEGANTOTA_LOGO_HEIGHT")," according to your desired size which will be displayed on the webpage."))),(0,r.kt)("h3",{id:"step-4-modify-logocpp"},"Step 4: Modify ",(0,r.kt)("inlineCode",{parentName:"h3"},"logo.cpp")),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Open the ",(0,r.kt)("inlineCode",{parentName:"p"},"logo.cpp")," file in your ElegantOTA library source code.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Replace the contents of the ",(0,r.kt)("inlineCode",{parentName:"p"},"ELEGANTOTA_LOGO")," array with your custom logo's byte array generated in File2Raw utility."))),(0,r.kt)("h3",{id:"step-5-upload-the-modified-library"},"Step 5: Upload the Modified Library"),(0,r.kt)("p",null,"After making these changes, compile and upload the modified ElegantOTA library to your device."),(0,r.kt)("h2",{id:"using-the-custom-logo"},"Using the Custom Logo"),(0,r.kt)("p",null,"Once you have uploaded the modified ElegantOTA library to your device, the custom logo will be displayed on the ElegantOTA Portal webpage during OTA updates."),(0,r.kt)("p",null,"That's it! You have successfully added custom branding to the ElegantOTA portal by defining the logo as a byte array in the ",(0,r.kt)("inlineCode",{parentName:"p"},"logo.h")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"logo.cpp")," files. Your logo will now be displayed on the ElegantOTA portal."),(0,r.kt)("p",null,"Please note that branding, including logos and images, may be subject to copyright and trademark laws. Ensure you have the necessary rights or permissions to use any branding elements in your project."))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a5ec7539.f1917fc6.js b/assets/js/a5ec7539.d8c77f85.js similarity index 50% rename from assets/js/a5ec7539.f1917fc6.js rename to assets/js/a5ec7539.d8c77f85.js index 550dd8c..f9f1432 100644 --- a/assets/js/a5ec7539.f1917fc6.js +++ b/assets/js/a5ec7539.d8c77f85.js @@ -1 +1 @@ -"use strict";(self.webpackChunkelegantota_docs=self.webpackChunkelegantota_docs||[]).push([[818],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),p=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),c=p(n),m=a,f=c["".concat(s,".").concat(m)]||c[m]||d[m]||i;return n?r.createElement(f,o(o({ref:t},u),{},{components:n})):r.createElement(f,o({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:a,o[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var r=n(7462),a=(n(7294),n(3905));const i={title:"Custom Title",sidebar_label:"Custom Title (Pro)",sidebar_position:12},o=void 0,l={unversionedId:"custom-title",id:"custom-title",title:"Custom Title",description:"This feature is only available in ElegantOTA Pro.",source:"@site/docs/custom-title.md",sourceDirName:".",slug:"/custom-title",permalink:"/custom-title",draft:!1,tags:[],version:"current",sidebarPosition:12,frontMatter:{title:"Custom Title",sidebar_label:"Custom Title (Pro)",sidebar_position:12},sidebar:"tutorialSidebar",previous:{title:"Firmware Version (Pro)",permalink:"/firmware-version"},next:{title:"Branding (Pro)",permalink:"/branding"}},s={},p=[{value:"Overview",id:"overview",level:2},{value:"Syntax",id:"syntax",level:2},{value:"Example",id:"example",level:2},{value:"Usage",id:"usage",level:2}],u={toc:p},c="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("div",{className:"pro-label"},(0,a.kt)("i",null,(0,a.kt)("h4",{style:{fontWeight:"500",marginBottom:5}},"This feature is only available in ",(0,a.kt)("a",{target:"_blank",style:{color:"red"},href:"https://elegantota.pro"},"ElegantOTA Pro"),"."))),(0,a.kt)("h2",{id:"overview"},"Overview"),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"setTitle()")," function is a method provided by the ElegantOTA Pro library. It is used to set the title of the OTA (Over-The-Air) update portal. This title is displayed at the top of the update portal web page, providing a user-friendly and customizable interface for managing firmware updates."),(0,a.kt)("h2",{id:"syntax"},"Syntax"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-cpp"},"void setTitle(const char* title);\n")),(0,a.kt)("h2",{id:"example"},"Example"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-cpp"},'#include \n\nvoid setup() {\n // Initialize the ElegantOTA library\n ElegantOTA.begin();\n\n // Set the title of the OTA update portal\n ElegantOTA.setTitle("OTA Update - XYZ Inc");\n}\n\nvoid loop() {\n // Your main program loop\n}\n')),(0,a.kt)("h2",{id:"usage"},"Usage"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"Include the ElegantOTA library in your Arduino sketch."),(0,a.kt)("li",{parentName:"ol"},"In the ",(0,a.kt)("inlineCode",{parentName:"li"},"setup()")," function of your sketch, initialize the ElegantOTA library using ",(0,a.kt)("inlineCode",{parentName:"li"},"ElegantOTA.begin()"),"."),(0,a.kt)("li",{parentName:"ol"},"Use the ",(0,a.kt)("inlineCode",{parentName:"li"},"setTitle()")," function to set a meaningful title for your OTA update portal. This title will be displayed at the top of the update portal web page when users access it."),(0,a.kt)("li",{parentName:"ol"},"Continue with the rest of your sketch's setup and loop functions.")))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkelegantota_docs=self.webpackChunkelegantota_docs||[]).push([[818],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>f});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),p=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=p(e.components);return r.createElement(s.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),c=p(n),m=a,f=c["".concat(s,".").concat(m)]||c[m]||d[m]||i;return n?r.createElement(f,l(l({ref:t},u),{},{components:n})):r.createElement(f,l({ref:t},u))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,l=new Array(i);l[0]=m;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[c]="string"==typeof e?e:a,l[1]=o;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>o,toc:()=>p});var r=n(7462),a=(n(7294),n(3905));const i={title:"Custom Title",sidebar_label:"Custom Title (Pro)",sidebar_position:12},l=void 0,o={unversionedId:"custom-title",id:"custom-title",title:"Custom Title",description:"This feature is only available in ElegantOTA Pro.",source:"@site/docs/custom-title.md",sourceDirName:".",slug:"/custom-title",permalink:"/custom-title",draft:!1,tags:[],version:"current",sidebarPosition:12,frontMatter:{title:"Custom Title",sidebar_label:"Custom Title (Pro)",sidebar_position:12},sidebar:"tutorialSidebar",previous:{title:"Firmware Version (Pro)",permalink:"/firmware-version"},next:{title:"Branding (Pro)",permalink:"/branding"}},s={},p=[{value:"Overview",id:"overview",level:2},{value:"Syntax",id:"syntax",level:2},{value:"Example",id:"example",level:2},{value:"Usage",id:"usage",level:2}],u={toc:p},c="wrapper";function d(e){let{components:t,...n}=e;return(0,a.kt)(c,(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("div",{className:"pro-label"},(0,a.kt)("i",null,(0,a.kt)("h4",{style:{fontWeight:"500",marginBottom:5}},"This feature is only available in ",(0,a.kt)("a",{target:"_blank",style:{color:"red"},href:"https://elegantota.pro"},"ElegantOTA Pro"),"."))),(0,a.kt)("br",null),(0,a.kt)("img",{src:"/v3/img/custom-title.png",alt:"Custom Title",width:"400px"}),(0,a.kt)("br",null),(0,a.kt)("h2",{id:"overview"},"Overview"),(0,a.kt)("p",null,"The ",(0,a.kt)("inlineCode",{parentName:"p"},"setTitle()")," function is a method provided by the ElegantOTA Pro library. It is used to set the title of the OTA (Over-The-Air) update portal. This title is displayed at the top of the update portal web page, providing a user-friendly and customizable interface for managing firmware updates."),(0,a.kt)("h2",{id:"syntax"},"Syntax"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-cpp"},"void setTitle(const char* title);\n")),(0,a.kt)("h2",{id:"example"},"Example"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-cpp"},'#include \n\nvoid setup() {\n // Initialize the ElegantOTA library\n ElegantOTA.begin();\n\n // Set the title of the OTA update portal\n ElegantOTA.setTitle("OTA Update - XYZ Inc");\n}\n\nvoid loop() {\n // Your main program loop\n}\n')),(0,a.kt)("h2",{id:"usage"},"Usage"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"Include the ElegantOTA library in your Arduino sketch."),(0,a.kt)("li",{parentName:"ol"},"In the ",(0,a.kt)("inlineCode",{parentName:"li"},"setup()")," function of your sketch, initialize the ElegantOTA library using ",(0,a.kt)("inlineCode",{parentName:"li"},"ElegantOTA.begin()"),"."),(0,a.kt)("li",{parentName:"ol"},"Use the ",(0,a.kt)("inlineCode",{parentName:"li"},"setTitle()")," function to set a meaningful title for your OTA update portal. This title will be displayed at the top of the update portal web page when users access it."),(0,a.kt)("li",{parentName:"ol"},"Continue with the rest of your sketch's setup and loop functions.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/eb3cd3e5.86988d4d.js b/assets/js/eb3cd3e5.86988d4d.js deleted file mode 100644 index 3e06078..0000000 --- a/assets/js/eb3cd3e5.86988d4d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelegantota_docs=self.webpackChunkelegantota_docs||[]).push([[784],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>d});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(r),f=a,d=u["".concat(l,".").concat(f)]||u[f]||m[f]||i;return r?n.createElement(d,o(o({ref:t},p),{},{components:r})):n.createElement(d,o({ref:t},p))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=f;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const i={title:"Firmware Version",sidebar_label:"Firmware Version (Pro)",sidebar_position:11},o=void 0,s={unversionedId:"firmware-version",id:"firmware-version",title:"Firmware Version",description:"This feature is only available in ElegantOTA Pro.",source:"@site/docs/firmware-version.md",sourceDirName:".",slug:"/firmware-version",permalink:"/firmware-version",draft:!1,tags:[],version:"current",sidebarPosition:11,frontMatter:{title:"Firmware Version",sidebar_label:"Firmware Version (Pro)",sidebar_position:11},sidebar:"tutorialSidebar",previous:{title:"Hardware ID (Pro)",permalink:"/hardware-id"},next:{title:"Custom Title (Pro)",permalink:"/custom-title"}},l={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Example Usage:",id:"example-usage",level:3},{value:"Use Cases",id:"use-cases",level:2},{value:"Best Practices",id:"best-practices",level:2}],p={toc:c},u="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("div",{className:"pro-label"},(0,a.kt)("i",null,(0,a.kt)("h4",{style:{fontWeight:"500",marginBottom:5}},"This feature is only available in ",(0,a.kt)("a",{target:"_blank",style:{color:"red"},href:"https://elegantota.pro"},"ElegantOTA Pro"),"."))),(0,a.kt)("h2",{id:"introduction"},"Introduction"),(0,a.kt)("p",null,"The Firmware Version feature in ElegantOTA allows you to specify and manage the version of the firmware running on your Internet of Things (IoT) devices. By setting a firmware version, you can easily track and control the software running on your devices, making it simpler to perform updates, monitor compatibility, and manage your IoT ecosystem effectively."),(0,a.kt)("p",null,"You can set the Firmware Version for your device using the ",(0,a.kt)("inlineCode",{parentName:"p"},'ElegantOTA.setFWVersion("version");')," function."),(0,a.kt)("h3",{id:"example-usage"},"Example Usage:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-cpp"},'#include \n\nvoid setup() {\n // Initialize your hardware and other configurations here\n\n // Set the Firmware Version\n ElegantOTA.setFWVersion("v1.0.0");\n\n // Additional setup code\n}\n\nvoid loop() {\n // Your main loop code here\n}\n')),(0,a.kt)("p",null,"In the above example, the ",(0,a.kt)("inlineCode",{parentName:"p"},'ElegantOTA.setFWVersion("v1.0.0");'),' function call assigns the firmware version "v1.0.0" to the device.'),(0,a.kt)("h2",{id:"use-cases"},"Use Cases"),(0,a.kt)("p",null,"The Firmware Version feature can be beneficial in various scenarios:"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("strong",{parentName:"p"},"Firmware Updates"),": When new firmware versions become available, the Firmware Version identifier helps you check if an update is necessary. It also allows you to verify that devices have received the correct update.")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("strong",{parentName:"p"},"Compatibility"),": By knowing the firmware version of each device, you can ensure that all components of your IoT network are compatible. This is especially important when devices communicate or interact with each other.")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("strong",{parentName:"p"},"Historical Tracking"),": You can maintain a history of firmware versions installed on each device, which can be useful for troubleshooting issues or understanding the evolution of your firmware.")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("strong",{parentName:"p"},"Remote Diagnostics"),": When diagnosing issues remotely, having access to the firmware version can help you identify potential problems related to specific software releases."))),(0,a.kt)("h2",{id:"best-practices"},"Best Practices"),(0,a.kt)("p",null,"To make the most of the Firmware Version feature, consider the following best practices:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Follow a consistent versioning scheme for your firmware, such as Semantic Versioning (SemVer), to ensure clarity and compatibility tracking.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Set the firmware version during the device's initialization phase, such as in the ",(0,a.kt)("inlineCode",{parentName:"p"},"setup()")," function, to guarantee that it accurately reflects the installed firmware.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"When updating firmware, always ensure that the new version is correctly set using ",(0,a.kt)("inlineCode",{parentName:"p"},"ElegantOTA.setFWVersion()")," to maintain accurate version information."))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/eb3cd3e5.ca8ae6dd.js b/assets/js/eb3cd3e5.ca8ae6dd.js new file mode 100644 index 0000000..44c03e6 --- /dev/null +++ b/assets/js/eb3cd3e5.ca8ae6dd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelegantota_docs=self.webpackChunkelegantota_docs||[]).push([[784],{3905:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>d});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(r),f=a,d=u["".concat(l,".").concat(f)]||u[f]||m[f]||i;return r?n.createElement(d,o(o({ref:t},p),{},{components:r})):n.createElement(d,o({ref:t},p))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=f;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:a,o[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const i={title:"Firmware Version",sidebar_label:"Firmware Version (Pro)",sidebar_position:11},o=void 0,s={unversionedId:"firmware-version",id:"firmware-version",title:"Firmware Version",description:"This feature is only available in ElegantOTA Pro.",source:"@site/docs/firmware-version.md",sourceDirName:".",slug:"/firmware-version",permalink:"/firmware-version",draft:!1,tags:[],version:"current",sidebarPosition:11,frontMatter:{title:"Firmware Version",sidebar_label:"Firmware Version (Pro)",sidebar_position:11},sidebar:"tutorialSidebar",previous:{title:"Hardware ID (Pro)",permalink:"/hardware-id"},next:{title:"Custom Title (Pro)",permalink:"/custom-title"}},l={},c=[{value:"Introduction",id:"introduction",level:2},{value:"Example Usage:",id:"example-usage",level:3},{value:"Use Cases",id:"use-cases",level:2},{value:"Best Practices",id:"best-practices",level:2}],p={toc:c},u="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(u,(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("div",{className:"pro-label"},(0,a.kt)("i",null,(0,a.kt)("h4",{style:{fontWeight:"500",marginBottom:5}},"This feature is only available in ",(0,a.kt)("a",{target:"_blank",style:{color:"red"},href:"https://elegantota.pro"},"ElegantOTA Pro"),"."))),(0,a.kt)("br",null),(0,a.kt)("br",null),(0,a.kt)("img",{src:"/v3/img/firmware-version.png",alt:"Firmware Version",width:"400px"}),(0,a.kt)("br",null),(0,a.kt)("h2",{id:"introduction"},"Introduction"),(0,a.kt)("p",null,"The Firmware Version feature in ElegantOTA allows you to specify and manage the version of the firmware running on your Internet of Things (IoT) devices. By setting a firmware version, you can easily track and control the software running on your devices, making it simpler to perform updates, monitor compatibility, and manage your IoT ecosystem effectively."),(0,a.kt)("p",null,"You can set the Firmware Version for your device using the ",(0,a.kt)("inlineCode",{parentName:"p"},'ElegantOTA.setFWVersion("version");')," function."),(0,a.kt)("h3",{id:"example-usage"},"Example Usage:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-cpp"},'#include \n\nvoid setup() {\n // Initialize your hardware and other configurations here\n\n // Set the Firmware Version\n ElegantOTA.setFWVersion("1.0.0");\n\n // Additional setup code\n}\n\nvoid loop() {\n // Your main loop code here\n}\n')),(0,a.kt)("p",null,"In the above example, the ",(0,a.kt)("inlineCode",{parentName:"p"},'ElegantOTA.setFWVersion("1.0.0");'),' function call assigns the firmware version "1.0.0" to the device.'),(0,a.kt)("h2",{id:"use-cases"},"Use Cases"),(0,a.kt)("p",null,"The Firmware Version feature can be beneficial in various scenarios:"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("strong",{parentName:"p"},"Firmware Updates"),": When new firmware versions become available, the Firmware Version identifier helps you check if an update is necessary. It also allows you to verify that devices have received the correct update.")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("strong",{parentName:"p"},"Compatibility"),": By knowing the firmware version of each device, you can ensure that all components of your IoT network are compatible. This is especially important when devices communicate or interact with each other.")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("strong",{parentName:"p"},"Historical Tracking"),": You can maintain a history of firmware versions installed on each device, which can be useful for troubleshooting issues or understanding the evolution of your firmware.")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},(0,a.kt)("strong",{parentName:"p"},"Remote Diagnostics"),": When diagnosing issues remotely, having access to the firmware version can help you identify potential problems related to specific software releases."))),(0,a.kt)("h2",{id:"best-practices"},"Best Practices"),(0,a.kt)("p",null,"To make the most of the Firmware Version feature, consider the following best practices:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Follow a consistent versioning scheme for your firmware, such as Semantic Versioning (SemVer), to ensure clarity and compatibility tracking.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Set the firmware version during the device's initialization phase, such as in the ",(0,a.kt)("inlineCode",{parentName:"p"},"setup()")," function, to guarantee that it accurately reflects the installed firmware.")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"When updating firmware, always ensure that the new version is correctly set using ",(0,a.kt)("inlineCode",{parentName:"p"},"ElegantOTA.setFWVersion()")," to maintain accurate version information."))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f39b3a0b.22bd28d3.js b/assets/js/f39b3a0b.22bd28d3.js deleted file mode 100644 index d4764ad..0000000 --- a/assets/js/f39b3a0b.22bd28d3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelegantota_docs=self.webpackChunkelegantota_docs||[]).push([[989],{3905:(e,r,t)=>{t.d(r,{Zo:()=>u,kt:()=>b});var a=t(7294);function n(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function i(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);r&&(a=a.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,a)}return t}function o(e){for(var r=1;r=0||(n[t]=e[t]);return n}(e,r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(n[t]=e[t])}return n}var s=a.createContext({}),c=function(e){var r=a.useContext(s),t=r;return e&&(t="function"==typeof e?e(r):o(o({},r),e)),t},u=function(e){var r=c(e.components);return a.createElement(s.Provider,{value:r},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var r=e.children;return a.createElement(a.Fragment,{},r)}},d=a.forwardRef((function(e,r){var t=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(t),d=n,b=p["".concat(s,".").concat(d)]||p[d]||m[d]||i;return t?a.createElement(b,o(o({ref:r},u),{},{components:t})):a.createElement(b,o({ref:r},u))}));function b(e,r){var t=arguments,n=r&&r.mdxType;if("string"==typeof e||n){var i=t.length,o=new Array(i);o[0]=d;var l={};for(var s in r)hasOwnProperty.call(r,s)&&(l[s]=r[s]);l.originalType=e,l[p]="string"==typeof e?e:n,o[1]=l;for(var c=2;c{t.r(r),t.d(r,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var a=t(7462),n=(t(7294),t(3905));const i={title:"Disable Firmware OTA",sidebar_label:"Disable Firmware OTA (Pro)",sidebar_position:8},o=void 0,l={unversionedId:"disable-firmware-ota",id:"disable-firmware-ota",title:"Disable Firmware OTA",description:"This feature is only available in ElegantOTA Pro.",source:"@site/docs/disable-firmware-ota.md",sourceDirName:".",slug:"/disable-firmware-ota",permalink:"/disable-firmware-ota",draft:!1,tags:[],version:"current",sidebarPosition:8,frontMatter:{title:"Disable Firmware OTA",sidebar_label:"Disable Firmware OTA (Pro)",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"Async Mode",permalink:"/async-mode"},next:{title:"Disable Filesystem OTA (Pro)",permalink:"/disable-filesystem-ota"}},s={},c=[{value:"Disable Firmware OTA:",id:"disable-firmware-ota",level:4},{value:"Enable Firmware OTA:",id:"enable-firmware-ota",level:4},{value:"Get Firmware OTA mode status:",id:"get-firmware-ota-mode-status",level:4}],u={toc:c},p="wrapper";function m(e){let{components:r,...t}=e;return(0,n.kt)(p,(0,a.Z)({},u,t,{components:r,mdxType:"MDXLayout"}),(0,n.kt)("div",{className:"pro-label"},(0,n.kt)("i",null,(0,n.kt)("h4",{style:{fontWeight:"500",marginBottom:5}},"This feature is only available in ",(0,n.kt)("a",{target:"_blank",style:{color:"red"},href:"https://elegantota.pro"},"ElegantOTA Pro"),"."))),(0,n.kt)("br",null),(0,n.kt)("br",null),(0,n.kt)("p",null,"ElegantOTA allows you to selective enable or disable OTA modes of your choice for security reasons or when you have a important task running where you don't want it to get interrupted by an OTA update. This will be represented in the portal (ElegantOTA webpage) too."),(0,n.kt)("p",null,"This function should be used very carefully as it blocks firmware update! If by mistake this is left disabled, your device will not be recoverable by an OTA update."),(0,n.kt)("h4",{id:"disable-firmware-ota"},"Disable Firmware OTA:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-cpp"},"// Pass 'false' to disable Firmware mode\nElegantOTA.setFirmwareMode(false);\n")),(0,n.kt)("h4",{id:"enable-firmware-ota"},"Enable Firmware OTA:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-cpp"},"// Pass 'true' to enable Firmware mode\nElegantOTA.setFirmwareMode(true);\n")),(0,n.kt)("h4",{id:"get-firmware-ota-mode-status"},"Get Firmware OTA mode status:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-cpp"},'// You can use this logic inside a function if neccessary\nif(ElegantOTA.checkFirmwareMode() == true) {\n Serial.println("Firmware mode is enabled");\n} else {\n Serial.println("Firmware mode is disabled");\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f39b3a0b.f455d83e.js b/assets/js/f39b3a0b.f455d83e.js new file mode 100644 index 0000000..90b95e5 --- /dev/null +++ b/assets/js/f39b3a0b.f455d83e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelegantota_docs=self.webpackChunkelegantota_docs||[]).push([[989],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>b});var a=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=a.createContext({}),c=function(e){var t=a.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),p=c(r),d=n,b=p["".concat(s,".").concat(d)]||p[d]||m[d]||i;return r?a.createElement(b,o(o({ref:t},u),{},{components:r})):a.createElement(b,o({ref:t},u))}));function b(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,o=new Array(i);o[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[p]="string"==typeof e?e:n,o[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var a=r(7462),n=(r(7294),r(3905));const i={title:"Disable Firmware OTA",sidebar_label:"Disable Firmware OTA (Pro)",sidebar_position:8},o=void 0,l={unversionedId:"disable-firmware-ota",id:"disable-firmware-ota",title:"Disable Firmware OTA",description:"This feature is only available in ElegantOTA Pro.",source:"@site/docs/disable-firmware-ota.md",sourceDirName:".",slug:"/disable-firmware-ota",permalink:"/disable-firmware-ota",draft:!1,tags:[],version:"current",sidebarPosition:8,frontMatter:{title:"Disable Firmware OTA",sidebar_label:"Disable Firmware OTA (Pro)",sidebar_position:8},sidebar:"tutorialSidebar",previous:{title:"Async Mode",permalink:"/async-mode"},next:{title:"Disable Filesystem OTA (Pro)",permalink:"/disable-filesystem-ota"}},s={},c=[{value:"Disable Firmware OTA:",id:"disable-firmware-ota",level:4},{value:"Enable Firmware OTA:",id:"enable-firmware-ota",level:4},{value:"Get Firmware OTA mode status:",id:"get-firmware-ota-mode-status",level:4}],u={toc:c},p="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(p,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("div",{className:"pro-label"},(0,n.kt)("i",null,(0,n.kt)("h4",{style:{fontWeight:"500",marginBottom:5}},"This feature is only available in ",(0,n.kt)("a",{target:"_blank",style:{color:"red"},href:"https://elegantota.pro"},"ElegantOTA Pro"),"."))),(0,n.kt)("br",null),(0,n.kt)("br",null),(0,n.kt)("img",{src:"/v3/img/ota-modes.png",alt:"Modes",width:"400px"}),(0,n.kt)("br",null),(0,n.kt)("br",null),(0,n.kt)("p",null,"ElegantOTA allows you to selective enable or disable OTA modes of your choice for security reasons or when you have a important task running where you don't want it to get interrupted by an OTA update. This will be represented in the portal (ElegantOTA webpage) too."),(0,n.kt)("p",null,"This function should be used very carefully as it blocks firmware update! If by mistake this is left disabled, your device will not be recoverable by an OTA update."),(0,n.kt)("h4",{id:"disable-firmware-ota"},"Disable Firmware OTA:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-cpp"},"// Pass 'false' to disable Firmware mode\nElegantOTA.setFirmwareMode(false);\n")),(0,n.kt)("h4",{id:"enable-firmware-ota"},"Enable Firmware OTA:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-cpp"},"// Pass 'true' to enable Firmware mode\nElegantOTA.setFirmwareMode(true);\n")),(0,n.kt)("h4",{id:"get-firmware-ota-mode-status"},"Get Firmware OTA mode status:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-cpp"},'// You can use this logic inside a function if neccessary\nif(ElegantOTA.checkFirmwareMode() == true) {\n Serial.println("Firmware mode is enabled");\n} else {\n Serial.println("Firmware mode is disabled");\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ff93640d.190f2c21.js b/assets/js/ff93640d.190f2c21.js new file mode 100644 index 0000000..dc09809 --- /dev/null +++ b/assets/js/ff93640d.190f2c21.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkelegantota_docs=self.webpackChunkelegantota_docs||[]).push([[816],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>y});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var o=n.createContext({}),c=function(e){var t=n.useContext(o),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(o.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,o=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(r),d=a,y=p["".concat(o,".").concat(d)]||p[d]||m[d]||l;return r?n.createElement(y,s(s({ref:t},u),{},{components:r})):n.createElement(y,s({ref:t},u))}));function y(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,s=new Array(l);s[0]=d;var i={};for(var o in t)hasOwnProperty.call(t,o)&&(i[o]=t[o]);i.originalType=e,i[p]="string"==typeof e?e:a,s[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>o,contentTitle:()=>s,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var n=r(7462),a=(r(7294),r(3905));const l={title:"Disable Filesystem OTA",sidebar_label:"Disable Filesystem OTA (Pro)",sidebar_position:9},s=void 0,i={unversionedId:"disable-filesystem-ota",id:"disable-filesystem-ota",title:"Disable Filesystem OTA",description:"This feature is only available in ElegantOTA Pro.",source:"@site/docs/disable-filesystem-ota.md",sourceDirName:".",slug:"/disable-filesystem-ota",permalink:"/disable-filesystem-ota",draft:!1,tags:[],version:"current",sidebarPosition:9,frontMatter:{title:"Disable Filesystem OTA",sidebar_label:"Disable Filesystem OTA (Pro)",sidebar_position:9},sidebar:"tutorialSidebar",previous:{title:"Disable Firmware OTA (Pro)",permalink:"/disable-firmware-ota"},next:{title:"Hardware ID (Pro)",permalink:"/hardware-id"}},o={},c=[{value:"Disable Filesystem OTA:",id:"disable-filesystem-ota",level:4},{value:"Enable Filesystem OTA:",id:"enable-filesystem-ota",level:4},{value:"Get Filesystem OTA mode status:",id:"get-filesystem-ota-mode-status",level:4}],u={toc:c},p="wrapper";function m(e){let{components:t,...r}=e;return(0,a.kt)(p,(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("div",{className:"pro-label"},(0,a.kt)("i",null,(0,a.kt)("h4",{style:{fontWeight:"500",marginBottom:5}},"This feature is only available in ",(0,a.kt)("a",{target:"_blank",style:{color:"red"},href:"https://elegantota.pro"},"ElegantOTA Pro"),"."))),(0,a.kt)("br",null),(0,a.kt)("br",null),(0,a.kt)("img",{src:"/v3/img/ota-modes.png",alt:"Modes",width:"400px"}),(0,a.kt)("br",null),(0,a.kt)("br",null),(0,a.kt)("p",null,"ElegantOTA allows you to selective enable or disable OTA modes of your choice for security reasons or when you have a important task running where you don't want it to get interrupted by an OTA update. This will be represented in the portal (ElegantOTA webpage) too."),(0,a.kt)("p",null,"Using these functions you can enable or disable filesystem updates ( SPIFFS or LittleFS )."),(0,a.kt)("h4",{id:"disable-filesystem-ota"},"Disable Filesystem OTA:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-cpp"},"// Pass 'false' to disable Filesystem mode\nElegantOTA.setFilesystemMode(true);\n")),(0,a.kt)("h4",{id:"enable-filesystem-ota"},"Enable Filesystem OTA:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-cpp"},"// Pass 'true' to enable Filesystem mode\nElegantOTA.setFilesystemMode(false);\n")),(0,a.kt)("h4",{id:"get-filesystem-ota-mode-status"},"Get Filesystem OTA mode status:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-cpp"},'// You can use this logic inside a function if neccessary\nif(ElegantOTA.checkFilesystemMode() == true) {\n Serial.println("Filesystem mode is enabled");\n} else {\n Serial.println("Filesystem mode is disabled");\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ff93640d.fe1f3c0e.js b/assets/js/ff93640d.fe1f3c0e.js deleted file mode 100644 index cc58d17..0000000 --- a/assets/js/ff93640d.fe1f3c0e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkelegantota_docs=self.webpackChunkelegantota_docs||[]).push([[816],{3905:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>y});var a=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function s(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var o=a.createContext({}),c=function(e){var t=a.useContext(o),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},u=function(e){var t=c(e.components);return a.createElement(o.Provider,{value:t},e.children)},p="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,l=e.originalType,o=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(r),d=n,y=p["".concat(o,".").concat(d)]||p[d]||m[d]||l;return r?a.createElement(y,s(s({ref:t},u),{},{components:r})):a.createElement(y,s({ref:t},u))}));function y(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=r.length,s=new Array(l);s[0]=d;var i={};for(var o in t)hasOwnProperty.call(t,o)&&(i[o]=t[o]);i.originalType=e,i[p]="string"==typeof e?e:n,s[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>o,contentTitle:()=>s,default:()=>m,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var a=r(7462),n=(r(7294),r(3905));const l={title:"Disable Filesystem OTA",sidebar_label:"Disable Filesystem OTA (Pro)",sidebar_position:9},s=void 0,i={unversionedId:"disable-filesystem-ota",id:"disable-filesystem-ota",title:"Disable Filesystem OTA",description:"This feature is only available in ElegantOTA Pro.",source:"@site/docs/disable-filesystem-ota.md",sourceDirName:".",slug:"/disable-filesystem-ota",permalink:"/disable-filesystem-ota",draft:!1,tags:[],version:"current",sidebarPosition:9,frontMatter:{title:"Disable Filesystem OTA",sidebar_label:"Disable Filesystem OTA (Pro)",sidebar_position:9},sidebar:"tutorialSidebar",previous:{title:"Disable Firmware OTA (Pro)",permalink:"/disable-firmware-ota"},next:{title:"Hardware ID (Pro)",permalink:"/hardware-id"}},o={},c=[{value:"Disable Filesystem OTA:",id:"disable-filesystem-ota",level:4},{value:"Enable Filesystem OTA:",id:"enable-filesystem-ota",level:4},{value:"Get Filesystem OTA mode status:",id:"get-filesystem-ota-mode-status",level:4}],u={toc:c},p="wrapper";function m(e){let{components:t,...r}=e;return(0,n.kt)(p,(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("div",{className:"pro-label"},(0,n.kt)("i",null,(0,n.kt)("h4",{style:{fontWeight:"500",marginBottom:5}},"This feature is only available in ",(0,n.kt)("a",{target:"_blank",style:{color:"red"},href:"https://elegantota.pro"},"ElegantOTA Pro"),"."))),(0,n.kt)("br",null),(0,n.kt)("br",null),(0,n.kt)("p",null,"ElegantOTA allows you to selective enable or disable OTA modes of your choice for security reasons or when you have a important task running where you don't want it to get interrupted by an OTA update. This will be represented in the portal (ElegantOTA webpage) too."),(0,n.kt)("p",null,"Using these functions you can enable or disable filesystem updates ( SPIFFS or LittleFS )."),(0,n.kt)("h4",{id:"disable-filesystem-ota"},"Disable Filesystem OTA:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-cpp"},"// Pass 'false' to disable Filesystem mode\nElegantOTA.setFilesystemMode(true);\n")),(0,n.kt)("h4",{id:"enable-filesystem-ota"},"Enable Filesystem OTA:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-cpp"},"// Pass 'true' to enable Filesystem mode\nElegantOTA.setFilesystemMode(false);\n")),(0,n.kt)("h4",{id:"get-filesystem-ota-mode-status"},"Get Filesystem OTA mode status:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-cpp"},'// You can use this logic inside a function if neccessary\nif(ElegantOTA.checkFilesystemMode() == true) {\n Serial.println("Filesystem mode is enabled");\n} else {\n Serial.println("Filesystem mode is disabled");\n}\n')))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.efaa5c73.js b/assets/js/runtime~main.a07c38c1.js similarity index 78% rename from assets/js/runtime~main.efaa5c73.js rename to assets/js/runtime~main.a07c38c1.js index 2d9abb6..860caa6 100644 --- a/assets/js/runtime~main.efaa5c73.js +++ b/assets/js/runtime~main.a07c38c1.js @@ -1 +1 @@ -(()=>{"use strict";var e,t,r,a,o,n={},d={};function f(e){var t=d[e];if(void 0!==t)return t.exports;var r=d[e]={id:e,loaded:!1,exports:{}};return n[e].call(r.exports,r,r.exports,f),r.loaded=!0,r.exports}f.m=n,f.c=d,e=[],f.O=(t,r,a,o)=>{if(!r){var n=1/0;for(l=0;l=o)&&Object.keys(f.O).every((e=>f.O[e](r[i])))?r.splice(i--,1):(d=!1,o0&&e[l-1][2]>o;l--)e[l]=e[l-1];e[l]=[r,a,o]},f.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return f.d(t,{a:t}),t},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,f.t=function(e,a){if(1&a&&(e=this(e)),8&a)return e;if("object"==typeof e&&e){if(4&a&&e.__esModule)return e;if(16&a&&"function"==typeof e.then)return e}var o=Object.create(null);f.r(o);var n={};t=t||[null,r({}),r([]),r(r)];for(var d=2&a&&e;"object"==typeof d&&!~t.indexOf(d);d=r(d))Object.getOwnPropertyNames(d).forEach((t=>n[t]=()=>e[t]));return n.default=()=>e,f.d(o,n),o},f.d=(e,t)=>{for(var r in t)f.o(t,r)&&!f.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},f.f={},f.e=e=>Promise.all(Object.keys(f.f).reduce(((t,r)=>(f.f[r](e,t),t)),[])),f.u=e=>"assets/js/"+({30:"09d5ad39",53:"935f2afb",162:"d589d3a7",168:"625b1ed7",217:"3b8c55ea",361:"4d37f007",514:"1be78505",611:"a81a9ba7",671:"0e384e19",739:"3865d09d",757:"35754347",784:"eb3cd3e5",816:"ff93640d",818:"a5ec7539",861:"64b0ce6a",918:"17896441",924:"21834f87",989:"f39b3a0b"}[e]||e)+"."+{30:"52178145",53:"91aff0ff",162:"2a0fd2d0",168:"d67efd92",202:"f5b878aa",217:"de5cc3a2",361:"67463489",514:"5303ed6d",611:"3efe1b70",671:"ab487a62",739:"f3bb47dd",757:"da2b4274",784:"86988d4d",816:"fe1f3c0e",818:"f1917fc6",861:"3edddec3",918:"a019dfd7",924:"6e87f8a0",972:"aacabf51",989:"22bd28d3"}[e]+".js",f.miniCssF=e=>{},f.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),f.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a={},o="elegantota-docs:",f.l=(e,t,r,n)=>{if(a[e])a[e].push(t);else{var d,i;if(void 0!==r)for(var c=document.getElementsByTagName("script"),l=0;l{d.onerror=d.onload=null,clearTimeout(s);var o=a[e];if(delete a[e],d.parentNode&&d.parentNode.removeChild(d),o&&o.forEach((e=>e(r))),t)return t(r)},s=setTimeout(b.bind(null,void 0,{type:"timeout",target:d}),12e4);d.onerror=b.bind(null,d.onerror),d.onload=b.bind(null,d.onload),i&&document.head.appendChild(d)}},f.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.p="/",f.gca=function(e){return e={17896441:"918",35754347:"757","09d5ad39":"30","935f2afb":"53",d589d3a7:"162","625b1ed7":"168","3b8c55ea":"217","4d37f007":"361","1be78505":"514",a81a9ba7:"611","0e384e19":"671","3865d09d":"739",eb3cd3e5:"784",ff93640d:"816",a5ec7539:"818","64b0ce6a":"861","21834f87":"924",f39b3a0b:"989"}[e]||e,f.p+f.u(e)},(()=>{var e={303:0,532:0};f.f.j=(t,r)=>{var a=f.o(e,t)?e[t]:void 0;if(0!==a)if(a)r.push(a[2]);else if(/^(303|532)$/.test(t))e[t]=0;else{var o=new Promise(((r,o)=>a=e[t]=[r,o]));r.push(a[2]=o);var n=f.p+f.u(t),d=new Error;f.l(n,(r=>{if(f.o(e,t)&&(0!==(a=e[t])&&(e[t]=void 0),a)){var o=r&&("load"===r.type?"missing":r.type),n=r&&r.target&&r.target.src;d.message="Loading chunk "+t+" failed.\n("+o+": "+n+")",d.name="ChunkLoadError",d.type=o,d.request=n,a[1](d)}}),"chunk-"+t,t)}},f.O.j=t=>0===e[t];var t=(t,r)=>{var a,o,n=r[0],d=r[1],i=r[2],c=0;if(n.some((t=>0!==e[t]))){for(a in d)f.o(d,a)&&(f.m[a]=d[a]);if(i)var l=i(f)}for(t&&t(r);c{"use strict";var e,t,r,a,o,n={},d={};function f(e){var t=d[e];if(void 0!==t)return t.exports;var r=d[e]={id:e,loaded:!1,exports:{}};return n[e].call(r.exports,r,r.exports,f),r.loaded=!0,r.exports}f.m=n,f.c=d,e=[],f.O=(t,r,a,o)=>{if(!r){var n=1/0;for(l=0;l=o)&&Object.keys(f.O).every((e=>f.O[e](r[c])))?r.splice(c--,1):(d=!1,o0&&e[l-1][2]>o;l--)e[l]=e[l-1];e[l]=[r,a,o]},f.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return f.d(t,{a:t}),t},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,f.t=function(e,a){if(1&a&&(e=this(e)),8&a)return e;if("object"==typeof e&&e){if(4&a&&e.__esModule)return e;if(16&a&&"function"==typeof e.then)return e}var o=Object.create(null);f.r(o);var n={};t=t||[null,r({}),r([]),r(r)];for(var d=2&a&&e;"object"==typeof d&&!~t.indexOf(d);d=r(d))Object.getOwnPropertyNames(d).forEach((t=>n[t]=()=>e[t]));return n.default=()=>e,f.d(o,n),o},f.d=(e,t)=>{for(var r in t)f.o(t,r)&&!f.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},f.f={},f.e=e=>Promise.all(Object.keys(f.f).reduce(((t,r)=>(f.f[r](e,t),t)),[])),f.u=e=>"assets/js/"+({30:"09d5ad39",53:"935f2afb",162:"d589d3a7",168:"625b1ed7",217:"3b8c55ea",361:"4d37f007",514:"1be78505",611:"a81a9ba7",671:"0e384e19",739:"3865d09d",757:"35754347",784:"eb3cd3e5",816:"ff93640d",818:"a5ec7539",861:"64b0ce6a",918:"17896441",924:"21834f87",989:"f39b3a0b"}[e]||e)+"."+{30:"52178145",53:"91aff0ff",162:"2a0fd2d0",168:"d67efd92",202:"f5b878aa",217:"de5cc3a2",361:"67463489",514:"5303ed6d",611:"3efe1b70",671:"ab487a62",739:"68864eb6",757:"da2b4274",784:"ca8ae6dd",816:"190f2c21",818:"d8c77f85",861:"c832846e",918:"a019dfd7",924:"6e87f8a0",972:"aacabf51",989:"f455d83e"}[e]+".js",f.miniCssF=e=>{},f.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),f.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a={},o="elegantota-docs:",f.l=(e,t,r,n)=>{if(a[e])a[e].push(t);else{var d,c;if(void 0!==r)for(var i=document.getElementsByTagName("script"),l=0;l{d.onerror=d.onload=null,clearTimeout(s);var o=a[e];if(delete a[e],d.parentNode&&d.parentNode.removeChild(d),o&&o.forEach((e=>e(r))),t)return t(r)},s=setTimeout(b.bind(null,void 0,{type:"timeout",target:d}),12e4);d.onerror=b.bind(null,d.onerror),d.onload=b.bind(null,d.onload),c&&document.head.appendChild(d)}},f.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.p="/",f.gca=function(e){return e={17896441:"918",35754347:"757","09d5ad39":"30","935f2afb":"53",d589d3a7:"162","625b1ed7":"168","3b8c55ea":"217","4d37f007":"361","1be78505":"514",a81a9ba7:"611","0e384e19":"671","3865d09d":"739",eb3cd3e5:"784",ff93640d:"816",a5ec7539:"818","64b0ce6a":"861","21834f87":"924",f39b3a0b:"989"}[e]||e,f.p+f.u(e)},(()=>{var e={303:0,532:0};f.f.j=(t,r)=>{var a=f.o(e,t)?e[t]:void 0;if(0!==a)if(a)r.push(a[2]);else if(/^(303|532)$/.test(t))e[t]=0;else{var o=new Promise(((r,o)=>a=e[t]=[r,o]));r.push(a[2]=o);var n=f.p+f.u(t),d=new Error;f.l(n,(r=>{if(f.o(e,t)&&(0!==(a=e[t])&&(e[t]=void 0),a)){var o=r&&("load"===r.type?"missing":r.type),n=r&&r.target&&r.target.src;d.message="Loading chunk "+t+" failed.\n("+o+": "+n+")",d.name="ChunkLoadError",d.type=o,d.request=n,a[1](d)}}),"chunk-"+t,t)}},f.O.j=t=>0===e[t];var t=(t,r)=>{var a,o,n=r[0],d=r[1],c=r[2],i=0;if(n.some((t=>0!==e[t]))){for(a in d)f.o(d,a)&&(f.m[a]=d[a]);if(c)var l=c(f)}for(t&&t(r);i - +

Async Mode

Introduction

One of the features of ElegantOTA is the async mode, which provides asynchronous web server functionality for handling OTA updates. This mode should only be enabled if you are using ESPAsyncWebServer library in your project/firmware.

Enabling Async Mode

To enable async mode for ElegantOTA, follow these steps:

  1. Locate the ELEGANTOTA_USE_ASYNC_WEBSERVER macro in the ElegantOTA.h file, and set it to 1:

    #define ELEGANTOTA_USE_ASYNC_WEBSERVER 1
  2. Save the changes to the ElegantOTA.h file.

  3. You are now ready to use ElegantOTA in async mode for your OTA updates, utilizing the ESPAsyncWebServer library.

Benefits of Async Mode

Enabling async mode for ElegantOTA offers several advantages:

  1. Non-blocking Operation: In async mode, ElegantOTA leverages the asynchronous web server capabilities of ESPAsyncWebServer. This means that OTA updates won't block your device's main loop. It allows your device to continue executing other tasks while handling OTA updates in the background.

  2. Improved Responsiveness: Your device can remain responsive to user interactions or other processes during OTA updates, ensuring a smoother user experience.

- + \ No newline at end of file diff --git a/authentication/index.html b/authentication/index.html index 997a60c..ae1d0c7 100644 --- a/authentication/index.html +++ b/authentication/index.html @@ -7,13 +7,13 @@ - +

Authentication

Introduction

The Authentication feature in ElegantOTA enhances the security of your Internet of Things (IoT) devices by requiring authentication before allowing firmware updates or configuration changes. This feature ensures that only authorized individuals or systems can access and modify your devices, adding an extra layer of protection to your IoT ecosystem.

Setting Authentication

You can set up authentication for your device using the ElegantOTA.setAuth("username", "password"); function. This function requires two parameters: a username and a password. These credentials act as a gatekeeper, preventing unauthorized access to the device's OTA (Over-The-Air) update and configuration interfaces.

Example Usage

#include <ElegantOTA.h>

void setup() {
// Initialize your hardware and other configurations here

// Set Authentication Credentials
ElegantOTA.setAuth("myUsername", "myPassword");

// Additional setup code
}

void loop() {
// Your main loop code here
}

In the above example, the ElegantOTA.setAuth("myUsername", "myPassword"); function call sets the username to "myUsername" and the password to "myPassword" for device authentication.

Clearing Authentication

Authentication once set can also be cleared by calling:

ElegantOTA.clearAuth();

Use Cases

The Authentication feature is crucial in various scenarios:

  1. Security: It safeguards your IoT devices against unauthorized access, reducing the risk of malicious updates or configuration changes.

  2. Access Control: By setting unique credentials for each device, you can control access to individual devices, ensuring that only authorized personnel or systems can modify them.

  3. Compliance: Some security and compliance standards require authentication mechanisms for IoT devices. ElegantOTA's Authentication feature helps you meet these requirements.

Best Practices

To ensure the effectiveness of the Authentication feature, consider these best practices:

  • Choose strong and unique usernames and passwords for each device.

  • Avoid using default or easily guessable credentials to enhance security.

  • Keep the credentials in a secure location and avoid hardcoding them directly into your code to prevent accidental exposure.

  • Regularly update and rotate the authentication credentials to maintain security.

  • Test the authentication setup thoroughly to ensure that only authorized users can access the device.

- + \ No newline at end of file diff --git a/branding/index.html b/branding/index.html index 023a453..2c5acd6 100644 --- a/branding/index.html +++ b/branding/index.html @@ -7,13 +7,13 @@ - +
-

Branding

This feature is only available in ElegantOTA Pro.



Overview

Branding in this context refers to the custom logo that is displayed on the ElegantOTA portal during the OTA update process. You can customize the logo by defining the logo image as a byte array in the logo.h and logo.cpp files of the library's source code.

To add your custom logo on the ElegantOTA portal, follow these steps:

First, you need to create or obtain the logo image you want to display on the ElegantOTA portal during OTA updates. Ensure that the logo image is in a suitable format, such as a SVG (recommended) / PNG or JPG file and make sure your image is optimized & small in file size.

Step 2: Convert Logo Image to a Byte Array

To include the logo in your library, you'll need to convert the image into a byte array.

  1. Go to File2Raw utility ( I created this utility a few years back for the purpose of converting files into byte array for C++ applications ).
  2. Select your logo.
  3. Select "Gzip Compress" & "Use PROGMEM (Arduino)".
  4. Click "Convert".

Step 3: Modify logo.h

  1. Open the logo.h file in your ElegantOTA library source code.

  2. Locate the ELEGANTOTA_LOGO byte array declaration, which should look like this:

    extern const uint8_t ELEGANTOTA_LOGO[];
  3. Replace the length of the ELEGANTOTA_LOGO array with your custom logo's byte array length.

  4. Locate the ELEGANTOTA_LOGO_MIME variable, which defines the MIME type of your logo image. By default, it is set to image/png. If your logo is in a different format (e.g., JPEG), update the ELEGANTOTA_LOGO_MIME variable to the appropriate MIME type.

  5. Set ELEGANTOTA_LOGO_WIDTH & ELEGANTOTA_LOGO_HEIGHT according to your desired size which will be displayed on the webpage.

Step 4: Modify logo.cpp

  1. Open the logo.cpp file in your ElegantOTA library source code.

  2. Replace the contents of the ELEGANTOTA_LOGO array with your custom logo's byte array generated in File2Raw utility.

Step 5: Upload the Modified Library

After making these changes, compile and upload the modified ElegantOTA library to your device.

Once you have uploaded the modified ElegantOTA library to your device, the custom logo will be displayed on the ElegantOTA Portal webpage during OTA updates.

That's it! You have successfully added custom branding to the ElegantOTA portal by defining the logo as a byte array in the logo.h and logo.cpp files. Your logo will now be displayed on the ElegantOTA portal.

Please note that branding, including logos and images, may be subject to copyright and trademark laws. Ensure you have the necessary rights or permissions to use any branding elements in your project.

- +

Branding

This feature is only available in ElegantOTA Pro.



Branding

Overview

Branding in this context refers to the custom logo that is displayed on the ElegantOTA portal during the OTA update process. You can customize the logo by defining the logo image as a byte array in the logo.h and logo.cpp files of the library's source code.

To add your custom logo on the ElegantOTA portal, follow these steps:

First, you need to create or obtain the logo image you want to display on the ElegantOTA portal during OTA updates. Ensure that the logo image is in a suitable format, such as a SVG (recommended) / PNG or JPG file and make sure your image is optimized & small in file size.

Step 2: Convert Logo Image to a Byte Array

To include the logo in your library, you'll need to convert the image into a byte array.

  1. Go to File2Raw utility ( I created this utility a few years back for the purpose of converting files into byte array for C++ applications ).
  2. Select your logo.
  3. Select "Gzip Compress" & "Use PROGMEM (Arduino)".
  4. Click "Convert".

Step 3: Modify logo.h

  1. Open the logo.h file in your ElegantOTA library source code.

  2. Locate the ELEGANTOTA_LOGO byte array declaration, which should look like this:

    extern const uint8_t ELEGANTOTA_LOGO[];
  3. Replace the length of the ELEGANTOTA_LOGO array with your custom logo's byte array length.

  4. Locate the ELEGANTOTA_LOGO_MIME variable, which defines the MIME type of your logo image. By default, it is set to image/png. If your logo is in a different format (e.g., JPEG), update the ELEGANTOTA_LOGO_MIME variable to the appropriate MIME type.

  5. Set ELEGANTOTA_LOGO_WIDTH & ELEGANTOTA_LOGO_HEIGHT according to your desired size which will be displayed on the webpage.

Step 4: Modify logo.cpp

  1. Open the logo.cpp file in your ElegantOTA library source code.

  2. Replace the contents of the ELEGANTOTA_LOGO array with your custom logo's byte array generated in File2Raw utility.

Step 5: Upload the Modified Library

After making these changes, compile and upload the modified ElegantOTA library to your device.

Once you have uploaded the modified ElegantOTA library to your device, the custom logo will be displayed on the ElegantOTA Portal webpage during OTA updates.

That's it! You have successfully added custom branding to the ElegantOTA portal by defining the logo as a byte array in the logo.h and logo.cpp files. Your logo will now be displayed on the ElegantOTA portal.

Please note that branding, including logos and images, may be subject to copyright and trademark laws. Ensure you have the necessary rights or permissions to use any branding elements in your project.

+ \ No newline at end of file diff --git a/callbacks/index.html b/callbacks/index.html index 8d7484e..65affcf 100644 --- a/callbacks/index.html +++ b/callbacks/index.html @@ -7,13 +7,13 @@ - +

Callbacks

Overview

The ElegantOTA library offers three callbacks that allow you to customize the behavior of your OTA update process. These callbacks enable you to execute specific functions at different stages of the update process, giving you control over the update flow. Here are the available callbacks:

  1. void onStart(void callable(void));
  2. void onProgress(void callable(size_t current, size_t final));
  3. void onEnd(void callable(bool success));

Let's delve into the details of each callback and how to use them effectively.

1. onStart Callback

The onStart callback is triggered when the OTA update process begins. It's a convenient way to perform any setup or initialization tasks before the update process starts. You can use this callback to prepare your device for the update, such as saving important data, configuring pins, or setting up any required resources.

Example:

ElegantOTA.onStart([]() {
Serial.println("OTA update process started.");
// Add your initialization tasks here.
});

2. onProgress Callback

The onProgress callback is called periodically during the OTA update to provide information about the progress of the update. It's useful for tracking the percentage of completion or displaying progress information to the user. This callback passes two parameters: current (the number of bytes transferred so far) and final (the total number of bytes to be transferred).

Note: onProgress callback can be called very frequently while the update is getting downloaded. It's neccessary to defer any tasks or logging so that core is not overloaded. Please refer to 'demo' example where progress is logged after every second.

Example:

ElegantOTA.onProgress([](size_t current, size_t final) {
Serial.printf("Progress: %u%%\n", (current * 100) / final);
});

3. onEnd Callback

The onEnd callback is invoked when the OTA update process completes, whether it succeeds or fails. It passes a boolean parameter success indicating the outcome of the update. You can use this callback to perform cleanup tasks or take action based on whether the update was successful or not.

Example:

ElegantOTA.onEnd([](bool success) {
if (success) {
Serial.println("OTA update completed successfully.");
// Add success handling here.
} else {
Serial.println("OTA update failed.");
// Add failure handling here.
}
});
- + \ No newline at end of file diff --git a/commercial-license/index.html b/commercial-license/index.html index 9494bd6..23b67fe 100644 --- a/commercial-license/index.html +++ b/commercial-license/index.html @@ -7,13 +7,13 @@ - +

Commercial License

ElegantOTA Lite (open-source version) and ElegantOTA Pro are two different versions of the same OTA (Over-The-Air) update library, each with its own set of features and licensing terms. Here's a comparison between ElegantOTA Lite, which is open-source and AGPL-3.0 based, and ElegantOTA Pro:

  1. Licensing:

    • ElegantOTA Lite: This version is open-source and released under the AGPL-3.0 license. It means that it's freely available for anyone to use, modify, and distribute. However, if you use ElegantOTA Lite in a commercial product, the AGPL-3.0 license requires you to make the source code of your product, including any modifications to ElegantOTA Lite, available to the public.

    • ElegantOTA Pro: This version is offered under a one-time charge for a commercial license. It allows you to use ElegantOTA Pro in a commercial product without the requirement to open-source your proprietary code. The commercial license provides more flexibility and protection for businesses.

  2. Support:

    • ElegantOTA Lite: Support for ElegantOTA Lite is typically community-driven. You may find help through online forums, documentation, or user-contributed resources. However, professional support may be limited.

    • ElegantOTA Pro: ElegantOTA Pro includes dedicated support and assistance. This can be essential for businesses that require timely and reliable support to ensure their OTA update process runs smoothly.

In summary, the choice between ElegantOTA Lite and ElegantOTA Pro depends on your specific needs and the nature of your project:

  • If you are working on an open-source project or have no concerns about the AGPL-3.0 license's requirements and need basic OTA update functionality, ElegantOTA Lite is a viable choice.

  • If you are developing a commercial product, ElegantOTA Pro provides a more comprehensive and professionally supported solution while allowing you to maintain the proprietary nature of your code. However, it comes with a one-time commercial licensing fee.

You can get ElegantOTA Pro via the official product page at: https://elegantota.pro

- + \ No newline at end of file diff --git a/custom-title/index.html b/custom-title/index.html index 6b389ac..62ebd48 100644 --- a/custom-title/index.html +++ b/custom-title/index.html @@ -7,13 +7,13 @@ - +
-

Custom Title

This feature is only available in ElegantOTA Pro.

Overview

The setTitle() function is a method provided by the ElegantOTA Pro library. It is used to set the title of the OTA (Over-The-Air) update portal. This title is displayed at the top of the update portal web page, providing a user-friendly and customizable interface for managing firmware updates.

Syntax

void setTitle(const char* title);

Example

#include <ElegantOTA.h>

void setup() {
// Initialize the ElegantOTA library
ElegantOTA.begin();

// Set the title of the OTA update portal
ElegantOTA.setTitle("OTA Update - XYZ Inc");
}

void loop() {
// Your main program loop
}

Usage

  1. Include the ElegantOTA library in your Arduino sketch.
  2. In the setup() function of your sketch, initialize the ElegantOTA library using ElegantOTA.begin().
  3. Use the setTitle() function to set a meaningful title for your OTA update portal. This title will be displayed at the top of the update portal web page when users access it.
  4. Continue with the rest of your sketch's setup and loop functions.
- +

Custom Title

This feature is only available in ElegantOTA Pro.


Custom Title

Overview

The setTitle() function is a method provided by the ElegantOTA Pro library. It is used to set the title of the OTA (Over-The-Air) update portal. This title is displayed at the top of the update portal web page, providing a user-friendly and customizable interface for managing firmware updates.

Syntax

void setTitle(const char* title);

Example

#include <ElegantOTA.h>

void setup() {
// Initialize the ElegantOTA library
ElegantOTA.begin();

// Set the title of the OTA update portal
ElegantOTA.setTitle("OTA Update - XYZ Inc");
}

void loop() {
// Your main program loop
}

Usage

  1. Include the ElegantOTA library in your Arduino sketch.
  2. In the setup() function of your sketch, initialize the ElegantOTA library using ElegantOTA.begin().
  3. Use the setTitle() function to set a meaningful title for your OTA update portal. This title will be displayed at the top of the update portal web page when users access it.
  4. Continue with the rest of your sketch's setup and loop functions.
+ \ No newline at end of file diff --git a/disable-filesystem-ota/index.html b/disable-filesystem-ota/index.html index 265aeab..837578a 100644 --- a/disable-filesystem-ota/index.html +++ b/disable-filesystem-ota/index.html @@ -7,13 +7,13 @@ - +
-

Disable Filesystem OTA

This feature is only available in ElegantOTA Pro.



ElegantOTA allows you to selective enable or disable OTA modes of your choice for security reasons or when you have a important task running where you don't want it to get interrupted by an OTA update. This will be represented in the portal (ElegantOTA webpage) too.

Using these functions you can enable or disable filesystem updates ( SPIFFS or LittleFS ).

Disable Filesystem OTA:

// Pass 'false' to disable Filesystem mode
ElegantOTA.setFilesystemMode(true);

Enable Filesystem OTA:

// Pass 'true' to enable Filesystem mode
ElegantOTA.setFilesystemMode(false);

Get Filesystem OTA mode status:

// You can use this logic inside a function if neccessary
if(ElegantOTA.checkFilesystemMode() == true) {
Serial.println("Filesystem mode is enabled");
} else {
Serial.println("Filesystem mode is disabled");
}
- +

Disable Filesystem OTA

This feature is only available in ElegantOTA Pro.



Modes

ElegantOTA allows you to selective enable or disable OTA modes of your choice for security reasons or when you have a important task running where you don't want it to get interrupted by an OTA update. This will be represented in the portal (ElegantOTA webpage) too.

Using these functions you can enable or disable filesystem updates ( SPIFFS or LittleFS ).

Disable Filesystem OTA:

// Pass 'false' to disable Filesystem mode
ElegantOTA.setFilesystemMode(true);

Enable Filesystem OTA:

// Pass 'true' to enable Filesystem mode
ElegantOTA.setFilesystemMode(false);

Get Filesystem OTA mode status:

// You can use this logic inside a function if neccessary
if(ElegantOTA.checkFilesystemMode() == true) {
Serial.println("Filesystem mode is enabled");
} else {
Serial.println("Filesystem mode is disabled");
}
+ \ No newline at end of file diff --git a/disable-firmware-ota/index.html b/disable-firmware-ota/index.html index e0abba6..b27e5b0 100644 --- a/disable-firmware-ota/index.html +++ b/disable-firmware-ota/index.html @@ -7,13 +7,13 @@ - +
-

Disable Firmware OTA

This feature is only available in ElegantOTA Pro.



ElegantOTA allows you to selective enable or disable OTA modes of your choice for security reasons or when you have a important task running where you don't want it to get interrupted by an OTA update. This will be represented in the portal (ElegantOTA webpage) too.

This function should be used very carefully as it blocks firmware update! If by mistake this is left disabled, your device will not be recoverable by an OTA update.

Disable Firmware OTA:

// Pass 'false' to disable Firmware mode
ElegantOTA.setFirmwareMode(false);

Enable Firmware OTA:

// Pass 'true' to enable Firmware mode
ElegantOTA.setFirmwareMode(true);

Get Firmware OTA mode status:

// You can use this logic inside a function if neccessary
if(ElegantOTA.checkFirmwareMode() == true) {
Serial.println("Firmware mode is enabled");
} else {
Serial.println("Firmware mode is disabled");
}
- +

Disable Firmware OTA

This feature is only available in ElegantOTA Pro.



Modes

ElegantOTA allows you to selective enable or disable OTA modes of your choice for security reasons or when you have a important task running where you don't want it to get interrupted by an OTA update. This will be represented in the portal (ElegantOTA webpage) too.

This function should be used very carefully as it blocks firmware update! If by mistake this is left disabled, your device will not be recoverable by an OTA update.

Disable Firmware OTA:

// Pass 'false' to disable Firmware mode
ElegantOTA.setFirmwareMode(false);

Enable Firmware OTA:

// Pass 'true' to enable Firmware mode
ElegantOTA.setFirmwareMode(true);

Get Firmware OTA mode status:

// You can use this logic inside a function if neccessary
if(ElegantOTA.checkFirmwareMode() == true) {
Serial.println("Firmware mode is enabled");
} else {
Serial.println("Firmware mode is disabled");
}
+ \ No newline at end of file diff --git a/examples/index.html b/examples/index.html index 021908e..5124812 100644 --- a/examples/index.html +++ b/examples/index.html @@ -7,13 +7,13 @@ - +

Examples

ElegantOTA repository comes with Demo and AsyncDemo examples.

Demo Example

Demo example is for people who are using the inbuilt webserver of their platform. This is meant to run without any dependencies.

Async Demo Example

Async demo example utilizes AsyncWebServer which has significant performance gains. Only use this example as reference when your project is using AsyncWebServer. Know more about this in "Async Mode" documentation.

You can find those examples in the ElegantOTA repository.

- + \ No newline at end of file diff --git a/firmware-version/index.html b/firmware-version/index.html index 6fc5559..b19cebc 100644 --- a/firmware-version/index.html +++ b/firmware-version/index.html @@ -7,13 +7,13 @@ - +
-

Firmware Version

This feature is only available in ElegantOTA Pro.

Introduction

The Firmware Version feature in ElegantOTA allows you to specify and manage the version of the firmware running on your Internet of Things (IoT) devices. By setting a firmware version, you can easily track and control the software running on your devices, making it simpler to perform updates, monitor compatibility, and manage your IoT ecosystem effectively.

You can set the Firmware Version for your device using the ElegantOTA.setFWVersion("version"); function.

Example Usage:

#include <ElegantOTA.h>

void setup() {
// Initialize your hardware and other configurations here

// Set the Firmware Version
ElegantOTA.setFWVersion("v1.0.0");

// Additional setup code
}

void loop() {
// Your main loop code here
}

In the above example, the ElegantOTA.setFWVersion("v1.0.0"); function call assigns the firmware version "v1.0.0" to the device.

Use Cases

The Firmware Version feature can be beneficial in various scenarios:

  1. Firmware Updates: When new firmware versions become available, the Firmware Version identifier helps you check if an update is necessary. It also allows you to verify that devices have received the correct update.

  2. Compatibility: By knowing the firmware version of each device, you can ensure that all components of your IoT network are compatible. This is especially important when devices communicate or interact with each other.

  3. Historical Tracking: You can maintain a history of firmware versions installed on each device, which can be useful for troubleshooting issues or understanding the evolution of your firmware.

  4. Remote Diagnostics: When diagnosing issues remotely, having access to the firmware version can help you identify potential problems related to specific software releases.

Best Practices

To make the most of the Firmware Version feature, consider the following best practices:

  • Follow a consistent versioning scheme for your firmware, such as Semantic Versioning (SemVer), to ensure clarity and compatibility tracking.

  • Set the firmware version during the device's initialization phase, such as in the setup() function, to guarantee that it accurately reflects the installed firmware.

  • When updating firmware, always ensure that the new version is correctly set using ElegantOTA.setFWVersion() to maintain accurate version information.

- +

Firmware Version

This feature is only available in ElegantOTA Pro.



Firmware Version

Introduction

The Firmware Version feature in ElegantOTA allows you to specify and manage the version of the firmware running on your Internet of Things (IoT) devices. By setting a firmware version, you can easily track and control the software running on your devices, making it simpler to perform updates, monitor compatibility, and manage your IoT ecosystem effectively.

You can set the Firmware Version for your device using the ElegantOTA.setFWVersion("version"); function.

Example Usage:

#include <ElegantOTA.h>

void setup() {
// Initialize your hardware and other configurations here

// Set the Firmware Version
ElegantOTA.setFWVersion("1.0.0");

// Additional setup code
}

void loop() {
// Your main loop code here
}

In the above example, the ElegantOTA.setFWVersion("1.0.0"); function call assigns the firmware version "1.0.0" to the device.

Use Cases

The Firmware Version feature can be beneficial in various scenarios:

  1. Firmware Updates: When new firmware versions become available, the Firmware Version identifier helps you check if an update is necessary. It also allows you to verify that devices have received the correct update.

  2. Compatibility: By knowing the firmware version of each device, you can ensure that all components of your IoT network are compatible. This is especially important when devices communicate or interact with each other.

  3. Historical Tracking: You can maintain a history of firmware versions installed on each device, which can be useful for troubleshooting issues or understanding the evolution of your firmware.

  4. Remote Diagnostics: When diagnosing issues remotely, having access to the firmware version can help you identify potential problems related to specific software releases.

Best Practices

To make the most of the Firmware Version feature, consider the following best practices:

  • Follow a consistent versioning scheme for your firmware, such as Semantic Versioning (SemVer), to ensure clarity and compatibility tracking.

  • Set the firmware version during the device's initialization phase, such as in the setup() function, to guarantee that it accurately reflects the installed firmware.

  • When updating firmware, always ensure that the new version is correctly set using ElegantOTA.setFWVersion() to maintain accurate version information.

+ \ No newline at end of file diff --git a/getting-started/index.html b/getting-started/index.html index d238226..ea3cfba 100644 --- a/getting-started/index.html +++ b/getting-started/index.html @@ -7,13 +7,13 @@ - +

Getting Started

Getting started with ElegantOTA is pretty simple. This guide assumes that you already have a simple webserver code prepared and you just need to inject the following lines in your existing code:

Include Dependency

At the very beginning of sketch include the ElegantOTA library.

#include <ElegantOTA.h>

Add begin function

Now add the begin function of ElegantOTA in setup block of your sketch. This will inject ElegantOTA routes and logic into the web server.

ElegantOTA.begin(&server);

Add loop function

Last part is to call the loop function of ElegantOTA in loop block of your sketch. This loop block is necessary for ElegantOTA to handle reboot after OTA update.

ElegantOTA.loop();

Final Code

That's it! This is how a ready to use example will look like:

/*
-----------------------
ElegantOTA - Demo Example
-----------------------

Skill Level: Beginner

This example provides with a bare minimal app with ElegantOTA functionality.

Github: https://github.com/ayushsharma82/ElegantOTA
WiKi: https://docs.elegantota.pro

Works with both ESP8266 & ESP32

-------------------------------

Upgrade to ElegantOTA Pro: https://elegantota.pro

*/


#if defined(ESP8266)
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#elif defined(ESP32)
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#endif

#include <ElegantOTA.h>

const char* ssid = "........";
const char* password = "........";

#if defined(ESP8266)
ESP8266WebServer server(80);
#elif defined(ESP32)
WebServer server(80);
#endif

void setup(void) {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");

// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());

server.on("/", []() {
server.send(200, "text/plain", "Hi! This is ElegantOTA Demo.");
});

ElegantOTA.begin(&server); // Start ElegantOTA
server.begin();
Serial.println("HTTP server started");
}

void loop(void) {
server.handleClient();
ElegantOTA.loop();
}
- + \ No newline at end of file diff --git a/hardware-id/index.html b/hardware-id/index.html index b0d4c39..baaed50 100644 --- a/hardware-id/index.html +++ b/hardware-id/index.html @@ -7,13 +7,13 @@ - +
-

Hardware ID

This feature is only available in ElegantOTA Pro.

Introduction

The Hardware ID feature in ElegantOTA is shown on the ElegantOTA Pro portal. This ID should be a unique string that helps you easily identify the specific hardware device among others in your network.

Example Usage:

#include <ElegantOTA.h>

void setup() {
// Initialize your hardware and other configurations here

// Set the Hardware ID
ElegantOTA.setID("my_device_001");

// Additional setup code
}

void loop() {
// Your main loop code here
}

In the above example, the ElegantOTA.setID("my_device_001"); function call assigns the Hardware ID "my_device_001" to the device.

Best Practices

To make the most of the Hardware ID feature, consider the following best practices:

  • Choose a Hardware ID that is unique to each device to avoid conflicts.

  • Avoid using special characters or spaces in the Hardware ID, as these might cause issues when used in network communication or file naming.

  • Document and keep track of the Hardware IDs for all your devices to ensure proper management.

  • Ensure that the Hardware ID is set during the device's initialization phase, such as in the setup() function, to guarantee that it is properly configured before any network or communication activities.

- +

Hardware ID

This feature is only available in ElegantOTA Pro.



Hardware ID

Introduction

The Hardware ID feature in ElegantOTA is shown on the ElegantOTA Pro portal. This ID should be a unique string that helps you easily identify the specific hardware device among others in your network.

Example Usage:

#include <ElegantOTA.h>

void setup() {
// Initialize your hardware and other configurations here

// Set the Hardware ID
ElegantOTA.setID("my_device_001");

// Additional setup code
}

void loop() {
// Your main loop code here
}

In the above example, the ElegantOTA.setID("my_device_001"); function call assigns the Hardware ID "my_device_001" to the device.

Best Practices

To make the most of the Hardware ID feature, consider the following best practices:

  • Choose a Hardware ID that is unique to each device to avoid conflicts.

  • Avoid using special characters or spaces in the Hardware ID, as these might cause issues when used in network communication or file naming.

  • Document and keep track of the Hardware IDs for all your devices to ensure proper management.

  • Ensure that the Hardware ID is set during the device's initialization phase, such as in the setup() function, to guarantee that it is properly configured before any network or communication activities.

+ \ No newline at end of file diff --git a/index.html b/index.html index 5c2bb97..0c3c905 100644 --- a/index.html +++ b/index.html @@ -7,13 +7,13 @@ - +



   

ElegantOTA provides a beautiful user interface to upload over-the-air firmware/filesystem updates to your hardware with precise status and progress. ElegantOTA is designed to make the process of OTA updates slick and simple!

Note: This documentation serves both the versions of ElegantOTA ( Lite - Open Source and Pro ). Therefore, if you notice "(Pro)" mentioned on any of the features in the documentation, that means it is only available in ElegantOTA Pro.
- + \ No newline at end of file diff --git a/installation/index.html b/installation/index.html index 4ea087d..0e72f2b 100644 --- a/installation/index.html +++ b/installation/index.html @@ -7,13 +7,13 @@ - +

Installation

ElegantOTA requires no dependencies and runs out of the box with existing libraries provided in Arduino core. You can install ElegantOTA through one of the following methods:


1. Via Arduino IDE - Library Manager

Go to Sketch > Include Library > Library Manager > Search for "ElegantOTA" > Install


2. Manual Install

For Windows:
  • Download the Repository
  • Extract the .zip in Documents > Arduino > Libraries > {Place "ElegantOTA" folder Here}
For Linux:
  • Download the Repository
  • Extract the .zip in Sketchbook > Libraries > {Place "ElegantOTA" folder Here}

3. Import through Arduino IDE

  • Download the Repository
  • Go to Sketch > Include Library > Add .zip Library > Select the Downloaded .zip File.

- + \ No newline at end of file diff --git a/v3/img/branding.png b/v3/img/branding.png new file mode 100644 index 0000000..6359e74 Binary files /dev/null and b/v3/img/branding.png differ diff --git a/v3/img/custom-title.png b/v3/img/custom-title.png new file mode 100644 index 0000000..fe928db Binary files /dev/null and b/v3/img/custom-title.png differ diff --git a/v3/img/dropzone.png b/v3/img/dropzone.png new file mode 100644 index 0000000..9e9e973 Binary files /dev/null and b/v3/img/dropzone.png differ diff --git a/v3/img/firmware-version.png b/v3/img/firmware-version.png new file mode 100644 index 0000000..d710099 Binary files /dev/null and b/v3/img/firmware-version.png differ diff --git a/v3/img/hardware-id.png b/v3/img/hardware-id.png new file mode 100644 index 0000000..6c25c66 Binary files /dev/null and b/v3/img/hardware-id.png differ diff --git a/v3/img/ota-modes.png b/v3/img/ota-modes.png new file mode 100644 index 0000000..795c963 Binary files /dev/null and b/v3/img/ota-modes.png differ