Jag haft stor nytta av detta forum så jag tänkte bidra lite själv också. Nedanstående fungerar för mig för att se till att robotgräsklipparen inte körs när det regnar. Huruvida de regnar eller inte får jag reda på från openweathermap och inte från en regnsensor hos mig. Det verkar fungerar ganska bra men kan behöva lite experimenterande med nivå eller att låta programmet reagerar på andra värden än fuktighet.
För att få vädret från openweathermap använde jag http://www.fibarouk.co.uk/support/virtu ... -database/
Jag har dock ändrat lite i vd-koden för att ställa in plats (förstås) och jag har också fått ett konto hos openweathermap (det är gratis) för att lägga till en api-nyckel. På openweathermap kan du få reda på id för din plats genom att söka på platsen och sedan se på url:en vilket id din plats motsvarar. Exempelvis för Stockholm: http://openweathermap.org/find?q=stockholm vilket ger att koden för Stockholm är 2673730. Ev fungerar det utan api-nyckel också, det har jag inte provat. I nedanstående behöver du ställa in appId (api-nyckel) och id (t ex Stockholms id)
Koden som den ser ut i mitt device är:
Code: Select all
selfId = fibaro:getSelfId()
local appId = "XXXXXXXX"
local id = "XXXXXXXX"
HC3 = Net.FHttp("api.openweathermap.org")
danem, statusm = HC3:GET("/data/2.5/weather?id="..id.."&units=metric&appid=" .. appId)
danef, statusf = HC3:GET("/data/2.5/forecast?id="..id.."&units=metric&appid=" .. appId)
local ajson=json.decode(danem)
local tempmin=ajson.main.temp_min
local tempmax=ajson.main.temp_max
local pressure=ajson.main.pressure
local humidity=ajson.main.humidity
local city=ajson.name
local wind=ajson.wind.speed
local weather=ajson.weather[1].description
local tm=ajson.dt
local ajsonf=json.decode(danef)
local n
local t
for i = 1,5 do
t = ajsonf.list[i].dt
if t > tm then
n = i
break
end
end
local ftempmin=ajsonf.list[n].main.temp_min
local ftempmax=ajsonf.list[n].main.temp_max
local fpressure=ajsonf.list[n].main.pressure
local fhumidity=ajsonf.list[n].main.humidity
local fwind=ajsonf.list[n].wind.speed
if ftempmin > tempmin then
fibaro:call(selfId,"setProperty","ui.Label1.value", string.format("%3.1f°C(↑%3.1f)", tempmin, ftempmin))
elseif ftempmin < tempmin then
fibaro:call(selfId,"setProperty","ui.Label1.value", string.format("%3.1f°C(↓%3.1f)", tempmin, ftempmin))
else
fibaro:call(selfId,"setProperty","ui.Label1.value", string.format("%3.1f°C(-)", tempmin))
end
if ftempmax > tempmax then
fibaro:call(selfId,"setProperty","ui.Label2.value", string.format("%3.1f°C(↑%3.1f)", tempmax, ftempmax))
elseif ftempmax < tempmax then
fibaro:call(selfId,"setProperty","ui.Label2.value", string.format("%3.1f°C(↓%3.1f)", tempmax, ftempmax))
else
fibaro:call(selfId,"setProperty","ui.Label2.value", string.format("%3.1f°C(-)", tempmax))
end
if fpressure > pressure then
fibaro:call(selfId,"setProperty","ui.Label3.value",string.format("%dhPa(↑%d)", pressure, fpressure))
elseif fpressure < pressure then
fibaro:call(selfId,"setProperty","ui.Label3.value",string.format("%dhPa(↓%d)", pressure, fpressure))
else
fibaro:call(selfId,"setProperty","ui.Label3.value",string.format("%dhPa(-)", pressure))
end
if fhumidity > humidity then
fibaro:call(selfId,"setProperty","ui.Label4.value",string.format("%d%s(↑%d)", humidity, "%", fhumidity))
elseif fhumidity < humidity then
fibaro:call(selfId,"setProperty","ui.Label4.value",string.format("%d%s(↓%d)", humidity, "%", fhumidity))
else
fibaro:call(selfId,"setProperty","ui.Label4.value",string.format("%d%s(-)", humidity, "%"))
end
if fwind > wind then
fibaro:call(selfId,"setProperty","ui.Label5.value",string.format("%4.1fm/s(↑%4.1f)", wind, fwind))
elseif fwind < wind then
fibaro:call(selfId,"setProperty","ui.Label5.value",string.format("%4.1fm/s(↓%4.1f)", wind, fwind))
else
fibaro:call(selfId,"setProperty","ui.Label5.value",string.format("%4.1fm/s(-)", wind))
end
fibaro:call(selfId,"setProperty","ui.Label6.value",city)
fibaro:call(selfId,"setProperty","ui.Label91.value",weather)
Code: Select all
--[[
%% properties
39 power
56 ui.Label4.value
%% events
%% globals
--]]
local maxHumidity=70
local hoursToWaitAfterOk=4
local startOfWork = 9
local endOfWork = 18
local turnOffIfToHigh = function(id, current, max, hour)
if current > max then
fibaro:debug("Värdet är högre än " .. max .. ". Slår av den")
fibaro:call(id, "turnOff")
fibaro:setGlobal("automowerOkHour", hour)
else
if (hour - tonumber(fibaro:getGlobalValue("automowerOkHour"))) > hoursToWaitAfterOk then
fibaro:debug("Värdet är lägre än " .. max .. " och det har gått " .. hoursToWaitAfterOk .." timmar. Slår på den")
fibaro:call(id, "turnOn")
else
fibaro:debug("Värdet är lägre än " .. max .. " men det har inte gått " .. hoursToWaitAfterOk .." timmar. Gör ingenting")
end
end
end
local maybeTurnOff = function()
local automowerId=39
local weatherId=56
local effect = fibaro:getValue(automowerId, "power")
local humidityString = fibaro:getValue(weatherId, "ui.Label4.value")
local currentHumidity = tonumber(string.match(humidityString, "(%d+).*"))
local hour = os.date("*t").hour
fibaro:debug("Gräsklipparen drar " .. effect .. "w nu och luftfuktigheten är " .. currentHumidity .. "%")
if tonumber(effect) > 10 or (hour > endOfWork and hour < startOfWork) then
fibaro:debug('Gräsklipparen står och laddar eller så har inte arbetsdagen börjat')
turnOffIfToHigh(automowerId, currentHumidity, maxHumidity, hour)
elseif tonumber(effect) < 1 then
fibaro:debug('Gräsklipparen är avstängd')
turnOffIfToHigh(automowerId, currentHumidity, maxHumidity, hour)
else
fibaro:debug('Gräsklipparen är och klipper eller är färdigladdad')
end
end
local sourceTrigger = fibaro:getSourceTrigger();
fibaro:debug('Scene was started as ' .. sourceTrigger["type"])
maybeTurnOff()