есть особенность 1-wire ключей (status)

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

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

Re: есть особенность 1-wire ключей (status)

Сообщение Vovix » Вт янв 13, 2015 5:34 pm

Victor_S писал(а):Да, логика там что называется "в лоб"...:) В предновогодней суете все делалось...:) Когда сел за 4-х канальные переключатели - понял, что это тупиковый подход.
Однако не все там так просто.
Дело в том что каждый канал может переключаться как программно(по pio), так и аппаратно(состояние pio при этом не меняется). Поэтому нужно отслеживать по 2 sensed на канал и корректировать pio при аппаратном переключении.
...............
дак я вам про такие и написал... они также и аппаратно и программно
http://radioseti.ru/index.php?route=pro ... uct_id=134

и на DS2408 они!
Мой -CONNECT-
Windows 7(PHP 7.2) + Raspberry Pi(освещение на 1-Wire) + MP751(управление) + ESP8266(сенсоры) + LAN(сенсоры)
-=: Если вам помогло моё сообщение, нажмите кнопку "Поблагодарить за сообщение автора: Vovix" (кнопка Спасибо) справа! :=-
Victor_S
Сообщения: 265
Зарегистрирован: Пт дек 26, 2014 1:58 pm
Благодарил (а): 33 раза
Поблагодарили: 24 раза

Re: есть особенность 1-wire ключей (status)

Сообщение Victor_S » Ср янв 14, 2015 8:29 am

Да я разобрался с логикой их работы... Оптимизировать приведенный код хотелось бы не в части условных операторов, а в том чем заменить последовательный вызов нескольких процедур по чтению и записи параметров, именно они и отнимают время выполнения всего кода.
А пустое значение параметров я обрабатываю, если Вы заметили, путем проверки существования переменной(строчки типа (!$s2 or $s2==0) - там восклицательный знак не случайно...;)).
Еще раз по данным модулям...
1. pio соответствующего канала включает/выключает его программно(например pio2 для 4-х канального модуля).
2. Состояние канала(горит лампочка или нет) видно по состоянию одного sensed(в нашем примере sensed1).
3. Аппаратное переключение данного канала меняет состояние другого sensed(в нашем примере sensed2), а заодно и sensed1.
4. Понять как включили/выключили данный канал можно только анализируя комбинацию sensed1 и sensed2.

Дело в том, что при аппаратном переключении каналов не меняется состояние соответствующего pio. Поэтому если Вы, например, включите канал аппаратно, то выключить его программно не сможете одиночной посылкой pio2=0(потому что pio2 и так ноль или отсутствует), придется вначале послать pio2=1, а уж затем pio2=0.
Дабы избежать таких неоднозначных ситуаций проще всего у свойства объекта связанного с sensed1 поставить галочку "выполнять указанный метод при изменении состояния", в котором анализировать комбинацию sensed1 и sensed2, и в случае если данное переключение было аппаратным просто менять значение pio2. И так для каждого канала.
Аватара пользователя
Vovix
Сообщения: 1155
Зарегистрирован: Пн янв 27, 2014 1:43 am
Откуда: г.Ижевск
Благодарил (а): 60 раз
Поблагодарили: 532 раза
Контактная информация:

Re: есть особенность 1-wire ключей (status)

Сообщение Vovix » Ср янв 14, 2015 10:51 am

Victor_S писал(а):Да я разобрался с логикой их работы... Оптимизировать приведенный код хотелось бы не в части условных операторов, а в том чем заменить последовательный вызов нескольких процедур по чтению и записи параметров, именно они и отнимают время выполнения всего кода.
А пустое значение параметров я обрабатываю, если Вы заметили, путем проверки существования переменной(строчки типа (!$s2 or $s2==0) - там восклицательный знак не случайно...;)).
Еще раз по данным модулям...
1. pio соответствующего канала включает/выключает его программно(например pio2 для 4-х канального модуля).
2. Состояние канала(горит лампочка или нет) видно по состоянию одного sensed(в нашем примере sensed1).
3. Аппаратное переключение данного канала меняет состояние другого sensed(в нашем примере sensed2), а заодно и sensed1.
4. Понять как включили/выключили данный канал можно только анализируя комбинацию sensed1 и sensed2.

Дело в том, что при аппаратном переключении каналов не меняется состояние соответствующего pio. Поэтому если Вы, например, включите канал аппаратно, то выключить его программно не сможете одиночной посылкой pio2=0(потому что pio2 и так ноль или отсутствует), придется вначале послать pio2=1, а уж затем pio2=0.
Дабы избежать таких неоднозначных ситуаций проще всего у свойства объекта связанного с sensed1 поставить галочку "выполнять указанный метод при изменении состояния", в котором анализировать комбинацию sensed1 и sensed2, и в случае если данное переключение было аппаратным просто менять значение pio2. И так для каждого канала.
Виктор,
странные у Вас модули!

а pio и у меня не меняет аппаратный переключатель (и не нужно этого)!

у меня простой алгоритм при включении или выключении:

метод switch в классе Light
СпойлерПоказать
$this->setProperty("trigOnOff",0);
$this->setProperty("trigOnOff",1);
метод просто переключает состояние света на противоположное!


метод statusChanged в классе Light
СпойлерПоказать
$status = $this->getProperty('status');

// определение настройки по проговариванию
$saylights = gg('Sets.saylights');
$saylights = $saylights - 1;

// узнаем прежнее состояние
$statusOld = $this->getProperty('statusOld');

// далее выполнять всё если состояние реально изменилось
if ($statusOld<>$status) {

$this->setProperty('updatedTimestamp',time());
$this->setProperty('alive',1);
$ot=$this->object_title;

// проверка заданно ли время жизни для ключа
$alive_timeout=(int)$this->getProperty('aliveTimeOut');
if (!$alive_timeout) {
$alive_timeout=8*60*60; // если не было заданно, то берем 8 часов
}
if ($status) {
$this->setProperty('statusText', "включен");
}
else {
$this->setProperty('statusText', "выключен");
}
say("Свет. ".str_replace("_"," ",$ot)." ".$this->getProperty('statusText'),$saylights);

clearTimeOut($ot."_alive");
setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout);
}
$this->setProperty('statusOld',$status);
есть еще вспомогательные методы:

метод turnOff
СпойлерПоказать
$status=$this->getProperty("status");
if ($status) {
// было включено - выключаем
// переключение по фронту 0 -> 1

$this->setProperty("trigOnOff",0);
$this->setProperty("trigOnOff",1);
}
else {
// было выключено
}
метод turnOn
СпойлерПоказать
$status=$this->getProperty("status");
if ($status) {
// было включено
}
else {
// было выключено - включаем
// переключение по фронту 0 -> 1

$this->setProperty("trigOnOff",0);
$this->setProperty("trigOnOff",1);
}

при этом

свойство trigOnOff подключено к соответствующему pio 1-wire
а свойство status подключено к sensed
Мой -CONNECT-
Windows 7(PHP 7.2) + Raspberry Pi(освещение на 1-Wire) + MP751(управление) + ESP8266(сенсоры) + LAN(сенсоры)
-=: Если вам помогло моё сообщение, нажмите кнопку "Поблагодарить за сообщение автора: Vovix" (кнопка Спасибо) справа! :=-
Victor_S
Сообщения: 265
Зарегистрирован: Пт дек 26, 2014 1:58 pm
Благодарил (а): 33 раза
Поблагодарили: 24 раза

Re: есть особенность 1-wire ключей (status)

Сообщение Victor_S » Ср янв 14, 2015 2:29 pm

Vovix, видимо Вы не используете аппаратные кнопки, либо не используете их "вперемешку" с программным управлением, иначе бы сразу все поняли...:)
Я брал эти модули именно из-за возможности управления каналами как кнопками аппаратно, так и программно, потому как планирую их использовать для управления уличным освещением. У меня довольно большой участок(35 соток) плюс прилегающая территория. На этом участке есть 6 собственных ж/б столбов линии электропередач. На каждом висит распределительный шкаф в которых и будут стоять данные устройства, управляя от одного до четырех светильниками(светодиодные мощностью до 40Вт на канал). Там же на столбах будут стоять аппаратные кнопки управления. Я хочу иметь возможность включить при необходимости освещение на каком-либо столбе, а выключить его, например уже из дома программно. С Вашими настройками это сделать будет невозможно, ибо при аппаратном включении канала, pio не изменится(оставаясь неопределенным либо 0), и Вы можете до посинения щелкать мышкой на Вашем методе turnOff(который посылает 0 в pio), поскольку pio и так в этом состоянии, хотя sensed Вам и показывает, что лампочка горит...:)
Модули о которых я говорю - вот эти:
1. http://radioseti.ru/index.php?route=product/product&path=62_67&product_id=143
2. http://radioseti.ru/index.php?route=product/product&path=62_67&product_id=140

У меня появился немного другой вопрос, который я уже вскользь упоминал в предыдущих постах...
При использовании сцен я указываю действие как ИМЯ_ОБЪЕКТА.МЕТОД - все нормально работает.
При использовании меню управление->кнопка - тоже ИМЯ_ОБЪЕКТА.МЕТОД - все нормально работает.
А вот при использовании меню управление->выключатель - вызов метода с именем объекта приводит к проблемам описанным в начале топика. Если же вызвать метод как ИМЯ_КЛАССА.МЕТОД - все снова замечательно работает.
При этом если протестировать сам метод из объекта(по ссылочке тест) - он замечательно и без ошибок отрабатывает.
Видимо есть какая-то ошибка или особенность синтаксиса самого вызова метода из объекта выключатель...
Аватара пользователя
Vovix
Сообщения: 1155
Зарегистрирован: Пн янв 27, 2014 1:43 am
Откуда: г.Ижевск
Благодарил (а): 60 раз
Поблагодарили: 532 раза
Контактная информация:

Re: есть особенность 1-wire ключей (status)

Сообщение Vovix » Ср янв 14, 2015 6:32 pm

Victor_S писал(а):...
Vovix, видимо Вы не используете аппаратные кнопки, либо не используете их "вперемешку" с программным управлением, иначе бы сразу все поняли...:)
Я брал эти модули именно из-за возможности управления каналами как кнопками аппаратно, так и программно,
...
может я что-то не понимаю...

у меня также оборудование от туда...

и у меня именно АППАРАТНЫЕ выключатели на всем втором этаже... с кнопками с фиксацией...

и всё работает как я описываю... и программно и аппаратно...

посмотрите описание с сайта radioseti.ru, особенно на эту часть:
СпойлерПоказать
....
5 канал DS2408 - управление Лампой 2

6 канал DS2408 - управление Лампой 1

7 кнала DS2408 - контроль (вкл/выкл) Лампа 1

8 канал DS2408 - контроль (вкл/выкл) Лампа 2

Микросхема логики ПИК-контроллер 12F....
т.е. нужны
pio.5 - лампа 2 и pio.6 - лампа 1
sensed.7 - контроль лампы 1
sensed.8 - контроль лампы 2


другие каналы не задействованы и они вам не нужны...
может я почти младенец в PHP и HTML, но либо у вас неисправные модули, либо Вы наворотили в коде лишние проверки!!!

прочитайте что я писал тут Вам ранее... обратите внимание НУЖЕН фронт для переключения...
0 -> 1 в pio
и не важно что там было.... даже если уже был 0 (или Null), дайте в pio сначала 0 потом 1

будут вопросы спрашивайте... я давно приобрел эти модули у них и уже давно их использую

у меня проблемы только с помехами в проводах 1-wire из-за которых бывают проблемы...
Мой -CONNECT-
Windows 7(PHP 7.2) + Raspberry Pi(освещение на 1-Wire) + MP751(управление) + ESP8266(сенсоры) + LAN(сенсоры)
-=: Если вам помогло моё сообщение, нажмите кнопку "Поблагодарить за сообщение автора: Vovix" (кнопка Спасибо) справа! :=-
Victor_S
Сообщения: 265
Зарегистрирован: Пт дек 26, 2014 1:58 pm
Благодарил (а): 33 раза
Поблагодарили: 24 раза

Re: есть особенность 1-wire ключей (status)

Сообщение Victor_S » Чт янв 15, 2015 9:48 am

Vovix писал(а): может я что-то не понимаю...

у меня также оборудование от туда...

и у меня именно АППАРАТНЫЕ выключатели на всем втором этаже... с кнопками с фиксацией...

и всё работает как я описываю... и программно и аппаратно...


pio.5 - лампа 2 и pio.6 - лампа 1
sensed.7 - контроль лампы 1
sensed.8 - контроль лампы 2


другие каналы не задействованы и они вам не нужны...
может я почти младенец в PHP и HTML, но либо у вас неисправные модули, либо Вы наворотили в коде лишние проверки!!!

прочитайте что я писал тут Вам ранее... обратите внимание НУЖЕН фронт для переключения...
0 -> 1 в pio
и не важно что там было.... даже если уже был 0 (или Null), дайте в pio сначала 0 потом 1
Vovix, спасибо за поддержку.
Забудьте тот код что я приводил выше. Я приводил его для другой цели.
По данным модулям я все подробно описал в предыдущем сообщении. Да, можно посылать в модуль каждый раз по две последовательных команды для уверенности срабатывания, т.е. 1,0 - для программного выключения и 0,1 для включения. Но это "некрасиво" и приводит к ненужным задержкам выполнения программной команды(как минимум вдвое).
Раз у Вас есть эти модули, Вы можете сами убедится в том, что при аппаратном переключении меняются и другие значения sensed. Именно это и позволяет нам определить как же лампа была включена(кнопкой или программно), и отследив аппаратное включение по определенной комбинации 2-х sensed, мы можем продублировать аппаратную команду программной. По сути это та же двойная команда, но выполняется она в другое время...;) Кроме того это гарантирует нам однозначное состояние всех sensed и pio при любом(аппаратном или программном) переключении канала, что исключает всякие глюки.
Суть вот в чем...
Аппаратное включение и так срабатывает моментально(без задержек и участия 1-wire сети и нашей программы) и выполнение дублирующей программной команды в это время ни на что не сказывается, а вот программное включение имеет задержку всегда и наша задача уменьшить ее любым способом. А тут как минимум двукратное сокращение времени реакции!
И, кстати, описание на сайте не соответствует действительности. Видимо модули меняются, а инфа старая...;)
Так у меня(нумерация каналов условная) для двухканального устройства:
- канал1
управление - pio4; контроль лампы - sensed3; аппаратная кнопка - sensed4.
- канал2
управление - pio5; контроль лампы - sensed2; аппаратная кнопка - sensed5.
---------------------
Можете что-то сказать по вопросу с выключателями в панели управления?
С ними заметил еще одну особенность. Когда я выключаю все каналы(именно на 4-х канальном устройстве) последовательной посылкой команд на выключение каждого канала - все ОК. Если для выключения всех каналов использовать pio.byte(что здорово ускоряет процесс) - переключатели 2-го и 4-го каналов остаются в положении включено, хотя лампочки выключаются и на сцене все отрабатывает нормально. На всех выключателях стоит одинаковое время автообновления(1с).
Аватара пользователя
Vovix
Сообщения: 1155
Зарегистрирован: Пн янв 27, 2014 1:43 am
Откуда: г.Ижевск
Благодарил (а): 60 раз
Поблагодарили: 532 раза
Контактная информация:

Re: есть особенность 1-wire ключей (status)

Сообщение Vovix » Чт янв 15, 2015 1:34 pm

Victor_S писал(а):
Vovix писал(а): может я что-то не понимаю...

у меня также оборудование от туда...

и у меня именно АППАРАТНЫЕ выключатели на всем втором этаже... с кнопками с фиксацией...

и всё работает как я описываю... и программно и аппаратно...


pio.5 - лампа 2 и pio.6 - лампа 1
sensed.7 - контроль лампы 1
sensed.8 - контроль лампы 2


другие каналы не задействованы и они вам не нужны...
может я почти младенец в PHP и HTML, но либо у вас неисправные модули, либо Вы наворотили в коде лишние проверки!!!

прочитайте что я писал тут Вам ранее... обратите внимание НУЖЕН фронт для переключения...
0 -> 1 в pio
и не важно что там было.... даже если уже был 0 (или Null), дайте в pio сначала 0 потом 1
Vovix, спасибо за поддержку.
Забудьте тот код что я приводил выше. Я приводил его для другой цели.
По данным модулям я все подробно описал в предыдущем сообщении. Да, можно посылать в модуль каждый раз по две последовательных команды для уверенности срабатывания, т.е. 1,0 - для программного выключения и 0,1 для включения. Но это "некрасиво" и приводит к ненужным задержкам выполнения программной команды(как минимум вдвое).
Раз у Вас есть эти модули, Вы можете сами убедится в том, что при аппаратном переключении меняются и другие значения sensed. Именно это и позволяет нам определить как же лампа была включена(кнопкой или программно), и отследив аппаратное включение по определенной комбинации 2-х sensed, мы можем продублировать аппаратную команду программной. По сути это та же двойная команда, но выполняется она в другое время...;) Кроме того это гарантирует нам однозначное состояние всех sensed и pio при любом(аппаратном или программном) переключении канала, что исключает всякие глюки.
Суть вот в чем...
Аппаратное включение и так срабатывает моментально(без задержек и участия 1-wire сети и нашей программы) и выполнение дублирующей программной команды в это время ни на что не сказывается, а вот программное включение имеет задержку всегда и наша задача уменьшить ее любым способом. А тут как минимум двукратное сокращение времени реакции!
И, кстати, описание на сайте не соответствует действительности. Видимо модули меняются, а инфа старая...;)
Так у меня(нумерация каналов условная) для двухканального устройства:
- канал1
управление - pio4; контроль лампы - sensed3; аппаратная кнопка - sensed4.
- канал2
управление - pio5; контроль лампы - sensed2; аппаратная кнопка - sensed5.
---------------------
Можете что-то сказать по вопросу с выключателями в панели управления?
С ними заметил еще одну особенность. Когда я выключаю все каналы(именно на 4-х канальном устройстве) последовательной посылкой команд на выключение каждого канала - все ОК. Если для выключения всех каналов использовать pio.byte(что здорово ускоряет процесс) - переключатели 2-го и 4-го каналов остаются в положении включено, хотя лампочки выключаются и на сцене все отрабатывает нормально. На всех выключателях стоит одинаковое время автообновления(1с).

У меня видимо старые модули и они полностью соответствуют описанию и фрон нужен только 0 -> 1
на переключение состояния, обратный 1 -> 0 ни чего не меняет...
Время задержки выполнения программного переключения есть
и это связанно с особенностями привязки "железных" объектов (в т.ч. 1-wire) к свойствам конкретного класса (я так понимаю!)


В панели управления (меню) выключатели, после моих "сигналов" об ошибке, Сергей всё исправил и теперь работает всё как надо (почти идеально)

pio.byte не использую, хотя у меня есть модули на 2 выключателя и 2 лампы, поэтому сказать тут ни чего не могу...

и всё же странные у Вас модули.... там Павел вроде должен был внести изменения в логику и схему в связи с выявленными мной небольшими нюансами... но не до такой-же степени.... ??? (хотя когда я брал эти модули у них, там даже на рисунках у них "+" и "-" питания были перепутаны.... :-) )!!!
Мой -CONNECT-
Windows 7(PHP 7.2) + Raspberry Pi(освещение на 1-Wire) + MP751(управление) + ESP8266(сенсоры) + LAN(сенсоры)
-=: Если вам помогло моё сообщение, нажмите кнопку "Поблагодарить за сообщение автора: Vovix" (кнопка Спасибо) справа! :=-
Victor_S
Сообщения: 265
Зарегистрирован: Пт дек 26, 2014 1:58 pm
Благодарил (а): 33 раза
Поблагодарили: 24 раза

Re: есть особенность 1-wire ключей (status)

Сообщение Victor_S » Чт янв 15, 2015 3:27 pm

Всем спасибо за внимание...:) Методом тыка со всем разобрался. Уффф.. Это больше походит на танцы с бубном чем на осознанное программирование...:( Будем надеяться со временем программу таки доведут до ума или хотя бы появится подробная документация.
2Vovix: С программными задержками можно и нужно бороться...;) Увы, очень не хватает возможности чтения нескольких параметров из устройства за раз...:( Писать можно и при помощи pio.byte, но вот так же просто использовать sensed.byte не получится из-за большого количества вариантов в условных операторах.
Аватара пользователя
Vovix
Сообщения: 1155
Зарегистрирован: Пн янв 27, 2014 1:43 am
Откуда: г.Ижевск
Благодарил (а): 60 раз
Поблагодарили: 532 раза
Контактная информация:

Re: есть особенность 1-wire ключей (status)

Сообщение Vovix » Вт апр 07, 2015 2:03 pm

С момента моего первого сообщения в этой теме прошло уже некоторое время. И я путем проб и ошибок уже несколько раз переделывал взаимодействие с моими ключами 1-wire и пришел к некоторым выводам и алгоритмам работы которые вот уже месяца 2 наверно успешно работают и решили многие мои проблемы, а т.к. я хотел бы поделиться со всеми этим своим решением, то хотел бы выложить его сюда.
Прошу спецам меня не ругать, я очень любитель и не программист совсем, но думаю это может принести пользу другим и возможно, кто-то сможет поправить, что-то в моём решении и оно станет лучше.
Дак вот дано:
Модуль (1-wire) управления освещением - http://radioseti.ru/index.php?route=pro ... uct_id=138
тут схема принципиальная модуляПоказать
1к 1л принципиальная-500x500.JPG
1к 1л принципиальная-500x500.JPG (18.87 КБ) 11598 просмотров
Его особенности:
Модуль управления освещением. Предназначен для управления освещением со стандартного выключателя, а также независимого управления по 1-wire. Управление освещением производится не зависимо есть ли, или нет связи с компьютером, а также есть возможность управлять по 1-wire. Так же пользователь может контролировать включена или выключена нагрузка (лампа). Мощность нагрузки 150 Вт.
Логика его работы:
переключение клавиши выключателя - включение лампы или выключение лампы (в зависимости от состояния до)
1-канал DS2406 ( точнее нужен "PIO.A") - управление по 1-wire, фронт 0 -> 1 (сначала 0 потом 1) переключает состояние на противоположное
2-канал DS2406 (точнее нужен "sensed.B") - контроль наличия напряжения на лампе

Т.е. "sensed.B" - только отображает состояние и работает только "в одну сторону" - значение привязанного свойства нужно только читать и никак не писать в него!!!

Мои выстраданные решения:
1) Создал класс "Light"
тут картинка классаПоказать
Скриншот 2015-04-07 13.43.37.png
Скриншот 2015-04-07 13.43.37.png (10.56 КБ) 11598 просмотров
2) В классе (именно в классе) создал методы:
refresh - обновление состояния, т.е. если включен то не выключать и наоборот
statusChanged - вызываем при изменении статуса и меняем свойства жизни объекта
switch - переключить состояние на противоположное
turnOff - выключить с проверкой (если не было уже выключено)
turnOn - включаем с проверкой

3) В классе создал свойства:
Название Описание
alive - живой?
aliveTimeOut - время жизни
status - состояние освещения привязанное к 1-wire
status1 - состояние освещения привязанное к меню
statusText - состояние словами
statusWhoTurn - кто включил(или выключил), программа (1) или физический выключатель (2)
trigOnOff - триггер управления освещением 0 -> 1
updatedTimestamp - время последнего изменения

НЕ забываем в настройках свойства status поставить "Запускать метод при изменении"
тут картинкаПоказать
Скриншот 2015-04-07 14.13.41.png
Скриншот 2015-04-07 14.13.41.png (14.57 КБ) 11598 просмотров
4) В Меню управления создал для каждого такой пункт(на примере одного)
особенность - привязано к меню именно свойство status1
тут картинкаПоказать
Скриншот 2015-04-07 13.08.41.png
Скриншот 2015-04-07 13.08.41.png (31.62 КБ) 11598 просмотров
5) Привязка 1-wire
тут картинкаПоказать
Скриншот 2015-04-07 15.01.09.png
Скриншот 2015-04-07 15.01.09.png (56.89 КБ) 11598 просмотров
Код методов:

метод (самый важный) statusChanged
СпойлерПоказать

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

if ($params['NEW_VALUE']==$params['OLD_VALUE']) return;
$status = $this->getProperty('status');
if (!$status) {
$status=0;
}


// определение настройки по проговариванию и логу
$saylights = gg('Sets.saylights');



// узнаем прежнее состояние
$statusOld = $this->getProperty('statusOld');
if (!$statusOld) {
$statusOld=0;
}

$this->setProperty('updatedTimestamp',time());
$this->setProperty('alive',1);
$ot=$this->object_title;

// проверка заданно ли время жизни для ключа
$alive_timeout=(int)$this->getProperty('aliveTimeOut');
if (!$alive_timeout) {
 $alive_timeout=8*60*60; // если не было заданно, то берем 8 часов
}
    if ($status) {
    $this->setProperty('statusText', "включен");
    }
    else     {
    $this->setProperty('statusText', "выключен");
    }

if ($saylights) {
                say("Свет. ".str_replace("_"," ",$ot)." ".$this->getProperty('statusText'),($saylights-2));
                }

clearTimeOut($ot."_alive");
setTimeOut($ot."_alive","sg('".$ot.".alive',0);",$alive_timeout);

$this->setProperty('statusOld',$status);

if  (($this->getProperty("status"))<>($this->getProperty("status1"))) {
 $this->setProperty("statusWhoTurn",2);
 //say ("Переключили выключателем на стене");
} 

$this->setProperty('status1',$status);

// считаем количество всего включенных модулей света
$objects=getObjectsByClass("Light");
$all_lights_off=0;
foreach($objects as $obj) {
$all_lights_off = gg($obj['TITLE'].".status") + $all_lights_off;
}
sg ("Sets.all_lights_off",$all_lights_off);
метод turnOff
СпойлерПоказать

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

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

$ot1=$this->object_title;
// определение настройки по проговариванию и логу
$saylights = gg('Sets.saylights');

if ($status_in) {
// было включено - выключаем 
// переключение по фронту 0 -> 1
// при этом пытаемся это сделать до 7 раз с проверкой изменения статуса

     for ($k = 1; $k <= 7; $k++) {

         if  (($this->getProperty("status"))==$status_in) {

              $this->setProperty("trigOnOff",0);

            $this->setProperty("trigOnOff",1);
    
             //say ("-> ".$k);
 
        }
    }
 
}

else {

 if ($saylights) {
        say("Свет. ".str_replace("_"," ",$ot1)." уже был выключен.",($saylights-2));

    }
 
//say ("Уже было выключено");
} 
метод turnOn - (по сути "зеркален" методу turnOFF)
СпойлерПоказать

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

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

if (!$status_in) {
// было вЫключено - включаем 
// переключение по фронту 0 -> 1
// при этом пытаемся это сделать до 5 раз с проверкой изменения статуса

     for ($k = 1; $k <= 5; $k++) {

         if  (($this->getProperty("status"))==$status_in) {

              $this->setProperty("trigOnOff",0);

            $this->setProperty("trigOnOff",1);
    
             //say ("-> ".$k);
 
        }
    }
 
}

else {
//say ("Уже было включено");
}
метод switch
СпойлерПоказать

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

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

$ot1=$this->object_title;
// определение настройки по проговариванию и логу
$saylights = gg('Sets.saylights');


// переключение по фронту 0 -> 1
// при этом пытаемся это сделать до 10 раз с проверкой изменения статуса
for ($k = 1; $k <= 10; $k++) {

     if  (($this->getProperty("status"))==$status_in) {

      $this->setProperty("trigOnOff",0);

    $this->setProperty("trigOnOff",1);
     
    }
}
    

if  (($this->getProperty("status"))<>$status_in) {
 $this->setProperty("statusWhoTurn",1);
} 
else {
     if ($saylights) {
        say("Изменить состояние освещения ".str_replace("_"," ",$ot1)." не удалось! Возможно неисправность модуля 1-wire.",($saylights-2));

    }
}

Некоторые пояснения:
Решение: Я ушел от первоначального варианта, когда ползунок выключателя был привязан к свойству status (которое в свою очередь связанно с sensed.B ключа 1-wire) напрямую
Результат: так называемые нотисы прекратились, т.к. включение ползунка не меняет теперь sensed.B самостоятельно, что как раз делать было нельзя (этот параметр ключа может быть только Read)!

Решение: Методы turnOn, turnOff и switch несколько раз (жестко) пытаются выдать фронт 0->1 в привязанное к PIO.A модуля 1-wire, свойство trigOnOff при чем с проверкой реакции модуля 1-wire.
Результат: При плохой сети 1-wire модули отваливаются и появляются в сети периодически и такой "финт ушами" позволил мне привести надежность программного включения/выключения света к 99%! (возможно заменю цикл FOR на цикл WHILE)

При включение света выключателем на стене в модуле меняется значение sensed.B, что приводит к изменению свойства status, что в свою очередь приводит к запуску метода statusChanged!

выбранный вариант решения также оставляет метку - кто (вернее наверно что) вкл/выкл конкретную лампочку крайний раз - выключатель на стене или программа (может в дальнейшем это получиться как-то использовать).
Мой -CONNECT-
Windows 7(PHP 7.2) + Raspberry Pi(освещение на 1-Wire) + MP751(управление) + ESP8266(сенсоры) + LAN(сенсоры)
-=: Если вам помогло моё сообщение, нажмите кнопку "Поблагодарить за сообщение автора: Vovix" (кнопка Спасибо) справа! :=-
Аватара пользователя
slgeo
Сообщения: 551
Зарегистрирован: Чт фев 05, 2015 2:35 pm
Откуда: РнД
Благодарил (а): 139 раз
Поблагодарили: 74 раза

Re: есть особенность 1-wire ключей (status)

Сообщение slgeo » Вт апр 07, 2015 5:03 pm

Насколько я понял, все проблемы возникают из-за того, что переключатель в меню сам меняет значение status из 0 в 1 и обратно.
Если бы он только считывал состояние из свойства "status", то не пришлось бы городить огород.
Raspberry Pi2 Model B + NRF24L01 (MySensors) + 1-Wire + Esp8266 (WiFi-IoT)
CONNECT
Ответить