Я писал уже в других ветках, даже сам описывал, что и как подключил для теста - http://smartliving.ru/forum/viewtopic.php?f=4&t=1463
Практический опыт программирования у меня небольшой, и теперь, когда начал приводить всё в порядок столкнулся с проблемой, которую сам решить не могу. Поэтому прошу помощи!!!
Повторю здесь вводные данные:
Имеем устройство 1-wire - "1 кнопка - 1-лампа" - не буду приводить где куплен (указывал ранее)
логика его работы проста -
управляем одной лампой с кнопки (выключателя) и из под 1-wire одновременно,
поэтому задействованы два канала у DS2406p один в режиме управления (PIO.A), и другой в режиме определения включена или выключена нагрузка (SENSED.B).
Для включения или выключения ключа(света) через 1-wire, необходимо подать (установить) свойство связанного объект с PIO.A (например "Лампа.trigOnOff") сначала "0" потом "1" и состояние переключиться, не включиться, а именно ПЕРЕКЛЮЧИТЬСЯ на противоположное.
Для определения состояния (только для определения) нужно "нюхать" свойство связанного объекта с SENSED.B (например "Лампа.status"), 1 - лампа сейчас включена, 0 - выключена.
И вот тут-то кроется "подводный камень":
Если создать метод (например "statusChanged") и привязать его к свойству "Лампа.status" (Запускать метод при изменении),
то при включении света (Лампы) с "железной" кнопки метод "statusChanged" запускается один раз и если поставить команду say(...), то мы слышим всё как и надо 1 раз,
но если включать свет (Лампу) программно (через 1-wire), то т.к. нужно менять связанное свойство два раза ("Лампа.trigOnOff"), то и метод "statusChanged" запускается системой ДВА раза и если не придумать как побороть двойной запуск, то мы слышим два раза сообщение Алисы об изменении (включении или выключении) света!
Вообще конечно несколько странно, что метод "statusChanged" запускается два раза, т.к. при передаче "Лампа.trigOnOff" первый раз "0", у 1-wire элемента SENSED.B остается в прежнем значении и меняется только после подачи "Лампа.trigOnOff" второй раз "1". Но возможно в такой логике есть смысл...
Так вот я пытаюсь выловить этот повторный запуск и у меня это не выходит или выходит но на какое-то время!
Видимо временные интервалы проверки состояния при изменении "Лампа.status" могут быть разные или еще в чем дело не знаю!
Я придумал отлавливать через Flag, но у меня выходит правильно "через-раз".
Вот код
Метод: switch (объект: Лампа)
Код: Выделить всё
$status=$this->getProperty("status");
if ($status) {
$this->callMethod('turnOff');
} else {
$this->callMethod('turnOn');
}
Код: Выделить всё
$status=$this->getProperty("status");
if ($status) {
// было включено - выключаем
// переключание по фронту 0 -> 1
$this->setProperty("trigOnOff",0);
$this->setProperty("statusFlag",0);
$this->setProperty("trigOnOff",1);
$this->setProperty("statusFlag",1);
}
else {
// было выключено, выполним тут что-то потом
}
Код: Выделить всё
$status=$this->getProperty("status");
if ($status) {
// было включено, выполним тут что-то потом
}
else {
// было выключено - включаем
// переключание по фронту 0 -> 1
$this->setProperty("trigOnOff",0);
$this->setProperty("statusFlag",0);
$this->setProperty("trigOnOff",1);
$this->setProperty("statusFlag",1);
}
Код: Выделить всё
$status=$this->getProperty('status');
$statusFlag=$this->getProperty('statusFlag');
// сюда вставим проверку
$this->setProperty('updatedTimestamp',time());
$this->setProperty("alive",1);
$ot=$this->object_title;
$alive_timeout=(int)$this->getProperty("aliveTimeOut");
if (!$alive_timeout) {
$alive_timeout=12*60*60; // 12 часов
}
if (($statusFlag) && ($status)) {
say($ot.' включена');
}
elseif (($statusFlag) && (!$status)) {
say($ot.' выключена');
}
clearTimeOut($ot."_alive");
setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout);
Что еще заметил:
1) При выключение с кнопки (с железа) объект "Лампа.status" скорее всего принимает значение не "0", а Null
2) Если вставить в метод "statusChanged" в место "// сюда ставим проверку" вот такой например код:
Код: Выделить всё
$trigOnOff=$this->getProperty('trigOnOff');
// -----------------------------------------------------
$fp = fopen("c:/er_vovix.txt", "a"); // Открываем файл
$mytext = "\r\n -- Метод statusChanged -- \r\n";
$test = fwrite($fp, $mytext);
$test = fwrite($fp, "status: ".$status."\r\n");
$test = fwrite($fp, "statusFlag: ".$statusFlag."\r\n");
$test = fwrite($fp, "trigOnOff: ".$trigOnOff."\r\n");
fclose($fp); //Закрытие файла
// --------------------------------------------------
и всё начинает работать практически идеально!!!
3) хотя "$statusFlag" и "$trigOnOff" практически идентичны, но без использования "$trigOnOff" как ожидается всё не работает, видимо т.к. у "$trigOnOff" есть связь с "железным" устройством, а у "$statusFlag" нет!
Помогите!!! а то у меня уже мозг кипит на такой по сути простой задаче!!!
(А что будет дальше!!!