1<!DOCTYPE html> 2<html lang="en"> 3 <head> 4 <meta charset="utf-8" /> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 6 7 <title>Ubidots Blog</title> 8 <meta name="HandheldFriendly" content="True" /> 9 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 10 11 <link rel="preload" href="/blog/assets/css/app.css?v=0017488c26" as="style" /> 12 13 <link rel="preload" href="/blog/assets/css/home.css?v=0017488c26" as="style" /> 14 15 16 <link rel="stylesheet" type="text/css" href="/blog/assets/css/app.css?v=0017488c26" media="screen" /> 17 18 <link 19 rel="stylesheet" 20 type="text/css" 21 href="/blog/assets/css/home.css?v=0017488c26" 22 media="screen" 23 /> 24 25 26 <meta name="description" content="Thoughts, ideas, and tutorials on Industrial IoT"> 27 <link rel="icon" href="https://ubidots.com/blog/content/images/size/w256h256/2019/03/Ubidots-Icon-Blog.png" type="image/png"> 28 <link rel="canonical" href="https://ubidots.com/blog/"> 29 <meta name="referrer" content="no-referrer-when-downgrade"> 30 <link rel="next" href="https://ubidots.com/blog/page/2/"> 31 32 <meta property="og:site_name" content="Ubidots Blog"> 33 <meta property="og:type" content="website"> 34 <meta property="og:title" content="Ubidots Blog"> 35 <meta property="og:description" content="Thoughts, ideas, and tutorials on Industrial IoT"> 36 <meta property="og:url" content="https://ubidots.com/blog/"> 37 <meta property="og:image" content="https://ubidots.com/blog/content/images/2024/09/3-1.jpg"> 38 <meta property="article:publisher" content="https://www.facebook.com/ubidots"> 39 <meta name="twitter:card" content="summary_large_image"> 40 <meta name="twitter:title" content="Ubidots Blog"> 41 <meta name="twitter:description" content="Thoughts, ideas, and tutorials on Industrial IoT"> 42 <meta name="twitter:url" content="https://ubidots.com/blog/"> 43 <meta name="twitter:image" content="https://ubidots.com/blog/content/images/2024/09/3-2.jpg"> 44 <meta name="twitter:site" content="@ubidots"> 45 <meta property="og:image:width" content="1200"> 46 <meta property="og:image:height" content="675"> 47 48
48<script type="application/ld+json"> 49{ 50 "@context": "https://schema.org", 51 "@type": "WebSite", 52 "publisher": { 53 "@type": "Organization", 54 "name": "Ubidots Blog", 55 "url": "https://ubidots.com/blog/", 56 "logo": { 57 "@type": "ImageObject", 58 "url": "https://ubidots.com/blog/content/images/2024/09/logo-ghost-ubi.png" 59 } 60 }, 61 "url": "https://ubidots.com/blog/", 62 "image": { 63 "@type": "ImageObject", 64 "url": "https://ubidots.com/blog/content/images/2024/09/3.jpg", 65 "width": 1200, 66 "height": 675 67 }, 68 "mainEntityOfPage": "https://ubidots.com/blog/", 69 "description": "Thoughts, ideas, and tutorials on Industrial IoT" 70} 71 </script>
71 72 73 <meta name="generator" content="Ghost 5.94"> 74 <link rel="alternate" type="application/rss+xml" title="Ubidots Blog" href="https://ubidots.com/blog/rss/"> 75 76
76<script defer src="https://cdn.jsdelivr.net/ghost/sodo-search@~1.1/umd/sodo-search.min.js" data-key="fd5315fbaa778e48b56d6c05ee" data-styles="https://cdn.jsdelivr.net/ghost/sodo-search@~1.1/umd/main.css" data-sodo-search="https://ubidots.com/blog/" crossorigin="anonymous"></script>
76 77 78 <link href="https://ubidots.com/blog/webmentions/receive/" rel="webmention"> 79
79<script defer src="/blog/public/cards.min.js?v=0017488c26"></script>
79<style>:root {--ghost-accent-color: #15171A;}</style> 80 <link rel="stylesheet" type="text/css" href="/blog/public/cards.min.css?v=0017488c26"> 81 <link rel="alternate" hreflang="en" href="https://ubidots.com"> 82<link rel="alternate" hreflang="es" href="https://es.ubidots.com"> 83<link rel="alternate" hreflang="pt" href="https://pt.ubidots.com"> 84 85<!-- Google Tag Manager -->
86<script>
vendor: 327 bytes, lines 86-90
86(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 87new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 88j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 89'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 90})(window,document,'script','dataLayer','
90GTM-52ZSX8
vendor: 3 bytes, line 90
90');
90</script>
90 91<!-- End Google Tag Manager --> 92 93<!-- Agate theme --> 94<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.9.0/styles/agate.min.css">
95<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.9.0/highlight.min.js"></script>
95 96 97<!-- MailMunch for Ubidots Blog -->
98<script src="//a.mailmunch.co/app/v1/site.js" id="mailmunch-script" data-mailmunch-site-id="656543" async="async"></script>
98 99 100<!-- Google Search Console Ownership Verification Tag --> 101<meta name="google-site-verification" content="ZNtiTpPER3BFOumvzsL4DHCQqwxS1w8HWMDkBEz49KU" /> 102<meta name="google-site-verification" content="9GOdWzz0mMhv9rzGO2shzYFOviftJo17HCMHuR4o-Rk" /> 103 104<style> 105 /* Disable dark mode and force light mode */ 106 :root, [theme-mode=dark] { 107 --accent: #635bff; 108 --text-on-accent: #fff; 109 --background: #fff; 110 --foreground: #2f303a; 111 --body-text: #404040; 112 --light-text: #6b6b6b; 113 --border: #f2f2f2; 114 --slate: #f1f5f9; 115 --shine: #fabf17; 116 --success: #16a34a; 117 --danger: #b91c1c; 118 --gradient-background: hsla(0,0%,100%,0); 119 --translucent: hsla(0,0%,100%,.5); 120 --glow-opacity: 1; 121 --display-light-logo: inline-block; 122 --display-dark-logo: none; 123 } 124</style> 125 126
127<script> 128 document.addEventListener('DOMContentLoaded', function() { 129 console.log("Simplified script with host-specific UTM parameters loaded"); 130 131 // Determine utm_source based on the current page URL host 132 const currentHost = window.location.host; 133 let utmSource = 'ubidots_blog_en'; // Default for "ubidots.com/blog" 134 135 if (currentHost.includes('es.ubidots.com')) { 136 utmSource = 'ubidots_blog_es'; 137 } else if (currentHost.includes('pt.ubidots.com')) { 138 utmSource = 'ubidots_blog_pt'; 139 } else if (currentHost.includes('de.ubidots.com')) { 140 utmSource = 'ubidots_blog_de'; 141 } else if (currentHost.includes('fr.ubidots.com')) { 142 utmSource = 'ubidots_blog_fr'; 143 } 144 145 // Fixed UTM parameters with dynamic utm_source 146 const fixedUtmParams = { 147 utm_source: utmSource, 148 utm_medium: 'referral', 149 utm_campaign: document.title // Use the page title as the campaign name 150 }; 151 152 const targetDomain = 'ubidots.com'; // Replace with your signup site domain 153 154 // Function to append fixed UTM parameters to links 155 function appendFixedUtmParamsToLink(link) { 156 const url = new URL(link.href); 157 158 // Only append UTM params if the link doesn't already have them 159 if (!url.searchParams.has('utm_source')) { 160 Object.keys(fixedUtmParams).forEach(function(key) { 161 url.searchParams.set(key, fixedUtmParams[key]); 162 }); 163 link.href = url.toString(); 164 console.log("Appended fixed UTM params to link:", link.href); 165 } 166 } 167 168 // Function to append UTM parameters to all relevant links 169 function appendUtmToAllLinks() { 170 document.querySelectorAll('a').forEach(function(link) { 171 if (link.href.includes(targetDomain)) { 172 appendFixedUtmParamsToLink(link); 173 } 174 }); 175 } 176 177 // On page load, append UTM parameters to all internal links 178 appendUtmToAllLinks(); 179 180 // Listen for changes to ensure dynamically added links also get updated 181 const observer = new MutationObserver(function() { 182 appendUtmToAllLinks(); // Re-run UTM appending when the DOM changes 183 }); 184 185 // Observe the entire body for DOM changes 186 observer.observe(document.body, { childList: true, subtree: true }); 187 }); 188</script>
188 189
190<script async src="https://static.linguise.com/script-js/switcher.bundle.js?d=pk_vX7tijWMeUGlZlhfcZQWhZhGceGJVKTG"></script>
190 191 192 <style> 193 :root { 194 --accent: var(--ghost-accent-color); 195 --glow-1: #1180CC; 196 --glow-2: #00BCD4; 197 } 198 </style> 199 200 201 202 203 204 205 206 207 208 209 210 211 212 <style> 213 /** 214 * @license 215 * 216 * URL: https://github.com/vercel/geist-font 217 * © 2023 Vercel, made in collaboration with basement.studio 218 * 219 */ 220 @font-face { 221 font-family: "Geist Variable"; 222 src: url("/blog/assets/fonts/GeistVariableVF.woff2?v=0017488c26") format('woff2'); 223 font-weight: 200 700; 224 font-display: swap; 225 font-style: normal; 226 } 227</style> 228 229 230 <style> 231 :root { 232 --body-font: 'Geist Variable', var(--body-font-fallback); 233 --font-factor: 1.1; 234 } 235 </style> 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 <style> 251 /** 252 * @license 253 * 254 * URL: [email protected] 255 * © 2014-2019 Indian Type Foundry 256 * 257 */ 258 @font-face { 259 font-family: "Poppins Devanagari"; 260 src: url("/blog/assets/fonts/Poppins-VariableFont_wght.woff2?v=0017488c26") format('woff2'); 261 font-weight: 200 700; 262 font-display: swap; 263 font-style: normal; 264 } 265</style> 266 267 <style> 268 :root { 269 --title-font: 'Poppins Devanagari', var(--title-font-fallback); 270 } 271 </style> 272 273 274 275 276 277 278 279 280 281 282 <style> 283 /** 284 * @license 285 * 286 * URL: http://www.adobe.com 287 * © 2014 - 2021 Adobe Systems Incorporated 288 * 289 */ 290 @font-face { 291 font-family: "Source Serif 4"; 292 src: url("/blog/assets/fonts/SourceSerif4-VariableFont_opsz,wght.woff2?v=0017488c26") format('woff2'); 293 font-weight: 200 700; 294 font-display: swap; 295 font-style: normal; 296 } 297</style> 298 299 300 301 <style> 302 :root { 303 --post-body-font: 'Source Serif 4', var(--post-body-font-fallback); 304 --post-font-factor: 1.15; 305 } 306 </style> 307 308 309 310 311 312
312<script> 313 if (typeof Storage !== 'undefined') { 314 const savedThemeMode = localStorage.getItem('glow-theme-mode') 315 const html = document.querySelector('html') 316 if (savedThemeMode && savedThemeMode !== 'system') { 317 html.setAttribute('theme-mode', savedThemeMode) 318 } else { 319 const isSystemDark = window.matchMedia 320 && window.matchMedia('(prefers-color-scheme: dark)').matches 321 const themeMode = isSystemDark ? 'dark' : 'light' 322 html.setAttribute('theme-mode', themeMode) 323 } 324 } 325 </script>
325 326 </head> 327 <body class="home-template"> 328 329<header class="gl-header js-header" x-data="header()" @click.outside="closeMobileMenu"> 330 <div class="gl-header__wrapper"> 331 <div class="gl-header__brand"> 332 <button 333 class="gl-header__menu-btn" 334 :class="{'open': isMobileMenuOpen()}" 335 @click.stop="toggleMobileMenu" 336 > 337 <div></div> 338 <div></div> 339 <div></div> 340 <span class="sr-only">Toggle menu</span> 341 </button> 342 343<a 344 href="https://ubidots.com" 345 title="Ubidots Blog" 346 class="gl-logo " 347> 348 <img 349 src="https://ubidots.com/blog/content/images/2024/09/logo-ghost-ubi.png" 350 alt="" 351 width="96" 352 height="32" 353 class="" 354 > 355</a> 356 </div> 357 <div class="gl-header__actions"> 358 <div class="gl-header__menu-nav" :class="{'open': isMobileMenuOpen()}"> 359 <nav class="gl-header__nav" aria-label="Main navigation"> 360 <ul> 361 362 <li class="nav-home"> 363 <a href="https://ubidots.com"> 364 Home 365 </a> 366 </li> 367 <li class="nav-platform"> 368 <a href="https://ubidots.com/platform"> 369 Platform 370 </a> 371 </li> 372 <li class="nav-pricing"> 373 <a href="https://ubidots.com/pricing"> 374 Pricing 375 </a> 376 </li> 377 <li class="nav-create-free-trial"> 378 <a href="https://ubidots.com/signup"> 379 Create free trial! 380 </a> 381 </li> 382 383 </ul> 384 </nav> 385 </div> 386 <div class="gl-header__actions__ctas"> 387 <button class="gl-header__search-btn" data-ghost-search> 388 389 <svg 390 width="24" 391 height="24" 392 class="gl-icon" 393 > 394 <use href="/blog/assets/images/icons.svg?v=0017488c26#search" /> 395 </svg> 396 <span class="sr-only">Search</span> 397 </button> 398 <span class="gl-header__actions__account-cta "> 399 400 </span> 401 </div> 402 </div> 403 </div> 404</header> 405
406<script> 407 function header() { 408 return { 409 showMobileMenu: false, 410 toggleMobileMenu() { 411 this.showMobileMenu = !this.showMobileMenu 412 }, 413 closeMobileMenu() { 414 this.showMobileMenu = false 415 }, 416 isMobileMenuOpen() { 417 return this.showMobileMenu === true 418 }, 419 } 420 } 421</script>
421 422 423 <div class="gl-main-container"> 424 <div class="gl-main-container__content"> 425 426 427 428 429<main class=" space-bottom-page "> 430 431<section class="gl-home-header "> 432 <div class="gl-home-header__media"> 433 434 435<div class="gl-glow in-home-header in-top-page large-background glow-1"></div> 436<div class="gl-glow in-home-header in-top-page large-background glow-2"></div> 437 <img 438 src="/blog/content/images/size/w1200/2025/08/hero.jpg" 439 srcset=" 440 /blog/content/images/size/w720/2025/08/hero.jpg 720w, 441 /blog/content/images/size/w1200/2025/08/hero.jpg 1200w, 442 /blog/content/images/size/w2000/2025/08/hero.jpg 2000w 443 " 444 sizes=" 445 (max-width: 48rem) 100vw, 446 (max-width: 64rem) 100vw, 447 100vw 448 " 449 width="1512" 450 height="620" 451 alt="" 452 class="gl-home-header__image js-home-header-image" 453 > 454 </div> 455 <div class="gl-wrapper"> 456 <div class="gl-home-header__content"> 457 <div class="gl-home-header__main"> 458 <h1 class="gl-home-header__title"> 459 Industrial Automation Meets The Cloud 460 </h1> 461 <p class="gl-home-header__description"> 462 A blog about Industrial IoT, Smart Manufacturing, and Digital Transformation 463 </p> 464 </div> 465 </div> 466 </div> 467</section> 468 <div class="gl-featured-section latest-posts"> 469 <div class="gl-wrapper"> 470 <div class="gl-featured-section__block"> 471 <h2 class="gl-featured-section__title"> 472 <a href="https://ubidots.com/blog/latest"> 473 Latest Posts 474 475 <svg 476 width="20" 477 height="20" 478 class="gl-icon" 479 > 480 <use href="/blog/assets/images/icons.svg?v=0017488c26#chevron-right" /> 481 </svg> 482 </a> 483 </h2> 484 <div class="gl-featured-section__grid"> 485 486<article class="gl-post-card in-featured-section post tag-energy-management tag-industrial-iot tag-cellular-iot tag-modbus tag-mqtt tag-lorawan public first "> 487 488<div class="gl-post-card__metas"> 489 <div class="gl-post-card__tags"> 490 <a 491 href="https://ubidots.com/blog/tag/energy-management/" 492 class="gl-post-card__tag" 493 > 494 Energy Management 495 </a> 496 </div> 497 <div class="gl-post-card__authors"> 498 <div class="gl-post-card__avatars"> 499 <a 500 href="/blog/author/agustin/" 501 class="gl-post-card__avatar author-0" 502 aria-hidden="true" 503 > 504 <img 505 data-src="/blog/assets/images/avatar.jpg?v=0017488c26" 506 alt="" 507 width="24" 508 height="24" 509 class="gl-post-card__avatar__default lazy" 510 aria-hidden="true" 511 > 512 <img 513 data-src="/blog/content/images/size/w100/2019/03/agustin-compressor.png" 514 alt="Agustin Pelaez" 515 width="24" 516 height="24" 517 class="gl-post-card__avatar__image lazy" 518 > 519 </a> 520 </div> 521 <div class="gl-post-card__names"> 522 <a href="/blog/author/agustin/">Agustin Pelaez</a> 523 </div> 524 </div> 525</div> 526 <div class="gl-post-card__main"> 527 <a 528 class="gl-post-card__image" 529 href="/blog/cellular-energy-monitoring/" 530 aria-hidden="true" 531 tabindex="-1" 532 > 533 <img 534 data-src="/blog/content/images/size/w720/2026/09/cellular-energy-monitoring-hero.png" 535 alt="Five cellular approaches to an industrial energy monitoring system, compared" 536 width="300" 537 height="200" 538 class="lazy" 539 /> 540 </a> 541 <div class="gl-post-card__main-content"> 542 <div class="gl-post-card__metas-in-featured"> 543 544<div class="gl-post-card__metas"> 545 <div class="gl-post-card__tags"> 546 <a 547 href="https://ubidots.com/blog/tag/energy-management/" 548 class="gl-post-card__tag" 549 > 550 Energy Management 551 </a> 552 </div> 553 <div class="gl-post-card__authors"> 554 <div class="gl-post-card__avatars"> 555 <a 556 href="/blog/author/agustin/" 557 class="gl-post-card__avatar author-0" 558 aria-hidden="true" 559 > 560 <img 561 data-src="/blog/assets/images/avatar.jpg?v=0017488c26" 562 alt="" 563 width="24" 564 height="24" 565 class="gl-post-card__avatar__default lazy" 566 aria-hidden="true" 567 > 568 <img 569 data-src="/blog/content/images/size/w100/2019/03/agustin-compressor.png" 570 alt="Agustin Pelaez" 571 width="24" 572 height="24" 573 class="gl-post-card__avatar__image lazy" 574 > 575 </a> 576 </div> 577 <div class="gl-post-card__names"> 578 <a href="/blog/author/agustin/">Agustin Pelaez</a> 579 </div> 580 </div> 581</div> 582 </div> 583 <div class="gl-post-card__main-text"> 584 <h2 class="gl-post-card__title"> 585 <a href="/blog/cellular-energy-monitoring/"> 586 Industrial Energy Monitoring Over Cellular: 5 Approaches 587 </a> 588 </h2> 589 <p class="gl-post-card__excerpt"> 590 Five ways to backhaul an industrial energy meter over cellular, with current 2026 hardware, real deployments, and a costed twelve-point scenario. 591 </p> 592 </div> 593 <div class="gl-post-card__datetime"> 594 <div class="gl-post-card__time"> 595 <time datetime="2026-09-10"> 596 Sep 10, 2026 597 </time>
598 <span>·</span> 599 <span> 600 21 min read 601 </span> 602 </div> 603 </div> 604 </div> 605 </div> 606</article> 607 608<article class="gl-post-card in-featured-section post tag-predictive-maintenance public "> 609 610<div class="gl-post-card__metas"> 611 <div class="gl-post-card__tags"> 612 <a 613 href="https://ubidots.com/blog/tag/predictive-maintenance/" 614 class="gl-post-card__tag" 615 > 616 Predictive Maintenance 617 </a> 618 </div> 619 <div class="gl-post-card__authors"> 620 <div class="gl-post-card__avatars"> 621 <a 622 href="/blog/author/agustin/" 623 class="gl-post-card__avatar author-0" 624 aria-hidden="true" 625 > 626 <img 627 data-src="/blog/assets/images/avatar.jpg?v=0017488c26" 628 alt="" 629 width="24" 630 height="24" 631 class="gl-post-card__avatar__default lazy" 632 aria-hidden="true" 633 > 634 <img 635 data-src="/blog/content/images/size/w100/2019/03/agustin-compressor.png" 636 alt="Agustin Pelaez" 637 width="24" 638 height="24" 639 class="gl-post-card__avatar__image lazy" 640 > 641 </a> 642 </div> 643 <div class="gl-post-card__names"> 644 <a href="/blog/author/agustin/">Agustin Pelaez</a> 645 </div> 646 </div> 647</div> 648 <div class="gl-post-card__main"> 649 <a 650 class="gl-post-card__image" 651 href="/blog/iot-predictive-maintenance/" 652 aria-hidden="true" 653 tabindex="-1" 654 > 655 <img 656 data-src="/blog/content/images/size/w720/2021/12/iot-predictive-maintenance.jpg" 657 alt="IoT predictive maintenance concept showing connected sensors monitoring industrial equipment condition" 658 width="300" 659 height="200" 660 class="lazy" 661 /> 662 </a> 663 <div class="gl-post-card__main-content"> 664 <div class="gl-post-card__metas-in-featured"> 665 666<div class="gl-post-card__metas"> 667 <div class="gl-post-card__tags"> 668 <a 669 href="https://ubidots.com/blog/tag/predictive-maintenance/" 670 class="gl-post-card__tag" 671 > 672 Predictive Maintenance 673 </a> 674 </div> 675 <div class="gl-post-card__authors"> 676 <div class="gl-post-card__avatars"> 677 <a 678 href="/blog/author/agustin/" 679 class="gl-post-card__avatar author-0" 680 aria-hidden="true" 681 > 682 <img 683 data-src="/blog/assets/images/avatar.jpg?v=0017488c26" 684 alt="" 685 width="24" 686 height="24" 687 class="gl-post-card__avatar__default lazy" 688 aria-hidden="true" 689 > 690 <img 691 data-src="/blog/content/images/size/w100/2019/03/agustin-compressor.png" 692 alt="Agustin Pelaez" 693 width="24" 694 height="24" 695 class="gl-post-card__avatar__image lazy" 696 > 697 </a> 698 </div> 699 <div class="gl-post-card__names"> 700 <a href="/blog/author/agustin/">Agustin Pelaez</a> 701 </div> 702 </div> 703</div> 704 </div> 705 <div class="gl-post-card__main-text"> 706 <h2 class="gl-post-card__title"> 707 <a href="/blog/iot-predictive-maintenance/"> 708 IoT Predictive Maintenance: 10 Benefits, Backed by Data 709 </a> 710 </h2> 711 <p class="gl-post-card__excerpt"> 712 The 10 biggest predictive maintenance benefits in IoT projects â with NIST and McKinsey figures, a cost breakdown, and how to choose a platform. 713 </p> 714 </div> 715 <div class="gl-post-card__datetime"> 716 <div class="gl-post-card__time"> 717 <time datetime="2026-08-27"> 718 Aug 27, 2026 719 </time> 720 <span>·</span> 721 <span> 722 14 min read 723 </span> 724 </div> 725 </div> 726 </div> 727 </div> 728</article> 729 730<article class="gl-post-card in-featured-section post tag-ai tag-machine-learning public "> 731 732<div class="gl-post-card__metas"> 733 <div class="gl-post-card__tags"> 734 <a
735 href="https://ubidots.com/blog/tag/ai/" 736 class="gl-post-card__tag" 737 > 738 AI 739 </a> 740 </div> 741 <div class="gl-post-card__authors"> 742 <div class="gl-post-card__avatars"> 743 <a 744 href="/blog/author/ubidots/" 745 class="gl-post-card__avatar author-0" 746 aria-hidden="true" 747 > 748 <img 749 data-src="/blog/assets/images/avatar.jpg?v=0017488c26" 750 alt="" 751 width="24" 752 height="24" 753 class="gl-post-card__avatar__default lazy" 754 aria-hidden="true" 755 > 756 </a> 757 </div> 758 <div class="gl-post-card__names"> 759 <a href="/blog/author/ubidots/">Ubidots</a> 760 </div> 761 </div> 762</div> 763 <div class="gl-post-card__main"> 764 <a 765 class="gl-post-card__image" 766 href="/blog/ml-vs-llm-5-prompts-that-break-llms-and-how-ml-tool-calling-fixes-them/" 767 aria-hidden="true" 768 tabindex="-1" 769 > 770 <img 771 data-src="/blog/content/images/size/w720/2026/09/scene-agent-pump.png" 772 alt="" 773 width="300" 774 height="200" 775 class="lazy" 776 /> 777 </a> 778 <div class="gl-post-card__main-content"> 779 <div class="gl-post-card__metas-in-featured"> 780 781<div class="gl-post-card__metas"> 782 <div class="gl-post-card__tags"> 783 <a 784 href="https://ubidots.com/blog/tag/ai/" 785 class="gl-post-card__tag" 786 > 787 AI 788 </a> 789 </div> 790 <div class="gl-post-card__authors"> 791 <div class="gl-post-card__avatars"> 792 <a 793 href="/blog/author/ubidots/" 794 class="gl-post-card__avatar author-0" 795 aria-hidden="true" 796 > 797 <img 798 data-src="/blog/assets/images/avatar.jpg?v=0017488c26" 799 alt="" 800 width="24" 801 height="24" 802 class="gl-post-card__avatar__default lazy" 803 aria-hidden="true" 804 > 805 </a> 806 </div> 807 <div class="gl-post-card__names"> 808 <a href="/blog/author/ubidots/">Ubidots</a> 809 </div> 810 </div> 811</div> 812 </div> 813 <div class="gl-post-card__main-text"> 814 <h2 class="gl-post-card__title"> 815 <a href="/blog/ml-vs-llm-5-prompts-that-break-llms-and-how-ml-tool-calling-fixes-them/"> 816 ML vs LLM: 5 Prompts That Break LLMs â and How ML Tool-Calling Fixes Them 817 </a> 818 </h2> 819 <p class="gl-post-card__excerpt"> 820 Yes, your LLM can run Python now. Here are five IoT prompts where that still isnât enough â and the ML tool-calling pattern that fixes each one. 821 </p> 822 </div> 823 <div class="gl-post-card__datetime"> 824 <div class="gl-post-card__time"> 825 <time datetime="2026-07-09"> 826 Jul 09, 2026 827 </time> 828 <span>·</span> 829 <span> 830 16 min read 831 </span> 832 </div> 833 </div> 834 </div> 835 </div> 836</article> 837 838<article class="gl-post-card in-featured-section post tag-eagle-io tag-iot-platforms tag-scada tag-environmental-monitoring-2 tag-comparison public "> 839 840<div class="gl-post-card__metas"> 841 <div class="gl-post-card__tags"> 842 <a 843 href="https://ubidots.com/blog/tag/eagle-io/" 844 class="gl-post-card__tag" 845 > 846 eagle-io 847 </a> 848 </div> 849 <div class="gl-post-card__authors"> 850 <div class="gl-post-card__avatars"> 851 <a 852 href="/blog/author/ubidots/" 853 class="gl-post-card__avatar author-0" 854 aria-hidden="true" 855 > 856 <img 857 data-src="/blog/assets/images/avatar.jpg?v=0017488c26" 858 alt="" 859 width="24" 860 height="24" 861 class="gl-post-card__avatar__default lazy" 862 aria-hidden="true" 863 > 864 </a> 865 </div> 866 <div class="gl-post-card__names"> 867 <a href="/blog/author/ubidots/">Ubidots</a> 868 </div> 869 </div> 870</div> 871 <div class="gl-post-card__main"> 872 <a 873 class="gl-post-card__image" 874 href="/blog/eagle-io-alternatives-ubidots/" 875 aria-hidden="true" 876 tabindex="-1" 877 > 878 <img
879 data-src="/blog/content/images/size/w720/2026/05/eagle-io-alternative-ubidots-dashboard-comparison.webp" 880 alt="Ubidots dashboard vs Eagle.io folder-tree UI â Eagle.io alternative comparison" 881 width="300" 882 height="200" 883 class="lazy" 884 /> 885 </a> 886 <div class="gl-post-card__main-content"> 887 <div class="gl-post-card__metas-in-featured"> 888 889<div class="gl-post-card__metas"> 890 <div class="gl-post-card__tags"> 891 <a 892 href="https://ubidots.com/blog/tag/eagle-io/" 893 class="gl-post-card__tag" 894 > 895 eagle-io 896 </a> 897 </div> 898 <div class="gl-post-card__authors"> 899 <div class="gl-post-card__avatars"> 900 <a 901 href="/blog/author/ubidots/" 902 class="gl-post-card__avatar author-0" 903 aria-hidden="true" 904 > 905 <img 906 data-src="/blog/assets/images/avatar.jpg?v=0017488c26" 907 alt="" 908 width="24" 909 height="24" 910 class="gl-post-card__avatar__default lazy" 911 aria-hidden="true" 912 > 913 </a> 914 </div> 915 <div class="gl-post-card__names"> 916 <a href="/blog/author/ubidots/">Ubidots</a> 917 </div> 918 </div> 919</div> 920 </div> 921 <div class="gl-post-card__main-text"> 922 <h2 class="gl-post-card__title"> 923 <a href="/blog/eagle-io-alternatives-ubidots/"> 924 Eagle.io Alternatives: How Ubidots Compares After the Bentley Acquisition (2026) 925 </a> 926 </h2> 927 <p class="gl-post-card__excerpt"> 928 "No development for 3 years" â and the bill is climbing toward $20K/month. Here's how Ubidots compares to Eagle.io on pricing, multi-tenancy, Python scripting, and white labeling after the Bentley acquisition. 929 </p> 930 </div> 931 <div class="gl-post-card__datetime"> 932 <div class="gl-post-card__time"> 933 <time datetime="2026-05-26"> 934 May 26, 2026 935 </time> 936 <span>·</span> 937 <span> 938 17 min read 939 </span> 940 </div> 941 </div> 942 </div> 943 </div> 944</article> 945 946<article class="gl-post-card in-featured-section post tag-industrial-iot tag-iot tag-water-management tag-scada tag-modbus public "> 947 948<div class="gl-post-card__metas"> 949 <div class="gl-post-card__tags"> 950 <a 951 href="https://ubidots.com/blog/tag/industrial-iot/" 952 class="gl-post-card__tag" 953 > 954 Industrial IoT 955 </a> 956 </div> 957 <div class="gl-post-card__authors"> 958 <div class="gl-post-card__avatars"> 959 <a 960 href="/blog/author/cristina/" 961 class="gl-post-card__avatar author-0" 962 aria-hidden="true" 963 > 964 <img 965 data-src="/blog/assets/images/avatar.jpg?v=0017488c26" 966 alt="" 967 width="24" 968 height="24" 969 class="gl-post-card__avatar__default lazy" 970 aria-hidden="true" 971 > 972 <img 973 data-src="/blog/content/images/size/w100/2019/06/Image-from-iOS--1--1.jpg" 974 alt="Cristina Botero" 975 width="24" 976 height="24" 977 class="gl-post-card__avatar__image lazy" 978 > 979 </a> 980 </div> 981 <div class="gl-post-card__names"> 982 <a href="/blog/author/cristina/">Cristina Botero</a> 983 </div> 984 </div> 985</div> 986 <div class="gl-post-card__main"> 987 <a 988 class="gl-post-card__image" 989 href="/blog/iot-water-infrastructure-monitoring/" 990 aria-hidden="true" 991 tabindex="-1" 992 > 993 <img 994 data-src="/blog/content/images/size/w720/2025/03/abc-1.png" 995 alt="" 996 width="300" 997 height="200" 998 class="lazy" 999 /> 1000 </a> 1001 <div class="gl-post-card__main-content"> 1002 <div class="gl-post-card__metas-in-featured"> 1003 1004<div class="gl-post-card__metas"> 1005 <div class="gl-post-card__tags"> 1006 <a 1007 href="https://ubidots.com/blog/tag/industrial-iot/" 1008 class="gl-post-card__tag" 1009 > 1010 Industrial IoT 1011 </a> 1012 </div> 1013 <div class="gl-post-card__authors"> 1014 <div class="gl-post-card__avatars"> 1015 <a 1016 href="/blog/author/cristina/" 1017 class="gl-post-card__avatar author-0" 1018 aria-hidden="true" 1019 > 1020 <img 1021 data-src="/blog/assets/images/avatar.jpg?v=0017488c26" 1022 alt="" 1023 width="24" 1024 height="24" 1025 class="gl-post-card__avatar__default lazy" 1026 aria-hidden="true" 1027 > 1028 <img 1029 data-src="/blog/content/images/size/w100/2019/06/Image-from-iOS--1--1.jpg" 1030 alt="Cristina Botero" 1031 width="24" 1032 height="24" 1033 class="gl-post-card__avatar__image lazy" 1034 > 1035 </a> 1036 </div> 1037 <div class="gl-post-card__names"> 1038 <a href="/blog/author/cristina/">Cristina Botero</a> 1039 </div> 1040 </div> 1041</div> 1042 </div> 1043 <div class="gl-post-card__main-text"> 1044 <h2 class="gl-post-card__title">
1045 <a href="/blog/iot-water-infrastructure-monitoring/"> 1046 IoT Water Infrastructure Monitoring: How Smart Pumping Stations Cut Costs by 15% 1047 </a> 1048 </h2> 1049 <p class="gl-post-card__excerpt"> 1050 IoT water infrastructure monitoring enables water utilities to cut energy costs by 15% and reduce on-site inspections by 18%. This guide covers how remote monitoring works for pumping stations, how it compares to SCADA, and includes a real deployment case study from Guayaquil, Ecuador. 1051 </p> 1052 </div> 1053 <div class="gl-post-card__datetime"> 1054 <div class="gl-post-card__time"> 1055 <time datetime="2026-02-12"> 1056 Feb 12, 2026 1057 </time> 1058 <span>·</span> 1059 <span> 1060 9 min read 1061 </span> 1062 </div> 1063 </div> 1064 </div> 1065 </div> 1066</article> 1067 1068<article class="gl-post-card in-featured-section post tag-industrial-iot tag-energy-management tag-modbus tag-predictive-maintenance tag-scada public "> 1069 1070<div class="gl-post-card__metas"> 1071 <div class="gl-post-card__tags"> 1072 <a 1073 href="https://ubidots.com/blog/tag/industrial-iot/" 1074 class="gl-post-card__tag" 1075 > 1076 Industrial IoT 1077 </a> 1078 </div> 1079 <div class="gl-post-card__authors"> 1080 <div class="gl-post-card__avatars"> 1081 <a 1082 href="/blog/author/agustin/" 1083 class="gl-post-card__avatar author-0" 1084 aria-hidden="true" 1085 > 1086 <img 1087 data-src="/blog/assets/images/avatar.jpg?v=0017488c26" 1088 alt="" 1089 width="24" 1090 height="24" 1091 class="gl-post-card__avatar__default lazy" 1092 aria-hidden="true" 1093 > 1094 <img 1095 data-src="/blog/content/images/size/w100/2019/03/agustin-compressor.png" 1096 alt="Agustin Pelaez" 1097 width="24" 1098 height="24" 1099 class="gl-post-card__avatar__image lazy" 1100 > 1101 </a> 1102 </div> 1103 <div class="gl-post-card__names"> 1104 <a href="/blog/author/agustin/">Agustin Pelaez</a> 1105 </div> 1106 </div> 1107</div> 1108 <div class="gl-post-card__main"> 1109 <a 1110 class="gl-post-card__image" 1111 href="/blog/industrial-iot-applications/" 1112 aria-hidden="true" 1113 tabindex="-1" 1114 > 1115 <img 1116 data-src="/blog/content/images/size/w720/2026/01/979540537-1.jpg" 1117 alt="" 1118 width="300" 1119 height="200" 1120 class="lazy" 1121 /> 1122 </a> 1123 <div class="gl-post-card__main-content"> 1124 <div class="gl-post-card__metas-in-featured"> 1125 1126<div class="gl-post-card__metas"> 1127 <div class="gl-post-card__tags"> 1128 <a 1129 href="https://ubidots.com/blog/tag/industrial-iot/" 1130 class="gl-post-card__tag" 1131 > 1132 Industrial IoT 1133 </a> 1134 </div> 1135 <div class="gl-post-card__authors"> 1136 <div class="gl-post-card__avatars"> 1137 <a 1138 href="/blog/author/agustin/" 1139 class="gl-post-card__avatar author-0" 1140 aria-hidden="true" 1141 > 1142 <img 1143 data-src="/blog/assets/images/avatar.jpg?v=0017488c26" 1144 alt="" 1145 width="24" 1146 height="24" 1147 class="gl-post-card__avatar__default lazy" 1148 aria-hidden="true" 1149 > 1150 <img 1151 data-src="/blog/content/images/size/w100/2019/03/agustin-compressor.png" 1152 alt="Agustin Pelaez" 1153 width="24" 1154 height="24" 1155 class="gl-post-card__avatar__image lazy" 1156 > 1157 </a> 1158 </div> 1159 <div class="gl-post-card__names"> 1160 <a href="/blog/author/agustin/">Agustin Pelaez</a> 1161 </div> 1162 </div> 1163</div> 1164 </div> 1165 <div class="gl-post-card__main-text"> 1166 <h2 class="gl-post-card__title"> 1167 <a href="/blog/industrial-iot-applications/"> 1168 5 Industrial IoT Applications With Real Examples (2026) 1169 </a> 1170 </h2> 1171 <p class="gl-post-card__excerpt">
1172 From quality control to energy efficiency and remote services, discover the five Industrial IoT applications driving real results in 2026, with concrete examples, technologies, and measurable business impact. 1173 </p> 1174 </div> 1175 <div class="gl-post-card__datetime"> 1176 <div class="gl-post-card__time"> 1177 <time datetime="2026-01-13"> 1178 Jan 13, 2026 1179 </time> 1180 <span>·</span> 1181 <span> 1182 13 min read 1183 </span> 1184 </div> 1185 </div> 1186 </div> 1187 </div> 1188</article> 1189 1190<article class="gl-post-card in-featured-section post tag-scada public "> 1191 1192<div class="gl-post-card__metas"> 1193 <div class="gl-post-card__tags"> 1194 <a 1195 href="https://ubidots.com/blog/tag/scada/" 1196 class="gl-post-card__tag" 1197 > 1198 scada 1199 </a> 1200 </div> 1201 <div class="gl-post-card__authors"> 1202 <div class="gl-post-card__avatars"> 1203 <a 1204 href="/blog/author/agustin/" 1205 class="gl-post-card__avatar author-0" 1206 aria-hidden="true" 1207 > 1208 <img 1209 data-src="/blog/assets/images/avatar.jpg?v=0017488c26" 1210 alt="" 1211 width="24" 1212 height="24" 1213 class="gl-post-card__avatar__default lazy" 1214 aria-hidden="true" 1215 > 1216 <img 1217 data-src="/blog/content/images/size/w100/2019/03/agustin-compressor.png" 1218 alt="Agustin Pelaez" 1219 width="24" 1220 height="24" 1221 class="gl-post-card__avatar__image lazy" 1222 > 1223 </a> 1224 </div> 1225 <div class="gl-post-card__names"> 1226 <a href="/blog/author/agustin/">Agustin Pelaez</a> 1227 </div> 1228 </div> 1229</div> 1230 <div class="gl-post-card__main"> 1231 <a 1232 class="gl-post-card__image" 1233 href="/blog/what-is-scada/" 1234 aria-hidden="true" 1235 tabindex="-1" 1236 > 1237 <img 1238 data-src="/blog/content/images/size/w720/2024/10/SCADA-feature-image.jpg" 1239 alt="" 1240 width="300" 1241 height="200" 1242 class="lazy" 1243 /> 1244 </a> 1245 <div class="gl-post-card__main-content"> 1246 <div class="gl-post-card__metas-in-featured"> 1247 1248<div class="gl-post-card__metas"> 1249 <div class="gl-post-card__tags"> 1250 <a 1251 href="https://ubidots.com/blog/tag/scada/" 1252 class="gl-post-card__tag" 1253 > 1254 scada 1255 </a> 1256 </div> 1257 <div class="gl-post-card__authors"> 1258 <div class="gl-post-card__avatars"> 1259 <a 1260 href="/blog/author/agustin/" 1261 class="gl-post-card__avatar author-0" 1262 aria-hidden="true" 1263 > 1264 <img 1265 data-src="/blog/assets/images/avatar.jpg?v=0017488c26" 1266 alt="" 1267 width="24" 1268 height="24" 1269 class="gl-post-card__avatar__default lazy" 1270 aria-hidden="true" 1271 > 1272 <img 1273 data-src="/blog/content/images/size/w100/2019/03/agustin-compressor.png" 1274 alt="Agustin Pelaez" 1275 width="24" 1276 height="24" 1277 class="gl-post-card__avatar__image lazy" 1278 > 1279 </a> 1280 </div> 1281 <div class="gl-post-card__names"> 1282 <a href="/blog/author/agustin/">Agustin Pelaez</a> 1283 </div> 1284 </div> 1285</div> 1286 </div> 1287 <div class="gl-post-card__main-text"> 1288 <h2 class="gl-post-card__title"> 1289 <a href="/blog/what-is-scada/"> 1290 What is SCADA? Supervisory Control & Data Acquisition Explained 1291 </a> 1292 </h2> 1293 <p class="gl-post-card__excerpt"> 1294 Learn what a SCADA system is, how it works, components, benefits, and why cloud-based SCADA is powering Industry 4.0âcomplete guide in under 5 minutes. 1295 </p> 1296 </div> 1297 <div class="gl-post-card__datetime"> 1298 <div class="gl-post-card__time"> 1299 <time datetime="2025-07-06"> 1300 Jul 06, 2025 1301 </time> 1302 <span>·</span> 1303 <span> 1304 15 min read 1305 </span> 1306 </div> 1307 </div> 1308 </div> 1309 </div> 1310</article> 1311 1312<article class="gl-post-card in-featured-section post public no-primary-tag "> 1313 1314<div class="gl-post-card__metas"> 1315 <div class="gl-post-card__tags"> 1316 </div> 1317 <div class="gl-post-card__authors"> 1318 <div class="gl-post-card__avatars"> 1319 <a 1320 href="/blog/author/agustin/" 1321 class="gl-post-card__avatar author-0" 1322 aria-hidden="true" 1323 > 1324 <img 1325 data-src="/blog/assets/images/avatar.jpg?v=0017488c26" 1326 alt="" 1327 width="24" 1328 height="24" 1329 class="gl-post-card__avatar__default lazy" 1330 aria-hidden="true" 1331 > 1332 <img 1333 data-src="/blog/content/images/size/w100/2019/03/agustin-compressor.png" 1334 alt="Agustin Pelaez" 1335 width="24" 1336 height="24" 1337 class="gl-post-card__avatar__image lazy" 1338 > 1339 </a> 1340 </div> 1341 <div class="gl-post-card__names"> 1342 <a href="/blog/author/agustin/">Agustin Pelaez</a> 1343 </div> 1344 </div> 1345</div> 1346 <div class="gl-post-card__main"> 1347 <a 1348 class="gl-post-card__image" 1349 href="/blog/aws-iot-core/" 1350 aria-hidden="true" 1351 tabindex="-1" 1352 > 1353 <img
1354 data-src="/blog/content/images/size/w720/2025/06/1.png" 1355 alt="" 1356 width="300" 1357 height="200" 1358 class="lazy" 1359 /> 1360 </a> 1361 <div class="gl-post-card__main-content"> 1362 <div class="gl-post-card__metas-in-featured"> 1363 1364<div class="gl-post-card__metas"> 1365 <div class="gl-post-card__tags"> 1366 </div> 1367 <div class="gl-post-card__authors"> 1368 <div class="gl-post-card__avatars"> 1369 <a 1370 href="/blog/author/agustin/" 1371 class="gl-post-card__avatar author-0" 1372 aria-hidden="true" 1373 > 1374 <img 1375 data-src="/blog/assets/images/avatar.jpg?v=0017488c26" 1376 alt="" 1377 width="24" 1378 height="24" 1379 class="gl-post-card__avatar__default lazy" 1380 aria-hidden="true" 1381 > 1382 <img 1383 data-src="/blog/content/images/size/w100/2019/03/agustin-compressor.png" 1384 alt="Agustin Pelaez" 1385 width="24" 1386 height="24" 1387 class="gl-post-card__avatar__image lazy" 1388 > 1389 </a> 1390 </div> 1391 <div class="gl-post-card__names"> 1392 <a href="/blog/author/agustin/">Agustin Pelaez</a> 1393 </div> 1394 </div> 1395</div> 1396 </div> 1397 <div class="gl-post-card__main-text"> 1398 <h2 class="gl-post-card__title"> 1399 <a href="/blog/aws-iot-core/"> 1400 Getting started with AWS IoT Core 1401 </a> 1402 </h2> 1403 <p class="gl-post-card__excerpt"> 1404 Discover what AWS IoT Core is, how it works, and why it's a powerful choice for building secure, scalable IoT solutions. Explore real-world use cases, key features, and how to integrate it with Ubidots for seamless data visualization and application development. 1405 </p> 1406 </div> 1407 <div class="gl-post-card__datetime"> 1408 <div class="gl-post-card__time"> 1409 <time datetime="2025-06-24"> 1410 Jun 24, 2025 1411 </time> 1412 <span>·</span> 1413 <span> 1414 14 min read 1415 </span> 1416 </div> 1417 </div> 1418 </div> 1419 </div> 1420</article> 1421 1422<article class="gl-post-card in-featured-section post tag-modbus featured no-image public "> 1423 1424<div class="gl-post-card__metas"> 1425 <div class="gl-post-card__tags"> 1426 <a 1427 href="https://ubidots.com/blog/tag/modbus/" 1428 class="gl-post-card__tag" 1429 > 1430 Modbus 1431 </a> 1432 <span class="gl-post-card__featured"> 1433 <span> 1434 <svg 1435 width="20" 1436 height="20" 1437 class="gl-icon" 1438 > 1439 <use href="/blog/assets/images/icons.svg?v=0017488c26#sparkles" /> 1440 </svg> 1441</span> 1442 Featured 1443 </span> 1444 </div> 1445 <div class="gl-post-card__authors"> 1446 <div class="gl-post-card__avatars"> 1447 <a 1448 href="/blog/author/agustin/" 1449 class="gl-post-card__avatar author-0" 1450 aria-hidden="true" 1451 > 1452 <img 1453 data-src="/blog/assets/images/avatar.jpg?v=0017488c26" 1454 alt="" 1455 width="24" 1456 height="24" 1457 class="gl-post-card__avatar__default lazy" 1458 aria-hidden="true" 1459 > 1460 <img 1461 data-src="/blog/content/images/size/w100/2019/03/agustin-compressor.png" 1462 alt="Agustin Pelaez" 1463 width="24" 1464 height="24" 1465 class="gl-post-card__avatar__image lazy" 1466 > 1467 </a> 1468 <a 1469 href="/blog/author/adriano/" 1470 class="gl-post-card__avatar author-1" 1471 aria-hidden="true" 1472 > 1473 <img 1474 data-src="/blog/assets/images/avatar.jpg?v=0017488c26" 1475 alt="" 1476 width="24" 1477 height="24" 1478 class="gl-post-card__avatar__default lazy" 1479 aria-hidden="true" 1480 > 1481 <img 1482 data-src="/blog/content/images/size/w100/2022/11/adri2.jpeg" 1483 alt="Adriano Toro" 1484 width="24" 1485 height="24" 1486 class="gl-post-card__avatar__image lazy" 1487 > 1488 </a> 1489 </div> 1490 <div class="gl-post-card__names"> 1491 <a href="/blog/author/agustin/">Agustin Pelaez</a>, <a href="/blog/author/adriano/">Adriano Toro</a> 1492 </div> 1493 </div> 1494</div> 1495 <div class="gl-post-card__main"> 1496 <div class="gl-post-card__main-content"> 1497 <div class="gl-post-card__metas-in-featured"> 1498 1499<div class="gl-post-card__metas"> 1500 <div class="gl-post-card__tags"> 1501 <a
1502 href="https://ubidots.com/blog/tag/modbus/" 1503 class="gl-post-card__tag" 1504 > 1505 Modbus 1506 </a> 1507 <span class="gl-post-card__featured"> 1508 <span> 1509 <svg 1510 width="20" 1511 height="20" 1512 class="gl-icon" 1513 > 1514 <use href="/blog/assets/images/icons.svg?v=0017488c26#sparkles" /> 1515 </svg> 1516</span> 1517 Featured 1518 </span> 1519 </div> 1520 <div class="gl-post-card__authors"> 1521 <div class="gl-post-card__avatars"> 1522 <a 1523 href="/blog/author/agustin/" 1524 class="gl-post-card__avatar author-0" 1525 aria-hidden="true" 1526 > 1527 <img 1528 data-src="/blog/assets/images/avatar.jpg?v=0017488c26" 1529 alt="" 1530 width="24" 1531 height="24" 1532 class="gl-post-card__avatar__default lazy" 1533 aria-hidden="true" 1534 > 1535 <img 1536 data-src="/blog/content/images/size/w100/2019/03/agustin-compressor.png" 1537 alt="Agustin Pelaez" 1538 width="24" 1539 height="24" 1540 class="gl-post-card__avatar__image lazy" 1541 > 1542 </a> 1543 <a 1544 href="/blog/author/adriano/" 1545 class="gl-post-card__avatar author-1" 1546 aria-hidden="true" 1547 > 1548 <img 1549 data-src="/blog/assets/images/avatar.jpg?v=0017488c26" 1550 alt="" 1551 width="24" 1552 height="24" 1553 class="gl-post-card__avatar__default lazy" 1554 aria-hidden="true" 1555 > 1556 <img 1557 data-src="/blog/content/images/size/w100/2022/11/adri2.jpeg" 1558 alt="Adriano Toro" 1559 width="24" 1560 height="24" 1561 class="gl-post-card__avatar__image lazy" 1562 > 1563 </a> 1564 </div> 1565 <div class="gl-post-card__names"> 1566 <a href="/blog/author/agustin/">Agustin Pelaez</a>, <a href="/blog/author/adriano/">Adriano Toro</a> 1567 </div> 1568 </div> 1569</div> 1570 </div> 1571 <div class="gl-post-card__main-text"> 1572 <h2 class="gl-post-card__title"> 1573 <a href="/blog/top-industrial-iot-gateways/"> 1574 Industrial IoT & Edge IoT Gateways: 10+ Best Models for 2025 (+Protocol & Price Table) 1575 </a> 1576 </h2> 1577 <p class="gl-post-card__excerpt"> 1578 Compare rugged IIoT, cellular-LTE and edge-AI gateways side-by-side (Moxa, Advantech, Siemensâ¦). Specs, Prices & FAQs updated 2025. 1579 </p> 1580 </div> 1581 <div class="gl-post-card__datetime"> 1582 <div class="gl-post-card__time"> 1583 <time datetime="2025-06-04"> 1584 Jun 04, 2025 1585 </time> 1586 <span>·</span> 1587 <span> 1588 17 min read 1589 </span> 1590 </div> 1591 </div> 1592 </div> 1593 </div> 1594</article> 1595 1596<article class="gl-post-card in-featured-section post tag-mqtt public last"> 1597 1598<div class="gl-post-card__metas"> 1599 <div class="gl-post-card__tags"> 1600 <a 1601 href="https://ubidots.com/blog/tag/mqtt/" 1602 class="gl-post-card__tag" 1603 > 1604 MQTT 1605 </a> 1606 </div> 1607 <div class="gl-post-card__authors"> 1608 <div class="gl-post-card__avatars"> 1609 <a 1610 href="/blog/author/agustin/" 1611 class="gl-post-card__avatar author-0" 1612 aria-hidden="true" 1613 > 1614 <img 1615 data-src="/blog/assets/images/avatar.jpg?v=0017488c26" 1616 alt="" 1617 width="24" 1618 height="24" 1619 class="gl-post-card__avatar__default lazy" 1620 aria-hidden="true" 1621 > 1622 <img 1623 data-src="/blog/content/images/size/w100/2019/03/agustin-compressor.png" 1624 alt="Agustin Pelaez" 1625 width="24" 1626 height="24" 1627 class="gl-post-card__avatar__image lazy" 1628 > 1629 </a> 1630 </div> 1631 <div class="gl-post-card__names"> 1632 <a href="/blog/author/agustin/">Agustin Pelaez</a> 1633 </div> 1634 </div> 1635</div> 1636 <div class="gl-post-card__main"> 1637 <a 1638 class="gl-post-card__image" 1639 href="/blog/mqtt-sparkplug-vs-plain-mqtt/" 1640 aria-hidden="true" 1641 tabindex="-1" 1642 > 1643 <img
1644 data-src="/blog/content/images/size/w720/2025/03/cover.png" 1645 alt="" 1646 width="300" 1647 height="200" 1648 class="lazy" 1649 /> 1650 </a> 1651 <div class="gl-post-card__main-content"> 1652 <div class="gl-post-card__metas-in-featured"> 1653 1654<div class="gl-post-card__metas"> 1655 <div class="gl-post-card__tags"> 1656 <a 1657 href="https://ubidots.com/blog/tag/mqtt/" 1658 class="gl-post-card__tag" 1659 > 1660 MQTT 1661 </a> 1662 </div> 1663 <div class="gl-post-card__authors"> 1664 <div class="gl-post-card__avatars"> 1665 <a 1666 href="/blog/author/agustin/" 1667 class="gl-post-card__avatar author-0" 1668 aria-hidden="true" 1669 > 1670 <img 1671 data-src="/blog/assets/images/avatar.jpg?v=0017488c26" 1672 alt="" 1673 width="24" 1674 height="24" 1675 class="gl-post-card__avatar__default lazy" 1676 aria-hidden="true" 1677 > 1678 <img 1679 data-src="/blog/content/images/size/w100/2019/03/agustin-compressor.png" 1680 alt="Agustin Pelaez" 1681 width="24" 1682 height="24" 1683 class="gl-post-card__avatar__image lazy" 1684 > 1685 </a> 1686 </div> 1687 <div class="gl-post-card__names"> 1688 <a href="/blog/author/agustin/">Agustin Pelaez</a> 1689 </div> 1690 </div> 1691</div> 1692 </div> 1693 <div class="gl-post-card__main-text"> 1694 <h2 class="gl-post-card__title"> 1695 <a href="/blog/mqtt-sparkplug-vs-plain-mqtt/"> 1696 MQTT Sparkplug vs. Plain MQTT: Why Sparkplug Matters for IIoT 1697 </a> 1698 </h2> 1699 <p class="gl-post-card__excerpt"> 1700 MQTT Sparkplug simplifies IIoT with structured data, real-time device state awareness, and seamless scalability for industrial networks. 1701 </p> 1702 </div> 1703 <div class="gl-post-card__datetime"> 1704 <div class="gl-post-card__time"> 1705 <time datetime="2025-03-12"> 1706 Mar 12, 2025 1707 </time> 1708 <span>·</span> 1709 <span> 1710 11 min read 1711 </span> 1712 </div> 1713 </div> 1714 </div> 1715 </div> 1716</article> 1717 </div> 1718 </div> 1719 <div class="gl-featured-section__pagination"> 1720 1721<nav 1722 class="gl-pagination" 1723 aria-label="Pagination" 1724> 1725 <a 1726 href="" 1727 class="gl-pagination__button prev disabled" 1728 tabindex="-1" 1729 > 1730 1731 <svg 1732 width="20" 1733 height="20" 1734 class="gl-icon" 1735 > 1736 <use href="/blog/assets/images/icons.svg?v=0017488c26#arrow-left" /> 1737 </svg> 1738 <span>Previous</span> 1739 </a> 1740 <span class="gl-pagination__label"> 1741 Page 1 of 19 1742 </span> 1743 <a 1744 href="/blog/page/2/" 1745 class="gl-pagination__button next " 1746 tabindex="0" 1747 > 1748 <span>Next</span> 1749 1750 <svg 1751 width="20" 1752 height="20" 1753 class="gl-icon" 1754 > 1755 <use href="/blog/assets/images/icons.svg?v=0017488c26#arrow-right" /> 1756 </svg> 1757 </a> 1758</nav> 1759 1760 </div> 1761 </div> 1762 <div class="js-tags-section" style="display: none;" data-tags=""> 1763 <div class="gl-wrapper"> 1764 <div class="gl-featured-section js-tags-section-content"></div> 1765 </div> 1766 </div> 1767 </div> 1768 <div class="gl-wrapper small"> 1769 1770 </div> 1771</main> 1772 1773 1774 </div> 1775 1776<footer x-data="footer()" class="gl-footer"> 1777 <div class="gl-wrapper medium"> 1778 <div class="gl-footer__wrapper"> 1779 <div class="gl-footer__main"> 1780 1781<a 1782 href="https://ubidots.com" 1783 title="Ubidots Blog" 1784 class="gl-logo flex-start" 1785> 1786 <img 1787 src="https://ubidots.com/blog/content/images/2024/09/logo-ghost-ubi.png" 1788 alt="" 1789 width="96" 1790 height="32" 1791 class="" 1792 > 1793</a> 1794 <div class="gl-footer__nav-wrapper"> 1795 <nav class="gl-footer__nav-section" aria-label="Main navigation"> 1796 <ul class="js-footer-list"> 1797 1798 <li class="nav-home"> 1799 <a href="https://ubidots.com"> 1800 Home 1801 </a> 1802 </li> 1803 <li class="nav-platform"> 1804 <a href="https://ubidots.com/platform"> 1805 Platform 1806 </a> 1807 </li> 1808 <li class="nav-pricing">
1809 <a href="https://ubidots.com/pricing"> 1810 Pricing 1811 </a> 1812 </li> 1813 <li class="nav-create-free-trial"> 1814 <a href="https://ubidots.com/signup"> 1815 Create free trial! 1816 </a> 1817 </li> 1818 1819 </ul> 1820 </nav> 1821 <nav class="gl-footer__nav-section" aria-label="Secondary navigation"> 1822 <ul class="js-footer-list"> 1823 1824 <li class="nav-api-docs"> 1825 <a href="https://docs.ubidots.com"> 1826 API Docs 1827 </a> 1828 </li> 1829 <li class="nav-help-center"> 1830 <a href="https://help.ubidots.com"> 1831 Help Center 1832 </a> 1833 </li> 1834 <li class="nav-dev-center"> 1835 <a href="https://dev.ubidots.com"> 1836 Dev Center 1837 </a> 1838 </li> 1839 <li class="nav-community-forum"> 1840 <a href="https://ubidots.com/community"> 1841 Community Forum 1842 </a> 1843 </li> 1844 <li class="nav-ubidots-stem"> 1845 <a href="https://ubidots.com/stem"> 1846 Ubidots STEM 1847 </a> 1848 </li> 1849 <li class="nav-enterprise"> 1850 <a href="https://ubidots.com/enterprise"> 1851 Enterprise 1852 </a> 1853 </li> 1854 <li class="nav-contact-us"> 1855 <a href="https://ubidots.com/contact"> 1856 Contact Us 1857 </a> 1858 </li> 1859 1860 </ul> 1861 </nav> 1862 <div class="gl-footer__nav-section"> 1863 <ul class="js-footer-list"> 1864 <li> 1865 <button class="gl-footer__action" data-ghost-search> 1866 1867 <svg 1868 width="16" 1869 height="16" 1870 class="gl-icon" 1871 > 1872 <use href="/blog/assets/images/icons.svg?v=0017488c26#search" /> 1873 </svg> 1874 Search 1875 </button> 1876 </li> 1877 <li> 1878 1879<div 1880 class="gl-footer__theme-selector-wrapper" 1881 x-data="themeSelector({ 1882 labels: { 1883 system: 'System theme', 1884 light: 'Light theme', 1885 dark: 'Dark theme' 1886 } 1887 })" 1888> 1889 <button 1890 x-ref="selector" 1891 class="gl-footer__action" 1892 @click="toggleSelector" 1893 @click.away="open = false" 1894 > 1895 <template x-if="savedThemeMode === 'system'"> 1896 1897 <svg 1898 width="16" 1899 height="16" 1900 class="gl-icon" 1901 > 1902 <use href="/blog/assets/images/icons.svg?v=0017488c26#system" /> 1903 </svg> 1904 </template> 1905 <template x-if="savedThemeMode === 'light'"> 1906 1907 <svg 1908 width="16" 1909 height="16" 1910 class="gl-icon" 1911 > 1912 <use href="/blog/assets/images/icons.svg?v=0017488c26#light" /> 1913 </svg> 1914 </template> 1915 <template x-if="savedThemeMode === 'dark'"> 1916 1917 <svg 1918 width="16" 1919 height="16" 1920 class="gl-icon" 1921 > 1922 <use href="/blog/assets/images/icons.svg?v=0017488c26#dark" /> 1923 </svg> 1924 </template> 1925 <span x-text="selectedLabel" class="truncable"></span> 1926 </button> 1927 <div 1928 x-show="open" 1929 x-transition 1930 x-cloak 1931 x-anchor.top.offset.12="$refs.selector" 1932 class="gl-footer__theme-selector" 1933 > 1934 <button class="gl-footer__action" @click="setThemeMode('system')"> 1935 1936 <svg 1937 width="16" 1938 height="16" 1939 class="gl-icon" 1940 > 1941 <use href="/blog/assets/images/icons.svg?v=0017488c26#system" /> 1942 </svg> 1943 System theme 1944 </button> 1945 <button class="gl-footer__action" @click="setThemeMode('light')"> 1946 1947 <svg 1948 width="16" 1949 height="16" 1950 class="gl-icon" 1951 > 1952 <use href="/blog/assets/images/icons.svg?v=0017488c26#light" /> 1953 </svg> 1954 Light theme 1955 </button> 1956 <button class="gl-footer__action" @click="setThemeMode('dark')"> 1957 1958 <svg 1959 width="16" 1960 height="16" 1961 class="gl-icon" 1962 > 1963 <use href="/blog/assets/images/icons.svg?v=0017488c26#dark" /> 1964 </svg> 1965 Dark theme 1966 </button> 1967 </div> 1968</div> 1969
1970<script> 1971 function themeSelector({labels}) { 1972 return { 1973 open: false, 1974 labels, 1975 selectedLabel: labels.system, 1976 savedThemeMode: 'system', 1977 init() { 1978 this.initThemeMode() 1979 }, 1980 toggleSelector() { 1981 this.open = !this.open 1982 }, 1983 initThemeMode() { 1984 this.savedThemeMode = this.getThemeMode() 1985 this.setThemeMode(this.savedThemeMode) 1986 1987 if (window.matchMedia) { 1988 window.matchMedia('(prefers-color-scheme: dark)') 1989 .addEventListener('change', this.updateSystemTheme.bind(this)) 1990 } 1991 }, 1992 updateSystemTheme() { 1993 if (this.savedThemeMode !== 'system') { 1994 return 1995 } 1996 1997 if (this.isSystemDark()) { 1998 this.setThemeMode('dark', false) 1999 } else { 2000 this.setThemeMode('light', false) 2001 } 2002 2003 this.selectedLabel = this.labels.system 2004 }, 2005 isSystemDark() { 2006 return window.matchMedia 2007 && window.matchMedia('(prefers-color-scheme: dark)').matches 2008 }, 2009 setThemeMode(mode, saveTheme = true) { 2010 this.selectedLabel = this.labels[mode] 2011 2012 const html = document.querySelector('html') 2013 html.setAttribute('theme-mode', mode) 2014 2015 if (saveTheme) { 2016 this.savedThemeMode = mode 2017 2018 if (mode === 'system') { 2019 this.updateSystemTheme() 2020 } 2021 2022 localStorage.setItem('glow-theme-mode', mode) 2023 } 2024 2025 this.rerenderGhostIframes() 2026 }, 2027 getThemeMode() { 2028 const localValue = localStorage.getItem('glow-theme-mode') 2029 2030 if (!localValue) { 2031 return 'system' 2032 } 2033 2034 return localValue 2035 }, 2036 rerenderGhostIframes() { 2037 const comments = document.querySelector('.js-comments > div > iframe') 2038 2039 if (comments) { 2040 comments.contentDocument.location.reload(true) 2041 } 2042 } 2043 } 2044 } 2045</script>
2045 2046 </li> 2047 </ul> 2048 </div> 2049 </div> 2050 </div> 2051 <div class="gl-footer__secondary"> 2052 2053<ul class="gl-social-links"> 2054 <li> 2055 <a href="https://twitter.com/ubidots" target="_blank" rel="noopener"> 2056 2057 <svg 2058 width="16" 2059 height="16" 2060 class="gl-icon" 2061 > 2062 <use href="/blog/assets/images/icons.svg?v=0017488c26#x" /> 2063 </svg> 2064 <span class="sr-only">X</span> 2065 </a> 2066 </li> 2067 <li> 2068 <a href="https://www.facebook.com/ubidots" target="_blank" rel="noopener"> 2069 2070 <svg 2071 width="16" 2072 height="16" 2073 class="gl-icon" 2074 > 2075 <use href="/blog/assets/images/icons.svg?v=0017488c26#facebook" /> 2076 </svg> 2077 <span class="sr-only">Facebook</span> 2078 </a> 2079 </li> 2080 <li> 2081 <a href="https://ubidots.com/blog/rss" target="_blank" rel="noopener"> 2082 2083 <svg 2084 width="16" 2085 height="16" 2086 class="gl-icon" 2087 > 2088 <use href="/blog/assets/images/icons.svg?v=0017488c26#rss" /> 2089 </svg> 2090 <span class="sr-only">RSS</span> 2091 </a> 2092 </li> 2093</ul> 2094 <p class="gl-footer__footnote"> 2095 Ubidots Team 2096 </p> 2097 </div> 2098 </div> 2099 </div> 2100</footer> 2101
2102<script> 2103 function footer() { 2104 return { 2105 init() { 2106 const footerLists = this.$el.querySelectorAll('.js-footer-list') 2107 footerLists.forEach((list) => { 2108 if (list.children.length === 0) { 2109 list.parentElement.remove() 2110 } 2111 }) 2112 } 2113 } 2114 } 2115</script>
2115 2116 </div> 2117 2118
2118<script src="/blog/assets/js/manifest.js?v=0017488c26" defer></script>
2118 2119
2119<script src="/blog/assets/js/vendor.js?v=0017488c26" defer></script>
2119 2120
2120<script src="/blog/assets/js/app.js?v=0017488c26" defer></script>
2120 2121 2122
2122<script defer src="/blog/assets/js/home.js?v=0017488c26"></script>
2122 2123 2124 2125
2125<script> 2126// Taken from https://forum.ghost.org/t/open-links-in-new-window/1726/4 2127$('a').each(function() { 2128 var a = new RegExp('/(ubidots.com|' + window.location.host + ')/'); 2129 if(!a.test(this.href)) { 2130 $(this).click(function(event) { 2131 event.preventDefault(); 2132 event.stopPropagation(); 2133 window.open(this.href, '_blank'); 2134 }); 2135 } 2136}); 2137 2138// https://highlightjs.org/ 2139activateHighlight = function() { 2140 document.querySelectorAll("pre code").forEach( 2141 function(currentValue, currentIndex, listObj) { 2142 hljs.highlightBlock(currentValue); 2143 } 2144 ); 2145} 2146 2147if (window.attachEvent) { 2148 window.attachEvent('onload', loadHighlight); 2149} else { 2150 if (window.onload) { 2151 var originalOnload = window.onload; 2152 var newOnload = function(evt) { 2153 originalOnload(evt); 2154 activateHighlight(evt); 2155 }; 2156 window.onload = newOnload; 2157 } else { 2158 window.onload = activateHighlight; 2159 } 2160} 2161</script>
2161 2162
2163<script> 2164(function(document, history, location) { 2165 var HISTORY_SUPPORT = !!(history && history.pushState); 2166 2167 var anchorScrolls = { 2168 ANCHOR_REGEX: /^#[^ ]+$/, 2169 OFFSET_HEIGHT_PX: 130, 2170 2171 /** 2172 * Establish events, and fix initial scroll position if a hash is provided. 2173 */ 2174 init: function() { 2175 this.scrollToCurrent(); 2176 $(window).on('hashchange', $.proxy(this, 'scrollToCurrent')); 2177 $('body').on('click', 'a', $.proxy(this, 'delegateAnchors')); 2178 }, 2179 2180 /** 2181 * Return the offset amount to deduct from the normal scroll position. 2182 * Modify as appropriate to allow for dynamic calculations 2183 */ 2184 getFixedOffset: function() { 2185 return this.OFFSET_HEIGHT_PX; 2186 }, 2187 2188 /** 2189 * If the provided href is an anchor which resolves to an element on the 2190 * page, scroll to it. 2191 * @param {String} href 2192 * @return {Boolean} - Was the href an anchor. 2193 */ 2194 scrollIfAnchor: function(href, pushToHistory) { 2195 var match, anchorOffset; 2196 2197 if(!this.ANCHOR_REGEX.test(href)) { 2198 return false; 2199 } 2200 2201 match = document.getElementById(href.slice(1)); 2202 2203 if(match) { 2204 anchorOffset = $(match).offset().top - this.getFixedOffset(); 2205 $('html, body').animate({ scrollTop: anchorOffset}); 2206 2207 // Add the state to history as-per normal anchor links 2208 if(HISTORY_SUPPORT && pushToHistory) { 2209 history.pushState({}, document.title, location.pathname + href); 2210 } 2211 } 2212 2213 return !!match; 2214 }, 2215 2216 /** 2217 * Attempt to scroll to the current location's hash. 2218 */ 2219 scrollToCurrent: function(e) { 2220 if(this.scrollIfAnchor(window.location.hash) && e) { 2221 e.preventDefault(); 2222 } 2223 }, 2224 2225 /** 2226 * If the click event's target was an anchor, fix the scroll position. 2227 */ 2228 delegateAnchors: function(e) { 2229 var elem = e.target; 2230 if(elem.getAttribute('href') != '#subscribe'){ 2231 if(this.scrollIfAnchor(elem.getAttribute('href'), true)) { 2232 e.preventDefault(); 2233 } 2234 } 2235 } 2236 }; 2237 $(window).on( "load", $.proxy(anchorScrolls, 'init')); 2238 //$(document).ready($.proxy(anchorScrolls, 'init')); 2239})(window.document, window.history, window.location); 2240</script>
vendor: 1 bytes, line 2240
2240
2241<script> 2242 document.addEventListener('DOMContentLoaded', function() { 2243 var links = document.querySelectorAll('a'); 2244 links.forEach(function(link) { 2245 if (link.hostname != window.location.hostname) { 2246 link.target = '_blank'; 2247 } 2248 }); 2249 }); 2250</script>
2250 2251 2252 </body> 2253</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.