Hjälp! Spjällmotorstyrning i växthus/uterum

Övrigt
Post Reply
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1203
Joined: 03 Jan 2015, 16:49
9
Location: Vegby
Contact:

Nu har jag uppnått min LUA-gräns och vore tacksam för lite hjälp.

I vårt kombinerade växthus/uterum har jag monterat en spjällmotor som skall öppna eller stänga takluckan beroende på rummets temperatur.
För att göra detta behöver jag jämföra den förra temperavläsningen kallad OldTemp med den nya kallad NewTemp.
Om NewTemp är högre än OldTemp skall takluckan öppnas lite mer eller stängas lite om NewTemp är lägre än OldTemp.
Det är mellanlagringen av OldTemp som jag går bet på.

Dessutom skall inte reläerna triggas om temperaturen är högre än 40 grader eller lägre än 20 grader.
Då förutsätts takluckan vara antingen helt öppen (>= 40) eller helt stängd (<= 20).

Nedanstående kod fungerar naturligtvis inte med "local OldTemp = NewTemp" som jag skrivit. Kommer bara inte på hur jag mellanlagrar OldTemp på rätt sätt. Har kollat i Bamsefars kurser men inte hittat (missat?) hur.

I kombination med spjällmotorn har jag också en 2-hastighetsfläkt som också styrs av temperaturen med ett Fibaro dubbelrelä. Men den koden var rena barnleken jämfört med spjällmotorkoden.
Så kan någon vänlig själ hjälpa mig på traven med lite tips?
----------------------------------------------------------------

Code: Select all

--[[
%% properties
57 value	--Temperatursensor
%% globals
--]]
-- Temperaturstyrd spjällmotor.txt
if fibaro:countScenes() > 1 then fibaro:abort() end -- Förhindra dubbla scener

local Relay_Q1 = 76  -- EnhetsID för brytare Q1 (stäng spjäll)
local Relay_Q2 = 78  -- EnhetsID för brytare Q2 (Q1+Q2= öppna spjäll)
local Delay = 2          -- Kör spjällmotorn bara en liten stund
local MaxTemp = 40  -- Spjället helt öppet, trigga inte reläet över denna temperatur
local MinTemp = 20  -- Spjället helt stängt, trigga inte reläet under denna temperatur

local NewTemp = tonumber(fibaro:getValue(57, "value"))
local OldTemp = NewTemp

-- Om NewTemp är högre än OldTemp, öppna lite mer
if ( NewTemp > OldTemp ) then		--Öppnar spjäll
     fibaro:call(Relay_Q1, "turnOn")
     fibaro:call(Relay_Q2, "turnOn")
     	fibaro:sleep(Delay*1000)         	--Spjällmotorn öppnar bara några sekunder
     		fibaro:call(Relay_Q1, "turnOff")
      		fibaro:call(Relay_Q2, "turnOff")
          		fibaro:debug("Spjället öppnade lite")
  
-- Om NewTemp är mindre än OldTem, stäng lite mer  
elseif ( NewTemp < OldTemp ) then	--Stänger spjäll
     fibaro:call(Relay_Q1, "turnOn")
     fibaro:call(Relay_Q2, "turnOff")
     	fibaro:sleep(Delay*1000)         	-- Spjällmotorn stänger bara några sekunder
     		fibaro:call(Relay_Q1, "turnOff")
     		fibaro:call(Relay_Q2, "turnOff")
          		fibaro:debug("Spjället stängde lite")
end

fibaro:debug("NewTemp = " .. NewTemp .." °C")
fibaro:debug("OldTemp = " .. OldTemp .." °C")

fibaro:sleep(60*1000)  -- Vänta på en stabil temperatur
----------------------------------------------------------------
Min gamla ombyggda HC2 har fått ett nytt liv och min HC3 är nu nedkopplad.
HC2 med Home Assistant har blivit en riktig Game Changer och nu har jag hemautomatik på riktigt.
https://www.zwaveforum.se/viewtopic.php?t=7087
User avatar
Bamsefar
Z-Wave Kung
Posts: 1268
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

Mmmm ett par frågor:

1. Om du vill mellanlagra OldTemp, så kan den vara en global variabel, men du sätter alltid värdet på old till samma som new precis i början? (om jag läste ordentligt så hade jag inte skrivit denna fråga)

2. Du har en sleep i slutet, men ingen loop som kör allt hela tiden?

3. Du nämner min och maxtemp,men jag ser ingen kod som provar det? Vill du få den koden?
Last edited by Bamsefar on 07 Mar 2015, 09:39, edited 1 time in total.
Reason: Läsförståelse...
Kör Home Assistant efter totalt nederlag för HomeSeer :twisted: :twisted: :mrgreen:
User avatar
Bamsefar
Z-Wave Kung
Posts: 1268
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

Jag sov lite på ditt problem och konstaterade att jag kan chansa på denna kod:

Code: Select all

--[[
%% properties
57 value	--Temperatursensor
%% globals
--]]

-- Temperaturstyrd spjällmotor.txt

if fibaro:countScenes() > 1 then fibaro:abort() end -- Förhindra dubbla scener

local Relay_Q1 = 76	-- EnhetsID för brytare Q1 (stäng spjäll)
local Relay_Q2 = 78	-- EnhetsID för brytare Q2 (Q1+Q2= öppna spjäll)
local Delay = 2		-- Kör spjällmotorn bara en liten stund
local MaxTemp = 40	-- Spjället helt öppet, trigga inte reläet över denna temperatur
local MinTemp = 20	-- Spjället helt stängt, trigga inte reläet under denna temperatur

local NewTemp = 0
local OldTemp = 0

while true do

	NewTemp = tonumber(fibaro:getValue(57, "value"))

-- Om NewTemp är högre än OldTemp och NewTemp är mindre än MaxTemp, öppna lite mer
	if ( NewTemp > OldTemp and NewTemp < MaxTemp ) then      
		fibaro:call(Relay_Q1, "turnOn")
		fibaro:call(Relay_Q2, "turnOn")
		fibaro:sleep(Delay*1000)            --Spjällmotorn öppnar bara några sekunder
		fibaro:call(Relay_Q1, "turnOff")
		fibaro:call(Relay_Q2, "turnOff")
		fibaro:debug("Spjället öppnade lite")
     
-- Om NewTemp är mindre än OldTemp och NewTemp är större än MinTemp, stäng lite mer 
	elseif ( NewTemp < OldTemp and NewTemp > MinTemp ) then
		fibaro:call(Relay_Q1, "turnOn")
		fibaro:call(Relay_Q2, "turnOff")
		fibaro:sleep(Delay*1000)            -- Spjällmotorn stänger bara några sekunder
		fibaro:call(Relay_Q1, "turnOff")
		fibaro:call(Relay_Q2, "turnOff")
		fibaro:debug("Spjället stängde lite")
	end

	fibaro:debug("NewTemp = " .. NewTemp .." °C")
	fibaro:debug("OldTemp = " .. OldTemp .." °C")

	OldTemp = NewTemp		-- Kopiera nuvarande till OLD för nästa varv...

	fibaro:sleep(60*1000)		-- Vänta på en stabil temperatur

end
Som vanligt, dessvärre, har jag inte testkört den... :mrgreen: :mrgreen:
Kör Home Assistant efter totalt nederlag för HomeSeer :twisted: :twisted: :mrgreen:
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1203
Joined: 03 Jan 2015, 16:49
9
Location: Vegby
Contact:

Bamsefar, tack för att du tar dig tid med detta. Såg just att du hann svara innan mitt inlägg.

1. Mellanlagra OldTemp
Att mellanlagra OldTemp som en global variabel tänkte jag inte på eftersom koden befann sig i ett och samma script. Trodde det räckte med en "local" variabel. Men var placerar jag koden OldTemp = NewTemp? Det gamla OldTemp skall ju jämföras med det nyinkomna NewTemp. Och jag måste ju sätta OldTemp tidigt i koden. Annars får jag ju inget värde att jämföra med?

2. Temperatuförändringar triggar scriptet
Jag upptäckte att det inte behövdes någon Do while eller liknande loop eftersom jag bara vill göra något då temperaturen förändras. Om temperaturen är stabil under en timma så händer inget. Det avlastar också min HC2. Först vid en ny temperaturförändring triggas koden. Sleepfunktionen i slutet är till för att bromsa förloppet om det skulle ske väldigt snabba temperaturförändringar. För att undvika små temperaturtriggar så skulle jag skriva tex. "if ( NewTemp+1 > OldTemp ) then"

3. Max och Min-temp
Jag hade fullt fokus på punkt nummer 2 när jag testade scriptet. Och för att inte strula till det så skrev jag inte in den koden. Jag har lärt mig att få en sak att fungera innan jag ger mig på något annat :-).

Mitt script för fläktstyrningen har heller ingen loop utan triggas bara av temperaturförändringar. Det finns väl inga nackdelar med det, eller?

Tänkte det kunde vara kul att se hur scriptet testades. Och tack Bamsefar för tipsen!
Attachments
Efter Bamsefars scriptändring.
Efter Bamsefars scriptändring.
script.JPG (35.54 KiB) Viewed 7525 times
Temperaturreglerad spjällmotor
Temperaturreglerad spjällmotor
Temperaturtest..jpg (93.84 KiB) Viewed 7525 times
Last edited by RH_Dreambox on 07 Mar 2015, 10:42, edited 1 time in total.
Min gamla ombyggda HC2 har fått ett nytt liv och min HC3 är nu nedkopplad.
HC2 med Home Assistant har blivit en riktig Game Changer och nu har jag hemautomatik på riktigt.
https://www.zwaveforum.se/viewtopic.php?t=7087
User avatar
Bamsefar
Z-Wave Kung
Posts: 1268
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

Okej, då får du ta bort while loopen från mitt script, och läsa på om globala variabler:
http://www.zwaveforum.se/viewtopic.php?f=33&t=4960

Eller vänta på att jag får tid att hacka om ;-)
Kör Home Assistant efter totalt nederlag för HomeSeer :twisted: :twisted: :mrgreen:
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1203
Joined: 03 Jan 2015, 16:49
9
Location: Vegby
Contact:

Tack Bamsefar för snabba svar, nu har jag ett fungerande styrsystem :-)

Om man nu gör en loop som du föreslog då kan jag väl ta bort temperatur-ID't (57 value) i inledningen?
Annarst kommer väl den bara att ligga och trigga i onödan?
--[[
%% properties
57 value --Temperatursensor
%% globals
--]]
Min gamla ombyggda HC2 har fått ett nytt liv och min HC3 är nu nedkopplad.
HC2 med Home Assistant har blivit en riktig Game Changer och nu har jag hemautomatik på riktigt.
https://www.zwaveforum.se/viewtopic.php?t=7087
User avatar
Bamsefar
Z-Wave Kung
Posts: 1268
Joined: 25 Nov 2013, 15:06
10
Location: Stockholm

Helt rätt, antingen trigger eller while loop. Med while loop slipper du global variabel...
Kör Home Assistant efter totalt nederlag för HomeSeer :twisted: :twisted: :mrgreen:
Post Reply