Amélioration de la fiabilité du contrôleur de maison intelligente sur Majordomo (MQTT)

Donc, ma maison intelligente est prête, écoute les voix, contrôle le climat, recharge la batterie dans le pays (https://habr.com/ru/post/538896/).





De plus, les appareils intelligents existent désormais à la campagne et à la maison, en ville. De plus, en raison des particularités de compatibilité de l'écosystème avec Yandex, certains des appareils à la maison (bandes RVB) sont contrôlés via un serveur sur Majordomo (datcha).





Et ici, un certain nombre de questions logiques se posent:





  • Où le serveur doit-il être situé - à la maison ou dans le pays?





  • La perte de contrôle des appareils à sacrifier lorsque la connexion entre la maison et le chalet est rompue?





  • Comment ne pas charger le canal GSM avant le transfert des graphes dans la mise en page HTML du site?





Il est facile de deviner que la réponse est la réservation :





  1. Les serveurs doivent être là et là





  2. Les serveurs doivent pouvoir gérer tous les appareils





  3. Les serveurs doivent avoir un jeu de données complet





Étant donné que les capteurs communiquent avec le serveur principalement via le protocole MQTT, le courtier MQTT devient également un point de défaillance.





Redondance des serveurs

Commençons par le courtier MQTT. À l'exception des messages tels que LWT ("dernière volonté de l'appareil") et Retain (stocké sur le serveur), la plupart des messages sont envoyés simultanément et uniquement à ceux qui sont actuellement connectés au courtier. Autrement dit, "envoyé - oublié".





, 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);
	}
}
      
      



Voici un tel widget, bien que maladroit, mais informatif
, ,

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.





Ainsi, en ajoutant un serveur pour 2500 roubles, j'ai reçu une redondance complète d'un courtier de messages, d'un serveur de gestion de périphériques (logique), et vous pouvez recevoir des graphiques avec des données à jour d'un serveur domestique sans charger un serveur qui fonctionne via un modem GSM.








All Articles