[{"data":1,"prerenderedAt":1076},["ShallowReactive",2],{"\u002Fdocs\u002Fagents\u002Fesp32":3},{"id":4,"title":5,"body":6,"description":1068,"extension":1069,"meta":1070,"navigation":1071,"path":1072,"seo":1073,"stem":1074,"__hash__":1075},"docs\u002Fdocs\u002Fagents\u002Fesp32.md","ESP32 Agent",{"type":7,"value":8,"toc":1055},"minimark",[9,13,25,30,91,95,131,135,138,154,454,460,465,552,565,569,665,671,754,760,764,779,794,798,801,837,862,876,879,883,886,894,909,963,967,975,1019,1029,1033,1051],[10,11,5],"h1",{"id":12},"esp32-agent",[14,15,16,17,24],"p",{},"The ",[18,19,23],"a",{"href":20,"rel":21},"https:\u002F\u002Fgithub.com\u002FNetIgnite-project\u002FAgent-ESP32",[22],"nofollow","ESP32 agent"," turns an ESP32 development\nboard into a NetIgnite agent. It joins your WiFi, connects to the NetIgnite server, and sends\nWake-on-LAN packets and status pings to the devices in its network. The board draws little power,\nso it can stay on around the clock.",[26,27,29],"h2",{"id":28},"requirements","Requirements",[31,32,33,42,50,57,68,76],"ul",{},[34,35,36,37,41],"li",{},"An ESP32 development board supported by PlatformIO's ",[38,39,40],"code",{},"esp32dev"," target (the original ESP32).",[34,43,44,45,49],{},"A ",[46,47,48],"strong",{},"2.4 GHz"," WiFi network with WPA\u002FWPA2-Personal. The ESP32 doesn't support 5 GHz or\nWPA2-Enterprise.",[34,51,52,53,56],{},"The ESP32 must be in the ",[46,54,55],{},"same network and subnet"," as the devices it wakes. Wake-on-LAN\nbroadcasts and IPv6 link-local pings don't cross routers.",[34,58,59,60,63,64,67],{},"Outbound access from the ESP32 to the NetIgnite server, to DNS and to NTP (",[38,61,62],{},"pool.ntp.org",",\n",[38,65,66],{},"time.nist.gov",").",[34,69,70,75],{},[18,71,74],{"href":72,"rel":73},"https:\u002F\u002Fplatformio.org\u002F",[22],"PlatformIO",": the VS Code extension or PlatformIO Core (CLI).",[34,77,78,79,82,83,86,87,67],{},"An agent created in the dashboard. You need its ",[46,80,81],{},"Connection ID"," and ",[46,84,85],{},"Connection Secret","\n(see ",[18,88,90],{"href":89},"\u002Fdocs\u002Fguides\u002Fagents","Managing Agents",[26,92,94],{"id":93},"get-the-source","Get the source",[96,97,103],"pre",{"className":98,"code":99,"filename":100,"language":101,"meta":102,"style":102},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git clone https:\u002F\u002Fgithub.com\u002FNetIgnite-project\u002FAgent-ESP32.git\ncd Agent-ESP32\n","Terminal","bash","",[38,104,105,121],{"__ignoreMap":102},[106,107,110,114,118],"span",{"class":108,"line":109},"line",1,[106,111,113],{"class":112},"sBMFI","git",[106,115,117],{"class":116},"sfazB"," clone",[106,119,120],{"class":116}," https:\u002F\u002Fgithub.com\u002FNetIgnite-project\u002FAgent-ESP32.git\n",[106,122,124,128],{"class":108,"line":123},2,[106,125,127],{"class":126},"s2Zo4","cd",[106,129,130],{"class":116}," Agent-ESP32\n",[26,132,134],{"id":133},"configure","Configure",[14,136,137],{},"Settings are compiled into the firmware. Copy the sample config and edit it:",[96,139,141],{"className":98,"code":140,"filename":100,"language":101,"meta":102,"style":102},"cp src\u002Fconfig\u002Fconfig.sample.h src\u002Fconfig\u002Fconfig.h\n",[38,142,143],{"__ignoreMap":102},[106,144,145,148,151],{"class":108,"line":109},[106,146,147],{"class":112},"cp",[106,149,150],{"class":116}," src\u002Fconfig\u002Fconfig.sample.h",[106,152,153],{"class":116}," src\u002Fconfig\u002Fconfig.h\n",[96,155,160],{"className":156,"code":157,"filename":158,"language":159,"meta":102,"style":102},"language-cpp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","#define C_WIFI_SSID \"WIFI_SSID\"\n#define C_WIFI_PASSWORD \"WIFI_PASSWORD\"\n\n#define C_WIFI_LOCAL_IP IPAddress(192, 168, 1, 32)\n#define C_WIFI_GATEWAY_IP IPAddress(192, 168, 1, 1)\n#define C_WIFI_SUBNET_MASK IPAddress(255, 255, 255, 0)\n\n#define C_WIFI_PRIMARY_DNS IPAddress(1, 1, 1, 1)\n#define C_WIFI_SECONDARY_DNS IPAddress(1, 0, 0, 1)\n\n#define C_CONTROL_SERVER_HOST \"example.com\"\n#define C_CONTROL_SERVER_PORT (uint16_t) 80\n#define C_CONTROL_SERVER_USE_SSL (bool) false\n\n#define C_CONTROL_SERVER_AUTH_ID \"AUTH_ID\"\n#define C_CONTROL_SERVER_AUTH_SECRET \"AUTH_SECRET\"\n","config.h","cpp",[38,161,162,181,195,202,239,267,298,303,332,360,365,380,401,419,424,439],{"__ignoreMap":102},[106,163,164,168,171,175,178],{"class":108,"line":109},[106,165,167],{"class":166},"s7zQu","#define",[106,169,170],{"class":126}," C_WIFI_SSID",[106,172,174],{"class":173},"sMK4o"," \"",[106,176,177],{"class":116},"WIFI_SSID",[106,179,180],{"class":173},"\"\n",[106,182,183,185,188,190,193],{"class":108,"line":123},[106,184,167],{"class":166},[106,186,187],{"class":126}," C_WIFI_PASSWORD",[106,189,174],{"class":173},[106,191,192],{"class":116},"WIFI_PASSWORD",[106,194,180],{"class":173},[106,196,198],{"class":108,"line":197},3,[106,199,201],{"emptyLinePlaceholder":200},true,"\n",[106,203,205,207,210,213,216,220,223,226,228,231,233,236],{"class":108,"line":204},4,[106,206,167],{"class":166},[106,208,209],{"class":126}," C_WIFI_LOCAL_IP",[106,211,212],{"class":126}," IPAddress",[106,214,215],{"class":173},"(",[106,217,219],{"class":218},"sbssI","192",[106,221,222],{"class":173},",",[106,224,225],{"class":218}," 168",[106,227,222],{"class":173},[106,229,230],{"class":218}," 1",[106,232,222],{"class":173},[106,234,235],{"class":218}," 32",[106,237,238],{"class":173},")\n",[106,240,242,244,247,249,251,253,255,257,259,261,263,265],{"class":108,"line":241},5,[106,243,167],{"class":166},[106,245,246],{"class":126}," C_WIFI_GATEWAY_IP",[106,248,212],{"class":126},[106,250,215],{"class":173},[106,252,219],{"class":218},[106,254,222],{"class":173},[106,256,225],{"class":218},[106,258,222],{"class":173},[106,260,230],{"class":218},[106,262,222],{"class":173},[106,264,230],{"class":218},[106,266,238],{"class":173},[106,268,270,272,275,277,279,282,284,287,289,291,293,296],{"class":108,"line":269},6,[106,271,167],{"class":166},[106,273,274],{"class":126}," C_WIFI_SUBNET_MASK",[106,276,212],{"class":126},[106,278,215],{"class":173},[106,280,281],{"class":218},"255",[106,283,222],{"class":173},[106,285,286],{"class":218}," 255",[106,288,222],{"class":173},[106,290,286],{"class":218},[106,292,222],{"class":173},[106,294,295],{"class":218}," 0",[106,297,238],{"class":173},[106,299,301],{"class":108,"line":300},7,[106,302,201],{"emptyLinePlaceholder":200},[106,304,306,308,311,313,315,318,320,322,324,326,328,330],{"class":108,"line":305},8,[106,307,167],{"class":166},[106,309,310],{"class":126}," C_WIFI_PRIMARY_DNS",[106,312,212],{"class":126},[106,314,215],{"class":173},[106,316,317],{"class":218},"1",[106,319,222],{"class":173},[106,321,230],{"class":218},[106,323,222],{"class":173},[106,325,230],{"class":218},[106,327,222],{"class":173},[106,329,230],{"class":218},[106,331,238],{"class":173},[106,333,335,337,340,342,344,346,348,350,352,354,356,358],{"class":108,"line":334},9,[106,336,167],{"class":166},[106,338,339],{"class":126}," C_WIFI_SECONDARY_DNS",[106,341,212],{"class":126},[106,343,215],{"class":173},[106,345,317],{"class":218},[106,347,222],{"class":173},[106,349,295],{"class":218},[106,351,222],{"class":173},[106,353,295],{"class":218},[106,355,222],{"class":173},[106,357,230],{"class":218},[106,359,238],{"class":173},[106,361,363],{"class":108,"line":362},10,[106,364,201],{"emptyLinePlaceholder":200},[106,366,368,370,373,375,378],{"class":108,"line":367},11,[106,369,167],{"class":166},[106,371,372],{"class":126}," C_CONTROL_SERVER_HOST",[106,374,174],{"class":173},[106,376,377],{"class":116},"example.com",[106,379,180],{"class":173},[106,381,383,385,388,391,395,398],{"class":108,"line":382},12,[106,384,167],{"class":166},[106,386,387],{"class":126}," C_CONTROL_SERVER_PORT",[106,389,390],{"class":173}," (",[106,392,394],{"class":393},"sHdIc","uint16_t",[106,396,397],{"class":173},")",[106,399,400],{"class":218}," 80\n",[106,402,404,406,409,411,414,416],{"class":108,"line":403},13,[106,405,167],{"class":166},[106,407,408],{"class":126}," C_CONTROL_SERVER_USE_SSL",[106,410,390],{"class":173},[106,412,413],{"class":393},"bool",[106,415,397],{"class":173},[106,417,418],{"class":173}," false\n",[106,420,422],{"class":108,"line":421},14,[106,423,201],{"emptyLinePlaceholder":200},[106,425,427,429,432,434,437],{"class":108,"line":426},15,[106,428,167],{"class":166},[106,430,431],{"class":126}," C_CONTROL_SERVER_AUTH_ID",[106,433,174],{"class":173},[106,435,436],{"class":116},"AUTH_ID",[106,438,180],{"class":173},[106,440,442,444,447,449,452],{"class":108,"line":441},16,[106,443,167],{"class":166},[106,445,446],{"class":126}," C_CONTROL_SERVER_AUTH_SECRET",[106,448,174],{"class":173},[106,450,451],{"class":116},"AUTH_SECRET",[106,453,180],{"class":173},[14,455,456,459],{},[38,457,458],{},"src\u002Fconfig\u002Fconfig.h"," is ignored by Git, so your credentials stay out of the repository.",[461,462,464],"h3",{"id":463},"wifi","WiFi",[466,467,468,481],"table",{},[469,470,471],"thead",{},[472,473,474,478],"tr",{},[475,476,477],"th",{},"Setting",[475,479,480],{},"Description",[482,483,484,495,505,515,525,538],"tbody",{},[472,485,486,492],{},[487,488,489],"td",{},[38,490,491],{},"C_WIFI_SSID",[487,493,494],{},"Name of the 2.4 GHz network.",[472,496,497,502],{},[487,498,499],{},[38,500,501],{},"C_WIFI_PASSWORD",[487,503,504],{},"WiFi password.",[472,506,507,512],{},[487,508,509],{},[38,510,511],{},"C_WIFI_LOCAL_IP",[487,513,514],{},"Static IPv4 address of the ESP32. Pick a free address outside your DHCP range.",[472,516,517,522],{},[487,518,519],{},[38,520,521],{},"C_WIFI_GATEWAY_IP",[487,523,524],{},"Your router's address.",[472,526,527,532],{},[487,528,529],{},[38,530,531],{},"C_WIFI_SUBNET_MASK",[487,533,534,535,67],{},"Subnet mask. The agent also uses it to compute the Wake-on-LAN broadcast address (for example ",[38,536,537],{},"192.168.1.255",[472,539,540,549],{},[487,541,542,545,546],{},[38,543,544],{},"C_WIFI_PRIMARY_DNS",", ",[38,547,548],{},"C_WIFI_SECONDARY_DNS",[487,550,551],{},"DNS servers, used to resolve the server host and the NTP servers.",[553,554,555],"tip",{},[14,556,557,558,560,561,564],{},"The agent always applies the static network settings. To use DHCP instead, set\n",[38,559,511],{}," to ",[38,562,563],{},"IPAddress(0, 0, 0, 0)",". The ESP32 Arduino core then requests an address\nfrom your router; reserve one for the ESP32 there so it doesn't change.",[461,566,568],{"id":567},"server","Server",[466,570,571,579],{},[469,572,573],{},[472,574,575,577],{},[475,576,477],{},[475,578,480],{},[482,580,581,595,613,638,654],{},[472,582,583,588],{},[487,584,585],{},[38,586,587],{},"C_CONTROL_SERVER_HOST",[487,589,590,591,594],{},"Host name or IP of the NetIgnite server, without ",[38,592,593],{},"https:\u002F\u002F"," or a path.",[472,596,597,602],{},[487,598,599],{},[38,600,601],{},"C_CONTROL_SERVER_PORT",[487,603,604,605,608,609,612],{},"Server port: ",[38,606,607],{},"443"," behind an HTTPS proxy, ",[38,610,611],{},"18232"," for a direct connection to the Docker container.",[472,614,615,620],{},[487,616,617],{},[38,618,619],{},"C_CONTROL_SERVER_USE_SSL",[487,621,622,625,626,629,630,633,634,637],{},[38,623,624],{},"true"," for an encrypted connection (",[38,627,628],{},"wss:\u002F\u002F","), ",[38,631,632],{},"false"," for plain ",[38,635,636],{},"ws:\u002F\u002F",".",[472,639,640,645],{},[487,641,642],{},[38,643,644],{},"C_CONTROL_SERVER_AUTH_ID",[487,646,647,648,650,651,637],{},"The agent's ",[46,649,81],{},", as a string, for example ",[38,652,653],{},"\"3\"",[472,655,656,661],{},[487,657,658],{},[38,659,660],{},"C_CONTROL_SERVER_AUTH_SECRET",[487,662,647,663,637],{},[46,664,85],{},[14,666,667,668,637],{},"The agent always connects to the path ",[38,669,670],{},"\u002Fapi\u002Fagent-control-service",[466,672,673,694],{},[469,674,675],{},[472,676,677,679,684,689],{},[475,678,568],{},[475,680,681],{},[38,682,683],{},"HOST",[475,685,686],{},[38,687,688],{},"PORT",[475,690,691],{},[38,692,693],{},"USE_SSL",[482,695,696,714,736],{},[472,697,698,701,706,710],{},[487,699,700],{},"Hosted app",[487,702,703],{},[38,704,705],{},"\"app.netignite.dev\"",[487,707,708],{},[38,709,607],{},[487,711,712],{},[38,713,624],{},[472,715,716,723,728,732],{},[487,717,718,719],{},"Self-hosted behind an ",[18,720,722],{"href":721},"\u002Fdocs\u002Fserver\u002Freverse-proxy","HTTPS proxy",[487,724,725],{},[38,726,727],{},"\"netignite.example.com\"",[487,729,730],{},[38,731,607],{},[487,733,734],{},[38,735,624],{},[472,737,738,741,746,750],{},[487,739,740],{},"Self-hosted, direct to the container (LAN only)",[487,742,743],{},[38,744,745],{},"\"192.168.1.10\"",[487,747,748],{},[38,749,611],{},[487,751,752],{},[38,753,632],{},[755,756,757],"warning",{},[14,758,759],{},"Without SSL, the agent's ID and secret are sent unencrypted. Only use plain connections inside a\nnetwork you trust.",[26,761,763],{"id":762},"certificate-bundle","Certificate bundle",[14,765,766,767,770,771,774,775,778],{},"The firmware embeds a bundle of trusted root certificates (",[38,768,769],{},"data\u002Fcert\u002Fx509_crt_bundle.bin",") that\nit uses to verify the server's TLS certificate. PlatformIO generates the bundle automatically\nbefore each build from ",[38,772,773],{},"data\u002Fcert\u002Fcacrt_all.pem",", Mozilla's list of public root CAs (including\nLet's Encrypt). On the first build it installs the Python package ",[38,776,777],{},"cryptography"," into\nPlatformIO's environment, which needs internet access.",[14,780,781,782,785,786,789,790,793],{},"If your server uses a certificate from a private CA, put that CA's certificate (",[38,783,784],{},".pem"," or ",[38,787,788],{},".der",")\ninto ",[38,791,792],{},"data\u002Fcert\u002Fcustom\u002F"," and rebuild. It's added to the bundle; remove the file to take it out\nagain.",[26,795,797],{"id":796},"build-and-flash","Build and flash",[14,799,800],{},"Connect the board over USB, then build, upload and open the serial monitor:",[96,802,804],{"className":98,"code":803,"filename":100,"language":101,"meta":102,"style":102},"pio run\npio run -t upload\npio device monitor\n",[38,805,806,814,827],{"__ignoreMap":102},[106,807,808,811],{"class":108,"line":109},[106,809,810],{"class":112},"pio",[106,812,813],{"class":116}," run\n",[106,815,816,818,821,824],{"class":108,"line":123},[106,817,810],{"class":112},[106,819,820],{"class":116}," run",[106,822,823],{"class":116}," -t",[106,825,826],{"class":116}," upload\n",[106,828,829,831,834],{"class":108,"line":197},[106,830,810],{"class":112},[106,832,833],{"class":116}," device",[106,835,836],{"class":116}," monitor\n",[14,838,839,840,545,843,82,846,849,850,853,854,857,858,861],{},"In VS Code, use the PlatformIO toolbar's ",[46,841,842],{},"Build",[46,844,845],{},"Upload",[46,847,848],{},"Serial Monitor"," buttons\ninstead. The monitor runs at 115200 baud. Add ",[38,851,852],{},"--upload-port \u003Cport>"," (for example ",[38,855,856],{},"COM5"," or\n",[38,859,860],{},"\u002Fdev\u002FttyUSB0",") if PlatformIO doesn't find the board.",[863,864,865],"note",{},[14,866,867,868,871,872,875],{},"The project targets the Arduino-ESP32 ",[46,869,870],{},"2.x"," core that PlatformIO's ",[38,873,874],{},"espressif32"," platform\nprovides. Arduino core 3.x (for example via pioarduino) isn't supported yet.",[14,877,878],{},"Every configuration change requires a rebuild and upload. The firmware has no setup portal and no\nover-the-air updates.",[26,880,882],{"id":881},"what-happens-at-boot","What happens at boot",[14,884,885],{},"A successful start looks like this on the serial monitor (shortened; the order of the lines can\nvary):",[96,887,892],{"className":888,"code":890,"filename":848,"language":891,"meta":102},[889],"language-text","[INFO] Starting...\n[INFO] Connecting to Wifi...\n[INFO] STA Configured\n[INFO] Connecting to MyWiFi...\n[INFO] Wifi connected to MyWiFi. Waiting for IP...\n[INFO] IPv6 enabled on WiFi\n[INFO] Got IP address!\n[INFO] IP address: 192.168.1.32\n[INFO] Waiting for NTP time sync: ....\n[INFO] Current UTC time: Sun Oct 18 19:30:00 2026\n[INFO] Websocket Connected to netignite.example.com:443 SSL: true\n","text",[38,893,890],{"__ignoreMap":102},[895,896,897,900,903,906],"ol",{},[34,898,899],{},"The agent connects to WiFi and enables IPv6.",[34,901,902],{},"It waits up to 30 seconds for the clock to sync via NTP, which is needed to check TLS\ncertificates.",[34,904,905],{},"It opens the WebSocket to the server and authenticates with the Connection ID and Secret.",[34,907,908],{},"It answers commands until the connection drops.",[466,910,911,921],{},[469,912,913],{},[472,914,915,918],{},[475,916,917],{},"Event",[475,919,920],{},"Behavior",[482,922,923,931,939,951],{},[472,924,925,928],{},[487,926,927],{},"WiFi connection lost",[487,929,930],{},"Reconnects after 60 seconds.",[472,932,933,936],{},[487,934,935],{},"Server connection lost or refused",[487,937,938],{},"Retries every 60 seconds.",[472,940,941,944],{},[487,942,943],{},"No WiFi or NTP during boot",[487,945,946,947,950],{},"After 30 seconds the agent logs ",[38,948,949],{},"NTP time sync timed out"," and continues. It keeps retrying WiFi and the server every 60 seconds; TLS connections succeed once the time is synced.",[472,952,953,956],{},[487,954,955],{},"Empty Connection ID or Secret",[487,957,958,959,962],{},"Logs ",[38,960,961],{},"Missing credentials!"," and never connects.",[26,964,966],{"id":965},"commands","Commands",[14,968,969,970,974],{},"The agent implements the three commands of the ",[18,971,973],{"href":972},"\u002Fdocs\u002Fagents\u002Fprotocol","agent protocol",":",[466,976,977,987],{},[469,978,979],{},[472,980,981,984],{},[475,982,983],{},"Command",[475,985,986],{},"What the agent does",[482,988,989,999,1009],{},[472,990,991,996],{},[487,992,993],{},[38,994,995],{},"WAKEUP",[487,997,998],{},"Validates the MAC address and port, then sends the Wake-on-LAN magic packet three times, 100 ms apart, to the subnet's broadcast address.",[472,1000,1001,1006],{},[487,1002,1003],{},[38,1004,1005],{},"GET_STATUS",[487,1007,1008],{},"Pings the device once with a 1-second timeout. A MAC address is converted to the device's IPv6 link-local (EUI-64) address; an IPv4 address is pinged directly.",[472,1010,1011,1016],{},[487,1012,1013],{},[38,1014,1015],{},"HEARTBEAT",[487,1017,1018],{},"Nothing; the server uses it to keep the connection active.",[14,1020,1021,1022,785,1025,1028],{},"MAC addresses must have the form ",[38,1023,1024],{},"AA:BB:CC:DD:EE:FF",[38,1026,1027],{},"AA-BB-CC-DD-EE-FF",". SecureOn (password\nprotected) magic packets aren't supported.",[26,1030,1032],{"id":1031},"limitations","Limitations",[31,1034,1035,1038,1045],{},[34,1036,1037],{},"The agent uses IPv4 subnet broadcasts for Wake-on-LAN, so it only reaches devices in its own\nsubnet. Use one agent per network.",[34,1039,1040,1041,637],{},"The status check depends on the device's IPv6 link-local address being derived from its MAC\naddress. See ",[18,1042,1044],{"href":1043},"\u002Fdocs\u002Fhow-it-works#checking-device-status","How It Works",[34,1046,16,1047,1050],{},[38,1048,1049],{},"installer\u002F"," folder in the repository is an early placeholder for a desktop installer. It\ncan't flash boards yet; use PlatformIO.",[1052,1053,1054],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":102,"searchDepth":123,"depth":123,"links":1056},[1057,1058,1059,1063,1064,1065,1066,1067],{"id":28,"depth":123,"text":29},{"id":93,"depth":123,"text":94},{"id":133,"depth":123,"text":134,"children":1060},[1061,1062],{"id":463,"depth":197,"text":464},{"id":567,"depth":197,"text":568},{"id":762,"depth":123,"text":763},{"id":796,"depth":123,"text":797},{"id":881,"depth":123,"text":882},{"id":965,"depth":123,"text":966},{"id":1031,"depth":123,"text":1032},"Configure, build and flash the NetIgnite ESP32 agent firmware with PlatformIO.","md",{},{"title":5},"\u002Fdocs\u002Fagents\u002Fesp32",{"title":5,"description":1068},"docs\u002Fagents\u002Fesp32","PQEi4Ev1SiV5TVIMwXP5b1PuUDjGC5cWhQg-t-rf9dU",1792355946318]