Rauchalarm Skript geht leider nicht

Hallo, ich habe das neue Skript für die Rauchmelder überprüfung bei mir getestet und habe folgendes Problem:
Drücke ich auf Start im Debug , dann kommt korrekt eine Pushnachricht.
Ich habe als Trigger ein Fenster ausgewählt: ID 27
Allerdings kommt weder ein Pushnachricht, noch geht die Sirene an, wenn ich dieses Fenster ID 27 öffne.

Habe die beiden Debug Fenster mit angehängt.

Was könnte hier die Ursache sein?

--[[
%% properties
27 value

%% globals
--]]

-- IDs der Rauchmelder (Oben in den properties die IDs auch eintragen)
local smokeID = {27}

-- Einstellungen für die Sirene(n) (Wenn keine IDs eingetragen sind, wird die Funktion nicht genutzt)
local sireneID = {145} -- ID der Sirene(n)

-- Einstellungen für Push-Benachrichtigungen (Wenn keine IDs eingetragen sind, wird die Funktion nicht genutzt)
local phoneID = {5} -- ID der Handys

-- Einstellungen für Notfallbeleuchtung (Wenn keine IDs eingetragen sind, wird die Funktion nicht genutzt)
local lightID = {} -- ID der Licht-Module

-- Einstellungen für RGBW-Notfallbeleuchtung (Wenn keine IDs eingetragen sind, wird die Funktion nicht genutzt)
local rgbwID = {} -- ID RGBW
local mode = 'color' -- Auswahl: color = Farbwert setzen; programm = Programm starten
local programm = 5 
local color = '255,255,255,255' -- welche Farbe eingestellt werden soll 

-- Einstellungen für Fluchtweg (Rollershutter/Danalock) (Wenn keine IDs eingetragen sind, wird die Funktion nicht genutzt)
local rollershutterID = {} -- ID der Rollershutter-Module
local danalockID = {} -- ID Danalock

local countID = 500

-- AB HIER NICHTS MEHR ÄNDERN

-- Funktion zum Versenden der Push
function sendPush(text)
 if (phoneID[1] ~= nil) then
  for k=1, countID do
     if phoneID[k] ~= nil then
       fibaro:call(phoneID[k],'sendPush', text, 'smoke')
     end
  end
 end
end

-- Funktion zum Ein-/Ausschalten der Sirene
function onoffSirene(status)
 if (sireneID[1] ~= nil) then 
  if (status == 'true') then
   fibaro:debug('Sirenen einschalten')
   for a=1, countID do
     if sireneID[a] ~= nil then
       fibaro:call(sireneID[a],'turnOn')
     end
   end
  else
   if (sireneID[1] ~= nil) then  
    fibaro:debug('Sirenen ausschalten')
    for a=1, countID do
      if sireneID[a] ~= nil then
        fibaro:call(sireneID[a],'turnOff')
      end
    end
   end
  end
 end
end

-- Funktion zum Ein-/Ausschalten der Notfallbeleuchtung
function emergencyLight(status)
 if (lightID[1] ~= nil) then 
  if (status == 'true') then
   fibaro:debug('Notfallbeleuchtung einschalten')
   for l=1, countID do
     if lightID[l] ~= nil then
       fibaro:call(lightID[l],'turnOn')
     end
   end
  else
   if (lightID[1] ~= nil) then 
    fibaro:debug('Notfallbeleuchtung ausschalten')
    for l=1, countID do
      if lightID[l] ~= nil then
        fibaro:call(lightID[l],'turnOff')
      end
    end 
   end
  end
 end
end

-- Funktion zum Ein-/Ausschalten der RGBW-Notfallbeleuchtung
function emergencyRGBW(status)
 if (rgbwID[1] ~= nil) then 
  if (status == 'true') then
   if (mode == 'color') then 
    fibaro:debug('RGBW-Notfallbeleuchtung einschalten - Setze Farbe')
    local RGBWTable = {}
    local i = 1
    for value in string.gmatch(color,"(%d+)") do
     RGBWTable[i] = value
     i = i + 1
    end
    for o=1, countID do
      if rgbwID[o] ~= nil then
        fibaro:call(rgbwID[o], "setColor", RGBWTable[1], RGBWTable[2], RGBWTable[3], RGBWTable[4])
      end
    end
   elseif (mode == 'programm') then
    fibaro:debug('RGBW-Notfallbeleuchtung einschalten - Starte Programm')
    for o=1, countID do
     if rgbwID[o] ~= nil then
       fibaro:call(rgbwID[o], 'startProgram', programm)
     end
    end
   end 
  else
   if (rgbwID[1] ~= nil) then 
    fibaro:debug('RGBW-Notfallbeleuchtung ausschalten')
    for o=1, countID do
      if rgbwID[o] ~= nil then
        fibaro:call(rgbwID[o], "setColor", 255,0,0,0)
      end
    end 
   end
  end
 end
end

-- Funktion für die Öffnung der Fluchtroute
function openEscapeRoute()
  if (rollershutterID[1] ~= nil) then
    fibaro:debug('Rollläden werden geöffnet.')
    for r=1, countID do
     if rollershutterID[r] ~= nil then
       fibaro:call(rollershutterID[r],'open')
     end
    end
  if (danalockID[1] ~= nil) then
    fibaro:debug('Türschlösser werden geöffnet.')
    for d=1, countID do
     if danalockID[d] ~= nil then
       fibaro:call(danalockID[d],'unsecure')
     end
    end
  end
 end
end

-- Funktion zum Anlegen einer Globalen Variablen
function globalVar(var,val)
  local http = net.HTTPClient()
  http:request("http://127.0.0.1:11111/api/globalVariables", {
    options = {
    method = 'POST',
    headers = {},
    data = '{"name":"'..var..'","value":"'..val..'"}',
    timeout = 10000
  },
  success = function(response)
            local result = response.data;
            if response.status == 200 or response.status == 201 then
              fibaro:debug('Status: ' ..response.status.. ' - Variable wurde angelegt')
            else
              fibaro:debug('Error: ' ..response.status.. ' - Zugriff verweigert')
            end
            end,
  error = function(err)
          fibaro:debug('[ERROR] ' .. err)
          end
  })
end

-- Funktion zum Prüfen des Rauch-Status
function checkSmoke()
 fibaro:debug('1 Rauchmelder meldet sicher. Prüfe die anderen Sensoren.')
 local smoke_counter = 0 
 for s=1, countID do
    if smokeID[s] ~= nil then
      if tonumber(fibaro:getValue(smokeID[s], "value")) == 1 then
        smoke_counter = smoke_counter+1
      end
    end
 end
 if (smoke_counter == 0) then
   fibaro:debug('Alle Rauchmelder sind sicher.')
   return true
 elseif (smoke_counter > 0) then
   fibaro:debug(smoke_counter..' Rauchmelder noch nicht sicher...')
   return false
 end
end

fibaro:debug('Rauchmelder-Szene v1.0RC gestartet.')

local var = 'smoke_alarm'

local trigger = fibaro:getSourceTrigger()

if (trigger['type']=='property') then
  local smokeID = tonumber(trigger['deviceID'])
  local smoke = tonumber(fibaro:getValue(smokeID, "value"))
  local room = fibaro:getRoomNameByDeviceID(smokeID)
  if (fibaro:getGlobal(var) ~= nil) then
    fibaro:debug('Benötigte Variable ' ..var.. ' erkannt.')
  else
    fibaro:debug('Benötigte Variable ' ..var.. ' NICHT erkannt. Wird erstellt.')
    globalVar(var, 'false')
  end
  if (smoke == 1 and fibaro:getGlobal(var) == 'false') then
  	fibaro:debug('Rauch im Raum: ' .. room .. ' erkannt.')
    fibaro:setGlobal(var, 'true')
    onoffSirene(fibaro:getGlobal(var))
    emergencyLight(fibaro:getGlobal(var))
    openEscapeRoute()
    emergencyRGBW(fibaro:getGlobal(var))
    sendPush('ACHTUNG! Rauch im Raum: ' .. room .. ' erkannt!')
    fibaro:call(4, "sendEmail", os.date("ACHTUNG! Rauch im Raum: " .. room .. " erkannt! am %d.%m.%Y um %R:%S"), "smoke, Verlassen Sie sofort den Raum");
  elseif (smoke == 0 and fibaro:getGlobal(var) == 'true') then
    if checkSmoke() then
      fibaro:debug('Schalte Rauch-Alarm aus')
      fibaro:setGlobal(var, 'false')
      onoffSirene(fibaro:getGlobal(var))
      emergencyLight(fibaro:getGlobal(var))
      emergencyRGBW(fibaro:getGlobal(var))
      sendPush('Alle Rauchmelder melden den Status sicher!')
    end
  elseif (smoke == 1 and fibaro:getGlobal(var) == 'true') then
    fibaro:debug('Ein weiterer Rauchmelder im Raum '..room..' hat Rauch erkannt. Alarm bereits ausgelöst.')
    sendPush('Weiterer Rauchmelder - '..room..' - ausgelöst!')
    fibaro:call(4, "sendEmail", os.date("Weiterer Rauchmelder " .. room .. " ausgelöst! am %d.%m.%Y um %R:%S"), "smoke, Verlassen Sie sofort den Raum");
  else
    fibaro:debug('Szene wurde durch Rauchmelder getriggert. Es wurde kein Rauch erkannt.')
  end
else
  fibaro:debug('Szene wurde manuell ausgelöst.')
  if (fibaro:getGlobal(var) ~= nil) then
    fibaro:debug('Benötigte Variable ' ..var.. ' erkannt.')
    fibaro:debug('Versende eine Test-Push-Nachricht')
    sendPush('Push-Nachricht funktioniert. IDs der Handys korrekt.')
  else
    fibaro:debug('Benötigte Variable ' ..var.. ' NICHT erkannt. Wird erstellt.')
    globalVar(var, 'false')
    sendPush('Push-Nachricht funktioniert. ID des Handy korrekt.')
    fibaro:debug('Versende eine Test-Push-Nachricht')
  end
end

Hi,

wenn du jetzt hier einen neuen Thread aufmachst, dann brauch ich ja auf deinen Kommentar nicht mehr antworten.

Erst einmal wäre es gut, wenn du die Leerzeile im Header entfernst. Dies könnte die Ausführung des Skriptes verhindern. Habe das Skript grad nochmal mit einem Fenstersensor getestet. Dies funktioniert ohne Probleme. Der Debug der Szene wäre nicht schlecht :slight_smile:

Gruß

@boomx, Ja, da gebe ich dir recht, sorry, kam nur nicht weiter und dachte mir das Skript hier reinzusetzen bringt dann sofort die Erleuchtung.

Ich werde die Leerzeile im Header entfernen und berichten. Bei dir hat es ja auch funktioniert. Bekommst Du dann eine Alarmmeldung und die Sirene geht los, wenn du dieses Fenster öffnest?

@boomx, so, habe die Leerzeile im Header entfernt, den Fensterkontakt ID27 betätigt und man sieht nur im Debug folgende Meldung die ich angehängt habe.
Keine Pushnachricht, keine Sirene an.

Bin am verzweifeln, warum genau dieses Skript bei dir geht und bei mir nicht. Kann es an der anderen Ref. liegen, ich habe 4.080 du hast ja noch eine vorhergehende, wie du mal berichtet hast.

Rauchmelder.jpg

Hi,

lass dir mal am Anfang des Skriptes den Value des Kontaktes ausgeben. Vielleicht passt der Value nicht.

Gruß

@boomx, Äh und wie mache ich das?

In Zeile 10 hinzufügen:

fibaro:debug(fibaro:getValue(27, "value"))

Gruß

Hast Du den Sensor auch aktiviert vor dem testen?
Das war bei mir das Problem. Nur Fenster bzw. Tür öffnen reicht nicht, der Sensor muss scharf sein.

Hi,

muss er eigentlich nicht. Die value ändert sich auch bei ungeschärften Sensoren.

Gruß

@boomx, so, habe die Zeile eingefügt und die Value steht auf 1 beim öffnen des Fensters. Habe es wieder geschlossen, dann steht er auf 0. Im zweiten Anhang habe ich sogar den Fenstermelder auf geschärft gesetzt. Aber wie gehabt keine Meldung, keine Sirene.

Rauchmelder-1.jpg

Rauchmelder-1-1.jpg

@boomx, konntest Du irgendwelche Fehler erkennen? Mich wundert hier nur, das dieses Skirpt nur bei mir nicht laufen soll? Hat keiner im Forum das gleiche Problem?

@boomx, ich habe das Skript jetzt noch mal runtergeladen, noch mal entpackt, frisch reingeladen, einen anderen Türsensor eingebunden, und sonst nichts weiteres. Er bringt behaarlich Scene wurde durch Rauchmelder getriggert.Es wurde kein Rauch erkannt.

Was ich nicht verstehe, was bedeutet diese Debug Meldung. Wenn die Szene ja getriggert wurde, warum hat er dann keinen Rauch erkannt. Getriggert ohne Rauch, wo ist hier der Hintergrund?

Habe noch mal den neuesten Debug dran gehängt.

Hi,

die Rauchmelder führen ab und an mal die Szene aus, obwohl die Value = 0 ist. Warum weiß ich leider nicht, aber das muss auf jeden Fall abgefangen werden.

Bevor ich das Skript nochmal teste: Was steht in der Variablen? true oder false? Oder etwa NaN… Wenn es das ist, dann weiß ich wo das Problem liegt.

Gruß

V1.1RC:

NaN-Fehler gefixt. (Nach jedem Neustart des HC kontrollieren, bzw. die Szene manuell ausführen)

--[[
%% properties
14 value
%% globals
--]]

-- IDs der Rauchmelder (Oben in den properties die IDs auch eintragen)
local smokeID = {14}

-- Einstellungen für die Sirene(n) (Wenn keine IDs eingetragen sind, wird die Funktion nicht genutzt)
local sireneID = {} -- ID der Sirene(n)

-- Einstellungen für Push-Benachrichtigungen (Wenn keine IDs eingetragen sind, wird die Funktion nicht genutzt)
local phoneID = {} -- ID der Handys

-- Einstellungen für Notfallbeleuchtung (Wenn keine IDs eingetragen sind, wird die Funktion nicht genutzt)
local lightID = {} -- ID der Licht-Module

-- Einstellungen für RGBW-Notfallbeleuchtung (Wenn keine IDs eingetragen sind, wird die Funktion nicht genutzt)
local rgbwID = {} -- ID RGBW
local mode = 'color' -- Auswahl: color = Farbwert setzen; programm = Programm starten
local programm = 5 
local color = '255,255,255,255' -- welche Farbe eingestellt werden soll 

-- Einstellungen für Fluchtweg (Rollershutter/Danalock) (Wenn keine IDs eingetragen sind, wird die Funktion nicht genutzt)
local rollershutterID = {} -- ID der Rollershutter-Module
local danalockID = {} -- ID Danalock

local countID = 500

-- AB HIER NICHTS MEHR ÄNDERN

-- Funktion zum Versenden der Push
function sendPush(text)
 if (phoneID[1] ~= nil) then
  for k=1, countID do
     if phoneID[k] ~= nil then
       fibaro:call(phoneID[k],'sendPush', text, 'smoke')
     end
  end
 end
end

-- Funktion zum Ein-/Ausschalten der Sirene
function onoffSirene(status)
 if (sireneID[1] ~= nil) then 
  if (status == 'true') then
   fibaro:debug('Sirenen einschalten')
   for a=1, countID do
     if sireneID[a] ~= nil then
       fibaro:call(sireneID[a],'turnOn')
     end
   end
  else
   if (sireneID[1] ~= nil) then  
    fibaro:debug('Sirenen ausschalten')
    for a=1, countID do
      if sireneID[a] ~= nil then
        fibaro:call(sireneID[a],'turnOff')
      end
    end
   end
  end
 end
end

-- Funktion zum Ein-/Ausschalten der Notfallbeleuchtung
function emergencyLight(status)
 if (lightID[1] ~= nil) then 
  if (status == 'true') then
   fibaro:debug('Notfallbeleuchtung einschalten')
   for l=1, countID do
     if lightID[l] ~= nil then
       fibaro:call(lightID[l],'turnOn')
     end
   end
  else
   if (lightID[1] ~= nil) then 
    fibaro:debug('Notfallbeleuchtung ausschalten')
    for l=1, countID do
      if lightID[l] ~= nil then
        fibaro:call(lightID[l],'turnOff')
      end
    end 
   end
  end
 end
end

-- Funktion zum Ein-/Ausschalten der RGBW-Notfallbeleuchtung
function emergencyRGBW(status)
 if (rgbwID[1] ~= nil) then 
  if (status == 'true') then
   if (mode == 'color') then 
    fibaro:debug('RGBW-Notfallbeleuchtung einschalten - Setze Farbe')
    local RGBWTable = {}
    local i = 1
    for value in string.gmatch(color,"(%d+)") do
     RGBWTable[i] = value
     i = i + 1
    end
    for o=1, countID do
      if rgbwID[o] ~= nil then
        fibaro:call(rgbwID[o], "setColor", RGBWTable[1], RGBWTable[2], RGBWTable[3], RGBWTable[4])
      end
    end
   elseif (mode == 'programm') then
    fibaro:debug('RGBW-Notfallbeleuchtung einschalten - Starte Programm')
    for o=1, countID do
     if rgbwID[o] ~= nil then
       fibaro:call(rgbwID[o], 'startProgram', programm)
     end
    end
   end 
  else
   if (rgbwID[1] ~= nil) then 
    fibaro:debug('RGBW-Notfallbeleuchtung ausschalten')
    for o=1, countID do
      if rgbwID[o] ~= nil then
        fibaro:call(rgbwID[o], "setColor", 255,0,0,0)
      end
    end 
   end
  end
 end
end

-- Funktion für die Öffnung der Fluchtroute
function openEscapeRoute()
  if (rollershutterID[1] ~= nil) then
    fibaro:debug('Rollläden werden geöffnet.')
    for r=1, countID do
     if rollershutterID[r] ~= nil then
       fibaro:call(rollershutterID[r],'open')
     end
    end
  if (danalockID[1] ~= nil) then
    fibaro:debug('Türschlösser werden geöffnet.')
    for d=1, countID do
     if danalockID[d] ~= nil then
       fibaro:call(danalockID[d],'unsecure')
     end
    end
  end
 end
end

-- Funktion zum Anlegen einer Globalen Variablen
function globalVar(var,val)
  local http = net.HTTPClient()
  http:request("http://127.0.0.1:11111/api/globalVariables", {
    options = {
    method = 'POST',
    headers = {},
    data = '{"name":"'..var..'","value":"'..val..'"}',
    timeout = 10000
  },
  success = function(response)
            local result = response.data;
            if response.status == 200 or response.status == 201 then
              fibaro:debug('Status: ' ..response.status.. ' - Variable wurde angelegt')
            else
              fibaro:debug('Error: ' ..response.status.. ' - Zugriff verweigert')
            end
            end,
  error = function(err)
          fibaro:debug('[ERROR] ' .. err)
          end
  })
end

-- Funktion zum Prüfen des Rauch-Status
function checkSmoke()
 fibaro:debug('1 Rauchmelder meldet sicher. Prüfe die anderen Sensoren.')
 local smoke_counter = 0 
 for s=1, countID do
    if smokeID[s] ~= nil then
      if tonumber(fibaro:getValue(smokeID[s], "value")) == 1 then
        smoke_counter = smoke_counter+1
      end
    end
 end
 if (smoke_counter == 0) then
   fibaro:debug('Alle Rauchmelder sind sicher.')
   return true
 elseif (smoke_counter > 0) then
   fibaro:debug(smoke_counter..' Rauchmelder noch nicht sicher...')
   return false
 end
end

fibaro:debug('Rauchmelder-Szene v1.1RC gestartet.')

local var = 'smoke_alarm'

local trigger = fibaro:getSourceTrigger()

if (trigger['type']=='property') then
  local smokeID = tonumber(trigger['deviceID'])
  local smoke = tonumber(fibaro:getValue(smokeID, "value"))
  local room = fibaro:getRoomNameByDeviceID(smokeID)
  if (fibaro:getGlobal(var) ~= nil) then
    fibaro:debug('Benötigte Variable ' ..var.. ' erkannt.')
  else
    fibaro:debug('Benötigte Variable ' ..var.. ' NICHT erkannt. Wird erstellt.')
    globalVar(var, 'false')
  end
  if (smoke == 1 and fibaro:getGlobal(var) == 'false') then
  	fibaro:debug('Rauch im Raum: ' .. room .. ' erkannt.')
    fibaro:setGlobal(var, 'true')
    onoffSirene(fibaro:getGlobal(var))
    emergencyLight(fibaro:getGlobal(var))
    openEscapeRoute()
    emergencyRGBW(fibaro:getGlobal(var))
    sendPush('ACHTUNG! Rauch im Raum: ' .. room .. ' erkannt!')
  elseif (smoke == 0 and fibaro:getGlobal(var) == 'true') then
    if checkSmoke() then
      fibaro:debug('Schalte Rauch-Alarm aus')
      fibaro:setGlobal(var, 'false')
      onoffSirene(fibaro:getGlobal(var))
      emergencyLight(fibaro:getGlobal(var))
      emergencyRGBW(fibaro:getGlobal(var))
      sendPush('Alle Rauchmelder melden den Status sicher!')
    end
  elseif (smoke == 1 and fibaro:getGlobal(var) == 'true') then
    fibaro:debug('Ein weiterer Rauchmelder im Raum '..room..' hat Rauch erkannt. Alarm bereits ausgelöst.')
    sendPush('Weiterer Rauchmelder - '..room..' - ausgelöst!')
  elseif (fibaro:getGlobal(var) == 'NaN') then
    fibaro:debug('ACHTUNG: Wert der Variablen stimmt nicht. Skript einmal manuell ausführen')
  else
    fibaro:debug('Szene wurde durch Rauchmelder getriggert. Es wurde kein Rauch erkannt.')
  end
else
  fibaro:debug('Szene wurde manuell ausgelöst.')
  if (fibaro:getGlobal(var) ~= nil) then
    fibaro:debug('Benötigte Variable ' ..var.. ' erkannt.')
     if (fibaro:getGlobal(var) == 'NaN') then
       fibaro:debug('Inhalt: ' ..fibaro:getGlobal(var).. ' erkannt. Wird korrigiert.')
       fibaro:setGlobal(var, 'false')
     else
       fibaro:debug('Inhalt: ' ..fibaro:getGlobal(var).. ' erkannt. Ist korrekt.')
     end
     fibaro:debug('Versende eine Test-Push-Nachricht')
     sendPush('Push-Nachricht funktioniert. IDs der Handys korrekt.')
  else
    fibaro:debug('Benötigte Variable ' ..var.. ' NICHT erkannt. Wird erstellt.')
    globalVar(var, 'false')
    sendPush('Push-Nachricht funktioniert. IDs der Handys korrekt.')
    fibaro:debug('Versende eine Test-Push-Nachricht')
  end
end

smoke.jpg

Hallo boomx, so die neue Ver. 1.1 reingeladen und was soll ich sagen, es funktioniert. Wenn ich mich erinnere, war im alten Skript immer NaN in der Varibale gestanden.

Als Anhang habe ich noch mal die jetzige Debugmeldung angehängt.

Ist hier auch gleich die von dir beschriebene, fälschliche ab und zu Auslösung der Rauchmelder obwohl der Value auf 0 ist gefixt?

smoke_neu.jpg

smoke1.jpg

Ok, perfekt. Mir ist es nur aufgefallen, da hier letztens der Strom weg war und das HC neu gestartet hat. Da stand dann bei mir auch NaN.

Mehr hab ich am Code nicht geändert. Es wird noch debuggt, löst aber nicht aus. Sollte so passen…

Gruß

Das Problem hatte ich auch mit der Version 1.0 aber jetzt mit der 1.1 funktioniert es ausgezeichnet, super.

Jetzt müsst ihr nur noch den Link zum Download auf der page:

So programmierst du deinen Rauchalarm – UPDATE

anpassen.

Hi,

ich kümmere mich morgen drum. Hatte vor es als kleinen Artikel zu veröffentlichen. Ist ja schon wichtig.

Gruß