@bartolomeo nie korzystam z tego skryptu i nie jestem jego autorem , ale wrzucę go na testową malinę i zobaczę w czym jest rzecz
EDIT
Po sprawdzeniu na ostatniej wersji Smarticz , skrypt działa i nie dubluje logów przełącznika od ogrzewania
Tak, sprawdzałem logi wszystkich przełączników zanim zapytałem. Każdy ma podwójną akcję...
Ogólnie to lekko zmodyfikowałem ten skrypt tak aby na podstawie jednego odczytu temperatury uruchamiał od razu np. 5 przekaźników (pętli ogrzewania). Wrzucam poniżej dla jasności, ale moim zdaniem to nie powinno być bezpośrednio przyczyną... Raczej bym szukał gdzieś w tym triggerze, ponieważ jak zmieniam typ wyzwalacza skryptu trigger=time (czyli skrypt uruchamia się 'tylko' raz na minutę), to w logach mam tylko jedno uruchomienie skryptu i tylko jedną zmianę stanu przekaźnika. Jeśli natomiast odpalę poniższy skrypt przy ustawieniu trigger=all, to każdorazowo skrypt uruchamia się 3 razy i zostawia 2 wpisy w logach przekaźnika. Mam ten skrypt zdublowany również na inne 7 heating_unit'ów i tam podobnie skrypt uruchamia się 4 razy i zostawia 2 wpisy w logach 😏 Opcjonalnie zamiast 2 zbiorczych skryptów mogę zrobić 12 niezależnych i wtedy jak mniemam też powinno działać.
Niby to dziwne zachowanie nie przeszkadza w uzyskaniu efektu, ale wolałbym zrozumieć dlaczego tak jest i poprawić... Póki co to i tak faza testowa, ale docelowo to albo trzeba by coś zmodyfikować w skrypcie, albo w sposobie uruchomienia, żeby było jak należy. Moje pytanie ma niski priorytet. Pytam raczej z ciekawości.
local heating_probe = 'Góra temp. (Xiaomi)'
local thermostat_setpoint = 'Zadana temp. góra'
local heating_unit1 = 'Garderoba'
local heating_unit2 = 'Sypialnia'
local heating_unit3 = 'Łazienka górna'
local heating_unit4 = 'Korytarz'
local heating_unit5 = 'Pralnia'
local hysteresis = 0.2
commandArray = {}
-- loop through all the devices
for deviceName,deviceValue in pairs(otherdevices) do
if (deviceName== thermostat_setpoint ) then
if tonumber(deviceValue) < tonumber(otherdevices[heating_probe]-hysteresis) then
--jeśli którekolwiek jest włączone to wyłącza wszystkie z grupy
if (otherdevices[heating_unit1] == "On") or
(otherdevices[heating_unit2] == "On") or
(otherdevices[heating_unit3] == "On") or
(otherdevices[heating_unit4] == "On") or
(otherdevices[heating_unit5] == "On") then
commandArray[heating_unit1]='Off'
commandArray[heating_unit2]='Off'
commandArray[heating_unit3]='Off'
commandArray[heating_unit4]='Off'
commandArray[heating_unit5]='Off'
print("Grzanie góry = Off")
end
elseif tonumber(deviceValue) > tonumber(otherdevices[heating_probe]+hysteresis) then
if (otherdevices[heating_unit] == "Off") or
(otherdevices[heating_unit2] == "Off") or
(otherdevices[heating_unit3] == "Off") or
(otherdevices[heating_unit4] == "Off") or
(otherdevices[heating_unit5] == "Off") then
commandArray[heating_unit1]='On'
commandArray[heating_unit2]='On'
commandArray[heating_unit3]='On'
commandArray[heating_unit4]='On'
commandArray[heating_unit5]='On'
print("Grzanie góry = On")
end
end
end
end
-- loop through all the variables
for variableName,variableValue in pairs(uservariables) do
end
return commandArray
@bartolomeo mimo że używam skryptów dzVents to wydaje mi się że ta Twoja modyfikacja powoduje takie zachowanie , ja ten skrypt też wrzucałem trigger = all , ale tam akcja dla przełącznika wygląda tak
if tonumber(deviceValue) < tonumber(otherdevices[heating_probe]-hysteresis) then
if (otherdevices[heating_unit] == "On") then
commandArray[heating_unit]='Off'
print("Heating is Off")
end
U Ciebie brakuje commandArray
Wrócę trochę do tematu.
Czy jest możliwość aby w tym skrypcie z termostatu który wyświetla temperaturę i wilgotność skrypt pobierał tylko temperaturę ?
W tej wersji która jest zwraca mi błąd:
2020-08-27 19:06:30.381 Error: EventSystem: in Termostat Salon: [string "local heating_probe = 'Salon - Temp/Humidity..."]:14: attempt to perform arithmetic on a string value (field '?')
Z urządzeń które zwracają do Domoticza tylko temperaturę wszystko jest ok
Lub opcja nr 2 - czy jest możliwość żeby utworzyć dwa wirtualne urządzenia (termometr i higrometr) i odczytywać z tego fizycznego po jednej wskazanej wartość - temperaturę do termometru a wilgotność do higrometru.
Wiem że można za pomocą json ustawić sobie jakąś zawartość na np termometrze wirtualnym ale jak ją odczytywać regularnie (np co 5 min.) z tego fizycznego ? Pewnie musi być jakaś zmienna, pętla itd. - nie potrafię tego zrobić
@piotras78 do tego termostatu wystarczy wyselekcjonować temperaturę z tego zespolonego czujnika
Utwórz sobie wirtualny czujnik "Salon Temperatura" i dodaj w zdarzeniach skrypt dzVents , poniżej
W sumie wykombinowałem coś podobnego
return {
active = true,
on = {
['timer'] = {'every 1 minutes'}
},
execute = function(domoticz)
local Temp = domoticz.devices('Salon - Temp./Humidity').Temperature
domoticz.devices('Salon temp').updateTemperature(Temp, domoticz.temp_NOINFO)
end
}
ale zwraca mi w tym wirtulanym urządzeniu wartość 0
Dzięki za Twój skrypt - działa ok
Odnośnie wilgotności to chyba tez trzeba zmienić coś tutaj (temp, dz.temp_NOINFO) ?
Jest jakaś możliwość żeby bezpośrednio w tym skrypcie od termostatów czytał samą temperaturę bez konieczności tworzenia wirtualnych urządzeń?
@piotras78 Można to zmienić w samym skrypcie LUA -termostat , ale ja nie wiem jak bo nie używam LUA a skrypt znalazłem w necie i tylko udostępniłem gotowca. Może ktoś kto się bawi LUA pomoże
Powitać.
Użyłem skryptu do pierwszego pomysłu zrobionego na domoticzu (właśnie termostatu)
Użyłem czujnika DHT11 (temperatura + wilgotność), ale zastosowałem sie do info w tym właśnie gotowcu tj
-- Use when a combined sensor (e.g. temperature and humidity) is used
-- Replace in "otherdevices[heating_probe]" to "otherdevices[heating_probe]" by "temp_only" (in the 2nd "if" and in the "elseif".
-- Remove the -- in the next two lines:
local naartekst = (tostring (otherdevices[heating_probe]))
local temp_only = (string.sub(naartekst,1,4)) -- the digits (1,4) do point out what characters of the string are needed.
Ale mam pytanie ? czy któryś z kolegów podpowie jak zrobić, żeby wiele czujników i wiele wirtualnych termostatów obsługiwało jeden włącznik ?
tzn mam kilka pomieszczeń - w każdym jest czujnik temp i do każdego pomieszzenia tworze sobie wirtualny termostat
a to wszystko steruje mi tylko jednym włącznikiem ?
Zwykle jest jeden termostat i jeden przełącznik. Dobrze to widać jak ktoś ma kocioł gazowy i kaloryfery w pokoju. Wtedy termostat (sterowanie) umieszcza się z reguły w największym/najchłodniejszym/reprezentatywnym pokoju. I on steruje przekaznikiem.
@runner2 poniżej masz przykład dzVents zamiast Lua dwa termostaty + termometry i jeden przekaźnik .
Załączenie gdy spadnie temperatura na jednym z termometrów + histereza
Wyłącznie gdy oba będą powyżej nastaw termostatów + histereza
dzięki. tak samo wlasnie sobie to rozpisałem logicznie. Muszę tylko usiąść i spróbuję to rozpisac to w LUA.
tzn włączam przekaznik gdy jedna z temperatur jest poniżej zadanej (jest spełniony jeden z warunków)
a wyłączanie następuje gdy wszystkie temperatury są powyżej zadanej.
musze zamówić kilka czujników i xabrac sie do konfiguracji.
hmm u mnie działa elegancko ale chciałem jeszcze dorobić obsługę kontraktronu w oknie ktoś ma jakiś pomysł co dokładnie dopisać
@stanislawprzystalski może bardziej precyzyjnie napiszesz. Jak ma wpływać ten kontaktron na stan termostatu i czy chcesz to w LUA czy może być w dzVents ? Która wersja działa u Ciebie ?
potrzebuje lekko przebudować o obsługę kontraktronu w oknie na zasadzie jeśli okno otwarte
termostat zostaje wyłączony niestety ale w LUA jestem NOGA i nie bardzo wiem co gzie dopisać
idea jest taka mam kilka pokoi w każdym mam czujnik temperatury i po otwarciu okna ogrzewanie
dla tego termostatu ma zostać wyłączone właśnie usiłuje to wyklikać w Blockly ale też ciężko idzie :-)
local heating_probe = 'Nazwa czujnika'
local thermostat_setpoint = 'Nazwa termostatu'
local heating_unit = 'Nazwa przełącznika' -- Use when a combined sensor (e.g. temperature and humidity) is used
-- Replace in "otherdevices[heating_probe]" to "otherdevices[heating_probe]" by "temp_only" (in the 2nd "if" and in the "elseif".
-- Remove the -- in the next two lines: --local naartekst = (tostring (otherdevices[heating_probe]))
--local temp_only = (string.sub(naartekst,1,4)) -- the digits (1,4) do point out what characters of the string are needed. local hysteresis = 0.1 commandArray = {} -- loop through all the devices
for deviceName,deviceValue in pairs(otherdevices) do
if (deviceName== thermostat_setpoint ) then if tonumber(deviceValue) < tonumber(otherdevices[heating_probe]-hysteresis) then if (otherdevices[heating_unit] == "On") then
-- commandArray['SendNotification']='Heating is off'
commandArray[heating_unit]='Off'
print("Heating is Off")
end elseif tonumber(deviceValue) > tonumber(otherdevices[heating_probe]+hysteresis) then
if (otherdevices[heating_unit] == "Off") then
commandArray[heating_unit]='On'
-- commandArray['SendNotification']='Heating is on'
print("Heating is On")
end
end
end
end -- loop through all the variables
for variableName,variableValue in pairs(uservariables) do end
return commandArray
@stanislawprzystalski Mogę ci całość napisać w dzVents , jeżeli zainteresowany to pisz
@stanislawprzystalski Skrypt musisz dodać w zdarzeniach jako dzVents(ALL) , po wykasowaniu całej zawartości przykładów, które tam zobaczysz wklejasz to co poniżej i wystarczy dopasować nazwy Przekaźnika , Termostatu, czujnikaTemp i czujnika kontaktronu.
Zaimportowałem całość zmieniłem na nazwy jak w Twoim skrypcie i teraz jest tak
Kiedy Kontaktron jest ON czyli okno jest zamknięte termostat startuje włącza i wyłącza prawidłowo
Kiedy termostat załącza ogrzewanie i po chwili okno zostanie otwarte Kontaktron OFF termostat grzeje nadal i w momencie obniżenia temperatury na termostacie dopiero się wyłączy
Kiedy Kontaktron jest OFF okno otwarte i załączam termostat to Grzanie jest ON czyli nie reaguje na kontaktron ?? i teraz sam już nie wiem może coś mam źle poustawiane w domoticzu
logi kiedy jest off
@stanislawprzystalski pierwsza rzecz to jak kontaktron jest On to okno jest otwarte , przynajmniej w większości przypadków , druga rzecz wklej tu cały skrypt to zobaczę co tam zmieniłeś i jak
Skoro zmieniłeś nazwy na takie jak w skrypcie to masz tu wersję , która wyłączy Grzanie jak Kontaktron będzie ON
elseif boiler.state =='On' and sensor.state =='Off' then boiler.switchOff().checkFirst() dz.log('Ogrzewanie Off otwarte okno',dz.LOG_DEBUG) end end }