Помогите, 1-wire "1 кнопка - 1 лампа", есть нюансы!

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Ответить
Аватара пользователя
Vovix
Сообщения: 1155
Зарегистрирован: Пн янв 27, 2014 1:43 am
Откуда: г.Ижевск
Контактная информация:

Помогите, 1-wire "1 кнопка - 1 лампа", есть нюансы!

Сообщение Vovix »

Доброй всем ночи (утра, вечера, дня)!

Я писал уже в других ветках, даже сам описывал, что и как подключил для теста - 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');
}
Метод: turnOff (объект: Лампа)

Код: Выделить всё

$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 {
// было выключено,  выполним тут что-то потом
}
Метод: turnOn (объект: Лампа)

Код: Выделить всё

$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);
}
Метод: statusChanged (объект: Лампа) В котором как раз вся "собака и зарыта"!

Код: Выделить всё

$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" нет!

Помогите!!! а то у меня уже мозг кипит на такой по сути простой задаче!!! :oops:
(А что будет дальше!!! :shock: :roll: )
Мой -CONNECT-
Windows 7(PHP 7.2) + Raspberry Pi(освещение на 1-Wire) + MP751(управление) + ESP8266(сенсоры) + LAN(сенсоры)
-=: Если вам помогло моё сообщение, нажмите кнопку "Поблагодарить за сообщение автора: Vovix" (кнопка Спасибо) справа! :=-
Аватара пользователя
Vovix
Сообщения: 1155
Зарегистрирован: Пн янв 27, 2014 1:43 am
Откуда: г.Ижевск
Контактная информация:

Re: Помогите, 1-wire "1 кнопка - 1 лампа", есть нюансы!

Сообщение Vovix »

Немного всё изменил:

метод switch:

Код: Выделить всё

$status=$this->getProperty("status");

$this->setProperty("trigOnOff",0);
$this->setProperty("statusFlag",0);
$this->setProperty("trigOnOff",1);
$this->setProperty("statusFlag",1);
без проверок! тупо переключаем!
и от методов turnOn и turnOff вообще отказался!
и еще не смотря на бессмысленность первой строчки для этого метода - $status=$this->getProperty("status");
но без неё почему-то проговаривает при программном включении сначала "Лампа включена", и сразу "Лампа выключена", хотя лампа остаётся включенной! (мистика?!)


метод: statusCanger

Код: Выделить всё

$status = $this->getProperty('status');
$statusFlag = $this->getProperty('statusFlag');
if ($status == Null) { 
$status = 0;
$this->setProperty('status',$status);
}

// -------- Логирование в файл (мне так удобнее) ---------------------------
$trigOnOff=$this->getProperty('trigOnOff');
$date = gg("ThisComputer.Date");
$timeNow = gg("ThisComputer.timeNow");

$fp = fopen("c:/er_vovix.txt", "a"); // Открываем файл

$mytext = "\r\n -- Метод statusChanged -- ";
$mytext = $mytext.$date." г. ".$timeNow."\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); //Закрытие файла
// --------------------------------------------------

$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 часов
}
//say($statusFlag);
if (($statusFlag) && ($status)) {
say($ot.' включена');
}
elseif (($statusFlag) && (!$status)) {
say($ot.' выключена');
}
clearTimeOut($ot."_alive");
setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout);


проверка на Null оказалась тоже важной, т.к. без неё "ползунок" выключателя в меню не убегал на "выключено" если выключить "железной" кнопкой!

И еще на "Сцене" лампочку привязал к запуску того-же метода "switch" и....
свет исправно включает и выключает, но ни чего не говорит и метод "statusCanger" похоже выполняется один раз
и с "statusFlag" равным "0"!!!!!!!!!!!!!!!

Вообще ни чего не понимаю....

Хелп! ХЕЛП!!! Нид Хелп!
Мой -CONNECT-
Windows 7(PHP 7.2) + Raspberry Pi(освещение на 1-Wire) + MP751(управление) + ESP8266(сенсоры) + LAN(сенсоры)
-=: Если вам помогло моё сообщение, нажмите кнопку "Поблагодарить за сообщение автора: Vovix" (кнопка Спасибо) справа! :=-
Аватара пользователя
Vovix
Сообщения: 1155
Зарегистрирован: Пн янв 27, 2014 1:43 am
Откуда: г.Ижевск
Контактная информация:

Re: Помогите, 1-wire "1 кнопка - 1 лампа", есть нюансы!

Сообщение Vovix »

Ну вот разобрался сам!

была в т.ч. "железная" проблема:
оказывается модуль 1-wire при управлении на симисторе неустойчиво "нюхает" если в нагрузке энергосберегающая лампа! состояние начинает "скакать"! решил заменой лампы, а у производителя есть уже другое решение!

метод тоже переделал теперь метод "statusChanged" выглядит так:

Код: Выделить всё

$status = $this->getProperty('status');
$statusOld = $this->getProperty('statusOld');
// обязательно проверим на Null т.к. иначе ползунок выключателя не опустится в выкл.
if ($status == Null) { 
$status = 0;
$this->setProperty('status',$status);
}

$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 ($statusOld<>$status) {
	if ($status) {
	say($ot." включена");
	$this->setProperty('statusText', "включено");
	}
	else 	{
	say($ot." выключена");
	$this->setProperty('statusText', "выключено");
	}
$this->setProperty('statusOld',$status);	
}
	
clearTimeOut($ot."_alive");
setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout);
Мой -CONNECT-
Windows 7(PHP 7.2) + Raspberry Pi(освещение на 1-Wire) + MP751(управление) + ESP8266(сенсоры) + LAN(сенсоры)
-=: Если вам помогло моё сообщение, нажмите кнопку "Поблагодарить за сообщение автора: Vovix" (кнопка Спасибо) справа! :=-
Ответить