<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Indeema Software</title>
    <description>The latest articles on DEV Community by Indeema Software (@indeemasoftware).</description>
    <link>https://dev.to/indeemasoftware</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F136020%2F7bb1426d-bb30-49b3-ad74-4e253011032c.jpg</url>
      <title>DEV Community: Indeema Software</title>
      <link>https://dev.to/indeemasoftware</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/indeemasoftware"/>
    <language>en</language>
    <item>
      <title>Giving a presentation with perfect UI/UX design</title>
      <dc:creator>Indeema Software</dc:creator>
      <pubDate>Tue, 15 Oct 2019 14:23:38 +0000</pubDate>
      <link>https://dev.to/indeemasoftware/giving-a-presentation-with-perfect-ui-ux-design-428k</link>
      <guid>https://dev.to/indeemasoftware/giving-a-presentation-with-perfect-ui-ux-design-428k</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Every single one of us gives presentations from time to time. What can be difficult about creating a couple of slides with great UI and nice content, right? Well... not really actually. In real life, things may get difficult.&lt;/p&gt;

&lt;p&gt;You want to cover the whole topic and give as much information as fits on a slide. Then you go to Google to find some awesome pictures, and finally, cover it all with some fancy animation. And here is where things start falling apart: how do you balance all this stuff?&lt;/p&gt;

&lt;p&gt;Take our helping hand, as we are here to show you how to create a presentation with both perfect user experience and user interface. Let's find out how to create perfect UI &amp;amp; UX design in a presentation.&lt;/p&gt;

&lt;p&gt;Original article - &lt;a href="https://indeema.com/blog/giving-a-presentation-with-perfect-uiux-design"&gt;Giving a presentation with perfect UI/UX design&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Main principles of perfect UI/UX in presentation&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Your personality
&lt;/h3&gt;

&lt;p&gt;This article is not about public speaking, or how to sound great. Instead, we'll concentrate on visual and UX design of presenting.&lt;/p&gt;

&lt;p&gt;But the main thing to remember is that your presentation is you. Think of your personality as a part of the presentation as a whole. Your voice, facial expressions, gestures, clothes matter. Do you want to be the center of attention, or should your slides attract the audience? Should your colorful clothes and bright lipstick grab the attention, or do you want listeners to concentrate only on your slides?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wQvRn0We--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/Giving-a-presentation-with-perfect-UI-UX/Im1Youarepartofpresentation.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wQvRn0We--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/Giving-a-presentation-with-perfect-UI-UX/Im1Youarepartofpresentation.png" alt="You are part of presentation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Right Place, Time and People
&lt;/h3&gt;

&lt;p&gt;There are a few points from marketing which you should consider while making your presentation. Use Market segmentation, analyze the target audience and try to create user personas. You don't have to go deep with this, but at least try to understand the needs and behaviors of your listeners. This will help you with setting general style, choosing pictures and templates, color schemes, etc. For example, there is a huge difference in designing slides for iOS developers' conferences, business proposal or meet up for graphic designers. When you pitch your &lt;a href="https://indeema.com/blog/how-to-create-a-startup--iot-project-from-idea-to-production"&gt;startup idea&lt;/a&gt;, your UX design in presentation will look different as well. Same applies to giving presentations at &lt;a href="https://indeema.com/blog/5-must-visit-iot-conferences-in-2019"&gt;conferences&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RyG5VF0t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/Giving-a-presentation-with-perfect-UI-UX/Im2Target_Audience.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RyG5VF0t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/Giving-a-presentation-with-perfect-UI-UX/Im2Target_Audience.png" alt="Target audience"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  3. KISS and Less is More
&lt;/h3&gt;

&lt;p&gt;Slides work best if you keep them simple rather than overcomplicate. Emphasize every part of your slide, and you lose the user's attention at all.&lt;/p&gt;

&lt;p&gt;How to ruin your presentation and make slides hard to understand? Do the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Overuse animation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add lots of pictures&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Don't forget about huge paragraphs that are hard to read&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What your users see are different attention catchers that compete for priority. Keep them to a minimum to draw the attention of more users. So what's the secret? Keep it simply stupid: make the presentation design clean and to the point.&lt;/p&gt;

&lt;p&gt;So let's see how it works:&lt;/p&gt;

&lt;p&gt;| &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UGh8gq7M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/Giving-a-presentation-with-perfect-UI-UX/Im31Do.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UGh8gq7M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/Giving-a-presentation-with-perfect-UI-UX/Im31Do.png" alt="KISS principle"&gt;&lt;/a&gt; | &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LVPqQQy0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/Giving-a-presentation-with-perfect-UI-UX/Im31Dont.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LVPqQQy0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/Giving-a-presentation-with-perfect-UI-UX/Im31Dont.png" alt="KISS principle don't do"&gt;&lt;/a&gt; |&lt;br&gt;
| **                                     Do** | **                                  Don't** |&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Use white space and play with user attention
&lt;/h3&gt;

&lt;p&gt;Whitespace is not white parts of your slide. Whitespace is any section of a slide that is free of text, images, charts, etc. or simply space around these objects. Use it, and your presentation will look less crowded and more easy-to-read. Also, whitespace helps to separate content into logical blocks.&lt;/p&gt;

&lt;p&gt;Don't place all the text from your speech on the slides. Most people just don't read it. Concentrate on the main points: 3-4 sentences will be OK. It's ok to put only 1 sentence, few words or just one picture if they are very important. You can also do it to achieve the maximum focus of listeners.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--42XcW1nz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/Giving-a-presentation-with-perfect-UI-UX/Im3Youreyes.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--42XcW1nz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/Giving-a-presentation-with-perfect-UI-UX/Im3Youreyes.png" alt="How to play with user attention"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Typography
&lt;/h2&gt;

&lt;p&gt;Picking the right typeface is probably one of the first steps of creating a presentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Font types
&lt;/h3&gt;

&lt;p&gt;First of all, select only well-readable fonts. Of course, you can use some experimental ones or spend a lot of time finding the best one to suit your slides. But if you want to play safe or you don't have time/desire to do it, here are time-proved fonts with the best readability:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Helvetica&lt;/li&gt;
&lt;li&gt;  Poppins&lt;/li&gt;
&lt;li&gt;  Open Sans&lt;/li&gt;
&lt;li&gt;  Verdana&lt;/li&gt;
&lt;li&gt;  Roboto&lt;/li&gt;
&lt;li&gt;  Lato&lt;/li&gt;
&lt;li&gt;  Futura&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Create your font-system for the presentation, but don't overdo it. One-two fonts will be enough.&lt;/p&gt;

&lt;h3&gt;
  
  
  Font size
&lt;/h3&gt;

&lt;p&gt;Be accurate with the font size. The best way to avoid mistakes is to avoid thin, delicate typefaces at a small size --- use 14-16 as min.&lt;/p&gt;

&lt;p&gt;Create a system for titles, subtitles, and textual blocks and try to keep it on every slide. Here's the safe recipe for Poppins font:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Titles - 24&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Subtitles - 18&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Main text - 14-16&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These tips will help you avoid drowning your audience with the crazy amount of combinations and focus on the content instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  And last font hint
&lt;/h3&gt;

&lt;p&gt;Never use Comic Sans and don't graphically modify the text. You can use bevel, drop shadow, emboss and outline, but you rather not.&lt;/p&gt;

&lt;p&gt;These font styles are outdated and their star time passed around 1998.&lt;/p&gt;

&lt;h2&gt;
  
  
  Images
&lt;/h2&gt;

&lt;p&gt;Use high-quality images with a big resolution. Don't steal them and never use photos with watermarks in your presentation. I bet your listeners will notice nothing except watermarks or pixel-detailed photos and will giggle instead of listening.&lt;/p&gt;

&lt;p&gt;There are several websites with stock photos that are free to use. I use several of them&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.pexels.com/"&gt;Pexels&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://unsplash.com/"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://gratisography.com/"&gt;Gratisography&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pixabay.com/"&gt;Pixabay&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, try to avoid using images as a background for text. Sometimes it can work very well, but in most cases, it just lowers the level of readability. If you want to go with images as a background, then be ready to spend some time on photo editing and to use masks, shadows, and gradients.&lt;/p&gt;

&lt;h2&gt;
  
  
  Colors
&lt;/h2&gt;

&lt;p&gt;Picking colors for your presentation is not rocket science. The main point is to pick the colors with adequate contrast. Complementary pairs such as red-cyan, green--magenta, and blue-yellow will work well for sure.&lt;/p&gt;

&lt;p&gt;Concentrate on two or three colors for contrast elements and keep the main textual content black (or dark grey) for light mode and white for dark mode. Keep in mind that paragraph text should always be in one color. Pay attention that usually projectors make colors paler so light grey text on a white background will not work at all in this case.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wOGimEG6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/Giving-a-presentation-with-perfect-UI-UX/Im5ColorPalettes.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wOGimEG6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/Giving-a-presentation-with-perfect-UI-UX/Im5ColorPalettes.png" alt="Color palettes for presentation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Slide composition
&lt;/h2&gt;

&lt;p&gt;Don't overload the slide and try to define the main accent object. Arranging it on Golden Ratio always works well. Divide the space into three equal sections horizontally and three vertically. Also, don't forget about symmetry and equal whitespace for borders. Rearrange main content blocks to align with this greed, so you can keep the audience's attention. Similar slides make them feel bored and tire eyes.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NigK4KQ0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/Giving-a-presentation-with-perfect-UI-UX/Im6Arrange.png" alt="Arrange presentation"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0ToHGGEa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/Giving-a-presentation-with-perfect-UI-UX/Im61Grid.png" alt="Grid presentation"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Treat your presentation as a visual object. A bit of marketing research on your audience, font system, color scheme, grid composition of elements and whitespace will make magic. But always remember that you and your personality make your presentation work. CrEATe!&lt;/p&gt;

</description>
      <category>design</category>
      <category>presentation</category>
    </item>
    <item>
      <title>How to create IoT startup: Step-by-step guide</title>
      <dc:creator>Indeema Software</dc:creator>
      <pubDate>Thu, 19 Sep 2019 08:08:59 +0000</pubDate>
      <link>https://dev.to/indeemasoftware/how-to-create-iot-startup-step-by-step-guide-pha</link>
      <guid>https://dev.to/indeemasoftware/how-to-create-iot-startup-step-by-step-guide-pha</guid>
      <description>&lt;p&gt;This time, we're going to dive in the ups and downs of IoT development with a step-by-step tutorial. Real-life example, no theoretical "maybes", and lots of experience included. Quick references to related articles as a bonus.&lt;/p&gt;

&lt;p&gt;Original article &lt;a href="https://indeema.com/blog/how-to-create-a-startup--iot-project-from-idea-to-production" rel="noopener noreferrer"&gt;How to create a startup: IoT project from idea to production&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Overview:&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt; Shape idea into set of goals&lt;/li&gt;
&lt;li&gt; Find potential users&lt;/li&gt;
&lt;li&gt; Find development team&lt;/li&gt;
&lt;li&gt; Prepare technical specification&lt;/li&gt;
&lt;li&gt; Design the product&lt;/li&gt;
&lt;li&gt; Create a prototype&lt;/li&gt;
&lt;li&gt; Start software development&lt;/li&gt;
&lt;li&gt; Create 3D model&lt;/li&gt;
&lt;li&gt; Start beta testing&lt;/li&gt;
&lt;li&gt;Launch MVP&lt;/li&gt;
&lt;li&gt;Start production&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Before we start
&lt;/h2&gt;

&lt;p&gt;It's high time for &lt;a href="https://indeema.com/blog/4th-industrial-revolution" rel="noopener noreferrer"&gt;industrial revolution #4&lt;/a&gt;, and you shouldn't miss this opportunity. What is the right way to take part in this wave? Since we already wrote a basic article about &lt;a href="https://indeema.com/blog/from-idea-to-success" rel="noopener noreferrer"&gt;making idea become a real product&lt;/a&gt;, this time we decided to write a guide that you can use to achieve results on each step and get thorough understanding of the process. So, let's begin!&lt;/p&gt;

&lt;h2&gt;
  
  
  Shape idea into set of goals
&lt;/h2&gt;

&lt;p&gt;First things first, you should clearly understand and define your goal and divide it into subgoals prior to any development.\&lt;br&gt;
Your project requirements should include the following information:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;What is your perfect final product?&lt;/strong&gt;\
Describe it as detailed as possible. What do you plan to achieve with this product? On this stage, write everything that can be applied, you'll update and refine the document later many times.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;What are the main features?&lt;/strong&gt;\
Write down a list of main reasons people will want to use your product for. Why this functionality is essential and required for success?&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;What is your first product version?&lt;/strong&gt;\
Plan what the minimum viable product (MVP) will comprise so that you can start selling and collect feedback.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Keep in mind that your project requirements should contain both technical and business-related parts of the system. Where, why, and how the end users will use your product? Defining clear and sufficient project requirements is critical as explains the team what they should create and why. Otherwise, &lt;a href="https://indeema.com/blog/the-top-5-reasons-you-re-failing-to-meet-your-project-deadline" rel="noopener noreferrer"&gt;you are in a risk list to fail the deadlines.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See our &lt;a href="https://docs.google.com/document/d/1p8ZQQ0RyAMrBkGTnI0UQZ2NiU09WgCPfdQ6HK1fWu74/edit?usp=sharing" rel="noopener noreferrer"&gt;project description template&lt;/a&gt; for reference. While creating unique template for all kinds of projects is definitely not possible, we hope the samples we give in our articles will be useful for you.&lt;/p&gt;

&lt;p&gt;To better understand specifics of IoT development, check our article with a &lt;a href="https://indeema.com/blog/what-does-it-take-to-create-a-simple-iot-solution" rel="noopener noreferrer"&gt;short overview of existing solutions and nuances&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-create-a-startup-IoT-project-from-idea-to-production%2Finfographics.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-create-a-startup-IoT-project-from-idea-to-production%2Finfographics.png" alt="How to create a startup"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  First steps
&lt;/h2&gt;

&lt;p&gt;After your project description is ready, you can share it with your team and discuss all the details. Update the document if you find reasonable feedback.&lt;/p&gt;

&lt;h3&gt;
  
  
  Find potential users
&lt;/h3&gt;

&lt;p&gt;If you have prospective customers before you start the development, that means your system is in demand. Also, you can start beta testing right when the initial version of the system is ready. Moreover, early customers will help you make sales right from the start.\&lt;br&gt;
Still, you can look for potential customers while development is in progress.&lt;/p&gt;

&lt;h3&gt;
  
  
  Find development team
&lt;/h3&gt;

&lt;p&gt;Here are the most common approaches:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Outsource the development\
If you think that outsourcing will not bring you success, check &lt;a href="https://indeema.com/blog/15-startups-owing-success-to-outsourced-development" rel="noopener noreferrer"&gt;15 startups that owe success to outsourced development.&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt; Since you're reading this article, the easiest way is to &lt;a href="https://indeema.com/contact-us" rel="noopener noreferrer"&gt;contact us&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt; Ask your friends or just google the pro IoT development company.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In this case, before interview and negotiations, read &lt;a href="https://indeema.com/blog/how-to-know-your-outsourcing-team-isn-t-overcharging-you" rel="noopener noreferrer"&gt;how to learn if the outsourcing team is overcharging you.&lt;/a&gt;\&lt;br&gt;
&lt;strong&gt;Conclusion:&lt;/strong&gt; Professional outsourced team saves you time and costs as well as provides impersonal and useful feedback. Messy team will get you nowhere.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://calc.indeema.com/" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-create-a-startup-IoT-project-from-idea-to-production%2FBanner.png" alt="Indeema cost calculator"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2. Gather your own team&lt;/p&gt;

&lt;p&gt;This alternative seems really nice, but be aware of pitfalls:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Gathering full-fledged team takes time (and office space).&lt;/li&gt;
&lt;li&gt;  You need to pay taxes, sick leaves, vacations for each member.&lt;/li&gt;
&lt;li&gt;  You need to constantly motivate them, plan and monitor their work or hire more staff for that purpose.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;: you'll have much less time for evolving your business. But you'll have an in-house team.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prepare technical specification
&lt;/h3&gt;

&lt;p&gt;After finding the team that will implement technical part, start working on technical project specification. Project description explains the "whats" of your product. Now you have to get down to "hows".&lt;/p&gt;

&lt;p&gt;Don't underestimate the value of such document. While it may look like wasting time (it's not), it saves you time, money, and nerves in the long run. Particularly, you'll notice you didn't define about stuff like interaction, each page's content, etc., and what tools you'll need for their implementation.&lt;/p&gt;

&lt;p&gt;Go through the document carefully to make sure you missed nothing. It will be a lot cheaper and faster to define the scope from the start, then change it in the process. Yet, the specification may be updated further after preparing the design (that's okay, it will crystallize the budget and timeline more).\&lt;br&gt;
You can find template for project technical description here - &lt;a href="https://docs.google.com/document/d/1GE67-Za_T6owHwQDzfVXkvZ8YCe2wSWhxqf0ZFPpsew/edit?usp=sharing" rel="noopener noreferrer"&gt;Project Technical description template&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Design the product
&lt;/h2&gt;

&lt;p&gt;So now, when you fully understand what needs to be done for your product, visualize it. Taking both intended use and technical specifics into account, design your hardware and applications, and include them into project description and specification.&lt;/p&gt;

&lt;p&gt;Design will also reveal many things you missed while describing. This way your budgeting will be better and better. We've drilled down the example budgeting of IoT projects works, you can check it out here - &lt;a href="https://indeema.com/blog/how-much-does-it-cost-to-create-iot-solution" rel="noopener noreferrer"&gt;How much does it cost to create IoT solution?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Back on the design track, here's a visualisations:&lt;/p&gt;

&lt;h3&gt;
  
  
  Hardware design
&lt;/h3&gt;

&lt;p&gt;The device design is important, because it answers the following questions:&lt;/p&gt;

&lt;p&gt;Commercial:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Will consumers find it appealing and want to buy it for their home/office or as a present?&lt;/li&gt;
&lt;li&gt;  What color, shape, and overall look should it have to be attractive?&lt;/li&gt;
&lt;li&gt;  How to make production easy and cost-effective?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Technical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Will there be any limitations in terms of size, shape, materials?&lt;/li&gt;
&lt;li&gt;  Will it be durable and usable in the intended environment?&lt;/li&gt;
&lt;li&gt;  Will all required mechanical parts fit in this device?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-create-a-startup-IoT-project-from-idea-to-production%2Fb5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-create-a-startup-IoT-project-from-idea-to-production%2Fb5.png" alt="UBreez box"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Software design
&lt;/h3&gt;

&lt;p&gt;The design of your software, be it a mobile, web, or desktop application, literally defines how users will perceive your product. Make it as easy to use and intuitive as possible (even if the functionality behind it is super complex). Here's our example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-create-a-startup-IoT-project-from-idea-to-production%2Fb6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-create-a-startup-IoT-project-from-idea-to-production%2Fb6.png" alt="Ubreez Applicztion"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prototype and test concepts
&lt;/h2&gt;

&lt;p&gt;Awesome, with design in place, both you and your team have a vision of how the product should look like, and that's one of the most important things. Yet, you may not have a complete understanding of the flow: how the users can interact with both software and hardware part of your product.&lt;/p&gt;

&lt;p&gt;To identify any inconveniences/redundancies prior to development and production, it's better to spend a little time and create a prototype.\&lt;br&gt;
For application prototype, you may use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://www.invisionapp.com/" rel="noopener noreferrer"&gt;https://invisionapp.com&lt;/a&gt; and &lt;a href="https://marvelapp.com/" rel="noopener noreferrer"&gt;https://marvelapp.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Please check our sample &lt;a href="https://projects.invisionapp.com/share/R2OQ3733A9B#/screens/327098547_Sign_Up_Empty" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.adobe.com/products/xd.html" rel="noopener noreferrer"&gt;https://www.adobe.com/products/xd.html&lt;/a&gt;\
One of the best tools to test the UX of your app.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For hardware prototype, create draft device that contains basic functions and proves feasibility of your idea. Neither size and weight, nor the look matter now as you only explore functionality. Your main goal now is verifying that system reads data from sensors and loads it on MQTT broker (or any other IoT data transfer protocol like WebSocket, HTTP REST,  or CoAP that you're using). Here is an example of our prototype:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-create-a-startup-IoT-project-from-idea-to-production%2Fb4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-create-a-startup-IoT-project-from-idea-to-production%2Fb4.png" alt="Ubreez prototype"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using this prototype, we understood that we needed better implementation for setup button, so we updated the design and started establishing the easiest connection flow. First, for connecting, users had to press and hold this button to turn the device into setup mode and connecting to Wi-Fi hotspot. But later we further enhanced and simplified the flow using Bluetooth.&lt;/p&gt;

&lt;p&gt;At this point, app and device prototypes are not connected as we tested if the concepts work fine (and as we expected). We verified the transfer of data to MQTT broker on the hardware, and clicked each screen to understand if both look and feel of the app are appealing and intuitive.\&lt;br&gt;
With this information at hand, we can move on to the software development stage.&lt;/p&gt;

&lt;p&gt;Awesome! With all preparations done, we can proceed to the development. Next two stages may be done in any sequence or simultaneously because they are independent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Software development
&lt;/h2&gt;

&lt;p&gt;We wrote tons of articles about the development specifics already, so here we'll outline what is a must for successful work:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Clearly plan deadlines. We don't want the development to take forever, do we?&lt;/li&gt;
&lt;li&gt; Specify use cases for testing. We want to cover all scenarios and verify everything works fine.&lt;/li&gt;
&lt;li&gt; Create backlog of tasks. Let's remove duplicates and make sure we implement all the necessary.&lt;/li&gt;
&lt;li&gt; Plan first sprint. The more detailed and thorough is our start, the clearer we see what we'll need to do next.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Learn more about our development process:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;a href="https://indeema.com/blog/project-management-best-practices" rel="noopener noreferrer"&gt;Project management best practices&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt; &lt;a href="https://indeema.com/blog/the-perfect-software-development-process" rel="noopener noreferrer"&gt;The perfect software development process&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt; &lt;a href="https://indeema.com/blog/setting-up-and-managing-a-mobile-project-at-indeema" rel="noopener noreferrer"&gt;Setting up and managing a mobile project at Indeema&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt; &lt;a href="https://indeema.com/blog/a-perfect-team-structure-for-a-perfect-release" rel="noopener noreferrer"&gt;A perfect team structure for a perfect release&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Apart from the development, we should never forget testing. While it might be possible to become new IBM without QA team, here's what we think about testing: &lt;a href="https://indeema.com/blog/the-importance-of-automated-testing-on-complex-projects" rel="noopener noreferrer"&gt;The importance of automated testing on complex projects.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create 3D model
&lt;/h2&gt;

&lt;p&gt;With both tech description and all specifications for each hardware component, you can start working on 3D model of your hardware for an MVP solution. We designed and printed it on 3D printer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://indeema.com/blog/project-management-best-practices" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-create-a-startup-IoT-project-from-idea-to-production%2Fb2.png" alt="3d UBox model"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To check if device really looks and feels the way we expect, we printed the model on our 3D printer.&lt;/p&gt;

&lt;p&gt;And here's the printing result:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-create-a-startup-IoT-project-from-idea-to-production%2Fb1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-create-a-startup-IoT-project-from-idea-to-production%2Fb1.png" alt="UBox"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It still doesn't have a production look, but the size and functionality are correct, and we can check if that's what we expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start beta testing
&lt;/h2&gt;

&lt;p&gt;Our MVP is ready, let's start testing it on the first clients.\&lt;br&gt;
First of all, we decided to start testing the product in our office. We installed 7 devices in 7 rooms (3 meeting rooms, kitchen, and 3 workrooms).&lt;/p&gt;

&lt;p&gt;Everyone in our company installed application and started using it. Moreover, to get diverse feedback from a variety of people, we gave the products to our friends and partner companies.\&lt;br&gt;
The main goal of beta testing is to determine any issues we missed previously, learn if there is enough functionality and if the right functionality was selected for the first version.&lt;/p&gt;

&lt;h2&gt;
  
  
  Launch MVP
&lt;/h2&gt;

&lt;p&gt;First things first, what is and MVP and why do we need and MVP? You can find the answers in our article &lt;a href="https://indeema.com/blog/mvp--preventing-commercial-products-from-risks" rel="noopener noreferrer"&gt;MVP: preventing commercial products from risks&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Minimum viable product is a version that contains only the main and the most important functionality. For this exact functionality people want to use the product and recommend it to others. So  and ordered printing of our 3D models at a professional production with high-quality 3D printers, so they have attractive boxes. In most cases, people care about the look, and even if they say they need functionality only, they still want nice-looking things:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-create-a-startup-IoT-project-from-idea-to-production%2Fb3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-create-a-startup-IoT-project-from-idea-to-production%2Fb3.png" alt="Ubreez"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Both the functionality you select and the appearance are crucial for successful marketing of MVP. To support our sales campaign and expand knowledge about our product, we've also developed a landing page &lt;a href="https://ubreez.com/" rel="noopener noreferrer"&gt;https://ubreez.com/.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Ready, set, production
&lt;/h2&gt;

&lt;p&gt;After getting feedback from beta testers, we found few issues that should be improved.  Since that was our main goal for beta testing, we were glad to see it gone well. So, we enhanced the product and ordered a large amount of devices at professional production. We don't assemble the devices in our office, because that's not our speciality and we won't do it as effective as any professional factory. So, the goal is reached, and it's time to start making sales.\&lt;br&gt;
You can check the applications at:\&lt;br&gt;
&lt;a href="https://itunes.apple.com/ua/app/ubreez/id1456605643?mt=8" rel="noopener noreferrer"&gt;App Store&lt;/a&gt;\&lt;br&gt;
&lt;a href="https://play.google.com/store/apps/details?id=com.indeema.safespace&amp;amp;hl=en" rel="noopener noreferrer"&gt;Play Market&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The end? Definitely not!    
&lt;/h2&gt;

&lt;p&gt;Our product is developed, it's successful, and we grow each second. Is that the end? Of course not, I dare even say that it's just a beginning.\&lt;br&gt;
When you launch the product, what's next? Learn at "&lt;a href="https://indeema.com/blog/is-there-life-after-app-release" rel="noopener noreferrer"&gt;Is there life after app release?&lt;/a&gt;"&lt;/p&gt;

&lt;p&gt;Thanks for reading!\&lt;br&gt;
Leave comments and subscribe to our blog, there's a lot of new good stuff coming soon.&lt;/p&gt;

</description>
      <category>iot</category>
      <category>internetofthings</category>
      <category>startup</category>
    </item>
    <item>
      <title>SCADA visualization for IoT projects [Free Library]</title>
      <dc:creator>Indeema Software</dc:creator>
      <pubDate>Tue, 17 Sep 2019 07:13:20 +0000</pubDate>
      <link>https://dev.to/indeemasoftware/scada-visualization-for-iot-projects-free-library-48g9</link>
      <guid>https://dev.to/indeemasoftware/scada-visualization-for-iot-projects-free-library-48g9</guid>
      <description>&lt;p&gt;There's a lot of IoT SCADA solutions for factories and other manufacturing needs. Yet, there are cases (and quite a lot), when you need to develop your own SCADA system to cover specific needs of your project.&lt;/p&gt;

&lt;p&gt;Original article - &lt;a href="https://indeema.com/blog/iot-dashboard-library--visualize-scada-at-a-snap--free-iot-library-"&gt;IoT dashboard library: visualize SCADA at a snap&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We often use awesome Qt framework for implementing complex IoT solutions. For a bunch SCADA and SCADA-like projects, we came across the need for quick tool for developing device dashboards. That's why we developed super lightweight unofficial Qt library. The library is open source, customizable, and free to use under MIT license. We also share a small set of developed widgets.&lt;/p&gt;

&lt;p&gt;Enjoy and use Qt ;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;README&lt;/strong&gt;: This library is created for desktop, mobile, and embedded projects developed on Qt. To use it, you should know Qt/ C++ and QML.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing QSimpleScada
&lt;/h2&gt;

&lt;p&gt;Let us introduce you to a nifty library for your IoT projects. We created QSimpleScada to speed up and simplify visualising any data, so we (and you) can concentrate on developing automation algorithms that rock.&lt;/p&gt;

&lt;p&gt;It was mainly created to quicken and, consequently, reduce the &lt;a href="https://indeema.com/blog/how-much-does-it-cost-to-create-iot-solution"&gt;cost of IoT solution.&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is QSimpleScada?
&lt;/h3&gt;

&lt;p&gt;It's a library that completely handles connection to and editing of widgets. Using QSimpleScada, you can easily create a visualization of IoT data using your mouse and a little code. After you are satisfied with the layout, save the generated .xml file and use it in your project.&lt;/p&gt;

&lt;p&gt;Library is created with Qt/C++ and basic widget is based on C++. There is interface for QML, so you can independently create individual widgets on QML (as when creating classic QML UIs) and upload them to your app on a go.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why do I need it?
&lt;/h3&gt;

&lt;p&gt;Well, you do if you are a Qt developer or a company and:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Have strict deadlines and complex data evaluations at your project&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Need to prototype mobile/embedded/desktop IoT projects often&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Need a one-stop tool for diverse Qt projects&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Don't want/have time/resources to develop dashboards from scratch&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If neither of the above is about you, then you don't.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why build IoT dashboards?
&lt;/h3&gt;

&lt;p&gt;Well, it may sound a bit redundant, so feel free to skip this section if this question is self-evident to you. Otherwise, there are quite a few reasons to visualize info you got from Internet of Things.&lt;/p&gt;

&lt;p&gt;It's the basic HMI (Human-Machine Interface) component for literally any IoT or control system. Far better than textual approach if you want users to see relevant data on the go. That applies both to classic SCADA and SCADA-ish projects.&lt;/p&gt;

&lt;p&gt;For example, on our UBreez we used QSimpleScada to visualize air readings. Compare the display for yourself. So, what looks more neat and clear even when comprising lots of sensor widgets?l&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YIvZyfz7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/IoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library/Textual.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YIvZyfz7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/IoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library/Textual.png" alt="Text vs Visualization"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using dashboards, you can immediately highlight any deviations from standards, pinpoint where a malfunction occurs, track live location, see trends and any other valuable info. It saves users time on understanding data you SCADA system collects, and they can respond and decide how to act faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using QSimpleScada
&lt;/h2&gt;

&lt;p&gt;Here are the steps for integrating QSimpleScada version 0.9.x in your project:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Install
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Via package manager:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're building savvy solutions using Qt, you most likely use qpm package manager so no further chit-chat is required. In case you don't (yet), download it from here &lt;a href="https://www.qpm.io/"&gt;https://www.qpm.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To install via qpm, run:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;qpm&lt;/code&gt; &lt;code&gt;install com.indeema.qsimplescada&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And add:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;include (../vendor/vendor.pri)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To *.pro file of your project.&lt;/p&gt;

&lt;p&gt;As a bonus, try out our preset of widgets:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;qpm&lt;/code&gt; &lt;code&gt;install com.indeema.eeiot&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From GitHub:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To clone the repo, go to:\&lt;br&gt;
&lt;a href="https://github.com/IndeemaSoftware/QSimpleScada"&gt;https://github.com/IndeemaSoftware/QSimpleScada&lt;/a&gt;\&lt;br&gt;
To also add preconfigured widgets, clone:\&lt;br&gt;
&lt;a href="https://github.com/IndeemaSoftware/EEIoT"&gt;https://github.com/IndeemaSoftware/EEIoT&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And add:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;include($$PWD/com/indeema/QSimpleScada/com_indeema_QSimpleScada.pri)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;include($$PWD/com/indeema/eeiot/com_indeema_eeiot.pri)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To the *.pro file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Using binary release:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/IndeemaSoftware/QSimpleScada/releases"&gt;https://github.com/IndeemaSoftware/QSimpleScada/releases&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Configure
&lt;/h3&gt;

&lt;p&gt;Once you download and install the library to your project:&lt;/p&gt;

&lt;p&gt;1. Create a new device that is going to be represented on your dashboard. Give it a name and it IP address:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;QScadaDeviceInfo *lDeviceInfo = new QScadaDeviceInfo();&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;lDeviceInfo-&amp;gt;setName("Test Device");&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;lDeviceInfo-&amp;gt;setIp(QHostAddress("127.0.0.1"));&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;2. Create a controller class that will handle all later devices and all boards that are connected to devices:\&lt;br&gt;
&lt;code&gt;QScadaBoardController *&lt;/code&gt;&lt;code&gt;mController&lt;/code&gt; &lt;code&gt;= new QScadaBoardController();   mController-&amp;gt;appendDevice(lDeviceInfo)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;3. Call initBoardForDeviceIp method to create a new board for already appended device. If there is no device on specific IP, the board will not be created.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mController-&amp;gt;initBoardForDeviceIp("127.0.0.1");&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;4. Set editable mode for your controller to enable creating, moving, and resizing the controllers.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mController-&amp;gt;setEditingMode(true);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If the editing mode is enabled, the modal window will feature dotted background:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mVRciaKS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/IoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library/1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mVRciaKS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/IoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library/1.png" alt="IoT dashboar builder"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5. Add grid layout on your widget and then add your controller to that widget:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;QGridLayout *&lt;/code&gt;&lt;code&gt;mainLayout&lt;/code&gt; &lt;code&gt;= new QGridLayout(ui-&amp;gt;centralWidget);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mainLayout-&amp;gt;addWidget(&lt;/code&gt;&lt;code&gt;mController&lt;/code&gt;&lt;code&gt;);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Working with widgets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We've also developed an EEIoT library with a set of preconfigured widgets. You can download it at &lt;a href="https://github.com/IndeemaSoftware/EEIoT"&gt;https://github.com/IndeemaSoftware/EEIoT&lt;/a&gt; and try it out as a start.&lt;/p&gt;

&lt;p&gt;To use a widget collection:&lt;/p&gt;

&lt;p&gt;Call the function with url to QML resources to let the controller know the location of QML widgets:\&lt;br&gt;
&lt;code&gt;QMLConfig::instance.appendQMLPath(:/com/indeema/eeiot/EEIoT/);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Singletone QMLConfig is located in  "qscadaconfig.h"\&lt;br&gt;
Here we use EEIoT as a group for all widgets inside. You can configure 1 or more groups.\&lt;br&gt;
Note, if you create two folders with the same name in different locations, the second one (created later)  will erase the first.&lt;/p&gt;

&lt;p&gt;You can access all the dynamic properties that form QML (mentioned in a metaData list) from QSimpleScada, so you can create your own complex dashboards fast and easy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Use
&lt;/h3&gt;

&lt;p&gt;You can use our simple editor to create your first dashboard &lt;a href="https://github.com/IndeemaSoftware/QSimpleScadaSample"&gt;https://github.com/IndeemaSoftware/QSimpleScadaSample&lt;/a&gt;\&lt;br&gt;
Then set up QScadaBoardController in your app without any devices and boards and call:\&lt;br&gt;
&lt;code&gt;mController-&amp;gt;openProject(QString &amp;lt;file&amp;gt;)&lt;/code&gt;\&lt;br&gt;
where  is a full path to your project file (*.irp)&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mController-&amp;gt;openProject(QString :/com/indeema/eeiot/EEIoT/)&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  See QSimpleScada in action
&lt;/h2&gt;

&lt;p&gt;Visit our GitHub profile to explore simple apps that show the work of QSimpleScada library:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  ### Weather app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a plain app that visualizes weather-related data of 3 widgets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Temperature&lt;/li&gt;
&lt;li&gt;  Humidity&lt;/li&gt;
&lt;li&gt;  Pressure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;QSimpleScada and EEIoT are used to handle the display and connectivity of the dashboard. All the weather real-time data we receive from Openweathermap API. You can download the code at &lt;a href="https://github.com/IndeemaSoftware/QSimpleScadaSample"&gt;https://github.com/IndeemaSoftware/QSimpleScadaSample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To see the current readings for your city:&lt;/p&gt;

&lt;p&gt;Enter your city followed by comma and country code as follows:\&lt;br&gt;
&lt;strong&gt;Kyiv,&lt;/strong&gt;&lt;strong&gt;ua&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;and click the &lt;strong&gt;Send&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;This will update temperature, humidity and pressure for your region.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hdzR95-e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/IoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library/2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hdzR95-e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/IoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library/2.png" alt="Weather dasboard for Lviv"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yQVKrrvv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/IoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library/3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yQVKrrvv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/IoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library/3.png" alt="Weather dashboard for Odessa"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  ### Builder app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One more example of how to use QSimpleScada is Builder application that gives us the possibility to create our dashboards and save to *.irp files. A simple dashboard editor that uses QSimpleScada to create needed dashboard with EEIoT widgets and save dashboard setup for later usage. In the example, we created dashboard that was used in Weather application mentioned above.&lt;/p&gt;

&lt;p&gt;The code is also available at &lt;a href="https://github.com/IndeemaSoftware/QSimpleScadaSample"&gt;https://github.com/IndeemaSoftware/QSimpleScadaSample&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  More tools for you
&lt;/h2&gt;

&lt;p&gt;We find that introducing Internet of Things impacts every industry and redefines our approach to using tech. We've gone through that topic in detail at &lt;a href="https://indeema.com/blog/6-promissing-applications-for-the-industrial-iot"&gt;6 promising applications for the industrial IoT&lt;/a&gt; article, and it is our pleasure to drive the progress with automatization that 4th Industrial Revolution brings.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding and context
&lt;/h3&gt;

&lt;p&gt;If all projects got specs set in stone, the development world would be a utopia. Yet, the clearer the initial goal and requirements are as well as the better the whole team understands them, the more streamlined is a project. To deepen your knowledge about specifics and typical pitfalls that follow IoT projects, read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://indeema.com/blog/how-to-create-a-startup--iot-project-from-idea-to-production"&gt;How to create a startup: IoT project from idea to production&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://indeema.com/blog/b2c--b2b-specifics-of-developing-iot-products"&gt;B2C &amp;amp; B2B specifics of developing IoT products&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://indeema.com/blog/internet-of-things-development--5-steps-to-creating-your-project"&gt;Internet of Things development: 5 steps to creating your project&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Spoiler&lt;/strong&gt;: find the templates for project-related documentation, so you can communicate the requirements and turn them into actionable specifications with less effort.&lt;/p&gt;

&lt;h3&gt;
  
  
  Estimating the cost and time
&lt;/h3&gt;

&lt;p&gt;Get a thorough understanding of the time and resources you'll need is nearly impossible. So, to forearm you with a general idea of the complexity (calculated in time and cost), here's an IoT-specific calculator:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://calc.indeema.com/"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vrHc7yQ1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/IoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library/4.png" alt="IoT solution cost calculator"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Dev tools
&lt;/h3&gt;

&lt;p&gt;Sharing our toolkit for faster and more efficient development of IoT project, we upload our Qt and IoT related open source projects at &lt;a href="https://github.com/IndeemaSoftware"&gt;https://github.com/IndeemaSoftware&lt;/a&gt; with Q at the beginning of the repo titles. You can also find a bunch of tools for React, Android, and iOS development there.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5bIwrpj4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/IoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library/GitHub.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5bIwrpj4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/IoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library/GitHub.png" alt="Indeema and Github"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Recap 
&lt;/h2&gt;

&lt;p&gt;At Indeema, we are accustomed to tight deadlines and challenging projects. And, being committed to creating savvy solutions, we gradually realized that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Understanding comes first.&lt;/strong&gt;\&lt;br&gt;
Be curious. Clarify each requirement, no matter how evident you think it is. Make sure you do understand. Because you can design a logical and scalable architecture, write awesome clean code, and yet fail to convey the desired result. Devil is in the details (so make sure you leave no details unnoticed).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reinventin&lt;/strong&gt;&lt;strong&gt;g the bicycle is futile.&lt;/strong&gt;\&lt;br&gt;
Each project contains unique challenges and requires out-of-the-box thoughts. And there's no need to develop everything from scratch. Why? Because you'll only cut the time you have to find and implement really challenging features, modules, and architecture.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Qualit&lt;/strong&gt;&lt;strong&gt;y is&lt;/strong&gt; &lt;strong&gt;a standard&lt;/strong&gt;&lt;strong&gt;.&lt;/strong&gt;\&lt;br&gt;
Be responsible for your work. You are engaged in making the future. If you are a developer, test your code against specifications, against best practices, common sense, stability of the project, etc. And the same applies to any other role.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading &amp;amp; hope you enjoyed this article. Subscribe for updates and let us know what you're interested in.&lt;/p&gt;

</description>
      <category>iot</category>
      <category>internetofthings</category>
      <category>scada</category>
      <category>iotdashboard</category>
    </item>
    <item>
      <title>IoT dashboard library: visualize SCADA at a snap [Free IoT library inside]</title>
      <dc:creator>Indeema Software</dc:creator>
      <pubDate>Fri, 06 Sep 2019 11:05:19 +0000</pubDate>
      <link>https://dev.to/indeemasoftware/iot-dashboard-library-visualize-scada-at-a-snap-free-iot-library-inside-3o2d</link>
      <guid>https://dev.to/indeemasoftware/iot-dashboard-library-visualize-scada-at-a-snap-free-iot-library-inside-3o2d</guid>
      <description>&lt;p&gt;There's a lot of IoT SCADA solutions for factories and other manufacturing needs. Yet, there are cases (and quite a lot), when you need to develop your own SCADA system to cover specific needs of your project.&lt;/p&gt;

&lt;p&gt;We often use awesome Qt framework for implementing complex IoT solutions. For a bunch SCADA and SCADA-like projects, we came across the need for quick tool for developing device dashboards. That's why we developed super lightweight unofficial Qt library. The library is open source, customizable, and free to use under MIT license. We also share a small set of developed widgets.&lt;/p&gt;

&lt;p&gt;Enjoy and use Qt ;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;README&lt;/strong&gt;: This library is created for desktop, mobile, and embedded projects developed on Qt. To use it, you should know Qt/ C++ and QML.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing QSimpleScada
&lt;/h2&gt;

&lt;p&gt;Let us introduce you to a nifty library for your IoT projects. We created QSimpleScada to speed up and simplify visualising any data, so we (and you) can concentrate on developing automation algorithms that rock.&lt;/p&gt;

&lt;p&gt;It was mainly created to quicken and, consequently, reduce the &lt;a href="https://indeema.com/blog/how-much-does-it-cost-to-create-iot-solution" rel="noopener noreferrer"&gt;cost of IoT solution.&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is QSimpleScada?
&lt;/h3&gt;

&lt;p&gt;It's a library that completely handles connection to and editing of widgets. Using QSimpleScada, you can easily create a visualization of IoT data using your mouse and a little code. After you are satisfied with the layout, save the generated .xml file and use it in your project.&lt;/p&gt;

&lt;p&gt;Library is created with Qt/C++ and basic widget is based on C++. There is interface for QML, so you can independently create individual widgets on QML (as when creating classic QML UIs) and upload them to your app on a go.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why do I need it?
&lt;/h3&gt;

&lt;p&gt;Well, you do if you are a Qt developer or a company and:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Have strict deadlines and complex data evaluations at your project&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Need to prototype mobile/embedded/desktop IoT projects often&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Need a one-stop tool for diverse Qt projects&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Don't want/have time/resources to develop dashboards from scratch&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If neither of the above is about you, then you don't.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why build IoT dashboards?
&lt;/h3&gt;

&lt;p&gt;Well, it may sound a bit redundant, so feel free to skip this section if this question is self-evident to you. Otherwise, there are quite a few reasons to visualize info you got from Internet of Things.&lt;/p&gt;

&lt;p&gt;It's the basic HMI (Human-Machine Interface) component for literally any IoT or control system. Far better than textual approach if you want users to see relevant data on the go. That applies both to classic SCADA and SCADA-ish projects.&lt;/p&gt;

&lt;p&gt;For example, on our UBreez we used QSimpleScada to visualize air readings. Compare the display for yourself. So, what looks more neat and clear even when comprising lots of sensor widgets?l&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FIoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library%2FTextual.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FIoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library%2FTextual.png" alt="Text vs Visualization"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using dashboards, you can immediately highlight any deviations from standards, pinpoint where a malfunction occurs, track live location, see trends and any other valuable info. It saves users time on understanding data you SCADA system collects, and they can respond and decide how to act faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using QSimpleScada
&lt;/h2&gt;

&lt;p&gt;Here are the steps for integrating QSimpleScada version 0.9.x in your project:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Install
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Via package manager:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're building savvy solutions using Qt, you most likely use qpm package manager so no further chit-chat is required. In case you don't (yet), download it from here &lt;a href="https://www.qpm.io/" rel="noopener noreferrer"&gt;https://www.qpm.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To install via qpm, run:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;qpm&lt;/code&gt; &lt;code&gt;install com.indeema.qsimplescada&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And add:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;include (../vendor/vendor.pri)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To *.pro file of your project.&lt;/p&gt;

&lt;p&gt;As a bonus, try out our preset of widgets:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;qpm&lt;/code&gt; &lt;code&gt;install com.indeema.eeiot&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From GitHub:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To clone the repo, go to:\&lt;br&gt;
&lt;a href="https://github.com/IndeemaSoftware/QSimpleScada" rel="noopener noreferrer"&gt;https://github.com/IndeemaSoftware/QSimpleScada&lt;/a&gt;\&lt;br&gt;
To also add preconfigured widgets, clone:\&lt;br&gt;
&lt;a href="https://github.com/IndeemaSoftware/EEIoT" rel="noopener noreferrer"&gt;https://github.com/IndeemaSoftware/EEIoT&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And add:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;include($$PWD/com/indeema/QSimpleScada/com_indeema_QSimpleScada.pri)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;include($$PWD/com/indeema/eeiot/com_indeema_eeiot.pri)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To the *.pro file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Using binary release:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/IndeemaSoftware/QSimpleScada/releases" rel="noopener noreferrer"&gt;https://github.com/IndeemaSoftware/QSimpleScada/releases&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Configure
&lt;/h3&gt;

&lt;p&gt;Once you download and install the library to your project:&lt;/p&gt;

&lt;p&gt;1. Create a new device that is going to be represented on your dashboard. Give it a name and it IP address:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;QScadaDeviceInfo *lDeviceInfo = new QScadaDeviceInfo();&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;lDeviceInfo-&amp;gt;setName("Test Device");&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;lDeviceInfo-&amp;gt;setIp(QHostAddress("127.0.0.1"));&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;2. Create a controller class that will handle all later devices and all boards that are connected to devices:\&lt;br&gt;
&lt;code&gt;QScadaBoardController *&lt;/code&gt;&lt;code&gt;mController&lt;/code&gt; &lt;code&gt;= new QScadaBoardController();   mController-&amp;gt;appendDevice(lDeviceInfo)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;3. Call initBoardForDeviceIp method to create a new board for already appended device. If there is no device on specific IP, the board will not be created.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mController-&amp;gt;initBoardForDeviceIp("127.0.0.1");&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;4. Set editable mode for your controller to enable creating, moving, and resizing the controllers.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mController-&amp;gt;setEditingMode(true);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If the editing mode is enabled, the modal window will feature dotted background:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FIoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library%2F1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FIoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library%2F1.png" alt="IoT dashboar builder"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5. Add grid layout on your widget and then add your controller to that widget:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;QGridLayout *&lt;/code&gt;&lt;code&gt;mainLayout&lt;/code&gt; &lt;code&gt;= new QGridLayout(ui-&amp;gt;centralWidget);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mainLayout-&amp;gt;addWidget(&lt;/code&gt;&lt;code&gt;mController&lt;/code&gt;&lt;code&gt;);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Working with widgets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We've also developed an EEIoT library with a set of preconfigured widgets. You can download it at &lt;a href="https://github.com/IndeemaSoftware/EEIoT" rel="noopener noreferrer"&gt;https://github.com/IndeemaSoftware/EEIoT&lt;/a&gt; and try it out as a start.&lt;/p&gt;

&lt;p&gt;To use a widget collection:&lt;/p&gt;

&lt;p&gt;Call the function with url to QML resources to let the controller know the location of QML widgets:\&lt;br&gt;
&lt;code&gt;QMLConfig::instance.appendQMLPath(:/com/indeema/eeiot/EEIoT/);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Singletone QMLConfig is located in  "qscadaconfig.h"\&lt;br&gt;
Here we use EEIoT as a group for all widgets inside. You can configure 1 or more groups.\&lt;br&gt;
Note, if you create two folders with the same name in different locations, the second one (created later)  will erase the first.&lt;/p&gt;

&lt;p&gt;You can access all the dynamic properties that form QML (mentioned in a metaData list) from QSimpleScada, so you can create your own complex dashboards fast and easy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Use
&lt;/h3&gt;

&lt;p&gt;You can use our simple editor to create your first dashboard &lt;a href="https://github.com/IndeemaSoftware/QSimpleScadaSample" rel="noopener noreferrer"&gt;https://github.com/IndeemaSoftware/QSimpleScadaSample&lt;/a&gt;\&lt;br&gt;
Then set up QScadaBoardController in your app without any devices and boards and call:\&lt;br&gt;
&lt;code&gt;mController-&amp;gt;openProject(QString &amp;lt;file&amp;gt;)&lt;/code&gt;\&lt;br&gt;
where  is a full path to your project file (*.irp)&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mController-&amp;gt;openProject(QString :/com/indeema/eeiot/EEIoT/)&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  See QSimpleScada in action
&lt;/h2&gt;

&lt;p&gt;Visit our GitHub profile to explore simple apps that show the work of QSimpleScada library:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  ### Weather app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a plain app that visualizes weather-related data of 3 widgets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Temperature&lt;/li&gt;
&lt;li&gt;  Humidity&lt;/li&gt;
&lt;li&gt;  Pressure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;QSimpleScada and EEIoT are used to handle the display and connectivity of the dashboard. All the weather real-time data we receive from Openweathermap API. You can download the code at &lt;a href="https://github.com/IndeemaSoftware/QSimpleScadaSample" rel="noopener noreferrer"&gt;https://github.com/IndeemaSoftware/QSimpleScadaSample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To see the current readings for your city:&lt;/p&gt;

&lt;p&gt;Enter your city followed by comma and country code as follows:\&lt;br&gt;
&lt;strong&gt;Kyiv,&lt;/strong&gt;&lt;strong&gt;ua&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;and click the &lt;strong&gt;Send&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;This will update temperature, humidity and pressure for your region.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FIoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library%2F2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FIoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library%2F2.png" alt="Weather dasboard for Lviv"&gt;&lt;/a&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FIoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library%2F3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FIoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library%2F3.png" alt="Weather dashboard for Odessa"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  ### Builder app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One more example of how to use QSimpleScada is Builder application that gives us the possibility to create our dashboards and save to *.irp files. A simple dashboard editor that uses QSimpleScada to create needed dashboard with EEIoT widgets and save dashboard setup for later usage. In the example, we created dashboard that was used in Weather application mentioned above.&lt;/p&gt;

&lt;p&gt;The code is also available at &lt;a href="https://github.com/IndeemaSoftware/QSimpleScadaSample" rel="noopener noreferrer"&gt;https://github.com/IndeemaSoftware/QSimpleScadaSample&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  More tools for you
&lt;/h2&gt;

&lt;p&gt;We find that introducing Internet of Things impacts every industry and redefines our approach to using tech. We've gone through that topic in detail at &lt;a href="https://indeema.com/blog/6-promissing-applications-for-the-industrial-iot" rel="noopener noreferrer"&gt;6 promising applications for the industrial IoT&lt;/a&gt; article, and it is our pleasure to drive the progress with automatization that 4th Industrial Revolution brings.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding and context
&lt;/h3&gt;

&lt;p&gt;If all projects got specs set in stone, the development world would be a utopia. Yet, the clearer the initial goal and requirements are as well as the better the whole team understands them, the more streamlined is a project. To deepen your knowledge about specifics and typical pitfalls that follow IoT projects, read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://indeema.com/blog/how-to-create-a-startup--iot-project-from-idea-to-production" rel="noopener noreferrer"&gt;How to create a startup: IoT project from idea to production&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://indeema.com/blog/b2c--b2b-specifics-of-developing-iot-products" rel="noopener noreferrer"&gt;B2C &amp;amp; B2B specifics of developing IoT products&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://indeema.com/blog/internet-of-things-development--5-steps-to-creating-your-project" rel="noopener noreferrer"&gt;Internet of Things development: 5 steps to creating your project&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Spoiler&lt;/strong&gt;: find the templates for project-related documentation, so you can communicate the requirements and turn them into actionable specifications with less effort.&lt;/p&gt;

&lt;h3&gt;
  
  
  Estimating the cost and time
&lt;/h3&gt;

&lt;p&gt;Get a thorough understanding of the time and resources you'll need is nearly impossible. So, to forearm you with a general idea of the complexity (calculated in time and cost), here's an IoT-specific calculator:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://calc.indeema.com/" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FIoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library%2F4.png" alt="IoT solution cost calculator"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Dev tools
&lt;/h3&gt;

&lt;p&gt;Sharing our toolkit for faster and more efficient development of IoT project, we upload our Qt and IoT related open source projects at &lt;a href="https://github.com/IndeemaSoftware" rel="noopener noreferrer"&gt;https://github.com/IndeemaSoftware&lt;/a&gt; with Q at the beginning of the repo titles. You can also find a bunch of tools for React, Android, and iOS development there.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FIoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library%2FGitHub.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FIoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library%2FGitHub.png" alt="Indeema and Github"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Recap 
&lt;/h2&gt;

&lt;p&gt;At Indeema, we are accustomed to tight deadlines and challenging projects. And, being committed to creating savvy solutions, we gradually realized that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Understanding comes first.&lt;/strong&gt;\&lt;br&gt;
Be curious. Clarify each requirement, no matter how evident you think it is. Make sure you do understand. Because you can design a logical and scalable architecture, write awesome clean code, and yet fail to convey the desired result. Devil is in the details (so make sure you leave no details unnoticed).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reinventin&lt;/strong&gt;&lt;strong&gt;g the bicycle is futile.&lt;/strong&gt;\&lt;br&gt;
Each project contains unique challenges and requires out-of-the-box thoughts. And there's no need to develop everything from scratch. Why? Because you'll only cut the time you have to find and implement really challenging features, modules, and architecture.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Qualit&lt;/strong&gt;&lt;strong&gt;y is&lt;/strong&gt; &lt;strong&gt;a standard&lt;/strong&gt;&lt;strong&gt;.&lt;/strong&gt;\&lt;br&gt;
Be responsible for your work. You are engaged in making the future. If you are a developer, test your code against specifications, against best practices, common sense, stability of the project, etc. And the same applies to any other role.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading &amp;amp; hope you enjoyed this article. Subscribe for updates and let us know what you're interested in.&lt;/p&gt;

</description>
      <category>iot</category>
      <category>iotdevelopment</category>
      <category>dashboard</category>
      <category>scada</category>
    </item>
    <item>
      <title>How we created IoT system for managing solar energy usage</title>
      <dc:creator>Indeema Software</dc:creator>
      <pubDate>Fri, 06 Sep 2019 10:30:24 +0000</pubDate>
      <link>https://dev.to/indeemasoftware/how-we-created-iot-system-for-managing-solar-energy-usage-5ale</link>
      <guid>https://dev.to/indeemasoftware/how-we-created-iot-system-for-managing-solar-energy-usage-5ale</guid>
      <description>&lt;p&gt;If you have no idea about the development architecture and mechanical/electrical design behind IoT solutions, they could seem like "having seemingly supernatural qualities or powers". For example, if you show a working &lt;a href="https://indeema.com/blog/iot-in-solar-energy--business-perspective--case-study-" rel="noopener noreferrer"&gt;IoT system&lt;/a&gt; to 18th century people, they'd think it's magic.This article is sort of busting such myth. Or, to put it more technically, about hints for fine-tuning the IoT development for an awesome project in solar energy management area.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spoiler&lt;/strong&gt;: no spells, only analytical ideas for developing fast and easy service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: We offer no one-fits-all solution (it simply doesn't exist), just share the stuff that we find serious. These points may be killer features while on the contrary their neglection may kill it. Pun intended ;)&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing IoT system for visualizing and optimizing solar energy consumption
&lt;/h2&gt;

&lt;p&gt;We had the pleasure to work on a project of improving self-generated energy usage. The core lies in visualizing and optimizing the use of photovoltaic (PV) systems for both installer companies and end customers. So, when &lt;a href="https://www.solarmanager.ch/" rel="noopener noreferrer"&gt;Solar Manager&lt;/a&gt; is installed as a central hub for distributing the produced solar energy between household devices, you use maximum of self-produced energy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-we-created-IoT-system-for-managing-solar-energy-usage%2F1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-we-created-IoT-system-for-managing-solar-energy-usage%2F1.png" alt="IoT system introduction"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We've already written about &lt;a href="https://indeema.com/blog/iot-in-solar-energy--business-perspective--case-study-" rel="noopener noreferrer"&gt;business perspective of using solar energy&lt;/a&gt;, and now let's dive into tech challenges and hints of the development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Absolute prerequisite
&lt;/h2&gt;

&lt;p&gt;Before we start, let's get clear. There is one thing that &lt;strong&gt;does&lt;/strong&gt; apply for each and every project, regardless if it's an IoT system or simple landing.&lt;/p&gt;

&lt;p&gt;Never start implementation before you have a complete understanding of what you want to achieve (and everyone involved does).&lt;/p&gt;

&lt;p&gt;There is no such a thing as evident. No, there are no telepaths, and nobody reads your thoughts. Clarify, discuss, make sure you're on the same page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-we-created-IoT-system-for-managing-solar-energy-usage%2F2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-we-created-IoT-system-for-managing-solar-energy-usage%2F2.png" alt="Project misunderstanding"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course, if you don't want to spend twice as much time and money.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mission
&lt;/h2&gt;

&lt;p&gt;So, what we have as inputs? Flexible connectivity and centralised remote firmware, 5 user roles with different UX and permission sets, converting and analyzing data, huge amount of requests, and, as an icing on the cake, plotting lots of time-value data on charts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges and specifics of implementing IoT system for energy consumption
&lt;/h2&gt;

&lt;p&gt;When it comes to development, 3 things matter the most: stability, relevance, and speed. Especially when the project requires a monolithic architecture. That's why the overall logic, all user flows, and database design should be as simple and optimized as possible. Let's be honest, in 2019 nobody wants to wait 40 seconds because 'your data is being processed'. So, here's the question/answer list for IoT platforms we refer to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Does the architecture fit in the requirements and specifications?&lt;/li&gt;
&lt;li&gt;  How will you convert, process, and analyse collected data?&lt;/li&gt;
&lt;li&gt;  What are the most optimal relations between parent-child MVC/MVP layers? Can they then be scaled without being interrupted?&lt;/li&gt;
&lt;li&gt;  Are there any modules that perform similar/adjoining functions? Can they be united into a single multipurpose module? Will that introduce or reduce complexity?&lt;/li&gt;
&lt;li&gt;  Is the communication between stages optimal?&lt;/li&gt;
&lt;li&gt;  How to cache data before visualizing it?&lt;/li&gt;
&lt;li&gt;  Is the user experience (UX) simple and self-evident for each user role?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Split what needs to be distributed, unite what is similar. Do not confuse this, however, with creating huge classes that (should) solve several tasks. Instead, create small ones for a single task. For complex task, create several classes that each solve a subtask and another one that will use those ones.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  ### Architect IoT solutions smart&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Smart here refers to creating fast, scalable, optimized and sustainable project architecture that fits into project requirements. The basic questions that arose at this point:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; What is the easiest and most direct architecture flow?&lt;/li&gt;
&lt;li&gt; How to make the user experience for each role the simplest?&lt;/li&gt;
&lt;li&gt; Can we revise initial architecture for better scalability and performance optimization?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For web apps, this involves the hierarchical model view controller (HMVC) design. For example, to allocate resources better and provide faster response, work through the connections between API, back end, front end, and edge. Configure cloud-local communication, storing and transferring data so that you get right response fast (hello, Captain Obvious!).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-we-created-IoT-system-for-managing-solar-energy-usage%2F3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-we-created-IoT-system-for-managing-solar-energy-usage%2F3.png" alt="Hierarchical Model View Controller Pattern"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  ### Design database with performance in mind&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Never underestimate the importance of thinking through the database (DB) design. This also applies to the relations between collections in the database. You have a lot of entities, which interact in various ways, so it is crucial to keep all related logical connections in one place.&lt;/p&gt;

&lt;p&gt;So, when you have initial structure at hand, determine:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Is this (one-to-one, one-to-many, many-to-many) the optimal relationship type for this collection? Does it solve the task most efficiently?&lt;/li&gt;
&lt;li&gt; How well does it correspond to the task at specific screen?&lt;/li&gt;
&lt;li&gt; Does it fit well in the general architecture of the project?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Optimize the logic behind each module and ensure that the general architecture is preserved. Think through the permission set. Then think again and optimize. Remember to set connection types so that for each task you have all needed info in one place and handle requests right.&lt;/p&gt;

&lt;p&gt;For example, imagine that your database is a fast food restaurant. You have a lot of clients, you need to serve food fast and precisely what they've ordered. Or else your business is done for. That's exactly the same for DBs. Yes, there are dozens of collections and you need data from 7-8 of them simultaneously. So design the relations so that they're logically connected and return the response quick.&lt;/p&gt;

&lt;p&gt;IoT system is like a restaurant. Don't make the customers wait.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-we-created-IoT-system-for-managing-solar-energy-usage%2F4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-we-created-IoT-system-for-managing-solar-energy-usage%2F4.jpg" alt="Restaurant IoT"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@dgilliam?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;DREW GILLIAM&lt;/a&gt; on &lt;a href="https://unsplash.com/search/photos/kitchen?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  ### How to plot [gazillion] of data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Remember the times, when sites loaded for a couple of minutes? We've seen apps where dashboards load even slower. And that's a no-no.&lt;/p&gt;

&lt;p&gt;Charts are a new normal. Data visualization is commonly used in SCADA, IoT, and any analytical projects and for a reason. Seeing spikes in energy consumption, market trends, CO2 in the air, and any other stuff you can measure (typically, over time) gives a vivid impression. You see, you understand, you act. With textual presentation of massive data arrays your eye will blur in no time.&lt;/p&gt;

&lt;p&gt;So, the challenge lies if fast plotting of charts with huge number of value-time pairs. Before users see the data on the chart, system has to determine all the points for plotting it. We had quite a lot of brainstorming to determine how cache the data so that plotting a chart with 50K+ data-value pairs takes less than 2 seconds.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-we-created-IoT-system-for-managing-solar-energy-usage%2F5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-we-created-IoT-system-for-managing-solar-energy-usage%2F5.png" alt="Solar Manager Interface"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  From scratch to production, and beyond
&lt;/h2&gt;

&lt;p&gt;Apart from web app, we also develop iOS and Android app for on-the-go installation, monitoring, and access.&lt;/p&gt;

&lt;p&gt;The important thing to remember when working on IoT systems is maintaining simplicity and scalability. The typical 5-stage IoT architecture should be well-thought to not bring any redundant complexity.&lt;/p&gt;

&lt;p&gt;As each product evolves, you have to think through the means of layering new functionality while not interrupting the existing features. And, of course, never forget about unit testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Less than a year from launching
&lt;/h2&gt;

&lt;p&gt;Since its launch in October 2018, the Solar Manager is adopted and used by the leading photovoltaic wholesaler and installer companies in Switzerland.&lt;/p&gt;

&lt;p&gt;By reviewing and optimizing energy-use habits, the consumers get the best out of their PVs and so they save costs. On a more global scale and according to &lt;a href="https://www2.deloitte.com/global/en/pages/energy-and-resources/articles/global-renewable-energy-trends.html" rel="noopener noreferrer"&gt;Deloitte&lt;/a&gt;, such a solution makes solar energy competitive with traditional power sources. This, in its turn, makes it appealing for other residential consumers and businesses. And, finally, doesn't it sound as a basis of a smart city we all wait for?&lt;/p&gt;

&lt;h2&gt;
  
  
  Behind success any IoT project
&lt;/h2&gt;

&lt;p&gt;There is no 'ultimate guide' to creating successful product. First, each project is unique and brings its own challenges. Second, even if you've done a bunch of projects in the area, the tech and the market demands evolve. So the experience you have from 2 or even half a year ago might not be relevant now.&lt;/p&gt;

&lt;p&gt;Still, we do not get tired of telling that forewarned is forearmed. So here's a bunch of our experience that may be handy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://indeema.com/blog/internet-of-things-development--5-steps-to-creating-your-project" rel="noopener noreferrer"&gt;How investigation saves your time and reduces risks&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://indeema.com/blog/b2c--b2b-specifics-of-developing-iot-products" rel="noopener noreferrer"&gt;How to tailor development to market you're reaching&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  IoT opportunities for &lt;a href="https://indeema.com/blog/how-can-you-use-iot-in-game-industry" rel="noopener noreferrer"&gt;gaming&lt;/a&gt;, &lt;a href="https://indeema.com/blog/how-can-you-use-iot-in-automotive" rel="noopener noreferrer"&gt;automotive&lt;/a&gt;, &lt;a href="https://indeema.com/blog/how-can-you-use-internet-of-things-in-retail---5-examples" rel="noopener noreferrer"&gt;retail&lt;/a&gt;, &lt;a href="https://indeema.com/blog/iot-application-in-agriculture--5-real-examples" rel="noopener noreferrer"&gt;agriculture&lt;/a&gt;, &lt;a href="https://indeema.com/blog/6-promissing-applications-for-the-industrial-iot" rel="noopener noreferrer"&gt;industry&lt;/a&gt; etc.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://indeema.com/blog/top-10-iot-sensors" rel="noopener noreferrer"&gt;What are the top 10 sensors for IoT&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can also check our GitHub for lots of free &lt;a href="https://github.com/IndeemaSoftware" rel="noopener noreferrer"&gt;open-source instruments for IoT development.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have an idea in mind and want to drill down the tech details? &lt;a href="https://indeema.com/contact-us" rel="noopener noreferrer"&gt;Get in touch&lt;/a&gt; with our experts, so we can figure out the best means and tools for the development.&lt;/p&gt;

</description>
      <category>iot</category>
      <category>internetofthings</category>
      <category>development</category>
      <category>solarenergy</category>
    </item>
    <item>
      <title>The non-primitive approach of Amazon: How AWS IoT meets IoT challenges</title>
      <dc:creator>Indeema Software</dc:creator>
      <pubDate>Thu, 05 Sep 2019 13:57:16 +0000</pubDate>
      <link>https://dev.to/indeemasoftware/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges-2gln</link>
      <guid>https://dev.to/indeemasoftware/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges-2gln</guid>
      <description>&lt;p&gt;As a Company deeply involved in the development of various solutions for the &lt;a href="https://indeema.com/services/iot"&gt;IoT&lt;/a&gt; environment, we presumably should promote both the very sector of the IoT and our relative development skills and capabilities. The arrogant self-promotion where mentioning of any topical trade-offs is minimized to almost zero seems a widely accepted practice since potential customers prefer dealing with only well-meaning professionals facing no significant difficulties in their activity.&lt;/p&gt;

&lt;p&gt;However, the fact that our blog is read by our colleagues - the other IoT developers in addition to the potential customers makes us address the IoT topic from a little bit another angle. To say the truth, it's not so simple to maintain a proper balance between being honest and being always positive. And the very nature of such an immature sector as the Internet of Things makes us admit that there's trouble in paradise actually. On the one hand, the IoT offers new opportunities the scope of which can hardly be graspable nowadays. On the other hand, the IoT introduces unique risks capable of compromising any &lt;a href="https://indeema.com/blog/how-to-create-a-startup--iot-project-from-idea-to-production"&gt;IoT project&lt;/a&gt; in terms of both the security and operational reliability.&lt;/p&gt;

&lt;p&gt;We believe that revealing the risks along with sharing best practices how to meet the IoT challenges can enhance the interest of potential customers to the IoT much better than just telling lucky "no-problem" stories.&lt;/p&gt;

&lt;p&gt;This time we would like to examine the AWS IoT solution which is gaining popularity among many IoT developers. Both advertising and promotion are redundant in this case. Let's better try to realize whether AWS IoT is really so good for both developers and end users as its creators claim. Besides, some healthy criticism would never hurt, right?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QlO2-UHL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/aws_iot_architecture.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QlO2-UHL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/aws_iot_architecture.png" alt="AWS IoT Architecture: How it works"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is AWS IoT
&lt;/h2&gt;

&lt;p&gt;Amazon Internet of things or Amazon Web Services platform is a complex solution capable of collecting data from various IoT devices to connect them to the cloud apps. Amazon has long realized that the contemporary IoT market could hardly be happy with a one-fits-all service. Since the diversity of IoT devices keeps growing, a multi-service platform should be more relevant for the needs of various business sectors. Hence, AWS IoT comprises several specific services dedicated to different operational tasks. Such an approach represents Amazon as a true digital giant having rich development capabilities (the $ 1 trillion capitalization reflects the status, he-he:)&lt;/p&gt;

&lt;p&gt;By the way, Amazon as a business behemoth clearly understands that in the contemporary globalized business environment there's only one method to succeed in a competition - improving operational efficiency. How to achieve this? The more intelligent business processes are, the better efficiency can be achieved and, therefore, the bigger profits occur. Just the IoT services allow enterprises of various sizes from numerous sectors to analyze huge data massifs collected from the industrial equipment. These days, machinery is becoming educable with the help of machine learning. The machine learning models created with AWS IoT can work both in a cloud and directly at the site. Thus, the IoT enables any equipment to react to local events with intelligent responses.&lt;/p&gt;

&lt;p&gt;We cannot fail to mention the impressive infrastructural covering of AWS that provides customers with a truly flexible choice in terms of both the variety of the AWS cloud services and their pricing.&lt;/p&gt;

&lt;p&gt;Last, but not least, the IoT security along with operational stability provided by AWS IoT represents Amazon as a quite pragmatic IoT platform provider (however, more on that later).&lt;/p&gt;

&lt;p&gt;Among the others, the following AWS IoT services are available:\&lt;br&gt;
Amazon FreeRTOS and AWS Greengrass (edge);\&lt;br&gt;
AWS IoT Core, AWS IoT Device Management, and AWS IoT Device Defender (cloud);\&lt;br&gt;
AWS IoT Analytics (analytics).&lt;/p&gt;

&lt;p&gt;But we would like to begin with just a button :)&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS IoT Button
&lt;/h2&gt;

&lt;p&gt;A simple easily adjustable Wi-Fi/LTE-M device in the form of a button was designed for the IoT developers who would like to start working with such services as AWS IoT Core, AWS Lambda, Amazon DynamoDB, Amazon SNS along with the other AWS services without having to write proprietary code for the device. The logic of the button's activation can be configured in accordance with a particular task. For example, it can remotely start a car, open/close a garage door, and control various home appliances. The device can be integrated with some third-party APIs such as Twitter, Facebook, Slack as well as with some custom software.&lt;/p&gt;

&lt;p&gt;The button is produced by the hardware partners of AWS specifically for the AWS IoT services. In fact, there are two versions of the button:\&lt;br&gt;
1) The AWS IoT Enterprise Button which communicates via Wi-Fi. It has a 2000-click lifetime, encrypts outbound data using TLS, and can be configured using BLE and a mobile app. It retails for $19.99 (shipping and handling not included) and can be used in the United States, Europe, and Japan.&lt;/p&gt;

&lt;p&gt;2) The AT&amp;amp;T LTE-M Button which communicates via the LTE-M cellular network. It has a 1500-click lifetime, and it also encrypts outbound data using TLS. The device and the bundled data plan is available at an introductory price of $29.99 (shipping and handling not included) and can be used in the United States.&lt;/p&gt;

&lt;p&gt;Both versions are ready to use being pre-adjusted with X.509 certificates to connect with a cloud through a secured connection.&lt;/p&gt;

&lt;p&gt;You may ask why Amazon involved some third-party hardware manufacturers to produce a special button. Here is why:&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS IoT 1-Click
&lt;/h2&gt;

&lt;p&gt;AWS IoT 1-Click is a special cloud service which works only with specially designed hardware devices - the above-mentioned buttons. What a solution! The solution is well-tested by many famous digital giants who would like to tie their customers with some particular devices and gadgets. A typical monopolistic intention to put all eggs in one basket. Of course, Amazon represents it as a part of its customer care: the customers do not need to fill their heads about where to find some pre-adjusted devices fully compatible with the offered cloud service anymore. Amazon has already made the choice on behalf of them. The best choice ever. Especially since the cloud service seems really customer-friendly in terms of running out of the box.&lt;/p&gt;

&lt;p&gt;AWS IoT 1-Click is a service which enables special IoT devices to quire functions from AWS Lambda (a special event-driven service allowing developers to program functions on a pay-per-use basis) to perform certain actions. For example, through pushing a button it is possible to send a message to a technical support team, to track inventory process, or to feed your dog remotely.\&lt;br&gt;
The types of applications empowered by AWS IoT 1-Click can significantly vary: apartment stores, schools, office buildings, health facilities, and various vehicles all can be equipped with the IoT devices fully integrated with the cloud service.&lt;/p&gt;

&lt;p&gt;The main advantage of AWS IoT 1-Click is that the developers do not need to write code at the hardware end. All they have to do is just to use the already available operations. In addition, they can easily create new ones with the help of AWS Lambda functions. They need neither to install certificates nor to configure edge devices. Caring about firmware updates is also redundant. Admins, at the same time, can track both the state and functionality of each device being notified when service life is expiring.&lt;/p&gt;

&lt;p&gt;Are the above-mentioned advantages worth sacrificing a wider choice of the third-party IoT devices in favor of AWS Buttons? It remains questionable from the perspective of new devices that keep appearing in the market. But for today the approach seems still reasonable.&lt;/p&gt;

&lt;p&gt;However, Amazon also has a free solution compatible with various devices from the third-party manufacturers. See below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Amazon FreeRTOS
&lt;/h2&gt;

&lt;p&gt;This operating system for microcontrollers is created for the low-energy devices. Amazon FreeRTOS facilitates the deployment and control over a bunch of such devices through a simplified programming. The system belongs to open source being distributed free of charge. It supports various architectures such as ARM and MIPS. It means that the developers have a free hand to select a chipset from many reliable manufacturers such as\&lt;br&gt;
Espressif, Microchip, NXP Semiconductors, STMicroelectronics, Texas Instruments, etc.&lt;/p&gt;

&lt;p&gt;Amazon FreeRTOS offers the libraries that provide data encryption along with key management. Besides, the system follows the TLS (TLS v1.2) protocol for connecting the devices with a cloud. In addition, Amazon FreeRTOS allows adding a security code during both the deployment and OTA updates.&lt;/p&gt;

&lt;p&gt;Here we can see how Amazon can respond to any allegations relating to a lack of choice between the third-party hardware suppliers. The developers are free to choose whatever they need in order to create a highly customized solution while Amazon FreeRTOS helps them develop the relevant software with an appropriate functionality.&lt;/p&gt;

&lt;p&gt;Hence, Amazon is not alien to open source as well.&lt;/p&gt;

&lt;p&gt;The simplified programming for the IoT development is not the only type of support that many developers can account on from Amazon. The next service in our review can help meet the challenges related to a non-reliable Internet connection.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS Greengrass
&lt;/h2&gt;

&lt;p&gt;The real-world circumstances such as faulty internet connection can prevent many enterprises from implementing the IoT. In order to mitigate such a risk, Amazon offers AWS Greengrass. The solution enables groups of devices to sync with a cloud in a secure manner.  Besides, the connected devices can communicate with each other even when the internet connection is interrupted. AWS Greengrass allows the devices to run AWS Lambda functions. Such a combination provides executing serverless functions locally. It means that various Linux-based devices running on both ARM or x86 architectures can use Greengrass Core to execute AWS Lambda code.&lt;/p&gt;

&lt;p&gt;This is about the optimization of data flows, in fact. If you have several devices based on Raspberry Pi, for example, your code can run locally on them. In doing so, you can collect data, filter it, and send only what you consider important to a cloud for a subsequent analytics. Such a practice can obviously save your time and money. Hence, in some cases, the solutions based on AWS Greengrass can be more cost-effective than the ones based on AWS IoT Core.&lt;/p&gt;

&lt;p&gt;Besides, AWS Greengrass is one of few Amazon services able to run on a very lightweight devices on-premises. It's a good opportunity for admins to use AWS programming locally. AWS Greengrass seems another Amazon's incentive which helps the IoT developers convince some hesitating customers, right?&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS IoT Device Management
&lt;/h2&gt;

&lt;p&gt;The name of the service speaks for itself. And this is about the scale of your IoT environment. The fleet of your devices may comprise hundreds, thousands, and even millions of endpoints. All of them require well-organized control and monitoring. And this is just what AWS IoT Device Management service offers. It helps IoT developers not to care about the scale anymore. A combination of group methods with deployment flexibility enables the developers to create groups of the IoT devices with an individual access policy regardless of the scale of the entire system. In brief, AWS IoT Device Management helps to manage your IoT fleet remotely. Both individually and in groups you can send firmware updates through OTA (over-the-air), troubleshoot functionality and monitor the state of your devices. In addition to the quantitative scalability, the qualitative one takes place since a particular OS of your device is irrelevant to the service. It implies a great variety of devices beginning from a cheap thermometer and up to a luxury autonomous vehicle. Hence, the secure IoT management at scale is realized. Kudos. However, the other service is in charge of the security.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS IoT Device Defender
&lt;/h2&gt;

&lt;p&gt;If an IoT service provider has some security practices, they should be implemented into the services somehow. Both authentication of IoT devices and their secure authorization through the continuous audit of the entire fleet belong to the fully managed service AWS IoT Device Defender. There is no doubt that Amazon has acquired a rich experience in the IoT security issues. And the relative recommendations by Amazon are offered in the form of practices that constitute the AWS IoT Device Defender capabilities.\&lt;br&gt;
The integration of AWS IoT Device Defender with the other Amazon services are implied - both AWS Greengrass and Amazon FreeRTOS can be integrated with the service automatically. AWS IoT Device Defender can notify the users about problems through AWS IoT console, Amazon CloudWatch, and Amazon SNS. What can such alerts be about?\&lt;br&gt;
For example, it can identify an abnormally intensive data traffic between the IoT devices and a cloud that may reflect a data leakage. Also, the service can warn against an unauthorized IP address appearing in a network. It can track various states of your devices such as the number of enabled ports on your device, with what the device is connected, the amount of data the device sends and so on. A regular checking of certificates of the devices regarding their validly and expiry dates is also a useful security practice which is shared by Amazon with the IoT developers via AWS IoT Device Defender.&lt;/p&gt;

&lt;p&gt;It is hardly possible to anticipate all possible security problems within the IoT sector since many customized solutions can engender absolutely unique risks. Nevertheless, Amazon shares a set of its best security practices a deviation in which can be identified as a certain alert through AWS IoT Device Defender.  Does such an approach meet our expectations? It does, indeed. Does AWS IoT Device Defender guarantee the total security of our IoT system? No, certainly it doesn't. And we will have to come back to this issue later.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS IoT Analytics
&lt;/h2&gt;

&lt;p&gt;Data is money, as many proponents of the contemporary big-data strategies claim. Indeed, it is, but only in case, you can effectively analyze the data to retrieve some valuable information from your data feed. Every IoT solution is totally dependent on the data streams generated by the IoT devices. Amazon offers a special service able to properly format the gigabytes of data continuously arriving from your IoT devices - AWS IoT Analytics. This is a fully managed service which allows performing complex analytics of a large amount of data collected from your IoT devices without having to spend any extra time and money for establishing your own proprietary IoT analytics' infrastructure.&lt;/p&gt;

&lt;p&gt;In fact, AWS IoT Analytics is a means of automation of all sophisticated steps you need to proceed to analyze data from your IoT devices. The service helps to filter, select, process, and enrich your data streams before sending them to a cloud storage for a deeper subsequent analytics. Thus, it is possible to collect and save only valuable data through some special mathematical manipulations for data processing. For example, you can enrich your data with some metadata such as a type of a device along with its location while some "bad data" occurred due to inaccurate measurements can be cleansed. Later on, you can send both planned and individual queries through an embedded SQL data requester to provide your data analysis. Moreover, the true deep analytics can be achieved with the help of the available machine learning tools. Hence, AWS IoT Analytics can be a relevant default service for the majority of the IoT developers along with their customers.&lt;/p&gt;

&lt;p&gt;Suppose, it's time to get down to the very essence of Amazon's IoT solution. Let's practices a little bit on dealing with AWS IoT.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS IoT Core
&lt;/h2&gt;

&lt;p&gt;AWS IoT Core is probably the most significant service among the Amazon's basic ones dedicated to the IoT. It provides a connection of the physical IoT endpoints to a cloud through a reliable scaling. AWS IoT Core is in charge of establishing a full interaction between IoT devices with their peripheral software and the AWS IoT services mentioned above.&lt;/p&gt;

&lt;p&gt;In order to start working with AWS IoT, let's arrange a trial connection of a test device containing a microcontroller along with the following sensors HDC1080 -(temperature, humidity), BME280  -(pressure), MH-Z19 - (CO2), CCS811 - (eCO2, tVOC) to AWS IoT Core for a trial data transmission.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--N2T_3VR3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/esp32.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--N2T_3VR3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/esp32.png" alt="AWS IoT Core"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The secure connection of the device is essential in our case. One of the most popular methods of providing a secure data transfer is using end-to-end encryption via TLS 1.2. protocol. Only few solution based on microcontrollers can meet TLS 1.2. due to a lack of computing power. This time we use ESP32 since the microcontroller is one of the most accessible solutions.&lt;/p&gt;

&lt;p&gt;First, we should create our AWS username while our ESP32 microcontroller should be connected to the Internet.&lt;/p&gt;

&lt;p&gt;After Login, and open the AWS IoT console at &lt;a href="https://aws.amazon.com/iot"&gt;https://aws.amazon.com/iot&lt;/a&gt;. On the Welcome page, choose Get started.\&lt;br&gt;
If this is your first time using the AWS IoT console, you see the Welcome to the AWS IoT Console page. In the left navigation pane, choose Manage to expand the choices, and then choose Things.\&lt;br&gt;
On the page that says You don't have any things yet, choose Register a thing. (If you have created a thing before, choose Create).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--egJ2J_LB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/01.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--egJ2J_LB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/01.png" alt="AWS IoT interface"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A thing represents a device whose status or data is stored in the AWS Cloud. This stored status or data is called the device's shadow. The Device Shadow service maintains a shadow for each device connected to AWS IoT.&lt;/p&gt;

&lt;p&gt;Type a name for the thing, and then choose Next.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FS94DoHE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/02.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FS94DoHE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/02.png" alt="Add your device in IoT core"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2HoRYWSf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/03.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2HoRYWSf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/03.png" alt="Add device in IoT core"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that, we should create certificates for a secure connection.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Tye54LTw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/04.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Tye54LTw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/04.png" alt="Add a certificate in AWS IoT core"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then we should load the certificates, click "Done", and get the authorized Thing&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oid3KQyX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/05.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oid3KQyX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/05.png" alt="Certificate created in AWS IoT core"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4cr1xl22--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/06.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4cr1xl22--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/06.png" alt="Things in AWS IoT core"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, we should go to Secure and choose Policies to create a policy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZtcpNTi9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/07.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZtcpNTi9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/07.png" alt="AWS IoT"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the Create a policy page, in the Name field, type a name for the policy. In the Action field, type iot:&lt;em&gt;. In the Resource ARN field, type *. Select the Allow check box. This allows your Raspberry Pi to publish messages to AWS IoT.\&lt;br&gt;
iot:&lt;/em&gt; -policy to subscribe and publish using this certificate\&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;-all the clients can publish/subscribe to this thing using this certificate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jJ7ZMCNM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/08.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jJ7ZMCNM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/08.png" alt="Create a policy in AWS IoT"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JTUGkb74--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/09.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JTUGkb74--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/09.png" alt="Policies AWS IoT"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the left navigation pane, under Security, choose Certificates.&lt;/p&gt;

&lt;p&gt;In the box for the certificate you created, choose ... to open a drop-down menu, and then choose Attach policy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KWChuUZP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/10.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KWChuUZP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/10.png" alt="Certificates AWS IoT"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CQW4KRrp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/11.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CQW4KRrp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/11.png" alt="Attach policies to certificates in AWS IoT"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the box for the certificate you created, choose ... to open a drop-down menu, and then choose Attach thing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--91Z_jKs7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/12.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--91Z_jKs7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/12.png" alt="Attach policies to certificates in AWS IoT"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The final step comes to an activation of the certificate:\&lt;br&gt;
In the box for the certificate you created, choose ... to open a drop-down menu, and then choose Active&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3nxOG_z_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/13.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3nxOG_z_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/13.png" alt="Certificates AWS ioT"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's consider our ESP32 microcontroller already pre-configured for interaction with AWS IoT when Rest API Endpoint, port, and protocol are known as well as all necessary certificates are available.&lt;/p&gt;

&lt;p&gt;Now we need to check a possibility to transfer data between ESP32 and a cloud of AWS IoT. Go to Manage, click our thing test-ESP32, on the left menu choose Interact and copy a topic address below the line "Update to this thing shadow".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g6S1xQ9a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/14.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g6S1xQ9a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/14.png" alt="Interact in AWS IoT "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that, subscribe for the selected topic and wait for the data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Bd5kIiq_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/15.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Bd5kIiq_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/15.png" alt="MQTT cliient AWS IoT"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--P_71hSQM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/16.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P_71hSQM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/16.png" alt="MQTT cliient AWS IoT"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In a few seconds, we will see the data successfully received by the MQTT broker.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HRMYVtf9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/17.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HRMYVtf9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/the-non-primitive-approach-of-amazon-how-aws-iot-meets-iot-challenges/17.png" alt="Subscription MQTT cliient AWS IoT"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, we can collect, analyze, and visualize our data with the help of either AWS IoT service or our own solutions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A fly in the ointment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All aforementioned look too positive, right? It's quite explainable since the very capitalization of Amazon implies that its IoT developers are far from being just a yard team. Nevertheless, there is one issue which can be accepted as a specific drawback of the entire approach of Amazon to the IoT services. We should come back to the security practices again. A telling example won't hurt.&lt;/p&gt;

&lt;p&gt;Just take a look at &lt;a href="https://searchaws.techtarget.com/tip/Enlist-AWS-IoT-security-tools-to-defend-your-network"&gt;what&lt;/a&gt; is advised by a professional who promotes AWS IoT services from the security perspective. In contrast to the whole content praising AWS IoT for the iron-concrete security it provides, the final advise come to some trivial suggestions such as changing default passwords,  using encryption, assigning dedicated IoT stuff etc. If we replace AWS IoT with some much poorer solution in that content, the suggestions would keep sounding not less relevant. Better safe than sorry? Redundant overreaction?&lt;/p&gt;

&lt;p&gt;Not, in fact. This is a sad truth which implies quite a significant share of a human factor which still has to be involved in the security practices no matter whether they belong to Amazon or to some other IoT service provider.  And a human factor always implies errors and misuse.&lt;/p&gt;

&lt;p&gt;So, which technology is missed by the Amazon's IoT developers in terms of security? We dare to assume that it's time for such a digital giant as Amazon to start developing solutions based on the DLT (Distributed Ledger Technology). Once the very nature of DLTs implies the elimination of a human factor from digital interactions to some extent, nothing prevents Amazon from using IOTA Tangle, Hashgraph, or even a proprietary custom distributed ledger in the AWS IoT solutions. Even a simple trial DLT-based solution having quite a limited functionality would be better than nothing since following the promising IT trends (undoubtedly, DLT is one of the hottest trends nowadays!) would represent Amazon as the most progressive IoT service provider. And, who knows, maybe the trivial security suggestions about default passwords and registered devices should not even be necessary anymore.&lt;/p&gt;

&lt;p&gt;We've done our best in representing the basic features of the AWS IoT services in the present post. Hope you will appreciate our efforts. In addition to the already described AWS and Predix platforms, we are going to examine the other &lt;a href="https://indeema.com/blog/how-we-created-iot-system-for-managing-solar-energy-usage"&gt;IoT solutions&lt;/a&gt; such as IBM Watson, MS Azure, and Google IoT. Please follow our posts and suggest us what else in the IoT environment you want us to study.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>UICollectionView Tutorial: Changing presentation on the fly</title>
      <dc:creator>Indeema Software</dc:creator>
      <pubDate>Thu, 05 Sep 2019 13:53:48 +0000</pubDate>
      <link>https://dev.to/indeemasoftware/uicollectionview-tutorial-changing-presentation-on-the-fly-4f9o</link>
      <guid>https://dev.to/indeemasoftware/uicollectionview-tutorial-changing-presentation-on-the-fly-4f9o</guid>
      <description>&lt;p&gt;Original article - &lt;a href="https://indeema.com/blog/uicollectionview-tutorial--changing-presentation-on-the-fly"&gt;UICollectionView Tutorial&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this article, we'll cover using of various element presentation methods, as well as their reuse and dynamic changing. The basics of working with collections and auto layouts are not covered here.&lt;/p&gt;

&lt;p&gt;Here what we'll get as a result:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--j6GGPIlG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://indeema.com/images/articles/UICollectionView-Tutorial-Changing-presentation-on-the-fly/Copy%2520of%2520CollectionExampleGIF.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--j6GGPIlG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://indeema.com/images/articles/UICollectionView-Tutorial-Changing-presentation-on-the-fly/Copy%2520of%2520CollectionExampleGIF.gif" alt="UICollectionView result"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When developing mobile applications, we often come across situations, where table view is not enough and we need to show element list in a more unique and interesting way. Moreover, the ability to change the display format can become a killer feature of your app.&lt;/p&gt;

&lt;p&gt;You can implement all aforementioned fairly straightforward using UICollectionView and various UICollectionViewDelegateFlowLayout protocol implementations.&lt;/p&gt;

&lt;p&gt;You can find the complete project code at &lt;a href="https://github.com/IndeemaSoftware/CustomCollectionLayout"&gt;https://github.com/IndeemaSoftware/CustomCollectionLayout&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To implement the different display formats for our element list, we need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  FruitsViewController: UICollectionViewController class, where we'll store the fruits array, the UICollectionView and element presentation objects.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fruit data model&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;struct Fruit {\&lt;br&gt;
   let name: String\&lt;br&gt;
   let icon: UIImage\&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;|&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;FruitCollectionViewCell: UICollectionViewCell class&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A cell with UIImageView and UILabel elements for displaying fruits.\&lt;br&gt;
We'll create this cell in a separate .xib file to be able to reuse it in other collection views.&lt;/p&gt;

&lt;p&gt;As we can see from the design, there can be 2 cell alternatives with text featured to the right and below the image:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DkuiZS9o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/UICollectionView-Tutorial-Changing-presentation-on-the-fly/Copy%2520of%2520Screen%2520Shot%25202019-02-17%2520at%25207.37.08%2520PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DkuiZS9o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/UICollectionView-Tutorial-Changing-presentation-on-the-fly/Copy%2520of%2520Screen%2520Shot%25202019-02-17%2520at%25207.37.08%2520PM.png" alt="banana cell"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_UWA43zX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/UICollectionView-Tutorial-Changing-presentation-on-the-fly/Copy%2520of%2520Screen%2520Shot%25202019-02-17%2520at%25207.37.26%2520PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_UWA43zX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/UICollectionView-Tutorial-Changing-presentation-on-the-fly/Copy%2520of%2520Screen%2520Shot%25202019-02-17%2520at%25207.37.26%2520PM.png" alt="banana cell for development"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There could be absolutely different types of cells. In that case, you'll need to create 2 separate object classes and use the suitable one.&lt;/p&gt;

&lt;p&gt;For this example, we don't need such distinguishing and 1 cell with UIStackView is enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FruitCollectionViewCell interface&lt;/strong&gt;\&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2_rbJHed--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/UICollectionView-Tutorial-Changing-presentation-on-the-fly/Copy%2520of%2520Screen%2520Shot%25202019-02-17%2520at%25208.09.30%2520PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2_rbJHed--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/UICollectionView-Tutorial-Changing-presentation-on-the-fly/Copy%2520of%2520Screen%2520Shot%25202019-02-17%2520at%25208.09.30%2520PM.png" alt="FruitCollectionViewCell Interface"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To create cell interface:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Add UIView.&lt;/li&gt;
&lt;li&gt; Inside the UIView, add UIStackView (horizontal).&lt;/li&gt;
&lt;li&gt; In the UIStackView, add UIImageView and UILabel.&lt;/li&gt;
&lt;li&gt; For UILabel, set horizontal and vertical Content Compression Resistance Priority = 1000.&lt;/li&gt;
&lt;li&gt; For UIImageView, add Aspect Ratio 1:1 and change the priority to 750.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We'll need this for accurate display in horizontal mode.&lt;/p&gt;

&lt;p&gt;Next, we'll write the logic for displaying your cell both in horizontal and vertical modes.&lt;/p&gt;

&lt;p&gt;We'll take the cell size as the main criterion for horizontal display. That is, if there's enough space, we'll display it horizontally. As "enough space" we'll consider the width being twice the height, because the image should be a square.&lt;/p&gt;

&lt;p&gt;Here's the code for the cell:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;class FruitCollectionViewCell: UICollectionViewCell {\&lt;br&gt;
   static let reuseID = String(describing: FruitCollectionViewCell.self)\&lt;br&gt;
   static let nib = UINib(nibName: String(describing: FruitCollectionViewCell.self), bundle: nil)&lt;/p&gt;

&lt;p&gt;@IBOutlet private weak var stackView: UIStackView!&lt;/p&gt;

&lt;p&gt;@IBOutlet private weak var ibImageView: UIImageView!\&lt;br&gt;
   @IBOutlet private weak var ibLabel: UILabel!&lt;/p&gt;

&lt;p&gt;override func awakeFromNib() {\&lt;br&gt;
       super.awakeFromNib()\&lt;br&gt;
       backgroundColor = .white\&lt;br&gt;
       clipsToBounds = true\&lt;br&gt;
       layer.cornerRadius = 4\&lt;br&gt;
       ibLabel.font = UIFont.systemFont(ofSize: 18)\&lt;br&gt;
   }&lt;/p&gt;

&lt;p&gt;override func layoutSubviews() {\&lt;br&gt;
       super.layoutSubviews()\&lt;br&gt;
       updateContentStyle()\&lt;br&gt;
   }&lt;/p&gt;

&lt;p&gt;func update(title: String, image: UIImage) {\&lt;br&gt;
       ibImageView.image = image\&lt;br&gt;
       ibLabel.text = title\&lt;br&gt;
   }&lt;/p&gt;

&lt;p&gt;private func updateContentStyle() {\&lt;br&gt;
       let isHorizontalStyle = bounds.width &amp;gt; 2 * bounds.height\&lt;br&gt;
       let oldAxis = stackView.axis\&lt;br&gt;
       let newAxis: NSLayoutConstraint.Axis = isHorizontalStyle ? .horizontal : .vertical\&lt;br&gt;
       guard oldAxis != newAxis else { return }&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   stackView.axis = newAxis\
   stackView.spacing = isHorizontalStyle ? 16 : 4\
   ibLabel.textAlignment = isHorizontalStyle ? .left : .center\
   let fontTransform: CGAffineTransform = isHorizontalStyle ? .identity : CGAffineTransform(scaleX: 0.8, y: 0.8)

   UIView.animate(withDuration: 0.3) {\
       self.ibLabel.transform = fontTransform\
       self.layoutIfNeeded()\
   }\
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;}\&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;|&lt;/p&gt;

&lt;p&gt;Let's get to the main part and set up the controller and logic behind displaying and switching the cell types.&lt;/p&gt;

&lt;p&gt;We'll create enum PresentationStyle for all possible presentation states. To the navigation bar, we'll also add a button for switching between states.&lt;/p&gt;

&lt;p&gt;|   class FruitsViewController: UICollectionViewController {\&lt;br&gt;
   private enum PresentationStyle: String, CaseIterable {\&lt;br&gt;
       case table\&lt;br&gt;
       case defaultGrid\&lt;br&gt;
       case customGrid&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   var buttonImage: UIImage {\
       switch self {\
       case .table: return  imageLiteral(resourceName: "table")\
       case .defaultGrid: return  imageLiteral(resourceName: "default_grid")\
       case .customGrid: return  imageLiteral(resourceName: "custom_grid")\
       }\
   }\
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;private var selectedStyle: PresentationStyle = .table {\&lt;br&gt;
       didSet { updatePresentationStyle() }\&lt;br&gt;
   }&lt;/p&gt;

&lt;p&gt;private var datasource: [Fruit] = FruitsProvider.get()&lt;/p&gt;

&lt;p&gt;override func viewDidLoad() {\&lt;br&gt;
       super.viewDidLoad()\&lt;br&gt;
       self.collectionView.register(FruitCollectionViewCell.nib,\&lt;br&gt;
                                     forCellWithReuseIdentifier: FruitCollectionViewCell.reuseID)\&lt;br&gt;
       collectionView.contentInset = .zero\&lt;br&gt;
       updatePresentationStyle()&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   navigationItem.rightBarButtonItem = UIBarButtonItem(image: selectedStyle.buttonImage, style: .plain, target: self, action: #selector(changeContentLayout))\
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;private func updatePresentationStyle() {\&lt;br&gt;
       navigationItem.rightBarButtonItem?.image = selectedStyle.buttonImage\&lt;br&gt;
   }&lt;/p&gt;

&lt;p&gt;@objc private func changeContentLayout() {\&lt;br&gt;
       let allCases = PresentationStyle.allCases\&lt;br&gt;
       guard let index = allCases.firstIndex(of: selectedStyle) else { return }\&lt;br&gt;
       let nextIndex = (index + 1) % allCases.count\&lt;br&gt;
       selectedStyle = allCases[nextIndex]&lt;/p&gt;

&lt;p&gt;}\&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;// MARK: UICollectionViewDataSource &amp;amp; UICollectionViewDelegate\&lt;br&gt;
extension FruitsViewController {\&lt;br&gt;
   override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -&amp;gt; Int {\&lt;br&gt;
       return datasource.count\&lt;br&gt;
   }&lt;/p&gt;

&lt;p&gt;override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -&amp;gt; UICollectionViewCell {\&lt;br&gt;
       guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: FruitCollectionViewCell.reuseID,\&lt;br&gt;
                                                           for: indexPath) as? FruitCollectionViewCell else {\&lt;br&gt;
           fatalError("Wrong cell")\&lt;br&gt;
       }\&lt;br&gt;
       let fruit = datasource[indexPath.item]\&lt;br&gt;
       cell.update(title: fruit.name, image: fruit.icon)\&lt;br&gt;
       return cell\&lt;br&gt;
   }\&lt;br&gt;
} |&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The ***UICollectionViewDelegateFlowLayout*** protocol contains all data about display methods of collection elements. Therefore, to remove any implementations from the controller and create independent reusable elements, we create a separate implementation of this protocol for each presentation type.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;However, we should take into account that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; This protocol also defines the cell selection method (didSelectItemAt:).&lt;/li&gt;
&lt;li&gt; Some methods and logic are the same for all N display methods (in our case, N=3).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So we'll create a &lt;strong&gt;&lt;em&gt;CollectionViewSelectableItemDelegate&lt;/em&gt;&lt;/strong&gt; protocol that will expand the basic &lt;strong&gt;&lt;em&gt;UICollectionViewDelegateFlowLayout&lt;/em&gt;&lt;/strong&gt; protocol. That protocol will determine the closure for cell selection and, if needed, any additional properties and methods (such as returning the cell type if different display types are being used). This will solve the first issue.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;protocol CollectionViewSelectableItemDelegate: class, UICollectionViewDelegateFlowLayout {\&lt;br&gt;
   var didSelectItem: ((_ indexPath: IndexPath) -&amp;gt; Void)? { get set }\&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;|&lt;/p&gt;

&lt;p&gt;To solve the second one, the logic duplication issue, we'll create a base class that will contain all common logic.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;class DefaultCollectionViewDelegate: NSObject, CollectionViewSelectableItemDelegate {\&lt;br&gt;
   var didSelectItem: ((_ indexPath: IndexPath) -&amp;gt; Void)?\&lt;br&gt;
   let sectionInsets = UIEdgeInsets(top: 16.0, left: 16.0, bottom: 20.0, right: 16.0)&lt;/p&gt;

&lt;p&gt;func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {\&lt;br&gt;
       didSelectItem?(indexPath)\&lt;br&gt;
   }&lt;/p&gt;

&lt;p&gt;func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath) {\&lt;br&gt;
       let cell = collectionView.cellForItem(at: indexPath)\&lt;br&gt;
       cell?.backgroundColor = UIColor.clear\&lt;br&gt;
   }&lt;/p&gt;

&lt;p&gt;func collectionView(_ collectionView: UICollectionView, didUnhighlightItemAt indexPath: IndexPath) {\&lt;br&gt;
       let cell = collectionView.cellForItem(at: indexPath)\&lt;br&gt;
       cell?.backgroundColor = UIColor.white\&lt;br&gt;
   }&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;|&lt;/p&gt;

&lt;p&gt;In our case, the common logic includes the closure call when selecting a cell as well as cell background change when switching to highlighted state.&lt;/p&gt;

&lt;p&gt;Next, we'll describe 3 presentation implementations: tabular, 3 elements per each row, and a combination of the first two.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tabular presentation:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;class TabledContentCollectionViewDelegate: DefaultCollectionViewDelegate {\&lt;br&gt;
   // MARK: - UICollectionViewDelegateFlowLayout\&lt;br&gt;
   func collectionView(_ collectionView: UICollectionView,\&lt;br&gt;
                       layout collectionViewLayout: UICollectionViewLayout,\&lt;br&gt;
                       sizeForItemAt indexPath: IndexPath) -&amp;gt; CGSize {\&lt;br&gt;
       let paddingSpace = sectionInsets.left + sectionInsets.right\&lt;br&gt;
       let widthPerItem = collectionView.bounds.width - paddingSpace\&lt;br&gt;
       return CGSize(width: widthPerItem, height: 112)\&lt;br&gt;
   }&lt;/p&gt;

&lt;p&gt;func collectionView(_ collectionView: UICollectionView,\&lt;br&gt;
                       layout collectionViewLayout: UICollectionViewLayout,\&lt;br&gt;
                       insetForSectionAt section: Int) -&amp;gt; UIEdgeInsets {\&lt;br&gt;
       return sectionInsets\&lt;br&gt;
   }&lt;/p&gt;

&lt;p&gt;func collectionView(_ collectionView: UICollectionView,\&lt;br&gt;
                       layout collectionViewLayout: UICollectionViewLayout,\&lt;br&gt;
                       minimumLineSpacingForSectionAt section: Int) -&amp;gt; CGFloat {\&lt;br&gt;
       return 10\&lt;br&gt;
   }\&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;|&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Displaying 3 elements per row:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;class DefaultGriddedContentCollectionViewDelegate: DefaultCollectionViewDelegate {\&lt;br&gt;
   private let itemsPerRow: CGFloat = 3\&lt;br&gt;
   private let minimumItemSpacing: CGFloat = 8&lt;/p&gt;

&lt;p&gt;// MARK: - UICollectionViewDelegateFlowLayout\&lt;br&gt;
   func collectionView(_ collectionView: UICollectionView,\&lt;br&gt;
                       layout collectionViewLayout: UICollectionViewLayout,\&lt;br&gt;
                       sizeForItemAt indexPath: IndexPath) -&amp;gt; CGSize {\&lt;br&gt;
       let paddingSpace = sectionInsets.left + sectionInsets.right + minimumItemSpacing * (itemsPerRow - 1)\&lt;br&gt;
       let availableWidth = collectionView.bounds.width - paddingSpace\&lt;br&gt;
       let widthPerItem = availableWidth / itemsPerRow\&lt;br&gt;
       return CGSize(width: widthPerItem, height: widthPerItem)\&lt;br&gt;
   }&lt;/p&gt;

&lt;p&gt;func collectionView(_ collectionView: UICollectionView,\&lt;br&gt;
                       layout collectionViewLayout: UICollectionViewLayout,\&lt;br&gt;
                       insetForSectionAt section: Int) -&amp;gt; UIEdgeInsets {\&lt;br&gt;
       return sectionInsets\&lt;br&gt;
   }&lt;/p&gt;

&lt;p&gt;func collectionView(_ collectionView: UICollectionView,\&lt;br&gt;
                       layout collectionViewLayout: UICollectionViewLayout,\&lt;br&gt;
                       minimumLineSpacingForSectionAt section: Int) -&amp;gt; CGFloat {\&lt;br&gt;
       return 20\&lt;br&gt;
   }&lt;/p&gt;

&lt;p&gt;func collectionView(_ collectionView: UICollectionView,\&lt;br&gt;
                       layout collectionViewLayout: UICollectionViewLayout,\&lt;br&gt;
                       minimumInteritemSpacingForSectionAt section: Int) -&amp;gt; CGFloat {\&lt;br&gt;
       return minimumItemSpacing\&lt;br&gt;
   }\&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;|&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Combination of tabular and 3-per-row presentation options:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;class CustomGriddedContentCollectionViewDelegate: DefaultCollectionViewDelegate {\&lt;br&gt;
   private let itemsPerRow: CGFloat = 3\&lt;br&gt;
   private let minimumItemSpacing: CGFloat = 8&lt;/p&gt;

&lt;p&gt;// MARK: - UICollectionViewDelegateFlowLayout\&lt;br&gt;
   func collectionView(_ collectionView: UICollectionView,\&lt;br&gt;
                       layout collectionViewLayout: UICollectionViewLayout,\&lt;br&gt;
                       sizeForItemAt indexPath: IndexPath) -&amp;gt; CGSize {\&lt;br&gt;
       let itemSize: CGSize\&lt;br&gt;
       if indexPath.item % 4 == 0 {\&lt;br&gt;
           let itemWidth = collectionView.bounds.width - (sectionInsets.left + sectionInsets.right)\&lt;br&gt;
           itemSize = CGSize(width: itemWidth, height: 112)\&lt;br&gt;
       } else {\&lt;br&gt;
           let paddingSpace = sectionInsets.left + sectionInsets.right + minimumItemSpacing * (itemsPerRow - 1)\&lt;br&gt;
           let availableWidth = collectionView.bounds.width - paddingSpace\&lt;br&gt;
           let widthPerItem = availableWidth / itemsPerRow\&lt;br&gt;
           itemSize = CGSize(width: widthPerItem, height: widthPerItem)\&lt;br&gt;
       }\&lt;br&gt;
       return itemSize\&lt;br&gt;
   }&lt;/p&gt;

&lt;p&gt;func collectionView(_ collectionView: UICollectionView,\&lt;br&gt;
                       layout collectionViewLayout: UICollectionViewLayout,\&lt;br&gt;
                       insetForSectionAt section: Int) -&amp;gt; UIEdgeInsets {\&lt;br&gt;
       return sectionInsets\&lt;br&gt;
   }&lt;/p&gt;

&lt;p&gt;func collectionView(_ collectionView: UICollectionView,\&lt;br&gt;
                       layout collectionViewLayout: UICollectionViewLayout,\&lt;br&gt;
                       minimumLineSpacingForSectionAt section: Int) -&amp;gt; CGFloat {\&lt;br&gt;
       return 20\&lt;br&gt;
   }&lt;/p&gt;

&lt;p&gt;func collectionView(_ collectionView: UICollectionView,\&lt;br&gt;
                       layout collectionViewLayout: UICollectionViewLayout,\&lt;br&gt;
                       minimumInteritemSpacingForSectionAt section: Int) -&amp;gt; CGFloat {\&lt;br&gt;
       return minimumItemSpacing\&lt;br&gt;
   }\&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;|&lt;/p&gt;

&lt;p&gt;On the last stage, we add display data to the controller and set the appropriate delegate for the collection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important notice:&lt;/strong&gt; since the delegate of the collection is weak, in the controller, we need to have a strong reference to the presentation object.&lt;/p&gt;

&lt;p&gt;In the controller, let's create a dictionary of all available presentation types:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;private var styleDelegates: [PresentationStyle: CollectionViewSelectableItemDelegate] = {\&lt;br&gt;
       let result: [PresentationStyle: CollectionViewSelectableItemDelegate] = [\&lt;br&gt;
           .table: TabledContentCollectionViewDelegate(),\&lt;br&gt;
           .defaultGrid: DefaultGriddedContentCollectionViewDelegate(),\&lt;br&gt;
           .customGrid: CustomGriddedContentCollectionViewDelegate(),\&lt;br&gt;
       ]\&lt;br&gt;
       result.values.forEach {\&lt;br&gt;
           $0.didSelectItem = { _ in\&lt;br&gt;
               print("Item selected")\&lt;br&gt;
           }\&lt;br&gt;
       }\&lt;br&gt;
       return result\&lt;br&gt;
   }()&lt;/p&gt;

&lt;p&gt;|&lt;/p&gt;

&lt;p&gt;Also, to the &lt;strong&gt;updatePresentationStyle()&lt;/strong&gt;  method, let's add animated changing of collection delegates.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   collectionView.delegate = styleDelegates[selectedStyle]\
   collectionView.performBatchUpdates({\
       collectionView.reloadData()\
   }, completion: nil)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;|&lt;br&gt;
|\&lt;br&gt;
 |&lt;/p&gt;

&lt;p&gt;That's all we need to animate switching of elements from one state to another ;)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--j6GGPIlG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://indeema.com/images/articles/UICollectionView-Tutorial-Changing-presentation-on-the-fly/Copy%2520of%2520CollectionExampleGIF.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--j6GGPIlG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://indeema.com/images/articles/UICollectionView-Tutorial-Changing-presentation-on-the-fly/Copy%2520of%2520CollectionExampleGIF.gif" alt="UICollection fruit design"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using this approach, we are able to display elements on any screen in any manner and dynamically switch between presentation states. The most important point is that the code is loosely coupled, reusable, and scalable.&lt;/p&gt;

&lt;p&gt;You can find the complete project code at &lt;a href="https://github.com/IndeemaSoftware/CustomCollectionLayout"&gt;https://github.com/IndeemaSoftware/CustomCollectionLayout&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Deploying CI server on Linux</title>
      <dc:creator>Indeema Software</dc:creator>
      <pubDate>Thu, 05 Sep 2019 13:50:30 +0000</pubDate>
      <link>https://dev.to/indeemasoftware/deploying-ci-server-on-linux-3fe6</link>
      <guid>https://dev.to/indeemasoftware/deploying-ci-server-on-linux-3fe6</guid>
      <description>&lt;p&gt;Original article &lt;a href="https://indeema.com/blog/deploying-ci-server-on-linux--personal-android-test-machine" rel="noopener noreferrer"&gt;Deploying CI server on Linux&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's see how to use and deploy Jenkins CI flow for Android apps. Specifically, setting up automated &lt;strong&gt;unit testing&lt;/strong&gt; and building projects step-by-step.&lt;/p&gt;

&lt;p&gt;Diving into development for Android OS, you'll probably hear about a thing called unit testing. In fact, development for any platform has a thing for unit testing. And that's because of a reason.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;README&lt;/strong&gt;: All examples are on Android Studio, Android SDK and Linux (so if you're not into these, some examples may be hard to follow. Or not ;) We also covered &lt;a href="https://indeema.com/blog/ci-server-on-mac-os-for-ios-using-gitlab-and-fastlane" rel="noopener noreferrer"&gt;CI server on Mac OS for iOS using GitLab and Fastlane&lt;/a&gt; for iOS devs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why care about unit testing?
&lt;/h2&gt;

&lt;p&gt;Unit testing is definitely a great thing to introduce to your project, because you can make sure that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  New modules don't affect the existing unit-tested parts of the project.&lt;/li&gt;
&lt;li&gt;  A specific code part works as we expect it to.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In case they don't, failed tests immediately show you where the problem is.&lt;/p&gt;

&lt;p&gt;Unit tests are executed on a virtual Java machine, and of course you can run them directly in Android Studio. However, if your team is more than just you, using a continuous integration tool that automatically launches unit tests and generates informative report is a better idea.&lt;/p&gt;

&lt;p&gt;You can then export this file as .apk and share via email with your QAs, for example. And here's a solution for such purposes: Jenkins CI server &lt;a href="https://jenkins.io/" rel="noopener noreferrer"&gt;https://jenkins.io/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to install for Jenkins  CI server
&lt;/h2&gt;

&lt;p&gt;So, to install Jenkins:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Download the latest stable version at &lt;a href="http://mirrors.jenkins.io/war-stable/latest/jenkins.war" rel="noopener noreferrer"&gt;http://mirrors.jenkins.io/war-stable/latest/jenkins.war&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt; Open up a terminal and go to the download folder (or a folder to where you moved the jenkins.var file) with a command:\
&lt;code&gt;$ cd home/anyfolder/Downloads/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; Run a command:\
&lt;code&gt;$ java -jar jenkins.war --httpPort=8080&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This will launch a script that'll create a hidden &lt;strong&gt;.&lt;/strong&gt;&lt;strong&gt;Jenkins&lt;/strong&gt; subfolder in the home folder. All server configurations will be stored in that subfolder. The server will run as long as the terminal with script is open.&lt;/p&gt;

&lt;p&gt;To stop the server, either close the terminal window, or press &lt;strong&gt;Ctrl + C.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F1.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Jenkins server up
&lt;/h2&gt;

&lt;p&gt;After you run the script, the building of a local Jenkins server starts (using 8080 port).&lt;/p&gt;

&lt;p&gt;On the &lt;strong&gt;Getting Started&lt;/strong&gt; screen at &lt;a href="http://localhost:8080/" rel="noopener noreferrer"&gt;http://localhost:8080/&lt;/a&gt;, you'll need to enter  &lt;/p&gt;

&lt;p&gt;Initial Administrator Password. For this purpose, copy the provided path to your clipboard.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F2.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Therefore, to locate this password:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Launch a separate terminal instance and paste that path. For example:\
&lt;code&gt;$ cd /home/ruslanstosyk/.jenkins/secrets&lt;/code&gt;\
This will open the &lt;strong&gt;secrets&lt;/strong&gt; folder.&lt;/li&gt;
&lt;li&gt; Use the &lt;strong&gt;cat&lt;/strong&gt; command that allows reading content of a specific file. In this case, run &lt;strong&gt;cat&lt;/strong&gt; command with &lt;strong&gt;initialAdminPassword&lt;/strong&gt; filename:\
&lt;code&gt;$ cat initialAdminPassword&lt;/code&gt;\
This will display your password on the console.&lt;/li&gt;
&lt;li&gt; Copy and paste the password to the &lt;strong&gt;Administrator&lt;/strong&gt; &lt;strong&gt;Password&lt;/strong&gt; field and then click &lt;strong&gt;Continue&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; At the next step, select &lt;strong&gt;Install suggested plugins&lt;/strong&gt;.\
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F3.png"&gt;\
After you familiarise with Jenkins or require some specific tools only, you may use &lt;strong&gt;Select plugins to install&lt;/strong&gt;. However, at first and for basic needs, &lt;strong&gt;Install suggested plugins&lt;/strong&gt; option is better.&lt;/li&gt;
&lt;li&gt; Wait a few minutes while the installation is in progress.\
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F4.png"&gt; &lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a user for signing into the system and configuring the server and click &lt;strong&gt;Save and Continue.&lt;/strong&gt;\&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F5.png"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sign in to Jenkins using your username and password.\&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F6.png"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Configuring Jenkins integration for your needs
&lt;/h2&gt;

&lt;p&gt;So, after you're all set up with the server inself, you'll need to arm it with plugins that bring most benefits of continuous integration for building Android apps. First, from the start screen, select &lt;strong&gt;Manage Jenkins.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F7.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the menu that appears, select &lt;strong&gt;Manage Plugins&lt;/strong&gt; to go to the plugin management page. Here you can add, update, and select plugins you need. We'll add plugins to customize the Jenkins deployment and  adjust it to the required types of tasks. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F8.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go to the &lt;strong&gt;available&lt;/strong&gt; inset and find and download the following plugins (or use the links):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  JUnit\
&lt;a href="https://wiki.jenkins.io/display/JENKINS/JUnit+Plugin" rel="noopener noreferrer"&gt;https://wiki.jenkins.io/display/JENKINS/JUnit+Plugin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  JaCoCo\
&lt;a href="https://wiki.jenkins.io/display/JENKINS/JaCoCo+Plugin" rel="noopener noreferrer"&gt;https://wiki.jenkins.io/display/JENKINS/JaCoCo+Plugin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  EnvInject\
&lt;a href="https://wiki.jenkins.io/display/JENKINS/EnvInject+Plugin" rel="noopener noreferrer"&gt;https://wiki.jenkins.io/display/JENKINS/EnvInject+Plugin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  GitLab Plugin\
&lt;a href="https://wiki.jenkins.io/display/JENKINS/GitLab+Plugin" rel="noopener noreferrer"&gt;https://wiki.jenkins.io/display/JENKINS/GitLab+Plugin&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F9.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After you install all plugins you need and to properly launch them, restart Jenkins tool.&lt;/p&gt;

&lt;p&gt;Set up the path to folders that contain Java and Android SDK:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; From the start page, to to &lt;strong&gt;Manage Jenkins&lt;/strong&gt;, and select &lt;strong&gt;Configure System&lt;/strong&gt; option.&lt;/li&gt;
&lt;li&gt; Scroll down to the &lt;strong&gt;Global Properties&lt;/strong&gt; and select the &lt;strong&gt;Environment Variables&lt;/strong&gt; checkbox.&lt;/li&gt;
&lt;li&gt; In the &lt;strong&gt;Name&lt;/strong&gt; field, paste &lt;strong&gt;JAVA_HOME&lt;/strong&gt; and specify the path to you Java folder in the &lt;strong&gt;Value&lt;/strong&gt; field.&lt;/li&gt;
&lt;li&gt; Click &lt;strong&gt;Add&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; In the name-value pair that appears, paste &lt;strong&gt;ANDROID_HOME&lt;/strong&gt; as &lt;strong&gt;Name&lt;/strong&gt; and specify the path to your Android folder in the &lt;strong&gt;Value&lt;/strong&gt; field.&lt;/li&gt;
&lt;li&gt; Click &lt;strong&gt;Save&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F10.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F10.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a Jenkins CI project for Android
&lt;/h2&gt;

&lt;p&gt;So, finally, we're all set up for creating a new project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bind Jenkins to your project on Git
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;On the start page click &lt;strong&gt;New Item&lt;/strong&gt;.\&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F11.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F11.png"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Assign a name for your project. This name must not contain spaces.\&lt;br&gt;
For example, &lt;em&gt;testproject, test-project, Test_Project.&lt;/em&gt;\&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F12.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F12.png"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Freestyle project&lt;/strong&gt; option.\&lt;br&gt;
This will launch the project configuration page.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to &lt;strong&gt;Source Code Management&lt;/strong&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Git checkbox and paste full path to your project.\&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F13.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F13.png"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter your credentials to let Jenkins clone and launch your project.\&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F14.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F14.png"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Add rules for building the project
&lt;/h3&gt;

&lt;p&gt;Next tab we'll need for Jenkins continuous deployment is &lt;strong&gt;Build Triggers&lt;/strong&gt;. Here we can add rules for launching the project's build. There's a variety of options we can set up for starting the build. For example, detecting a specific keyphrase in a commit name such as [ci start] or any other you set up. Yet, to make use of this functionality, you'll have to deploy Jenkins CI on a web server (instead of a local one), because it's implemented using web hooks.&lt;/p&gt;

&lt;p&gt;In our case, we used an option that starts build every 15 minutes. This option uses cron  syntax.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F15.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F15.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;Build Environment&lt;/strong&gt; tab, select &lt;strong&gt;Abort&lt;/strong&gt; the build if it's stuck checkbox. This option is quite handy for cases when an unexpected error occurs and you need to free queue and deallocate memory.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F16.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F16.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, in the &lt;strong&gt;Build&lt;/strong&gt; tab, you have to specify the options to run:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;From the drop-down menu, select the &lt;strong&gt;Invoke Gradle Script&lt;/strong&gt; option.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the &lt;strong&gt;Invoke Gradle Script&lt;/strong&gt; dialog, select &lt;strong&gt;Use Gradle Wrapper&lt;/strong&gt; checkbox.\&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F17.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F17.png"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fill the Tasks field with the script that defines the order for running the commands.\&lt;br&gt;
We used:\&lt;br&gt;
&lt;code&gt;clean&lt;/code&gt;\&lt;br&gt;
&lt;code&gt;assembleDebug&lt;/code&gt;\&lt;br&gt;
&lt;code&gt;test\&lt;br&gt;
connectedAndroidTest&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then configure &lt;strong&gt;Post-Build Actions&lt;/strong&gt; by selecting the following options from the drop-down:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Publish JUnit test result report&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using this option, you'll configure Jenkins to save the detailed report on each test run. You'll also get a nice visualization of the report.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F18.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F18.png"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Archive the artifacts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This option builds the project after all tests are run. So you'll get an .apk  file ready to be downloaded and installed on a device.\&lt;br&gt;
&lt;strong&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F19.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F19.png"&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;5. Click &lt;strong&gt;Save&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To launch the project, either run an emulator, or connect some Android device to your computer and then click Build Now.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F20.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F20.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While the project is being cloned from the repo and the build is starting, you can explore the build status and info about success/failure of each stage in the &lt;strong&gt;Console Output.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Review the build
&lt;/h3&gt;

&lt;p&gt;After the project is successfully built, you'll see the following logs in the &lt;strong&gt;Console Output:&lt;/strong&gt;\&lt;br&gt;
&lt;strong&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F21.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F21.png"&gt;&lt;/a&gt;&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;From the main page of the build, you can download the .apk file and build logs, review the information about running the tests (success and failures), and more.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F22.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FDeploying-Jenkins-CI-server-Personal-android-test-machine%2F22.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Started and up!
&lt;/h2&gt;

&lt;p&gt;So we've made quite a lot of configurations. As a result, we've got a continuous integration using Jenkins for automating a part of build creation and launching tests when developing an Android app.&lt;/p&gt;

&lt;p&gt;This article covers only the tip of the iceberg of what you can set up and customize via Jenkins CI for your project/requirements.&lt;/p&gt;

&lt;p&gt;Thanks for reading and hope it helps you automate mundane tasks ;) Subscribe for more nifty stuff about continuous integration tools, &lt;a href="https://indeema.com/blog/internet-of-things-development--5-steps-to-creating-your-project" rel="noopener noreferrer"&gt;IoT&lt;/a&gt;, &lt;a href="https://indeema.com/blog/kotlin-arrival--the-official-start-of-a-post-java-era" rel="noopener noreferrer"&gt;Android development&lt;/a&gt;, and &lt;a href="https://indeema.com/blog/smart-lock--why-sloth-is-a-driver-of-the-iot-progress" rel="noopener noreferrer"&gt;more&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>jenkins</category>
      <category>ci</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to debug Javascript in Chrome quick and easy</title>
      <dc:creator>Indeema Software</dc:creator>
      <pubDate>Thu, 05 Sep 2019 13:48:29 +0000</pubDate>
      <link>https://dev.to/indeemasoftware/how-to-debug-javascript-in-chrome-quick-and-easy-5823</link>
      <guid>https://dev.to/indeemasoftware/how-to-debug-javascript-in-chrome-quick-and-easy-5823</guid>
      <description>&lt;p&gt;Overview&lt;/p&gt;




&lt;p&gt;Original article - &lt;a href="https://indeema.com/blog/how-to-debug-javascript-in-chrome-quick-and-easy" rel="noopener noreferrer"&gt;How to debug Javascript in Chrome&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this article, you will learn how to debug JavaScript code on front end and back end using Chrome DevTools and VS Code.&lt;/p&gt;

&lt;p&gt;Goals&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt; Learn to debug frontend and Angular&lt;/li&gt;
&lt;li&gt; Analyze how to debug Node.js&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Front-end JavaScript/Angular debugging
&lt;/h2&gt;

&lt;p&gt;Currently, a lot of tools like Chrome DevTools (also known as chrome debugger) and Firefox Developer Tools support front-end debugging. While these two are the most popular ones, other browsers also have tools of their own. Let's consider Chrome DevTools for our bug-eliminating adventure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Debugging JavaScript
&lt;/h3&gt;

&lt;p&gt;Let's be honest, debugging can sometimes be really time-consuming. Especially, if simple commands such as &lt;strong&gt;console.log()&lt;/strong&gt; or &lt;strong&gt;window.alert()&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You have to write and then remove additional code and, sometimes, you can even commit code that includes these methods (even if you thought you had removed them). But if there are any linters set up, console or alert methods will be highlighted in the code.&lt;/p&gt;

&lt;p&gt;Here's when Chrome DevTools comes to the stage with a noble mission to debug code without these tedious instruments. Among its other perks, CSS and &lt;a href="https://indeema.com/blog/hints-to-make-your-html-markup-easy" rel="noopener noreferrer"&gt;HTML&lt;/a&gt; editing, testing the network and site speed are our favorite ones.&lt;/p&gt;

&lt;p&gt;Let's create a simple web page with JavaScript method &lt;strong&gt;getData()&lt;/strong&gt; that simply collects the data from the &lt;strong&gt;name&lt;/strong&gt; input field, creates a DOM node with &lt;strong&gt;dataSpan ID&lt;/strong&gt;, and then adds the input field value to that &lt;strong&gt;DOM&lt;/strong&gt; element.&lt;/p&gt;

&lt;p&gt;Here's how our page'll look like:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In HTML:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F1.jpg" alt="HTML page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In JavaScript:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F2.jpg" alt="JavaScript Debugging code"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's save it under &lt;strong&gt;app.js&lt;/strong&gt; name.&lt;/p&gt;

&lt;p&gt;That's how the page will appear in browser:\&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F3.jpg" alt="app.js page in browser"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To look over how the method works prior to storing it in &lt;strong&gt;dataSpan&lt;/strong&gt;, we can use the old-fashioned &lt;strong&gt;console.log(data)&lt;/strong&gt; or &lt;strong&gt;window.alert(data)&lt;/strong&gt;. Here's what we'll see when launching the file in VS Code:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F22.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F22.jpg" alt="VS code"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is, however, the most primitive approach.&lt;/p&gt;

&lt;p&gt;So, instead, we'll use &lt;strong&gt;Chrome DevTools&lt;/strong&gt; and validate that everything works as we plan using breakpoints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Breakpoint&lt;/strong&gt; is simply a line of code at which we want to stop running code to examine how it works (or doesn't work) accurately.&lt;/p&gt;

&lt;p&gt;Back on track, let's launch the page in Google Chrome and:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; To open Chrome Develop Tools, in the upper-right corner of the browser, click to open &lt;strong&gt;Customize and control Google Chrome&lt;/strong&gt; menu.&lt;/li&gt;
&lt;li&gt; From the menu, select &lt;strong&gt;More tools&lt;/strong&gt;, and then select &lt;strong&gt;Developer tools&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Alternatively, we can use &lt;strong&gt;Ctrl+Shift+I&lt;/strong&gt; keyboard shortcut (we prefer this approach, but that's up to you).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F4.jpg" alt="Developers tools opening"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After we're in, let's pause the code at a breakpoint:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; With &lt;strong&gt;Chrome DevTools&lt;/strong&gt; launched, select the &lt;strong&gt;Sources&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt; From the &lt;strong&gt;Sources&lt;/strong&gt; pane, in the &lt;strong&gt;Page&lt;/strong&gt; view, select &lt;strong&gt;app.js&lt;/strong&gt; (the JavaScript file we created previously).&lt;/li&gt;
&lt;li&gt; In the &lt;strong&gt;Editor Pane&lt;/strong&gt;, to the left of the let data &lt;strong&gt;=document.getElementById('name').value;&lt;/strong&gt; line of code, click the line number &lt;strong&gt;3&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With this in place, we'll set a &lt;strong&gt;line-of-code breakpoint&lt;/strong&gt;, which is nicely highlighted in blue so we can see exactly where we've set it. Also note that the selected variable's name automatically adds up to the &lt;strong&gt;Breakpoints &amp;gt; Local&lt;/strong&gt; section, in the &lt;strong&gt;JavaScript Debugging&lt;/strong&gt; pane.&lt;/p&gt;

&lt;h3&gt;
  
  
  Managing Increments at Which the Function Is Executed
&lt;/h3&gt;

&lt;p&gt;Setting a breakpoint means that the function will stop execution on that breakpoint. We must then enable executing the code line-by-line to inspect the changes in our variable.&lt;/p&gt;

&lt;p&gt;At the top-left of the &lt;strong&gt;JavaScript Debugging&lt;/strong&gt; pane are the basic breakpoint run commands:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F6.jpg" alt="basic breakpoint run commands"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first, &lt;strong&gt;Resume script execution&lt;/strong&gt; button will continue the code execution until the code ends or until the next breakpoint.&lt;/p&gt;

&lt;p&gt;Let's enter &lt;strong&gt;hello world&lt;/strong&gt; in our name field. The line will expand with data &lt;strong&gt;= "hello world"&lt;/strong&gt;. Now let's click &lt;strong&gt;Step over&lt;/strong&gt; &lt;strong&gt;next function call&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F7.jpg" alt="Step over next funtion call"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The selected breakpoint line is executed and the debugger will select the next one. Expand the &lt;strong&gt;Scope&lt;/strong&gt; pane to see the value of the &lt;strong&gt;data&lt;/strong&gt; variable. It has changed to "&lt;strong&gt;hello world&lt;/strong&gt;", which we have previously entered. It simply displays our variable on a specific line of code. Click &lt;strong&gt;Step over&lt;/strong&gt; &lt;strong&gt;next function call&lt;/strong&gt; again to run the selected method and proceed to the next line.&lt;/p&gt;

&lt;p&gt;If you refresh the page, the value of the &lt;strong&gt;out&lt;/strong&gt; variable will be updated to the DOM element. To the left of the variable, you can click the &lt;strong&gt;Expand&lt;/strong&gt; () icon to view its value. If you click &lt;strong&gt;Step over&lt;/strong&gt; &lt;strong&gt;next function call&lt;/strong&gt;, in the browser, the "hello world" text will be added to the &lt;strong&gt;dataSpan&lt;/strong&gt; again.&lt;/p&gt;

&lt;h3&gt;
  
  
  More Complex Javascript Debugging
&lt;/h3&gt;

&lt;p&gt;Let's say we want to execute more complicated function that definitely requires some debugging. For example, we want users to enter space-separated numbers. The function will then evaluate and output these numbers, their sum, and multiplication result (product).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F8.jpg" alt="JavaScript debugging"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For this purpose, we'll modify our app.js to look like the screenshot above. Let's refresh the page and do some debugging:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F9.jpg" alt="debugging JS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Click &lt;strong&gt;3&lt;/strong&gt;, the line number of let data = document.getElementById('name').value;, to set a breakpoint.&lt;/li&gt;
&lt;li&gt; In the browser, enter &lt;strong&gt;23 24 e&lt;/strong&gt; in the input field. Here we intentionally add both numbers and a letter to cause an error---these can't be added or multiplied.&lt;/li&gt;
&lt;li&gt; Click &lt;strong&gt;Step over&lt;/strong&gt; &lt;strong&gt;next function call&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On the screenshot, we can see that both sum and product have a NaN (not a number) value. This indicates that we have to fix our code right away.&lt;/p&gt;

&lt;h3&gt;
  
  
  Another Way to Set Breakpoints
&lt;/h3&gt;

&lt;p&gt;In the majority of cases, your code is a lot longer and, perhaps, concatenated into a single line. For example, let's assume we have 1000 lines of code. In this case, setting breakpoints by clicking the line numbers every time looks pretty unrealistic, isn't it?&lt;/p&gt;

&lt;p&gt;For this purpose, DevTools features excellent tool for setting breakpoints on events that occur when interacting with browser. On the &lt;strong&gt;JavaScript Debugging&lt;/strong&gt; pane, click &lt;strong&gt;Event Listener Breakpoints&lt;/strong&gt; to expand it with event categories.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F11.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F11.jpg" alt="JavaScript debugging"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, we've set a breakpoint on &lt;strong&gt;Mouse &amp;gt; click&lt;/strong&gt; event anywhere in our code. So, without the need to manually add a breakpoint, when you click the &lt;strong&gt;Get Input Data&lt;/strong&gt; button, the execution will be paused on this &lt;strong&gt;onclick&lt;/strong&gt; event.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F12.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F12.jpg" alt="onclick event"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clicking &lt;strong&gt;Step over&lt;/strong&gt; &lt;strong&gt;next function call&lt;/strong&gt; will sequentially lead us through the code used to process the click action.&lt;/p&gt;

&lt;p&gt;Via &lt;strong&gt;Event Listener Breakpoints&lt;/strong&gt;, you can set breakpoints at a variety of event types such as Keyboard, Touch, and XHR.&lt;/p&gt;

&lt;h3&gt;
  
  
  The "debugger" Keyword
&lt;/h3&gt;

&lt;p&gt;When you type the &lt;strong&gt;debugger&lt;/strong&gt; keyword anywhere in your code, Chrome DevTools will pause executing at that line and highlight it similarly to breakpoints. You can use this instrument to debug JavaScript in Chrome or other browsers. Just remember to remove the word from the code when you're done.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F13.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F13.jpg" alt="debugger keyword"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The code in the screenshot above will be paused on the line that contains the debugger word and will launch Chrome DevTools. That is equivalent to setting a breakpoint on that specific line of code. You can also manage the code execution using &lt;strong&gt;Step into next function call&lt;/strong&gt; and &lt;strong&gt;Step over next function call&lt;/strong&gt; buttons as we did before.&lt;/p&gt;

&lt;h3&gt;
  
  
  To Sum It Up
&lt;/h3&gt;

&lt;p&gt;At the beginning, we considered &lt;strong&gt;console.log()&lt;/strong&gt; and &lt;strong&gt;window.alert()&lt;/strong&gt; and found them not really useful. We were supposed to use them a lot throughout the code, which could make the code heavier and slower if we forgot to remove these commands when commiting.&lt;/p&gt;

&lt;p&gt;As the code grows, Chrome Developer Tools can be much more efficient to catch any bugs and evaluate the performance in general.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to debug Angular
&lt;/h3&gt;

&lt;p&gt;The easiest way to debug Angular code via Visual Studio Code (VS Code). To start debugging, you will need to install the &lt;a href="https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome" rel="noopener noreferrer"&gt;Debugger&lt;/a&gt; extension to your Chrome browser:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Launch VS Code with your current project, open the &lt;strong&gt;Extensions&lt;/strong&gt; tab. Or press &lt;strong&gt;Ctrl+Shift+X&lt;/strong&gt; on your keyboard.&lt;/li&gt;
&lt;li&gt; Enter &lt;strong&gt;Chrome&lt;/strong&gt; in the search field.&lt;/li&gt;
&lt;li&gt; From the search results, select &lt;strong&gt;Debugger for Chrome&lt;/strong&gt; and click &lt;strong&gt;Install&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; After you install the extension, the &lt;strong&gt;Reload&lt;/strong&gt; button will appear. Click it to complete the installation and activate the Debugger in the browser.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Setting Breakpoints
&lt;/h3&gt;

&lt;p&gt;Exactly as we did before, in the &lt;strong&gt;app.component.ts&lt;/strong&gt;, click the line number to the left of the line. The set breakpoint will be denoted with a red circle icon.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F14.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F14.jpg" alt="Debugging Angular"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Debugger Configuration
&lt;/h3&gt;

&lt;p&gt;First, we'll need to configure the debugger:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; From the &lt;strong&gt;File Explorer&lt;/strong&gt;, navigate to the &lt;strong&gt;Debug&lt;/strong&gt; view. You can also use Ctrl+Shift+D shortcut.&lt;/li&gt;
&lt;li&gt; Click &lt;strong&gt;Settings&lt;/strong&gt; icon button to create &lt;strong&gt;launch.json&lt;/strong&gt;. That's the configuration file we'll use.&lt;/li&gt;
&lt;li&gt; From the &lt;strong&gt;Select Environment&lt;/strong&gt; drop-down, select &lt;strong&gt;Chrome&lt;/strong&gt;. This will create a new .&lt;strong&gt;vscode&lt;/strong&gt; folder with &lt;strong&gt;launch.json&lt;/strong&gt; file in your project.&lt;/li&gt;
&lt;li&gt; Launch the file.&lt;/li&gt;
&lt;li&gt; To fit the file for our purpose, in the &lt;strong&gt;url&lt;/strong&gt; method, change the localhost port from 8080 to 4200.&lt;/li&gt;
&lt;li&gt; Save changes. Your file will look as follows:\
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F15.jpg" alt="Debugger Configuration"&gt;
&lt;/li&gt;
&lt;li&gt; Press &lt;strong&gt;F5&lt;/strong&gt; on the keyboard or click &lt;strong&gt;Start Debugging&lt;/strong&gt; button to launch the Debugger.&lt;/li&gt;
&lt;li&gt; Launch Chrome.&lt;/li&gt;
&lt;li&gt; Refresh the page to pause the code at the set breakpoint.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F16.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F16.jpg" alt="Debugger Configuration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can sequentially browse through the code using F10 button inspecting the variables and their change.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F17.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F17.jpg" alt="variable change in JS debugging"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  README
&lt;/h3&gt;

&lt;p&gt;The Debugger for Chrome extension contains lots of info about additional configurations, working with sourcemaps, and resoling various issues. You can view them directly in VS Code by clicking the extension and selecting &lt;strong&gt;Details&lt;/strong&gt; tab.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F18.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F18.jpg" alt="Debugger for Chrome"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to debug Back End (Node.js)
&lt;/h2&gt;

&lt;p&gt;Here you'll find out how to debug Node.js code. Here are the most common approaches:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Using Chrome DevTools (well, that's by far our favorite).&lt;/li&gt;
&lt;li&gt;  Using IDEs such as Visual Studio Code, Visual Studio, WebStorm, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We'll use VS Code and Chrome DevTools for illustration.&lt;/p&gt;

&lt;p&gt;Chrome and Node.js use the same JavaScript engine, Google V8, which means we can use the tools we used for front end debugging.&lt;/p&gt;

&lt;p&gt;To do this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Launch your project in VS Code.&lt;/li&gt;
&lt;li&gt; Navigate to &lt;strong&gt;Console&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt; Enter or paste &lt;strong&gt;npm start --inspect&lt;/strong&gt; command and press &lt;strong&gt;Enter&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; Ignore the suggested "chrome-devtools://..." URL (there is a better way).\
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F19.jpg" alt="VS Code launching"&gt;
&lt;/li&gt;
&lt;li&gt; Launch Chrome and enter or paste "&lt;strong&gt;about:inspect&lt;/strong&gt;". This will redirect you to the &lt;strong&gt;Devices&lt;/strong&gt; page of DevTools.&lt;/li&gt;
&lt;li&gt; Click &lt;strong&gt;Open dedicated DevTools for Node&lt;/strong&gt; hyperlink.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F20.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FHow-to-debug-javascript-in-Chrome-quick-and-easy%2F20.jpg" alt="DevTools for Node"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The node.js debugging process is done the same way we did on front-end side using breakpoints. This is pretty useful that you don't need to switch to IDE. This way, both back end and front end can be debugged using the same interface.&lt;/p&gt;

&lt;p&gt;Thanks for reading and hope you enjoyed this article. Subscribe to our updates, we have lots more cool stuff up in our sleeve :)&lt;/p&gt;

</description>
      <category>javascript</category>
    </item>
    <item>
      <title>How to visualize SCADA with QSimpleScada? Free libary inside </title>
      <dc:creator>Indeema Software</dc:creator>
      <pubDate>Thu, 01 Aug 2019 11:38:27 +0000</pubDate>
      <link>https://dev.to/indeemasoftware/how-to-visualize-scada-with-qsimplescada-free-libary-inside-397j</link>
      <guid>https://dev.to/indeemasoftware/how-to-visualize-scada-with-qsimplescada-free-libary-inside-397j</guid>
      <description>&lt;p&gt;There's a lot of IoT SCADA solutions for factories and other manufacturing needs. Yet, there are cases (and quite a lot), when you need to develop your own SCADA system to cover specific needs of your project.&lt;/p&gt;

&lt;p&gt;We often use awesome Qt framework for implementing complex IoT solutions. For a bunch SCADA and SCADA-like projects, we came across the need for quick tool for developing device dashboards. That's why we developed super lightweight unofficial Qt library. The library is open source, customizable, and free to use under MIT license. We also share a small set of developed widgets.&lt;/p&gt;

&lt;p&gt;Enjoy and use Qt ;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;README&lt;/strong&gt;: This library is created for desktop, mobile, and embedded projects developed on Qt. To use it, you should know Qt/ C++ and QML.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing QSimpleScada
&lt;/h2&gt;

&lt;p&gt;Let us introduce you to a nifty library for your IoT projects. We created QSimpleScada to speed up and simplify visualising any data, so we (and you) can concentrate on developing automation algorithms that rock.&lt;/p&gt;

&lt;p&gt;It was mainly created to quicken and, consequently, reduce the &lt;a href="https://indeema.com/blog/how-much-does-it-cost-to-create-iot-solution" rel="noopener noreferrer"&gt;cost of IoT solution.&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is QSimpleScada?
&lt;/h3&gt;

&lt;p&gt;It's a library that completely handles connection to and editing of widgets. Using QSimpleScada, you can easily create a visualization of IoT data using your mouse and a little code. After you are satisfied with the layout, save the generated .xml file and use it in your project.&lt;/p&gt;

&lt;p&gt;Library is created with Qt/C++ and basic widget is based on C++. There is interface for QML, so you can independently create individual widgets on QML (as when creating classic QML UIs) and upload them to your app on a go.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why do I need it?
&lt;/h3&gt;

&lt;p&gt;Well, you do if you are a Qt developer or a company and:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Have strict deadlines and complex data evaluations at your project&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Need to prototype mobile/embedded/desktop IoT projects often&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Need a one-stop tool for diverse Qt projects&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Don't want/have time/resources to develop dashboards from scratch&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If neither of the above is about you, then you don't.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why build IoT dashboards?
&lt;/h3&gt;

&lt;p&gt;Well, it may sound a bit redundant, so feel free to skip this section if this question is self-evident to you. Otherwise, there are quite a few reasons to visualize info you got from Internet of Things.&lt;/p&gt;

&lt;p&gt;It's the basic HMI (Human-Machine Interface) component for literally any IoT or control system. Far better than textual approach if you want users to see relevant data on the go. That applies both to classic SCADA and SCADA-ish projects.&lt;/p&gt;

&lt;p&gt;For example, on our UBreez we used QSimpleScada to visualize air readings. Compare the display for yourself. So, what looks more neat and clear even when comprising lots of sensor widgets?l&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FIoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library%2FTextual.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FIoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library%2FTextual.png" alt="Text vs Visualization"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using dashboards, you can immediately highlight any deviations from standards, pinpoint where a malfunction occurs, track live location, see trends and any other valuable info. It saves users time on understanding data you SCADA system collects, and they can respond and decide how to act faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using QSimpleScada
&lt;/h2&gt;

&lt;p&gt;Here are the steps for integrating QSimpleScada version 0.9.x in your project:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Install
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Via package manager:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're building savvy solutions using Qt, you most likely use qpm package manager so no further chit-chat is required. In case you don't (yet), download it from here &lt;a href="https://www.qpm.io/" rel="noopener noreferrer"&gt;https://www.qpm.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To install via qpm, run:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;qpm&lt;/code&gt; &lt;code&gt;install com.indeema.qsimplescada&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And add:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;include (../vendor/vendor.pri)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To *.pro file of your project.&lt;/p&gt;

&lt;p&gt;As a bonus, try out our preset of widgets:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;qpm&lt;/code&gt; &lt;code&gt;install com.indeema.eeiot&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From GitHub:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To clone the repo, go to:\&lt;br&gt;
&lt;a href="https://github.com/IndeemaSoftware/QSimpleScada" rel="noopener noreferrer"&gt;https://github.com/IndeemaSoftware/QSimpleScada&lt;/a&gt;\&lt;br&gt;
To also add preconfigured widgets, clone:\&lt;br&gt;
&lt;a href="https://github.com/IndeemaSoftware/EEIoT" rel="noopener noreferrer"&gt;https://github.com/IndeemaSoftware/EEIoT&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And add:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;include($$PWD/com/indeema/QSimpleScada/com_indeema_QSimpleScada.pri)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;include($$PWD/com/indeema/eeiot/com_indeema_eeiot.pri)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;To the *.pro file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Using binary release:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/IndeemaSoftware/QSimpleScada/releases" rel="noopener noreferrer"&gt;https://github.com/IndeemaSoftware/QSimpleScada/releases&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Configure
&lt;/h3&gt;

&lt;p&gt;Once you download and install the library to your project:&lt;/p&gt;

&lt;p&gt;1. Create a new device that is going to be represented on your dashboard. Give it a name and it IP address:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;QScadaDeviceInfo *lDeviceInfo = new QScadaDeviceInfo();&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;lDeviceInfo-&amp;gt;setName("Test Device");&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;lDeviceInfo-&amp;gt;setIp(QHostAddress("127.0.0.1"));&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;2. Create a controller class that will handle all later devices and all boards that are connected to devices:\&lt;br&gt;
&lt;code&gt;QScadaBoardController *&lt;/code&gt;&lt;code&gt;mController&lt;/code&gt; &lt;code&gt;= new QScadaBoardController();   mController-&amp;gt;appendDevice(lDeviceInfo)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;3. Call initBoardForDeviceIp method to create a new board for already appended device. If there is no device on specific IP, the board will not be created.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mController-&amp;gt;initBoardForDeviceIp("127.0.0.1");&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;4. Set editable mode for your controller to enable creating, moving, and resizing the controllers.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mController-&amp;gt;setEditingMode(true);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If the editing mode is enabled, the modal window will feature dotted background:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FIoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library%2F1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FIoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library%2F1.png" alt="IoT dashboar builder"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5. Add grid layout on your widget and then add your controller to that widget:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;QGridLayout *&lt;/code&gt;&lt;code&gt;mainLayout&lt;/code&gt; &lt;code&gt;= new QGridLayout(ui-&amp;gt;centralWidget);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mainLayout-&amp;gt;addWidget(&lt;/code&gt;&lt;code&gt;mController&lt;/code&gt;&lt;code&gt;);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Working with widgets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We've also developed an EEIoT library with a set of preconfigured widgets. You can download it at &lt;a href="https://github.com/IndeemaSoftware/EEIoT" rel="noopener noreferrer"&gt;https://github.com/IndeemaSoftware/EEIoT&lt;/a&gt; and try it out as a start.&lt;/p&gt;

&lt;p&gt;To use a widget collection:&lt;/p&gt;

&lt;p&gt;Call the function with url to QML resources to let the controller know the location of QML widgets:\&lt;br&gt;
&lt;code&gt;QMLConfig::instance.appendQMLPath(:/com/indeema/eeiot/EEIoT/);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Singletone QMLConfig is located in  "qscadaconfig.h"\&lt;br&gt;
Here we use EEIoT as a group for all widgets inside. You can configure 1 or more groups.\&lt;br&gt;
Note, if you create two folders with the same name in different locations, the second one (created later)  will erase the first.&lt;/p&gt;

&lt;p&gt;You can access all the dynamic properties that form QML (mentioned in a metaData list) from QSimpleScada, so you can create your own complex dashboards fast and easy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Use
&lt;/h3&gt;

&lt;p&gt;You can use our simple editor to create your first dashboard &lt;a href="https://github.com/IndeemaSoftware/QSimpleScadaSample" rel="noopener noreferrer"&gt;https://github.com/IndeemaSoftware/QSimpleScadaSample&lt;/a&gt;\&lt;br&gt;
Then set up QScadaBoardController in your app without any devices and boards and call:\&lt;br&gt;
&lt;code&gt;mController-&amp;gt;openProject(QString &amp;lt;file&amp;gt;)&lt;/code&gt;\&lt;br&gt;
where  is a full path to your project file (*.irp)&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mController-&amp;gt;openProject(QString :/com/indeema/eeiot/EEIoT/)&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  See QSimpleScada in action
&lt;/h2&gt;

&lt;p&gt;Visit our GitHub profile to explore simple apps that show the work of QSimpleScada library:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  ### Weather app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a plain app that visualizes weather-related data of 3 widgets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Temperature&lt;/li&gt;
&lt;li&gt;  Humidity&lt;/li&gt;
&lt;li&gt;  Pressure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;QSimpleScada and EEIoT are used to handle the display and connectivity of the dashboard. All the weather real-time data we receive from Openweathermap API. You can download the code at &lt;a href="https://github.com/IndeemaSoftware/QSimpleScadaSample" rel="noopener noreferrer"&gt;https://github.com/IndeemaSoftware/QSimpleScadaSample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To see the current readings for your city:&lt;/p&gt;

&lt;p&gt;Enter your city followed by comma and country code as follows:\&lt;br&gt;
&lt;strong&gt;Kyiv,&lt;/strong&gt;&lt;strong&gt;ua&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;and click the &lt;strong&gt;Send&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;This will update temperature, humidity and pressure for your region.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FIoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library%2F2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FIoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library%2F2.png" alt="Weather dasboard for Lviv"&gt;&lt;/a&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FIoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library%2F3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FIoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library%2F3.png" alt="Weather dashboard for Odessa"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;   Builder app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One more example of how to use QSimpleScada is Builder application that gives us the possibility to create our dashboards and save to *.irp files. A simple dashboard editor that uses QSimpleScada to create needed dashboard with EEIoT widgets and save dashboard setup for later usage. In the example, we created dashboard that was used in Weather application mentioned above.&lt;/p&gt;

&lt;p&gt;The code is also available at &lt;a href="https://github.com/IndeemaSoftware/QSimpleScadaSample" rel="noopener noreferrer"&gt;https://github.com/IndeemaSoftware/QSimpleScadaSample&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  More tools for you
&lt;/h2&gt;

&lt;p&gt;We find that introducing Internet of Things impacts every industry and redefines our approach to using tech. We've gone through that topic in detail at &lt;a href="https://indeema.com/blog/6-promissing-applications-for-the-industrial-iot" rel="noopener noreferrer"&gt;6 promising applications for the industrial IoT&lt;/a&gt; article, and it is our pleasure to drive the progress with automatization that 4th Industrial Revolution brings.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding and context
&lt;/h3&gt;

&lt;p&gt;If all projects got specs set in stone, the development world would be a utopia. Yet, the clearer the initial goal and requirements are as well as the better the whole team understands them, the more streamlined is a project. To deepen your knowledge about specifics and typical pitfalls that follow IoT projects, read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://indeema.com/blog/how-to-create-a-startup--iot-project-from-idea-to-production" rel="noopener noreferrer"&gt;How to create a startup: IoT project from idea to production&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://indeema.com/blog/b2c--b2b-specifics-of-developing-iot-products" rel="noopener noreferrer"&gt;B2C &amp;amp; B2B specifics of developing IoT products&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://indeema.com/blog/internet-of-things-development--5-steps-to-creating-your-project" rel="noopener noreferrer"&gt;Internet of Things development: 5 steps to creating your project&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Spoiler&lt;/strong&gt;: find the templates for project-related documentation, so you can communicate the requirements and turn them into actionable specifications with less effort.&lt;/p&gt;

&lt;h3&gt;
  
  
  Estimating the cost and time
&lt;/h3&gt;

&lt;p&gt;Get a thorough understanding of the time and resources you'll need is nearly impossible. So, to forearm you with a general idea of the complexity (calculated in time and cost), here's an IoT-specific calculator:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://calc.indeema.com/" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FIoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library%2F4.png" alt="IoT solution cost calculator"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Dev tools
&lt;/h3&gt;

&lt;p&gt;Sharing our toolkit for faster and more efficient development of IoT project, we upload our Qt and IoT related open source projects at &lt;a href="https://github.com/IndeemaSoftware" rel="noopener noreferrer"&gt;https://github.com/IndeemaSoftware&lt;/a&gt; with Q at the beginning of the repo titles. You can also find a bunch of tools for React, Android, and iOS development there.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FIoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library%2FGitHub.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Findeema.com%2Fimages%2Farticles%2FIoT-dashboard-library-visualize-scada-at-a-snap-Free-IoT-library%2FGitHub.png" alt="Indeema and Github"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Recap 
&lt;/h2&gt;

&lt;p&gt;At Indeema, we are accustomed to tight deadlines and challenging projects. And, being committed to creating savvy solutions, we gradually realized that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Understanding comes first.&lt;/strong&gt;\&lt;br&gt;
Be curious. Clarify each requirement, no matter how evident you think it is. Make sure you do understand. Because you can design a logical and scalable architecture, write awesome clean code, and yet fail to convey the desired result. Devil is in the details (so make sure you leave no details unnoticed).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reinventin&lt;/strong&gt;&lt;strong&gt;g the bicycle is futile.&lt;/strong&gt;\&lt;br&gt;
Each project contains unique challenges and requires out-of-the-box thoughts. And there's no need to develop everything from scratch. Why? Because you'll only cut the time you have to find and implement really challenging features, modules, and architecture.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Qualit&lt;/strong&gt;&lt;strong&gt;y is&lt;/strong&gt; &lt;strong&gt;a standard&lt;/strong&gt;&lt;strong&gt;.&lt;/strong&gt;\&lt;br&gt;
Be responsible for your work. You are engaged in making the future. If you are a developer, test your code against specifications, against best practices, common sense, stability of the project, etc. And the same applies to any other role.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading &amp;amp; hope you enjoyed this article. Subscribe for updates and let us know what you're interested in.&lt;/p&gt;

</description>
      <category>iot</category>
      <category>qsimplescada</category>
      <category>qt</category>
      <category>qml</category>
    </item>
    <item>
      <title>Top 10 IoT sensors in 2019    </title>
      <dc:creator>Indeema Software</dc:creator>
      <pubDate>Tue, 19 Feb 2019 13:22:51 +0000</pubDate>
      <link>https://dev.to/indeemasoftware/top-10-iot-sensors-in-2019-----5ap0</link>
      <guid>https://dev.to/indeemasoftware/top-10-iot-sensors-in-2019-----5ap0</guid>
      <description>

&lt;p&gt;The collectible data includes those various signals that both animate and inanimate object can send to the IoT systems. Hence, the objects should have some highly specific signal-generating devices to share information within the IoT.&lt;/p&gt;

&lt;p&gt;Original article - &lt;a href="https://indeema.com/images/articles/Top-10-IoT-sensors-in-2019/refuel-2157211_1920.jpg"&gt;Top 10 IoT sensors in 2019&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why specific? Because of a wide range of signals they potentially can generate. Even such a complex system as human body perfectly fitted by evolution has different organs for processing various signals from the ambient environment. We are talking about sensors, the sensors used in internet of things, of course.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where and what
&lt;/h2&gt;

&lt;p&gt;Two basic types of interaction are inherent in all available sensors: measurement and control. In addition, these types distinguish the direction of data flows moving either from or to the end points. It corresponds well to how living organisms work: every action creates a reaction. The behavior of machines mimicking living beings looks similar when the IoT modus operandi takes place. However, the proportion between income and outcome data flows may significantly vary. And what determines the prevailing type of sensors in each case is a domain where one or another IoT system works. The following domains are used to be considered the most appropriate for IoT applications:&lt;/p&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Autonomous vehicles&lt;br&gt;
Smart homes&lt;br&gt;
Wearables&lt;br&gt;
Robotization of industrial manufacturing&lt;br&gt;
Smart medical equipment&lt;br&gt;
Remote tracking and monitoring&lt;br&gt;
Optimization of energy generation and distribution&lt;br&gt;
Alarming and security systems&lt;br&gt;
Industrial prediction maintenance&lt;br&gt;
Human-free defense systems and weapons&lt;br&gt;
Retail and payments&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Turning signals into Big Data&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;Mother Nature supplied humans with unique patterns on their fingers. However, we have no organ capable of detecting our fingerprints. This is so, probably, because humans have some different advanced capabilities of recognizing each other. Until quite recently, Touch ID sensors in our phones were one of the most reliable methods of user identification. This is an exemplary case of how the sensor industry transforms something naturally available into collectible data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NTW9bv28--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/r6497dgentryb5ikiuro.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NTW9bv28--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/r6497dgentryb5ikiuro.jpg" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The IoT sensors list is continuously expanding since sensor manufacturers keep figuring out more and more signals that can be detected and utilized through various IoT solutions. New types of the internet of things sensors start combining the entire clusters of signals due to growing computation power of the IoT processors. The advanced security &amp;amp; monitoring systems, for example, are not limited with just optical sensors - motion, temperature, infrared radiation, sound, and weight constitute the properties that can be detected, measured, and identified by the complex IoT solutions through appropriate sensors. To name a few, the following sensors are popular among many IoT solution providers:&lt;/p&gt;


&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Proximity sensors&lt;br&gt;
Infrared sensors&lt;br&gt;
Humidity sensors&lt;br&gt;
Gas sensors&lt;br&gt;
Weight sensors&lt;br&gt;
Vibration sensors&lt;br&gt;
Temperature sensors&lt;br&gt;
Level sensors&lt;br&gt;
Pressure sensors&lt;br&gt;
Motion sensors&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Proximity sensors&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;The exact distance between objects is what proximity sensors can detect. The scope of applications of such sensors is really huge due to very property of space where we live - it is three dimensional. The methods of determining proximity depend on numerous factors importation in every given case. That’s why proximity sensor manufacturers can choose between different basic technologies providing such types of sensors as capacitive, inductive, ultrasound, and photoelectric. Everyone is probably familiar with how the proximity sensors work when it is necessary to fit your car into a free parking spot in a city center where cars are usually parked bumper to bumper. An auto-parking feature inherent in some non-budget cars is a good example of the IoT application of the proximity sensors.&lt;/p&gt;

&lt;h2&gt;
  
  
  Infrared sensors
&lt;/h2&gt;

&lt;p&gt;Infrared sensors can work in both directions: detecting an external infrared radiation and emitting infrared radiation outside. Such sensors can detect surrounding objects through catching the heat the latter emit. Human body emits heat undetectable by our eyes. That’s why infrared sensors provide us with a unique ability to see through walls, for example. Many Hollywood sci-fi blockbusters (Terminator, Predator) used infrared vision effects to add impressive superhuman capabilities to their characters. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Zj0Vrk80--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/Top-10-IoT-sensors-in-2019/the-thermal-imaging-camera-3756103_1920.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Zj0Vrk80--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/Top-10-IoT-sensors-in-2019/the-thermal-imaging-camera-3756103_1920.jpg" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In a real life, the IoT infrared sensors are widely used in wearables (smart watches) to measure pulse and blood pressure. Many IoT solutions in healthcare are based on the infrared sensors when a blood leakage should be detected or body temperature is to be measured remotely, for example. The industrial IoT application of infrared sensors implies remotely operated overheat alarming along with non-contact temperature measurement. Asahi Kasei Microdevices, Murata, and Intersil are infrared sensors’ brands, to name a few.&lt;/p&gt;

&lt;h2&gt;
  
  
  Humidity and Gas sensors
&lt;/h2&gt;

&lt;p&gt;These two types of sensors can be grouped for a reason. Both can detect leakages of either water or gases. Both are used to be applied to various air quality control systems that become more and more popular with regard to emerging urbanization. The recent hype around the Climate Change generates a growing demand in smart IoT solutions capable of monitoring living conditions both indoor and outdoor. Besides, one of the implicit impetuses for an extensive use of such gas sensors as, for example, CO2 detectors is the contemporary “staff efficiency rush” inherent in a corporate business sector where workability of personnel is directly correlated with the air quality in working premises. The IoT-based smart ventilation capable of regulating CO2 content automatically is becoming a must-have feature for such public spaces as libraries, gyms, shopping malls, hospitals, and corporate offices. Needless to say that humidity and gas sensors are indispensable  for the air quality control and monitoring systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Weight sensors
&lt;/h2&gt;

&lt;p&gt;We live on a planet having quite significant gravity that imposes certain limitations on mass of physical objects. That’s why no onshore living creature can be more massive that elephants nowadays. Weight measurement is important in a construction sector. Recollect that awkward moment when you have to leave an overcrowded elevator somewhere in a business center due to overweight detector which starts flashing if you are in. Namely weight sensors allow a secure exploitation of elevators. The IoT-based automation in every sector where bulk loading takes place can hardly cope without IoT weight sensors: overweight is dangerous for both dump trucks in open-pit mines and glass ampules at pharmaceutical enterprises. As regards our health, weight sensors are the integral parts of our bathroom scales that suggest us oftentimes to consider a less burger-intensive diet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GzXRHKFp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/Top-10-IoT-sensors-in-2019/i-yunmai-617618-unsplash.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GzXRHKFp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/Top-10-IoT-sensors-in-2019/i-yunmai-617618-unsplash.jpg" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Vibration sensors
&lt;/h2&gt;

&lt;p&gt;Vibration sensors help figuring out a secure level of resonance in the industrial equipment whatever type of motion takes place. It so happened that rotation became the main type of motion for any industry after the invention of a wheel about 2000 BC. Even a very precise rotating mechanisms generate a more or less intensive vibration. Predictive maintenance along with self-analyzing capabilities of robotic production lines constitute a wide field for the IoT technology providers. Continuous vibration monitoring tells a lot about the current state of equipment. The one who controls vibration controls both the cost-effective uninterrupted operation of equipment and its overall lifespan. Hence, IoT vibration sensors as an integral part of the industrial vibration diagnostic systems bring a hidden but significant profit through mitigating risks of accidents and unplanned downtimes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Temperature sensors
&lt;/h2&gt;

&lt;p&gt;Every automatic fire-fighting system includes temperature sensors. Smart IoT solutions for public premises (smart offices, smart stores, smart gyms, smart whatever else) cannot do without temperature monitoring. While a primitive but reliable bimetallic temperature sensor can signal about only a significant temperature increase in case of fire, a precise measurement of temperature for automatic air quality control requires more sophisticated digital IoT temperature sensors. Temperature sensors are fundamental for modern heating and conditioning systems both in premises and transport vehicles. What is a fancy smart thermostat in its essence? Nothing but a set of temperature sensors and data transmitters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Level sensors
&lt;/h2&gt;

&lt;p&gt;Yet another reason to remember about the global climate change is more frequent flooding happening throughout the world. Arctic ice is melting, sea level is rising. Water level detection is becoming crucial for coastal areas. Early detection and forecasting of flood is the domain where IoT solutions helps a lot. Level sensors constitute the primary end points from which water level data starts running to analytic software.&lt;/p&gt;

&lt;p&gt;In general, level sensors are widely used in numerous fields where people deal with liquid substances. A fuel gauge in your car uses a similar level sensor as a huge gas tank at a fueling station contains. Automatic distribution of any liquid is often based on signals of two sensors: an upper level sensor and a bottom level one. Both capacitive and optical working principles are usually used in level sensors. We face effects of a level sensor several times a day visiting our toilets: a toilet tank stops getting water when its floating level sensor blocks water supply. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5Qchnmx7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/Top-10-IoT-sensors-in-2019/refuel-2157211_1920.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5Qchnmx7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/Top-10-IoT-sensors-in-2019/refuel-2157211_1920.jpg" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pressure sensors
&lt;/h2&gt;

&lt;p&gt;Those who travel a lot by air knows well that unpleasant feeling when your ears seem full of cotton. A slight decompression in a cabin creates such a feeling. It means that the air pressure in an aircraft differs from our natural pressure level on the ground. Perhaps pressure sensors work a little bit incorrectly in this case.&lt;/p&gt;

&lt;p&gt;Since pressure as a physical property belongs to both gases and liquids, a list of domains where pressure sensors are used can be really impressive. Both household and industrial applications are present there. Automatic pressure control relates to a secure operation of such heating equipment as, for example, boilers, water heaters, and radiators. Blood pressure sensors are integrated in numerous smart devices for medical diagnosis. The tyre pressure indication is a fancy IoT feature inherent in modern smart cars. Even a daily weather forecast is incomplete without barometric pressure. And in each given case IoT pressure sensors are engaged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Motion sensors
&lt;/h2&gt;

&lt;p&gt;As we mentioned in the beginning of this post, some types of sensors have quite a long history. Motion sensors have evolved from Chinese tubular bells to sophisticated digital devices operating on ultrasonic, microwave, photovoltaic, and infrared working principles. Security alarm systems having motion detection are widely used in museums, warehouses, dangerous areas, and in many other places where unauthorized entry is prohibited. IoT manufacturers equip both industrial and household lighting systems with IoT motion sensors to provide an automatic non-contact switching on/off the light. In addition to a positive user experience, a significant energy reduction can be achieved due to the smart lighting based on motion sensors.&lt;/p&gt;

&lt;p&gt;Another promising domain where motion detection is gaining momentum is touchless gesture control of modern gadgets. Fitness trackers are capable of recognizing whether we stay, walk, or run. After getting rid of a 3.5 jack from iPhone 7, both Apple and the other smartphone manufacturers started eliminating physical control buttons one by one from their devices. The day will soon come when mobile gadgets become total screens operated by our facial expressions. Motion sensors will rule then.&lt;/p&gt;

&lt;p&gt;Irrespective of types of IoT sensors, any end point is where the IoT begins. Sensors generate primary signals that reflect one or another property of objects where sensors are installed. No sensors - no data. The wider variety of sensors appears, the more flexible IoT development is provided. We greatly appreciate our natural sensors - eyes, ears, fingers etc being afraid of losing any of our sensory capabilities. The industrial IoT sensors described above constitute just a tiny part of all available data-generating devices. Nevertheless, a deep expertise even in a given brief list of sensors enables any IoT solution provider to create powerful IIoT systems for a broad range of applications.&lt;br&gt;&lt;br&gt;
Tags: IoT, Sensors, IIoT, Internet of Things&lt;/p&gt;


</description>
      <category>iot</category>
      <category>internetofthings</category>
    </item>
    <item>
      <title>Why do you need to use Microsoft Azure IoT Suite?</title>
      <dc:creator>Indeema Software</dc:creator>
      <pubDate>Wed, 13 Feb 2019 09:02:51 +0000</pubDate>
      <link>https://dev.to/indeemasoftware/why-do-you-need-to-use-microsoft-azure-iot-suite-35al</link>
      <guid>https://dev.to/indeemasoftware/why-do-you-need-to-use-microsoft-azure-iot-suite-35al</guid>
      <description>

&lt;p&gt;Smart is a household word for Internet of Things and it implies the interconnectivity between various devices and users. This leads us to infrastructure of any IoT solution — hardware, firmware, and software parts. While hardware and its associated firmware is vastly diverse, there are a few powerful IoT service providers such as Microsoft, Amazon, and IBM.&lt;/p&gt;

&lt;p&gt;Original article -  &lt;a href="https://indeema.com/blog/microsoft-azure-iot-suite--benefits-and-features"&gt;Microsoft Azure IoT Suite: Benefits and Features&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Indeed, there is also quite a number of small and middle-sized custom solutions for IoT, but the majority still uses one of the above platforms as their IoT development basis. And that’s logical — why reinvent the wheel if these IoT-as-a-Service solutions are reliable and backed by digital giants.&lt;/p&gt;

&lt;p&gt;The question is how to choose between major service providers to satisfy the demands of a particular project best. That is, frankly, determining if the service has the features and capabilities needed. This time, let’s take a close look at Microsoft Azure IoT Suite.&lt;/p&gt;

&lt;h2&gt;
  
  
  MS Azure IoT at a Glance
&lt;/h2&gt;

&lt;p&gt;Microsoft is rightfully considered as one of the major IoT service market players. It’s Azure IoT Suite helps to develop various custom IoT products and easily evaluate their final cost. The deployment of any architecture is also fast and simple.&lt;/p&gt;

&lt;p&gt;Microsoft Azure IoT services include:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Pl1GpYGM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1550047396432/dg7C4SfJR.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Pl1GpYGM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1550047396432/dg7C4SfJR.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can integrate these services to most operating systems and devices; collect and analyze torrents of data and then use it for real-time predictive analytics. Sounds impressive, doesn’t it?&lt;/p&gt;

&lt;p&gt;To see for ourselves if that’s really the case, let’s examine the services one by one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oTbdPtK0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/microsoft-azure-iot-suite-fenefits-and-features/azure-iot-suite-infographic.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oTbdPtK0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/microsoft-azure-iot-suite-fenefits-and-features/azure-iot-suite-infographic.png" alt="azure-iot-suite-infographic.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  IoT Hub
&lt;/h2&gt;

&lt;p&gt;Any IoT solution has central communication node. With Microsoft Azure IoT platform, that’s IoT Hub. It provides two-way device-to-device communication— telemetry between all available devices and Azure platform. Using advanced hub capabilities, you can create complex IoT solutions at scale. For example, complex software for managing industrial machinery, monitoring premises in offices, and maintaining smart homes.&lt;/p&gt;

&lt;p&gt;You can monitor your connected network, track various events, and receive alarms in case of any issues. To securely transfer data, Azure IoT Hub uses SAS token-based authentication of two basic standards-based types:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;For secure authentication —Individual X.509 certificate&lt;/li&gt;
&lt;li&gt;For simple enrollment — X.509 CA authentication&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Besides, inbuilt routing functions of Azure IoT provide flexible messaging adjustment.&lt;/p&gt;

&lt;p&gt;## Using Azure IoT device SDK&lt;/p&gt;

&lt;p&gt;The SDK supports:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Linux, Windows, and real-time operating systems&lt;/li&gt;
&lt;li&gt;C, C#, Java, Python, Node.js&lt;/li&gt;
&lt;li&gt;HTTPS, AMQP, AMQP over WebSockets, MQTT, MQTT over WebSockets protocols&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For devices that don’t support these protocols, you can configure the hub to work with custom protocols using Edge and Azure IoT protocol gateway.&lt;/p&gt;

&lt;h2&gt;
  
  
  Combining IoT Hub with Other MS Azure Services
&lt;/h2&gt;

&lt;p&gt;You can use IoT Hub as a basis for various project architectures and:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get fast responses on critical events using Azure Event Grid&lt;/li&gt;
&lt;li&gt;Automate business processes with Azure Logic Apps&lt;/li&gt;
&lt;li&gt;Add ML and AI models using Azure Machine Learning&lt;/li&gt;
&lt;li&gt;Stream transferring data from connected devices and compute logical analysis in real time using Azure Stream Analytics&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cVEtpVvf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/microsoft-azure-iot-suite-fenefits-and-features/azure-iot-hub-explanation.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cVEtpVvf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/microsoft-azure-iot-suite-fenefits-and-features/azure-iot-hub-explanation.png" alt="azure-iot-hub-explanation.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Read also - &lt;a href="https://indeema.com/blog/the-non-primitive-approach-of-amazon--how-aws-iot-meets-iot-challenges"&gt;The non-primitive approach of Amazon: How AWS IoT meets IoT challenges&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  IoT Edge
&lt;/h2&gt;

&lt;p&gt;Use cloud-based AI service from Azure to fully manage your cross-platform projects. The main point is that devices are always on regardless if cloud is enabled or not. Azure IoT device management automatically synchronizes with latest state of devices when they are connected to the cloud thus providing seamless functioning of any related solution.&lt;/p&gt;

&lt;p&gt;The MS Azure IoT Edge consists of:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;IoT Edge Modules — Containers that run Azure and 3rd-party services, custom code. Deploying those on the connected devices allows to run them locally.

IoT Edge Runtime — Controls the deployed modules at every device.

Cloud-based interface —UI for remote monitoring and management of devices.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Indeed, when monitoring and data collection run locally, handling analytics partially on the edge is really useful. This feature allows reacting on incoming data as well as making relevant decisions faster even with cloud disabled. Besides, the data transfers cost can be significantly reduced since data filtering occurs locally.&lt;/p&gt;

&lt;p&gt;## IoT Central&lt;/p&gt;

&lt;p&gt;Azure IoT Central Software-as-a-Service helps to build and manage any kind of IoT-based projects. At its core, any Azure IoT solution consist of:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A program that receives telemetry from and operates the devices.

A certain number of devices connected to the program on which a particular code runs.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Azure IoT Central helps create a new application (program) quickly. You can easily customize application to your requirements directly in browser.&lt;/p&gt;

&lt;p&gt;## MS IoT Central Roles&lt;/p&gt;

&lt;p&gt;This service shares the operational authorizations between the following user roles:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U8sfLO1K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1550047560777/_B-pYRlAS.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U8sfLO1K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1550047560777/_B-pYRlAS.png" alt="image2.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using this hierarchy, a lot of mundane tasks can be simplified. For example, as a Builder, you can create templates for connecting devices to your program and reuse it for adding new similar devices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Azure IoT Solution Accelerators
&lt;/h2&gt;

&lt;p&gt;These accelerators imply a set of ready-to-deploy solutions for general scenarios such as remote monitoring, connection arrangements, and maintenance of devices. The deployment of solution accelerators encompasses all necessary services of a cloud infrastructure along with any related program code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Remote Monitoring Accelerator
&lt;/h2&gt;

&lt;p&gt;Useful for collecting telemetry from, and setting up management of, remote devices such as smart home climate control sensors and industrial sensors at assembly lines.&lt;/p&gt;

&lt;p&gt;Using dashboard, you can track measurements from connected devices, set up new edge points, and update devices firmware.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connected Factory Accelerator
&lt;/h2&gt;

&lt;p&gt;Collecting and managing remote readings from industrial assets with OPC Unified Architecture interface via informative dashboard. The assets can include assembly stations and test areas on a factory production line.&lt;/p&gt;

&lt;h2&gt;
  
  
  Predictive Maintenance Accelerator
&lt;/h2&gt;

&lt;p&gt;Forecasting and preventing failures of remote devices using machine learning algorithms. You can apply this accelerator on solutions to operate various important moving mechanisms such as aircraft engines.&lt;/p&gt;

&lt;p&gt;The Predictive Maintenance dashboard displays analytics based on the information received from the predicting system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Device Simulation Accelerator
&lt;/h2&gt;

&lt;p&gt;Simulators. This accelerator is great at imitating the devices by creating realistic telemetry. It’s a great service to mitigate real-life risks in real life by checking and adjusting the behavior of other accelerators along with custom IoT solutions.&lt;/p&gt;

&lt;p&gt;You can use a web application for modeling various systems.&lt;/p&gt;

&lt;p&gt;The most awesome thing is that the source code of all solution accelerators is open and available on GitHub. You can download, set up and integrate them to your project’s requirements.&lt;/p&gt;

&lt;p&gt;Read Also -  &lt;a href="https://indeema.com/blog/how-much-does-it-cost-to-create-iot-solution"&gt;How Much Does It Cost To Create IoT Solution?&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Azure IoT Hub Device Provisioning
&lt;/h2&gt;

&lt;p&gt;This supporting service provides remote access to the necessary IoT Hub without user interaction. Using this complementary service, you can securely connect and set up the devices in IoT Hub at scale.&lt;/p&gt;

&lt;p&gt;As with all other Microsoft Azure IoT platform services, the Device Provisioning supports:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Various operating systems and platforms

HTTPS, AMQP, AMQP via WebSockets, MQTT, MQTT via WebSockets protocols for device connection

HTTPS connections for service operations
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;There are multiple scenarios available such as:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--r12Nhh_2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1550047630193/6Tv3O-cSl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r12Nhh_2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1550047630193/6Tv3O-cSl.png" alt="image3.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Below you can find a scheme of how Azure IoT Hub Device Provisioning can work:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tUc2rpGa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/microsoft-azure-iot-suite-fenefits-and-features/How-Azure-IoT-Hub-Device-Provisioning-can-work.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tUc2rpGa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://indeema.com/images/articles/microsoft-azure-iot-suite-fenefits-and-features/How-Azure-IoT-Hub-Device-Provisioning-can-work.png" alt="How-Azure-IoT-Hub-Device-Provisioning-can-work.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Explore step-by-step scheme of Azure IoT Hub Device Provisioning &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the Azure portal, the manufacturer adds the device to the enrollment list for &lt;/li&gt;
&lt;li&gt;The factory’s provisioning set receives and passes the necessary identification info about device to the service.&lt;/li&gt;
&lt;li&gt;The device’s identity is validated using registration ID and key against the enrollment list with either standard X.509 verification or nonce challenge (Trusted Platform Module).&lt;/li&gt;
&lt;li&gt;The service registers the device to the hub and fills in its desired twin state.&lt;/li&gt;
&lt;li&gt;Provisioning service receives the device ID from and sends connection information to the hub.&lt;/li&gt;
&lt;li&gt;Not the device can send data to the associated hub.&lt;/li&gt;
&lt;li&gt;Upon connection, the device receives the desired state from its twin.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you want to Connecting Raspberry PI via MS Azure IoT then read our step-by-step guide - &lt;a href="https://indeema.com/blog/connecting-raspberry-pi-via-azure-iot--step-by-step-tutorial"&gt;Connecting Raspberry PI via Azure IoT: Step-By-Step Tutorial&lt;/a&gt;&lt;/p&gt;


</description>
      <category>iot</category>
      <category>microsoftazure</category>
      <category>iotsuite</category>
      <category>azureiot</category>
    </item>
  </channel>
</rss>
