Verbesserung der Zuverlässigkeit des Smart-Home-Controllers auf Majordomo (MQTT)

Mein Smart Home ist also bereit, hört auf Stimmen, kontrolliert das Klima und lädt den Akku im Land auf (https://habr.com/ru/post/538896/).





Darüber hinaus stehen intelligente Geräte heute sowohl auf dem Land als auch zu Hause in der Stadt. Aufgrund der Besonderheiten der Ökosystemkompatibilität mit Yandex werden einige der Geräte zu Hause (RGB-Bänder) über einen Server auf Majordomo (Datscha) gesteuert.





Und hier stellen sich einige logische Fragen:





  • Wo soll sich der Server befinden - zu Hause oder auf dem Land?





  • Der Verlust der Kontrolle darüber, welche Geräte zu opfern sind, wenn die Verbindung zwischen dem Haus und der Hütte unterbrochen wird?





  • Wie lade ich den GSM-Kanal nicht vor der Übertragung von Grafiken in das HTML-Layout der Site?





Es ist leicht zu erraten, dass die Antwort eine Reservierung ist :





  1. Server müssen da und da sein





  2. Server müssen in der Lage sein, alle Geräte zu verwalten





  3. Server müssen über einen vollständigen Datensatz verfügen





Da die Sensoren hauptsächlich über das MQTT-Protokoll mit dem Server kommunizieren, wird der MQTT-Broker auch zu einem Fehlerpunkt.





Serverredundanz

Beginnen wir mit dem MQTT-Broker. Mit Ausnahme von Nachrichten wie LWT ("letzter Wille des Geräts") und Retain (auf dem Server gespeichert) werden die meisten Nachrichten gleichzeitig und nur an diejenigen gesendet, die derzeit mit dem Broker verbunden sind. Das heißt "gesendet - vergessen".





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



Hier ist so ein Widget, zwar ungeschickt, aber informativ
, ,

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.





Durch Hinzufügen eines Servers für 2500 Rubel erhielt ich die vollständige Redundanz eines Nachrichtenbrokers, eines Geräteverwaltungsservers (Logik), und Sie können Diagramme mit aktuellen Daten von einem Heimserver empfangen, ohne einen Server zu laden, über den funktioniert ein GSM-Modem.








All Articles