Klimasteuerung

Hi Leute,
Ich habe ein Skript das mit meine Klimaanlage über einen ZXT-120 ein und ausschaltet.
Da die Klima manchmal verzögert ausschaltet, habe ich einen Fibaro Plug dazwischen, der mir den Verbauch misst.
Mein Skript soll nach dem Ausschalte Befehl in einer Dauerschleife alle 15 Sekunden den Verbrauch messen und mir erst dann ein Mail schicken, wenn die Klima komplett AUS ist also unter 1 Watt Strom braucht!
Es funktioniert grundsätzlich schon gut, die Prüfschleife läuft allerdings nur ein einziges Mal. Offensichtlich hab ich hier einen Denkfehler in der Schleifenfunktion!?
Kann mir jemand einen Tipp geben?

Hier das vereinfachte Skript:

--[[
%% properties
%% events
%% globals
--]]
--Name: Klima AUS
if (fibaro:countScenes()>1) then  fibaro:abort() end -- lösche doppelte Szenen
Debug = function ( color, message ) fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span")) end

local KlimaPlug = 334 -- Fibaro Plug für Klimaanlage
local KlimaValue = tonumber(fibaro:getValue(KlimaPlug,"value"))
local KlimaName = fibaro:getName(KlimaPlug)
local KlimaRoom = fibaro:getRoomNameByDeviceID(KlimaPlug)
local KlimaPower = fibaro:getValue(KlimaPlug, "power")

function KlimaAus()
  local KlimaPower = fibaro:getValue(KlimaPlug, "power")
  if (tonumber(fibaro:getValue(KlimaPlug, "power")) > 10 ) then
    fibaro:call(411, "setMode", "0") -- Mode OFF
    Debug("green",(os.date("%d.%m.%Y - "..KlimaRoom.." - "..KlimaName.." wird ausgeschaltet - Verbrauch "..KlimaPower.." Watt")))
  elseif (tonumber(fibaro:getValue(KlimaPlug, "power")) < 10 ) and (tonumber(fibaro:getValue(KlimaPlug, "power")) > 3 )then
    Debug("green",(os.date("%d.%m.%Y - "..KlimaRoom.." - "..KlimaName.." ist bereits im Standby - Verbrauch "..KlimaPower.." Watt")))
  elseif (tonumber(fibaro:getValue(KlimaPlug, "power")) < 1 ) then
    Debug("green",(os.date("%d.%m.%Y - "..KlimaRoom.." - "..KlimaName.." ist ausgeschaltet - Verbrauch "..KlimaPower.." Watt")))
  end
end

function KlimaAusNotify()
  fibaro:call(2, "sendEmail", "Fibaro-Status: Klima - AUS", "DeviceName: "..KlimaName.."\nRaum: "..KlimaRoom.." \nist ausgeschaltet")
end

KlimaAus()
if (tonumber(fibaro:getValue(KlimaPlug, "power")) > 1 ) then 
  local timer = 15
  repeat 
  fibaro:sleep(1000)
  if (tonumber(fibaro:getValue(KlimaPlug, "power")) < 1 ) then 
    KlimaAusNotify()
    timer = 0
    break 
  end
  timer = timer -1  
  until timer < 1
  local KlimaPower = fibaro:getValue(KlimaPlug, "power")
  Debug("magenta",(os.date("%d.%m.%Y - Klima braucht noch Strom- Verbrauch "..KlimaPower.." Watt")))
  KlimaAus()
elseif (tonumber(fibaro:getValue(KlimaPlug, "power")) < 1 ) then 
  KlimaAusNotify()
end

Hi pblacky,

hast Du dieses Problemchen schon gelöst. Wenn ich richtig vermute würde es helfen die repeat Schleife statt auf “until timer < 1” auf “until power < 1” umzustellen. Also hinter dem fibaro:sleep(1000) ein
power = tonumber(fibaro:getValue(KlimaPlug, “power”))

einfügen. Einfach mal probieren.

Danke für den Tipp, werde ich versuchen, sobald ich wieder Luft hab.
Hab inzwischen mal eine weniger elegante Variante am laufen, die klappt :wink:

Hatte mit meinem alten Skript leider nicht den gewünschten Erfolg!
Daher hab ich mir was Neues überlegt!
Die Klima wird ausgeschaltet, danach wird geprüft ob sie in Standby geht und das Email erst verschickt, wenn der Standby Betrieb beendet ist und das Gerät KEINEN Strom mehr braucht.
Was noch fehlt ist eine EINMALIGE Email wenn der Standby Betrieb aktiviert wurde, daran arbeite ich noch…
Freue mich über Feedback :wink:

Hier das neue Skript:

--[[
%% properties
%% events
%% globals
--]]
if (fibaro:countScenes()>1) then  fibaro:abort() end -- lösche doppelte Szenen
Debug = function ( color, message ) fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span")) end

KlimaPlug = 334 -- Fibaro Plug für Klimaanlage
KlimaValue = tonumber(fibaro:getValue(KlimaPlug,"value"))
KlimaName = fibaro:getName(KlimaPlug)
KlimaRoom = fibaro:getRoomNameByDeviceID(KlimaPlug)
KlimaPower = fibaro:getValue(KlimaPlug, "power")

function KlimaAusMail()
  fibaro:call(2, "sendEmail", "Fibaro-Status: Klima - AUS", "DeviceName: "..KlimaName.."\nRaum: "..KlimaRoom.." \nist ausgeschaltet")
  fibaro:sleep(3000)
end

function KlimaAusNotify()
  fibaro:setGlobal("PushOver"," "..KlimaRoom.." ,"..KlimaName.." AUS - Verbrauch "..KlimaPower.." Watt,-1,none")
  fibaro:sleep(3000)
end

function KlimaAus()
  KlimaPower = (tonumber(fibaro:getValue(KlimaPlug, "power")))
  if KlimaPower > 5 then
    fibaro:call(411, "setMode", "0") -- Mode OFF
    Debug("yellow",(os.date("%d.%m.%Y - "..KlimaRoom.." - "..KlimaName.." Ausschaltebefehl geschickt - Verbrauch "..KlimaPower.." Watt")))
  end
end

function KlimaCheck()
  KlimaPower = (tonumber(fibaro:getValue(KlimaPlug, "power")))
  if KlimaPower > 20 then
    Debug("orange",(os.date("%d.%m.%Y - "..KlimaRoom.." - "..KlimaName.." wird ausgeschaltet - Verbrauch "..KlimaPower.." Watt")))
  elseif KlimaPower > 3 and KlimaPower < 10 then
    Debug("green",(os.date("%d.%m.%Y - "..KlimaRoom.." - "..KlimaName.." ist bereits im Standby - Verbrauch "..KlimaPower.." Watt")))
  end
end

KlimaAus()
fibaro:sleep(3000)
KlimaPower = (tonumber(fibaro:getValue(KlimaPlug, "power")))
repeat
  KlimaCheck()
  fibaro:sleep(10000)
until KlimaPower < 2

if KlimaPower < 2 then
  Debug("grey",(os.date("%d.%m.%Y - "..KlimaRoom.." - "..KlimaName.." ist ausgeschaltet - Verbrauch "..KlimaPower.." Watt")))
  KlimaAusNotify()
  KlimaAusMail()
end

Habe noch etwas rumgespielt und das Skript noch etwas einfacher gemacht.
Wenn ich euch damit auf die Nerven gehe, lasst es mich wissen :wink:
Bis dahin teile ich weiter meine Ergüsse…

Die Änderung ist nun dass ich die vielen Subroutinen entfernt hab und das Ganze mit Repeats gelöst habe.
Das ist in meinem Fall besser, denn meine Klima braucht zuerst einige Zeit bis sie auf Standby geht und dann noch ca. 10 Min bis sie komplett aus ist.
Mit dem neuen Ablauf bekomme ich die Email & Push Bestätigung erst wenn sie wirklich KEINEN Strom mehr braucht.

--[[
%% properties
%% events
%% globals
--]]
--Name: Klima AUS
if (fibaro:countScenes()>1) then  fibaro:abort() end -- lösche doppelte Szenen
Debug = function ( color, message ) fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span")) end

KlimaPlug = 334 -- Fibaro Plug für Klimaanlage
KlimaValue = tonumber(fibaro:getValue(KlimaPlug,"value"))
KlimaName = fibaro:getName(KlimaPlug)
KlimaRoom = fibaro:getRoomNameByDeviceID(KlimaPlug)
KlimaPower = (tonumber(fibaro:getValue(KlimaPlug, "power")))

if KlimaPower == 0 then
  Debug("grey",(os.date("%d.%m.%Y - "..KlimaRoom.." - "..KlimaName.." ist AUS -  "..KlimaPower.." Watt")))
  fibaro:abort()
elseif KlimaPower > 0 then
  fibaro:call(411, "setMode", "0") -- Mode OFF
  Debug("yellow",(os.date("%d.%m.%Y - "..KlimaRoom.." - "..KlimaName.." AUS-Befehl geschickt -  "..KlimaPower.." Watt")))
  fibaro:sleep(3000)
  repeat
    KlimaPower = (tonumber(fibaro:getValue(KlimaPlug, "power")))
    Debug("orange",(os.date("%d.%m.%Y - "..KlimaRoom.." - "..KlimaName.." wird ausgeschaltet -  "..KlimaPower.." Watt")))
    fibaro:sleep(30000)
  until KlimaPower < 20
  fibaro:call(2, "sendEmail", "Fibaro-Status: Klima - Standby", "DeviceName: "..KlimaName.."\nRaum: "..KlimaRoom.." \nist auf Standby gegangen-  "..KlimaPower.." Watt")
  repeat
    KlimaPower = (tonumber(fibaro:getValue(KlimaPlug, "power")))
    Debug("green",(os.date("%d.%m.%Y - "..KlimaRoom.." - "..KlimaName.." ist bereits im Standby -  "..KlimaPower.." Watt")))
    fibaro:sleep(60000)
  until KlimaPower < 5
  KlimaPower = (tonumber(fibaro:getValue(KlimaPlug, "power")))
  Debug("white",(os.date("%d.%m.%Y - "..KlimaRoom.." - "..KlimaName.." ist AUS -  "..KlimaPower.." Watt")))
  fibaro:call(2, "sendEmail", "Fibaro-Status: Klima - AUS", "DeviceName: "..KlimaName.."\nRaum: "..KlimaRoom.." \nwurde ausgeschaltet "..KlimaPower.." Watt")
  fibaro:setGlobal("PushOver"," "..KlimaRoom.." ,"..KlimaName.." AUS -  "..KlimaPower.." Watt,-1,none")
  fibaro:sleep(2000)
end

Hallo pblacky

Am Anfang hast du geschrieben, dass du ein Skript hast um dein Klimaanlage über den ZXT-120 ein und auszuschalten.
Währe es möglich dises Skripthier zu Posten, da ich ein blutiger Anfänger in sachen LUA bin und es nicht hinbekomme meine Aircon einzuschalten zu einer bestimmten Zeit.

Grüsse
Wayne187

Hallo Wayne187

Ich bin auch noch nicht so geübt in Lua, aber natürlich teile ich gerne was ich schon weiß!
Ich habe es mir da allerdings einfach gemacht, indem ich die Klima mit dem Resume Befehl einschalte. Dieser aktiviert den Zustand vor dem letzten Ausschalten.

Das hängt allerdings auch ein wenig von der Art deiner Kliamanlage und der Integration des ZXT-120 ab!!

Bei mir sind die Befehle wie folgt:

Resume aktivieren: fibaro:call(411, "setMode", "5") --schaltet die Anlage mit den letzten Einstellugnen ein
AUSschalten: fibaro:call(411, "setMode", "0")
Modus Kühlen: fibaro:call(411, "setMode", "2")
Temperatur einstellen: fibaro:call(409, "setThermostatSetpoint", "2", "22") – Kühlung auf 22 Grad

Wobei du die “409” natürlich durch die ID deines ZXT-120 ersetzen musst.
Ich kann dir auch gerne mein komplettes Skript posten, dieses ist allerdings etwas umfangreicher, da ich beim Einschalten der Klima auf prüfe ob Fenster offen sind und diese elektrisch schliesse!

Hallo pblacky

Das währe echt super wenn du das komplette Skript posten könntest, da ich auch den Zustand meiner Fenster abfragen wollte.
Mir geht es darum bei geschlossenen Fenstern die Klimanalge ab 18:30 im Babyzimmer einzuschalten, damit dann um 19:00 angenehme 26°C im Zimmer sind und der kleine schlafen kann.
Die Klimaanlage kann ich komplett über Fibaro steuern (Ein/ Aus, Resume, Temperatur, Fan, Swing)

Gruss
Wayne187

Hallo @Wayne187,
Kannst du mir vielleicht den LUA Befehl für das Ein/AUS schalten des SWING geben?
DAS habe ich leider noch nicht rausgefunden!!

Anbei mein Skript für das Einschalte der Klima:
falls du Fragen hast, melde dich…

--[[
%% properties
%% events
%% globals
--]]
--Name: Klima EIN
if (fibaro:countScenes()>1) then  fibaro:abort() end -- lösche doppelte Szenen
Debug = function ( color, message ) fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span")) end

local KlimaPlug = 334 -- Fibaro Plug für Klimaanlage
local KlimaValue = tonumber(fibaro:getValue(KlimaPlug,"value"))
local KlimaName = fibaro:getName(KlimaPlug)
local KlimaRoom = fibaro:getRoomNameByDeviceID(KlimaPlug)
local KlimaPower = fibaro:getValue(KlimaPlug, "power")
local FensterIDs = {218,360}--218=Fenster SZ, 360=Fenster Küche

function CheckFenster(IDs)
  for i=1, #IDs do
    local FensterValue = tonumber(fibaro:getValue(IDs[i],"value"))
    local FensterName   = fibaro:getName(IDs[i])
	local FensterRoom = fibaro:getRoomNameByDeviceID(IDs[i])
    if (FensterValue > 0) then
      fibaro:call(IDs[i], "close")
      Debug("orange",(os.date("%d.%m.%Y - "..FensterRoom.." - "..FensterName.." wird geschlossen")))
      fibaro:setGlobal("PushOver"," "..FensterRoom.." ,"..FensterName.." wird geschlossen,-1,none")
      fibaro:sleep(1500)
    else
      Debug("green",(os.date("%d.%m.%Y - "..FensterRoom.." - "..FensterName.." ist schon geschlossen")))
    end
  end
end

function KlimaEin()
  local KlimaPower = fibaro:getValue(KlimaPlug, "power")
  CheckFenster(FensterIDs)
  if (tonumber(fibaro:getValue(KlimaPlug, "power")) < 4 ) then
    fibaro:call(411, "setMode", "5") -- Mode RESUME  
    Debug("orange",(os.date("%d.%m.%Y - "..KlimaRoom.." - "..KlimaName.." war AUS, wird eingeschaltet")))
    fibaro:setGlobal("PushOver"," "..KlimaRoom.." ,"..KlimaName.." wurde EINgeschaltet,-1,none")
  elseif (tonumber(fibaro:getValue(KlimaPlug, "power")) > 4 ) and (tonumber(fibaro:getValue(KlimaPlug, "power")) < 10 )then
    fibaro:call(411, "setMode", "5") -- Mode RESUME  
    Debug("green",(os.date("%d.%m.%Y - "..KlimaRoom.." - "..KlimaName.." war STANDBY, wird eingeschaltet - Verbrauch "..KlimaPower.." Watt")))
  elseif (tonumber(fibaro:getValue(KlimaPlug, "power")) > 10 ) then
    Debug("grey",(os.date("%d.%m.%Y - "..KlimaRoom.." - "..KlimaName.." ist bereits EIN - Verbrauch "..KlimaPower.." Watt")))
  end
end
  
if (KlimaValue > 0) then
  Debug("grey",(os.date("%d.%m.%Y - "..KlimaRoom.." - "..KlimaName.." Strom für Klima ist bereits eingeschaltet")))
  KlimaEin()
else
  fibaro:call(KlimaPlug, "turnOn") -- Plug für Klima einschalten
  Debug("orange",(os.date("%d.%m.%Y - "..KlimaRoom.." - "..KlimaName.." Strom für Klima wurde eingeschaltet")))
  fibaro:sleep(1500)
  KlimaEin()
end

Sorry für meine späte Antwort
Den Swing der Air con kann ich nur im webbrowser einstellen.
LUA Befehle gibt es gauble ich nur diese.
Air Con “setMode”
– 0 Off
– 1 Heat
– 2 Cool
– 5 Resume
– 6 Fan Only
– 8 Dry Air
– 10 Auto Changeover

Air Con Fan "setFanMode"
– 0 Auto Low
– 1 Low
– 2 Auto High
– 3 High
– 4 Auto Medium
– 5 Medium
– 128 Off

Air Con temperatur “setSetpointMode”
– 1 Heating
– 2 Cooling
– 8 Dry Air
– 10 Auto Changeover