Tutorial 4: Automatyzacje i dashboardy#

Hook: 5 linijek Lua i Twój dom reaguje sam — światło włącza się z czujnikiem ruchu, pogoda z internetu ląduje na dashboardzie, a przekaźnik odpala scenę wieczorną. Bez YAML-i, bez node-redów — czysty, czytelny kod.


Co zbudujemy#

Na koniec tego tutoriala:

  • automatyzacja reagująca na zdarzenia
  • scena wieczorna
  • dashboard z przełącznikami
  • pogoda z internetu na dashboardzie

Czas: ~10 minut.


1. Pierwsza automatyzacja#

Reaguj na zmianę stanu — gdy lampa w salonie się włączy, włącz też lampę w kuchni:

-- modules/automatyzacje.lua

local salon = _:get("lampa_salon")
local kuchnia = _:get("lampa_kuchnia")

salon:onChange(function()
    if salon:getValue() == 1 then
        kuchnia:switchOn()
        log.info("Salon ON → kuchnia ON")
    end
end)

2. Scena#

Scena to grupa akcji pod jedną nazwą:

-- modules/sceny.lua

scene("wieczor", function()
    _:get("lampa_salon"):switchOn()
    _:get("lampa_kuchnia"):switchOff()
    log.info("Scena: wieczór")
end)

scene("wyjscie", function()
    _:each("switch", function(dev)
        dev:switchOff()
    end)
    log.info("Scena: wszystko wyłączone")
end)

Scenę można wywołać z dashboardu, HomeKit, HA, kodu Lua albo przez agenta AI.


3. Dashboard#

-- modules/dashboard.lua

dashboard("Dom")
    :toggle("Salon", "lampa_salon")
    :toggle("Kuchnia", "lampa_kuchnia")
    :button("Wieczór", function() runScene("wieczor") end)
    :button("Wyjście", function() runScene("wyjscie") end)
    :status("Temperatura", function()
        return _:get("temp_salon"):getValue() .. "°C"
    end)

4. Pogoda z internetu#

Pobierz dane pogodowe i wyświetl na dashboardzie:

-- modules/pogoda.lua

local function fetchWeather()
    local http = HTTP:new()
    http:asyncGET("https://wttr.in/Warsaw?format=j1", function(resp)
        if resp and resp.status == 200 then
            local data = json.decode(resp.body)
            local current = data.current_condition[1]
            kv:set("weather_temp", current.temp_C .. "°C")
            kv:set("weather_desc", current.weatherDesc[1].value)
        end
    end)
end

setInterval(fetchWeather, 600000)  -- co 10 minut
fetchWeather()

dashboard("Pogoda")
    :status("Temperatura", function()
        return kv:get("weather_temp") or "..."
    end)
    :status("Warunki", function()
        return kv:get("weather_desc") or "..."
    end)

Dane przetrwają restart — kv:set() zapisuje na dysku.


5. Reakcja na przekaźnik#

Praktyczny przykład — czujnik ruchu włącza światło na 5 minut:

-- modules/czujnik_ruchu.lua

local czujnik = _:get("czujnik_ruch_salon")
local lampa = _:get("lampa_salon")
local timer_id = nil

czujnik:onChange(function()
    if czujnik:getValue() == 1 then
        lampa:switchOn()

        if timer_id then cancel(timer_id) end
        timer_id = setTimeout(function()
            lampa:switchOff()
            log.info("Brak ruchu — lampa OFF")
        end, 300000)  -- 5 minut
    end
end)

Co dalej?#