Решение одно. Один датчик должен быть главным, а другой, или даже другие, резервным. Значит в код метода statusChanged класса Rooms нужно добавить код, который будет определять, нужно ли передавать данные от резервного датчика, или главный датчик работает сам.
Теперь весь рассказ и задача в целом сводится к добавлению в систему возможности создавать резервные датчики. Вот мой вариант реализации:
Добавляем новое свойство distance в класс датчиков. Если свойство будет не задано, или в нем будет значение 0, то датчик считается главным, и его данные всегда будут передаваться объекту комнаты. Чем больше значение distance, тем дальше по списку резерва стоит датчик. Если у датчика задано свойство distance, то перед передачей его данных, будет проведен поиск всех датчиков, и если при этом не будет найдено ни одного живого датчика с дистанцией меньше, то данные будут переданы объекту комнаты.
Код: Выделить всё
// Передать данные слинкованной комнате
$linked_room=$this->getProperty("LinkedRoom");
if ($linked_room) {
// Если НЕ задано свойство distance, то датчик считается главным, и его данные просто будут переданы объекту комнаты.
if (!$this->getProperty('distance')) {
setGlobal($linked_room.'.Temperature', $s);
// Иначе будет проведен поиск других живых датчиков с более короткой дистанцией.
} else {
// Получить id свойства для работы с базой данных
$alive_pid=$this->getPropertyByName('alive', $this->class_id, $this->id);
$distance_pid=$this->getPropertyByName('distance', $this->class_id, $this->id);
$LinkedRoom_pid=$this->getPropertyByName('LinkedRoom', $this->class_id, $this->id);
$arr_s = SQLSelectOne("
SELECT VALUE FROM `pvalues` WHERE PROPERTY_ID = ".$distance_pid." AND OBJECT_ID IN (
SELECT OBJECT_ID FROM `pvalues` WHERE PROPERTY_ID = ".$LinkedRoom_pid." AND VALUE = '".$linked_room."' AND OBJECT_ID NOT IN (
SELECT OBJECT_ID FROM `pvalues` WHERE PROPERTY_ID = ".$alive_pid." AND VALUE = 0
)
)
ORDER BY VALUE LIMIT 1
");
//Если не найдено других живых датчиков с более короткой дистанцией
if ($this->getProperty("distance") <= $arr_s['VALUE']) {
setGlobal($linked_room.'.Temperature', $s);
}
}
}
SELECT OBJECT_ID FROM `pvalues` WHERE PROPERTY_ID = ".$alive_pid." AND VALUE = 0
Выбрать всё НЕ живые датчики из нашего класса keySensors, или его подкласса. $alive_pid укажет на принадлежность свойства к нужному классу.
SELECT OBJECT_ID FROM `pvalues` WHERE PROPERTY_ID = ".$LinkedRoom_pid." AND VALUE = '".$linked_room."' AND OBJECT_ID NOT IN (<<<<неживые>>>>)
Выбрать датчики со свойством LinkedRoom='объект_комната' и исключить неживые
SELECT VALUE FROM `pvalues` WHERE PROPERTY_ID = ".$distance_pid." AND OBJECT_ID IN (<<<<>>>>) ORDER BY VALUE LIMIT 1
Получить минимальное значение distance. Это будет свойство живого датчика, у которого в LinkedRoom указана та же комната. Дальше всё просто. Сравниваем со значением distance текущего датчика и принимаем решение о передаче данных.