Различия
Показаны различия между двумя версиями страницы.
Следующая версия | Предыдущая версия | ||
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 | ||
+ | </ |