PageSourceSearch

https://ubidots.com/blog/

html ubidots.com collected 2026-09-24 09:11:49 UTC 64,575 bytes, 2,239 lines download raw bytes

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 no-image 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    <div class="gl-post-card__main-content">
765      <div class="gl-post-card__metas-in-featured">
766        
767<div class="gl-post-card__metas">
768  <div class="gl-post-card__tags">
769      <a
770        href="https://ubidots.com/blog/tag/ai/"
771        class="gl-post-card__tag"
772      >
773        AI
774      </a>
775  </div>
776    <div class="gl-post-card__authors">
777      <div class="gl-post-card__avatars">
778          <a
779            href="/blog/author/ubidots/"
780            class="gl-post-card__avatar author-0"
781            aria-hidden="true"
782          >
783            <img
784              data-src="/blog/assets/images/avatar.jpg?v=0017488c26"
785              alt=""
786              width="24"
787              height="24"
788              class="gl-post-card__avatar__default lazy"
789              aria-hidden="true"
790            >
791          </a>
792      </div>
793      <div class="gl-post-card__names">
794        <a href="/blog/author/ubidots/">Ubidots</a>
795      </div>
796    </div>
797</div>
798      </div>
799      <div class="gl-post-card__main-text">
800        <h2 class="gl-post-card__title">
801          <a href="/blog/ml-vs-llm-5-prompts-that-break-llms-and-how-ml-tool-calling-fixes-them/">
802            ML vs LLM: 5 Prompts That Break LLMs — and How ML Tool-Calling Fixes Them
803          </a>
804        </h2>
805          <p class="gl-post-card__excerpt">
806            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.
807          </p>
808      </div>
809      <div class="gl-post-card__datetime">
810        <div class="gl-post-card__time">
811          <time datetime="2026-07-09">
812            Jul 09, 2026
813          </time>
814            <span>·</span>
815            <span>
816              16 min read
817            </span>
818        </div>
819      </div>
820    </div>
821  </div>
822</article>
823              
824<article class="gl-post-card in-featured-section post tag-eagle-io tag-iot-platforms tag-scada tag-environmental-monitoring-2 tag-comparison public   ">
825  
826<div class="gl-post-card__metas">
827  <div class="gl-post-card__tags">
828      <a
829        href="https://ubidots.com/blog/tag/eagle-io/"
830        class="gl-post-card__tag"
831      >
832        eagle-io
833      </a>
834  </div>
835    <div class="gl-post-card__authors">
836      <div class="gl-post-card__avatars">
837          <a
838            href="/blog/author/ubidots/"
839            class="gl-post-card__avatar author-0"
840            aria-hidden="true"
841          >
842            <img
843              data-src="/blog/assets/images/avatar.jpg?v=0017488c26"
844              alt=""
845              width="24"
846              height="24"
847              class="gl-post-card__avatar__default lazy"
848              aria-hidden="true"
849            >
850          </a>
851      </div>
852      <div class="gl-post-card__names">
853        <a href="/blog/author/ubidots/">Ubidots</a>
854      </div>
855    </div>
856</div>
857  <div class="gl-post-card__main">
858      <a
859        class="gl-post-card__image"
860        href="/blog/eagle-io-alternatives-ubidots/"
861        aria-hidden="true"
862        tabindex="-1"
863      >
864        <img
865          data-src="/blog/content/images/size/w720/2026/05/eagle-io-alternative-ubidots-dashboard-comparison.webp"
866          alt="Ubidots dashboard vs Eagle.io folder-tree UI — Eagle.io alternative comparison"
867          width="300"
868          height="200"
869          class="lazy"
870        />
871      </a>
872    <div class="gl-post-card__main-content">
873      <div class="gl-post-card__metas-in-featured">
874        
875<div class="gl-post-card__metas">
876  <div class="gl-post-card__tags">
877      <a
878        href="https://ubidots.com/blog/tag/eagle-io/"
879        class="gl-post-card__tag"
880      >
881        eagle-io
882      </a>
883  </div>
884    <div class="gl-post-card__authors">
885      <div class="gl-post-card__avatars">
886          <a
887            href="/blog/author/ubidots/"
888            class="gl-post-card__avatar author-0"
889            aria-hidden="true"
890          >
891            <img
892              data-src="/blog/assets/images/avatar.jpg?v=0017488c26"
893              alt=""
894              width="24"
895              height="24"
896              class="gl-post-card__avatar__default lazy"
897              aria-hidden="true"
898            >
899          </a>
900      </div>
901      <div class="gl-post-card__names">
902        <a href="/blog/author/ubidots/">Ubidots</a>
903      </div>
904    </div>
905</div>
906      </div>
907      <div class="gl-post-card__main-text">
908        <h2 class="gl-post-card__title">
909          <a href="/blog/eagle-io-alternatives-ubidots/">
910            Eagle.io Alternatives: How Ubidots Compares After the Bentley Acquisition (2026)
911          </a>
912        </h2>
913          <p class="gl-post-card__excerpt">
914            &quot;No development for 3 years&quot; — and the bill is climbing toward $20K/month. Here&#x27;s how Ubidots compares to Eagle.io on pricing, multi-tenancy, Python scripting, and white labeling after the Bentley acquisition.
915          </p>
916      </div>
917      <div class="gl-post-card__datetime">
918        <div class="gl-post-card__time">
919          <time datetime="2026-05-26">
920            May 26, 2026
921          </time>
922            <span>·</span>
923            <span>
924              17 min read
925            </span>
926        </div>
927      </div>
928    </div>
929  </div>
930</article>
931              
932<article class="gl-post-card in-featured-section post tag-industrial-iot tag-iot tag-water-management tag-scada tag-modbus public   ">
933  
934<div class="gl-post-card__metas">
935  <div class="gl-post-card__tags">
936      <a
937        href="https://ubidots.com/blog/tag/industrial-iot/"
938        class="gl-post-card__tag"
939      >
940        Industrial IoT
941      </a>
942  </div>
943    <div class="gl-post-card__authors">
944      <div class="gl-post-card__avatars">
945          <a
946            href="/blog/author/cristina/"
947            class="gl-post-card__avatar author-0"
948            aria-hidden="true"
949          >
950            <img
951              data-src="/blog/assets/images/avatar.jpg?v=0017488c26"
952              alt=""
953              width="24"
954              height="24"
955              class="gl-post-card__avatar__default lazy"
956              aria-hidden="true"
957            >
958              <img
959                data-src="/blog/content/images/size/w100/2019/06/Image-from-iOS--1--1.jpg"
960                alt="Cristina Botero"
961                width="24"
962                height="24"
963                class="gl-post-card__avatar__image lazy"
964              >
965          </a>
966      </div>
967      <div class="gl-post-card__names">
968        <a href="/blog/author/cristina/">Cristina Botero</a>
969      </div>
970    </div>
971</div>
972  <div class="gl-post-card__main">
973      <a
974        class="gl-post-card__image"
975        href="/blog/iot-water-infrastructure-monitoring/"
976        aria-hidden="true"
977        tabindex="-1"
978      >
979        <img
980          data-src="/blog/content/images/size/w720/2025/03/abc-1.png"
981          alt=""
982          width="300"
983          height="200"
984          class="lazy"
985        />
986      </a>
987    <div class="gl-post-card__main-content">
988      <div class="gl-post-card__metas-in-featured">
989        
990<div class="gl-post-card__metas">
991  <div class="gl-post-card__tags">
992      <a
993        href="https://ubidots.com/blog/tag/industrial-iot/"
994        class="gl-post-card__tag"
995      >
996        Industrial IoT
997      </a>
998  </div>
999    <div class="gl-post-card__authors">
1000      <div class="gl-post-card__avatars">
1001          <a
1002            href="/blog/author/cristina/"
1003            class="gl-post-card__avatar author-0"
1004            aria-hidden="true"
1005          >
1006            <img
1007              data-src="/blog/assets/images/avatar.jpg?v=0017488c26"
1008              alt=""
1009              width="24"
1010              height="24"
1011              class="gl-post-card__avatar__default lazy"
1012              aria-hidden="true"
1013            >
1014              <img
1015                data-src="/blog/content/images/size/w100/2019/06/Image-from-iOS--1--1.jpg"
1016                alt="Cristina Botero"
1017                width="24"
1018                height="24"
1019                class="gl-post-card__avatar__image lazy"
1020              >
1021          </a>
1022      </div>
1023      <div class="gl-post-card__names">
1024        <a href="/blog/author/cristina/">Cristina Botero</a>
1025      </div>
1026    </div>
1027</div>
1028      </div>
1029      <div class="gl-post-card__main-text">
1030        <h2 class="gl-post-card__title">
1031          <a href="/blog/iot-water-infrastructure-monitoring/">
1032            IoT Water Infrastructure Monitoring: How Smart Pumping Stations Cut Costs by 15%
1033          </a>
1034        </h2>
1035          <p class="gl-post-card__excerpt">
1036            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.
1037          </p>
1038      </div>
1039      <div class="gl-post-card__datetime">
1040        <div class="gl-post-card__time">
1041          <time datetime="2026-02-12">
1042            Feb 12, 2026
1043          </time>
1044            <span>·</span>
1045            <span>
1046              9 min read
1047            </span>
1048        </div>
1049      </div>
1050    </div>
1051  </div>
1052</article>
1053              
1054<article class="gl-post-card in-featured-section post tag-industrial-iot tag-energy-management tag-modbus tag-predictive-maintenance tag-scada public   ">
1055  
1056<div class="gl-post-card__metas">
1057  <div class="gl-post-card__tags">
1058      <a
1059        href="https://ubidots.com/blog/tag/industrial-iot/"
1060        class="gl-post-card__tag"
1061      >
1062        Industrial IoT
1063      </a>
1064  </div>
1065    <div class="gl-post-card__authors">
1066      <div class="gl-post-card__avatars">
1067          <a
1068            href="/blog/author/agustin/"
1069            class="gl-post-card__avatar author-0"
1070            aria-hidden="true"
1071          >
1072            <img
1073              data-src="/blog/assets/images/avatar.jpg?v=0017488c26"
1074              alt=""
1075              width="24"
1076              height="24"
1077              class="gl-post-card__avatar__default lazy"
1078              aria-hidden="true"
1079            >
1080              <img
1081                data-src="/blog/content/images/size/w100/2019/03/agustin-compressor.png"
1082                alt="Agustin Pelaez"
1083                width="24"
1084                height="24"
1085                class="gl-post-card__avatar__image lazy"
1086              >
1087          </a>
1088      </div>
1089      <div class="gl-post-card__names">
1090        <a href="/blog/author/agustin/">Agustin Pelaez</a>
1091      </div>
1092    </div>
1093</div>
1094  <div class="gl-post-card__main">
1095      <a
1096        class="gl-post-card__image"
1097        href="/blog/industrial-iot-applications/"
1098        aria-hidden="true"
1099        tabindex="-1"
1100      >
1101        <img
1102          data-src="/blog/content/images/size/w720/2026/01/979540537-1.jpg"
1103          alt=""
1104          width="300"
1105          height="200"
1106          class="lazy"
1107        />
1108      </a>
1109    <div class="gl-post-card__main-content">
1110      <div class="gl-post-card__metas-in-featured">
1111        
1112<div class="gl-post-card__metas">
1113  <div class="gl-post-card__tags">
1114      <a
1115        href="https://ubidots.com/blog/tag/industrial-iot/"
1116        class="gl-post-card__tag"
1117      >
1118        Industrial IoT
1119      </a>
1120  </div>
1121    <div class="gl-post-card__authors">
1122      <div class="gl-post-card__avatars">
1123          <a
1124            href="/blog/author/agustin/"
1125            class="gl-post-card__avatar author-0"
1126            aria-hidden="true"
1127          >
1128            <img
1129              data-src="/blog/assets/images/avatar.jpg?v=0017488c26"
1130              alt=""
1131              width="24"
1132              height="24"
1133              class="gl-post-card__avatar__default lazy"
1134              aria-hidden="true"
1135            >
1136              <img
1137                data-src="/blog/content/images/size/w100/2019/03/agustin-compressor.png"
1138                alt="Agustin Pelaez"
1139                width="24"
1140                height="24"
1141                class="gl-post-card__avatar__image lazy"
1142              >
1143          </a>
1144      </div>
1145      <div class="gl-post-card__names">
1146        <a href="/blog/author/agustin/">Agustin Pelaez</a>
1147      </div>
1148    </div>
1149</div>
1150      </div>
1151      <div class="gl-post-card__main-text">
1152        <h2 class="gl-post-card__title">
1153          <a href="/blog/industrial-iot-applications/">
1154            5 Industrial IoT Applications With Real Examples (2026)
1155          </a>
1156        </h2>
1157          <p class="gl-post-card__excerpt">
1158            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.
1159          </p>
1160      </div>
1161      <div class="gl-post-card__datetime">
1162        <div class="gl-post-card__time">
1163          <time datetime="2026-01-13">
1164            Jan 13, 2026
1165          </time>
1166            <span>·</span>
1167            <span>
1168              13 min read
1169            </span>
1170        </div>
1171      </div>
1172    </div>
1173  </div>
1174</article>
1175              
1176<article class="gl-post-card in-featured-section post tag-scada public   ">
1177  
1178<div class="gl-post-card__metas">
1179  <div class="gl-post-card__tags">
1180      <a
1181        href="https://ubidots.com/blog/tag/scada/"
1182        class="gl-post-card__tag"
1183      >
1184        scada
1185      </a>
1186  </div>
1187    <div class="gl-post-card__authors">
1188      <div class="gl-post-card__avatars">
1189          <a
1190            href="/blog/author/agustin/"
1191            class="gl-post-card__avatar author-0"
1192            aria-hidden="true"
1193          >
1194            <img
1195              data-src="/blog/assets/images/avatar.jpg?v=0017488c26"
1196              alt=""
1197              width="24"
1198              height="24"
1199              class="gl-post-card__avatar__default lazy"
1200              aria-hidden="true"
1201            >
1202              <img
1203                data-src="/blog/content/images/size/w100/2019/03/agustin-compressor.png"
1204                alt="Agustin Pelaez"
1205                width="24"
1206                height="24"
1207                class="gl-post-card__avatar__image lazy"
1208              >
1209          </a>
1210      </div>
1211      <div class="gl-post-card__names">
1212        <a href="/blog/author/agustin/">Agustin Pelaez</a>
1213      </div>
1214    </div>
1215</div>
1216  <div class="gl-post-card__main">
1217      <a
1218        class="gl-post-card__image"
1219        href="/blog/what-is-scada/"
1220        aria-hidden="true"
1221        tabindex="-1"
1222      >
1223        <img
1224          data-src="/blog/content/images/size/w720/2024/10/SCADA-feature-image.jpg"
1225          alt=""
1226          width="300"
1227          height="200"
1228          class="lazy"
1229        />
1230      </a>
1231    <div class="gl-post-card__main-content">
1232      <div class="gl-post-card__metas-in-featured">
1233        
1234<div class="gl-post-card__metas">
1235  <div class="gl-post-card__tags">
1236      <a
1237        href="https://ubidots.com/blog/tag/scada/"
1238        class="gl-post-card__tag"
1239      >
1240        scada
1241      </a>
1242  </div>
1243    <div class="gl-post-card__authors">
1244      <div class="gl-post-card__avatars">
1245          <a
1246            href="/blog/author/agustin/"
1247            class="gl-post-card__avatar author-0"
1248            aria-hidden="true"
1249          >
1250            <img
1251              data-src="/blog/assets/images/avatar.jpg?v=0017488c26"
1252              alt=""
1253              width="24"
1254              height="24"
1255              class="gl-post-card__avatar__default lazy"
1256              aria-hidden="true"
1257            >
1258              <img
1259                data-src="/blog/content/images/size/w100/2019/03/agustin-compressor.png"
1260                alt="Agustin Pelaez"
1261                width="24"
1262                height="24"
1263                class="gl-post-card__avatar__image lazy"
1264              >
1265          </a>
1266      </div>
1267      <div class="gl-post-card__names">
1268        <a href="/blog/author/agustin/">Agustin Pelaez</a>
1269      </div>
1270    </div>
1271</div>
1272      </div>
1273      <div class="gl-post-card__main-text">
1274        <h2 class="gl-post-card__title">
1275          <a href="/blog/what-is-scada/">
1276            What is SCADA? Supervisory Control &amp; Data Acquisition Explained
1277          </a>
1278        </h2>
1279          <p class="gl-post-card__excerpt">
1280            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.
1281          </p>
1282      </div>
1283      <div class="gl-post-card__datetime">
1284        <div class="gl-post-card__time">
1285          <time datetime="2025-07-06">
1286            Jul 06, 2025
1287          </time>
1288            <span>·</span>
1289            <span>
1290              15 min read
1291            </span>
1292        </div>
1293      </div>
1294    </div>
1295  </div>
1296</article>
1297              
1298<article class="gl-post-card in-featured-section post public no-primary-tag  ">
1299  
1300<div class="gl-post-card__metas">
1301  <div class="gl-post-card__tags">
1302  </div>
1303    <div class="gl-post-card__authors">
1304      <div class="gl-post-card__avatars">
1305          <a
1306            href="/blog/author/agustin/"
1307            class="gl-post-card__avatar author-0"
1308            aria-hidden="true"
1309          >
1310            <img
1311              data-src="/blog/assets/images/avatar.jpg?v=0017488c26"
1312              alt=""
1313              width="24"
1314              height="24"
1315              class="gl-post-card__avatar__default lazy"
1316              aria-hidden="true"
1317            >
1318              <img
1319                data-src="/blog/content/images/size/w100/2019/03/agustin-compressor.png"
1320                alt="Agustin Pelaez"
1321                width="24"
1322                height="24"
1323                class="gl-post-card__avatar__image lazy"
1324              >
1325          </a>
1326      </div>
1327      <div class="gl-post-card__names">
1328        <a href="/blog/author/agustin/">Agustin Pelaez</a>
1329      </div>
1330    </div>
1331</div>
1332  <div class="gl-post-card__main">
1333      <a
1334        class="gl-post-card__image"
1335        href="/blog/aws-iot-core/"
1336        aria-hidden="true"
1337        tabindex="-1"
1338      >
1339        <img
1340          data-src="/blog/content/images/size/w720/2025/06/1.png"
1341          alt=""
1342          width="300"
1343          height="200"
1344          class="lazy"
1345        />
1346      </a>
1347    <div class="gl-post-card__main-content">
1348      <div class="gl-post-card__metas-in-featured">
1349        
1350<div class="gl-post-card__metas">
1351  <div class="gl-post-card__tags">
1352  </div>
1353    <div class="gl-post-card__authors">
1354      <div class="gl-post-card__avatars">
1355          <a
1356            href="/blog/author/agustin/"
1357            class="gl-post-card__avatar author-0"
1358            aria-hidden="true"
1359          >
1360            <img
1361              data-src="/blog/assets/images/avatar.jpg?v=0017488c26"
1362              alt=""
1363              width="24"
1364              height="24"
1365              class="gl-post-card__avatar__default lazy"
1366              aria-hidden="true"
1367            >
1368              <img
1369                data-src="/blog/content/images/size/w100/2019/03/agustin-compressor.png"
1370                alt="Agustin Pelaez"
1371                width="24"
1372                height="24"
1373                class="gl-post-card__avatar__image lazy"
1374              >
1375          </a>
1376      </div>
1377      <div class="gl-post-card__names">
1378        <a href="/blog/author/agustin/">Agustin Pelaez</a>
1379      </div>
1380    </div>
1381</div>
1382      </div>
1383      <div class="gl-post-card__main-text">
1384        <h2 class="gl-post-card__title">
1385          <a href="/blog/aws-iot-core/">
1386            Getting started with AWS IoT Core
1387          </a>
1388        </h2>
1389          <p class="gl-post-card__excerpt">
1390            Discover what AWS IoT Core is, how it works, and why it&#x27;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.
1391          </p>
1392      </div>
1393      <div class="gl-post-card__datetime">
1394        <div class="gl-post-card__time">
1395          <time datetime="2025-06-24">
1396            Jun 24, 2025
1397          </time>
1398            <span>·</span>
1399            <span>
1400              14 min read
1401            </span>
1402        </div>
1403      </div>
1404    </div>
1405  </div>
1406</article>
1407              
1408<article class="gl-post-card in-featured-section post tag-modbus featured no-image public   ">
1409  
1410<div class="gl-post-card__metas">
1411  <div class="gl-post-card__tags">
1412      <a
1413        href="https://ubidots.com/blog/tag/modbus/"
1414        class="gl-post-card__tag"
1415      >
1416        Modbus
1417      </a>
1418      <span class="gl-post-card__featured">
1419          <span>
1420  <svg
1421    width="20"
1422    height="20"
1423    class="gl-icon"
1424  >
1425    <use href="/blog/assets/images/icons.svg?v=0017488c26#sparkles" />
1426  </svg>
1427</span>
1428        Featured
1429        </span>
1430  </div>
1431    <div class="gl-post-card__authors">
1432      <div class="gl-post-card__avatars">
1433          <a
1434            href="/blog/author/agustin/"
1435            class="gl-post-card__avatar author-0"
1436            aria-hidden="true"
1437          >
1438            <img
1439              data-src="/blog/assets/images/avatar.jpg?v=0017488c26"
1440              alt=""
1441              width="24"
1442              height="24"
1443              class="gl-post-card__avatar__default lazy"
1444              aria-hidden="true"
1445            >
1446              <img
1447                data-src="/blog/content/images/size/w100/2019/03/agustin-compressor.png"
1448                alt="Agustin Pelaez"
1449                width="24"
1450                height="24"
1451                class="gl-post-card__avatar__image lazy"
1452              >
1453          </a>
1454          <a
1455            href="/blog/author/adriano/"
1456            class="gl-post-card__avatar author-1"
1457            aria-hidden="true"
1458          >
1459            <img
1460              data-src="/blog/assets/images/avatar.jpg?v=0017488c26"
1461              alt=""
1462              width="24"
1463              height="24"
1464              class="gl-post-card__avatar__default lazy"
1465              aria-hidden="true"
1466            >
1467              <img
1468                data-src="/blog/content/images/size/w100/2022/11/adri2.jpeg"
1469                alt="Adriano Toro"
1470                width="24"
1471                height="24"
1472                class="gl-post-card__avatar__image lazy"
1473              >
1474          </a>
1475      </div>
1476      <div class="gl-post-card__names">
1477        <a href="/blog/author/agustin/">Agustin Pelaez</a>, <a href="/blog/author/adriano/">Adriano Toro</a>
1478      </div>
1479    </div>
1480</div>
1481  <div class="gl-post-card__main">
1482    <div class="gl-post-card__main-content">
1483      <div class="gl-post-card__metas-in-featured">
1484        
1485<div class="gl-post-card__metas">
1486  <div class="gl-post-card__tags">
1487      <a
1488        href="https://ubidots.com/blog/tag/modbus/"
1489        class="gl-post-card__tag"
1490      >
1491        Modbus
1492      </a>
1493      <span class="gl-post-card__featured">
1494          <span>
1495  <svg
1496    width="20"
1497    height="20"
1498    class="gl-icon"
1499  >
1500    <use href="/blog/assets/images/icons.svg?v=0017488c26#sparkles" />
1501  </svg>
1502</span>
1503        Featured
1504        </span>
1505  </div>
1506    <div class="gl-post-card__authors">
1507      <div class="gl-post-card__avatars">
1508          <a
1509            href="/blog/author/agustin/"
1510            class="gl-post-card__avatar author-0"
1511            aria-hidden="true"
1512          >
1513            <img
1514              data-src="/blog/assets/images/avatar.jpg?v=0017488c26"
1515              alt=""
1516              width="24"
1517              height="24"
1518              class="gl-post-card__avatar__default lazy"
1519              aria-hidden="true"
1520            >
1521              <img
1522                data-src="/blog/content/images/size/w100/2019/03/agustin-compressor.png"
1523                alt="Agustin Pelaez"
1524                width="24"
1525                height="24"
1526                class="gl-post-card__avatar__image lazy"
1527              >
1528          </a>
1529          <a
1530            href="/blog/author/adriano/"
1531            class="gl-post-card__avatar author-1"
1532            aria-hidden="true"
1533          >
1534            <img
1535              data-src="/blog/assets/images/avatar.jpg?v=0017488c26"
1536              alt=""
1537              width="24"
1538              height="24"
1539              class="gl-post-card__avatar__default lazy"
1540              aria-hidden="true"
1541            >
1542              <img
1543                data-src="/blog/content/images/size/w100/2022/11/adri2.jpeg"
1544                alt="Adriano Toro"
1545                width="24"
1546                height="24"
1547                class="gl-post-card__avatar__image lazy"
1548              >
1549          </a>
1550      </div>
1551      <div class="gl-post-card__names">
1552        <a href="/blog/author/agustin/">Agustin Pelaez</a>, <a href="/blog/author/adriano/">Adriano Toro</a>
1553      </div>
1554    </div>
1555</div>
1556      </div>
1557      <div class="gl-post-card__main-text">
1558        <h2 class="gl-post-card__title">
1559          <a href="/blog/top-industrial-iot-gateways/">
1560            Industrial IoT &amp; Edge IoT Gateways: 10+ Best Models for 2025 (+Protocol &amp; Price Table)
1561          </a>
1562        </h2>
1563          <p class="gl-post-card__excerpt">
1564            Compare rugged IIoT, cellular-LTE and edge-AI gateways side-by-side (Moxa, Advantech, Siemens…). Specs, Prices &amp; FAQs updated 2025.
1565          </p>
1566      </div>
1567      <div class="gl-post-card__datetime">
1568        <div class="gl-post-card__time">
1569          <time datetime="2025-06-04">
1570            Jun 04, 2025
1571          </time>
1572            <span>·</span>
1573            <span>
1574              17 min read
1575            </span>
1576        </div>
1577      </div>
1578    </div>
1579  </div>
1580</article>
1581              
1582<article class="gl-post-card in-featured-section post tag-mqtt public   last">
1583  
1584<div class="gl-post-card__metas">
1585  <div class="gl-post-card__tags">
1586      <a
1587        href="https://ubidots.com/blog/tag/mqtt/"
1588        class="gl-post-card__tag"
1589      >
1590        MQTT
1591      </a>
1592  </div>
1593    <div class="gl-post-card__authors">
1594      <div class="gl-post-card__avatars">
1595          <a
1596            href="/blog/author/agustin/"
1597            class="gl-post-card__avatar author-0"
1598            aria-hidden="true"
1599          >
1600            <img
1601              data-src="/blog/assets/images/avatar.jpg?v=0017488c26"
1602              alt=""
1603              width="24"
1604              height="24"
1605              class="gl-post-card__avatar__default lazy"
1606              aria-hidden="true"
1607            >
1608              <img
1609                data-src="/blog/content/images/size/w100/2019/03/agustin-compressor.png"
1610                alt="Agustin Pelaez"
1611                width="24"
1612                height="24"
1613                class="gl-post-card__avatar__image lazy"
1614              >
1615          </a>
1616      </div>
1617      <div class="gl-post-card__names">
1618        <a href="/blog/author/agustin/">Agustin Pelaez</a>
1619      </div>
1620    </div>
1621</div>
1622  <div class="gl-post-card__main">
1623      <a
1624        class="gl-post-card__image"
1625        href="/blog/mqtt-sparkplug-vs-plain-mqtt/"
1626        aria-hidden="true"
1627        tabindex="-1"
1628      >
1629        <img
1630          data-src="/blog/content/images/size/w720/2025/03/cover.png"
1631          alt=""
1632          width="300"
1633          height="200"
1634          class="lazy"
1635        />
1636      </a>
1637    <div class="gl-post-card__main-content">
1638      <div class="gl-post-card__metas-in-featured">
1639        
1640<div class="gl-post-card__metas">
1641  <div class="gl-post-card__tags">
1642      <a
1643        href="https://ubidots.com/blog/tag/mqtt/"
1644        class="gl-post-card__tag"
1645      >
1646        MQTT
1647      </a>
1648  </div>
1649    <div class="gl-post-card__authors">
1650      <div class="gl-post-card__avatars">
1651          <a
1652            href="/blog/author/agustin/"
1653            class="gl-post-card__avatar author-0"
1654            aria-hidden="true"
1655          >
1656            <img
1657              data-src="/blog/assets/images/avatar.jpg?v=0017488c26"
1658              alt=""
1659              width="24"
1660              height="24"
1661              class="gl-post-card__avatar__default lazy"
1662              aria-hidden="true"
1663            >
1664              <img
1665                data-src="/blog/content/images/size/w100/2019/03/agustin-compressor.png"
1666                alt="Agustin Pelaez"
1667                width="24"
1668                height="24"
1669                class="gl-post-card__avatar__image lazy"
1670              >
1671          </a>
1672      </div>
1673      <div class="gl-post-card__names">
1674        <a href="/blog/author/agustin/">Agustin Pelaez</a>
1675      </div>
1676    </div>
1677</div>
1678      </div>
1679      <div class="gl-post-card__main-text">
1680        <h2 class="gl-post-card__title">
1681          <a href="/blog/mqtt-sparkplug-vs-plain-mqtt/">
1682            MQTT Sparkplug vs. Plain MQTT: Why Sparkplug Matters for IIoT
1683          </a>
1684        </h2>
1685          <p class="gl-post-card__excerpt">
1686            MQTT Sparkplug simplifies IIoT with structured data, real-time device state awareness, and seamless scalability for industrial networks.
1687          </p>
1688      </div>
1689      <div class="gl-post-card__datetime">
1690        <div class="gl-post-card__time">
1691          <time datetime="2025-03-12">
1692            Mar 12, 2025
1693          </time>
1694            <span>·</span>
1695            <span>
1696              11 min read
1697            </span>
1698        </div>
1699      </div>
1700    </div>
1701  </div>
1702</article>
1703          </div>
1704        </div>
1705          <div class="gl-featured-section__pagination">
1706            
1707<nav
1708  class="gl-pagination"
1709  aria-label="Pagination"
1710>
1711  <a
1712    href=""
1713    class="gl-pagination__button prev disabled"
1714    tabindex="-1"
1715  >
1716    
1717  <svg
1718    width="20"
1719    height="20"
1720    class="gl-icon"
1721  >
1722    <use href="/blog/assets/images/icons.svg?v=0017488c26#arrow-left" />
1723  </svg>
1724    <span>Previous</span>
1725  </a>
1726  <span class="gl-pagination__label">
1727    Page 1 of 19
1728  </span>
1729  <a
1730    href="/blog/page/2/"
1731    class="gl-pagination__button next "
1732    tabindex="0"
1733  >
1734    <span>Next</span>
1735    
1736  <svg
1737    width="20"
1738    height="20"
1739    class="gl-icon"
1740  >
1741    <use href="/blog/assets/images/icons.svg?v=0017488c26#arrow-right" />
1742  </svg>
1743  </a>
1744</nav>
1745
1746          </div>
1747      </div>
1748        <div class="js-tags-section" style="display: none;" data-tags="">
1749          <div class="gl-wrapper">
1750            <div class="gl-featured-section js-tags-section-content"></div>
1751          </div>
1752        </div>
1753    </div>
1754  <div class="gl-wrapper small">
1755    
1756  </div>
1757</main>
1758
1759
1760      </div>
1761      
1762<footer x-data="footer()" class="gl-footer">
1763  <div class="gl-wrapper medium">
1764    <div class="gl-footer__wrapper">
1765      <div class="gl-footer__main">
1766        
1767<a
1768  href="https://ubidots.com"
1769  title="Ubidots Blog"
1770  class="gl-logo flex-start"
1771>
1772    <img
1773      src="https://ubidots.com/blog/content/images/2024/09/logo-ghost-ubi.png"
1774      alt=""
1775      width="96"
1776      height="32"
1777      class=""
1778    >
1779</a>
1780        <div class="gl-footer__nav-wrapper">
1781          <nav class="gl-footer__nav-section" aria-label="Main navigation">
1782            <ul class="js-footer-list">
1783              
1784    <li class="nav-home">
1785      <a href="https://ubidots.com">
1786        Home
1787      </a>
1788    </li>
1789    <li class="nav-platform">
1790      <a href="https://ubidots.com/platform">
1791        Platform
1792      </a>
1793    </li>
1794    <li class="nav-pricing">
1795      <a href="https://ubidots.com/pricing">
1796        Pricing
1797      </a>
1798    </li>
1799    <li class="nav-create-free-trial">
1800      <a href="https://ubidots.com/signup">
1801        Create free trial!
1802      </a>
1803    </li>
1804
1805            </ul>
1806          </nav>
1807          <nav class="gl-footer__nav-section" aria-label="Secondary navigation">
1808            <ul class="js-footer-list">
1809              
1810    <li class="nav-api-docs">
1811      <a href="https://docs.ubidots.com">
1812        API Docs
1813      </a>
1814    </li>
1815    <li class="nav-help-center">
1816      <a href="https://help.ubidots.com">
1817        Help Center
1818      </a>
1819    </li>
1820    <li class="nav-dev-center">
1821      <a href="https://dev.ubidots.com">
1822        Dev Center
1823      </a>
1824    </li>
1825    <li class="nav-community-forum">
1826      <a href="https://ubidots.com/community">
1827        Community Forum
1828      </a>
1829    </li>
1830    <li class="nav-ubidots-stem">
1831      <a href="https://ubidots.com/stem">
1832        Ubidots STEM
1833      </a>
1834    </li>
1835    <li class="nav-enterprise">
1836      <a href="https://ubidots.com/enterprise">
1837        Enterprise
1838      </a>
1839    </li>
1840    <li class="nav-contact-us">
1841      <a href="https://ubidots.com/contact">
1842        Contact Us
1843      </a>
1844    </li>
1845
1846            </ul>
1847          </nav>
1848          <div class="gl-footer__nav-section">
1849            <ul class="js-footer-list">
1850              <li>
1851                <button class="gl-footer__action" data-ghost-search>
1852                  
1853  <svg
1854    width="16"
1855    height="16"
1856    class="gl-icon"
1857  >
1858    <use href="/blog/assets/images/icons.svg?v=0017488c26#search" />
1859  </svg>
1860                  Search
1861                </button>
1862              </li>
1863              <li>
1864                
1865<div
1866  class="gl-footer__theme-selector-wrapper"
1867  x-data="themeSelector({
1868    labels: {
1869      system: 'System theme',
1870      light: 'Light theme',
1871      dark: 'Dark theme'
1872    }
1873  })"
1874>
1875  <button
1876    x-ref="selector"
1877    class="gl-footer__action"
1878    @click="toggleSelector"
1879    @click.away="open = false"
1880    >
1881    <template x-if="savedThemeMode === 'system'">
1882      
1883  <svg
1884    width="16"
1885    height="16"
1886    class="gl-icon"
1887  >
1888    <use href="/blog/assets/images/icons.svg?v=0017488c26#system" />
1889  </svg>
1890    </template>
1891    <template x-if="savedThemeMode === 'light'">
1892      
1893  <svg
1894    width="16"
1895    height="16"
1896    class="gl-icon"
1897  >
1898    <use href="/blog/assets/images/icons.svg?v=0017488c26#light" />
1899  </svg>
1900    </template>
1901    <template x-if="savedThemeMode === 'dark'">
1902      
1903  <svg
1904    width="16"
1905    height="16"
1906    class="gl-icon"
1907  >
1908    <use href="/blog/assets/images/icons.svg?v=0017488c26#dark" />
1909  </svg>
1910    </template>
1911    <span x-text="selectedLabel" class="truncable"></span>
1912  </button>
1913  <div
1914    x-show="open"
1915    x-transition
1916    x-cloak
1917    x-anchor.top.offset.12="$refs.selector"
1918    class="gl-footer__theme-selector"
1919  >
1920    <button class="gl-footer__action" @click="setThemeMode('system')">
1921      
1922  <svg
1923    width="16"
1924    height="16"
1925    class="gl-icon"
1926  >
1927    <use href="/blog/assets/images/icons.svg?v=0017488c26#system" />
1928  </svg>
1929      System theme
1930    </button>
1931    <button class="gl-footer__action" @click="setThemeMode('light')">
1932      
1933  <svg
1934    width="16"
1935    height="16"
1936    class="gl-icon"
1937  >
1938    <use href="/blog/assets/images/icons.svg?v=0017488c26#light" />
1939  </svg>
1940      Light theme
1941    </button>
1942    <button class="gl-footer__action" @click="setThemeMode('dark')">
1943      
1944  <svg
1945    width="16"
1946    height="16"
1947    class="gl-icon"
1948  >
1949    <use href="/blog/assets/images/icons.svg?v=0017488c26#dark" />
1950  </svg>
1951      Dark theme
1952    </button>
1953  </div>
1954</div>
1955
1956<script>
1957  function themeSelector({labels}) {
1958    return {
1959      open: false,
1960      labels,
1961      selectedLabel: labels.system,
1962      savedThemeMode: 'system',
1963      init() {
1964        this.initThemeMode()
1965      },
1966      toggleSelector() {
1967        this.open = !this.open
1968      },
1969      initThemeMode() {
1970        this.savedThemeMode = this.getThemeMode()
1971        this.setThemeMode(this.savedThemeMode)
1972
1973        if (window.matchMedia) {
1974          window.matchMedia('(prefers-color-scheme: dark)')
1975            .addEventListener('change', this.updateSystemTheme.bind(this))
1976        }
1977      },
1978      updateSystemTheme() {
1979        if (this.savedThemeMode !== 'system') {
1980          return
1981        }
1982
1983        if (this.isSystemDark()) {
1984          this.setThemeMode('dark', false)
1985        } else {
1986          this.setThemeMode('light', false)
1987        }
1988
1989        this.selectedLabel = this.labels.system
1990      },
1991      isSystemDark() {
1992        return window.matchMedia
1993          && window.matchMedia('(prefers-color-scheme: dark)').matches
1994      },
1995      setThemeMode(mode, saveTheme = true) {
1996        this.selectedLabel = this.labels[mode]
1997
1998        const html = document.querySelector('html')
1999        html.setAttribute('theme-mode', mode)
2000
2001        if (saveTheme) {
2002          this.savedThemeMode = mode
2003
2004          if (mode === 'system') {
2005            this.updateSystemTheme()
2006          }
2007
2008          localStorage.setItem('glow-theme-mode', mode)
2009        }
2010
2011        this.rerenderGhostIframes()
2012      },
2013      getThemeMode() {
2014        const localValue = localStorage.getItem('glow-theme-mode')
2015
2016        if (!localValue) {
2017          return 'system'
2018        }
2019
2020        return localValue
2021      },
2022      rerenderGhostIframes() {
2023        const comments = document.querySelector('.js-comments > div > iframe')
2024
2025        if (comments) {
2026          comments.contentDocument.location.reload(true)
2027        }
2028      }
2029    }
2030  }
2031</script>
2031
2032              </li>
2033            </ul>
2034          </div>
2035        </div>
2036      </div>
2037      <div class="gl-footer__secondary">
2038        
2039<ul class="gl-social-links">
2040    <li>
2041      <a href="https://twitter.com/ubidots" target="_blank" rel="noopener">
2042        
2043  <svg
2044    width="16"
2045    height="16"
2046    class="gl-icon"
2047  >
2048    <use href="/blog/assets/images/icons.svg?v=0017488c26#x" />
2049  </svg>
2050        <span class="sr-only">X</span>
2051      </a>
2052    </li>
2053    <li>
2054      <a href="https://www.facebook.com/ubidots" target="_blank" rel="noopener">
2055        
2056  <svg
2057    width="16"
2058    height="16"
2059    class="gl-icon"
2060  >
2061    <use href="/blog/assets/images/icons.svg?v=0017488c26#facebook" />
2062  </svg>
2063        <span class="sr-only">Facebook</span>
2064      </a>
2065    </li>
2066  <li>
2067    <a href="https://ubidots.com/blog/rss" target="_blank" rel="noopener">
2068      
2069  <svg
2070    width="16"
2071    height="16"
2072    class="gl-icon"
2073  >
2074    <use href="/blog/assets/images/icons.svg?v=0017488c26#rss" />
2075  </svg>
2076      <span class="sr-only">RSS</span>
2077    </a>
2078  </li>
2079</ul>
2080        <p class="gl-footer__footnote">
2081            Ubidots Team
2082        </p>
2083      </div>
2084    </div>
2085  </div>
2086</footer>
2087
2088<script>
2089  function footer() {
2090    return {
2091      init() {
2092        const footerLists = this.$el.querySelectorAll('.js-footer-list')
2093        footerLists.forEach((list) => {
2094          if (list.children.length === 0) {
2095            list.parentElement.remove()
2096          }
2097        })
2098      }
2099    }
2100  }
2101</script>
2101
2102    </div>
2103
2104    
2104<script src="/blog/assets/js/manifest.js?v=0017488c26" defer></script>
2104
2105    
2105<script src="/blog/assets/js/vendor.js?v=0017488c26" defer></script>
2105
2106    
2106<script src="/blog/assets/js/app.js?v=0017488c26" defer></script>
2106
2107
2108      
2108<script defer src="/blog/assets/js/home.js?v=0017488c26"></script>
2108
2109
2110
2111    
2111<script>
2112// Taken from https://forum.ghost.org/t/open-links-in-new-window/1726/4
2113$('a').each(function() {
2114    var a = new RegExp('/(ubidots.com|' + window.location.host + ')/');
2115    if(!a.test(this.href)) {
2116        $(this).click(function(event) {
2117            event.preventDefault();
2118            event.stopPropagation();
2119            window.open(this.href, '_blank');
2120        });
2121    }
2122});
2123    
2124// https://highlightjs.org/
2125activateHighlight = function() {
2126    document.querySelectorAll("pre code").forEach(
2127        function(currentValue, currentIndex, listObj) {
2128    		hljs.highlightBlock(currentValue);
2129        }
2130    );
2131}
2132
2133if (window.attachEvent) {
2134    window.attachEvent('onload', loadHighlight);
2135} else {
2136    if (window.onload) {
2137		var originalOnload = window.onload;
2138    	var newOnload = function(evt) {
2139        	originalOnload(evt);
2140        	activateHighlight(evt);
2141    	};
2142    	window.onload = newOnload;
2143    } else {
2144        window.onload = activateHighlight;
2145    }
2146}
2147</script>
2147
2148
2149<script>
2150(function(document, history, location) {
2151  var HISTORY_SUPPORT = !!(history && history.pushState);
2152
2153  var anchorScrolls = {
2154    ANCHOR_REGEX: /^#[^ ]+$/,
2155    OFFSET_HEIGHT_PX: 130,
2156
2157    /**
2158     * Establish events, and fix initial scroll position if a hash is provided.
2159     */
2160    init: function() {
2161      this.scrollToCurrent();
2162      $(window).on('hashchange', $.proxy(this, 'scrollToCurrent'));
2163      $('body').on('click', 'a', $.proxy(this, 'delegateAnchors'));
2164    },
2165
2166    /**
2167     * Return the offset amount to deduct from the normal scroll position.
2168     * Modify as appropriate to allow for dynamic calculations
2169     */
2170    getFixedOffset: function() {
2171      return this.OFFSET_HEIGHT_PX;
2172    },
2173
2174    /**
2175     * If the provided href is an anchor which resolves to an element on the
2176     * page, scroll to it.
2177     * @param  {String} href
2178     * @return {Boolean} - Was the href an anchor.
2179     */
2180    scrollIfAnchor: function(href, pushToHistory) {
2181      var match, anchorOffset;
2182
2183      if(!this.ANCHOR_REGEX.test(href)) {
2184        return false;
2185      }
2186
2187      match = document.getElementById(href.slice(1));
2188
2189      if(match) {
2190        anchorOffset = $(match).offset().top - this.getFixedOffset();
2191        $('html, body').animate({ scrollTop: anchorOffset});
2192
2193        // Add the state to history as-per normal anchor links
2194        if(HISTORY_SUPPORT && pushToHistory) {
2195          history.pushState({}, document.title, location.pathname + href);
2196        }
2197      }
2198
2199      return !!match;
2200    },
2201    
2202    /**
2203     * Attempt to scroll to the current location's hash.
2204     */
2205    scrollToCurrent: function(e) { 
2206      if(this.scrollIfAnchor(window.location.hash) && e) {
2207      	e.preventDefault();
2208      }
2209    },
2210
2211    /**
2212     * If the click event's target was an anchor, fix the scroll position.
2213     */
2214    delegateAnchors: function(e) {
2215      var elem = e.target;
2216      if(elem.getAttribute('href') != '#subscribe'){
2217          if(this.scrollIfAnchor(elem.getAttribute('href'), true)) {
2218        		e.preventDefault();
2219      	  	}
2220      }
2221    }
2222  };
2223	$(window).on( "load", $.proxy(anchorScrolls, 'init'));
2224	//$(document).ready($.proxy(anchorScrolls, 'init'));
2225})(window.document, window.history, window.location);
2226</script>
vendor: 1 bytes, line 2226
2226
2227<script>
2228  document.addEventListener('DOMContentLoaded', function() {
2229    var links = document.querySelectorAll('a');
2230    links.forEach(function(link) {
2231      if (link.hostname != window.location.hostname) {
2232        link.target = '_blank';
2233      }
2234    });
2235  });
2236</script>
2236
2237
2238  </body>
2239</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.