본문 바로가기
개발Study/IP Camera

make IP camera using raspberry pi 4 (7) model

by happy90 2022. 2. 12.
SMALL

버튼기능을 구현하기에 앞서 model 설정으로 database를 구축해야 한다.

refresh 버튼에는 필요 없지만 alarm on/off 설정시 값을 저장해야하기 때문이다.

여기서 놓치지 말아야 할 것은, 접속한 유저 각각에 대해 alarm 설정 여부를 저장해야 한다는 사실.

그러면 생성해야 할 db는 두개이다.

1. user list
 이는 접속한 user를 기록할 unique한 무언가가 있어야 한다. id/pw도 좋고. 그러나 id/pw를 통한 로그인과정까지 구현할 시간은 없다.
 접속 기기별 mac address를 저장하기로 결정함.

을 이용하면 될 것 같다.

2. user별 alarm on/off 여부
 django가 motion eye로부터 알람을 받았을 때 alarm을 on설정해 둔 유저에게만 alarm을 보내야한다.
 user가 한명 생성되면 그 유저에 대한 alarm setting이 필요하므로 foreign key로 참조하여 생성하도록 구현함.

그리하여 모델을 아래와 같이 구현하였다.

models.py

from django.db import models


class User(models.Model):

    mac_address = models.CharField(max_length=20)
    note = models.CharField(max_length=20, default='', editable=True)

    def __str__(self):

        return self.mac_address


class AlarmSetting(models.Model):

    motion_alarm = models.BooleanField(default=False)
    sound_alarm = models.BooleanField(default=False)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user_uniq_id', default=1)

AlarmSetting에서 ForeignKey로 User를 참조하여 해당 유저의 alarm값을 알아올 수 있다.

 

다음으로 migration 작업.

python3 manage.py makemigrations ipcamera_for_baby
python3 manage.py sqlmigrate ipcamera_for_baby 0001
python3 manage.py migrate

model구현 후 makemigrations를 통해 django에 model 변경이 있음을 알린다.
sqlmigrate를 하면 makemigrations를 통해 만든 0001_initial.py를 토대로 db 생성에 필요한 sql 문장을 생성한다.
혹은 makemigrations를 수차례 진행하면 0002_~~~.py 0003_~~~.py 가 순서대로 생성된다.
끝에는 해당 번호를 입력하면 된다.
마지막에 migrate를 하면서 이 sql 문장이 실행되고, 실제로 데이터베이스가 만들어지는 것이다.

 

이제 구현할 것.
 - 어떤 기기가 접속했을 때 기기의 mac address를 서버에 전송.
 - 위에서 받은 mac address가 UserList에 있는지 확인하여 없으면 추가하기. 있으면 alarm 설정을 불러오기.

 

mac address를 받아서 db에서 찾고, 없으면 추가하는 코드 views.py

def index_mac(request, mac_addr):

    #1. find mac_addr from userlist
    user = User.objects.filter(Q(mac_address=mac_addr))
    print(user)
    count = user.count()

    if count == 0:
        print('create user')
        new_user = User(mac_address=mac_addr)
        new_user.save()

        alarm_setting = AlarmSetting(user=new_user)
        alarm_setting.save()

    else:
        print('This mac address is registered already', user)

    #2. show user's alarm settings to web page
    user = User.objects.get(mac_address=mac_addr)
    alarm = AlarmSetting.objects.get(user=user.id)

    context = {
                'motion_alarm': alarm.motion_alarm,
                'sound_alarm': alarm.sound_alarm,
               }

    return render(request, 'ipcamera_for_baby/video_feed.html', context)

User table에서 mac addr를 검색하여 존재하지 않으면 user를 생성하여 db에 save하도록,
그리고 동시에 AlarmSetting을 생성하여 user와 매칭시켜주도록 하였다.
이미 등록되어 있는 유저면 아무것도 하지 않는다.

해당 유저의 id를 얻어와 alarm setting에서 셋팅값을 찾는다.
셋팅값을 html에 넘겨준다.

변수 context를 통해 alarm setting값을 넘겨받은 html은 버튼 모양에 값을 반영하여 페이지를 보여준다.

해당 부분 html

            <th align="right">motion</th>
            <th align="left">
                <label class="switch">
                    {% if motion_alarm %}
                        <input type="checkbox" checked>
                    {% else %}
                        <input type="checkbox">
                    {% endif %}
                    <span class="slider round"></span>
                </label>
            </th>
            <th align="right">sound</th>
            <th align="left">
                <label class="switch">
                    {% if sound_alarm %}
                        <input type="checkbox" checked>
                    {% else %}
                        <input type="checkbox">
                    {% endif %}
                    <span class="slider round"></span>
                </label>
            </th>


이제 버튼을 눌렀을 때 db에 저장하는 부분을 구현하면 되겠다.
+ refresh 버튼도.

LIST

댓글