Jadi, rumah pintar saya sudah siap, mendengarkan suara, mengontrol iklim, mengisi baterai di negara ini (https://habr.com/ru/post/538896/).
Apalagi, perangkat pintar sekarang berdiri baik di pedesaan maupun di rumah, di kota. Selain itu, karena kekhasan kompatibilitas ekosistem dengan Yandex, beberapa perangkat di rumah (kaset RGB) dikontrol melalui server di Majordomo (dacha).
Dan di sini muncul sejumlah pertanyaan logis:
Di mana lokasi server - di rumah atau di negara?
Hilangnya kendali atas perangkat apa yang akan dikorbankan ketika koneksi antara rumah dan pondok terputus?
Bagaimana tidak memuat saluran GSM sebelum transfer grafik dalam tata letak HTML situs?
Mudah ditebak bahwa jawabannya adalah reservasi :
Server harus ada di sana dan di sana
Server harus dapat mengatur semua perangkat
Server harus memiliki set data yang lengkap
Karena sensor berkomunikasi dengan server terutama melalui protokol MQTT, broker MQTT juga menjadi titik kegagalan.
Redundansi server
Mari kita mulai dengan broker MQTT. Kecuali untuk pesan seperti LWT ("keinginan terakhir perangkat") dan Pertahankan (disimpan di server), sebagian besar pesan dikirim secara bersamaan dan hanya kepada mereka yang saat ini terhubung ke broker. Artinya, "dikirim - lupa".
, 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.
Jadi, dengan menambahkan server untuk 2500 rubel, saya menerima redundansi penuh dari broker pesan, server manajemen perangkat (logika), dan Anda dapat menerima grafik dengan data terbaru dari server rumah tanpa memuat server yang berfungsi melalui modem GSM.