У меня одна система на raspberry pi 3 работает. Вторую установил на orange pi zero (дешёвая и работает пока).
Пока сделал простую проверку на живость систем по методу "пинбола": одна система вызывает в другой системе метод объекта такой-же метод такого-же объекта и запускает таймер на ошибку. Этот таймер в случае успешного выполнения метода сбрасывается, иначе сообщает, что не в порядке соседний мажордомо. Пока так.
Вот рабочие коды методов:
- создал класс "Dva_majordomo", в нём объект "majordomo_moj" и методы:
- takt:
Код: Выделить всё
$Aktivnij=gg("majordomo_moj.Aktivnij"); //своё состояние
$Aktivnij_sosed=$params['Aktivnij']; //состояние соседа
sg("majordomo_moj.Aktivnij_sosed",$Aktivnij_sosed);
sg("majordomo_moj.pinpong",1);
if (($Aktivnij==1) && ($Aktivnij_sosed==1)) { // если все активные, делаю активным только соседа
callMethod('majordomo_moj.Stop_major');
};
if (($Aktivnij==0) && ($Aktivnij_sosed==0)) { // если нет активные, делаю активным себя
callMethod('majordomo_moj.Start_major');
};
clearTimeout("alarm_dvaMD");
$schot=gg("majordomo_moj.schot");
$schot++;
sg("majordomo_moj.schot",$schot);
$vremj=time();
sg("majordomo_moj.time",$vremj);
sg("majordomo_moj.n",0);
setTimeOut("zapros_dvaMD", "callMethod('majordomo_moj.zapros');", 10);
Код: Выделить всё
clearTimeout("zapros_dvaMD");
$Aktivnij=gg("majordomo_moj.Aktivnij");
file_get_contents("http://имя:пароль@ip:80/objects/?object=majordomo_moj&op=m&m=takt&Aktivnij=".$Aktivnij);
setTimeOut("alarm_dvaMD", "callMethod('majordomo_moj.alarm');", 50);
Код: Выделить всё
$n=gg("majordomo_moj.n");
if ($n<3){ //повторяю запросы
$n++;sg("majordomo_moj.n",$n);
setTimeOut("zapros_dvaMD", "callMethod('majordomo_moj.zapros');", 10);
} else {// беру управление на себя, если пинг есть
clearTimeout("alarm_dvaMD");
clearTimeout("zapros_dvaMD");
sg("majordomo_moj.n",0);
sg("majordomo_moj.pinpong",0);
if (file_get_contents("http://192.168.0.12/xxx/?cmd=all")) { // PING до любого контроллера в сети
say("Сосед пропал! Управление беру на себя!");
callMethod('majordomo_moj.Start_major');
} else {
say("Управление отключаю, нет ринга и соседа!",2);
callMethod('majordomo_moj.Stop_major');
};
};
Код: Выделить всё
setGlobal('cycle_megadControl','start'); //запускаю сервис megad
// и остальные
sg('majordomo_moj.Aktivnij',1);
Код: Выделить всё
setGlobal('cycle_megadControl','stop'); //останавливаю сервис megad
// и остальные
sg('majordomo_moj.Aktivnij',0);
time;
schot=0, постоянно будет увеличиваться;
n=0, 3 попытки связаться с соседним мажордомо;
Aktivnij=0, =1, если этот мажордомо активный;
Aktivnij_sosed=0, =1, если соседний мажордомо активный;
pinpong=0, =1, если связь между мажорами установлена
peredacha - для передачи свойств о состоянии систем дома.
Значения =0 нужно изначально присвоить для исключения ошибок при выполнении кода.
В методе onNewMinute объекта ClockChime раз в час проверяю и запускаю метод takt объекта majordomo_moj:
Код: Выделить всё
if ($m=="00") {
if (gg("majordomo_moj.pinpong")==0) {callMethod('majordomo_moj.takt');}; //попытка запуска "пинпонга" между двумя мажордомо
}