]> hydra-www.ietfng.org Git - acmetensortoys-snakecontrol/commitdiff
pidmonitor: save and restore PID loop state automagically
authorNathaniel Wesley Filardo <nwfilardo@gmail.com>
Sat, 10 Feb 2018 23:49:30 +0000 (18:49 -0500)
committerNathaniel Wesley Filardo <nwfilardo@gmail.com>
Sun, 11 Feb 2018 00:07:50 +0000 (19:07 -0500)
bin/pidmonitor.py
data/.gitignore

index 05f1b0d4d2bdf1ada9e2f07d8ea8e533a4841a9c..8b2d610f5d88fc5218ef70d5aedc8de687511e81 100755 (executable)
@@ -2,6 +2,7 @@
 
 # Inspired by code found at http://wannabe.guru.org/scott/hobbies/temperature/
 
+import ConfigParser
 import sched
 import time
 import serial
@@ -9,6 +10,8 @@ import rrdtool
 
 import pidloop
 
+statefilename = "/home/pi/sc/data/pidmonitor.state"
+
 dmxdev = serial.Serial("/dev/serial/by-id/usb-DMXking.com_DMX_USB_PRO_6A0SVM7J-if00-port0", 57600);
 
 loop_hidenear = pidloop.PIDThresh(128,26,28,0,31,33,-128)
@@ -18,7 +21,6 @@ loop_hidenear.setHardMin(-128)
 loop_hidenear.setKP(60.0)
 loop_hidenear.setKI(0.004)
 loop_hidenear.setKD(1000.0,0.95)
-loop_hidenear.sum_error = 7600.0 # XXX Initialize offset point a bit
 
 loop_tanknear = pidloop.PIDThresh(128,22,23,0,26,28,-128)
 loop_tanknear.setPoint(25)
@@ -36,6 +38,27 @@ loop_hidefar.setKP(60.0)   # XXX These are un-tuned
 loop_hidefar.setKI(0.004)
 loop_hidefar.setKD(1000.0,0.95)
 
+try:
+    config = ConfigParser.ConfigParser()
+    config.read(statefilename)
+
+    try:
+        loop_hidenear.sum_error = config.getfloat("loop_hidenear", "sum_error")
+    except Exception as e:
+        pass
+
+    try:
+        loop_tanknear.sum_error = config.getfloat("loop_tanknear", "sum_error")
+    except Exception as e:
+        pass
+
+    try:
+        loop_hidefar.sum_error  = config.getfloat("loop_hidefar",  "sum_error")
+    except Exception as e:
+        pass
+except Exception as e:
+    pass
+
 def log(devfn, temp, logname, rrd, kw="temp"):
     try:
         rrdtool.update(rrd, "N:" + ("%f" % temp))
@@ -141,9 +164,26 @@ def check_temps(sc):
     print ("PID: ltn=(%s)" % loop_tanknear)
     print ("PID: lhf=(%s)" % loop_hidefar)
 
+
+def save_state(sc):
+    sc.enter(600, 2, save_state, (sc,))
+
+    config = ConfigParser.ConfigParser()
+    config.add_section("loop_tanknear")
+    config.set("loop_tanknear", "sum_error", loop_tanknear.sum_error)
+    config.add_section("loop_hidenear")
+    config.set("loop_hidenear", "sum_error", loop_hidenear.sum_error)
+    config.add_section("loop_hidefar")
+    config.set("loop_hidefar", "sum_error" , loop_hidefar.sum_error )
+
+    with open(statefilename, 'w') as statefile:
+        config.write(statefile)
+
 itime = time.time()
 s = sched.scheduler(time.time, time.sleep)
 s.enterabs(itime, 1, check_temps, (s,))
 
+s.enter(600, 2, save_state, (s,))
+
 print("Monitor starting...")
 s.run()
index 25174443adc606822969c11fd2d943849408c788..b45125dec9e5444da6354dc0dae6fdadb5d876d1 100644 (file)
@@ -1,3 +1,6 @@
 *.rrd
 .*.swp
+
 care.log
+
+pidmonitor.state