Motorvärmarstyrning

Här kan du som nybörjare ställa dina frågor utan att skämmas
Post Reply
krillev
Ny medlem
Posts: 19
Joined: 06 Feb 2013, 20:23
11

Hej
Jag skulle vilja ha hjälp med att göra en motorvärmarstyrning.
Så här hade jag tänkt mig att den skall fungera.
jag vill ha en virtuell enhet som man ska ställa in avresetiden på och att den starta motorvärmaren 3tim före avresa eller att man kan ställa in valfri tid för detta, men även att den går att slå på manuellt typ något sådant här.
Går det att använda virtuella enheter till lokalaenheter(fgs211) i hc2?
5e_217.png
5e_217.png (75.42 KiB) Viewed 34689 times
CQ1
Medlem
Posts: 29
Joined: 03 Jul 2012, 09:57
11

Tjena,

Såhär ser min lösning ut.

Label "Avresetid" heter lblTime.
Label "Utetemperatur" heter lblTemp.
Label "Status" heter lblState.

Har tre globala variabler - departureHour, departureMinute och heaterOverride.

Knappen H [+]:

Code: Select all

local deviceId = 229;
oldHour = fibaro:getGlobalValue("departureHour");
oldMinute = fibaro:getGlobalValue("departureMinute");

newHour = tonumber(oldHour) + 1;

if (newHour == 24) then newHour = 0 end;

if newHour == -1 then newHour = 23 end;

fibaro:setGlobal("departureHour", newHour);
fibaro:call(deviceId, "setProperty", "ui.lblTime.value", string.format("%02d:%02d", newHour, oldMinute));
Knappen H [-]:

Code: Select all

local deviceId = 229;
oldHour = fibaro:getGlobalValue("departureHour");
oldMinute = fibaro:getGlobalValue("departureMinute");

newHour = tonumber(oldHour) - 1;

if (newHour == 24) then newHour = 0 end;
if (newHour == -1) then newHour = 23 end;

fibaro:setGlobal("departureHour", newHour);
fibaro:call(deviceId , "setProperty", "ui.lblTime.value", string.format("%02d:%02d", newHour, oldMinute));
Knappen m [+]:

Code: Select all

local deviceId = 229;
oldHour = fibaro:getGlobalValue("departureHour");
oldMinute = fibaro:getGlobalValue("departureMinute");

newMinute = tonumber(oldMinute) + 5;

if newMinute == 60 then newMinute = 0 end;
if newMinute == -5 then newMinute = 55 end;

fibaro:setGlobal("departureMinute", newMinute);
fibaro:call(deviceId , "setProperty", "ui.lblTime.value", string.format("%02d:%02d", oldHour, newMinute));
Knappen m [-]:

Code: Select all

local deviceId = 229;
oldHour = fibaro:getGlobalValue("departureHour");
oldMinute = fibaro:getGlobalValue("departureMinute");

newMinute = tonumber(oldMinute) - 5;

if newMinute == 60 then newMinute = 0 end;
if newMinute == -5 then newMinute = 55 end;

fibaro:setGlobal("departureMinute", newMinute);
fibaro:call(deviceId , "setProperty", "ui.lblTime.value", string.format("%02d:%02d", oldHour, newMinute));
Knappen "På":

Code: Select all

local virtualDeviceId = 229;
local relayId = 230;
fibaro:call(relayId , "turnOn");
fibaro:sleep(300);
local state = "På";
if (tonumber(fibaro:getValue(relayId, "value")) == 0) then
  state = "Av"
end
fibaro:call(virtualDeviceId, "setProperty", "ui.lblState.value", state);
fibaro:setGlobal("heaterOverride", 1);
Knappen "Av":

Code: Select all

local virtualDeviceId = 229;
local relayId = 230;
fibaro:call(relayId , "turnOff");
fibaro:sleep(300);
local state = "På";
if (tonumber(fibaro:getValue(relayId, "value")) == 0) then
  state = "Av"
end
fibaro:call(virtualDeviceId, "setProperty", "ui.lblState.value", state);
fibaro:setGlobal("heaterOverride", 0);
I main loop uppdaterar jag lite GUI:

Code: Select all

local relayId = 230;
local virtualDeviceId = 229;
oldHour = fibaro:getGlobalValue("departureHour");
oldMinute = fibaro:getGlobalValue("departureMinute");
local state = "På";
if (tonumber(fibaro:getValue(relayId , "value")) == 0) then
  state = "Av"
end

fibaro:call(virtualDeviceId , "setProperty", "ui.lblTime.value", string.format("%02d:%02d", oldHour, oldMinute));
fibaro:call(virtualDeviceId , "setProperty", "ui.lblTemp.value", fibaro:getValue(3, "Temperature") .. " C");
fibaro:call(virtualDeviceId , "setProperty", "ui.lblState.value", state);

fibaro:sleep(60*1000);
Sen är det en scen som styr när värmaren går på. Här har jag valt att låta utetemperaturen styra hur lång tid innan den ska gå igång. Det finns lite rekommendationer kring detta, bl.a. hos Gröna Bilister.

Code: Select all

--[[
%% autostart
%% properties
%% globals
--]]

if (fibaro:countScenes() > 1) then fibaro:abort() end 

while true do
  
  local relayId = 230;

  local manualOverride = tonumber(fibaro:getGlobalValue("heaterOverride"));

  local outTemp = tonumber(fibaro:getValue(3, "Temperature"));
  local heaterState = tonumber(fibaro:getValue(relayId, "value"));

  local startHour = tonumber(fibaro:getGlobalValue("departureHour"));
  local startMinute = tonumber(fibaro:getGlobalValue("departureMinute"));

  local diff = 0;
  if (outTemp < -10) then
      -- Start 2 hours before departure time
      diff = 120;
  elseif (outTemp < 0) then
      -- Start 1.5 hours before departure time
      diff = 90;
  elseif (outTemp < 10) then
      -- Start 1 hour before departure time
      diff = 60;
  end

  local theDate = os.date("*t");
  local currentTime=tonumber(os.time());
  local departureTime=tonumber(os.time({year=theDate.year, month=theDate.month, day=theDate.day, hour=startHour, min=startMinute}));
  local startTime=tonumber(departureTime-diff*60);
  
  -- Don't start the timer if it's too warm outside
  -- (or if its already started)
  if (outTemp < 10) and (heaterState == 0) then
      if (currentTime >= startTime) and (currentTime < departureTime) then
        fibaro:call(relayId, "turnOn");
      end
  end
  
  if (heaterState == 1) and (currentTime >= departureTime) and (manualOverride == 0) then
    fibaro:call(relayId, "turnOff");
  end
  
  fibaro:sleep(60*1000);
end
Mycket nöje!

/CQ1
Attachments
Capture.PNG
Capture.PNG (13.49 KiB) Viewed 34677 times
nohed
Medlem
Posts: 88
Joined: 20 Apr 2013, 14:10
10

Hur får du in graderna och statusen i rutorna där man ser statusen
CQ1
Medlem
Posts: 29
Joined: 03 Jul 2012, 09:57
11

nohed wrote:Hur får du in graderna och statusen i rutorna där man ser statusen
Det är labels som uppdateras i virtuella enhetens main loop. Dessa rader, mer specifikt:

Code: Select all

fibaro:call(virtualDeviceId , "setProperty", "ui.lblTemp.value", fibaro:getValue(3, "Temperature") .. " C");
fibaro:call(virtualDeviceId , "setProperty", "ui.lblState.value", state);
krillev
Ny medlem
Posts: 19
Joined: 06 Feb 2013, 20:23
11

Hej!
Tack för hjälpen det ser ju riktigt bra ut men
jag som är nybörjare har ett litet problem som jag behöver hjälp med
jag får inte avresetiden,utetemperaturen och status att visa något,
dom verkar fungera jag får ändringar i globala variablerna och uttaget går till och från när jag använder på och av knappen.
Hälsningar Krille
CQ1
Medlem
Posts: 29
Joined: 03 Jul 2012, 09:57
11

Har du kallat labels för lblTemp etc? Och använder du rätt id för din virtuella enhet? Du ser det i URL:en när du öppnar enheten.
krillev
Ny medlem
Posts: 19
Joined: 06 Feb 2013, 20:23
11

Hej igen!
Tack för hjälpen, det var virtuella id som var fel.
Nu verkar det funka bättre lite lång uppdateringstid på den virituella enheten bara.
Hälsningar krille
Last edited by krillev on 09 Sep 2015, 17:23, edited 1 time in total.
CQ1
Medlem
Posts: 29
Joined: 03 Jul 2012, 09:57
11

Kul! Du kan ju leka lite med den sista fibaro:sleep och sätta ett lägre värde, men var lite försiktig med att gå för lågt då det kan göra boxen nedlastad.

Har du förresten ändrat till rätt id i + och -knapparna också? Annars kan jag förstå om det tar tid innan du ser att din inställda tid är rätt.
krillev
Ny medlem
Posts: 19
Joined: 06 Feb 2013, 20:23
11

Hej!
Nu har jag fått knapparna att fungera och värmaren startar men vill inte slå av efter avresetiden,
jag antar att det har något med scene att göra?

--[[
%% autostart
%% properties
%% globals
--]]

if (fibaro:countScenes() > 1) then fibaro:abort() end

while true do

local relayId = 79;

local manualOverride = tonumber(fibaro:getGlobalValue("heaterOverride"));

local outTemp = tonumber(fibaro:getValue(35, "value"));
local heaterState = tonumber(fibaro:getValue(49, "value"));

local startHour = tonumber(fibaro:getGlobalValue("departureHour"));
local startMinute = tonumber(fibaro:getGlobalValue("departureMinute"));

local diff = 0;
if (outTemp < -10) then
-- Start 2 hours before departure time
diff = 120;
elseif (outTemp < 0) then
-- Start 1.5 hours before departure time
diff = 90;
elseif (outTemp < 10) then
-- Start 1 hour before departure time
diff = 60;
end

local theDate = os.date("*t");
local currentTime=tonumber(os.time());
local departureTime=tonumber(os.time({year=theDate.year, month=theDate.month, day=theDate.day, hour=startHour, min=startMinute}));
local startTime=tonumber(departureTime-diff*60);

-- Don't start the timer if it's too warm outside
-- (or if its already started)
if (outTemp < 10) and (heaterState == 0) then
if (currentTime >= startTime) and (currentTime < departureTime) then
fibaro:call(49, "turnOn");
end
end

if (heaterState == 1) and (currentTime >= departureTime) and (manualOverride == 0) then
fibaro:call(49, "turnOff");
end

fibaro:sleep(60*1000);
end
Hälsningar Krille
CQ1
Medlem
Posts: 29
Joined: 03 Jul 2012, 09:57
11

Skumt. Den ska stänga av om

1. Den är på
2. Klockan är minst lika med avresetiden och
3. Man har inte slagit på den manuellt med På-knappen

Du kan ju kolla i variabelpanelen så att inte manualOverride är 1, om så är fallet får du trycka på Av-knappen så bör det funka.

Jag hade tänkt använda lite olika ikoner för att visa status men har inte fått tummen ur, riktigt.
krillev
Ny medlem
Posts: 19
Joined: 06 Feb 2013, 20:23
11

Hej
jag hittar ingen lösning på problemet med att motorvärmaren ska slå av efter avresetid,
tänkte höra om det är någon som har några ideer vad det kan vara.
Hälsningar Krille.

H[+]
local deviceId = 78;
oldHour = fibaro:getGlobalValue("departureHour");
oldMinute = fibaro:getGlobalValue("departureMinute");

newHour = tonumber(oldHour) + 1;

if (newHour == 24) then newHour = 0 end;

if newHour == -1 then newHour = 23 end;

fibaro:setGlobal("departureHour", newHour);
fibaro:call(78, "setProperty", "ui.lblTime.value", string.format("%02d:%02d", newHour, oldMinute));

H[-]
local deviceId = 78;
oldHour = fibaro:getGlobalValue("departureHour");
oldMinute = fibaro:getGlobalValue("departureMinute");

newHour = tonumber(oldHour) - 1;

if (newHour == 24) then newHour = 0 end;
if (newHour == -1) then newHour = 23 end;

fibaro:setGlobal("departureHour", newHour);
fibaro:call(78 , "setProperty", "ui.lblTime.value", string.format("%02d:%02d", newHour, oldMinute));

m[+]
local deviceId = 78;
oldHour = fibaro:getGlobalValue("departureHour");
oldMinute = fibaro:getGlobalValue("departureMinute");

newMinute = tonumber(oldMinute) + 5;

if newMinute == 60 then newMinute = 0 end;
if newMinute == -5 then newMinute = 55 end;

fibaro:setGlobal("departureMinute", newMinute);
fibaro:call(78 , "setProperty", "ui.lblTime.value", string.format("%02d:%02d", oldHour, newMinute));

m[-]

local deviceId = 78;
oldHour = fibaro:getGlobalValue("departureHour");
oldMinute = fibaro:getGlobalValue("departureMinute");

newMinute = tonumber(oldMinute) - 5;

if newMinute == 59 then newMinute = 0 end;
if newMinute == -5 then newMinute = 55 end;

fibaro:setGlobal("departureMinute", newMinute);
fibaro:call(78 , "setProperty", "ui.lblTime.value", string.format("%02d:%02d", oldHour, newMinute));



local virtualDeviceId = 78;
local relayId = 79;
fibaro:call(49 , "turnOn");
fibaro:sleep(300);
local state = "På";
if (tonumber(fibaro:getValue(49, "value")) == 0) then
state = "Av"
end
fibaro:call(78, "setProperty", "ui.lblState.value", state);
fibaro:setGlobal("heaterOverride", 1);

Av

local virtualDeviceId = 78;
local relayId = 79;
fibaro:call(49 , "turnOff");
fibaro:sleep(300);
local state = "På";
if (tonumber(fibaro:getValue(49, "value")) == 0) then
state = "Av"
end
fibaro:call(78, "setProperty", "ui.lblState.value", state);
fibaro:setGlobal("heaterOverride", 0);

Main loop

local relayId = 79;
local virtualDeviceId = 78;
oldHour = fibaro:getGlobalValue("departureHour");
oldMinute = fibaro:getGlobalValue("departureMinute");
local state = "På";
if (tonumber(fibaro:getValue(49 , "value")) == 0) then
state = "Av"
end

fibaro:call(78 , "setProperty", "ui.lblTime.value", string.format("%02d:%02d", oldHour, oldMinute));
fibaro:call(78 , "setProperty", "ui.lblTemp.value", fibaro:getValue(3, "Temperature") .. " C");
fibaro:call(78 , "setProperty", "ui.lblState.value", state);

fibaro:sleep(60*1000);

Scen

--[[
%% autostart
%% properties
%% globals
--]]

if (fibaro:countScenes() > 1) then fibaro:abort() end

while true do

local relayId = 79;

local manualOverride = tonumber(fibaro:getGlobalValue("heaterOverride"));

local outTemp = tonumber(fibaro:getValue(3, "Temperature"));
local heaterState = tonumber(fibaro:getValue(49, "value"));

local startHour = tonumber(fibaro:getGlobalValue("departureHour"));
local startMinute = tonumber(fibaro:getGlobalValue("departureMinute"));

local diff = 0;
if (outTemp < -10) then
-- Start 2 hours before departure time
diff = 120;
elseif (outTemp < 0) then
-- Start 1.5 hours before departure time
diff = 90;
elseif (outTemp < 10) then
-- Start 1 hour before departure time
diff = 60;
end

local theDate = os.date("*t");
local currentTime=tonumber(os.time());
local departureTime=tonumber(os.time({year=theDate.year, month=theDate.month, day=theDate.day, hour=startHour, min=startMinute}));
local startTime=tonumber(departureTime-diff*60);

-- Don't start the timer if it's too warm outside
-- (or if its already started)
if (outTemp < 10) and (heaterState == 0) then
if (currentTime >= startTime) and (currentTime < departureTime) then
fibaro:call(49, "turnOn");
end
end

if (heaterState == 1) and (currentTime >= departureTime) and (manualOverride == 0) then
fibaro:call(49, "turnOff");
end

fibaro:sleep(60*1000);
end

Globala variabler
Attachments
global variabel.png
global variabel.png (268.66 KiB) Viewed 34413 times
CQ1
Medlem
Posts: 29
Joined: 03 Jul 2012, 09:57
11

Det är väldigt konstigt. För mig funkar det fint. Testa att lägga in lite spårutskrifter

Code: Select all

fibaro:debug("heaterState: " .. heaterState);
fibaro:debug("currentTime: " .. currentTime);
fibaro:debug("departureTime: " .. departureTime);
fibaro:debug("manualOverride: " .. manualOverride);
fibaro:debug("-------------------------------------");
i scenen, innan raden

Code: Select all

if (heaterState == 1) and (currentTime >= departureTime) and (manualOverride == 0) then
krillev
Ny medlem
Posts: 19
Joined: 06 Feb 2013, 20:23
11

Hej!
Det var jag som var den felande länken,använde en dimmermodul att labba med och då måste
man ju sätta heaterstate == 99 för att veta att den är igång. :oops:
Nu funkar det perfekt.
Är det bara att sätta in en rad till om jag vill att motorvärmaren skall starta 3tim före
avresetid bor ganska långt norrut och då är 2tim för kort tid vid -20
if (outTemp < -20) then
-- Start 3 hours before departure time
diff = 180;
Tack för hjälpen det var en väldig lärorik tråd för mig. :)
Hälsningar Krille.
CQ1
Medlem
Posts: 29
Joined: 03 Jul 2012, 09:57
11

Bra att det löste sig!

Precis, vill du lägga till ytterligare temperaturintervaller så är det bara lägga till fler if- eller elseif-satser:

Code: Select all

if (outTemp < -20) then
   -- Start 3 hours before departure time
   diff = 180;
elseif (outTemp < -10) then
   -- Start 2 hours before departure time
   diff = 120;
elseif (outTemp < 0) then
   -- Start 1.5 hours before departure time
   diff = 90;
elseif (outTemp < 10) then
   -- Start 1 hour before departure time
   diff = 60;
end
Lycka till med hackandet!

/CQ1
zorro
Medlem
Posts: 365
Joined: 22 Oct 2013, 16:16
10

Hej får ett fel meddelande när jag kör scenen
[ERROR] 19:48:28 line:22 attempt to compare nil with number


--[[
%% autostart
%% properties
%% globals
--]]

if (fibaro:countScenes() > 1) then fibaro:abort() end

while true do

local relayId = 61;

local manualOverride = tonumber(fibaro:getGlobalValue("heaterOverride"));

local outTemp = tonumber(fibaro:getValue(60, "Temperature"));
local heaterState = tonumber(fibaro:getValue(61, "value"));

local startHour = tonumber(fibaro:getGlobalValue("departureHour"));
local startMinute = tonumber(fibaro:getGlobalValue("departureMinute"));

local diff = 0;
if (outTemp < -10) then Detta är line 22
-- Start 2 hours before departure time
diff = 120;
elseif (outTemp < 0) then
-- Start 1.5 hours before departure time
diff = 90;
elseif (outTemp < 10) then
-- Start 1 hour before departure time
diff = 60;
end

local theDate = os.date("*t");
local currentTime=tonumber(os.time());
local departureTime=tonumber(os.time({year=theDate.year, month=theDate.month, day=theDate.day, hour=startHour, min=startMinute}));
local startTime=tonumber(departureTime-diff*60);

-- Don't start the timer if it's too warm outside
-- (or if its already started)
if (outTemp < 10) and (heaterState == 0) then
if (currentTime >= startTime) and (currentTime < departureTime) then
fibaro:call(61, "turnOn");
end
end

if (heaterState == 1) and (currentTime >= departureTime) and (manualOverride == 0) then
fibaro:call(61, "turnOff");
end

fibaro:sleep(60*1000);
end
Fibaro fantastic
Aktuell HC2 Version: 4.520
CQ1
Medlem
Posts: 29
Joined: 03 Jul 2012, 09:57
11

Tjena,

Ändra

Code: Select all

local outTemp = tonumber(fibaro:getValue(60, "Temperature"));
till

Code: Select all

local outTemp = tonumber(fibaro:getValue(3, "Temperature"));
Den "enheten" i HC2 som håller väderegenskaperna har nummer 3.

/CQ1
zorro
Medlem
Posts: 365
Joined: 22 Oct 2013, 16:16
10

"Lysande mannen"
nu får vi se om bilen är varm imorron bitti
Tack för hjälpen så länge kommer kanske fler frågor :oops: :oops:
Fibaro fantastic
Aktuell HC2 Version: 4.520
zorro
Medlem
Posts: 365
Joined: 22 Oct 2013, 16:16
10

Perfekt bilen varm :lol: :lol:
en fråga kan man inte använda en lokal tempsensor
här i morse så visade motorvärmaren +4°C men min lokala så var det -2°C
så vädret från Yahoo stämmer inte så exakt här fast jag lagt in gps korrdinaterna :ugeek:
Fibaro fantastic
Aktuell HC2 Version: 4.520
CQ1
Medlem
Posts: 29
Joined: 03 Jul 2012, 09:57
11

Visst kan du det. Då byter du bara ut

Code: Select all

local outTemp = tonumber(fibaro:getValue(3, "Temperature"));
mot

Code: Select all

local outTemp = tonumber(fibaro:getValue(TEMP_SENSOR_ID, "value"));
Kanske en dörr/fönstersensor med Dallas tempsensor för utomhusbruk? Gäller bara att hitta ett vettigt sätt att dra kabeln från inomhus till utomhus.
zorro
Medlem
Posts: 365
Joined: 22 Oct 2013, 16:16
10

har en universalsensor med 2 st givare en för utom hus och en för innom hus
blir detta rätt om min sensor har id 60
local outTemp = tonumber(fibaro:getValue(60, "value"));
Fibaro fantastic
Aktuell HC2 Version: 4.520
Post Reply