sergejey писал(а):Victor_S писал(а):Еще бы теперь по первому вопросу разобраться бы...
Victor_S писал(а):Где-то в 20-х числах декабря скачал и установил установочную версию под Windows с сайта. Худо-бедно настроил необходимый мне в данный момент функционал. Сегодня решил обновить систему вручную(инета на компе с МД нету). Скачал архив, распаковал, заменил все файлы в папке htdocs и поудалял все файлы installtd в подпапках modules. Перезапустил комп и получил две проблемы:
1. У свойств объектов есть необязательное поле позволяющее запускать некий метод при изменении значения данного свойства. Я использовал данную возможность следующим образом. Свойство было связано с параметром 1-wire объекта, и при изменении его значения вызывался метод, устанавливающий статус входа(геркон) и сообщавший голосом об открытии/закрытии ворот. Все работало нормально, т.е. метод вызывался именно при изменении значения свойства(параметра 1-wire объекта). После обновления данный метод вызывается при каждом опросе 1-wire объекта, даже если значение свойства не меняется.

Была как раз "жалоба" на то, что свойство 1-wire не обновляется, если оно одинаковое, так что пришлось обновлять каждый раз и от этого такой побочный эффект. Но он легко лечится. Достаточно в самом методе в начале добавить такой код:
Код: Выделить всё
if ($params['NEW_VALUE']==$params['OLD_VALUE']) return;
эти параметры передаются при вызове связанного метода и по ним можно определить действительно ли изменялось значение. если не изменялось, то ничего не делаем и выходим из метода
Сергей, этот неприятный момент этим похоже не лечиться!!! Во всяком случае у меня!
И Вот почему:
Как я и писал ранее у меня 1-wire ключи управляются не просто подачей 1 или 0 в соответствующий PIO (например PIO.A), а подачей двух значений: сначала 0 потом 1, т.е. нужен фронт, для смены состояний на противоположное.
Дак вот, теперь при программном включении или выключении света, после последних обновлений происходит следующее:
1) метод переключения света передает в
PIO.A, через привязанное свойство
trigOnOff, состояние "0" ( но внимание не забываем, что при проверке значение реально становиться "" - пустая строка)
2) поскольку установлено правило запускать метод
statusChanged при изменении свойства
status (которое связанно с
Sensed.B), метод успешно и запускается, хотя изменения значения не было
3) метод переключения света, заканчивая свою работу, передает в
PIO.A, через привязанное свойство
trigOnOff, состояние "1"
4) поскольку установлено правило запускать метод
statusChanged при изменении свойства
status (которое связанно с
Sensed.B), метод успешно и запускается, т.к. происходит изменение
5) включается или выключаться свет, но ползунок выключателя может и не переключиться или только побегать туда-сюда и свет тоже только мигнуть!
И всё бы хорошо, но
сеть 1-wire крайне не надежна, и возникает следующая ситуация:
если в текущий момент свет был выключен, т.е.
status = ""(пустая строка), то при каждом циклическом опросе сети в любом случае приходит значение "" и запущенный метод
statusChanged (который похоже теперь запускается постоянно т.е. практически ежесекундно), при сравнении старого и нового значений отрабатывает всё как надо!
но если в текущий момент свет был ВКЛЮЧЕН, т.е.
status = "1", то при каждом циклическом опросе сети могут быть два варианта:
"1" - что соответствует реальному положению вещей,.... и
""(пустая строка), что связанно похоже с тем, что в данный конкретный момент не удалось получить значения при считывании (например из-за помех или "расположения луны")
В результате строчка
if ($params['NEW_VALUE']==$params['OLD_VALUE']) return; дает сбой!!!
Переключать свет программно стало очень трудно....
Я конечно понимаю, что мне надо работать над улучшением прокладки сети 1-wire, хотя не понимаю куда еще лучше (провод менее 50 метров, 5 или 6 ключей, хорошее питание, и провод UTP 4 категории), но до этого у меня хоть как-то всё работало.... теперь грустно все!!!