본문 바로가기

Python

라즈베리파이용 status_log 파이썬 코드

60초마다 라즈베리파이의 UPS 전압, 충전량, CPU온도를 mysql에 저장하는 파이썬 코드

smbus, pymysql 필요

 

smbus 설치

sudo apt-get install i2c-tools python3-smbus

venv 구성 및 pymysql 설치

sudo apt-get install python3-venv
python3 -m venv 가상환경명
source 가상환경명/bin/activate
pip3 install pyinstaller
sudo apt-get install python3-dev
sudo apt-get install python3-setuptools
pip3 install pymysql
python3 -m pip install mysql-connector-python
//가상환경종료
deactivate

desc tblstatus

 

code (.ups_status.py)

import struct
import smbus
import sys
import os
import RPi.GPIO as GPIO
import pymysql
import pymysql.cursors
import subprocess

def readVoltage(bus):
    address = 0x36
    read = bus.read_word_data(address, 0x02)
    swapped = struct.unpack("<H", struct.pack(">H", read))[0]
    voltage = swapped *1.25 / 1000 / 16
    return voltage

def readCapacity(bus):
    address = 0x36
    read = bus.read_word_data(address, 0x04)
    swapped = struct.unpack("<H", struct.pack(">H", read))[0]
    capacity = swapped/256
    return capacity

def QuickStart(bus):
    address = 0x36
    bus.write_word_data(address, 0x06, 0x4000)

def PowerOnReset(bus):
    address = 0x36
    bus.write_word_data(address, 0xfe, 0x0054)

def ThermalCPU():
    thermal = float(subprocess.check_output(['cat','/sys/class/thermal/thermal_zone0/temp']))/1000
    return thermal

def ConnectSQL():
    global db, cur
    db = pymysql.connect(host='localhost', user='유저', password='비밀번호', db='pi_status', charset='utf8')
    cur = db.cursor()

def closeSQL():
    global db, cur
    cur.close()
    db.close()
    cur, db = None, None

def isCriticalStatus():
    if (((GPIO.input(4)==0) and readCapacity(bus)<30) or ThermalCPU() > 80):
        return True
    else :
        return False


GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(4,GPIO.IN)
bus = smbus.SMBus(1)

PowerOnReset(bus)
QuickStart(bus)

ConnectSQL()
critstatus = isCriticalStatus()

while not critstatus:
    thermal = ThermalCPU()
    voltage = readVoltage(bus)
    capacity = readCapacity(bus)
    sql = 'insert into `tblstatus` values(current_timestamp,'+str(voltage)+','+str(capacity)+','+str(thermal)+')'
    cur.execute(sql)
    db.commit()
    time.sleep(60)
    critstatus = isCriticalStatus()

closeSQL()