Entonces, mi casa inteligente está lista, escucha voces, controla el clima, carga la batería en el país (https://habr.com/ru/post/538896/).
Además, los dispositivos inteligentes ahora están presentes tanto en el campo como en casa, en la ciudad. Además, debido a las peculiaridades de la compatibilidad del ecosistema con Yandex, algunos de los dispositivos en el hogar (cintas RGB) se controlan a través de un servidor en Majordomo (dacha).
Y aquí surgen una serie de preguntas lógicas:
¿Dónde debería estar ubicado el servidor, en casa o en el país?
¿La pérdida de control de qué dispositivos sacrificar cuando se rompe la conexión entre la casa y la cabaña?
¿Cómo no cargar el canal GSM antes de la transferencia de gráficos en el diseño HTML del sitio?
Es fácil adivinar que la respuesta es reserva :
Los servidores deben estar ahí y allá
Los servidores deben poder administrar todos los dispositivos
Los servidores deben tener un conjunto de datos completo
Dado que los sensores se comunican con el servidor principalmente a través del protocolo MQTT, el intermediario MQTT también se convierte en un punto de falla.
Redundancia del servidor
Comencemos con el corredor MQTT. A excepción de mensajes como LWT ("última voluntad del dispositivo") y Retain (almacenados en el servidor), la mayoría de los mensajes se envían simultáneamente y solo a aquellos que están actualmente conectados al corredor. Es decir, "enviado - olvidado".
, 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.
Entonces, al agregar un servidor por 2500 rublos, recibí la redundancia total de un corredor de mensajes, un servidor de administración de dispositivos (lógica), y puede recibir gráficos con datos actualizados desde un servidor doméstico sin cargar un servidor que funciona a través de un módem GSM.