{"id":37423,"date":"2019-10-31T22:17:33","date_gmt":"2019-10-31T19:17:33","guid":{"rendered":"https:\/\/prohoster.info\/blog\/shiotiny-ventilyatsiya-vlazhnogo-pomeshheniya-proekt-primer\/"},"modified":"2019-10-31T22:17:33","modified_gmt":"2019-10-31T19:17:33","slug":"shiotiny-ventilyatsiya-vlazhnogo-pomeshheniya-proekt-primer","status":"publish","type":"post","link":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/shiotiny-ventilyatsiya-vlazhnogo-pomeshheniya-proekt-primer","title":{"rendered":"ShIoTiny: ventilation of a humid room (example project)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"ShIoTiny: ventilation of a humid room (example project)\" src=\"\/wp-content\/uploads\/2019\/08\/a6e9c8239a90c713bd1b3b21891cbc13.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>Main theses or what this article is about<\/h4>\n<p>\nWe continue the series of articles on <b>ShIoTiny<\/b> \u2014 a visually programmable controller based on a chip <b>ESP8266<\/b>.<\/p>\n<p>This article explains, using the example of a project for controlling ventilation in a bathroom or another room with high humidity, how to build a program for <b>ShIoTiny<\/b>.<\/p>\n<h4>The previous articles in the series.<\/h4>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/463107\/\">ShIoTiny: small automation, Internet of Things, or 'half a year before vacation'<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/463285\/\">ShIoTiny: nodes, connections, and events or features of program visualization<\/a><\/noindex><\/p>\n<h4>Links<\/h4>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shiotiny\/ShIoTinyBin\">Binary firmware, controller schematic, and documentation<\/a><\/noindex> <br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/shiotiny\/ShIoTinyBin\/blob\/master\/doc\/ShIoT-esp8266-01_obzor.pdf\">Instructions and description of the nodes<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"http:\/\/esppower.ru\/mqtt-android\/\">Setting up the MQTT broker cloudmqtt.com<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/393277\/\">MQTT dashboard for Android<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h4>Introduction<\/h4>\n<p>\nUnderstanding comes from experience. This is a truth proven by time and generations. Thus, there is nothing better for learning practical skills than trying to do something on your own. Examples that illustrate what can be done and what should be avoided will come in handy here. Others' mistakes may not prevent your own failures, but they can help reduce their number.<\/p>\n<p>Questions and letters from readers of previous articles prompted me to create a small example project for controlling ventilation to demonstrate how ShIoTiny nodes work.<\/p>\n<p>The original idea upon which the controller was based <b>ShIoTiny<\/b> \u2014 a pump-irrigation station \u2014 won't suit everyone and may not be of interest. Therefore, I chose a universally understood and useful ventilation control system as an example.<\/p>\n<p>I should mention that the project idea is not mine; I <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/masterkit\/blog\/385281\/\">derived it from here<\/a><\/noindex> and then adapted it to <b>ShIoTiny<\/b>.<\/p>\n<h4>First, understand what you want<\/h4>\n<p>\nThe process of improvement is infinite. This characteristic has led to the downfall of many good ideas and projects. Instead of releasing something that, while not perfect, is functional, developers often continue perfecting it. They refine it until their competitors surpass them by launching something that, albeit imperfect (and often downright shabby), works.<\/p>\n<p>Therefore, it is crucial to know where to draw the line in a project. In other words, we need to determine what we want to achieve at the end of the project based on what we have at the beginning. In Russian, there is a wonderful concise term 'plan' for a document created specifically to describe the process of creating something, which lazy translators and deficient managers have recently bizarrely started calling a 'roadmap.' But let that be.<\/p>\n<p>Our plan will be as follows. Let's assume there is a room where the humidity can sometimes rise significantly, such as a bathroom or kitchen. Humidity is unpleasant, and the time-honored way to combat it is to ventilate the space. There are many methods of ventilation. However, we'll skip over exotic and outdated methods such as fans operated by people and focus on a regular fan. Fans are cheaper and easier to find in our area.<\/p>\n<p>In short, we want to control the fan: turn it on and, accordingly, turn it off. More precisely, we want it to turn on and off automatically as needed.<\/p>\n<p>Now we need to determine the conditions under which the fan should turn on and the conditions under which it should turn off.<\/p>\n<p>This is quite obvious: if the humidity exceeds a certain threshold, the fan turns on and exhausts the air; if the humidity normalizes, the fan turns off.<\/p>\n<p>An observant reader will immediately latch onto the word \"threshold.\" Set by whom? How is it set?<\/p>\n<p>The threshold humidity can be set in several ways. We will consider two of them: the first \u2014 using a variable resistor, and the second \u2014 via the network using the MQTT protocol. Each of these methods has its advantages and disadvantages, which will be discussed later.<\/p>\n<p>For those who didn't understand, let me clarify that \"threshold humidity\" is the level of humidity at which the fan must be turned on.<\/p>\n<p>The next question is whether to give the user the right to turn on the fan directly. That is, regardless of the humidity level, at the push of a button? We will provide such an option. After all, the fan may be needed not only when the humidity is high but also to eliminate, for example, unpleasant odors, commonly referred to as \"stench.\"<\/p>\n<p>So, we understand what we want and even a bit about how it will work. Let's briefly list all the functions of our ventilation control system:<\/p>\n<ul>\n<li> setting the threshold humidity level (two options);<\/li>\n<li> measuring the humidity level;<\/li>\n<li> automatic fan activation;<\/li>\n<li> automatic fan deactivation;<\/li>\n<li> manual fan activation (at the push of a button).<\/li>\n<\/ul>\n<p>\nSo, the plan is clear. We need to implement all the functions listed above in our program. We will act based on this 'plan.' First, let\u2019s draw the structural diagram of the device.<\/p>\n<h4>Structural diagram of the device<\/h4>\n<p>\nIn general, we will have two such diagrams. The first one is for the case where the threshold humidity level is set by a variable resistor. The second diagram is for the case where the threshold humidity level is set over the network using the MQTT protocol.<\/p>\n<p>However, since these diagrams will differ by only one element\u2014the variable resistor for setting the threshold humidity level\u2014we will draw only one structural diagram. Of course, the structural diagram according to GOST looks different. But we are not targeting experienced engineers; we are focusing on the younger generation. Therefore, clarity is more important.<\/p>\n<p><img decoding=\"async\" alt=\"ShIoTiny: ventilation of a humid room (example project)\" src=\"\/wp-content\/uploads\/2019\/08\/519f40496a8e459c22d69e7f0eaeee1d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSo, what do we see in the picture? A fan connected to a relay <b>Relay1<\/b> of the controller. I would like to point out that the fan is a device operating under high voltage. So, if someone is going to build this themselves\u2014exercise caution. That is, at a minimum, before inserting your fingers or measuring devices into the circuit\u2014cut off the power to the fan. And a second note. If your fan is more powerful than <b>ShIoTiny<\/b>250W <b>, then it should not be connected directly to<\/b>\u2014 only through a starter. <b>ShIoTiny<\/b> We are clear on the fan. Now the button for 'manual fan activation.' It is connected to the input<\/p>\n<p>Input1 <b>. There's really nothing more to explain here.<\/b>Temperature and humidity sensor<\/p>\n<p>DHT-11 <b>DHT-22<\/b> (or <b>or their equivalents). A special input on the controller is provided for its connection. As can be seen in the picture, connecting such a sensor is not a problem.<\/b> And finally, the variable resistor setting the threshold humidity level. More precisely, it is a divider consisting of a variable resistor and a constant resistor. There are no issues with its connection, but I would like to clarify that the built-in ADC on <b>ShIoTiny<\/b>is designed for a maximum of 1 Volt. Hence, a voltage divider of about 5 times is needed.<\/p>\n<p>And I remind you once again that this divider is not necessary if the threshold humidity level is set over the network using the MQTT protocol. <b>ESP8266<\/b> is rated for a maximum of 1 Volt. Hence, a voltage divider of about 5 times is required.<\/p>\n<p>And once again, I remind you that this divider is unnecessary if the threshold humidity level is set via the network using the MQTT protocol.<\/p>\n<p>Let's start by creating the device operation algorithm in the ElDraw ShIoTiny editor. You can read how to access this editor in previous articles or in the guide, the link to which is at the beginning of this article.<\/p>\n<h4>First option, the simplest<\/h4>\n<p>\nLet's start with the basics: turning on the relay <b>Relay1<\/b> when the threshold humidity level is exceeded for a specified time.<\/p>\n<p><img decoding=\"async\" alt=\"ShIoTiny: ventilation of a humid room (example project)\" src=\"\/wp-content\/uploads\/2019\/08\/e9f8d30627cf7cdbebccf863c2b2f808.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAs we can see, nothing complicated: just four nodes, not counting the comment nodes. <b>DHT11<\/b> \u2014 this is the temperature and humidity sensor itself (you can change it to <b>DHT22<\/b>).<\/p>\n<p>Constant <b>CONST<\/b> \u2014 the threshold humidity level, in percent.<\/p>\n<p>The comparator is a node that compares two numbers and outputs 1 if the specified condition is met and 0 if it is not.<\/p>\n<p>In our case, this condition will be <b>A&gt;B<\/b>, where <b>A<\/b> \u2014 the humidity level measured by the sensor, and <b>B<\/b> \u2014 the threshold humidity level.<\/p>\n<p>As soon as the measured humidity level (<b>A<\/b>) exceeds the threshold humidity level (<b>B<\/b>), the comparator will output 1 and the relay will turn on. Conversely, as soon as the humidity level normalizes (i.e., <b>A&gt;B<\/b> A&lt;=B <b>), it will output 0 and the relay will turn off.<\/b>), the comparator will output 1 and the relay will turn on. Conversely, as soon as the humidity level normalizes (i.e., <b>A&gt;B<\/b> Is everything clear? If not, please read it again or check the description of how the nodes work in the guide.<\/p>\n<p>I should note that the data from the sensor<\/p>\n<p>updates approximately once every 10 seconds. Therefore, the relay cannot turn on and off more frequently than once every 10 seconds. <b>DHT11<\/b> Everything would be fine, but we would like to set the threshold humidity level using a variable resistor. It's quite simple!<\/p>\n<p>We will just replace the constant node with an ADC node. After all, it's to the ADC that we connected the voltage divider with the variable resistor.<\/p>\n<p><img decoding=\"async\" alt=\"ShIoTiny: ventilation of a humid room (example project)\" src=\"\/wp-content\/uploads\/2019\/08\/3042bda4fe16e3fbad2d3f46f0beccb4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nThe voltage at the ADC input varies from 0 to 1 Volt. Meanwhile, the humidity at the sensor output ranges from 0 to 100%. How do we compare them? It's easy. The ADC node in<\/p>\n<p>not only measures the voltage at the input but can also <b>ShIoTiny<\/b> scale and shift <i><b>the values.<\/b><\/i>.<\/p>\n<p>That is, at the output of the ADC1 node (ADC), the value will be <b>X<\/b>calculated according to the formula <\/p>\n<p><img decoding=\"async\" alt=\"ShIoTiny: ventilation of a humid room (example project)\" src=\"\/wp-content\/uploads\/2019\/08\/d01bc0ff4e6962252fced695d3894d32.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>, where <img decoding=\"async\" alt=\"ShIoTiny: ventilation of a humid room (example project)\" src=\"\/wp-content\/uploads\/2019\/08\/ac0bf727edb4c759d12268376ec6ad9b.jpeg\" style=\"display:block;margin: 0 auto;\" \/> \u2014 the voltage at the ADC input (from 0 to 1V); <b>k<\/b> \u2014 the range (ADC range), and <b>b<\/b>\u2014 the offset (ADC offset). Therefore, if we set <b>k=100<\/b> and <b>b=0<\/b>, then as <img decoding=\"async\" alt=\"ShIoTiny: ventilation of a humid room (example project)\" src=\"\/wp-content\/uploads\/2019\/08\/0afbeb2e49d5a107bc54d6bbd87ba23c.jpeg\" style=\"display:block;margin: 0 auto;\" \/> varies from 0 to 1, the output value <b>X<\/b> of the ADC node will change in the range from 0 to 100. That is, it will be numerically equal to the variation range of humidity from 0 to 100%.<\/p>\n<p>Alternatively, by simply turning the variable resistor motor, you can set the threshold humidity level from 0 to 100. The only inconvenience is that there are no display devices. However, in practice, if you make 6 divisions on the variable resistor at 0%, 20%, 40%, 60%, 80%, and 100%, this is sufficient to set the threshold humidity level.<\/p>\n<p>How do we set the coefficients? <b>k<\/b> \u2014 the range (ADC range), and <b>b<\/b>- Offset (ADC offset)? It's as easy as pie! Just click with your mouse pointer on the node <b>ADC1<\/b> and a settings window will appear immediately. In this window, you can set everything you need. For our case, it will look like the one shown in the picture.<\/p>\n<p><img decoding=\"async\" alt=\"ShIoTiny: ventilation of a humid room (example project)\" src=\"\/wp-content\/uploads\/2019\/08\/ff81992b4fe236f5de6d17ca6bf8187c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSo, we have a basic working solution. Let's start improving it.<br \/>\nBy the way, the simplest solution has one advantage \u2014 it doesn't need the internet. It is completely autonomous.<\/p>\n<h4>The second option is to connect a button.<\/h4>\n<p>\nEverything works and everyone is happy. But there is a problem, we cannot turn on the ventilation manually. We have already agreed that <b>. There's really nothing more to explain here.<\/b> there will be a button connected to the input that will turn the fan on and off regardless of the humidity sensor.<br \/>\nIt's time to process this button in our scheme-program.<\/p>\n<p><img decoding=\"async\" alt=\"ShIoTiny: ventilation of a humid room (example project)\" src=\"\/wp-content\/uploads\/2019\/08\/673c274a5be680ce7c3ef1f9572f93fa.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nThe block processing the button press is highlighted with an orange line. It consists of a button press counter that resets to zero when its output value exceeds one (green line, output of the node <b>CT<\/b>).<\/p>\n<p>Everything operates as simply as before: the counter <b>CT<\/b> counts the button presses connected to the input. <b>. There's really nothing more to explain here.<\/b>That is, the value at the output of this counter increases by 1 with each press of the button.<\/p>\n<p>As soon as this value reaches two (that is, greater than 1), a 1 will appear at the comparator's output <b>A&gt;B<\/b> and this 1 will reset the counter <b>CT<\/b> to zero. I mean the lower comparator in the scheme!<\/p>\n<p>Thus, our button has two states \u2014 0 and 1. If we needed more states (3 or 4 or even more), we would just change the constant <b>CONST<\/b> from one to another value.<\/p>\n<p>So, we have two conditions for turning on the fan: exceeding the set humidity level and a single press of the button. The fan will turn on if either condition is met. It will operate until the button is pressed again <b>I can use<\/b> or the humidity level returns to normal.<\/p>\n<p>Of course, we could complicate the algorithm even more, but we won't do that\u2014let's leave room for creativity for those who wish.<\/p>\n<h4>Third option, we connect to the internet.<\/h4>\n<p>\nEverything we've described is quite functional. But what about style? Any pimple-faced hipster-hacker-cracker will laugh at someone who turns a knob and presses a button instead of controlling it from a smartphone! Turning a knob is 'not trendy'. But sliding a finger across a smartphone screen, rubbing that finger raw\u2014that's the pinnacle of a hipster-hacker-cracker's desires (I could never distinguish all of them, so if I'm mistaken, I apologize).<\/p>\n<p>But let's be lenient towards these individuals. Internet-based control has its real advantages. First, there's visibility. There are plenty of applications across all platforms that allow a few taps to create a panel for our controller-Carlson that is quite usable. Second, it provides the ability to remotely monitor humidity levels in a room. And third, you can not only see if the fan is spinning but also what the set humidity threshold is. Additionally, you can tell whether the fan turned on automatically or manually. In general, it's everything you could wish for.<\/p>\n<p>Surely, it's a bit much for a fan to receive such attention. But it's just an example.<\/p>\n<p>So, to connect to the internet, we will use the technology <b>MQTT<\/b> and the corresponding protocol.<br \/>\nTo use this technology, we need a <b>MQTT broker<\/b>. This is a special server that services <b>MQTT clients<\/b>, for example, <b>ShIoTIny<\/b> and your smartphone.<\/p>\n<p>The essence of the technology <b>MQTT<\/b> is that any client publishes arbitrary data to the MQTT broker (server) under a specific name (called <b>topic<\/b> in the terminology <b>MQTT<\/b>). Other clients can subscribe to arbitrary data by name (<b>topic<\/b>) and receive newly published data. In other words, all data exchange happens on a client-broker-client basis.<\/p>\n<p>I <i><b>I won't<\/b><\/i> dwell on the details. There are plenty of articles and tutorials online about how <b>MQTT<\/b> works and what programs are available for creating control panels. I'll simply show how to receive and publish data using <b>ShIoTiny<\/b>.<\/p>\n<p>As a broker, I used <noindex><a rel=\"nofollow\" href=\"https:\/\/www.cloudmqtt.com\/\">www.cloudmqtt.com<\/a><\/noindex>, but the principle is the same everywhere.<\/p>\n<p>So, let's assume you've registered on the <b>MQTT broker.<\/b>In general, the broker will provide you with (or require you to create) a username and password (for authentication), as well as a connection port. Connect <b>ShIoTiny<\/b> to <b>to the MQTT broker<\/b> using two methods \u2014 regular connection and by <b>TLS<\/b> (<b>SSL<\/b>).<\/p>\n<p>All these parameters are entered on the <b>ShIoTiny<\/b> tab, section <b>Networking<\/b>MQTT Connection to server <b>If your<\/b>.<\/p>\n<p><img decoding=\"async\" alt=\"ShIoTiny: ventilation of a humid room (example project)\" src=\"\/wp-content\/uploads\/2019\/08\/3a16cbd07a64428568e7c03f178e87ef.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\ndoes not require authentication \u2014 leave the username and password fields empty. <b>MQTT broker<\/b> MQTT topic prefix<\/p>\n<p>Parameter <b>needs a separate explanation.<\/b> The MQTT parameters prefix is a string added to the topic name (<\/p>\n<p>) when publishing and subscribing to the MQTT broker. To set the<b>topic<\/b>MQTT prefix <b>for your controller, simply enter it in the field labeled \u201c<\/b> MQTT Topic Prefix<b>\u201d). The prefix always starts with a slash (<\/b>\u00bb (\u00ab<b>needs a separate explanation.<\/b>)! If you do not enter a slash in the input field, it will be added automatically. The prefix cannot contain the character<b>\u00ab\/\u00bb<\/b>. There are no other restrictions. <b>\u00ab#\u00bb<\/b> and <b>\u00ab+\u00bb<\/b>For example, if you are publishing the parameter \u201c<\/p>\n<p>\u201d (or subscribing to it), and your prefix is set to \u201c<b>status<\/b>\u201d, then on the broker this parameter will be published under the name \u201c<b>\/shiotiny\/<\/b>. If you have an empty prefix set, all parameters on the broker will start with a slash (<b>\/shiotiny\/status<\/b>will be published as \u201c<b>\u00ab\/\u00bb<\/b>): \u00ab<b>status<\/b>So, let's assume you registered on<b>\/status<\/b>\u00bb.<\/p>\n<p>and received a username, password, and port. Then you entered these parameters on the tab <b>MQTT broker.<\/b> Assuming the prefix is set to \u201c <b>Networking<\/b>MQTT Connection to server <b>If your<\/b> of the controller. I would like to point out that the fan is a device operating under high voltage. So, if someone is going to build this themselves\u2014exercise caution. That is, at a minimum, before inserting your fingers or measuring devices into the circuit\u2014cut off the power to the fan. And a second note. If your fan is more powerful than <b>ShIoTiny<\/b>.<\/p>\n<p>Let's start by publishing the state of all key parameters: relay<b>\/room\/<\/b>\u00bb.<\/p>\n<p>Relay1 <b>, manual on state, automatic on state, and finally the threshold and current humidity levels. And as a bonus \u2014 the temperature in the room. To see how this is done, refer to the illustration.<\/b>As we can see, the difference from the previous version is only the nodes \u201c<\/p>\n<p><img decoding=\"async\" alt=\"ShIoTiny: ventilation of a humid room (example project)\" src=\"\/wp-content\/uploads\/2019\/08\/ed016ae37bb0cb1197e2e4fd649a7c4f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMQTT Publish<b>\u201d. Taking into account the prefix, the following parameters will be published:<\/b>As we can see, the entire system state is at our fingertips!<br \/>\n<img decoding=\"async\" alt=\"ShIoTiny: ventilation of a humid room (example project)\" src=\"\/wp-content\/uploads\/2019\/08\/34b67dd1932f30de777a680802f71c59.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nBut we want to not only see but also control. What to do? Very simple. We will forgo setting the humidity threshold using<\/p>\n<p>ADC <b>and a variable resistor, and we will set this very threshold directly from our smartphone!<\/b> We remove the ADC node from the schematic and include three new nodes: <b>MQTT<\/b> FLASH store<\/p>\n<p><img decoding=\"async\" alt=\"ShIoTiny: ventilation of a humid room (example project)\" src=\"\/wp-content\/uploads\/2019\/08\/c32d9ec2c1a082e0a1ead0b04526eba5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nFLASH restore <b>MQTT describe<\/b>, <b>The node's function is<\/b> and <b>clear: it receives the parameter<\/b>.<\/p>\n<p>(humidity threshold level) from the <b>clear: it receives the parameter<\/b> MQTT broker. But what does it do with the data next? It simply passes them to the node <b>\/room\/trigHset<\/b> . <b>. But what does it do with the data next? It simply forwards it to the node<\/b>. <b>MQTT describe<\/b>, which, in turn, saves this data in non-volatile memory under the name <b>trigH<\/b>. After that, the node <b>The node's function is<\/b> reads data from non-volatile memory under the name <b>trigH<\/b> and what happens next we already know.<\/p>\n<p>Why such complications? Why not simply pass the received data to the comparator? <\/p>\n<p>As my friend S. Holmes used to say \u2014 <i>it's elementary<\/i>! No one guarantees that after turning on your device, it will connect to <b>to the MQTT broker<\/b>. And humidity needs to be measured. And the fan needs to be turned on. But without information about the humidity threshold level, this is impossible! Therefore, our device, upon startup, retrieves the previously saved humidity threshold level from non-volatile memory and uses it for decision-making. And when a connection is established with <b>the MQTT broker<\/b> and someone publishes a new value <b>\/room\/trigHset<\/b>, then this new value will be used.<\/p>\n<p>From there, you can come up with anything. For example, in addition to humidity, introduce temperature monitoring. Or add 'smart' lighting control (we still have two relays and two inputs left unused). Everything is in your hands!<\/p>\n<h4>Conclusion<\/h4>\n<p>\nThus, we have examined several examples of implementing a simpler controller based on ShIoTiny. Perhaps this will be useful to someone.<\/p>\n<p>As always, suggestions, wishes, questions, typos, and more \u2014 send to: <b>shiotiny@yandex.ru<\/b><br \/>\n<br \/>Source: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/464485\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0442\u0435\u0437\u0438\u0441\u044b \u0438\u043b\u0438 \u043e \u0447\u0435\u043c \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0446\u0438\u043a\u043b \u0441\u0442\u0430\u0442\u0435\u0439 \u043e ShIoTiny \u2014 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c\u043e\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 \u043d\u0430 \u0431\u0430\u0437\u0435 \u0447\u0438\u043f\u0430 ESP8266. \u0412 \u044d\u0442\u043e\u0442 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0446\u0438\u0438 \u0432 \u0432\u0430\u043d\u043d\u043e\u0439 \u043a\u043e\u043c\u043d\u0430\u0442\u0435 \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u043c \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u0438 \u0441 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u043d\u043e\u0439 \u0432\u043b\u0430\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043b\u044f ShIoTiny. \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0441\u0435\u0440\u0438\u0438. ShIoTiny: \u043c\u0430\u043b\u0430\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f, \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0432\u0435\u0449\u0435\u0439 \u0438\u043b\u0438 \u00ab\u0437\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28079,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37423","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0442\u0435\u0437\u0438\u0441\u044b \u0438\u043b\u0438 \u043e \u0447\u0435\u043c \u044d\u0442\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/shiotiny-ventilyatsiya-vlazhnogo-pomeshheniya-proekt-primer\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47ShIoTiny: \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0446\u0438\u044f \u0432\u043b\u0430\u0436\u043d\u043e\u0433\u043e \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f (\u043f\u0440\u043e\u0435\u043a\u0442-\u043f\u0440\u0438\u043c\u0435\u0440) | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0442\u0435\u0437\u0438\u0441\u044b \u0438\u043b\u0438 \u043e \u0447\u0435\u043c \u044d\u0442\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/shiotiny-ventilyatsiya-vlazhnogo-pomeshheniya-proekt-primer\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:17:33+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:17:33+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47ShIoTiny: ventilation of a humid room (project example) | ProHoster","description":"Key points or what this is about.","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/shiotiny-ventilyatsiya-vlazhnogo-pomeshheniya-proekt-primer","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47ShIoTiny: \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0446\u0438\u044f \u0432\u043b\u0430\u0436\u043d\u043e\u0433\u043e \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044f (\u043f\u0440\u043e\u0435\u043a\u0442-\u043f\u0440\u0438\u043c\u0435\u0440) | ProHoster","og:description":"\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0442\u0435\u0437\u0438\u0441\u044b \u0438\u043b\u0438 \u043e \u0447\u0435\u043c \u044d\u0442\u0430.","og:url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/shiotiny-ventilyatsiya-vlazhnogo-pomeshheniya-proekt-primer","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:17:33+00:00","article:modified_time":"2019-10-31T19:17:33+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37423","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 17:45:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:27:24","updated":"2026-01-23 17:45:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/37423","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=37423"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/37423\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media\/28079"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=37423"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=37423"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=37423"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}