Mejora de la confiabilidad del controlador doméstico inteligente en Majordomo (MQTT)

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 :





  1. Los servidores deben estar ahí y allá





  2. Los servidores deben poder administrar todos los dispositivos





  3. 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);
	}
}
      
      



Aquí hay un widget de este tipo, aunque torpe, pero informativo.
, ,

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.








All Articles