{"id":3806,"date":"2025-12-29T15:31:06","date_gmt":"2025-12-29T14:31:06","guid":{"rendered":"https:\/\/www.ingeniousmakers.com\/?p=3806"},"modified":"2025-12-31T11:52:42","modified_gmt":"2025-12-31T10:52:42","slug":"reyax-rylr998-lora-modules","status":"publish","type":"post","link":"https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/","title":{"rendered":"Review: REYAX RYLR998 LoRa Modules"},"content":{"rendered":"\n<p>When building IoT systems, your choice of wireless protocol can make or break the project. WiFi is ubiquitous but power-hungry and range-limited; Bluetooth is great for short distances but fails through walls. After testing the <strong><a href=\"https:\/\/reyax.com\/\/lora.php?cat_m=4\" target=\"_blank\" rel=\"noreferrer noopener\">REYAX RYLR998<\/a> LoRa modules<\/strong> using ESP32 nodes and ESPHome, I\u2019ve found a middle ground that offers incredible range and reliability without the overhead of a traditional network.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized wp-duotone-unset-1\"><img loading=\"lazy\" decoding=\"async\" width=\"1290\" height=\"1272\" src=\"https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/RYLR998_post3-1.png?v=1767026583\" alt=\"\" class=\"wp-image-3944\" style=\"aspect-ratio:1.0141735210743994;width:401px;height:auto\" srcset=\"https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/RYLR998_post3-1.png?v=1767026583 1290w, https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/RYLR998_post3-1-300x296.png?v=1767026583 300w, https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/RYLR998_post3-1-1024x1010.png?v=1767026583 1024w, https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/RYLR998_post3-1-768x757.png?v=1767026583 768w, https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/RYLR998_post3-1-80x80.png?v=1767026583 80w, https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/RYLR998_post3-1-720x710.png?v=1767026583 720w, https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/RYLR998_post3-1-520x513.png?v=1767026583 520w, https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/RYLR998_post3-1-320x316.png?v=1767026583 320w\" sizes=\"auto, (max-width: 1290px) 100vw, 1290px\" \/><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><\/p>\n\n\n\n<p><strong>Transparency Note:<\/strong> REYAX provided two RYLR998 modules for evaluation. As always, all opinions are our own. REYAX had no editorial input and did not see this review prior to publication.<\/p>\n<\/blockquote>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_83 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-6a06ff6978375\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-6a06ff6978375\"  aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/#Simplicity_Meets_Functionality\" >Simplicity Meets Functionality<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/#The_test_setup\" >The test setup<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/#Real-world_performance_Urban_testing\" >Real-world performance: Urban testing<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/#Configuration_code\" >Configuration &amp; code<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/#1_Initialization\" >1. Initialization<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/#2_Sending_messages_via_HA_services\" >2. Sending messages via HA services<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/#Integration_with_Home_Assistant\" >Integration with Home Assistant<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/#Conclusion\" >Conclusion<\/a><\/li><\/ul><\/nav><\/div>\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Simplicity_Meets_Functionality\"><\/span>Simplicity Meets Functionality<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>The RYLR998 immediately stands out due to its straightforward <a href=\"https:\/\/reyax.com\/\/upload\/products_download\/download_file\/LoRa_AT_Command_RYLR998_RYLR498_EN.pdf\" target=\"_blank\" rel=\"noreferrer noopener\">AT command<\/a> interface. While many LoRa modules require complex libraries or &#8220;firmware wizardry,&#8221; REYAX uses a clean, predictable UART structure at 115200 baud.<\/p>\n\n\n\n<p>The module handles the heavy lifting &#8211; complex modulation, error correction, and transmission timing &#8211; internally. This frees up your microcontroller (like an ESP32 or Arduino) to focus on your application logic rather than managing a radio stack.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"The_test_setup\"><\/span>The test setup<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>To see how these modules perform in the real world, I configured two independent <strong>ESP32 Devkit v1<\/strong> nodes.<\/p>\n\n\n\n<p id=\"bkmrk-wiring-%28hardware-con\">Wiring it up is fairly easy. The RYLR998 module uses a UART interface and requires a 3.3V power supply. The ESP32 operates at 3.3V logic, so you can connect them directly.<\/p>\n\n\n\n<p id=\"bkmrk-%E2%80%A2-rylr998-vcc-%E2%86%92-esp3\">\u2022 RYLR998 VCC \u2192 ESP32 3.3V&nbsp;<br>\u2022 RYLR998 GND \u2192 ESP32 GND&nbsp;<br>\u2022 RYLR998 TX \u2192 ESP32 RX pin (e.g., GPI016)&nbsp;<br>\u2022 RYLR998 RD \u2192 ESP32 TX pin (e.g., GPIO17)&nbsp;<\/p>\n\n\n\n<p>The software integration relies on ESPHome\u2019s custom <a href=\"https:\/\/esphome.io\/components\/uart\/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">UART<\/a> components and lambda functions to construct AT commands on the fly. When Node 100 sends a message, it formats a string, calculates the length, and pushes it through the UART interface. The receiving node then parses the incoming string to extract the message, RSSI (Received Signal Strength Indicator), and SNR (Signal-to-Noise Ratio).<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Node A (Address 100):<\/strong> The transmitter\/receiver.<\/li>\n\n\n\n<li><strong>Node B (Address 200):<\/strong> The remote node.<\/li>\n\n\n\n<li><strong>Network ID:<\/strong> 18 (both nodes must match to communicate).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Real-world_performance_Urban_testing\"><\/span>Real-world performance: Urban testing<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>In a dense urban environment\u2014filled with houses, trees, and competing signals\u2014I successfully bridged a distance of <strong>300 meters<\/strong> without a single dropped packet. What makes this impressive is that it was achieved with:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Stock Antennas:<\/strong> No high-gain modifications.<\/li>\n\n\n\n<li><strong>Default Power Settings:<\/strong> Optimized for energy efficiency.<\/li>\n\n\n\n<li><strong>Low Power Draw:<\/strong> Minimal impact on battery-operated nodes.<\/li>\n<\/ol>\n\n\n\n<p>The link margins remained healthy throughout the test, suggesting that in a &#8220;line-of-sight&#8221; rural environment, these modules could easily reach several kilometers.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Configuration_code\"><\/span>Configuration &amp; code<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>In ESPHome, timing is everything. I implemented a boot sequence to ensure the RYLR998 is fully initialized before the system starts polling for data.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"1_Initialization\"><\/span>1. Initialization<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>YAML<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>on_boot:\n  priority: 100.0\n  then:\n    - delay: 5s\n    - uart.write: \"AT\\r\\n\"\n    - delay: 0.5s\n    - uart.write: \"AT+ADDRESS=100\\r\\n\"\n    - delay: 0.5s\n    - uart.write: \"AT+NETWORKID=18\\r\\n\"<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9FF\">on_boot<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  priority<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">100.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  then<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> delay<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> 5<\/span><span style=\"color: #D8DEE9\">s<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">uart<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">write<\/span><span style=\"color: #D8DEE9FF\">: <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">AT<\/span><span style=\"color: #EBCB8B\">\\r\\n<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> delay<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> 0<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">5<\/span><span style=\"color: #D8DEE9\">s<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">uart<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">write<\/span><span style=\"color: #D8DEE9FF\">: <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">AT+ADDRESS=100<\/span><span style=\"color: #EBCB8B\">\\r\\n<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> delay<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> 0<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">5<\/span><span style=\"color: #D8DEE9\">s<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">uart<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">write<\/span><span style=\"color: #D8DEE9FF\">: <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">AT+NETWORKID=18<\/span><span style=\"color: #EBCB8B\">\\r\\n<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><em>The 5-second delay is critical; it allows the module to stabilize before receiving configuration commands.<\/em><\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"2_Sending_messages_via_HA_services\"><\/span>2. Sending messages via HA services<span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<p>I created a custom service that allows Home Assistant to trigger a LoRa transmission easily:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>services:\n  - service: send_lora_message\n    variables:\n      dest_address: int\n      message: string\n    then:\n      - lambda: |-\n          int len = message.length();\n          char cmd&#91;100&#93;;\n          snprintf(cmd, sizeof(cmd), \"AT+SEND=%d,%d,%s\\r\\n\", dest_address, len, message.c_str());\n          id(lora_uart).write_str(cmd);\n          ESP_LOGI(\"LoRa\", \"Sending to %d: %s\", dest_address, message.c_str());<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9FF\">services<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> service<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">send_lora_message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    variables<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      dest_address<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      message<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">string<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    then<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> lambda<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">|-<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">          <\/span><span style=\"color: #D8DEE9\">int<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">len<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">message<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">length<\/span><span style=\"color: #D8DEE9FF\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">          <\/span><span style=\"color: #D8DEE9\">char<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">cmd<\/span><span style=\"color: #D8DEE9FF\">&#91;<\/span><span style=\"color: #B48EAD\">100<\/span><span style=\"color: #D8DEE9FF\">&#93;<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">          <\/span><span style=\"color: #88C0D0\">snprintf<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">cmd<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">sizeof<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">cmd<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">AT+SEND=%d,%d,%s<\/span><span style=\"color: #EBCB8B\">\\r\\n<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">dest_address<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">len<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">message<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">c_str<\/span><span style=\"color: #D8DEE9FF\">())<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">          <\/span><span style=\"color: #88C0D0\">id<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">lora_uart<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">write_str<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">cmd<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">          <\/span><span style=\"color: #88C0D0\">ESP_LOGI<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">LoRa<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Sending to %d: %s<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">dest_address<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">message<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">c_str<\/span><span style=\"color: #D8DEE9FF\">())<\/span><span style=\"color: #81A1C1\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"428\" src=\"https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/CleanShot-2025-12-29-at-15.14.28-1024x428.png?v=1767017697\" alt=\"\" class=\"wp-image-3908\" srcset=\"https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/CleanShot-2025-12-29-at-15.14.28-1024x428.png?v=1767017697 1024w, https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/CleanShot-2025-12-29-at-15.14.28-300x125.png?v=1767017697 300w, https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/CleanShot-2025-12-29-at-15.14.28-768x321.png?v=1767017697 768w, https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/CleanShot-2025-12-29-at-15.14.28-720x301.png?v=1767017697 720w, https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/CleanShot-2025-12-29-at-15.14.28-520x217.png?v=1767017697 520w, https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/CleanShot-2025-12-29-at-15.14.28-320x134.png?v=1767017697 320w, https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/CleanShot-2025-12-29-at-15.14.28.png?v=1767017697 1227w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Home Assistant service call<\/figcaption><\/figure>\n\n\n\n<p>3. Receiving messages<\/p>\n\n\n\n<p>This ESPHome lambda code functions as a custom serial parse<strong>r<\/strong> for the RYLR998. It runs every 500ms to check for incoming messages, extracts specific data fields, and pushes that data to ESPHome sensors. <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>interval:\n  - interval: 500ms\n    then:\n      - lambda: |-\n          static std::string uart_buffer;\n          \n          while (id(lora_uart).available()) {\n            uint8_t byte;\n            if (id(lora_uart).read_byte(&amp;byte)) {\n              uart_buffer += (char)byte;\n              \n              if (byte == '\\n') {\n                std::string data = uart_buffer;\n                uart_buffer = \"\";\n                \n                ESP_LOGD(\"LoRa\", \"Received line: %s\", data.c_str());\n                \n                if (data.find(\"+RCV=\") != std::string::npos) {\n                  size_t pos = data.find(\"+RCV=\");\n                  data = data.substr(pos + 5);\n                  data.erase(data.find_last_not_of(\"\\r\\n\") + 1);\n                  \n                  ESP_LOGD(\"LoRa\", \"Parsing: %s\", data.c_str());\n                  \n                  int field = 0;\n                  std::string src_addr, data_len, message, rssi, snr;\n                  std::string current = \"\";\n                  \n                  for (size_t i = 0; i &lt; data.length(); i++) {\n                    if (data&#91;i&#93; == ',') {\n                      if (field == 0) src_addr = current;\n                      else if (field == 1) data_len = current;\n                      else if (field == 2) message = current;\n                      else if (field == 3) rssi = current;\n                      current = \"\";\n                      field++;\n                    } else {\n                      current += data&#91;i&#93;;\n                    }\n                  }\n                  if (field == 4) snr = current;\n                  \n                  if (!src_addr.empty()) {\n                    id(lora_src_address).publish_state(src_addr);\n                  }\n                  if (!message.empty()) {\n                    id(lora_message).publish_state(message);\n                  }\n                  if (!rssi.empty()) {\n                    char *endptr;\n                    float rssi_val = strtof(rssi.c_str(), &amp;endptr);\n                    if (endptr != rssi.c_str()) {\n                      id(lora_rssi).publish_state(rssi_val);\n                    }\n                  }\n                  if (!snr.empty()) {\n                    char *endptr;\n                    float snr_val = strtof(snr.c_str(), &amp;endptr);\n                    if (endptr != snr.c_str()) {\n                      id(lora_snr).publish_state(snr_val);\n                    }\n                  }\n                  \n                  ESP_LOGI(\"LoRa\", \"Message from %s: %s (RSSI: %s dBm, SNR: %s dB)\", \n                           src_addr.c_str(), message.c_str(), rssi.c_str(), snr.c_str());\n                }\n              }\n            }\n          }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9FF\">interval<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> interval<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> 500<\/span><span style=\"color: #D8DEE9\">ms<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    then<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> lambda<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">|-<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">          <\/span><span style=\"color: #D8DEE9\">static<\/span><span style=\"color: #D8DEE9FF\"> std<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\">:<\/span><span style=\"color: #D8DEE9\">string<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">uart_buffer<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">          <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">          <\/span><span style=\"color: #81A1C1\">while<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #88C0D0\">id<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">lora_uart<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">available<\/span><span style=\"color: #D8DEE9FF\">()) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #D8DEE9\">uint8_t<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">byte<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #88C0D0\">id<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">lora_uart<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">read_byte<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #81A1C1\">&amp;<\/span><span style=\"color: #D8DEE9\">byte<\/span><span style=\"color: #D8DEE9FF\">)) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">              <\/span><span style=\"color: #D8DEE9\">uart_buffer<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">+=<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">char<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #D8DEE9\">byte<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">              <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">              <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">byte<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #EBCB8B\">\\n<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                std<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\">:<\/span><span style=\"color: #D8DEE9\">string<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">uart_buffer<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><span style=\"color: #D8DEE9\">uart_buffer<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;&quot;<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><span style=\"color: #88C0D0\">ESP_LOGD<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">LoRa<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Received line: %s<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">c_str<\/span><span style=\"color: #D8DEE9FF\">())<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">find<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">+RCV=<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #81A1C1\">!=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">std<\/span><span style=\"color: #D8DEE9FF\">::<\/span><span style=\"color: #D8DEE9\">string<\/span><span style=\"color: #D8DEE9FF\">::<\/span><span style=\"color: #D8DEE9\">npos<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #D8DEE9\">size_t<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">pos<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">find<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">+RCV=<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">substr<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">pos<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">5<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">erase<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">find_last_not_of<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #EBCB8B\">\\r\\n<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #88C0D0\">ESP_LOGD<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">LoRa<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Parsing: %s<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">c_str<\/span><span style=\"color: #D8DEE9FF\">())<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #D8DEE9\">int<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">field<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  std<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\">:<\/span><span style=\"color: #D8DEE9\">string<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">src_addr<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">data_len<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">message<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">rssi<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">snr<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  std<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\">:<\/span><span style=\"color: #D8DEE9\">string<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">current<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;&quot;<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #81A1C1\">for<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">size_t<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">i<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #81A1C1\">;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">i<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">&lt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">length<\/span><span style=\"color: #D8DEE9FF\">()<\/span><span style=\"color: #81A1C1\">;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">i<\/span><span style=\"color: #81A1C1\">++<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #D8DEE9FF\">&#91;<\/span><span style=\"color: #D8DEE9\">i<\/span><span style=\"color: #D8DEE9FF\">&#93; <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">,<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                      <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">field<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #D8DEE9\">src_addr<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">current<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                      <\/span><span style=\"color: #81A1C1\">else<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">field<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #D8DEE9\">data_len<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">current<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                      <\/span><span style=\"color: #81A1C1\">else<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">field<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">2<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #D8DEE9\">message<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">current<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                      <\/span><span style=\"color: #81A1C1\">else<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">field<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">3<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #D8DEE9\">rssi<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">current<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                      <\/span><span style=\"color: #D8DEE9\">current<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;&quot;<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                      <\/span><span style=\"color: #D8DEE9\">field<\/span><span style=\"color: #81A1C1\">++;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #ECEFF4\">}<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">else<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                      <\/span><span style=\"color: #D8DEE9\">current<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">+=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #D8DEE9FF\">&#91;<\/span><span style=\"color: #D8DEE9\">i<\/span><span style=\"color: #D8DEE9FF\">&#93;<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">field<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">4<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #D8DEE9\">snr<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">current<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #81A1C1\">!<\/span><span style=\"color: #D8DEE9\">src_addr<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">empty<\/span><span style=\"color: #D8DEE9FF\">()) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #88C0D0\">id<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">lora_src_address<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">publish_state<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">src_addr<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #81A1C1\">!<\/span><span style=\"color: #D8DEE9\">message<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">empty<\/span><span style=\"color: #D8DEE9FF\">()) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #88C0D0\">id<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">lora_message<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">publish_state<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">message<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #81A1C1\">!<\/span><span style=\"color: #D8DEE9\">rssi<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">empty<\/span><span style=\"color: #D8DEE9FF\">()) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #D8DEE9\">char<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">*<\/span><span style=\"color: #D8DEE9\">endptr<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #D8DEE9\">float<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">rssi_val<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">strtof<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">rssi<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">c_str<\/span><span style=\"color: #D8DEE9FF\">()<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">&amp;<\/span><span style=\"color: #D8DEE9\">endptr<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">endptr<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">!=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">rssi<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">c_str<\/span><span style=\"color: #D8DEE9FF\">()) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                      <\/span><span style=\"color: #88C0D0\">id<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">lora_rssi<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">publish_state<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">rssi_val<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #81A1C1\">!<\/span><span style=\"color: #D8DEE9\">snr<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">empty<\/span><span style=\"color: #D8DEE9FF\">()) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #D8DEE9\">char<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">*<\/span><span style=\"color: #D8DEE9\">endptr<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #D8DEE9\">float<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">snr_val<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">strtof<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">snr<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">c_str<\/span><span style=\"color: #D8DEE9FF\">()<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">&amp;<\/span><span style=\"color: #D8DEE9\">endptr<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">endptr<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">!=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">snr<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">c_str<\/span><span style=\"color: #D8DEE9FF\">()) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                      <\/span><span style=\"color: #88C0D0\">id<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">lora_snr<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">publish_state<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">snr_val<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #88C0D0\">ESP_LOGI<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">LoRa<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Message from %s: %s (RSSI: %s dBm, SNR: %s dB)<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                           <\/span><span style=\"color: #D8DEE9\">src_addr<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">c_str<\/span><span style=\"color: #D8DEE9FF\">()<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">message<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">c_str<\/span><span style=\"color: #D8DEE9FF\">()<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">rssi<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">c_str<\/span><span style=\"color: #D8DEE9FF\">()<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">snr<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">c_str<\/span><span style=\"color: #D8DEE9FF\">())<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">              <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">          <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Integration_with_Home_Assistant\"><\/span>Integration with Home Assistant<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Once the ESPHome nodes are flashed, the RYLR998 modules become first-class citizens in Home Assistant.<\/p>\n\n\n\n<p>Incoming data populates text sensors, while signal quality (RSSI\/SNR) appears as diagnostic sensors. This allows for powerful automations, such as:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Triggering a notification if a remote gate (too far for WiFi) is opened.<\/li>\n\n\n\n<li>Logging soil moisture from a sensor at the edge of a large property.<\/li>\n\n\n\n<li>Monitoring the health of the wireless link via the SNR values.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1080\" height=\"926\" src=\"https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/ha_sensors.png?v=1767020646\" alt=\"\" class=\"wp-image-3934\" srcset=\"https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/ha_sensors.png?v=1767020646 1080w, https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/ha_sensors-300x257.png?v=1767020646 300w, https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/ha_sensors-1024x878.png?v=1767020646 1024w, https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/ha_sensors-768x658.png?v=1767020646 768w, https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/ha_sensors-720x617.png?v=1767020646 720w, https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/ha_sensors-520x446.png?v=1767020646 520w, https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/ha_sensors-320x274.png?v=1767020646 320w\" sizes=\"auto, (max-width: 1080px) 100vw, 1080px\" \/><figcaption class=\"wp-element-caption\">ESPHome device in Home Assistant<\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Conclusion\"><\/span>Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>The REYAX RYLR998 offers exceptional value for anyone needing long-range communication with minimal complexity. Whether you are building a remote sensor network or a node-to-node messaging system, these modules deliver where WiFi fails.<\/p>\n\n\n\n<p><strong>The Verdict:<\/strong> If you need a &#8220;set it and forget it&#8221; LoRa solution that integrates cleanly with ESPHome, the RYLR998 belongs on your shortlist.<\/p>\n\n\n\n<p>You wanna get one, or maybe two? \ud83d\ude42 <br><br>For official global stores:&nbsp;<\/p>\n\n\n\n<p>Amazon:&nbsp;<a href=\"https:\/\/www.amazon.com\/REYAX-RYLR998-Interface-Antenna-Transceiver\/dp\/B099RM1XMG\">https:\/\/www.amazon.com\/REYAX-RYLR998-Interface-Antenna-Transceiver\/dp\/B099RM1XMG<\/a><br>Digikey:&nbsp;<a href=\"https:\/\/www.digikey.com\/en\/products\/detail\/reyax\/RYLR998\/22078252\">https:\/\/www.digikey.com\/en\/products\/detail\/reyax\/RYLR998\/22078252<\/a><br>eBay:&nbsp;<a href=\"https:\/\/www.ebay.com\/itm\/185968668254?itmmeta=01KDPD3PWDWFK4YJBJ27VQB7GP&amp;hash=item2b4c98ae5e:g:RosAAOSwLOJkoYI2\">https:\/\/www.ebay.com\/itm\/185968668254<\/a><\/p>\n\n\n\n<p>Worldwide distributors: <strong><a href=\"https:\/\/reyax.com\/distributors.php\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/reyax.com\/distributors.php<\/a><\/strong><\/p>\n\n\n\n<p>If you fail to get them from all sources mentioned above, please try REYAX directly. Depending on your location, they might be able to help out.<\/p>\n\n\n\n<p>In case all the above fails, we added a Aliexpress source. They claim to have the original modules, but order at your own risk!<br>If you use the link below, we get a small commission &#8211; it doesn&#8217;t cost you a penny extra!<br><a href=\"https:\/\/s.click.aliexpress.com\/e\/_c4BOiyNf\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a><\/p>\n\n\n\n<a href=\"https:\/\/s.click.aliexpress.com\/e\/_c4aTdE49\" target=\"_blank\"><img decoding=\"async\" src=\"\/\/ae01.alicdn.com\/kf\/Sa72414b769284f2fb066bbddd6f47f15x.jpg_350x350.jpg\" \/><\/a>\n\n\n\n<p>Full node configuration example:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>esphome:\n  name: esp32-lora-01\n  friendly_name: esp32-lora-01\n  platformio_options:\n    board_build.f_cpu: 240000000L\n  on_boot:\n    priority: 100.0\n    then:\n      - delay: 5s\n      - uart.write: \"AT\\r\\n\"\n      - delay: 0.5s\n      - uart.write: \"AT+ADDRESS=100\\r\\n\" # change to 200 for the second module\n      - delay: 0.5s\n      - uart.write: \"AT+NETWORKID=18\\r\\n\" # Set the Network ID\n\nesp32:\n  board: esp32dev\n  framework:\n    type: arduino\n    version: recommended\n\nweb_server:\n  port: 80\n\nlogger:\n  level: DEBUG\n\napi:\n  encryption:\n    key: !secret api_key\n  services:\n    # Creates a Home Assistant service for sending messages\n    - service: send_lora_message\n      variables:\n        dest_address: int\n        message: string\n      then:\n        - lambda: |-\n            int len = message.length();\n            char cmd&#91;100&#93;;\n            snprintf(cmd, sizeof(cmd), \"AT+SEND=%d,%d,%s\\r\\n\", dest_address, len, message.c_str());\n            id(lora_uart).write_str(cmd);\n            ESP_LOGI(\"LoRa\", \"Sending to %d: %s\", dest_address, message.c_str());\n\nota:\n- platform: esphome\n  password: !secret ota_password\n\nwifi:\n  ssid: !secret wifi_ssid\n  password: !secret wifi_password\n  ap:\n    ssid: \"LoRA02 Fallback Hotspot\"\n    password: \"fallback12345\"\n\nuart:\n  id: lora_uart\n  tx_pin: GPIO17\n  rx_pin: GPIO16\n  baud_rate: 115200\n\ntext_sensor:\n  - platform: template\n    name: \"LoRa Source Address\"\n    id: lora_src_address\n    icon: mdi:radio-tower\n    \n  - platform: template\n    name: \"LoRa Message\"\n    id: lora_message\n    icon: mdi:message\n\nsensor:\n  - platform: template\n    name: \"LoRa RSSI\"\n    id: lora_rssi\n    unit_of_measurement: \"dBm\"\n    icon: mdi:signal-variant\n    \n  - platform: template\n    name: \"LoRa SNR\"\n    id: lora_snr\n    unit_of_measurement: \"dB\"\n    icon: mdi:signal-strength-3\n\ninterval:\n   # checks for a new message every 500ms\n  - interval: 500ms\n    then:\n      - lambda: |-\n          static std::string uart_buffer;\n          \n          while (id(lora_uart).available()) {\n            uint8_t byte;\n            if (id(lora_uart).read_byte(&amp;byte)) {\n              uart_buffer += (char)byte;\n              \n              if (byte == '\\n') {\n                std::string data = uart_buffer;\n                uart_buffer = \"\";\n                \n                ESP_LOGD(\"LoRa\", \"Received line: %s\", data.c_str());\n                \n                if (data.find(\"+RCV=\") != std::string::npos) {\n                  size_t pos = data.find(\"+RCV=\");\n                  data = data.substr(pos + 5);\n                  data.erase(data.find_last_not_of(\"\\r\\n\") + 1);\n                  \n                  ESP_LOGD(\"LoRa\", \"Parsing: %s\", data.c_str());\n                  \n                  int field = 0;\n                  std::string src_addr, data_len, message, rssi, snr;\n                  std::string current = \"\";\n                  \n                  for (size_t i = 0; i &lt; data.length(); i++) {\n                    if (data&#91;i&#93; == ',') {\n                      if (field == 0) src_addr = current;\n                      else if (field == 1) data_len = current;\n                      else if (field == 2) message = current;\n                      else if (field == 3) rssi = current;\n                      current = \"\";\n                      field++;\n                    } else {\n                      current += data&#91;i&#93;;\n                    }\n                  }\n                  if (field == 4) snr = current;\n                  \n                  if (!src_addr.empty()) {\n                    id(lora_src_address).publish_state(src_addr);\n                  }\n                  if (!message.empty()) {\n                    id(lora_message).publish_state(message);\n                  }\n                  if (!rssi.empty()) {\n                    char *endptr;\n                    float rssi_val = strtof(rssi.c_str(), &amp;endptr);\n                    if (endptr != rssi.c_str()) {\n                      id(lora_rssi).publish_state(rssi_val);\n                    }\n                  }\n                  if (!snr.empty()) {\n                    char *endptr;\n                    float snr_val = strtof(snr.c_str(), &amp;endptr);\n                    if (endptr != snr.c_str()) {\n                      id(lora_snr).publish_state(snr_val);\n                    }\n                  }\n                  \n                  ESP_LOGI(\"LoRa\", \"Message from %s: %s (RSSI: %s dBm, SNR: %s dB)\", \n                           src_addr.c_str(), message.c_str(), rssi.c_str(), snr.c_str());\n                }\n              }\n            }\n          }<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9FF\">esphome<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  name<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">esp32<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9\">lora<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #B48EAD\">01<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  friendly_name<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">esp32<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9\">lora<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #B48EAD\">01<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  platformio_options<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #D8DEE9\">board_build<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">f_cpu<\/span><span style=\"color: #D8DEE9FF\">: 240000000<\/span><span style=\"color: #D8DEE9\">L<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  on_boot<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    priority<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">100.0<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    then<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> delay<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> 5<\/span><span style=\"color: #D8DEE9\">s<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">uart<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">write<\/span><span style=\"color: #D8DEE9FF\">: <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">AT<\/span><span style=\"color: #EBCB8B\">\\r\\n<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> delay<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> 0<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">5<\/span><span style=\"color: #D8DEE9\">s<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">uart<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">write<\/span><span style=\"color: #D8DEE9FF\">: <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">AT+ADDRESS=100<\/span><span style=\"color: #EBCB8B\">\\r\\n<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #D8DEE9FF\"> # <\/span><span style=\"color: #D8DEE9\">change<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">to<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">200<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">for<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">the<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">second<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">module<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> delay<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> 0<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">5<\/span><span style=\"color: #D8DEE9\">s<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">uart<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9\">write<\/span><span style=\"color: #D8DEE9FF\">: <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">AT+NETWORKID=18<\/span><span style=\"color: #EBCB8B\">\\r\\n<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #D8DEE9FF\"> # <\/span><span style=\"color: #D8DEE9\">Set<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">the<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">Network<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">ID<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">esp32<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  board<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">esp32dev<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  framework<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    type<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">arduino<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    version<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">recommended<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">web_server<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  port<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">80<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">logger<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  level<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">DEBUG<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">api<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  encryption<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    key<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">!<\/span><span style=\"color: #D8DEE9\">secret<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">api_key<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  services<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    # <\/span><span style=\"color: #D8DEE9\">Creates<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">a<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">Home<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">Assistant<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">service<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">for<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">sending<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">messages<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> service<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">send_lora_message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      variables<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        dest_address<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">int<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        message<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">string<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      then<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> lambda<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">|-<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #D8DEE9\">int<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">len<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">message<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">length<\/span><span style=\"color: #D8DEE9FF\">()<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #D8DEE9\">char<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">cmd<\/span><span style=\"color: #D8DEE9FF\">&#91;<\/span><span style=\"color: #B48EAD\">100<\/span><span style=\"color: #D8DEE9FF\">&#93;<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #88C0D0\">snprintf<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">cmd<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">sizeof<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">cmd<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">AT+SEND=%d,%d,%s<\/span><span style=\"color: #EBCB8B\">\\r\\n<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">dest_address<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">len<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">message<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">c_str<\/span><span style=\"color: #D8DEE9FF\">())<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #88C0D0\">id<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">lora_uart<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">write_str<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">cmd<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #88C0D0\">ESP_LOGI<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">LoRa<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Sending to %d: %s<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">dest_address<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">message<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">c_str<\/span><span style=\"color: #D8DEE9FF\">())<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">ota<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> platform<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">esphome<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  password<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">!<\/span><span style=\"color: #D8DEE9\">secret<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">ota_password<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">wifi<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  ssid<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">!<\/span><span style=\"color: #D8DEE9\">secret<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">wifi_ssid<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  password<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">!<\/span><span style=\"color: #D8DEE9\">secret<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">wifi_password<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  ap<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    ssid<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">LoRA02 Fallback Hotspot<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    password<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">fallback12345<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">uart<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  id<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">lora_uart<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  tx_pin<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">GPIO17<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  rx_pin<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">GPIO16<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  baud_rate<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">115200<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">text_sensor<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> platform<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">template<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    name<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">LoRa Source Address<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    id<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">lora_src_address<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    icon<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> mdi<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9\">radio<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9\">tower<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> platform<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">template<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    name<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">LoRa Message<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    id<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">lora_message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    icon<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> mdi<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9\">message<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">sensor<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> platform<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">template<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    name<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">LoRa RSSI<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    id<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">lora_rssi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    unit_of_measurement<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">dBm<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    icon<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> mdi<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9\">signal<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9\">variant<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> platform<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">template<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    name<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">LoRa SNR<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    id<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">lora_snr<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    unit_of_measurement<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">dB<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    icon<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> mdi<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9\">signal<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9\">strength<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #B48EAD\">3<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">interval<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">   # <\/span><span style=\"color: #D8DEE9\">checks<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">for<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">a<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">message<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">every<\/span><span style=\"color: #D8DEE9FF\"> 500<\/span><span style=\"color: #D8DEE9\">ms<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> interval<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> 500<\/span><span style=\"color: #D8DEE9\">ms<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    then<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">      <\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\"> lambda<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">|-<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">          <\/span><span style=\"color: #D8DEE9\">static<\/span><span style=\"color: #D8DEE9FF\"> std<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\">:<\/span><span style=\"color: #D8DEE9\">string<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">uart_buffer<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">          <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">          <\/span><span style=\"color: #81A1C1\">while<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #88C0D0\">id<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">lora_uart<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">available<\/span><span style=\"color: #D8DEE9FF\">()) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #D8DEE9\">uint8_t<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">byte<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #88C0D0\">id<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">lora_uart<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">read_byte<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #81A1C1\">&amp;<\/span><span style=\"color: #D8DEE9\">byte<\/span><span style=\"color: #D8DEE9FF\">)) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">              <\/span><span style=\"color: #D8DEE9\">uart_buffer<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">+=<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">char<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #D8DEE9\">byte<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">              <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">              <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">byte<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #EBCB8B\">\\n<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                std<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\">:<\/span><span style=\"color: #D8DEE9\">string<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">uart_buffer<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><span style=\"color: #D8DEE9\">uart_buffer<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;&quot;<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><span style=\"color: #88C0D0\">ESP_LOGD<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">LoRa<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Received line: %s<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">c_str<\/span><span style=\"color: #D8DEE9FF\">())<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">find<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">+RCV=<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #81A1C1\">!=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">std<\/span><span style=\"color: #D8DEE9FF\">::<\/span><span style=\"color: #D8DEE9\">string<\/span><span style=\"color: #D8DEE9FF\">::<\/span><span style=\"color: #D8DEE9\">npos<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #D8DEE9\">size_t<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">pos<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">find<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">+RCV=<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">substr<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">pos<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">5<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">erase<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">find_last_not_of<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #EBCB8B\">\\r\\n<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #88C0D0\">ESP_LOGD<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">LoRa<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Parsing: %s<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">c_str<\/span><span style=\"color: #D8DEE9FF\">())<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #D8DEE9\">int<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">field<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  std<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\">:<\/span><span style=\"color: #D8DEE9\">string<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">src_addr<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">data_len<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">message<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">rssi<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">snr<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  std<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\">:<\/span><span style=\"color: #D8DEE9\">string<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">current<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;&quot;<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #81A1C1\">for<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">size_t<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">i<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #81A1C1\">;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">i<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">&lt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">length<\/span><span style=\"color: #D8DEE9FF\">()<\/span><span style=\"color: #81A1C1\">;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">i<\/span><span style=\"color: #81A1C1\">++<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #D8DEE9FF\">&#91;<\/span><span style=\"color: #D8DEE9\">i<\/span><span style=\"color: #D8DEE9FF\">&#93; <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #A3BE8C\">,<\/span><span style=\"color: #ECEFF4\">&#39;<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                      <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">field<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #D8DEE9\">src_addr<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">current<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                      <\/span><span style=\"color: #81A1C1\">else<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">field<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #D8DEE9\">data_len<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">current<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                      <\/span><span style=\"color: #81A1C1\">else<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">field<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">2<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #D8DEE9\">message<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">current<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                      <\/span><span style=\"color: #81A1C1\">else<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">field<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">3<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #D8DEE9\">rssi<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">current<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                      <\/span><span style=\"color: #D8DEE9\">current<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;&quot;<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                      <\/span><span style=\"color: #D8DEE9\">field<\/span><span style=\"color: #81A1C1\">++;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #ECEFF4\">}<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">else<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                      <\/span><span style=\"color: #D8DEE9\">current<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">+=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">data<\/span><span style=\"color: #D8DEE9FF\">&#91;<\/span><span style=\"color: #D8DEE9\">i<\/span><span style=\"color: #D8DEE9FF\">&#93;<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">field<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">==<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">4<\/span><span style=\"color: #D8DEE9FF\">) <\/span><span style=\"color: #D8DEE9\">snr<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">current<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #81A1C1\">!<\/span><span style=\"color: #D8DEE9\">src_addr<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">empty<\/span><span style=\"color: #D8DEE9FF\">()) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #88C0D0\">id<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">lora_src_address<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">publish_state<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">src_addr<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #81A1C1\">!<\/span><span style=\"color: #D8DEE9\">message<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">empty<\/span><span style=\"color: #D8DEE9FF\">()) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #88C0D0\">id<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">lora_message<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">publish_state<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">message<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #81A1C1\">!<\/span><span style=\"color: #D8DEE9\">rssi<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">empty<\/span><span style=\"color: #D8DEE9FF\">()) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #D8DEE9\">char<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">*<\/span><span style=\"color: #D8DEE9\">endptr<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #D8DEE9\">float<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">rssi_val<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">strtof<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">rssi<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">c_str<\/span><span style=\"color: #D8DEE9FF\">()<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">&amp;<\/span><span style=\"color: #D8DEE9\">endptr<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">endptr<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">!=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">rssi<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">c_str<\/span><span style=\"color: #D8DEE9FF\">()) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                      <\/span><span style=\"color: #88C0D0\">id<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">lora_rssi<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">publish_state<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">rssi_val<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #81A1C1\">!<\/span><span style=\"color: #D8DEE9\">snr<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">empty<\/span><span style=\"color: #D8DEE9FF\">()) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #D8DEE9\">char<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">*<\/span><span style=\"color: #D8DEE9\">endptr<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #D8DEE9\">float<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">snr_val<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">strtof<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">snr<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">c_str<\/span><span style=\"color: #D8DEE9FF\">()<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">&amp;<\/span><span style=\"color: #D8DEE9\">endptr<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> (<\/span><span style=\"color: #D8DEE9\">endptr<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">!=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">snr<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">c_str<\/span><span style=\"color: #D8DEE9FF\">()) <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                      <\/span><span style=\"color: #88C0D0\">id<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">lora_snr<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">publish_state<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #D8DEE9\">snr_val<\/span><span style=\"color: #D8DEE9FF\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                  <\/span><span style=\"color: #88C0D0\">ESP_LOGI<\/span><span style=\"color: #D8DEE9FF\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">LoRa<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Message from %s: %s (RSSI: %s dBm, SNR: %s dB)<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                           <\/span><span style=\"color: #D8DEE9\">src_addr<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">c_str<\/span><span style=\"color: #D8DEE9FF\">()<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">message<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">c_str<\/span><span style=\"color: #D8DEE9FF\">()<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">rssi<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">c_str<\/span><span style=\"color: #D8DEE9FF\">()<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">snr<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">c_str<\/span><span style=\"color: #D8DEE9FF\">())<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">                <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">              <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">          <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span><\/code><\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"<p>When building IoT systems, your choice of wireless protocol can make or break the project. WiFi is ubiquitous but power-hungry and range-limited; Bluetooth is great for short distances but fails through walls. After testing the REYAX RYLR998 LoRa modules using ESP32 nodes and ESPHome, I\u2019ve&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":3937,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[38],"tags":[42,49,132,133],"class_list":["post-3806","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news","tag-esphome","tag-home-assistant","tag-lora","tag-rylr998"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Review: REYAX RYLR998 LoRa Modules - ingeniousmakers.com<\/title>\n<meta name=\"description\" content=\"When building IoT systems, your choice of wireless protocol can make or break the project. WiFi is ubiquitous but power-hungry and range-limited; Bluetooth is great for short distances but fails through walls. After testing the REYAX RYLR998 LoRa modules using ESP32 nodes and ESPHome, I\u2019ve found a middle ground that offers incredible range and reliability without the overhead of a traditional network.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Review: REYAX RYLR998 LoRa Modules\" \/>\n<meta property=\"og:description\" content=\"When building IoT systems, your choice of wireless protocol can make or break the project. WiFi is ubiquitous but power-hungry and range-limited; Bluetooth is great for short distances but fails through walls. After testing the REYAX RYLR998 LoRa modules using ESP32 nodes and ESPHome, I\u2019ve found a middle ground that offers incredible range and reliability without the overhead of a traditional network.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/\" \/>\n<meta property=\"og:site_name\" content=\"ingeniousmakers.com\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-29T14:31:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-31T10:52:42+00:00\" \/>\n<meta name=\"author\" content=\"michel\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"Review: REYAX RYLR998 LoRa Modules\" \/>\n<meta name=\"twitter:description\" content=\"When building IoT systems, your choice of wireless protocol can make or break the project. WiFi is ubiquitous but power-hungry and range-limited; Bluetooth is great for short distances but fails through walls. After testing the REYAX RYLR998 LoRa modules using ESP32 nodes and ESPHome, I\u2019ve found a middle ground that offers incredible range and reliability without the overhead of a traditional network.\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"michel\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/index.php\\\/2025\\\/12\\\/29\\\/reyax-rylr998-lora-modules\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/index.php\\\/2025\\\/12\\\/29\\\/reyax-rylr998-lora-modules\\\/\"},\"author\":{\"name\":\"michel\",\"@id\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/#\\\/schema\\\/person\\\/f1d70771f1c76600487075757975bf43\"},\"headline\":\"Review: REYAX RYLR998 LoRa Modules\",\"datePublished\":\"2025-12-29T14:31:06+00:00\",\"dateModified\":\"2025-12-31T10:52:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/index.php\\\/2025\\\/12\\\/29\\\/reyax-rylr998-lora-modules\\\/\"},\"wordCount\":776,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/index.php\\\/2025\\\/12\\\/29\\\/reyax-rylr998-lora-modules\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/RYLR_thumb3.png\",\"keywords\":[\"esphome\",\"home assistant\",\"LoRa\",\"RYLR998\"],\"articleSection\":[\"News\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.ingeniousmakers.com\\\/index.php\\\/2025\\\/12\\\/29\\\/reyax-rylr998-lora-modules\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/index.php\\\/2025\\\/12\\\/29\\\/reyax-rylr998-lora-modules\\\/\",\"url\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/index.php\\\/2025\\\/12\\\/29\\\/reyax-rylr998-lora-modules\\\/\",\"name\":\"Review: REYAX RYLR998 LoRa Modules - ingeniousmakers.com\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/index.php\\\/2025\\\/12\\\/29\\\/reyax-rylr998-lora-modules\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/index.php\\\/2025\\\/12\\\/29\\\/reyax-rylr998-lora-modules\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/RYLR_thumb3.png\",\"datePublished\":\"2025-12-29T14:31:06+00:00\",\"dateModified\":\"2025-12-31T10:52:42+00:00\",\"description\":\"When building IoT systems, your choice of wireless protocol can make or break the project. WiFi is ubiquitous but power-hungry and range-limited; Bluetooth is great for short distances but fails through walls. After testing the REYAX RYLR998 LoRa modules using ESP32 nodes and ESPHome, I\u2019ve found a middle ground that offers incredible range and reliability without the overhead of a traditional network.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/index.php\\\/2025\\\/12\\\/29\\\/reyax-rylr998-lora-modules\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.ingeniousmakers.com\\\/index.php\\\/2025\\\/12\\\/29\\\/reyax-rylr998-lora-modules\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/index.php\\\/2025\\\/12\\\/29\\\/reyax-rylr998-lora-modules\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/RYLR_thumb3.png\",\"contentUrl\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/RYLR_thumb3.png\",\"width\":1240,\"height\":910},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/index.php\\\/2025\\\/12\\\/29\\\/reyax-rylr998-lora-modules\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Review: REYAX RYLR998 LoRa Modules\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/#website\",\"url\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/\",\"name\":\"Ingeniousmakers.com\",\"description\":\"Make it or break it!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/#organization\",\"name\":\"Ingeniousmakers.con\",\"url\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/cropped-cropped-logo_landscape_no_payoff_transparent.png\",\"contentUrl\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/cropped-cropped-logo_landscape_no_payoff_transparent.png\",\"width\":1905,\"height\":671,\"caption\":\"Ingeniousmakers.con\"},\"image\":{\"@id\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCeMzk2C5tbMkpsByg7Nbgyw\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/#\\\/schema\\\/person\\\/f1d70771f1c76600487075757975bf43\",\"name\":\"michel\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b08aad91cb210b8eeb8cccdd43555d1fa747a0c865eaab78016c4305357e29cc?s=96&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b08aad91cb210b8eeb8cccdd43555d1fa747a0c865eaab78016c4305357e29cc?s=96&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b08aad91cb210b8eeb8cccdd43555d1fa747a0c865eaab78016c4305357e29cc?s=96&r=g\",\"caption\":\"michel\"},\"sameAs\":[\"https:\\\/\\\/www.ingeniousmakers.com\"],\"url\":\"https:\\\/\\\/www.ingeniousmakers.com\\\/index.php\\\/author\\\/michel\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Review: REYAX RYLR998 LoRa Modules - ingeniousmakers.com","description":"When building IoT systems, your choice of wireless protocol can make or break the project. WiFi is ubiquitous but power-hungry and range-limited; Bluetooth is great for short distances but fails through walls. After testing the REYAX RYLR998 LoRa modules using ESP32 nodes and ESPHome, I\u2019ve found a middle ground that offers incredible range and reliability without the overhead of a traditional network.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/","og_locale":"en_US","og_type":"article","og_title":"Review: REYAX RYLR998 LoRa Modules","og_description":"When building IoT systems, your choice of wireless protocol can make or break the project. WiFi is ubiquitous but power-hungry and range-limited; Bluetooth is great for short distances but fails through walls. After testing the REYAX RYLR998 LoRa modules using ESP32 nodes and ESPHome, I\u2019ve found a middle ground that offers incredible range and reliability without the overhead of a traditional network.","og_url":"https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/","og_site_name":"ingeniousmakers.com","article_published_time":"2025-12-29T14:31:06+00:00","article_modified_time":"2025-12-31T10:52:42+00:00","author":"michel","twitter_card":"summary_large_image","twitter_title":"Review: REYAX RYLR998 LoRa Modules","twitter_description":"When building IoT systems, your choice of wireless protocol can make or break the project. WiFi is ubiquitous but power-hungry and range-limited; Bluetooth is great for short distances but fails through walls. After testing the REYAX RYLR998 LoRa modules using ESP32 nodes and ESPHome, I\u2019ve found a middle ground that offers incredible range and reliability without the overhead of a traditional network.","twitter_misc":{"Written by":"michel","Est. reading time":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/#article","isPartOf":{"@id":"https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/"},"author":{"name":"michel","@id":"https:\/\/www.ingeniousmakers.com\/#\/schema\/person\/f1d70771f1c76600487075757975bf43"},"headline":"Review: REYAX RYLR998 LoRa Modules","datePublished":"2025-12-29T14:31:06+00:00","dateModified":"2025-12-31T10:52:42+00:00","mainEntityOfPage":{"@id":"https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/"},"wordCount":776,"commentCount":0,"publisher":{"@id":"https:\/\/www.ingeniousmakers.com\/#organization"},"image":{"@id":"https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/#primaryimage"},"thumbnailUrl":"https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/RYLR_thumb3.png","keywords":["esphome","home assistant","LoRa","RYLR998"],"articleSection":["News"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/","url":"https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/","name":"Review: REYAX RYLR998 LoRa Modules - ingeniousmakers.com","isPartOf":{"@id":"https:\/\/www.ingeniousmakers.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/#primaryimage"},"image":{"@id":"https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/#primaryimage"},"thumbnailUrl":"https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/RYLR_thumb3.png","datePublished":"2025-12-29T14:31:06+00:00","dateModified":"2025-12-31T10:52:42+00:00","description":"When building IoT systems, your choice of wireless protocol can make or break the project. WiFi is ubiquitous but power-hungry and range-limited; Bluetooth is great for short distances but fails through walls. After testing the REYAX RYLR998 LoRa modules using ESP32 nodes and ESPHome, I\u2019ve found a middle ground that offers incredible range and reliability without the overhead of a traditional network.","breadcrumb":{"@id":"https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/#primaryimage","url":"https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/RYLR_thumb3.png","contentUrl":"https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/12\/RYLR_thumb3.png","width":1240,"height":910},{"@type":"BreadcrumbList","@id":"https:\/\/www.ingeniousmakers.com\/index.php\/2025\/12\/29\/reyax-rylr998-lora-modules\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.ingeniousmakers.com\/"},{"@type":"ListItem","position":2,"name":"Review: REYAX RYLR998 LoRa Modules"}]},{"@type":"WebSite","@id":"https:\/\/www.ingeniousmakers.com\/#website","url":"https:\/\/www.ingeniousmakers.com\/","name":"Ingeniousmakers.com","description":"Make it or break it!","publisher":{"@id":"https:\/\/www.ingeniousmakers.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.ingeniousmakers.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.ingeniousmakers.com\/#organization","name":"Ingeniousmakers.con","url":"https:\/\/www.ingeniousmakers.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.ingeniousmakers.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/03\/cropped-cropped-logo_landscape_no_payoff_transparent.png","contentUrl":"https:\/\/www.ingeniousmakers.com\/wp-content\/uploads\/2025\/03\/cropped-cropped-logo_landscape_no_payoff_transparent.png","width":1905,"height":671,"caption":"Ingeniousmakers.con"},"image":{"@id":"https:\/\/www.ingeniousmakers.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.youtube.com\/channel\/UCeMzk2C5tbMkpsByg7Nbgyw"]},{"@type":"Person","@id":"https:\/\/www.ingeniousmakers.com\/#\/schema\/person\/f1d70771f1c76600487075757975bf43","name":"michel","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/b08aad91cb210b8eeb8cccdd43555d1fa747a0c865eaab78016c4305357e29cc?s=96&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/b08aad91cb210b8eeb8cccdd43555d1fa747a0c865eaab78016c4305357e29cc?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b08aad91cb210b8eeb8cccdd43555d1fa747a0c865eaab78016c4305357e29cc?s=96&r=g","caption":"michel"},"sameAs":["https:\/\/www.ingeniousmakers.com"],"url":"https:\/\/www.ingeniousmakers.com\/index.php\/author\/michel\/"}]}},"_links":{"self":[{"href":"https:\/\/www.ingeniousmakers.com\/index.php\/wp-json\/wp\/v2\/posts\/3806","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ingeniousmakers.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ingeniousmakers.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ingeniousmakers.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ingeniousmakers.com\/index.php\/wp-json\/wp\/v2\/comments?post=3806"}],"version-history":[{"count":55,"href":"https:\/\/www.ingeniousmakers.com\/index.php\/wp-json\/wp\/v2\/posts\/3806\/revisions"}],"predecessor-version":[{"id":3979,"href":"https:\/\/www.ingeniousmakers.com\/index.php\/wp-json\/wp\/v2\/posts\/3806\/revisions\/3979"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ingeniousmakers.com\/index.php\/wp-json\/wp\/v2\/media\/3937"}],"wp:attachment":[{"href":"https:\/\/www.ingeniousmakers.com\/index.php\/wp-json\/wp\/v2\/media?parent=3806"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ingeniousmakers.com\/index.php\/wp-json\/wp\/v2\/categories?post=3806"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ingeniousmakers.com\/index.php\/wp-json\/wp\/v2\/tags?post=3806"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}