Erweiterung Rauchalarm

Hallo,
kurze Frage weil ich in Lua noch nicht so sattelfest bin. Zusätzlich zu Push will ich im Rauchalarm von boomx auch noch die E-Mail Benachrichtigung einbauen. ich habe den Push-Teil angepasst. Passt das?

Im Header

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

Zweitert Teil:

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

Dritter Teil:

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!')
	sendEmail('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!')
	  sendEmail('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!')
	sendEmail('Weiterer Rauchmelder - '..room..' - ausgelöst!')
  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.')
	sendEmail('Email-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.')
	sendEmail('Email-Nachricht funktioniert. ID des Accounts korrekt.')
    fibaro:debug('Versende eine Test-Push-Nachricht')
	fibaro:debug('Versende eine Test-Email-Nachricht')
  end
end

Moin Knallfrosch,

ich habe mir das Skript mal angesehen. Das Array im Header hast Du richtig angelegt. Es werde E-Mails an die User 23 und 79 versendet.
Die Funktion scheint mir aber nicht ganz korrekt. Meines Erachtens nach müsste sie so aussehen:

-- Funktion zum Versenden der EMAIL
function sendEmail(text)
  for k=1, #accountID do
       fibaro:call(accountID[k],'sendEmail', text, 'smoke')
  end
end

Außen hast Du eine Prüfung, ob die Variable accountID gefüllt ist. Brauchst Du nicht, denn Du definierst sie ja nicht zur Laufzeit, sondern im Header. Selbiges gilt für die Prüfung auf innerhalb der for-Schleife. Diese wird für jeden Wert in accountID genau einmal aufgerufen. Es wird also keine nil Werte geben.
Im Kopf der for-Schleife hattest Du eine Variable countID drin. Die Schleife sollte doch bestimmt für jede accountID einmal laufen, oder? Ich habe counID mit #accountID ersetzt.

Deine Ergänzungen im unteren Teil scheinen richtig zu sein.

Danke für Dein Feedback. Bei dem zweiten Teil hatte ich boomx´ Vorlage zur Push verwendet. Und die schaut so aus:

-- 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

Die Prüfung wollte ich drin lassen, falls ich mal die E-Mails abschaffe (wenn die besser Hälft die App auf ihrem Smartphone installiert hat …)

Hi Knallfrosch,

mit ist nicht ganz klar, wo die Variable/das Array countID herkommt. Wenn Du hier das Array accountID nutzt in dem die E-Mail User stehen, dann brauchst Du all die Prüfungen nicht, denn ein leeren Array führt dazu, dass die Schleife genau 0 mal ausgeführt wird. Das Array selbst, wenn auch leer, erstellst Du ja im Header accountID = {}. Der Effekt ist derselbe. Du kannst später einfach die IDs aus accountID nehmen und es werden keine E-Mail mehr verschickt. Du optimierst damit lediglich den Code und sparst Dir 2 if-Anweisungen.

Zum Glück gibt es beim Programmieren kein richtig oder falsch, denn viele Wege führen nach Rom :wink:

Sollten beide Varianten funktionieren :slight_smile:

Gruß

Klar funktioniert beides. Wollte Dir damit auch nicht auf die Füße treten :wink:

Hast du nicht :slight_smile: