Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| sw:openhab:examples:light:ecma [2023/05/23 11:09] – создано lazygatto | sw:openhab:examples:light:ecma [2023/05/24 13:19] (текущий) – lazygatto | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| ====== JSScripting ====== | ====== JSScripting ====== | ||
| + | |||
| + | Теперь данный скрипт можно установить как Rule Template из OpenHAB Marketplace | ||
| + | |||
| + | https:// | ||
| + | |||
| + | Вариант " | ||
| === Универсальный скрипт для ламп и диммеров === | === Универсальный скрипт для ламп и диммеров === | ||
| - | Данный скрипт позволяет унифицировать | + | Данный скрипт позволяет унифицировать  | 
| - | Требования: | + | |
| - | Надстройка Javascript Automation (ECMA2011) | + | Каждому выключателю назначается свой источник света через Custom Metadata, Namespace: linkedItem. | 
| - | Установлен последний openhab-js | + | |
| - | Кнопки, | + | === Требования:  | 
| + | |||
| + |    | ||
| + |    | ||
| + |    | ||
| + | |||
| + | === README === | ||
| + | |||
| + | Необходимо поместить все выключатели в одну группу. | ||
| + | Далее создать правило, | ||
| + | < | ||
| + | triggers: | ||
| + |   - id: " | ||
| + |     configuration: | ||
| + | groupName: gAllSwitches | ||
| + | state: CLOSED | ||
| + |       previousState: | ||
| + | type: core.GroupStateChangeTrigger | ||
| + | </ | ||
| + | |||
| + | Также необходимо добавить для выключателей пользовательские метаданные (Custom Metadata) с именем (Namespace) " | ||
| + | |||
| + | === Принцип работы === | ||
| + | |||
| + | Скрипт поддерживает выключатели и диммеры. Определение происходит автоматически, | ||
| + | |||
| + | **Одно короткое нажатие: | ||
| + |   * включение/ | ||
| + |   * включение/ | ||
| + | |||
| + | **Длительное нажатие: | ||
| + |   * включение/ | ||
| + | * диммеры увеличиваются до 100% / уменьшатся до значений minDim. Если остановится и снова нажать кнопку - происходит изменение направление диммирования. | ||
| + | |||
| + | Дополнительно Вы можете прописать любые другие действия для двойных/ | ||
| + | |||
| + | В переменных в начале скрипта можно прописать иные временные задержки для регистрации коротких нажатий, | ||
| + | |||
| + | Сам скрипт необходимо добавить в поле Action и выбрать " | ||
| + | |||
| + | < | ||
| + | /* | ||
| + | The MIT License (MIT) | ||
| + | Copyright © 2023 LazyGatto, | ||
| + | based on Felix Krämer script | ||
| + | https:// | ||
| + | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), | ||
| + | |||
| + | Requirements: | ||
| + | Javascript Automation addon (ECMA2011) | ||
| + | Latest openhab-js installed | ||
| + | A button items configured as switches or contacts (see below ' | ||
| + | |||
| + | README: | ||
| + | You have to place all your switches/ | ||
| + | Also you have to add custom metadata for all your switches/ | ||
| + | |||
| + | Script supports switches and dimmers. | ||
| + | For one short press it will turn ON/OFF switches and dimmers. | ||
| + | For long press: | ||
| + | - switches will turn ON/OFF | ||
| + | - dimmers will increase to 100 / decrease to minDim values, stop, press and hold again button will revert dimming direction. | ||
| + | |||
| + | You can provide any custom actions for double/ | ||
| + | variable to detect multiple buttom presses. | ||
| + | */ | ||
| + | |||
| + | // ==== Configuration ==== | ||
| + | |||
| + | // Delays: | ||
| + | var delayMulti = 350; // registering multiple pushes | ||
| + | var delayDimStep = 100; // pause between in-/ | ||
| + | var dimStep = 2; // step to increase/ | ||
| + | var minDim = 4; // minimum level for dimming | ||
| + | |||
| + | var switchState = { | ||
| + |   ON: ' | ||
| + |   OFF: ' | ||
| + | } | ||
| + | |||
| + | // ==== END Configuration ==== | ||
| + | |||
| + | var switchTriggered = items.getItem(triggeringItem.name); | ||
| + | |||
| + | // Change the behaviour for different button presses: | ||
| + | // stor.pressCount - button pressed times | ||
| + | function shortPressAction(stor) { | ||
| + | |||
| + | switch (stor.pressCount) { | ||
| + | |||
| + | // 1 press to toggle light on/off | ||
| + | case 1: | ||
| + | |||
| + | switch (stor.linkedItem.type) { | ||
| + | |||
| + |         case ' | ||
| + |           stor.linkedItem.sendCommand(stor.linkedItem.state.toString() == " | ||
| + | break; | ||
| + | |||
| + |         case ' | ||
| + |           stor.linkedItem.sendCommand(stor.linkedItem.state == 0 ? stor.dimPreviousState : " | ||
| + | break; | ||
| + | } | ||
| + | |||
| + | break; | ||
| + | |||
| + | // 2 presses to switch between color temperatures | ||
| + | /* | ||
| + | case 2: | ||
| + | var temp; | ||
| + | if (linkedItem.state == 0) | ||
| + | temp = 33; | ||
| + | else if (linkedItem.state == 100) | ||
| + | temp = 0; | ||
| + | else | ||
| + | temp = 100; | ||
| + |       linkedItem.sendCommand(temp); | ||
| + | break; | ||
| + | */ | ||
| + | |||
| + | // Add your Additional push count here like: | ||
| + | /* | ||
| + | case 3: | ||
| + | // do something | ||
| + | break; | ||
| + | */ | ||
| + | |||
| + | default: | ||
| + |       console.log(' | ||
| + | } | ||
| + | } | ||
| + | |||
| + | function resetStorage(stor) { | ||
| + | stor.btnTimer = null; | ||
| + | stor.pressCount = 0; | ||
| + | stor.dimTimer = null; | ||
| + |   cache.shared.put(stor.cacheId, | ||
| + | } | ||
| + | |||
| + | function dimItem(stor) { | ||
| + | |||
| + | var dimToSet = null; | ||
| + | |||
| + | //early exit | ||
| + | if (stor.switchTriggered.state.toString() == switchState.OFF) { | ||
| + |     resetStorage(stor); | ||
| + | return; | ||
| + | } | ||
| + | |||
| + | if (stor.dimUp == true) { | ||
| + | dimToSet = Number(stor.linkedItem.state) + dimStep; | ||
| + | if (dimToSet > 100) { | ||
| + | dimToSet = 100 | ||
| + |       resetStorage(stor); | ||
| + | } | ||
| + | |||
| + | } else { | ||
| + | dimToSet = Number(stor.linkedItem.state) - dimStep; | ||
| + | if (dimToSet < minDim) { | ||
| + | dimToSet = minDim | ||
| + |       resetStorage(stor); | ||
| + | } | ||
| + | |||
| + | } | ||
| + |   stor.linkedItem.sendCommand(dimToSet); | ||
| + | stor.dimPreviousState = dimToSet; | ||
| + | |||
| + | if (stor.dimTimer) { | ||
| + |     stor.dimTimer.reschedule(time.toZDT(delayDimStep)); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | function getPressCountTimer(stor) { | ||
| + | |||
| + | if (stor.switchTriggered.state.toString() == switchState.OFF) { // Short press cases | ||
| + | |||
| + |     shortPressAction(stor); | ||
| + |     resetStorage(stor); | ||
| + | |||
| + | } else { // Hold cases | ||
| + | |||
| + |     resetStorage(stor); | ||
| + | |||
| + | switch (stor.linkedItem.type) { | ||
| + | |||
| + |       case ' | ||
| + |         stor.linkedItem.sendCommand(stor.linkedItem.state.toString() == " | ||
| + | break; | ||
| + | |||
| + |       case ' | ||
| + | // Set dim direction | ||
| + | if (stor.linkedItem.state > 90) { | ||
| + |           console.info(' | ||
| + | stor.dimUp = false; | ||
| + | } else if (stor.linkedItem.state < 10) { | ||
| + |           console.info(' | ||
| + | stor.dimUp = true; | ||
| + | } else { | ||
| + |           console.info(' | ||
| + | stor.dimUp = !stor.dimUp | ||
| + | } | ||
| + | |||
| + | if (stor.dimTimer === null) { | ||
| + |           stor.dimTimer = actions.ScriptExecution.createTimer(stor.dimTimerId, | ||
| + | } | ||
| + |         cache.shared.put(stor.cacheId, | ||
| + | break; | ||
| + | } | ||
| + | |||
| + | } | ||
| + | } | ||
| - | ПРОЧТИ МЕНЯ: | + | if (switchTriggered.state.toString() == switchState.ON) { | 
| - | Вы должны поместить все свои переключатели/ | + | var funcGenerator = function (switchTriggered) { | 
| - | Также вы должны добавить пользовательские метаданные для всех ваших переключателей/ | + |     var cacheId = switchTriggered.name + ' | 
| + |     var linkedItem = items.getItem(switchTriggered.getMetadata(" | ||
| + |     var stor = cache.shared.get(cacheId, | ||
| + |       ' | ||
| + |       ' | ||
| + |       ' | ||
| + |       ' | ||
| + |       ' | ||
| + |       ' | ||
| + |       ' | ||
| + |       ' | ||
| + |       ' | ||
| + | })); | ||
| + |     stor.pressCount++; | ||
| + | if (stor.btnTimer !== null) { | ||
| + |       clearTimeout(stor.btnTimer); | ||
| + | } | ||
| + |     stor.btnTimer = setTimeout(() => getPressCountTimer(stor), | ||
| + | } | ||
| + |   funcGenerator(switchTriggered); | ||
| + | } | ||
| + | </ | ||
| - | Скрипт поддерживает выключатели и диммеры. | + | Если необходимо отдельно вывести информацию обо  | 
| - | Для одного короткого нажатия: | + | |
| - | - включить/выключить  | + | |
| - | - включение/ | + | |
| - | Для длительного нажатия: | + | |
| - | - переключатели будут включать / выключать | + | |
| - | - диммеры увеличатся  | + | |
| - | Вы можете указать любые настраиваемые действия для двойных/ | + | < | 
| - | переменная для обнаружения нескольких нажатий кнопок. | + | uid: widget_96f79b9179 | 
| + | tags: [] | ||
| + | props: | ||
| + | parameters: [] | ||
| + |   parameterGroups: | ||
| + | timestamp: May 23, 2023, 10:53:24 AM | ||
| + | component: f7-card | ||
| + | config: {} | ||
| + | slots: | ||
| + | default: | ||
| + | - component: oh-list | ||
| + | config: | ||
| + | mediaList: true | ||
| + | slots: | ||
| + | default: | ||
| + | - component: oh-repeater | ||
| + | config: | ||
| + | fragment: true | ||
| + | for: item | ||
| + | sourceType: itemsInGroup | ||
| + | groupItem: gAllSwitches | ||
| + |               fetchMetadata: | ||
| + | slots: | ||
| + | default: | ||
| + | - component: oh-list-item | ||
| + | config: | ||
| + |                     accordionList: | ||
| + |                     icon: =' | ||
| + | title: =loop.item.label | ||
| + |                      | ||
| + | ="item Name: " + loop.item.name | ||
| + | footer: > | ||
| + |                       =" | ||
| + | after: =loop.item.state | ||
| + | </ | ||