A więc taki bloczek:
Działa kliknięcie na wemos włącza grupę ponowne kliknięcie na wemos wyłącza grupę jest ok czy tak on ma wyglądać.
Problem jest natomiast z klikaniem w apce czy w domoticz switach Grupa działa on / off więc wprowadza zamęt czy wystarczy zmienić ustawienie typ przełącznika ? Obecnie typ przełącznika mam on/off i tak działa które ustawienie odpowiada jako przycisk ?
Powyższy problem rozwiązałem bloczkiem:
Pewnie byłoby lepiej zmienić działanie switcha Grupa na działanie przycisku.
Proszę o ocenę działań w blockly.
Tak na przyszłość ten przełącznik "Grupa" można ustawić jako PushOnButton i wtedy nie trzeba nic wyłączać, lub w samym przełączniku ustawić tak jak na foto
Wtedy blok jest prostszy
Jedno co bym zrobił na pewno, to zmiana wartości zmiennej powinna się wykonać z 1 sek opóźnieniem . Zapobiegnie to przypadkowej pętli przy szybkim przełączaniu przycisku
Jeżeli daje przełącznik Grupa na PushOnButton jak on wtedy działa ? Jako przycisk chwilowy ? Jak długą chwilę ?
Zmieniłem na PushOnButton i bloczek:
Działa poprawnie zmienna opóźniona o 1 sekundę ale dalej nie kumam jaką tak naprawdę funkcje spełnia.
Czy przełącznik ustawiony jak na foto @isom działa również chwilowo jak przycisk ?
@daro1003 w tym blockly masz błąd , na końcu zmienna ma się ustawić na 0
Przycisk ustawiony na PushOnButton działa tylko przez czas kliknięcia
Przełącznik ustawiony jak na moim foto działa tak że po włączeniu sam się wyłącza po sekundzie i ten czas można sobie ustawić jaki pasuje
PS Nie ma błędu w tym skrypcie to ja źle spojrzałem
@isom ok dzięki za sprawdzenie.Pierwszy skrypt będę próbował ćwiczyć z innymi skryptami mianowicie czujka ruchu plus żarówka - da się to ogarnąć w blockly ?
@daro1003 proste zależności czujnik - żarówka plus jakiś lux spokojnie ogarniesz.
@isom chce przełożyć twój skrypt dzVents
"Skrypt po naruszeniu PIR aktywuje lampe na ustawiony czas
kazde nastepne naruszenia w tym czasie resetuja licznik i czas liczony jest od nowa
po wlaczeniu lampy prez przycisk, lub z poziomu Domoticz (brak aktywnego PIR), lampa pozostaje wlaczona do
czasu jej recznego wylaczenia"
na blockly czy jest możliwe ?
@isom No właśnie zrobiłem zapalanie żarówki z pira pod warunkiem ze jest mniej niż 10lux i na określony czas i fajnie działań ale jak chciałem zrobić resetowanie czasu po wykryciu ruchu to się zawiesiłem czyli nie da się tego zrobić ? Pomijając już opcje z wyłącznikiem na stałe.
Możesz dodać do swojego skryptu czujnik lux ??
@daro1003 sprawdź to , tylko nie miałem czasu testować . Jak coś nie będzie działać wstaw tu logi z domoticz
maxLux =15 to poziom poniżej którego ma działać i możesz to zmienić na ile pasuje
--[[ -- Lampa + czujnik + lux Skrypt po naruszeniu PIR aktywuje lampe na ustawiony czas kazde nastepne naruszenia w tym czasie resetuja licznik i czas liczony jest od nowa po wlaczeniu lampy prez przycisk, lub z poziomu Domoticz (brak aktywnego PIR), lampa pozostaje wlaczona do czasu jej recznego wylaczenia ]]-- return { on = { devices = { 'sonoff', -- nazwa wlacznik w domoticz 'PIR ' -- nazwa czujnika w domoticz } }, data = { warunek = { initial = false }, }, logging = { level = domoticz.LOG_ERROR, marker = 'PIR Lampa', }, execute = function(dz, item) local Lux = dz.devices('Test Lux').lux -- nazwa czujnika LUX local maxLux = 15 local maxSeconds = 120 local motion = dz.devices('PIR') -- nazwa czujnika local switch = dz.devices('sonoff') -- nazwa włacznika if item == motion and Lux < maxLux then -- detekcja aktywna z warunkiem lux if motion.state == 'On' and switch.state == 'Off' then -- detekcja wyzwala skrypt dz.data.warunek = true switch.cancelQueuedCommands() switch.switchOn().checkFirst() elseif motion.state == 'On' and switch.state == 'On' and dz.data.warunek == true then switch.cancelQueuedCommands() elseif motion.state == 'Off' and dz.data.warunek == true then switch.switchOff().afterSec(maxSeconds).checkFirst() end elseif item == switch and item.state == 'On' and motion.state == 'Off' then dz.data.warunek = false end end }
Hej @isom zamontowałem trochę urządzeń na budowie i zacząłem wprowadzać Twoje rady.
Zapakowałem skrypt od Ciebie:
Zmieniłem nazwy na te które funkcjonują u mnie ale brak efektu. W domoticz idzę stan czujki ale nie zapala mi sonoffa Garaż powiedz gdzie coś mam zle czy skrypt zle dodany do domoticz ??
Dodaje jak na screenie następnie usuwam kod który tam jest i wklejam ten od Ciebie klikam zapisz i włącz no i lipa.
No i Logi z których nie wiele wnioskuję:
Znalazłem problem i wkleiłem pierwszą część kodu z opisem:
No i logi lecą teraz tak:
Ale nadal nie działa oświetlenie z czujki.
Zauważyłem jeszcze błąd w nazwie czujnika w sekcji użytkowe i zmieniłem i teraz logi lecą tak jak poniżej ale nadal oświetlenie nie jest włączane.
@daro1003 Satel z tego co wiem nie przekazuje z czujnika ON/OFF ani OPEN?CLOSED tylko 1 i 3 więc będzie problem. Możesz spróbować z poniższym skryptem a jak nie zadziała to trzeba najpierw zrobić sobie wirtualny czujnik i skrypt nawet w blockly , który będzie aktywował ten wirtualny czujnik na podstawie Satela. Czyli gdy satel = 3 ustaw Wirtualny na ON
local motion = 'Czujka Garaz' local switch = 'Garaż' -- Nie zmieniaj nic poniżej oprócz ustawień czasu podtrzymania return { on = { devices = { motion, switch }, }, data = { PIR_ruch = {initial=false} }, logging = { level = domoticz.LOG_DEBUG, marker = "Czujnik PIR Garaż" }, execute = function(dz, item) local czas = 15 -- Czas podtrzymania oświetlenia local motion = dz.devices(motion) local switch = dz.devices(switch) if item == motion then if switch.active and motion.active then if dz.data.ruch then switch.cancelQueuedCommands() switch.switchOff().afterSec(czas).silent().checkFirst() end elseif motion.active and not switch.active then dz.data.ruch = true switch.cancelQueuedCommands() switch.switchOn().forSec(czas).silent().checkFirst() end else -- switch if switch.active and not motion.active then dz.data.ruch = false end end end }
Tak dokładnie zwykły stan czujki podaje jako 1 a naruszenie jako 3 to działa bo widzę w Domoticzu.
Ogólna integracja działa bo z Domoticza otwieram elektro zamek podłączony do zamka Satela INT-SCR i również widzę stan czujnika drzwi podłączonego do tego zamka więc integracja się udała nawet bez problemów.
Niestety @Isom nie działa więc co skrypt w pierwszej postaci i robię czujnik w domoticz który jest aktywowany przez czujnik z czujki Satela.
Ok zrobiłem takie zdarzenie nie wiem czy dobrze na switch bo nie wiem jaki czujnik wybrać:
@daro1003 podstaw w skrypcie 2 ( jest łatwiej i jest bardziej uniwersalny) zamiast Czujka Garaz ten Czujka pir i powinno działać
Podstawiłem do skryptu który mi dziś wysłałeś no i działa.
Ale - czujka nie resetuje czasu zapala świtał świeci przez ustawiony czas i gaśnie mimo że wykrywa czujka ruch. Dasz rade sprawdzić skrypt ? Ten pierwszy działał jak opisałeś:
"Skrypt po naruszeniu PIR aktywuje lampe na ustawiony czas
kazde nastepne naruszenia w tym czasie resetuja licznik i czas liczony jest od nowa
po wlaczeniu lampy prez przycisk, lub z poziomu Domoticz (brak aktywnego PIR), lampa pozostaje wlaczona do
czasu jej recznego wylaczenia"
Bo jeszcze w tm temacie wysłałeś mi skrypt który ma dodatkowo lux i nie włączy czujka oś jeśli lux nie puści to byłby dopiero bajer jak by to odpalić.
Tu masz trzecią wersję , lux sobie dodasz kopiując bo to łatwizna
return { on = { devices = { 'Lampa', -- nazwa wlacznik w domoticz 'PIR' -- nazwa czujnika w domoticz } }, data = { warunek = { initial = false }, }, logging = { level = domoticz.LOG_DEBUG, marker = 'PIR Lampa', }, execute = function(dz, item) local maxSeconds = 10 local motion = dz.devices('PIR') -- nazwa czujnika local switch = dz.devices('Lampa') -- nazwa włacznika if item == motion then -- detekcja aktywna if motion.active and not switch.active then -- detekcja wyzwala skrypt dz.data.warunek = true switch.cancelQueuedCommands() switch.switchOn().checkFirst() elseif motion.active and switch.active and dz.data.warunek == true then switch.cancelQueuedCommands() elseif not motion.active and dz.data.warunek == true then switch.switchOff().afterSec(maxSeconds).checkFirst() end elseif item == switch and item.active and not motion.active then dz.data.warunek = false end end }
local Lux = dz.devices('Test Lux').lux -- nazwa czujnika LUX local maxLux = 15
Tylko te dwie linie trzeba dodać ?
Sprawdzałem @isom i działa trzecia wersja jak należy teraz tylko pasuje dodać lux i będzie spoko.
Ty jesteś taki szpecu to dało by się jeszcze ten skrypt zmodernizować aby działał jak obecnie v 3 (bez lux) tylko żeby np ktoś odpala łącznikiem na ścianie wchodzi wychodzi i nie gasi to jeśli czujka nie wykrywa ruchu przez ustawiony czas np już większy 3-4 minuty to gaśnie światło dobre na łazienki.
@daro1003 jeszcze nie dodałeś tego czujnika lux ? Przecież to trzy linijki kodu w tym dwie już sam wskazałeś i na dodatek masz gotowy skrypt do porównania .
Co do wyłączania oświetlenia gdy ktoś włączy łącznikiem i zapomni to w tym skrypcie jest mało realne, bo włączenie przez łącznik powoduje ignorowanie PIR. Tzn polecenia które teoretycznie powinny się wykonać na podstawie PIR są ignorowane. Wykonanie tych poleceń jest możliwe tylko wtedy gdy PIR jako pierwszy uruchomi oświetlenie .
Na łazienki i inne pralnie gdzie są zamontowane PIR można użyć skryptu, który sprawdza ile czasu w danym pomieszczeniu oświetlenie jest On i jak przekroczy próg ustawiany na początku skryptu to wyłączy wszystkie włączone przełączniki wymienione w tabeli
W skrypcie można dodać dowolną ilość przełaczników
local THRESHOLD = 30 -- czas w minutach przez jaki oświetlenie może być ON local devicesToCheck = { 'Lampa1', -- Tabela przełączników zmień nazwy na swoje 'Lampa2', 'Lampa3', } return { on = { devices = devicesToCheck, timer = { 'every 5 minutes' }, }, data = { warunek = { initial = {} }, }, logging = {level = domoticz.LOG_DEBUG, marker = 'Kontrola oświetlenia', }, execute = function(dz, item) if item.isTimer then for index, deviceName in ipairs(devicesToCheck) do local device = dz.devices(deviceName) dz.log('device name ' .. device.name, dz.LOG_DEBUG) dz.log('device state ' .. device.state, dz.LOG_DEBUG) dz.log('device lastUpdate ' .. device.lastUpdate.minutesAgo, dz.LOG_DEBUG) if device.state == 'On' and device.lastUpdate.minutesAgo >= THRESHOLD and dz.data.warunek[deviceName] ~= true then device.switchOff() dz.data.warunek[deviceName] = true end end else dz.data.warunek[item.name] = false end end }