Hilfe beim Alarmscript

Hallo,

ich wollte das Alarmscript für meine Wünsche etwas anpassen. Ich wollte das bei stillen Alarm mir eine Push-Nachricht auf mein Handy geschickt wird, wo einmal der Alarm angezeigt wird und in welchem Raum bzw. Fenster der Alarm ausgelöst wird. Die Nachricht bei stillen Alarm kommt, aber wo er ist funktioniert einfach nicht. Vielleicht kann mir hier jemand helfen wo mein Fehler ist. Bei Zeile 165 fängt der stille Alarm an ! Ich bin langsam am verzweifeln wo der Fehler liegt.

Grüße und schon mal Danke

--[[
%% properties
%% globals
--]]

-- Einstellungen für die Sensoren (Zwingend erforderlich)
local sensorID = {209, 40, 43, 222, 237, 248, 253, 227, 219, 258} -- ID der Sensoren(n)

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

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

-- soll ein stiller Alarm genutzt werden? (true = ja/false = nein; silent_alarm_time: Sekunden wie lang der stille Alarm bestehen soll)
-- hier werden die Sirenen/Licht erst nach einer bestimmten Zeit aktiv. Bild der Kamera, Push und Meldung des Alarmpanels wird VOR dem stillen Alarm ausgeführt
local silent_alarm = true
local silent_alarm_time = 10

-- soll ein Bild der Kamera versendet werden (true = ja/false = nein)
local camera_support = false

-- an welche Mail soll ein Bild der Kamera gesendet werden
local email = 'test@test.de'

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

-- Sollen eigene Aktionen ausgeführt werden? (true = ja/false = nein; Bei true müssen die beiden nächsten Funktionen befüllt werden)
local own_action = false

function ownaction_alarm()
  
  -- eigene Aktion bei Alarm
  fibaro:debug('Eigene Aktionen bei Alarm ausgeführt')
end

function ownaction_afteralarm()
  -- eigene Aktion nach dem Alarm
  fibaro:debug('Eigene Aktionen nach dem Alarm ausgeführt')
end

local countID = 500

-- AB HIER NICHTS MEHR ÄNDERN

Debug = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, message, "span"))
end

-- Funktion zum Ein-/Ausschalten der Sirene
function onoffSirene(status)
 if (sireneID[1] ~= nil) then 
  if (status) 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 RGBW-Notfallbeleuchtung
function emergencyRGBW(status)
 if (rgbwID[1] ~= nil) then 
  if (status) 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

function cameracheck(roomID)
  for x=1, countID do
    if (fibaro:getType(x) == 'com.fibaro.ipCamera') then
      if (roomID == fibaro:getRoomID(x)) then
        fibaro:debug('Kamera ' ..x.. ' im betroffenen Raum erkannt. Sende Mail an ' ..email)
        fibaro:call(x, 'sendPhotoToEmail', email)
      else
        fibaro:debug('Keine Kamera im betroffenden Raum gefunden.')
      end
    end
  end
end

function checkSensor()
  for j=1, countID do
    if sensorID[j] ~= nil then
      if (tonumber(fibaro:getValue(sensorID[j], 'value')) == 1) then
         return sensorID[j]
      end
    end
  end
end

function checkSensorArmed()
  local armed_counter = 0 
  for j=1, countID do
    if sensorID[j] ~= nil then
      if (tonumber(fibaro:getValue(sensorID[j], 'armed')) == 1) then
         armed_counter = armed_counter+1
      end
    end
  end
  if (armed_counter == 0) then
   return false
  elseif (armed_counter > 0) then
   fibaro:debug(armed_counter..' Sensoren noch nicht entschärft ...')
   return true
 end
end
Debug( 'red', '___________________________')
Debug( 'red', 'Alarm-Szene 2.2 wurde ausgelöst.')
Debug( 'white', 'Aktionen werden ausgeführt.')
Debug( 'white', 'Sensor im Raum ' ..fibaro:getRoomNameByDeviceID(checkSensor()).. ' ausgelöst')

if camera_support then
  cameracheck(fibaro:getRoomID(checkSensor()))
else
  Debug( 'red', 'Keine Kameras im Einsatz')
end

if silent_alarm then 
   fibaro:debug('Stiller Alarm wurde aktiviert. Dauer: ' ..silent_alarm_time)
  counter = 0
  for k=1, countID do
     if phoneID[k] ~= nil then
        fibaro:call(phoneID[k],'sendPush', "Stiller Alarm wurde ausgelöst für "..silent_alarm_time.." sec");
   
    for id = 1, #sensorID do
    if (tonumber(fibaro:getValue(sensorID[id], 'armed')) == 1) then
          local name  = fibaro:getName(sensorID[id])
          local room  = fibaro:getRoomNameByDeviceID(sensorID[id])
          fibaro:call(phoneID[k],'sendPush', " ACHTUNG! " ..name.. " im Raum " ..room.. " hat Alarm geschlagen");
        end
      end
    end
  

  while (counter <= silent_alarm_time and checkSensorArmed()) do
   counter = counter + 1
   fibaro:sleep(1*1000)
  end
end
else
  Debug( 'white', 'Stiller Alarm wird nicht genutzt.')
end

if checkSensorArmed() then
  if (own_action) then
    ownaction_alarm()
  end
  onoffSirene(true)
  emergencyRGBW(true)
elseif silent_alarm then
  Debug('green', 'Stiller Alarm beendet, Geräte entschärft.')
end

while checkSensorArmed() do
  Debug( 'red', 'Alarm weiterhin ausgelöst.')
  
   if (phoneID[1] ~= nil) then
  for k=1, countID do
    if phoneID[k] ~= nil then
      fibaro:call(phoneID[k],'sendPush', "ALARM, ALARM");
    end
  end
 end
  
  fibaro:sleep(2*1000)
end
fibaro:debug('Alle Sensoren entschärft.')
Debug('green', 'Alarm wurde beendet.')
  if (own_action) then
    ownaction_afteralarm()
  end
emergencyRGBW(false)
onoffSirene(false)

Hi Guido,

ich denke so kann es nicht funktionieren, die Sensoren sind ja immer noch ‘armed’. Vielmehr musst Du auf offene Tür/Fenster abfragen, also so:

if tonumber(fibaro:getValue(sensorID[id], 'value')) == 1 then

Keine Ahnung von wo Du dieses Alarm Script 2.2 hast. Ich kenne hier im Forum nur 2.0. Außerdem sollte weiter oben die Funktion zum Versenden der Push hinterlegt werden. Das vereinfacht einiges.

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

Jetzt brauchts Du nur noch: sendPush(" ACHTUNG! " …name… " im Raum " …room… " hat Alarm geschlagen"); aufrufen
Viel Erfolg und guten Rutsch.

Abend Jeep,

auch dir einen baldigen guten Rutsch.

vielen Dank für die ganzen Hinweise.Habe das Script nun nochmal umgebaut aber leider nur ein Teilerfolg. Genau einmal kam die Push-Nachricht auf mein Handy wo der Alarm losgegangen ist. Irgendwie hat das Script bei dem code if tonumber(fibaro:getValue(sensorID[id], 'value')) == 1 then ein Problem. Wenn ich zum Beispiel >1 nehme kommt die Push Nachricht aber dann halt für alle Fenster da ja der value für alle zu trifft. Kannst du mir helfen wie ich den Code so schreibe das es funktioniert. Leider bin ich bei der Programmierung noch ein Anfänger und lerne noch. Übrigens hatte ich das Script 2.2 genannt damit ich selber nicht durch einander komme. :wink:

Hier nochmal das komplette Script :

--[[
%% properties
%% globals
--]]

-- Einstellungen für die Sensoren (Zwingend erforderlich)
local sensorID = {209, 40, 43, 222, 237, 248, 253, 227, 219, 258} -- ID der Sensoren(n)

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

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

-- soll ein stiller Alarm genutzt werden? (true = ja/false = nein; silent_alarm_time: Sekunden wie lang der stille Alarm bestehen soll)
-- hier werden die Sirenen/Licht erst nach einer bestimmten Zeit aktiv. Bild der Kamera, Push und Meldung des Alarmpanels wird VOR dem stillen Alarm ausgeführt
local silent_alarm = true
local silent_alarm_time = 10

-- soll ein Bild der Kamera versendet werden (true = ja/false = nein)
local camera_support = false

-- an welche Mail soll ein Bild der Kamera gesendet werden
local email = 'test@test.de'

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

-- Sollen eigene Aktionen ausgeführt werden? (true = ja/false = nein; Bei true müssen die beiden nächsten Funktionen befüllt werden)
local own_action = false

function ownaction_alarm()
  
  -- eigene Aktion bei Alarm
  fibaro:debug('Eigene Aktionen bei Alarm ausgeführt')
end

function ownaction_afteralarm()
  -- eigene Aktion nach dem Alarm
  fibaro:debug('Eigene Aktionen nach dem Alarm ausgeführt')
end

local countID = 500

-- AB HIER NICHTS MEHR ÄNDERN

Debug = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, message, "span"))
end

-- Funktion zum Ein-/Ausschalten der Sirene
function onoffSirene(status)
 if (sireneID[1] ~= nil) then 
  if (status) 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 RGBW-Notfallbeleuchtung
function emergencyRGBW(status)
 if (rgbwID[1] ~= nil) then 
  if (status) 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

function cameracheck(roomID)
  for x=1, countID do
    if (fibaro:getType(x) == 'com.fibaro.ipCamera') then
      if (roomID == fibaro:getRoomID(x)) then
        fibaro:debug('Kamera ' ..x.. ' im betroffenen Raum erkannt. Sende Mail an ' ..email)
        fibaro:call(x, 'sendPhotoToEmail', email)
      else
        fibaro:debug('Keine Kamera im betroffenden Raum gefunden.')
      end
    end
  end
end

function checkSensor()
  for j=1, countID do
    if sensorID[j] ~= nil then
      if (tonumber(fibaro:getValue(sensorID[j], 'value')) == 1) then
         return sensorID[j]
      end
    end
  end
end

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

function checkSensorArmed()
  local armed_counter = 0 
  for j=1, countID do
    if sensorID[j] ~= nil then
      if (tonumber(fibaro:getValue(sensorID[j], 'armed')) == 1) then
         armed_counter = armed_counter+1
      end
    end
  end
  if (armed_counter == 0) then
   return false
  elseif (armed_counter > 0) then
   fibaro:debug(armed_counter..' Sensoren noch nicht entschärft ...')
   return true
 end
end
Debug( 'red', '___________________________')
Debug( 'red', 'Alarm-Szene 2.2 wurde ausgelöst.')
Debug( 'white', 'Aktionen werden ausgeführt.')
Debug( 'white', 'Sensor im Raum ' ..fibaro:getRoomNameByDeviceID(checkSensor()).. ' ausgelöst')

if camera_support then
  cameracheck(fibaro:getRoomID(checkSensor()))
else
  Debug( 'red', 'Keine Kameras im Einsatz')
end

if silent_alarm then 
   fibaro:debug('Stiller Alarm wurde aktiviert. Dauer: ' ..silent_alarm_time)
  counter = 0
 
  sendPush("Stiller Alarm wurde ausgelöst für "..silent_alarm_time.." sec");
          
    for id = 1, #sensorID do
    if tonumber(fibaro:getValue(sensorID[id], 'value')) == 1 then
          local name  = fibaro:getName(sensorID[id])
          local room  = fibaro:getRoomNameByDeviceID(sensorID[id])
          sendPush(" ACHTUNG! " ..name.. " im Raum " ..room.. " hat Alarm geschlagen");   
          fibaro:debug(name)
          
          end
 
end

  while (counter <= silent_alarm_time and checkSensorArmed()) do
   counter = counter + 1
   fibaro:sleep(1*1000)
  end

else
  Debug( 'white', 'Stiller Alarm wird nicht genutzt.')
end

if checkSensorArmed() then
  if (own_action) then
    ownaction_alarm()
  end
  onoffSirene(true)
  emergencyRGBW(true)
elseif silent_alarm then
  Debug('green', 'Stiller Alarm beendet, Geräte entschärft.')
end

while checkSensorArmed() do
  Debug( 'red', 'Alarm weiterhin ausgelöst.')
  
   if (phoneID[1] ~= nil) then
  for k=1, countID do
    if phoneID[k] ~= nil then
      fibaro:call(phoneID[k],'sendPush', "ALARM, ALARM");
    end
  end
 end
  
  fibaro:sleep(2*1000)
end
fibaro:debug('Alle Sensoren entschärft.')
Debug('green', 'Alarm wurde beendet.')
  if (own_action) then
    ownaction_afteralarm()
  end
emergencyRGBW(false)
onoffSirene(false)

Grüße Guido

Hi Guido,

im Prinzip alles richtig. Ich weiss nicht ob der Sensor selbst mit Verzögerung scharf geschaltet wird, vielleicht ist es auch egal aber Du kannst hier nur auf 0 oder 1 abfragen, da dies in der api einen logischer Wert (false oder true) darstellt. getValue wandelt das in 0 oder 1 um.
Also alles was Du machen könntest wäre auf ~= 0 abfragen, aber dass ist im Prinzip das Gleiche.
Kannst Dir ja den Wert per debug ausgeben lassen. Das Pushs manchmal nicht oder verzögert ankommen ist ja bekannt. Wenn der Debug was ausspuckt, funktioniert auch Push.

Morgen Jeep,

hab noch einmal ein wenig probiert. Mal geht es, mal geht es nicht! Hab jetzt nochmal die `function checkSensor() geändert. Denke das da das Problem liegen kann. Die Push Nachricht kommt dann durch :

local name  = fibaro:getName(checkSensor())
local room  = fibaro:getRoomNameByDeviceID(checkSensor())
sendPush(" ACHTUNG! " ..name.. " im Raum " ..room.. " hat Alarm geschlagen");

Erster Test hat funktioniert. Werde mal ein wenig testen ob es auch immer funktioniert! Wie immer, vielen Dank für deine Tipps.

Grüße und rutsch gut rein