Arduino :: Lecture & TIPs

[ThingSpeak] 전자메일 알림 (E-mail Alerts) 기능 활용하기

본래 ThingSpeak 플랫폼에는 전자메일 알림 기능이 제공되지 않아 불편함이 존재했었습니다. 이전에는 별도의 알림을 받기 위해 ThingSpeak 플랫폼의 데이터를 주고 받는 클라이언트 방식의 앱을 개발해 알림 기능을 구현하거나 혹은 IFTTT 라는 별도의 3rd Party (써드파티) 서비스를 이용해 전자 메일로 알림이 발송되도록 별도의 애플릿을 생성하고 이를 구현해야만 했었습니다.

하지만 2020 년 1 월 1 일 부터, 전자메일 알림 기능을 보다 간편하게 구현할 수 있도록 ThingSpeak 플랫폼에 E-mail Alert (전자메일 알림) 기능이 새롭게 추가되어 간단한 MATLAB 스크립트 작성만으로도 전자메일 알림 기능을 활용해보실 수 있는데요, ThingSpeak 에서 제공하는 전자메일 알림 기능에 대해 알아보도록 하겠습니다.

 

ThingSpeak 에서 사용량 (Alerts Usage) 과 Alerts API Key 확인 및 취득하기.

전자메일 알림 기능에 대해 알아보기 전에, ThingSpeak 플랫폼에서 알림 기능 사용량과 알림 기능 사용을 위한 API Key 를 취득하는 방법을 알아보도록 하겠습니다.

알림 기능 사용량 확인을 위해서는, https://www.thingspeak.com/ 웹 사이트에 로그인하시고, 우측 상단의 [프로필 사진] 영역을 클릭하신 다음 [My Account] 항목을 눌러 [계정 정보] 화면으로 진입합니다.

 

 

[My Account] 화면이 표시되면 전체적인 사용량이 표와 수치 형식으로 간략하게 표시되며, 하단에 일일사용량이 그래프 형태로 표시되어 직관적으로 확인하실 수 있습니다. 이후, 스크롤 바를 하단으로 내리시면 전자메일 알림 기능 [Email Alert] 에 한해 사용한 사용량을 별도로 확인하실 수 있습니다.

계정의 종류나 무료, 유료 (구독형) 여부에 관계없이 전자메일 알림 기능의 총 사용량은 800 건으로 제한되어 있습니다, 여기서 언급된 건 수는 코드가 실행되는 횟수가 아닌, 전자메일이 최종적으로 전달된 건 수 기준입니다.

이는 코드 상 두 가지의 개별 환경 (배터리 잔량, 토양 습도 등) 을 모니터링하여 개별 건의 전자메일로 전달되도록 구현되어 있다면, 한번 실행될 때 마다 2 건이 차감된다는 의미입니다.

 

 

이렇게 사용 가능 여부를 확인하셨다면, 이제 전자메일 알림 전송 기능 사용을 위한 [Alerts API Key] 를 취득하셔야 합니다.

우측 상단의 [프로필 사진] 영역을 클릭하신 후, [My Profile] 항목을 클릭하셔서 [내 프로필] 화면으로 진입합니다.

 

 

화면에 표시된 [My Profile] 화면에서 Alerts API Key 영역에 표시된 일련번호를 기록해두도록 합니다.

 

ThingSpeak 에서 전자 메일을 통한 알림 기능 구현하기.

상단 메뉴 바에서 [Apps] 메뉴 하위의 [MATLAB Analysis] 항목을 클릭합니다.

 

 

이후 표시되는 [MATLAB Analysis] 화면에서 [New] 버튼을 클릭해 새로운 스크립트를 생성합니다.

 

 

[Name] 텍스트박스에는 적절한 타이틀을 지정하고, 간단한 MATLAB 스크립트를 작성해 지정한 조건이 만족하는 경우에 한해 계정 소유자에게 메일을 보내도록 기능을 구현할 수 있습니다.

아래의 코드는 스마트 정원의 토양 습도가 지정된 습도보다 낮아지는 경우와, 배터리 잔량이 40 % 이하, 20 % 이하 혹은 5 % 이하로 떨어지는 경우 메일이 발신되도록 구현한 코드 예시입니다.

 

 

data = thingSpeakRead(13●●●●7, "NumMinutes", 1800);

SMoist = mean(data(:, 4));
Battery = mean(data(:, 6));

apiKey = 'TAKL●●●●●●●●●78EP';
alertURL = "https://api.thingspeak.com/alerts/send";

options = weboptions("HeaderFields", ["ThingSpeak-Alerts-API-Key", apiKey ]);


alertBodyMoist = sprintf("This email is to remind you soil moisture level of smart farms is below 60 percent.");
alertSubjectMoist = sprintf("[13●●●●7] Your plant needs water.");


alertBodyInfo = sprintf("This email is to remind you that the battery level of smart farms is below 40 percent.");
alertSubjectInfo = sprintf("[13●●●●7] The battery level is below 40 percent.");

alertBodyWarn = sprintf("This email is to remind you that the battery level of smart farms is below 25 percent. You better need to charge the battery now.");
alertSubjectWarn = sprintf("[13●●●●7] The battery level of smart farms is below 20 percent.");

alertBodyCrit = sprintf("This email is to remind you that the battery level of smart farms is below 5 percent. Please recharge the battery as soon as possible.");
alertSubjectCrit = sprintf("[13●●●●7] The battery level of smart farms is critically low, needs recharge as soon as possible.");


if SMoist <= 60
    try
    webwrite(alertURL, "body", alertBodyMoist, "subject", alertSubjectMoist, options);
    catch someException
    fprintf("Failed to send alert: %s\n", someException.message);
    end
end


if Battery <= 3790
    try
    webwrite(alertURL, "body", alertBodyInfo, "subject", alertSubjectInfo, options);
    catch someException
    fprintf("Failed to send alert: %s\n", someException.message);
    end
elseif Battery <= 3730
    try
    webwrite(alertURL, "body", alertBodyWarn, "subject", alertSubjectWarn, options);
    catch someException
    fprintf("Failed to send alert: %s\n", someException.message);
    end
elseif Battery <= 3500
    try
    webwrite(alertURL, "body", alertBodyCrit, "subject", alertSubjectCrit, options);
    catch someException
    fprintf("Failed to send alert: %s\n", someException.message);
    end
end

 

간단한 if 문 만으로도 손쉽게 구현이 가능하므로 코드 작성에 익숙하거나 흥미를 가지고 있다면 누구나 시도해 볼 수 있는 흥미로운 기능입니다만, 혹여나 코드 실행 중 예상치 못한 오류가 발생하면 중단되어 이후 실행이 되지 않을 수 있으므로, 이를 방지하기 위한 별도의 Try-Catch 문 (예외 처리 구문) 이 필수적으로 필요합니다.

 

Try-Catch 문으로 예외 처리를 해 주지 않으면, TimeControl 기능이 설정되어 있더라도 코드 상 오류로 인해 알림 전자 메일 수신이 불가능 해 질 수 있다. (화면 최상단 노란색 경고문 참고.)

 

ThingSpeak 에서 지원하는 TimeControl 기능을 이용해 12 시간 단위로 스크립트 실행하기.

이제 마지막으로 설정해주어야 하는 작업이 남았습니다. 스크립트까지 예쁘게 작성했지만, 일시적인 코드로서 매번 수동으로 실행시켜주지 않는다면 작동하지 않으므로 ThingSpeak 플랫폼에서 지원하는 TimeControl 기능을 이용해 매일 특정시간이 되면 자동으로 동작하도록 설정해 주어야 합니다.

해당 작업을 진행해보도록 하겠습니다.

 

먼저, 코드 입력 텍스트박스 하단에 위치한 [Save and Run] 버튼을 눌러 작성한 코드에 오류가 발생하는지 여부를 확인합니다, 실행하는데 별 다른 문제가 없다면 스크롤 바를 맨 하단으로 내려 초록색 [Time Control] 텍스트를 클릭합니다.

 

이후, TimeControl 설정 화면에서 아래와 같이 설정하도록 합니다.

 

항목번역설명
Name 작업명실행될 작업에 대한 적절한 명칭을 입력하세요.
Time Zone기준 시간대 Seoul (대한민국 서울) 기준으로 설정되어 있는지 확인하세요.
Frequency반복 여부반복될 작업이므로 “Recurring (반복)” 항목에 선택하세요.
Recurrence반복 시간시간 단위 반복으로 설정해야하니, “Hour” 항목에 선택하세요.
Every _____ hour (s)시간 단위12 시간 마다 반복되도록 숫자 “12” 를 입력하세요.
Start Time시작될 시각현재 시각으로 설정되어 있으며 수정이 불가능합니다.
Fuzzy Time여유 시간설정된 시간보다 여유를 둘 시간 (5 분 내외 혹은 10 분 내외 등) 을 설정합니다. 상황에 따라 적절하게 설정하세요.
Action작업지정한 조건들이 충족될 때 실행할 작업을 선택합니다. [MATLAB Analysis] 항목을 선택하세요.
Code to Execute실행될 코드리스트에서 실행될 특정 스크립트를 선택합니다.

 

 

여기까지 모두 설정한 후 마무리하셨다면, 12시간 간격으로 작성하신 스크립트가 자동적으로 실행되고 작성하신 코드의 조건과 센서 값이 일치하는 경우에 한해 ThingSpeak 플랫폼에 가입 / 등록된 전자메일 계정으로 전자메일이 수신됩니다.

 

 

고맙습니다.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: