Minimum Viable Product useable as systemd service
This commit is contained in:
parent
95083cb46c
commit
43269715cc
|
@ -0,0 +1,43 @@
|
|||
defaults:
|
||||
tnom: 25
|
||||
rnom: 10000.0
|
||||
corr: 4800
|
||||
spi:
|
||||
mode: 0
|
||||
hz: 1000000
|
||||
pwm:
|
||||
hz: 25000
|
||||
start_c: 0
|
||||
hysterese: 2.0
|
||||
temp_input:
|
||||
outside:
|
||||
channel: 1
|
||||
switch: 26
|
||||
Rk: 9770.0
|
||||
inside:
|
||||
channel: 0
|
||||
switch: 20
|
||||
fan_output:
|
||||
in:
|
||||
switch: 17
|
||||
pwm: 18
|
||||
out:
|
||||
switch: 22
|
||||
pwm: 23
|
||||
operation:
|
||||
- greater: 20
|
||||
in_pwm: 100
|
||||
out_pwm: 100
|
||||
- greater: 15
|
||||
in_pwm: 66
|
||||
out_pwm: 50
|
||||
- greater: 10
|
||||
in_pwm: 50
|
||||
out_pwm: 33
|
||||
- greater: 5
|
||||
in_pwm: 33
|
||||
out_pwm: 0
|
||||
- greater: 0
|
||||
in_pwm: 0
|
||||
out_pwm: 0
|
||||
|
|
@ -0,0 +1,134 @@
|
|||
#! /usr/bin/env python3
|
||||
#import RPIO
|
||||
import RPi.GPIO as GPIO
|
||||
import time
|
||||
import sys
|
||||
import spidev
|
||||
import yaml
|
||||
import os
|
||||
from decimal import *
|
||||
from datetime import datetime
|
||||
from datetime import timedelta
|
||||
|
||||
|
||||
class MVP:
|
||||
def __init__(self):
|
||||
print("Initialization...")
|
||||
dirname = os.path.dirname(os.path.realpath(__file__))
|
||||
self.config = None
|
||||
with open(os.path.join(dirname, "config.yml"), "r") as stream:
|
||||
self.config = yaml.safe_load(stream)
|
||||
self.spi = None
|
||||
self.fan = None
|
||||
self.ufan = None
|
||||
self.spi = spidev.SpiDev()
|
||||
|
||||
self.spi.open(0,0)
|
||||
self.spi.mode = self.config.get("defaults").get("spi").get("mode")
|
||||
self.spi.max_speed_hz = self.config.get("defaults").get("spi").get("hz")
|
||||
GPIO.setmode(GPIO.BCM)
|
||||
for k, v in self.config.get("fan_output").items():
|
||||
if v.get("switch", None):
|
||||
GPIO.setup(v.get("switch"), GPIO.OUT)
|
||||
if v.get("pwm", None):
|
||||
GPIO.setup(v.get("pwm"), GPIO.OUT)
|
||||
self.fan = GPIO.PWM(self.config["fan_output"]["in"]["pwm"], 25000)
|
||||
self.ufan = GPIO.PWM(self.config["fan_output"]["out"]["pwm"],25000)
|
||||
|
||||
for k, v in self.config.get("temp_input").items():
|
||||
GPIO.setup(v.get("switch"), GPIO.OUT)
|
||||
GPIO.output(v.get("switch"), False)
|
||||
self.fan.start(self.config.get("defaults").get("pwm").get("start_c"))
|
||||
self.ufan.start(self.config.get("defaults").get("pwm").get("start_c"))
|
||||
print("...done")
|
||||
|
||||
def read_spiADC(self, sensor):
|
||||
bcm_pin = self.config.get("temp_input").get(sensor).get("switch")
|
||||
channel = self.config.get("temp_input").get(sensor).get("channel")
|
||||
GPIO.output(bcm_pin, True)
|
||||
hchbit=channel >> 2
|
||||
lchbits = channel & 0x03
|
||||
to_send = [ hchbit | 0x06, lchbits << 6, 0x00 ]
|
||||
self.spi.cshigh=True
|
||||
# time.sleep(0.01)
|
||||
self.spi.cshigh = False
|
||||
r=self.spi.xfer(to_send)
|
||||
self.spi.cshigh = True
|
||||
GPIO.output(bcm_pin, False)
|
||||
# time.sleep(0.01)
|
||||
highbyte = r[1]
|
||||
lowbyte = r[2]
|
||||
value = (highbyte << 8) | lowbyte
|
||||
return value
|
||||
|
||||
def calc_temp(self, adc_reading, channel = 0):
|
||||
rser = self.config.get("temp_input").get(channel).get("Rk", None)
|
||||
tnom = self.config.get("defaults").get("tnom")
|
||||
rnom = self.config.get("defaults").get("rnom")
|
||||
corr = self.config.get("defaults").get("corr")
|
||||
if not rser:
|
||||
rser = rnom
|
||||
r = (rser/(4095/adc_reading - 1))
|
||||
r = r - corr
|
||||
t = r/rnom
|
||||
if t < 0:
|
||||
t = t * -1
|
||||
t = float(Decimal(t).ln()) / 4050 + 1.0/(tnom + 273.15)
|
||||
t = 1/t
|
||||
t = t - 273.15
|
||||
return t
|
||||
|
||||
def set_duty(self, fan, percent):
|
||||
if percent == 0:
|
||||
GPIO.output(self.config["fan_output"][fan]["switch"], False)
|
||||
else:
|
||||
GPIO.output(self.config["fan_output"][fan]["switch"], True)
|
||||
self.fan.ChangeDutyCycle(100 - percent)
|
||||
print("Duty: {fan}: {pwm}".format(fan=fan, pwm=percent))
|
||||
|
||||
def run(self):
|
||||
print("Starting...")
|
||||
try:
|
||||
last_th = -1
|
||||
while True:
|
||||
# read temperatures
|
||||
inner = self.read_spiADC("inside")
|
||||
outer = self.read_spiADC("outside")
|
||||
if inner != 0 and outer != 0:
|
||||
# inner_R = rnom/(4095/ inner - 1)
|
||||
inner_T = self.calc_temp(inner, "inside")
|
||||
# outer_R = rnom/(4095/ outer - 1)
|
||||
outer_T = self.calc_temp(outer, "outside")
|
||||
# activate/deactivate and pwm
|
||||
difference = inner_T - outer_T
|
||||
operation = self.config.get("operation")
|
||||
for elem in operation:
|
||||
greater = elem.get("greater")
|
||||
if (
|
||||
difference > greater and
|
||||
last_th != greater
|
||||
):
|
||||
hyst = self.config["defaults"]["hysterese"]
|
||||
in_pwm = elem.get("in_pwm")
|
||||
out_pwm = elem.get("out_pwm")
|
||||
if (
|
||||
difference + hyst > greater and greater > last_th or
|
||||
difference - hyst < greater and greater < last_th
|
||||
):
|
||||
self.set_duty("in", in_pwm)
|
||||
self.set_duty("out", out_pwm)
|
||||
last_th = greater
|
||||
print("Inner temp: {:.2f} - outer temp: {:.2f} || difference: {:.2f}".format(inner_T, outer_T, difference))
|
||||
break
|
||||
if int(time.time()) % 10 == 0:
|
||||
print("Inner temp: {:.2f} - outer temp: {:.2f} || difference: {:.2f}\n".format(inner_T, outer_T, difference))
|
||||
time.sleep(0.5)
|
||||
except Exception as e:
|
||||
raise e
|
||||
finally:
|
||||
GPIO.cleanup()
|
||||
self.spi.close()
|
||||
|
||||
|
||||
mvp = MVP()
|
||||
mvp.run()
|
|
@ -23,7 +23,7 @@ upwm = 23
|
|||
|
||||
GPIO.setup(uswitch, GPIO.OUT)
|
||||
GPIO.setup(upwm, GPIO.OUT)
|
||||
ufan = GPIO.PWM(pwm,25000)
|
||||
ufan = GPIO.PWM(upwm,25000)
|
||||
|
||||
# GPIO.setup(fan_speed, GPIO.IN, pull_up_down=GPIO.PUD_UP)
|
||||
global last_ts
|
||||
|
|
|
@ -46,12 +46,12 @@ class Service(object):
|
|||
channel = int(k)
|
||||
if k < 0:
|
||||
raise RuntimeError("fuck.")
|
||||
for threshold in thresholds:
|
||||
if results[channel] < threshold["temp"]:
|
||||
LowLevel().lower_fan(threshold["fan-low"])
|
||||
LowLevel().lower_fan_pwm(threshold["pwm-low"])
|
||||
LowLevel().upper_fan(threshold["fan-up"])
|
||||
LowLevel().upper_fan_pwm(threshold["pwm-up"])
|
||||
break
|
||||
# for threshold in thresholds:
|
||||
# if results[channel] < threshold["temp"]:
|
||||
# LowLevel().lower_fan(threshold["fan-low"])
|
||||
# LowLevel().lower_fan_pwm(threshold["pwm-low"])
|
||||
# LowLevel().upper_fan(threshold["fan-up"])
|
||||
# LowLevel().upper_fan_pwm(threshold["pwm-up"])
|
||||
# break
|
||||
pass
|
||||
|
||||
|
|
Loading…
Reference in New Issue