Powiadomienia
Wyczyść wszystko
Domoticz
79
Wpisów
17
Użytkownicy
11
Reactions
18.3 K
Wyświetleń
Panowie pomocy.
Usiluje przerobic skrypt pod sterowanie klima.
local heating_probe = 'Salon'
local thermostat_setpoint = 'Termostat_Klima'
local heating_unit1 = 'Grzanie_20'
local heating_unit2 = 'Grzanie_22'
-- 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(temp_only - hysteresis) then
if (otherdevices[heating_unit2] == "On") then
-- commandArray['SendNotification']='Heating is off'
commandArray[heating_unit1]='On'
print("Heating is Off")
end
elseif tonumber(deviceValue) > tonumber(temp_only + hysteresis) then
if (otherdevices[heating_unit1] == "On") then
commandArray[heating_unit2]='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
Chcialbym aby gdy temperatura przekroczy zadana w termostacie wartosc skrypt uruchamial device Grzanie_20 czyli heating_unit1 a jesli temperatura spadnie ponizej zadanej to ma uruchomic device Grzanie_22czyli heating_unit2.
Probuje dluzszy czas i ciagle mam blad :
Error: dzVents: Error: (3.0.2) ...cz/scripts/dzVents/generated_scripts/Termostat_Klima.lua:8: attempt to index a nil value (global 'otherdevices')
Da sie cos z tym zrobic?
Zapomnialem dodac ze moje urzadzenia Grzanie_20 i Grzanie_22 to urzadzenia typu Push On Button
Dodane : 10/09/2022 7:53 pm
Autor tematu
@kniazio zacznij przerabiać jakiś skrypt dzVents , albo ten co próbujesz nie wstawiaj jako dzVents bo to jest skrypt LUA a nie dzVents
Dodane : 10/09/2022 8:32 pm
Z LUA tez mi nie wychodzi. Ciagle jakies bledy
Dodane : 10/09/2022 9:01 pm
Możesz podesłać linka do wtyczki co ma możliwość uczenia się charakterystyki cieplnej budynku ? Wtyczka o której wspominasz pod koniec drugiego postu.
Dodane : 11/09/2022 9:35 pm
Autor tematu
Dodane : 12/09/2022 9:26 pm
@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.
Te zmiany musisz zrobić w dwóch miejscach jedno to zaraz w devices = {.........I potem w local ......
po 2 latach stabilnej pracy wyskoczyły błędy
dzVents: Error: (3.1.7) Ogrzewanie On
w sumie nic nie zmieniałem aktualizowałem jak pamiętam Domoticza system działa stabilnie przekaźniki działają tylko w logach czerwono
Dodane : 15/09/2022 6:46 pm
Autor tematu
@stanislawprzystalski i co mamy zgadywać jakie te błędy w logach ?
dzVents: Error: (3.1.7) Ogrzewanie On
To nic nie mówi i nie jest cały log
Dodane : 15/09/2022 7:43 pm
2022-09-15 19:45:16.391 Error: dzVents: Error: (3.1.7) Ogrzewanie Off
tylko tyle wyświetla wszystko działa jak trzeba ale zastanawiam się jaki jest powód tego błędu
skrypt działał od dawna i nie sypał błędami
return
{
on = { timer = { 'every 5 minutes' },
devices = { 'D1 Termostat Łazienka Parter', 'D1 Temperatura Łazienka Parter','D1 Okno Łazienka Parter'}},
logging = { level = domoticz.LOG_ERROR },
execute = function(dz, item)
_G.logMarker = _G.moduleLabel
local hysteresis = 0.2 -- ustaw od 0,1 do 10
local boiler = dz.devices('D1 Ogrzewanie Łazienka Parter') -- Nazwa przekaznika do grzania
local temperature = dz.utils.round(dz.devices('D1 Temperatura Łazienka Parter').temperature,1) -- Nazwa Czujnik temp
local setpoint = dz.utils.round(dz.devices('D1 Termostat Łazienka Parter').setPoint,1) -- Nazwa termostatu
local sensor = dz.devices('D1 Okno Łazienka Parter') -- Nazwa czujnika okno
if setpoint < ( temperature - hysteresis ) and boiler.state == 'On' then
boiler.switchOff()
dz.log('Ogrzewanie Off',dz.LOG_ERROR)
elseif setpoint > ( temperature + hysteresis ) and boiler.state == 'Off'and sensor.state =='Closed' then
boiler.switchOn()
dz.log('Ogrzewanie On',dz.LOG_ERROR)
elseif setpoint > ( temperature + hysteresis ) and boiler.state == 'On'and sensor.state =='Open' then
boiler.switchOff()
dz.log('Ogrzewanie Stop okno otwarte',dz.LOG_ERROR)
end
end
}
Dodane : 15/09/2022 9:33 pm
Autor tematu
skrypt działał od dawna i nie sypał błędami
W takiej postaci jak wstawiłeś , zawsze musiał walić błędami . Wstaw ten co poniżej i będzie spokój
return
{
on = { timer = { 'every 5 minutes' },
devices = { 'D1 Termostat Łazienka Parter', 'D1 Temperatura Łazienka Parter','D1 Okno Łazienka Parter'}},
logging = { level = domoticz.LOG_ERROR },
execute = function(dz, item)
_G.logMarker = _G.moduleLabel
local hysteresis = 0.2 -- ustaw od 0,1 do 10
local boiler = dz.devices('D1 Ogrzewanie Łazienka Parter') -- Nazwa przekaznika do grzania
local temperature = dz.utils.round(dz.devices('D1 Temperatura Łazienka Parter').temperature,1) -- Nazwa Czujnik temp
local setpoint = dz.utils.round(dz.devices('D1 Termostat Łazienka Parter').setPoint,1) -- Nazwa termostatu
local sensor = dz.devices('D1 Okno Łazienka Parter') -- Nazwa czujnika okno
if setpoint < ( temperature - hysteresis ) and boiler.state == 'On' then
boiler.switchOff()
dz.log('Ogrzewanie Off',dz.LOG_INFO)
elseif setpoint > ( temperature + hysteresis ) and boiler.state == 'Off'and sensor.state =='Closed' then
boiler.switchOn()
dz.log('Ogrzewanie On',dz.LOG_INFO)
elseif setpoint > ( temperature + hysteresis ) and boiler.state == 'On'and sensor.state =='Open' then
boiler.switchOff()
dz.log('Ogrzewanie Stop okno otwarte',dz.LOG_INFO)
end
end
}
Dodane : 16/09/2022 3:59 pm
Witam
Może się komuś z tego wątku przyda, więc chciałem podzielić się swoim termostatem. Napisany od podstaw ponieważ nie znalazłem tak nietypowego.
Problem był w tym, że wszyscy sterują układami z małą bezwładnością. Mój jest z dużą bezwładnością. Jest to sterowanie temperaturą za zaworem trójdrogowym instalacji centralnego ogrzewania domu. Z uwagi na specyfikę zaworu, którego wbudowany mechanizm w pełni zamyka go z około 120 sekund i tak samo otwiera, zachodziła potrzeba aby zawór odpowiedni wcześniej wyłączać czyli jak temperatura jest mniejsza od zadanej, i odpowiednio zacząć wyłączać jak temperatura spada - czyli odwrotnie od termostatu standardowego. Wszystko przez czas potrzebny na otwarcie i zamknięcie zaworu.
Układ CO i CWU którym steruje, schematy, orurowanie, wniesienie kotła ... wykonałem sam od zera + sterowanie więc nie jest to jakiś klon z innego forum. Gr3t4 mnie nienawidzi.
Schemat układu którym sterujemy:
Real:
Skrypt sterujący temperaturą grzejników: (uwzględnia awaryjne chłodzenie bufora ciepła i wyłączanie przy zimnym buforze - jak nie ma czym grzać)
local ogrzewanieONOFF = 'Ogrzewanie Domu' -- ON/OFF ogrzewania
local power3D = '3D power 6' -- zasilanie zaworu 3D
local onoff3D = '3D open/close 5' -- otwieranie/zamykanie zaworu 3D. Zarów otwiera się i zamyka w pełni w czasie 120 sekund. ON = zamknięty na dom, OFF = otwarty na dom. Logika niby odwrtna, na otworzyć 3D w przypadku jakiejść awarii przekaźnika
local zadanaTemp = 'Temp. Grzejników' -- temp zadana grzejników , termostat
local za3Dtemp = 'CO za 3D' -- temp instalacji, za zaworem 3D
local pompaDOM = 'Pompa CO Dom 2' -- pompa obiegu grzejników
local bufor5temp = 'Bufor 5' -- temp bufora w najwyższym punkcie
local bufor4temp = 'Bufor 4' -- temp bufor 4
local bufor1temp = 'Bufor 1' -- temp bufor 1 w najniższym punkcie
local histerezaUP = 2 -- histereza od dolu dla wylaczania gdy temp rosnie, zacznik zamykac zawor N stopni przed termostatem gdy temperatura rośnie i otwierac N stopni przed termostatem gdy temp spada
local histerezaDOWN = 3 -- histereza od gory dla zalaczania gdy temp maleje
local termostat = tonumber(otherdevices[zadanaTemp]-1) --wartosc termostatu, odjeta wartosc w celu doregulowania termostatu do temperatury instalacji
commandArray = {}
for deviceName,deviceValue in pairs(otherdevices) do
if (deviceName == ogrzewanieONOFF) then
--czy temperatora instalacji za zaworem 3D rosnie czy maleje, potrzebna informacja do histerezy
if otherdevices[ogrzewanieONOFF] == 'On' then -- and devicechanged[za3Dtemp] then
if otherdevices[za3Dtemp] - uservariables["tempZA3Dpoprzednia"] < 0 and tonumber(otherdevices[za3Dtemp]) ~= tonumber(uservariables["tempZA3Dpoprzednia"]) then
print ('v2 za 3d maleje')
commandArray['Variable:tempZA3Dpoziom'] = 'DOWN'
elseif otherdevices[za3Dtemp] - uservariables["tempZA3Dpoprzednia"] > 0 and tonumber(otherdevices[za3Dtemp]) ~= tonumber(uservariables["tempZA3Dpoprzednia"]) then
print ('v2 za 3d rośnie')
commandArray['Variable:tempZA3Dpoziom'] = 'UP'
end
if tonumber(otherdevices[za3Dtemp]) ~= tonumber(uservariables["tempZA3Dpoprzednia"]) then
commandArray['Variable:tempZA3Dpoprzednia'] = otherdevices[za3Dtemp]
end
end
--zabezpieczenie przed tym jakby jednak się nie wyłączyły pompy i 3d przy wyłączaniu
if otherdevices[ogrzewanieONOFF] == 'On' then
if tonumber(otherdevices[za3Dtemp]) > tonumber(otherdevices[zadanaTemp])+10 and (otherdevices[power3D] == 'Off' or otherdevices[onoff3D] == 'Open') then
print('wylaczanie przy przekroczeniu')
commandArray[#commandArray + 1] = {[power3D] = 'On'}
commandArray[#commandArray + 1] = {[onoff3D] = 'Off'}
commandArray[#commandArray + 1] = {[power3D] = 'Off AFTER 440'}
commandArray[#commandArray + 1] = {[pompaDOM] = 'On'}
commandArray[#commandArray + 1] = {[pompaDOM] = 'Off AFTER 840'}
end
end
--awaryjne otwarcie CO na Dom sprawdzanie co stopień
if math.floor(tonumber(otherdevices[bufor5temp])) ~= uservariables["Bufor5poprzednia"] then
commandArray['Variable:Bufor5poprzednia'] = tostring(math.floor(tonumber(otherdevices[bufor5temp])))
if tonumber(otherdevices[bufor5temp]) > 82 then
print ('awaryjne chlodzenie bufora')
commandArray['Variable:awaryjneotwarcieCOnaDOM'] = "1"
commandArray[#commandArray + 1] = {[power3D] = 'On'}
--otwarcie 3d
commandArray[#commandArray + 1] = {[onoff3D] = 'On'}
commandArray[pompaDOM] = 'On'
--jeżeli ogrzewanie wyłączone to zamknij 3D
elseif tonumber(otherdevices[bufor5temp]) < 82 and uservariables["awaryjneotwarcieCOnaDOM"] == 1 and otherdevices[ogrzewanieONOFF] == 'Off' then
print ('awaryjne chlodzenie bufora')
commandArray['Variable:awaryjneotwarcieCOnaDOM'] = "0"
commandArray[#commandArray + 1] = {[power3D]='On'}
commandArray[#commandArray + 1] = {[power3D]='Off AFTER 200'}
--zamkniecie 3d
commandArray[#commandArray + 1] = {[onoff3D]='Off'}
commandArray[pompaDOM]='Off'
--jeżeli ogrzewanie włączone to niech steruje dalej
else
print ('awaryjne chlodzenie bufora wylaczone')
commandArray['Variable:awaryjneotwarcieCOnaDOM'] = "0"
end
end
--obsługa włączania ogrzewania
if (devicechanged[ogrzewanieONOFF] == 'On') then
print('ogrzewanie On')
commandArray[power3D] = 'On'
-- wlaczenie pompy gdy 3d sie otwiera i wlasnie wlaczamy ogrzewanie a temperatura jest odpowiednia
if tonumber(otherdevices[za3Dtemp]) < tonumber(otherdevices[zadanaTemp]) and tonumber(otherdevices[bufor5temp]) > 35 then
print('pompa start')
commandArray[#commandArray + 1] = {[onoff3D]='On'}
commandArray[#commandArray + 1] = {[pompaDOM]='On'}
commandArray[#commandArray + 1] = {[pompaDOM]='Off AFTER 840'}
end
elseif (devicechanged[ogrzewanieONOFF] == 'Off') then
print('ogrzewanie OFF')
commandArray[#commandArray + 1] = {[power3D]='On'}
commandArray[#commandArray + 1] = {[power3D]='Off AFTER 200'}
--print('zamkniecie 3d')
commandArray[#commandArray + 1] = {[onoff3D]='Off'}
commandArray[pompaDOM] = 'Off'
end
--bufor ZIMNY sprawdzanie czy bufor zimny - grac czy nie ??
if uservariables["awaryjneotwarcieCOnaDOM"] == 0 and otherdevices[ogrzewanieONOFF] == 'On' then
--bufor ZIMNY
if devicechanged[za3Dtemp] and tonumber(otherdevices[bufor5temp]) < 35 and uservariables["buforZIMNY"] == 'NIE' then
print ("v2 bufor zimny ponizej 35")
commandArray['Variable:buforZIMNY'] = 'TAK'
commandArray[#commandArray + 1] = {[power3D] = 'Off'}
commandArray[#commandArray + 1] = {[onoff3D] = 'Off AFTER 1'}
commandArray[#commandArray + 1] = {[power3D] = 'On AFTER 2'}
--pompa
commandArray[#commandArray + 1] = {[pompaDOM] = 'Off'}
elseif devicechanged[za3Dtemp] and tonumber(otherdevices[bufor5temp]) > 37 and uservariables["buforZIMNY"] == 'TAK' then
print ("v2 bufor ciepły Bufor 5 powyzej 37")
commandArray['Variable:buforZIMNY'] = 'NIE'
end
end
--właściwe sterowanie teperaturą zależne czy wlączone awaryjne chłodzenie bufora i czy bufor jest ciepły
if uservariables["awaryjneotwarcieCOnaDOM"] == 0 and otherdevices[ogrzewanieONOFF] == 'On' and uservariables["buforZIMNY"] == 'NIE' then
if devicechanged[za3Dtemp] and tonumber(otherdevices[za3Dtemp]) > tonumber(termostat-histerezaUP) and uservariables["tempZA3Dpoziom"] == 'UP' and otherdevices[onoff3D] == 'Open' then
print ("v2 zamkniecie 3D ogrzewania")
--print(tonumber(otherdevices[za3Dtemp]))
commandArray[#commandArray + 1] = {[power3D] = 'Off'}
commandArray[#commandArray + 1] = {[onoff3D] = 'Off AFTER 1'}
commandArray[#commandArray + 1] = {[power3D] = 'On AFTER 2'}
--pompa
commandArray[#commandArray + 1] = {[pompaDOM] = 'On'}
commandArray[#commandArray + 1] = {[pompaDOM] = 'Off AFTER 840'}
elseif devicechanged[za3Dtemp] and tonumber(otherdevices[za3Dtemp]) < tonumber(termostat+histerezaDOWN) and uservariables["tempZA3Dpoziom"] == 'DOWN' and otherdevices[onoff3D] == 'Closed' and tonumber(otherdevices[bufor5temp]) > 35 then
print ("v2 otwarcie 3D ogrzewania")
--print(tonumber(otherdevices[za3Dtemp]))
commandArray[#commandArray + 1] = {[power3D] = 'Off'}
commandArray[#commandArray + 1] = {[onoff3D] = 'On AFTER 1'}
commandArray[#commandArray + 1] = {[power3D] = 'On AFTER 2'}
--pompa
commandArray[#commandArray + 1] = {[pompaDOM] = 'On'}
commandArray[#commandArray + 1] = {[pompaDOM] = 'Off AFTER 840'}
end
end
end
end
return commandArray
Skrypt obiegu kotłowego, pilnujący temperatury tego jak nagrzewany jest bufor automatycznie sprawdzając jaka jest aktualna temperatura kotła:
local pompaDOM = 'Pompa CO Dom 2' -- pompa obiegu grzejników
local bufor5temp = 'Bufor 5' --temp bufora w najwyższym punkcie
local bufor4temp = 'Bufor 4'
local bufor1temp = 'Bufor 1'
local piecCOtemp = 'Piec CO'
local pompaCO = 'Pompa CO 4'
commandArray = {}
for deviceName,deviceValue in pairs(otherdevices) do
if (deviceName == obiegkotlowy ) then
--czy rosnie czy maleje
if otherdevices[obiegkotlowy] == 'On' then
if otherdevices[piecCOtemp] - uservariables["tempCOpoprzednia"] < 0 and tonumber(otherdevices[piecCOtemp]) ~= tonumber(uservariables["tempCOpoprzednia"]) then
--print ('maleje')
commandArray['Variable:tempCOpoziom'] = 'DOWN'
elseif otherdevices[piecCOtemp] - uservariables["tempCOpoprzednia"] > 0 and tonumber(otherdevices[piecCOtemp]) ~= tonumber(uservariables["tempCOpoprzednia"]) then
--print ('rośnie')
commandArray['Variable:tempCOpoziom'] = 'UP'
end
if tonumber(otherdevices[piecCOtemp]) ~= tonumber(uservariables["tempCOpoprzednia"]) then
commandArray['Variable:tempCOpoprzednia'] = otherdevices[piecCOtemp]
end
end
--sterowanie
if (tonumber(otherdevices[piecCOtemp]) < 56 or tonumber(otherdevices[piecCOtemp]) < tonumber(otherdevices[bufor1temp])+10) and otherdevices[pompaCO] == 'On' then
print('pompa CO Off')
commandArray[pompaCO] = 'Off'
commandArray[obiegkotlowy] = 'Off'
elseif tonumber(otherdevices[piecCOtemp]) > 56 and tonumber(otherdevices[piecCOtemp]) > tonumber(otherdevices[bufor1temp])+10 and otherdevices[pompaCO] == 'Off' then
print('pompa CO ON')
commandArray[pompaCO] = 'On'
commandArray[obiegkotlowy] = 'On'
end
end
end
return commandArray
Wszystko zrealizowane w RPI 3 + Domoticz jako element logiczny, elementem wykonawczym jest NodeMCU 3 + 8 przekażników + Tasmota 12.3. Komunikacja Domoticz - > Tasmota to MQTT Discovery
Pozdrawiam, może pomoże to komuś w budowie czegoś ...
Dodane : 19/12/2022 2:48 pm
isom zareagował
@isom walcze z tym skryptem aby wyodrębnić wilgotność ale słabo to idzie macie jakieś pomysły co konkretnie zmienić aby zadziałało
Dodane : 08/12/2023 11:03 pm
Autor tematu
Dodane : 10/12/2023 9:33 am
chodzi o ten skrypt mam czujnik Temp/Humidity o ile temperature mogę wydzielić to mam problem aby wydzielić Humidity
return {
on = {
['timer'] = {'every 2 minutes'}
},
logging = { level = domoticz.LOG_DEBUG, -- zmien na LOG_ERROR, jak skrypt bedzie dzialal
marker = "temperatura..salon" },
execute = function(dz)
local temp = dz.devices('Salon - Temp/Humidity').temperature -- Tu wstawiasz nazwe czujnika zespolonego np Temp/HUM/Baro
dz.devices('Salon Temperatura').updateTemperature(temp, dz.temp_NOINFO) -- Nazwa wirtualnego czujnika temperatury do aktualizacji
end
}
Dodane : 10/12/2023 11:46 am
@stanislawprzystalski A nie tak
return {
on = {
['timer'] = {'every 2 minutes'}
},
logging = {
level = domoticz.LOG_DEBUG, -- zmien na LOG_ERROR, jak skrypt bedzie dzialal
marker = "wilgotnosc_salon" -- Zmiana markera na odpowiedni
},
execute = function(dz)
local humidity = dz.devices('Salon - Temp/Humidity').humidity -- Zmiana na pomiary wilgotności
dz.devices('Salon Wilgotnosc').updateHumidity(humidity, dz.HUMI_NOINFO) -- Zmiana na wirtualny czujnik wilgotności do aktualizacji
end
}
Dodane : 10/12/2023 5:49 pm
po przeróbce mam błąd dzVents: Error: (3.1.8) Warsztat: No status provided. Humidity not set
Dodane : 10/12/2023 8:04 pm
Autor tematu
po przeróbce mam błąd
A co mówi ten błąd ? Nie podałeś statusu i wilgotność nie została zaktualizowana.
Aktualizacja czujnika wilgotności w Domoticz powinna wyglądać tak
updateHumidity(humidity, status): Update humidity. status can be domoticz.HUM_NORMAL, HUM_COMFORTABLE, HUM_DRY, HUM_WET
Jak widać kolega @mariusz-2 popełnił błąd, ale można go poprawić patrząc na przykłady. Zapis domoticz.HUM_NORMAL można uprościć czyli dostosować do tego skryptu zmieniając na dz.HUM_NORMAL. Zapis NOINFO oznacza nie podaję swojego statusu, przepisz go z wartości które wysyła oryginalny czujnik.
Myślę, że na tyle jasno to opisałem, że poprawienie skryptu nie będzie problemem 🙂
Dodane : 10/12/2023 9:52 pm
Mariusz zareagował
działa prawidłowo po dokonaniu zmian 🙂
Dodane : 10/12/2023 10:11 pm
Witam , termostat działa super , mam pytanie czy można by było dodać przyciski do manualnej zmiany temperatury termostatu . Pozdrawiam
Dodane : 25/03/2024 8:54 am
Mam coś takiego, w espeasy Zasay to
on TermostatCWU#Output do if [TermostatCWU#Output]=0 GPIO,0,0 else GPIO,0,1 endon on Plus#State do if [Plus#State]=1 config,task,TermostatCWU,setlevel,[TermostatCWU#getLevel]+0.5 endif endon on Minus#State do if [Minus#State]=1 config,task,TermostatCWU,setlevel,[TermostatCWU#getLevel]-0.5 endif endon
Dodane : 25/03/2024 9:09 am
Strona 4 / 4
Poprzednia





