Hjälp med en scen som styr motorvärmare

Hjälp varandra att vara kreativa för att göra hemmet mer bekvämt.
mr-zeth
Ny medlem
Posts: 18
Joined: 31 Oct 2013, 13:31
10

jompa68 wrote:Hur ser din rad 34 ut?

Code: Select all

if (outTemp < -20) then
Visst läste du min edit i förra inlägget?
iSnobben
Medlem
Posts: 105
Joined: 27 Dec 2013, 20:39
10

mr-zeth wrote:Grymt jobbat Jonny!
Har du hämtat starttiden från någon rekommendation eller har du gått på sunt förnuft? Jag såg att den bara gick ner till -20 och tänkte lägga till ytterligare parametrar då vi nära på varje vinter har ner till -40.

Jag får dock följande error
[ERROR] 18:30:28: line 34: attempt to compare nil with number
Vad har jag missat?

*Edit* Ser att koden bygger på att man har en tempsensor ute, vilket jag inte har än utan tillförlitar mig på yahoo vädret som hc2 hämtar ifrån. Vad ska jag skriva istället för att hämta yahoo temp så länge?
Jag vill också använda Yahoovädret alternativt den virtuella tempmätaren som hämtar data från Wunderground.
jompa68
Proffsmedlem
Posts: 735
Joined: 12 Aug 2012, 08:53
11
Location: Hofors

Kikar på detta imorgon


Jonny sent this from his iPhone using Tapatalk
mr-zeth
Ny medlem
Posts: 18
Joined: 31 Oct 2013, 13:31
10

jompa68 wrote:Kikar på detta imorgon


Jonny sent this from his iPhone using Tapatalk
Kolla när du har tid, och Ja! Jag tycker att du ska starta konsultfirma så att du kan tjäna pengar på såna som mig!
jompa68
Proffsmedlem
Posts: 735
Joined: 12 Aug 2012, 08:53
11
Location: Hofors

För att få in det värdet som hämtas från Yahoo Weather så ska koden se ut så här:

Code: Select all

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

local relayId = 58;  -- Switch, plugg's ID
--local tempId = 131;  -- Temperatur sensor ID
local yahooWeatherID = 3   -- HC2 Yahoo WeatherID

------ END OF CONFIGS -------------


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

while true do

-- Variabler som behöver skapas --  
local manualOverride = tonumber(fibaro:getGlobalValue("heaterOverride"));
local calValue = tonumber(fibaro:getGlobalValue("calValue"));
local manualTimer = tonumber(fibaro:getGlobalValue("manualTimer"));
local startHour = tonumber(fibaro:getGlobalValue("calMotorvStartH"));
local startMinute = tonumber(fibaro:getGlobalValue("calMotorvStartM"));
local stopHour = tonumber(fibaro:getGlobalValue("calMotorvStopH"));
local stopMinute = tonumber(fibaro:getGlobalValue("calMotorvStopM"));
local mstartHour = tonumber(fibaro:getGlobalValue("departureHour"));
local mstartMinute = tonumber(fibaro:getGlobalValue("departureMinute"));
-----------------------------------
  
local outTemp = tonumber(fibaro:getValue(yahooWeatherID, "Temperature"));
local heaterState = tonumber(fibaro:getValue(relayId, "value"));

local diff = 0;
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

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);
local mdepartureTime=tonumber(os.time({year=theDate.year, month=theDate.month, day=theDate.day, hour=mstartHour, min=mstartMinute}));
local mstartTime=tonumber(mdepartureTime-diff*60);


---- Debug start ----
fibaro:debug("-------------------------------------");
if calValue == 0 and manualOverride == 0 and manualTimer == 0 then
   fibaro:debug("Inget i kalendern och inget manuellt inställt")
    elseif calValue == 1 then
   fibaro:debug("Avresetid: " .. fibaro:getGlobal("calMotorvStart"));
   fibaro:debug("Temperatur: " .. outTemp.." C");
   fibaro:debug("Motorvärmaren startar: " .. diff.."min tidigare.");

    fibaro:debug("manualOverride: " .. manualOverride);
    fibaro:debug("Motorvärmarens status: "..heaterState);
   elseif manualOverride == 1 then
   fibaro:debug("Avresetid: " .. fibaro:getGlobal("departureHour")..":"..fibaro:getGlobal("departureMinute"));
   fibaro:debug("Temperatur: " .. outTemp.." C");
   fibaro:debug("Motorvärmare startar: " .. diff.."min tidigare.");
   fibaro:debug("manualOverride: " .. manualOverride);
    elseif calValue == 0 and manualTimer == 1 then
   fibaro:debug("Avresetid: " .. fibaro:getGlobal("departureHour")..":"..fibaro:getGlobal("departureMinute"));
   fibaro:debug("Temperatur: " .. outTemp.." C");
   fibaro:debug("Motorvärmare startar: " .. diff.."min tidigare.");
   fibaro:debug("manualOverride: " .. manualOverride);

end
fibaro:debug("-------------------------------------");
---- Debug end ----


   if (outTemp < 10) and (heaterState == 0 )then
   if (currentTime >= startTime) and (currentTime < departureTime) or (currentTime >= mstartTime) and (currentTime < mdepartureTime) then 
      fibaro:debug("Slog just på motorvärmaren!")
      fibaro:call(relayId, "turnOn");
   end
   end


if (heaterState == 1) and manualTimer == 0 and (currentTime >= departureTime) or calValue == 1 and (currentTime <= startTime) or (currentTime <= mstartTime) then
fibaro:debug("Slog just av motorvärmaren!")
    fibaro:call(relayId, "turnOff");
end

fibaro:sleep(60*1000);
end


Sen kan man lägga till fler IF satser om man vill ha motorvärmaren på längre vid lägre temperaturen än -20
iSnobben
Medlem
Posts: 105
Joined: 27 Dec 2013, 20:39
10

Tack så jättemycket! Ändringen såg ju ganska enkel ut. Vart hittar man vad man ska referera till tänker på typ yahooväder osv. Är yahoovädret alltid ID 3 eller vart hittar jag det? Antar att det är något med detta eftersom jag fortfarande får felmeddelandet på rad 34.
jompa68
Proffsmedlem
Posts: 735
Joined: 12 Aug 2012, 08:53
11
Location: Hofors

Hur ser din rad 34 ut?
Om du kör koden i mainloop så ta markera med -- för denna rad

Code: Select all

if (fibaro:countScenes() > 1) then fibaro:abort() end
då den inte behövs
iSnobben
Medlem
Posts: 105
Joined: 27 Dec 2013, 20:39
10

jompa68 wrote:Hur ser din rad 34 ut?
Om du kör koden i mainloop så ta markera med -- för denna rad

Code: Select all

if (fibaro:countScenes() > 1) then fibaro:abort() end
då den inte behövs
Okej den har slutat att gnälla på rad 34 helt plötsligt. Nu ser loggen ut såhär:
[DEBUG] 14:25:03: -------------------------------------
[DEBUG] 14:25:03: -------------------------------------
[DEBUG] 14:26:03: -------------------------------------
[DEBUG] 14:26:03: -------------------------------------
[DEBUG] 14:27:03: -------------------------------------
[DEBUG] 14:27:03: -------------------------------------
[DEBUG] 14:28:03: -------------------------------------
[DEBUG] 14:28:03: -------------------------------------
[DEBUG] 14:29:03: -------------------------------------
[DEBUG] 14:29:03: -------------------------------------
[DEBUG] 14:30:03: -------------------------------------
[DEBUG] 14:30:03: -------------------------------------
[DEBUG] 14:31:03: -------------------------------------
[DEBUG] 14:31:03: -------------------------------------
[DEBUG] 14:32:03: -------------------------------------
[DEBUG] 14:32:03: -------------------------------------
[DEBUG] 14:33:03: -------------------------------------
[DEBUG] 14:33:03: -------------------------------------

Den virtuella enheten visar dock ingen temperatur och den verkar inte hämta något från kalendern.
mr-zeth
Ny medlem
Posts: 18
Joined: 31 Oct 2013, 13:31
10

iSnobben wrote:
jompa68 wrote:Hur ser din rad 34 ut?
Om du kör koden i mainloop så ta markera med -- för denna rad

Code: Select all

if (fibaro:countScenes() > 1) then fibaro:abort() end
då den inte behövs
Okej den har slutat att gnälla på rad 34 helt plötsligt. Nu ser loggen ut såhär:
[DEBUG] 14:25:03: -------------------------------------
[DEBUG] 14:25:03: -------------------------------------
[DEBUG] 14:26:03: -------------------------------------
[DEBUG] 14:26:03: -------------------------------------
[DEBUG] 14:27:03: -------------------------------------
[DEBUG] 14:27:03: -------------------------------------
[DEBUG] 14:28:03: -------------------------------------
[DEBUG] 14:28:03: -------------------------------------
[DEBUG] 14:29:03: -------------------------------------
[DEBUG] 14:29:03: -------------------------------------
[DEBUG] 14:30:03: -------------------------------------
[DEBUG] 14:30:03: -------------------------------------
[DEBUG] 14:31:03: -------------------------------------
[DEBUG] 14:31:03: -------------------------------------
[DEBUG] 14:32:03: -------------------------------------
[DEBUG] 14:32:03: -------------------------------------
[DEBUG] 14:33:03: -------------------------------------
[DEBUG] 14:33:03: -------------------------------------

Den virtuella enheten visar dock ingen temperatur och den verkar inte hämta något från kalendern.
Jag antar att du måste uppdatera koden i den virituella enheten också så att den erhåller temp från yahoo och inte sensor.

Jag försökte mig på detta men får felmeddelande i debug.

Code: Select all

local relayId = 58;
local virtualDeviceId = fibaro:getSelfId()

oldHour = fibaro:getGlobalValue("departureHour");
oldMinute = fibaro:getGlobalValue("departureMinute");
local status = "På";
if (tonumber(fibaro:getValue(relayId , "value")) == 0) then
  status = "Av"
end
fibaro:call(virtualDeviceId , "pressButton", "1") 
fibaro:call(virtualDeviceId , "setProperty", "ui.lblTemp.value", fibaro:getValue(yahooWeatherID("Temperature")); 
fibaro:call(virtualDeviceId , "setProperty", "ui.lblCalStart.value", fibaro:getGlobalValue("calMotorvStart"));
fibaro:call(virtualDeviceId , "setProperty", "ui.lblCalStop.value", fibaro:getGlobalValue("calMotorvStop"));
fibaro:call(virtualDeviceId , "setProperty", "ui.lblStatus.value", status);
--local manualTimer = tonumber(fibaro:getGlobalValue("manualTimer"));
--if manualTimer == 0 then
--fibaro:call(virtualDeviceId , "setProperty", "ui.lblStart.value", "NEJ");
--else fibaro:call(virtualDeviceId , "setProperty", "ui.lblStart.value", oldHour..":"..oldMinute);

--end
--fibaro:call(virtualDeviceId , "setProperty", "ui.lblStart.value", oldHour..":"..oldMinute);

fibaro:sleep(30*1000);
Felet i debug är följande: [ERROR] 14:47:34: line 12: ')' expected near ';'
jompa68
Proffsmedlem
Posts: 735
Joined: 12 Aug 2012, 08:53
11
Location: Hofors

Du behöver deklarera yahooWeatherID, typ så här

yahooWeatherID = 3



Jonny sent this from his iPhone using Tapatalk
iSnobben
Medlem
Posts: 105
Joined: 27 Dec 2013, 20:39
10

Nu verkar den hitta kalendern för den visar datumet då och då. Dock får jag den inte att hitta aktiviteten Motorvärmare http://www.henrikengstrom.se/calgoogle.php

Ingen temperatur i den vituella enheten heller. Om jag försöker ställa in tiden manuellt med knapparna blir det inget begripligt klockslag som visas. Dock funkar av och på knappen.
iSnobben
Medlem
Posts: 105
Joined: 27 Dec 2013, 20:39
10

jompa68 wrote:Du behöver deklarera yahooWeatherID, typ så här

yahooWeatherID = 3



Jonny sent this from his iPhone using Tapatalk
Vart ska man stoppa in detta?
jompa68
Proffsmedlem
Posts: 735
Joined: 12 Aug 2012, 08:53
11
Location: Hofors

Om du via PM skickar dina inloggnings uppgifter till home.fibaro.com så kan jag kolla "live" vad du har för problem.
mr-zeth
Ny medlem
Posts: 18
Joined: 31 Oct 2013, 13:31
10

Funkar fint.
Så här ser koden ut i viritual device för att hämta data ifrån yahoo i stället för egen utesensor

Code: Select all

local relayId = 58;
local virtualDeviceId = fibaro:getSelfId()
local yahooWeatherID = 3   -- HC2 Yahoo WeatherID

oldHour = fibaro:getGlobalValue("departureHour");
oldMinute = fibaro:getGlobalValue("departureMinute");
local status = "På";
if (tonumber(fibaro:getValue(relayId , "value")) == 0) then
  status = "Av"
end
fibaro:call(virtualDeviceId , "pressButton", "1") 
fibaro:call(virtualDeviceId , "setProperty", "ui.lblTemp.value", fibaro:getValue(yahooWeatherID, "Temperature"));
fibaro:call(virtualDeviceId , "setProperty", "ui.lblCalStart.value", fibaro:getGlobalValue("calMotorvStart"));
fibaro:call(virtualDeviceId , "setProperty", "ui.lblCalStop.value", fibaro:getGlobalValue("calMotorvStop"));
fibaro:call(virtualDeviceId , "setProperty", "ui.lblStatus.value", status);
--local manualTimer = tonumber(fibaro:getGlobalValue("manualTimer"));
--if manualTimer == 0 then
--fibaro:call(virtualDeviceId , "setProperty", "ui.lblStart.value", "NEJ");
--else fibaro:call(virtualDeviceId , "setProperty", "ui.lblStart.value", oldHour..":"..oldMinute);

--end
--fibaro:call(virtualDeviceId , "setProperty", "ui.lblStart.value", oldHour..":"..oldMinute);

fibaro:sleep(30*1000);
Ett problem löst, ett nytt uppstått.
I Hämta Kalender så uppstår följande fel i debug.

[ERROR] 19:25:28: line 8: attempt to perform arithmetic on global 'sToday' (a nil value)

Jag antar att det har att göra med att jag ej specificerat någon kalender?
jompa68
Proffsmedlem
Posts: 735
Joined: 12 Aug 2012, 08:53
11
Location: Hofors

mr-zeth wrote:Funkar fint.
Så här ser koden ut i viritual device för att hämta data ifrån yahoo i stället för egen utesensor

Ett problem löst, ett nytt uppstått.
I Hämta Kalender så uppstår följande fel i debug.

[ERROR] 19:25:28: line 8: attempt to perform arithmetic on global 'sToday' (a nil value)

Jag antar att det har att göra med att jag ej specificerat någon kalender?
Ja, man efterfrågade ett google kalender skript till sammans med att kunna styra det manuellt och det var så jag gjorde det från början.
Har du ingen sådan så finns det en virtuell enhet som bara innehåller egen timer funktion för att ställa in tid för motorvärmare.
mr-zeth
Ny medlem
Posts: 18
Joined: 31 Oct 2013, 13:31
10

jompa68 wrote:
mr-zeth wrote:Funkar fint.
Så här ser koden ut i viritual device för att hämta data ifrån yahoo i stället för egen utesensor

Ett problem löst, ett nytt uppstått.
I Hämta Kalender så uppstår följande fel i debug.

[ERROR] 19:25:28: line 8: attempt to perform arithmetic on global 'sToday' (a nil value)

Jag antar att det har att göra med att jag ej specificerat någon kalender?
Ja, man efterfrågade ett google kalender skript till sammans med att kunna styra det manuellt och det var så jag gjorde det från början.
Har du ingen sådan så finns det en virtuell enhet som bara innehåller egen timer funktion för att ställa in tid för motorvärmare.
Jo nog var det så jag tänkte från början (googel kalender) men jag är ute på helt okänd mark här, ordet "Luakod" fanns inte i mitt vokabulär för 2 veckor sen så förtälj gärna hur jag löser det så jag får till det med googel kalender. Tack dock för all hjälp hittills!
iSnobben
Medlem
Posts: 105
Joined: 27 Dec 2013, 20:39
10

mr-zeth wrote:
jompa68 wrote:
mr-zeth wrote:Funkar fint.
Så här ser koden ut i viritual device för att hämta data ifrån yahoo i stället för egen utesensor

Ett problem löst, ett nytt uppstått.
I Hämta Kalender så uppstår följande fel i debug.

[ERROR] 19:25:28: line 8: attempt to perform arithmetic on global 'sToday' (a nil value)

Jag antar att det har att göra med att jag ej specificerat någon kalender?
Ja, man efterfrågade ett google kalender skript till sammans med att kunna styra det manuellt och det var så jag gjorde det från början.
Har du ingen sådan så finns det en virtuell enhet som bara innehåller egen timer funktion för att ställa in tid för motorvärmare.
Jo nog var det så jag tänkte från början (googel kalender) men jag är ute på helt okänd mark här, ordet "Luakod" fanns inte i mitt vokabulär för 2 veckor sen så förtälj gärna hur jag löser det så jag får till det med googel kalender. Tack dock för all hjälp hittills!
Det du behöver göra är egentligen "bara" att skapa en gCal och följa den här guiden: viewtopic.php?f=33&t=4215&p=5120&hilit=kalender#p5120

Du behöver inte skapa den virtuella enheten för den har du ju som bekant redan. Så egentligen är det bara att konfigurera calgoogle.php som du behöver göra och sedan ladda upp den på någon server som har stöd för php. Sedan länkar du till servern i den virtuella enheten. Enligt beskrivning tidigare i denna tråd. Det här har jag faktiskt lyckats med, det enda jag har lyckats med känns det som :D Tänk bara på att döpa filen till calgoogle.php och inte calgoogle_default.php som den heter från början när du laddar hem den.

Den virtuella enheten triggar motorvärmaren av aktiviteter i kalendern som heter Motorvärmare så du måste döpa dina aktiviteter i kalendern exakt så alternativt ändra i koden.
iSnobben
Medlem
Posts: 105
Joined: 27 Dec 2013, 20:39
10

Statusrapport:

Scenen som styr motorvärmaren fungerar nu utmärkt och hämtar data från kalendern som den ska. Den virtuella enheten fungerar att ställa in tiden på manuellt.

Det som inte fungerar är egentligen bara:
Önskad Avfärd
Stängs av
Temperatur

Detta gäller alltså enbart den virtuella enheten.
NoOne2k
Ny medlem
Posts: 3
Joined: 15 Nov 2015, 18:12
8

Ett hyfsat trådlyft, men jag ansåg att det var bättre att fortsätta på samma tråd än att starta en ny...

Googles kalender kan man tydligen inte hämta data från på samma sätt längre. Jag har lyckats få min HC2 att hämta de tio senaste värdena från kalendern enligt denna guiden: viewtopic.php?f=33&t=4215. Men hur får jag den till att konvertera textsträngen med datum/tid till globala variabler (datum/tid)? Eller finns det något bättre sätt att få motorvärmaren till att starta enligt en kalender?
Post Reply