Uniwersalny Termost...
 
Powiadomienia
Wyczyść wszystko

Uniwersalny Termostat z Histereza na bazie Domoticza

79 Wpisów
17 Użytkownicy
11 Reactions
16.3 K Wyświetleń
isom
 isom
(@isom)
Wpisów: 5166
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
Autor tematu
 

@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

term 1
term 2
To nie wina skryptu , sprawdź  u siebie logi innych przełączników 
 
Dodane : 04/01/2020 2:58 pm
(@bartolomeo)
Wpisów: 210
Pomocny Donator 2K22
 

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
 
Dodane : 04/01/2020 10:15 pm
isom
 isom
(@isom)
Wpisów: 5166
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
Autor tematu
 

@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

 
Dodane : 04/01/2020 11:02 pm
(@piotras78)
Wpisów: 50
Kontrybutor
 

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ć

 
Dodane : 27/08/2020 6:13 pm
isom
 isom
(@isom)
Wpisów: 5166
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
Autor tematu
 

@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

 
Tak samo możesz wydzielić samą Wilgotność tylko w skrypcie zamiast "temperature" wstawiasz 'humidity" 
 
Dodane : 27/08/2020 7:23 pm
(@piotras78)
Wpisów: 50
Kontrybutor
 

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ń?

 
Dodane : 27/08/2020 8:30 pm
isom
 isom
(@isom)
Wpisów: 5166
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
Autor tematu
 

@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

 
Dodane : 28/08/2020 7:47 am
(@runner2)
Wpisów: 5
Bywalec
 

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 ?

 
Dodane : 15/11/2020 12:58 am
(@steel_rat)
Wpisów: 603
Ekspert
 

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.

 
Dodane : 15/11/2020 10:04 am
isom
 isom
(@isom)
Wpisów: 5166
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
Autor tematu
 

@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 

 
Dodane : 15/11/2020 10:42 am
(@runner2)
Wpisów: 5
Bywalec
 

@isom

dzięki. tak samo wlasnie sobie to rozpisałem logicznie. Muszę tylko usiąść i spróbuję to rozpisac to w LUA. 

 

 
Dodane : 15/11/2020 11:09 am
(@runner2)
Wpisów: 5
Bywalec
 

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. 

 
Dodane : 15/11/2020 11:15 am
(@stanislawprzystalski)
Wpisów: 23
Praktykant
 

hmm u mnie działa elegancko ale chciałem jeszcze dorobić obsługę kontraktronu w oknie ktoś ma jakiś pomysł co dokładnie dopisać 

 
Dodane : 29/12/2020 2:19 pm
isom
 isom
(@isom)
Wpisów: 5166
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
Autor tematu
 

@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 ?

 
Dodane : 29/12/2020 8:38 pm
(@stanislawprzystalski)
Wpisów: 23
Praktykant
 
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
 
Dodane : 29/12/2020 8:49 pm
isom
 isom
(@isom)
Wpisów: 5166
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
Autor tematu
 

@stanislawprzystalski Mogę ci całość napisać w dzVents , jeżeli zainteresowany to pisz

 
Dodane : 29/12/2020 9:38 pm
(@stanislawprzystalski)
Wpisów: 23
Praktykant
 

@isom zapodaj może uda mi się to jakoś wdrożyć 

 
Dodane : 29/12/2020 9:40 pm
isom
 isom
(@isom)
Wpisów: 5166
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
Autor tematu
 

@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 ......
 
Dodane : 29/12/2020 9:55 pm
(@stanislawprzystalski)
Wpisów: 23
Praktykant
 

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

2020-12-29 22:35:22.964 (OknoPok1) Light/Switch (Kontaktron)
2020-12-29 22:35:22.420 Status: User: admin initiated a switch command (10/Kontaktron/Off)
2020-12-29 22:35:27.649 Status: dzVents: Info: Handling events for: "Temp", value: "23.00"
2020-12-29 22:35:27.649 Status: dzVents: Info: ------ Start internal script: Script #1: Device: "Temp (Test)", Index: 8
2020-12-29 22:35:27.650 Status: dzVents: Debug: Processing device-adapter for Grzanie: Switch device adapter
2020-12-29 22:35:27.651 Status: dzVents: Debug: Processing device-adapter for Termostat: Thermostat setpoint device adapter
2020-12-29 22:35:27.653 Status: dzVents: Debug: Processing device-adapter for Kontaktron: Switch device adapter
2020-12-29 22:35:27.653 Status: dzVents: Debug: Boiler state: On
2020-12-29 22:35:27.653 Status: dzVents: Debug: Measured temperature: 23.0
2020-12-29 22:35:27.653 Status: dzVents: Debug: Setpoint: 27.5
2020-12-29 22:35:27.653 Status: dzVents: Info: ------ Finished Script #1
 
2020-12-29 22:36:42.471 (OknoPok1) Light/Switch (Kontaktron)
2020-12-29 22:36:42.466 Status: User: admin initiated a switch command (10/Kontaktron/On)
2020-12-29 22:36:47.894 Status: dzVents: Info: Handling events for: "Temp", value: "23.00"
2020-12-29 22:36:47.894 Status: dzVents: Info: ------ Start internal script: Script #1: Device: "Temp (Test)", Index: 8
2020-12-29 22:36:47.895 Status: dzVents: Debug: Processing device-adapter for Grzanie: Switch device adapter
2020-12-29 22:36:47.896 Status: dzVents: Debug: Processing device-adapter for Termostat: Thermostat setpoint device adapter
2020-12-29 22:36:47.897 Status: dzVents: Debug: Processing device-adapter for Kontaktron: Switch device adapter
2020-12-29 22:36:47.897 Status: dzVents: Debug: Boiler state: On
2020-12-29 22:36:47.897 Status: dzVents: Debug: Measured temperature: 23.0
2020-12-29 22:36:47.897 Status: dzVents: Debug: Setpoint: 27.5
2020-12-29 22:36:47.897 Status: dzVents: Info: ------ Finished Script #1
 
Dodane : 29/12/2020 10:37 pm
isom
 isom
(@isom)
Wpisów: 5166
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
Autor tematu
 

@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

a jak chcesz żeby wyłączał przy OFF to zmień koncówkę skryptu na 
        elseif boiler.state =='On' and sensor.state =='Off' then
              boiler.switchOff().checkFirst() 
              dz.log('Ogrzewanie Off otwarte okno',dz.LOG_DEBUG)      
        end
    end
}
 
Dodane : 29/12/2020 10:53 pm
Strona 2 / 4
Udostępnij: