这是一个有点笼统的问题,如果我违反了任何准则,请原谅我。我正在编写一个 JQuery / websocket / Flask 应用程序,它使用 Raspberry Pi 来监视一些传感器以及管理一些活动硬件。由我的 Flask 实现的服务器生成的多个类和对象需要能够访问我的硬件。
根据我的编程背景(对 Python 来说相对较新),我会倾向于使用无需实例化即可运行的类方法的静态类。
我找到了有关如何在 Python 中执行此操作的文档,但我不确定这是最好的方法。实例化一个对象并传递它是更 Pythonic 还是...?
这是我现在正在使用的非静态面向对象的代码(我认为以下的静态版本将满足我的需求,但我想做最适合该语言的事情):
import os
import glob
import time
import RPi.GPIO as GPIO
#class to manage hardware -- sensors, pumps, etc
class Hardware:
#system params for sensor
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
#global vars for sensor
base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'
#global var for program
temp_unit = 'F' #temperature unit, choose C for Celcius or F for F for Farenheit
temp_target = 69 #target temperature to cool to in chosen unit
temp_log_loc = '/var/www/hw-log.csv' #location of temp log, by default Raspberry Pi Apache server
gpio_pin = 17
#function to enable GPIO
def gpio_active(self,active):
if active is True:
GPIO.setmode(GPIO.BCM)
GPIO.setup(self.gpio_pin, GPIO.OUT)
else:
GPIO.cleanup()
#def __init__(self): Not used
#reads raw temp from sensor
def read_temp_raw(self):
f = open(self.device_file, 'r')
lines = f.readlines()
f.close()
return lines
#cleans up raw sensor data, returns temp in unit of choice
def read_temp(self):
lines = self.read_temp_raw()
while lines[0].strip()[-3:] != 'YES':
time.sleep(0.2)
lines = self.read_temp_raw()
equals_pos = lines[1].find('t=')
if equals_pos != -1:
temp_string = lines[1][equals_pos+2:]
temp_c = float(temp_string) / 1000.0
temp_f = temp_c * 9.0 / 5.0 + 32.0
if self.temp_unit == 'F':
return temp_f
else:
return temp_c
#**********sensors**********
#mashtun sensor
#@staticmethod
def mashtun_temp(self):
return self.read_temp()
#hot liquor tank sensor
def htl_temp(self):
return 200
#fermentor sensor
def fermentor_temp(self):
return 65
#**********pumps**********
def herms_pump_active(self,active):
self.gpio_active(True)
if active is True:
print('***Hardware report: Setting HERMS pump on***')
GPIO.output(self.gpio_pin,GPIO.LOW)
else:
print('Setting HERMS pump off')
GPIO.output(self.gpio_pin,GPIO.HIGH)
self.gpio_active(False)