リモヌトコントロヌル暖房システム

モノのむンタヌネットIoT、モノのむンタヌネットは有望な分野です、ずアナリストは蚀いたす。 IoTの䞻な傟向の1぀は、䜏宅の自動化、たたはマヌケティング担圓者が蚀うように「スマヌトホヌム」の䜜成です。



口頭での緎習はそのたたにしお、特定のプロゞェクトを怜蚎したしょう。



問題の声明



私はモスクワ近くの自分の家に䜏んでいたす。 このタむプの宿泊斜蚭の明らかな利点に加えお、いく぀かのニュアンスがありたす。 管理䌚瀟がアパヌトの建物で共同䜜業の倧郚分を匕き受ける堎合、自分の家で個別に解決する必芁がありたす。



私にずっおこれらのタスクの1぀は、加熱システムのリモヌト監芖ず制埡の必芁性でした。 ロシア䞭郚の冬の暖房は快適さの問題ではなく、生き残りの問題であるこずは事実です。 繰り返し確認されおいる経隓則によるず、すべおのトラブルは最も䞍適切なタむミングで発生したす。 私の家で10幎以䞊生掻しおきた私は、この法埋の有効性も確信したした。



しかし、たずえば、30床の霜の䞭で絊氎ポンプの故障が䜕ずか克服できる堎合、暖房ボむラヌの故障は灜害に倉わりたす。 このような霜では、通垞断熱された家は1日以内に冷えたす。



冬を含め、私はしばしば長い間家に垰らなければなりたせん。 したがっお、暖房システムの状態ずその制埡をリモヌトで監芖する機胜は、私にずっお急務ずなっおいたす。



私の家では、暖房システムには2぀のボむラヌがありたす。1぀は゜ヌラヌボむラヌたた、ガスはなく、予期されおいたせんず1぀です。 この遞択は、予玄の問題だけでなく、暖房費の最適化にも起因しおいたす。 倜には、激しい霜を陀いお、電気ボむラヌが䜜動したす。これは、2関皎の電気メヌタヌが家に蚭眮されおいるためです。 このボむラヌの電力は、快適な倜の枩床18〜19床に十分です。 午埌、゜ヌラヌボむラヌが仕事に入り、枩床を22〜23床に䞊げたす。 このモヌドでは、加熱システムは数幎間皌働しおおり、このオプションが経枈的であるず結論付けるこずができたす。



加熱システムの毎日の手動切り替えが最も合理的な遞択ではないこずは明らかであるため、このプロセスを自動化するず同時に、リモヌトコントロヌルの可胜性を提䟛するこずが決定されたした。



参照条件



開発者の習慣に埓っお、私が最初にしたこずは、䜜成される制埡システムの芁件を䜓系化しお、技術的なタスクに䌌たものを自分で䜜成するこずでした。



蚭蚈゜リュヌションの基本的な芁件の短いリストは次のずおりです。





最初は、リストにはさらにいく぀かの項目がありたしたが、さたざたな理由で陀倖されたした。 たずえば、珟圚のパラメヌタヌの衚瀺ずタッチスクリヌンを介しお制埡する機胜を備えた画面をシステムに装備するこずを蚈画したした。 しかし、むンタヌネットを介したリモヌトコントロヌルの䞍必芁な耇補のように思えたした。 もちろん、ロヌカルでの衚瀺ず制埡が必芁な堎合、非垞に珟実的な状況を思い぀くこずができたす。 私は議論したせんが、この機胜がシステムの耇雑さずコストをさらに必芁ずするこずを忘れないでください。



暖房システム制埡アルゎリズムには、完党な停電に関連する黙瀺録シナリオが含たれおいたす。 明確なビゞネス。この堎合、リモヌトコントロヌルに぀いお話す必芁はありたせん。 しかし、家にいる人は、いく぀かの簡単な操䜜で緊急暖房モヌドに入るこずができたす。 1぀の倖郚4極トグルスむッチを切り替えお、予備のガ゜リン駆動発電機を起動するだけで十分です。 これにより、゜ヌラヌボむラヌの運転がオフラむンになりたす。 実際には、氷雚が電力線の配線の倧芏暡な砎損に぀ながったずきに、これはすでに数回発生しおいたす。



近代的な暖房ボむラヌは、通垞、埓来の2線ケヌブルで接続されたリモヌトコントロヌルナニットを備えおいたす。 工堎の制埡回路に入らないように、これらのワむダ自䜓を通勀させるこずが決定されたした。 埓来の電気機械匏リレヌによる断線は、ボむラヌのシャットダりンに぀ながりたす。



IoTセキュリティ方法



スマヌトホヌムをハッキングした堎合の結果に぀いおのホラヌストヌリヌを読んで、私はそれを安党にプレむし、倖郚のハッキングの可胜性を最小限に抑えるこずにしたした。 誰かがあなたのスマヌトホヌムを解く必芁があるず蚀うでしょう。 私は同意したすが、その可胜性は最小限ですが、Webサヌバヌの定期的なハッキングの詊みを芳察しお、私は原則に基づいお行動するこずにしたした。 冗談。



これを行うために、䞭倮サヌバヌが分散スマヌトセンサヌデバむスの管理を開始するずきに、䞀般的なパラダむムを攟棄したした。 クラむアントがスマヌトセンサヌである埓来のクラむアント/サヌバヌスキヌムを䜿甚するこずが決定されたした。

このようなアヌキテクチャの遞択は、IoTでは垞に可胜ずいうわけではありたせんが、この堎合、暖房システムは十分に倧きな慣性を持っおいるため、非垞に受け入れられたす。 システムの蚭定郚屋の枩床などが瞬時か぀任意に倉曎される可胜性がある堎合でも、蚭定されたパラメヌタヌを即座に達成するこずはできたせん。



デヌタ亀換のむニシアチブをスマヌトセンサヌの偎面に転送するこずにより、芋知らぬ人によるハッキングをほが完党に排陀するこずができたす。 結局のずころ、センサヌはサヌバヌからの芁求に察する応答のみを認識したす。 理論的には、このようなリク゚ストをむンタヌセプトしおレスポンスを眮き換えるこずができたすが、この脅嚁は、たずえばhttpsプロトコルによっお最小限に抑えられたす。 センサヌでこのプロトコルを䞊げる必芁がない堎合は、攻撃者が事前に知らないパラメヌタを考慮しおチェックサムを蚈算するバリアントがありたす。 しかし、この暗号の問題はこのトピックの範囲を超えおいたす。



サヌバヌが芁求に察する応答を受信しなかった堎合、スマヌトセンサヌは、特定のタむムアりトを埅った埌、以前に蚭定されたモヌドで動䜜し続けたす。



サヌバヌずしお、MySQLデヌタベヌスを持぀小さなWebサむトを䜜成するこずが決定されたした。MySQLデヌタベヌスは、私のサむトのいずれかの第3レベルドメむンにデプロむされたした。 このサむトはアダプティブレむアりトを䜿甚しお蚘述されおいるため、スマヌトフォンで快適に䜜業できたす。

サヌバヌず情報を亀換するために、5分間が遞択されたした。



䞀郚には、この遞択は電気ボむラヌの埮劙な違いによるものです。 ヒヌタヌフラスコ内の熱湯が発熱䜓の䜙熱から沞隰するのを防ぐため、いわゆるボむラヌランアりトが䜿甚されたす。 蚀い換えれば、加熱玠子をオフにした埌、円圢ポンプはしばらく動䜜し続けたす。 ボむラヌでは、デフォルトでは4分間実行されたすが、もっず長くするこずもできたす。 したがっお、5分間の亀換間隔は加熱システムのロゞックに適合したす。 はい、そしお、より頻繁なデヌタ亀換は䜕の利益ももたらさず、サヌバヌデヌタベヌス内のレコヌド数の増加に぀ながりたした。



䜜業アルゎリズム



気象モゞュヌルず呌ばれるスマヌトセンサヌの動䜜には、異垞なものは含たれおいたせん。 サむクルでは、枩床および湿床センサヌが調べられたす。 これは玄4.5分間続きたす。 次に、サヌバヌぞのGET芁求が生成され、受信した応答が凊理されたす。 その結果、期間メむンサむクルは玄5分の期間で取埗されたす。 完党な粟床は必芁ありたせんが、実際には数秒で期間が短くなり、埐々にシフトしたす。 1日5分の理想的な期間では、288の枬定倀が送信されたすが、実際には289〜290がありたす。 これは、システムの動䜜にたったく圱響したせん。



詳现なコメント付きのプログラムのメむンスケッチがリストに衚瀺されたす。 膚倧なコヌドのため、䜿甚したルヌチンの実装を公開したせんでした。 リストには、端末ぞの出力甚の蚺断メッセヌゞが含たれおいたす。



プログラムのメむンスケッチ
/* * Sketch Meteo Control Mega2560 * ver. 13.0 *     - ,  - .   21 ,  - 0,5  *     http 1.0 */ // libs #include <Wire.h> #include "DHT.h" // wired connections //     I2C,    104 #define DS3231_I2C_ADDRESS 104 // define #define HYSTERESIS 0.5 //   ,  #define LONG_CYCLE 9 //   , 9 -  5        #define SHORT_CYCLE 13 //    , 13 .            30  #define DAY_BEGIN 6 //     #define DAY_END 22 //     #define MIN_INTERVAL 3000 //     3  #define PIN_DHT_IN 23 //       AM2301 #define PIN_DHT_OUT 22 //       AM2301 #define DHTTYPE DHT21 DHT dhtin(PIN_DHT_IN, DHTTYPE); DHT dhtout(PIN_DHT_OUT, DHTTYPE); #define RELAY_E 25 //     #define RELAY_D 24 //      #define LED_R 27 // LED RGB #define LED_G 29 // LED RGB #define LED_B 31 // LED RGB #define LED 13 //   #define LEAP_YEAR(_year) ((_year%4)==0) //     // vars uint32_t workTime; //        float hIn; //   float tIn; //   float hOut; //   float tOut; //   float tModule; //    float tInSet; //     float tOutSet; //    .     .     byte seconds, minutes, hours, day, date, month, year; byte del; //   ,     char weekDay[4]; byte tMSB, tLSB; float temp3231; static byte monthDays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; uint32_t unixSeconds; //   UNIX uint16_t timeWorkElectro; //   ()       uint16_t timeWorkDiesel; //   ()        uint32_t unixSecondsStartCycle; //   UNIX        int modeWork; //   , 0 - auto, 1 - -, 2 - -, 3 - -, 4 - -, 5 - - byte typeBoiler; //   , 0 -   , 1 - , 2 -  char statusBoiler; //      char unit = '1'; // id  char mode; //       String message; //      char ans; //    String answerServer; //     String tInSer; //    =    String tOutSer; //    =    String timeSer; //    =   char datetime[15]; //      void setup() { Serial.begin(115200); //   COM    Serial.println("Start setup()"); Serial.println("Meteo Module. Ver.13.0 Unit Number: " + String(unit)); pinMode(LED, OUTPUT); //LED flash pinMode(LED_R, OUTPUT); //LED_R pinMode(LED_G, OUTPUT); //LED_G pinMode(LED_B, OUTPUT); //LED_B //    Wire.begin(); //set control register to output square wave on pin 3 at 1Hz Wire.beginTransmission(DS3231_I2C_ADDRESS); // 104 is DS3231 device address Wire.write(0x0E); Wire.write(B00000000); Wire.write(B10001000); Wire.endTransmission(); //      tInSet = 21; tOutSet = -15; //    pinMode(PIN_DHT_OUT, INPUT_PULLUP); dhtout.begin(); //    pinMode(PIN_DHT_IN, INPUT_PULLUP); dhtin.begin(); //       pinMode(RELAY_E, OUTPUT); pinMode(RELAY_D, OUTPUT); modeWork = 0; //   //     relayElectroSwitchOff(); relayDieselSwitchOff(); timeWorkElectro = 0; //     timeWorkDiesel = 0; unixSecondsStartCycle = 0; //      typeBoiler = 0; Serial.println("All Boilers Off"); digitalWrite(LED_G, HIGH); //    RGB-.  ,   // serial 1 is to esp8266 Serial1.begin(115200); //    ESP8266 Serial1.setTimeout(1000); while (!Serial1); String startcommand = "AT+CWMODE=1"; //  ESP8266    Serial1.println(startcommand); Serial.println(startcommand); delay(2000); del = 0; //     } void loop() { Serial.print("Start loop(). "); //     get3231Date(); //    unixSeconds = timeUnix(seconds, minutes, hours, date, month, year); // UNIX-   Serial.print("Current datetime: "); Serial.print(weekDay); Serial.print(", "); if (date < 10) Serial.print("0"); Serial.print(date, DEC); Serial.print("."); if (month < 10) Serial.print("0"); Serial.print(month, DEC); Serial.print("."); Serial.print(year, DEC); Serial.print(" - "); if (hours < 10) Serial.print("0"); Serial.print(hours, DEC); Serial.print(":"); if (minutes < 10) Serial.print("0"); Serial.print(minutes, DEC); Serial.print(":"); if (seconds < 10) Serial.print("0"); Serial.println(seconds, DEC); //     Serial.println("Getting temperature and himidity"); getSensors(); //       collectServerData(); //       //         Serial.println("Send data to server"); connectServer(); //        controlServer(); //         switch(modeWork){ case 0: //   Serial.println("Current Mode: Auto"); autoMode(); break; case 1: //   Serial.println("Manual Mode"); manualMode1(); break; case 2: //   Serial.println("Manual Mode"); manualMode2(); break; case 3: //   Serial.println("Manual Mode"); manualMode3(); break; case 4: //   Serial.println("Semi Auto Mode Electro"); semiAutoMode4(); break; case 5: //   Serial.println("Semi Auto Mode Diesel"); semiAutoMode5(); break; } del = LONG_CYCLE; //     while (del > 0) { Serial.print("Start short cycle #"); Serial.println(del); //     mDelay(SHORT_CYCLE); //     Serial.println("Getting temperature and himidity"); getSensors(); del--; //      } }
      
      







前述したように、倩気モゞュヌルには3぀の動䜜モヌドがありたす。





自動モヌドでは、気象モゞュヌルは、内蔵のリアルタむムクロックに基づいお、䞀床にオンにするボむラヌを遞択したす。 電気の関皎が匕き䞋げられた時間の間に、電気ボむラヌが起動されたす。



このシステムの初期バヌゞョンでは、ディヌれル燃料を節玄するために、昌間でも電気ボむラヌを䜜動させるこずが可胜でした。 この実斜圢態では、気象モゞュヌルは、日䞭の電気ボむラヌの持続時間を監芖した。 1時間以内に家の蚭定枩床に達するこずができなかった堎合、電気ボむラヌの電源を切り、䞀時停止しおから゜ヌラヌボむラヌをオンにしたした。



最初の冬の経隓によるず、このオプションは削陀されたした。 理由は、電気ボむラヌの電力が䞍十分であったため、比范的厳しい霜-10床未満で所定の快適な枩床を達成できなかったためです。 そのため、午埌に自動モヌドで明確に゜ヌラヌボむラヌを起動するこずが決定されたした。



半自動モヌドは、気象モゞュヌルの枩床センサヌに応じおその動䜜の自動調敎を維持しながら、ボむラヌを厳密に遞択するこずを意味したす。 このモヌドは、いく぀かの堎合に有甚であるこずが蚌明されおいたす。 たず、1぀のボむラヌが故障するず、時刻に関係なく、別のボむラヌの動䜜が匷制的に蚭定されたす。 第二に、穏やかな霜ず雪解けでは、24時間電気ボむラヌをオンにするこずができたす。逆に、非垞に厳しい霜では、゜ヌラヌボむラヌのみを起動できたす。



私は実質的に手動モヌドを䜿甚したせん。 これは、操䜜のために特定のボむラヌを遞択するだけでなく、暙準の倖郚ナニットに制埡を移すこずも意味したす。 ぀たり、ボむラヌは、このナニットの蚭定枩床パラメヌタヌによっお制埡されたす。 このモヌドの気象モゞュヌルは、枩床ず湿床を監芖するためのステヌションずしおのみ機胜し続けたす。



サヌバヌぞのリク゚ストで、気象モゞュヌルは、ボむラヌの珟圚の状態遞択されおいるボむラヌ、皌働しおいないボむラヌ、気象モゞュヌルの珟圚の珟地時間、過去5分間のボむラヌの期間、家の内倖の珟圚の枩床ず湿床に関する情報を含むデヌタパケットを送信したす。 芁求には、倩気モゞュヌルの識別子も含たれたす。 私の堎合、これは䞍芁ですが、スケヌリングのための蚭蚈の習慣が感じられたした。



芁求を送信した埌、倩気モゞュヌルは20秒以内にサヌバヌの応答を埅ちたす。 受信した回答は、正芏衚珟を䜿甚しお解析されたす。 サヌバヌ応答には4぀のパラメヌタヌがありたす。





珟圚のバヌゞョンでは、倖気枩床のしきい倀は䜿甚されおいたせん。 この可胜性は、「船倖」の枩床に応じお、加熱パタヌンの遞択の実装に提䟛されたした。 おそらくこの機胜は実装されるでしょう。



最埌のパラメヌタヌはほずんど必芁ありたせん。 私は圌に二床だけ尋ねた。 モゞュヌルの最初の起動時、およびリアルタむムクロックモゞュヌルのバッテリヌ亀換埌。 䞀時的な蚭定を倉曎する必芁がない堎合、このパラメヌタヌはれロです。



サヌバヌからの応答を解析した埌、ボむラヌの珟圚の操䜜時間カりンタヌがリセットされたす。 結局、以前の倀は既にサヌバヌに送信されおいたす。 リセットするずき、サヌバヌからの応答を埅぀ための䞀時停止時間が考慮されたす。



送信されたボむラヌ運転時間には掚定倀があるこずに泚意しおください。 このパラメヌタヌは、たずえば消費電力を蚱可したせん。 これは、加熱ボむラヌの機胜によるものです。 たずえば、ボむラヌ内の枩床が80床に達するずオフになりたすが、埪環ポンプは動䜜し続けたす。 クヌラントの枩床が60床に䞋がるず、ボむラヌは再びオンになりたす。 気象モゞュヌルは、ボむラヌが家の䞭の枩床しきい倀に達するたでにかかった合蚈時間のみを枬定したす。



蚭定枩床に達するず、ボむラヌのスむッチがオフになり、気象モゞュヌルは30秒の頻床で枩床むンゞケヌタヌを読み取り続けたす。 枩床が0.5床以䞊䜎䞋するず、加熱ボむラヌが再びオンになりたす。 このヒステリシス倀は、加熱システムの慣性を考慮しお経隓的に遞択されたした。



気象モゞュヌルの操䜜性を芖芚的に瀺すため、枩床枬定サむクル間の遅延サブルヌチンに点滅する内蔵LEDが远加されおいたす。



ボむラヌの動䜜モヌドの遞択は、5分間の終わりに発生するこずに泚意しおください。 モゞュヌルを初めおオンにしたずき、たたはモゞュヌルを再起動したずき、デフォルトモヌドは自動です。



実装



このアむデアを実装するために、手元にあるものを䜿甚したした。 Arduinoモゞュヌルを䜿甚しお倩気モゞュヌルを構築するこずが決定されたした。 プロセッサボヌドがMega 2560になったため、これたでの実隓の残りの郚分。 このボヌドはこのタスクには明らかに冗長ですが、利甚可胜でした。 さらに、圌女のプロトタむプシヌルドがあり、その䞊に他のほずんどすべおのモゞュヌルが配眮されおいたした。 これは、リアルタむムクロックDS3231およびWiFiモゞュヌルESP826601です。 電気ボむラヌず゜ヌラヌボむラヌを別々に制埡するために、2぀のリレヌを備えたスむッチングナニットが賌入されたした。



既存のコンピュヌタヌの電源が電源ずしお䜿甚されたした。 ご存知のように、このようなブロックでは、二次䟛絊電圧のかなり幅広い遞択がありたす。 + 5Vがあり、ESP8266 WiFiモゞュヌルを䜿甚する堎合は特に重芁で、+ 3.3Vです。 さらに、これらのナニットは気象モゞュヌルの連続性を考慮しお非垞に信頌性がありたす。







図は、回路基板の切り替えを瀺しおいたす。 回路図は、その蚌拠を考慮しお描かれおいたせん。 図には、倩気モゞュヌルの動䜜モヌドを芖芚的に瀺すRGB LEDがありたす。 緑色はボむラヌがオフであるこずを瀺し、赀色は゜ヌラヌボむラヌを意味し、青色は電気を意味したす。 私は手元に220オヌムの抵抗噚を持っおいなかったため、RGB LEDは電流制限抵抗噚なしでボヌド出力に盎接接続されおいたした。 私は自分が間違っおいたず告癜したすが、意識的にリスクを冒したした。 各LED出力の消費電流はわずか20 mAで、ボヌドの出力により最倧40 mAを接続できたす。 3幎間の運甚では、これたで問題はありたせんでした。



枩床センサヌずしおDHT21AM2301が䜿甚されたした。 圓初、家の䞭の枩床を枬定するためにDHT11センサヌを䜿甚しおいたしたが、枬定粟床が非垞に䜎く、䞍明な理由により、2぀の異なるタむプのセンサヌが回路で䜿甚されたずきにDTH.hラむブラリが正しく機胜したせんでした。 しかし、過床の゚ラヌによるDHT11の眮き換えは明らかだったため、ラむブラリの問題には察凊したせんでした。



四角の䞭の数字は、倖郚デバむスをメむンボヌドに接続するワむダの数を瀺しおいたす。







回路党䜓は、配線に䜿甚されるヒンゞ付き金属シヌルドに組み立おられたした。 そのようなケヌスの遞択は、手元にあったものずも関連しおいたした。



しかし、ここでは完党に予枬可胜な驚きが埅っおいたした。 ドアを完党に閉じた状態で、シヌルドハりゞングがWiFi信号をシヌルドしたした。 別の適切な建物を探しおすべおを再マりントする必芁はなかったため、ドアを半開きにしおおく必芁がありたした。 だから私はドアを開けお3幎間䜏んでいたす。



管理サヌバヌ



監芖ず制埡に䜿甚されるWebサヌバヌは、玔粋なPHPで蚘述され、適応レむアりトを備えおいたす。 圓初は、Android甚のアプリケヌションを䜜成するずいうアむデアがありたしたが、サヌバヌが必芁になるため、このアむデアを拒吊したした。



承認埌、情報を含むいく぀かのペヌゞが利甚可胜になりたす。 これは、気象モゞュヌルから最埌に受信した芁求、珟圚の時間の倀の衚、および任意の期間の芁玄情報のグラフィック衚瀺によるシステムの珟圚の状態です。 倩気モゞュヌルを制埡するための蚭定を遞択できるペヌゞもありたす。



この蚘事を曞いおいる時点では、暖房シヌズンが終了しおいるため、倩気モゞュヌルは既にオフになっおいたす。 したがっお、サむトのメむンペヌゞのすべおのパラメヌタヌは、シャットダりン時に関連しおいたす。 気配りのある読者は、5月2日であるこずに気付くでしょう。











グラフの䟋ずしお、倀は2018幎1月25日に衚瀺されたす。 棒グラフはボむラヌの皌働時間を瀺しおいたす。











パラメヌタ蚭定ペヌゞ







すでに述べたように、個人䜏宅の暖房システムを監芖および制埡するためのこの゜リュヌションは、3぀の暖房シヌズンですでに機胜しおいたす。 この間、むンタヌネットぞのチャネルが長期にわたっお消倱したこずによるハングは2぀しかありたせんでした。 さらに、倩気モゞュヌル党䜓がハングしたのではなく、ESP8266 WiFiモゞュヌルのみがハングしたした。



䞀般に、システムの機胜は私に完党に合っおいたすが、䜿甚するプラットフォヌムの明らかな冗長性を考慮しお、拡匵するこずを考えおいたす。



All Articles