Lüfter steuern über LUA Script

Guten Tag die Herren,
ich habe seit letzer Woche das Home Center 2 erworben und langsam aber sicher stellen sich mir die ersten Fragen. Es wäre super, wenn irh mir bei folgendem Problem weiterhelfen könntet:
Ich möchte meinen Badlüfter über den Feuchtigkeitssensor (Multi-Sensor 6 (22)) ansteuern. Dabei soll der Lüfter(32) angeschaltet werden, wenn die Luftfeuchtigkeit gleich oder höher als 57% liegt. Jetzt mein Problem: Der Lüfter soll ausgehen, wenn die Luftfeuchtigkeit unter 65% fällt.
Könntet ihr bitte das folgende Script anschauen und mir den Fehler nennen.
Vielen Dank!

--[[
%% autostart
%% properties
22 value
%% weather
%% events
%% globals
--]]

local startSource = fibaro:getSourceTrigger();
if (
 ( tonumber(fibaro:getValue(22, "value")) >= 57 )
or
startSource["type"] == "other"
)
then
	fibaro:call(32, "turnOn");
if (
 ( tonumber(fibaro:getValue(22, "value")) <= 65 )
)
then
	fibaro:call(32, "turnOff");
end

Hi,

dafür gibt es bereits ein fertiges Skript :wink:

https://www.siio.de/lua-scripte-luftfeuchtigkeit-im-raum-ueberwachen/

Bei deinem sind auf jeden Fall die Trigger falsch, da es sich hierbei nicht um eine Autostart-Szene handelt. Da solltest du dich noch ein wenig schlau lesen :slight_smile: Dies kannst du hier tun:

https://www.siio.de/szenen-im-fibaro-homecenter-einsteigerguide-teil-1/

https://www.siio.de/fibaro-homecenter-einsteigerguide-teil-2-getriggerte-szenen/

Gruß

Vor allem ist da ein logischer Fehler

Wert = 60

-> ist größer 57 -> an
-> ist zugleich kleiner 65 -> sofort wieder aus

dann eher 55?

Hallo Die Herren,

vielen Dank für eure Hilfe. Ich habe das script vom BOOMX verwendet und angepasst:

--[[
%% autostart
%% properties
22 value
%% globals
--]]
 
local humID = 22
local pro = 60
 
function actionToHigh()
	fibaro:call(32, "turnOn")
end
 
Debug = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end
 
local hum = tonumber(fibaro:getValue(humID, "value"))
 
fibaro:debug('Check Luftfeuchtigkeit v.01 gestartet.')
  
if (hum > pro) then
  local room = fibaro:getRoomNameByDeviceID(humID)
  Debug( 'blue', 'Luftfeuchtigkeit im Raum: ' .. room .. ' ist mit ' ..hum.. ' % zu hoch.')
  actionToHigh()
else
  local room = fibaro:getRoomNameByDeviceID(humID)
  Debug( 'green', 'Luftfeuchtigkeit im Raum: ' .. room .. ' ist mit ' ..hum.. ' % ok.')
end

Frage dazu: Muss denn die Aktion (32 ist der Lüfter):

function actionToHigh()
	fibaro:call(32, "turnOn")

denn nicht wieder aktiv beendet werden?
Gibt es keinen Befehl:
fibaro:call(32, "turnOff")
wenn die Luftfeuchtigkeit unter 60 sinkt?

Danke für eure Hilfe !

Es muss immer noch das Autostart im Header weg… Siehe oben. :wink:

Das kannst du nach der Zeile 29 einfügen. Dort läuft die Szene rein, wenn die Luftfeuchtigkeit wieder passt.

Gruß

Hallo Boomx,

echt klasse, deine super schnelle Hilfe!

Passt es jetzt??

--[[
%% properties
22 value
%% globals
--]]
 
local humID = 22
local pro = 65
 
function actionToHigh()
	fibaro:call(32, "turnOn")
end
 
Debug = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end
 
local hum = tonumber(fibaro:getValue(humID, "value"))
 
fibaro:debug('Check Luftfeuchtigkeit v.01 gestartet.')
  
if (hum > pro) then
  local room = fibaro:getRoomNameByDeviceID(humID)
  Debug( 'blue', 'Luftfeuchtigkeit im Raum: ' .. room .. ' ist mit ' ..hum.. ' % zu hoch.')
  actionToHigh()
else
  local room = fibaro:getRoomNameByDeviceID(humID)
  Debug( 'green', 'Luftfeuchtigkeit im Raum: ' .. room .. ' ist mit ' ..hum.. ' % ok.')
  fibaro:call(32, "turnOff")
end

Viele Grüße

Jo, sieht gut aus :slight_smile:

Hallo Boomx,

habe es gestest und es läuft 1A !
Perfekt und vielen Dank!

Cool, freut mich, dass es funktioniert :slight_smile:

Gruß

Hallo,
ich möchte mich gern an dieses Thema “ranhängen”.
Vielen Dank für das Script, was erfolgreich in meinem Waschkeller läuft und zuverlässig die Luftfeuchte reguliert.
Mein Erweiterungsgedanke besteht darin, eine Bedingung einzuführen. Wenn das Fenster geöffnet ist, soll der Fensterkontakt die Szene anhalten bzw. wenn wieder geschlossen, dann wird die Szene fortgesetzt.
Könnt Ihr mir dazu helfen?
Vielen Dank, Nils.

Hi,

die Szene wird durch die Änderung der Luftfeuchte getriggert. Ich würde von daher die Szene nicht noch zusätzlich vom Fensterkontakt triggern lassen, sondern stattdessen die Bedingungen (Zeile 22) entsprechend anzupassen und dort den Fensterkontakt abzufragen.

Gruß

Vielen Dank für die schnelle Rückmeldung.
Ich bin nicht der Programmiereier, wie Du vielleicht bereits gemerkt hast. Kannst Du mir helfen, wie das Script ab Zeile 22 aussehen soll?
Vielen Dank, Nils.

Das sollte auch ein Nicht-Programmierer hinbekommen :slight_smile:

In Zeile 22 folgendes in der if-Abfrage hinzufügen. ID musst du auf deine ID anpassen:

AND tonumber(fibaro:getValue(112, "value")) == 0

Gruß

Vielen vielen Dank!
Teste ich am Wochenende und melde mich.
Viele Grüße, Nils.

Hallo,
ich habe das Script ein bisschen angepasst.
Leider habe ich das Problem, das ich immer alte werte auf das Handy gesendet bekomme.
Wenn der wert unter 60% ist, schreibt er Luftfeuchtigkeit im Bart mit 62% wieder gut.
Also den letzten hohen wert den er gemessen hatte. Denke ich! Ich weis leider nicht was ich ändern muss?

--[[
%% properties
89 value
%% globals

--]]
------------- Module ----------------
local scene = 31 -- ID dieser Szene
local switchID1 = 141 -- ID des Schalter
local senID = 89 -- ID des Feuchtigkeitssensor
local phoneID = {95} -- Handy IDs für Nachrichten senden 
------------- Werte -------------------
local nas = 60 -- hier wird die feuchtigkeit eingegeben
local run = 0  
local counter = 0
local hum = tonumber(fibaro:getValue(senID, "value"))
local room = fibaro:getRoomNameByDeviceID(senID)
local currentDate = os.date('*t')
local version = "0.6"
------------------ Debug Farben --------------------------------------
local Debug = function ( color, message ) 
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span")) 
end
-- Lösche doppelte Szene(n)
if (fibaro:countScenes()>1) then
fibaro:debug('Beende Doppelte Szene');
fibaro:abort();
end
------------ Aktionen ---------------------  
  
-- Funktion zum Versenden der Push Handy nachrichten
function sendPush(text)
if (phoneID[1] ~= nil) then
   for i=1, #phoneID do
    local phoneName = fibaro:getName(phoneID[i])
     if phoneID[i] ~= nil then
       fibaro:debug("Versende nachricht an "..phoneName .." Handy: " .. text)
       fibaro:call(phoneID[i],"sendPush", text, "alarm")
     end
  end
 end
end
-- Funktion zum anschalten der Lüfter bei zu hoher Luftfeuchtigkeit
function actionToHigh()
  -- Sende Push an alle Handys
    sendPush ("Luftfeuchtigkeit im Raum: ".. room .." ist mit "..hum.."% zu hoch.")
    Debug("blue","sendet Handy nachrichten: Luftfeuchtigkeit zu hoch");
  -- Macht Lüfter an  
    fibaro:call(switchID1, "turnOn");
	Debug("red","Der Lüfter im Badezimmer ist eingeschaltet")  
end 
-- Funktion zum abschalten der Lüfter wenn Luftfeuchtigkeit wieder OK ist
function actionToOK()
  -- Sende Push an alle Handys
    sendPush("Luftfeuchtigkeit im "..room.." mit "..hum.."% wieder gut") 
    Debug("blue","sendet Handy nachrichten: Wieder OK")
  -- Macht Lüfter aus  
    fibaro:call(switchID1, "turnOff");
	Debug("green","Der Lüfter im Badezimmer ist ausgeschaltet"); 
    fibaro:killScenes(scene);
end 
 

---------------- Luftfeuchtigkeitsmessung ----------------
if (hum > nas) then
  Debug("tan","Check Luftfeuchtigkeit Version ".. version.." gestartet.")
  Debug("red", "Luftfeuchtigkeit im Raum: ".. room .." ist mit "..hum.."% zu hoch.")
  actionToHigh()
  fibaro:sleep(10*1000);
  run = 1 
end
-- Startet timmer für Lüfter wenn die luftfeuchtigkeit zuhoch --
while run == 1 do
    if (tonumber(fibaro:getValue(senID, "value")) < nas) then
      if (counter == 20) then
          Debug("green","Luftfeuchtigkeit im "..room.." mit "..hum.."% wieder gut");
          actionToOK()
          run = 0
    end
      counter = counter + 1
      fibaro:debug(counter)
-------- Luftfeuchtig Prüfung stellt timmer neu --------
  elseif (tonumber(fibaro:getValue(senID, "value")) > nas ) then
          Debug("tan","Luftfeuchtigkeit ist wieder zuhoch")
          Debug("red","Luftfeuchtigkeit im Raum "..room.." mit "..hum.."% zuhoch");
          counter = 0
   end
fibaro:sleep(30*1000)  
end

Hallo @Flummi01,

hab da Interesse halber drüber geschaut:

Die Variable hum wird nur ganz am Anfang deines Skriptes belegt und später nicht mehr geändert. Kann sich also gar nicht ändern/aktualisieren.
Du müsstes diese Zeile:
hum = tonumber(fibaro:getValue(senID, “value”))
Irgendwo in deiner Schleife einbauen. Z.B. vor Zeile 73. Dann kannst Du auch alle Sensorabfragen tonumber(fibaro:getValue(senID, “value”)) in der Schleife durch hum ersetzen. Wär die “saubere” Lösung.

Hallo @Ändy,
ich werde das gleichmal ausprobieren!
Danke dir

Habe ich jetzt in die schleife eingebaut!
Da klappt es so wie es soll.
Also hinter Zeile 73.
Aber vielen Dank für den Tipp.

Hallo Flummi01
Wäre sehr interessiert an dieser Szene, möchtest Du die funktionierende Variante zur Verfügung stellen?
Vielen Dank schonmal…
Gruss fastsnake

Hier die Laufende Version.

--[[
%% properties
89 value
%% globals

--]]
------------- Module ----------------
local scene = 31 -- ID dieser Szene
local switchID1 = 141 -- ID des Schalter
local senID = 89 -- ID des Feuchtigkeitssensor
local phoneID = {95} -- Handy IDs für Nachrichten senden 
------------- Werte -------------------
local nas = 60 -- hier wird die feuchtigkeit eingegeben
local run = 0  
local counter = 0
local hum = tonumber(fibaro:getValue(senID, "value"))
local room = fibaro:getRoomNameByDeviceID(senID)
local currentDate = os.date('*t')
local version = "0.6"
------------------ Debug Farben --------------------------------------
local Debug = function ( color, message ) 
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span")) 
end
-- Lösche doppelte Szene(n)
if (fibaro:countScenes()>1) then
fibaro:debug('Beende Doppelte Szene');
fibaro:abort();
end
------------ Aktionen ---------------------  
  
-- Funktion zum Versenden der Push Handy nachrichten
function sendPush(text)
if (phoneID[1] ~= nil) then
   for i=1, #phoneID do
    local phoneName = fibaro:getName(phoneID[i])
     if phoneID[i] ~= nil then
       fibaro:debug("Versende nachricht an "..phoneName .." Handy: " .. text)
       fibaro:call(phoneID[i],"sendPush", text, "alarm")
     end
  end
 end
end
-- Funktion zum anschalten der Lüfter bei zu hoher Luftfeuchtigkeit
function actionToHigh()
  -- Sende Push an alle Handys
    sendPush ("Luftfeuchtigkeit im Raum: ".. room .." ist mit "..hum.."% zu hoch.")
    Debug("blue","sendet Handy nachrichten: Luftfeuchtigkeit zu hoch");
  -- Macht Lüfter an  
    fibaro:call(switchID1, "turnOn");
	Debug("red","Der Lüfter im "..room.." ist eingeschaltet")  
end 
-- Funktion zum abschalten der Lüfter wenn Luftfeuchtigkeit wieder OK ist
function actionToOK()
  -- Sende Push an alle Handys
    sendPush("Luftfeuchtigkeit im "..room.." mit "..hum.."% wieder gut") 
    Debug("blue","sendet Handy nachrichten: Wieder OK")
  -- Macht Lüfter aus  
    fibaro:call(switchID1, "turnOff");
	Debug("green","Der Lüfter im Badezimmer ist ausgeschaltet"); 
    fibaro:killScenes(scene);
end 
 
 
---------------- Luftfeuchtigkeitsmessung ----------------
if (hum > nas) then
  Debug("tan","Check Luftfeuchtigkeit Version ".. version.." gestartet.")
  Debug("red", "Luftfeuchtigkeit im Raum: ".. room .." ist mit "..hum.."% zu hoch.")
  actionToHigh()
  fibaro:sleep(10*1000);
  run = 1 
end
-- Startet timmer für Lüfter wenn die luftfeuchtigkeit zuhoch --
while run == 1 do 
  hum = tonumber(fibaro:getValue(senID, "value"))
    if (hum < nas) then
      if (counter == 20) then
          Debug("green","Luftfeuchtigkeit im "..room.." mit "..hum.."% wieder gut");
          actionToOK()
          run = 0
    end
      counter = counter + 1
      fibaro:debug(counter)
-------- Luftfeuchtig Prüfung stellt timmer neu --------
  elseif (hum > nas ) then
          Debug("red","Luftfeuchtigkeit im Raum "..room.." mit "..hum.."% immer noch zuhoch");
          counter = 0
   end
fibaro:sleep(30*1000)  
end