Easy Scripting

Данный раздел предназначен для русскоязычных пользователей. Если вы владеете английским, рекомендуем также просмотреть общую ветку обсуждений на английском.
Post Reply
bulgar
Posts: 7
Joined: 18 Feb 2021 22:18

Easy Scripting

Post by bulgar »

Здравствуйте.
Задумка шевелить краны по расписанию, чтоб не закисли. Для этого завел виртуальный переключатель (устройство пустышка) чтобы включать по расписанию, Easy Scripting отслеживать его и дергать гидролоки в определенной последовательности
вот скрипт

Code: Select all

// 17-0-37 cold, 16-0-37 hot water hydrolocks
### DummyDevice_31 // гидролок v
if (vdev("DummyDevice_31").value() == "on") {
   if (vdev("ZWayVDev_zway_17-0-37").value() == "off") {
    vdev("ZWayVDev_zway_17-0-37").on()
    setTimer("HC_off", () => {vdev("ZWayVDev_zway_17-0-37").off()}, 15)
  }
  else{
    vdev("ZWayVDev_zway_17-0-37").off()
    setTimer("HC_on", () => {vdev("ZWayVDev_zway_17-0-37").on()}, 15)
  }
  if (vdev("ZWayVDev_zway_16-0-37").value()  == "off") {
    vdev("ZWayVDev_zway_16-0-37").on()
    setTimer("HH_off", () => {vdev("ZWayVDev_zway_16-0-37").off()}, 15)
  }
  else{
    vdev("ZWayVDev_zway_16-0-37").off()
    setTimer("HH_on", () => {vdev("ZWayVDev_zway_16-0-37").on()}, 15)
  }
  vdev("DummyDevice_31").off()
  }
вот кусок лога

Code: Select all

[2022-01-02 17:45:46.479] [I] [core] ---  DummyDevice_31 performCommand processing: {"0":"on","1":{}}
[2022-01-02 17:45:46.483] [I] [core] Notification: device-info (device-OnOff): {"dev":"гидролок v","l":"on","location":9}
[2022-01-02 17:45:46.498] [I] [core] [BaseModule-17] Set lastLevel to on for DummyDevice_31 (was off)
[2022-01-02 17:45:49.662] [I] [zway] Adding job: Get background noise level
[2022-01-02 17:45:49.666] [D] [zway] SENDING: ( 01 03 00 3B C7 )
[2022-01-02 17:45:49.668] [D] [zway] RECEIVED ACK
[2022-01-02 17:45:49.668] [D] [zway] RECEIVED: ( 01 05 01 3B AE A5 CB )
[2022-01-02 17:45:49.668] [D] [zway] SENT ACK
[2022-01-02 17:45:49.668] [D] [zway] SETDATA controller.data.statistics.backgroundRSSI.channel1 = 174 (0x000000ae)
[2022-01-02 17:45:49.668] [D] [zway] SETDATA controller.data.statistics.backgroundRSSI.channel2 = 165 (0x000000a5)
[2022-01-02 17:45:49.668] [D] [zway] SETDATA controller.data.statistics.backgroundRSSI.channel3 = 127 (0x0000007f)
[2022-01-02 17:45:49.668] [I] [zway] Job 0x3b (Get background noise level): RSSI Ch#1: -91 dBm, Ch#2: -91 dBm, Ch#3: not available
[2022-01-02 17:45:49.668] [D] [zway] Job 0x3b (Get background noise level): success
[2022-01-02 17:45:49.668] [I] [zway] Removing job: Get background noise level
[2022-01-02 17:46:02.163] [D] [zway] RECEIVED: ( 01 14 00 04 00 06 0A 71 05 00 00 00 FF 07 00 01 08 CA 00 01 10 BD )
[2022-01-02 17:46:02.163] [D] [zway] SENT ACK
[2022-01-02 17:46:02.163] [D] [zway] SETDATA devices.6.data.lastReceived = 0 (0x00000000)
[2022-01-02 17:46:02.163] [D] [zway] SETDATA devices.6.instances.0.commandClasses.113.data.7.eventParameters = byte[1]
[2022-01-02 17:46:02.164] [D] [zway]   ( 08 )
[2022-01-02 17:46:02.164] [D] [zway] SETDATA devices.6.instances.0.commandClasses.113.data.7.event = 0 (0x00000000)
[2022-01-02 17:46:02.165] [D] [zway] SETDATA devices.6.instances.0.commandClasses.113.data.7.eventString = ""
[2022-01-02 17:46:02.165] [D] [zway] SETDATA devices.6.instances.0.commandClasses.113.data.7.status = 255 (0x000000ff)
[2022-01-02 17:46:02.165] [D] [zway] SETDATA devices.6.instances.0.commandClasses.113.data.7 = Empty
[2022-01-02 17:46:02.220] [D] [zway] RECEIVED: ( 01 0E 00 04 00 06 04 30 03 00 0C CA 00 01 10 13 )
[2022-01-02 17:46:02.221] [D] [zway] SENT ACK
[2022-01-02 17:46:02.221] [D] [zway] SETDATA devices.6.data.lastReceived = 0 (0x00000000)
[2022-01-02 17:46:02.221] [D] [zway] SETDATA devices.6.instances.0.commandClasses.48.data.12.level = False
[2022-01-02 17:46:02.222] [D] [zway] SETDATA devices.6.instances.0.commandClasses.48.data.12 = Empty
[2022-01-02 17:46:02.239] [I] [core] Notification: device-info (device-OnOff): {"dev":"Burglar Alarm (#6)","l":"off","location":6}
[2022-01-02 17:46:02.279] [I] [core] Notification: device-info (device-OnOff): {"dev":"Motion (#6)","l":"off","location":6}
[2022-01-02 17:46:02.289] [I] [core] [BaseModule-17] Set lastLevel to off for ZWayVDev_zway_6-0-113-7-8-A (was on)
[2022-01-02 17:46:02.313] [I] [core] [BaseModule-17] Set lastLevel to off for ZWayVDev_zway_6-0-48-12 (was on)
[2022-01-02 17:46:10.072] [D] [zway] Job 0x3b: deleted from queue
[2022-01-02 17:46:19.677] [I] [zway] Adding job: Get background noise level
[2022-01-02 17:46:19.682] [D] [zway] SENDING: ( 01 03 00 3B C7 )
[2022-01-02 17:46:19.684] [D] [zway] RECEIVED ACK
[2022-01-02 17:46:19.684] [D] [zway] RECEIVED: ( 01 05 01 3B AD A8 C5 )
[2022-01-02 17:46:19.684] [D] [zway] SENT ACK
[2022-01-02 17:46:19.684] [D] [zway] SETDATA controller.data.statistics.backgroundRSSI.channel1 = 173 (0x000000ad)
[2022-01-02 17:46:19.684] [D] [zway] SETDATA controller.data.statistics.backgroundRSSI.channel2 = 168 (0x000000a8)
[2022-01-02 17:46:19.684] [D] [zway] SETDATA controller.data.statistics.backgroundRSSI.channel3 = 127 (0x0000007f)
[2022-01-02 17:46:19.684] [I] [zway] Job 0x3b (Get background noise level): RSSI Ch#1: -88 dBm, Ch#2: -88 dBm, Ch#3: not available
[2022-01-02 17:46:19.684] [D] [zway] Job 0x3b (Get background noise level): success
[2022-01-02 17:46:19.684] [I] [zway] Removing job: Get background noise level
[2022-01-02 17:46:31.138] [I] [core] ---  DummyDevice_31 performCommand processing: {"0":"off","1":{}}
[2022-01-02 17:46:31.142] [I] [core] Notification: device-info (device-OnOff): {"dev":"гидролок v","l":"off","location":9}
[2022-01-02 17:46:31.233] [I] [core] [BaseModule-17] Set lastLevel to off for DummyDevice_31 (was on)
[2022-01-02 17:46:40.063] [D] [zway] Job 0x3b: deleted from queue
девайс #6 датчик движения, я шевелюсь перед компом, он меня видит
вопрос к знатокам - где ошибка?
контролируемое событие выбрано, скрипт активен, событие происходит - ОТВЕТНОГО ДЕЙСТВИЯ НЕТ
пробовал и без условия (первое, в начале скрипта), и триггер ставить на физическое устройство, результат тот же

тренирую этот навык :D точнее пытаюсь "завести" срипт начиная с z-way 3.2.0, это просто точка отсчета времени, не багрепорт

кстати, piz2w меньше месяца стоит, до неё была pi0w - да, загрузка проца уменьшилась с 10 до 1%, новая заметно бодрее подгружает список кандидатов "выбрать файл описания устройства z-wave" на http://z-way-server.local:8083/expert/# ... ew/dev_num и "фильтр оповещений". и всего-то! на мои 24 устройства ХВАТАЕТ pi0w.
RaspberryPi zero 2 W BullsEye lite, z-way 4.0.2-lws16
Razberry2 [5.39/35498] EU
User avatar
PoltoS
Posts: 7579
Joined: 26 Jan 2011 19:36

Re: Easy Scripting

Post by PoltoS »

Попробуйте комментарий убрать в первой строке. Скрипт ищет в начале ###
bulgar
Posts: 7
Joined: 18 Feb 2021 22:18

Re: Easy Scripting

Post by bulgar »

Спасибо, Сергей, попробовал. не работает
открыл скрипт в Chrome, попробовал - в событиях DummyDevice_31 есть, 16-0-37 и 17-0-37 тоже, в устройствах есть, а при сохранении скрипта в событиях и логе появляется

Code: Select all

[2022-01-05 20:02:15.096] [I] [core] --- Starting module Простые Скрипты
[2022-01-05 20:02:15.156] [I] [core] Notification: error (module): SyntaxError: Unexpected token )

Code: Select all

### DummyDevice_31 // гидролок v

if (vdev("DummyDevice_31").value() === "on") {
 if (vdev("ZWayVDev_zway_17-0-37").value() === "on") {
  vdev("ZWayVDev_zway_17-0-37").off()
  setTimer("HC_on", () => {vdev("ZWayVDev_zway_17-0-37").on()}, 15)
 }
 else {
  vdev("ZWayVDev_zway_17-0-37").on()
  setTimer("HC_off", () => {vdev("ZWayVDev_zway_17-0-37").off()}, 15)
  }
 if (vdev("ZWayVDev_zway_16-0-37").value() === "on") {
  vdev("ZWayVDev_zway_16-0-37").off()
  setTimer("HH_on", () => {vdev("ZWayVDev_zway_16-0-37").on()}, 15)
 }
 else {
  vdev("ZWayVDev_zway_16-0-37").on()
  setTimer("HH_off", () => {vdev("ZWayVDev_zway_16-0-37").off()}, 15)
  }
}
vdev("DummyDevice_31").off()

 
вот тут совсем ничего не понимаю - переписал скрипт в "продвинутом редакторе", в хроме, всё проверил и всеравно. я в js ноль, вопрос - конструкция таймера в примере не совпадает с тем, что предлагает этот редактор. может, собака там зарыта? в примерах проверка состояния "==", в редакторе "==="...
RaspberryPi zero 2 W BullsEye lite, z-way 4.0.2-lws16
Razberry2 [5.39/35498] EU
User avatar
PoltoS
Posts: 7579
Joined: 26 Jan 2011 19:36

Re: Easy Scripting

Post by PoltoS »

Стрелочные функции не надо использовать. Z-Way не поддерживает ES6
bulgar
Posts: 7
Joined: 18 Feb 2021 22:18

Re: Easy Scripting

Post by bulgar »

так я пример взял как шаблон и "передрал 1:1", т.е. надо setTimer ( 'smbdy_name', function() {желаемое дйствие}, XX)?
Last edited by bulgar on 05 Jan 2022 20:07, edited 4 times in total.
RaspberryPi zero 2 W BullsEye lite, z-way 4.0.2-lws16
Razberry2 [5.39/35498] EU
User avatar
PoltoS
Posts: 7579
Joined: 26 Jan 2011 19:36

Re: Easy Scripting

Post by PoltoS »

А у нас в шаблоне стрелочные функции? ()=> ... ?
bulgar
Posts: 7
Joined: 18 Feb 2021 22:18

Re: Easy Scripting

Post by bulgar »

дадада))

Code: Select all

Примеры, как просто писать скрипты автоматизации на JavaScript (ECMA5).

В начале определяем устройства, при изменении состояния которых будет запускаться скрипт (может быть несколько):

### ZWayVDev_zway_6-1-48
### ZWayVDev_zway_4-1-37


Включить/выключить устройство:

vdev("ZWayVDev_zway_4-1-37").on()
vdev("ZWayVDev_zway_4-1-37").off()


Установить уровень:

vdev("ZWayVDev_zway_5-1-38").set(55)


Получить значение:

var sensorValue = vdev("ZWayVDev_zway_6-1-48").value()


Отправить HTTP запрос:

var req = {method: "GET", async: true}
req.url = "http://192.168.1.108/19-1"
http.request(req)


Включить/выключить устройство в зависимости от состояния датчика,
Если-Тогда-Иначе выражение:

### ZWayVDev_zway_6-1-48
if (vdev("ZWayVDev_zway_6-1-48").value() == "on") {
    vdev("ZWayVDev_zway_4-1-37").on()
}
else {
    vdev("ZWayVDev_zway_4-1-37").off()
}


Отправить HTTP запрос в зависимости от состояния датчика,
Если-Тогда-Иначе выражение:

### ZWayVDev_zway_6-1-48
var req = {method: "GET", async: true}
if (vdev("ZWayVDev_zway_6-1-48").value() == "on") {
    req.url = "http://192.168.1.108/on"
}
else {
    req.url = "http://192.168.1.108/off"
}
http.request(req)


Выполнить какое либо действие по истечении времени (время задается в секундах)

### ZWayVDev_zway_4-1-37
setTimer("myTimer", () => {
    vdev("ZWayVDev_zway_4-1-37").on()
}, 50)


Отменить таймер (функция не будет выполнена)

stopTimer("myTimer")


Не делайте бесконечные или медленные циклы!
RaspberryPi zero 2 W BullsEye lite, z-way 4.0.2-lws16
Razberry2 [5.39/35498] EU
User avatar
PoltoS
Posts: 7579
Joined: 26 Jan 2011 19:36

Re: Easy Scripting

Post by PoltoS »

Хм... Уточню, но,в роде, не должны работать. Без них получилось?
bulgar
Posts: 7
Joined: 18 Feb 2021 22:18

Re: Easy Scripting

Post by bulgar »

не пробовал, говорю же, ноль в js, только предполагаю "точку отказа". и какую function туда ставить? или прямо "в лоб" просто function()?
RaspberryPi zero 2 W BullsEye lite, z-way 4.0.2-lws16
Razberry2 [5.39/35498] EU
bulgar
Posts: 7
Joined: 18 Feb 2021 22:18

Re: Easy Scripting

Post by bulgar »

да, просто "в лоб". блин...
спасибо!
RaspberryPi zero 2 W BullsEye lite, z-way 4.0.2-lws16
Razberry2 [5.39/35498] EU
Post Reply