Majordomo(MQTT)のスマートホームコントローラーの信頼性の向上

だから、私のスマートホームは準備ができており、声に耳を傾け、気候を制御し、国のバッテリー充電を行っています(https://habr.com/ru/post/538896/)。





さらに、スマートデバイスは現在、国内でも家庭でも、市内に設置されています。さらに、Yandexとのエコシステムの互換性の特殊性により、自宅の一部のデバイス(RGBテープ)はMajordomo(dacha)上のサーバーを介して制御されます。





そして、ここでいくつかの論理的な質問が発生します。





  • サーバーはどこに配置する必要がありますか?自宅または国内ですか?





  • 家とコテージの間の接続が切断されたときに犠牲にするデバイスの制御の喪失?





  • サイトのHTMLレイアウトでグラフを転送する前にGSMチャネルをロードしない方法は?





答えは予約だと推測するのは簡単です





  1. サーバーはあちこちにある必要があります





  2. サーバーはすべてのデバイスを管理できる必要があります





  3. サーバーには完全なデータセットが必要です





センサーは主にMQTTプロトコルを介してサーバーと通信するため、MQTTブローカーも障害点になります。





サーバーの冗長性

MQTTブローカーから始めましょう。LWT(「デバイスの最後の意志」)や保持(サーバーに保存)などのメッセージを除いて、ほとんどのメッセージは同時に送信され、現在ブローカーに接続しているユーザーにのみ送信されます。つまり、「送信済み-忘れた」です。





, mosquitto – , , . « ». raspbian/armbian – /etc/mosquito/mosquito.conf:





#connection bridge-01
connection bridge-01
address mqtt.mydomain.ru:1883
topic # out 0
topic # in 0
      
      



, , ( ).





, Majordomo. Orange pi one plus (1Gb RAM) – 2 Raspberry Pi4, - , . , ( , 2 – , , , ).





MQTT, MQTT. , 2 ( ) 2 – , . 10 MQTT – (ThisComputer.cycle_mqttRun). (time()). 10 – , , MQTT . MQTT ( MQTT). 20 , – , . , MQTT – . , :





$val=getGlobal("ThisComputer.cycle_mqttRun");
$locval=time()-$val;
$this->setProperty("LocValue",$val);
$this->setProperty("LocDeltaT",$locval);
if($locval>10)
	$locstate=1;
else
  $locstate=0;
$tmp=$this->getProperty("Status");
if(is_null($tmp))
	$tmp=10;
if($tmp!=$locstate)
	$this->setProperty("Status",$locstate);
$remval=time()-$this->getProperty("RemValue");
$newstate=($remval<20)?0:1;
$this->setProperty("RemStatus",$newstate);
$ot = $this->object_title;
$currBroker=$this->getProperty("MQTT_broker");
$sA=$this->getProperty("selfAddress");
if($sA!=$currBroker)
	$this->setProperty("isController",0);
setTimeOut($ot . "_checkCycle",'callMethod("'.$ot.'.checkCycle");',10);
if(
	(!$locstate&&($newstate||($this->getProperty("LinkedRoom")=="Energoblok")))&&
	($sA!=$currBroker)
)// remote failed local good or local is good and is not local server
{
	debMes('Switch to '.$this->getProperty("selfAddress"),0);
	$cnt=0;
	for($i=40;$i<90;$i++)
	{
		if(ping('192.168.3.'.number_format($i,0)))
    {
			getURL('http://192.168.3.'.number_format($i,0).'/cm?cmnd=MqttHost%20'.$this->getProperty("selfAddress"));
			debMEs('http://192.168.3.'.number_format($i,0).' is online',0);
			$cnt++;
			$this->setProperty("LocValue",time());
		}
	}
	if($cnt>10)
	{
		$this->setProperty("MQTT_broker",$this->getProperty("selfAddress"));
		$this->setProperty("isController",1);
	}
}
      
      



これはそのようなウィジェットですが、不器用ですが有益です
, ,

Tasmota (IP c 192.168.3.40 192.168.3.90), URL MQTT . , – MQTT . – , 10 , . . .





. 1 2, . , , / – . 1200 .





, . , Majordomo Raspberry , ( 1, orange pi zero c 512 - 300 ). , , , ( !). – .





– , . :





  • ( , java )





  • ( – getProperty\setProperty ).





– , , :





if((($temp2Floor=getGlobal("sTemp2Floor.value"))<'21')&&
	gg("remote_mqtt_updated.isController")) // if remote failed
{
		if ($temp2Floor < '21' && !getGlobal("rConserveSW.status") && timeBetween('2:00', '8:00')) 
		{
  		if (!getGlobal("rDieselHome.status")) 
			{
   	 		callMethod("rDieselHome.turnOn");
  		}
		} else if ($temp2Floor > '23') 
		{
  		if (getGlobal("rDieselHome.status")) 
			{
    		callMethod("rDieselHome.turnOff");
  		}
		}
}
      
      



, , (gg("remote_mqtt_updated.isController")). remote_mqtt_updated – .





380 , 1200.





したがって、2500ルーブルのサーバーを追加することで、メッセージブローカー、デバイス管理サーバー(ロジック)の完全な冗長性を受け取り、を介して動作するサーバーをロードしなくても、ホームサーバーから最新のデータを含むグラフを受け取ることができます。 GSMモデム。








All Articles