라즈베리파이 firebase_admin - lajeubelipai firebase_admin

라즈베리파이 firebase_admin - lajeubelipai firebase_admin

paddygPosts: 2616Joined: Sat Jan 28, 2012 11:57 amLocation: UK

Re: Import Error: No module named Firebase.

Sun Jan 12, 2020 11:14 am

does everything need to be run as root (that often causes problems)? Better to "pip3 install firebase --user" which prompts the next question. Did you actually have "install" in your pip3 command? It's missing from your description of what you did. What messages did you get on screen after you installed firebase? Did it all look to go swimmingly? Sometimes there are several pages of info with pip3 install and a critical message giving a clue might have gone off the top of the page. Try it again "pip3 install firebase --upgrade --user" (or your "sudo pip3 install firebase --upgrade" if everything has to be run as root for some reason I'm not aware of)

EDIT - I see you say "pip3 list" gives firebase as a package so maybe my previous suggestion isn't relevant (sudo still might be an issue). You don't have a file called firebase.py in the same folder (or somewhere in sys.path) that might be being loaded instead of the module?

also https://groups.google.com/forum/?hl=en-GB&fromgroups=#!forum/pi3d

처음에 파이어베이스의 realtime database와 firestore database, 그리고 storage의 차이가 뭔지 몰랐는데 이미지파일은 DB에 저장이 안되는 것 같습니다.

(검색해보니까 이렇게 나오네요)

 

이제 순서대로 이 예제를 실행해보겠습니다.

라즈베리파이 카메라 연결

일단 라즈베리파이에 카메라를 연결해야합니다. 연결하고 라즈베리파이 configuration->interface에서 카메라를 enable 시켜준 뒤 잘 연결이 되었는지 아래 명령어로 확인합니다.

만약 supported 값은 1인데 detected가 0이라면 정상적으로 연결되지 않은 것입니다.

 

vcgencmd get_camera

 

라즈베리파이 firebase_admin - lajeubelipai firebase_admin

그리고 firebase-admin 패키지를 설치하고 주기적으로 사진을 찍는 스케쥴을 관리하기 위해 스케줄 패키지를 설치해줍니다.

 

sudo pip3 install firebase-admin

 

sudo pip3 install schedule

 

이제 파이어베이스 홈페이지에서 간단하게 설정을 해줘야 하는데, 우리가 필요한 건 프로젝트 ID, 비공개 키, 스토리지 주소입니다.

차례대로 설정단계를 알아보겠습니다.

 

파이어베이스 프로젝트 생성

파이어베이스 storage생성 전 프로젝트 생성단계는 간단하므로 넘어가겠습니다. 프로젝트 ID는 프로젝트 생성 후 프로젝트 목록을 보시면 프로젝트 이름과 아래에 작게 아이디가 적혀있습니다.

라즈베리파이 firebase_admin - lajeubelipai firebase_admin

파이어베이스 Admin SDK 키 생성

이제 키를 발급받아야하는데, 파이썬에서 프로그래밍으로 파이어베이스와 연동하기 위해 일종의 자격 증명서 같은 전용 "키"의 역할을 합니다.

프로젝트로 들어간 뒤 왼쪽 배너의 톱니바퀴-> 프로젝트 설정으로 들어갑니다. 파이썬을 사용하므로 구성 스니펫을 파이썬으로 체크한 뒤 비공개 키를 생성합니다. 키를 다운받아놓고 본인이 잘 기억할만한 폴더에 저장해 둡니다.(까먹거나 잃어버리면 안됩니다..;)

라즈베리파이에서 이 키를 사용해야 하므로 이제 그 키를 라즈베리파이의 디렉토리에 복사를 해야합니다.

삼바를 통해 json파일을 넘겨주고 아무 디렉토리에 저장시켜줍니다.

라즈베리파이 firebase_admin - lajeubelipai firebase_admin

파이어베이스 storage생성

왼쪽 배너에서 storage를 클릭하고 새 스토리지를 생성하는데, 이 때 보안규칙, 위치설정 등은 기본 디폴트로 진행합니다.

라즈베리파이 firebase_admin - lajeubelipai firebase_admin

완료를 누르면 "버킷 생성중" 메시지가 뜨고 생성이 완료됩니다. 창을 보면 ~~appspot.com 주소가 있는데 파이어베이스 스토리지의 주소라고 보시면됩니다.

 

이제 라즈베리파이에서 파이어베이스 연동을 위해 필요한 프로젝트ID, 비공개 키, 스토리지 주소까지 모두 준비가 완료되었습니다. 

라즈베리파이 코드 작성 및 실행

자칫 헷갈릴 수 있으므로 코드 작성 전에 코드에 필요한 정보들을 나열하고 넘어가겠습니다. 

1. 프로젝트 ID : 프로젝트 생성 후 프로젝트 목록에 나와있음 

2. Admin SDK 키 : .json키 파일을 삼바를 통해 라즈베리파이 디렉토리에 저장합니다.

저는 /home/pi/Downloads(생성폴더)에 저장시켜 놨습니다.

3. 스토리지 주소 : 파이어베이스 storage에 들어가면 gs://키정보.appspot.com 이 있는데 이 정보도 이용합니다.

4. 스토리지 디렉토리 이름 : 프로그래밍으로 본인이 지정한 이름의 폴더를 파이어베이스 저장소에 만들 수 있습니다.

5. 사진 찍고 저장할 디렉토리 이름 : 주기별로 사진을 찍고 저장할 디렉토리입니다. 저는 /home/pi/image_store로 만들어주었습니다.

 

이제 코드를 살펴볼 차례입니다. 기본적인 틀은 다른분들의 코드와 공식 문서를 참고하여 작성했습니다.

웬만한 중요 부분은 주석으로 보충 설명하였고 64~69행 설정으로 사진을 찍고 삭제하는 주기를 조절할 수 있습니다.

파일명은 현재 년/월/일로 시/분/초로 나타냈습니다.   

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

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

# _*_ coding: utf-8 _*_

from picamera import PiCamera

from time import sleep

import datetime

import sys, os

import requests

import firebase_admin

from firebase_admin import credentials

from firebase_admin import storage

from uuid import uuid4

import schedule

 

PROJECT_ID = "project-8965d"

#my project id

 

cred = credentials.Certificate("/home/pi/Downloads/(키 이름).json"#(키 이름 ) 부분에 본인의 키이름을 적어주세요.

default_app = firebase_admin.initialize_app(cred,{'storageBucket':f"{PROJECT_ID}.appspot.com"})

#버킷은 바이너리 객체의 상위 컨테이너이다. 버킷은 Storage에서 데이터를 보관하는 기본 컨테이너이다.

bucket = storage.bucket()#기본 버킷 사용

 

def fileUpload(file):

    blob = bucket.blob('image_store/'+file#저장한 사진을 파이어베이스 storage의 image_store라는 이름의 디렉토리에 저장

    #new token and metadata 설정

    new_token = uuid4()

    metadata = {"firebaseStorageDownloadTokens": new_token} #access token이 필요하다.

    blob.metadata = metadata

 

    #upload file

    blob.upload_from_filename(filename='/home/pi/image_store/'+file, content_type='image/png'#파일이 저장된 주소와 이미지 형식(jpeg도 됨)

    #debugging hello

    print("hello ")

    print(blob.public_url)

 

def execute_camera():

    

    #사진찍기

    #중복없는 파일명 만들기

    basename = "smr"

    suffix = datetime.datetime.now().strftime("%Y%m%d_%H%M%S"+ '.png'

    filename = "_".join([basename, suffix])

 

    camera = PiCamera()

    camera.resolution = (640480)

    camera.start_preview()

    #이미지에 텍스트를 새겨 넣자.

    camera.annotate_text = "Smart Mirror"

    camera.annotate_text_size = 20

    sleep(5)

    #사진을 찍어서 저장한다. 파일의 중복되지 않도록 날짜시간을 넣어서 만듬

    camera.capture('/home/pi/image_store/' + filename)

    #사진 파일을 파이어베이스에 업로드 한다.

    fileUpload(filename)

    #로컬 하드의 사진을 삭제한다.

    camera.stop_preview()

    camera.close()

 

#메모리 카드의 파일을 정리 해 주자.

def clearAll():

    #제대로 할려면 용량 체크 하고 먼저 촬영된 이미지 부터 지워야 할것 같지만 여기선 폴더안에 파일을 몽땅 지우자.

    path = '/home/pi/image_store'

    os.system('rm -rf %s/*' % path)

 

 

#10초 마다 실행

schedule.every(10).seconds.do(execute_camera)

#10분에 한번씩 실행

#schedule.every(10).minutes.do(execute_camera)

#매 시간 마다 실행

schedule.every().hour.do(clearAll)

#기타 정해진 시간에 실행/매주 월요일에 실행/매주 수요일 몇시에 실행 등의 옵션이 있다.

 

 

while True:

    schedule.run_pending()

    sleep(1)

 

 

 

Colored by Color Scripter

cs

 

이제 실행해봅니다. 위 코드를 test.py라는 이름으로 작성했다고 한다면 다음처럼 실행하면됩니다.

sudo python test.py 

 

주의할점으로 제 환경 기준으로 커맨드 창에서 코드를 작성하고 실행해보니 계속 오류가 떴었습니다.

No module name firebase_admin 이라는 오류가 뜨면 sudo pip install firebase_admin으로 다시 깔아주면(파이썬3버전이 아닌 1버전) 오류는 사라집니다. 

 

여기까지 진행하고 정상 진행이 되면 상관없으나 에러가 나시는 분들은 당황하지 마시고  화면 상단의 산딸기 모양을 클릭하고 개발 탭에서 토니IDE에 소스를 복붙해서 실행해봅니다. (아마 잘 되실겁니다.) 토니 IDE는 기본으로 깔려있고 그냥 가벼운 비쥬얼 스튜디오라고 생각하시면됩니다.