Changed issue 7 as well as some other tweaks

correctly set variable to set influxdb
This commit is contained in:
YuruC3 2025-10-18 08:52:30 +02:00
parent 224fae39f7
commit 5a67e90143
2 changed files with 90 additions and 35 deletions

View File

@ -7,33 +7,38 @@ from typing import Final
# setting consts that can be customized
# baud rate. Prob not needed as 38400 is standard
MD1200BAUD: Final[int] = int(os.getenv("MD1200BAUD", 38400))
MD1200BAUD: Final[int] = int(os.getenv("MD1200BAUD", "38400"))
# used if you want to run it on multiple JBODs
SERIALADAPTER: Final[str] = os.getenv("SERIALADAPTER", "/dev/ttyUSB0")
# Factor that defines how aggressive the temperature curve is
TEMP_FACTOR: Final[float] = float(os.getenv("TEMP_FACTOR", 19))
TEMP_FACTOR: Final[float] = float(os.getenv("TEMP_FACTOR", "19"))
# time between sending command to get temp and storing it. It's there to allow JBOD to answer
EPPYSLEEPY: Final[float] = float(os.getenv("EPPYSLEEPY", 1))
EPPYSLEEPY: Final[float] = float(os.getenv("EPPYSLEEPY", "1"))
LOW_FAN_TRSHD: Final[float] = float(os.getenv("LOW_FAN_TRSHD", 21))
HIGH_FAN_TRSHD: Final[float] = float(os.getenv("HIGH_FAN_TRSHD", 40))
LOW_FAN_TRSHD: Final[float] = float(os.getenv("LOW_FAN_TRSHD", "21"))
HIGH_FAN_TRSHD: Final[float] = float(os.getenv("HIGH_FAN_TRSHD", "40"))
GETTMPCMND: Final[str] = os.getenv("GETTMPCMND", "_temp_rd")
SETFANCMND: Final[str] = os.getenv("SETFANCMND", "set_speed")
DEFOUTPRCNTG: Final[float] = float(os.getenv("DEFOUTPRCNTG", 24))
DEFOUTPRCNTG: Final[float] = float(os.getenv("DEFOUTPRCNTG", "24"))
MDSERIALTIMEOUT: Final[float] = float(os.getenv("MDSERIALTIMEOUT", 1))
MDSERIALTIMEOUT: Final[float] = float(os.getenv("MDSERIALTIMEOUT", "1"))
TEMPREADINTERVAL: Final[float] = float(os.getenv("TEMPREADINTERVAL", 15))
TEMPREADINTERVAL: Final[float] = float(os.getenv("TEMPREADINTERVAL", "15"))
TEMPSETING: Final[bool] = bool(os.getenv("TEMPSETING", True))
# If True or yes then we good
TEMPSETING = os.getenv("TEMPSETING", "1").strip().lower() in ("1", "true", "yes", "on")
PROCESSTEMPWAITTIME: Final[float] = float(os.getenv("PROCESSTEMPWAITTIME", 0.75))
PROCESSTEMPWAITTIME: Final[float] = float(os.getenv("PROCESSTEMPWAITTIME", "0.75"))
BACKOFFTIME: Final[float] = float(os.getenv("BACKOFFTIME", 5))
BACKOFFTIME: Final[float] = float(os.getenv("BACKOFFTIME", "5"))
INFLUX_MAX_RETRIES: Final[int] = int(os.getenv("INFLUX_MAX_RETRIES", "3"))
# INFLUXDB config
# should Influx be used?
USEINFLUX: Final[bool] = os.getenv("USEINFLUX", "True").strip().lower() in ("1", "true", "yes", "on")
# token = "apg1gysUeCcxdcRTMmosJTenbEppmUNi9rXlANDB2oNadBdWAu2GVTDc_q_dyo0iyYsckKaOvPRm6ba2NK0y_A=="
INFLUXTOKEN: Final[str] = str(os.getenv("INFLUX_TOKEN", "0"))
# bucket = "JBOD"
@ -61,20 +66,35 @@ MDserial = serial.Serial(
timeout=MDSERIALTIMEOUT)
# lastTempReading: float = time.time()
setSpeedrcode = 21
MDtempDict: dict = {}
MDict: dict = {}
currentSerialUsage = threading.Lock()
fluxSending: bool = False
currentTime: float = 0
lastTempReading: float = 0
inflxdb_LeData: list = []
# Initialize InfluxDB client and influxdb API
# ---------------------UNCOMMENT-----------------------
inflxdb_client = influxdb_client.InfluxDBClient(url=INFLUXURL, token=INFLUXTOKEN, org=INFLUXORG)
write_api = inflxdb_client.write_api(write_options=SYNCHRONOUS)
if USEINFLUX:
inflxdb_client = influxdb_client.InfluxDBClient(url=INFLUXURL, token=INFLUXTOKEN, org=INFLUXORG)
write_api = inflxdb_client.write_api(write_options=SYNCHRONOUS)
inflxdb_LeData: list = []
# ---------------------UNCOMMENT-----------------------
# Just a helper function for process_temps to avoid db errors on flapping network
def process_temps_dbsend(inpdatatosend) -> bool:
if not USEINFLUX:
return True
try:
write_api.write(bucket=INFLUXBUCKET, org=INFLUXORG, record=inpdatatosend)
return True
except Exception as e:
print(f"Influx write error {e}", flush=True)
return False
def getTemp() -> dict:
global MDict, fluxSending
@ -155,6 +175,7 @@ def setSpeed(inSpeeDict: dict) -> int:
# get backplanbe average
if "bp1" in inSpeeDict and "bp2" in inSpeeDict:
bpavrg = (inSpeeDict["bp1"] + inSpeeDict["bp2"]) /2
#outfanprcntg = int((bpavrg / (HIGH_FAN_TRSHD - LOW_FAN_TRSHD)) * TEMP_FACTOR)
outfanprcntg = int((bpavrg / (HIGH_FAN_TRSHD - LOW_FAN_TRSHD)) * TEMP_FACTOR)
# os.system(f"echo setting {outfanprcntg}%")
@ -190,26 +211,31 @@ def setSpeed(inSpeeDict: dict) -> int:
# Threaded flow processor
def process_temps() -> None:
global MDict, fluxSending
global MDict, fluxSending, setSpeedrcode
while True:
# ---LeData---
# {'bp1': 35, 'bp2': 29, 'sim0': 35, 'sim1': 34, 'exp0': 56, 'exp1': 54}
# ---LeData---
if fluxSending:
# Prep InfluxDB data
# build local copy in case MDict changes while executing
MDictLocalCopy = MDict.copy()
try:
inflxdb_Data_To_Send = (
influxdb_client.Point(f"{INFLUXMEASUREMENT}-script")
.tag("MACHINE", MACHINE_TAG)
.tag("LOCATION", LOCATION)
.field("Backplane1", MDict["bp1"])
.field("Backplane2", MDict["bp2"])
.field("SASIntModule0", MDict["sim0"])
.field("SASIntModule1", MDict["sim1"])
.field("Expander0", MDict["exp0"])
.field("Expander1", MDict["exp1"])
.field("Average", MDict["avg"])
.field("Backplane1", MDictLocalCopy["bp1"])
.field("Backplane2", MDictLocalCopy["bp2"])
.field("SASIntModule0", MDictLocalCopy["sim0"])
.field("SASIntModule1", MDictLocalCopy["sim1"])
.field("Expander0", MDictLocalCopy["exp0"])
.field("Expander1", MDictLocalCopy["exp1"])
.field("Average", MDictLocalCopy["avg"])
.field("FanSpeed", setSpeedrcode)
)
except KeyError:
time.sleep(BACKOFFTIME)
@ -217,13 +243,27 @@ def process_temps() -> None:
# Prep/append data
inflxdb_LeData.append(inflxdb_Data_To_Send)
# Send data to InfluxDB
write_api.write(bucket=INFLUXBUCKET, org=INFLUXORG, record=inflxdb_Data_To_Send)
# Issue YuruC3/MD1200#7 fix
if not process_temps_dbsend(inflxdb_Data_To_Send):
i = 0
while i < INFLUX_MAX_RETRIES:
if process_temps_dbsend(inflxdb_Data_To_Send):
print("Sending data to InfluxDB", flush=True)
break
else:
time.sleep(1)
i += 1
else:
print(f"Failed to send data to InfluxDB after {INFLUX_MAX_RETRIES} retires", flush=True)
else:
print("Sending data to InfluxDB", flush=True)
# Clean up before another lo#op, 0.75
inflxdb_LeData.clear()
print("Sending data to InfluxDB", flush=True)
fluxSending = False
@ -238,6 +278,7 @@ MDict = getTemp()
lastTempReading = time.time()
def mainCodeHere() -> None:
global setSpeedrcode
while True:
global MDict, fluxSending, currentTime, lastTempReading
# https://stackoverflow.com/questions/52578122/not-able-to-send-the-enter-command-on-pyserial
@ -287,11 +328,23 @@ def mainCodeHere() -> None:
# Prepare threads and launch them
thread_main = threading.Thread(target=mainCodeHere)
thread_flux = threading.Thread(target=process_temps)
thread_main.start()
thread_flux.start()
thread_main.join()
thread_flux.join()
# daemon to make docker exit smoother
thread_main = threading.Thread(target=mainCodeHere, daemon=True)
threads = [thread_main]
if USEINFLUX:
thread_flux = threading.Thread(target=process_temps, daemon=True)
threads.append(thread_flux)
for thr in threads:
thr.start()
# Join both (this will block forever, which is fine for a daemon)
for thr in threads:
thr.join()

View File

@ -1,11 +1,13 @@
# MD1200BAUD=
SERIALADAPTER=/dev/ttyUSB0
EPPYSLEEPY=1
MDSERIALTIMEOUT=1
TEMPREADINTERVAL=15
# These are (for me) working values
EPPYSLEEPY=1.5
MDSERIALTIMEOUT=2
TEMPREADINTERVAL=30
TEMP_FACTOR=17
TEMP_FACTOR=16
# LOW_FAN_TRSHD=21
# HIGH_FAN_TRSHD=40