Powiadomienia
Wyczyść wszystko
UWAGA: Strona oraz Forum Smart'ny Dom nie będzie dostępne 23 Grudnia 2024 ze względu na przenoszenie serwisu na mocniejszą maszynę.
W tym czasie polecam poświęcenie swojego czasu na pomoc partnerowi w przygotowaniu udanych Świąt 😉
Za niedogodności z góry przepraszam, admin
Domoticz
79
Wpisów
17
Użytkownicy
11
Reactions
16.5 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 reacted
@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
walcze z tym skryptem
Gdzie ten skrypt ? Mam zgadywać? Czy udostepnisz, to co zrobiłeś?
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 reacted
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