Alarm to nierozłączna część każdego inteligentnego domu. Dzięki Raspberry PI możemy zrobić w pełni użyteczny alarm bardzo tanim kosztem, a jego funkcjonalność przerasta nawet drogie, dedykowane urządzenia.

Do zrobienia alarmu na Raspberry potrzebujemy tylko dwóch rzeczy:

  • Czujnik magnetyczny otwarcia drzwi i okien (ok 5zł/szt)
  •  kable połączeniowe

Cała zasada działania czujnika magnetycznego sprowadza się do podawania stanu wysokiego lub niskiego w zależności czy dwa elementy czujnika magnetycznego są blisko siebie czy są od siebie oddalone.

Dłuższy kabelek czujnika magnetycznego podłączamy do GPIO Raspberry (ja wybrałem GPIO 9), natomiast krótszy podłączamy do GND.

Tak powinno to wyglądać.

alarm2

W naszym przypadku, kiedy elementy czujnika będą blisko siebie nic nie będzie się działo, natomiast po ich rozdzieleniu na przykład podczas otwarcia drzwi raspberry wyśle maila na podany adres.

Do działania programu nie musimy nic pobierać czy instalować Raspberry powinno mieć niezbędne biblioteki.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import subprocess
import smtplib
import socket
from email.mime.text import MIMEText
from email.MIMEImage import MIMEImage
import datetime
import os
import RPi.GPIO as GPIO
import time
def send_alarm():

  to = 'odbiorca@gmail.com' #adres do ktorego raspberry wysyla wiadomosc

  gmail_user = 'nadawca@gmail.com' #adres z ktorego raspberry  wysyla wiadomosc (najwygodniej zalozyc osobne konto dla raspberry)

  gmail_password = 'haslo_nadawcy' #haslo do konta poczty z ktorego raspberry wysyla wiadomosc

  smtpserver = smtplib.SMTP('smtp.gmail.com', 587)
  smtpserver.ehlo()
  smtpserver.starttls()
  smtpserver.ehlo()
  smtpserver.login(gmail_user, gmail_password)
  today = datetime.date.today()
  arg = 'ip route list'
  proc = subprocess.Popen(arg, shell=True, stdout=subprocess.PIPE)
  data = proc.communicate()
  split_data = data[0].split()
  local_ip = split_data[split_data.index('src') + 1]
  public_ip = os.system('wget http://ipecho.net/plain -O - -q > test.txt; echo')
  public_ip = open('test.txt', 'r').read()
  msg_content = """Jaka kolwiek tresc, ktora raspberry ma wyslac
    Public address IP %s:80
    Local address IP %s
    """
%   (public_ip, local_ip)
  msg = MIMEText(msg_content)
  msg['Subject'] = 'temat maila  %s' % today #podajemy dowolny temat
  msg['From'] = gmail_user
  msg['To'] = to
  smtpserver.sendmail(gmail_user, [to], msg.as_string())
  smtpserver.quit()

GPIO.setmode(GPIO.BOARD) #sposob numeracji pinow gpio. BOARD lub BCM
GPIO.setup(21, GPIO.OUT) #wybor pinu GPIO 9(BCM) to odpowiednik pinu 21 (BOARD) innymi slowy to ten sam pin tylko jego sposob nazywania jest inny

count= 0
count1=0


#ponizej znajduje sie petla ktora sprawdza czy drzwi sa otwarte czy zamkniete
while True:
    if (GPIO.input(21) == False and count==0):
        count1=0
    elif (GPIO.input(21) == True and count1==0):
        count1=count1+1
        send_alarm()    #uruchamiamy definicje ktora wysyla maila
        count=0
        time.sleep(.300) #odpoczynek dla procesora

Nic nie stoi na przeszkodzie, żeby napisać inną definicję np.: która będzie zapalała światło po otwarciu drzwi. Ogranicza Nas tylko własna kreatywność.

program odpalamy poprzez komendę „sudo python nazwa_programu.py

Jeśli chcemy go zakończyć możemy skorzystać ze skrótu klawiszowego Ctrl+C lub w włączyć drugi wiersz poleceń wpisać komendę „top”, wyszukać numer procesu naszego programu i wpisać „kill numer_procesu” wszytsko zatwierdzamy klawiszem Enter.

Polecam pierwszy sposób, ponieważ unikniemy niechcącego „zabicia” jakiegoś ważnego procesu.

Podany kod był sprawdzany na poczcie google- Gmail