Stänga av robotgräsklipparen vid regn

Post Reply
jrylander
Ny medlem
Posts: 2
Joined: 05 Mar 2014, 15:58
10

Hej alla

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)
Med Virtual Device inlagt så har jag nedanstående för att stänga av strömmen till gräsklipparen om luftfuktighet enligt openweathermap just nu är över 70%:

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()
Post Reply