#!/usr/bin/python3 # Script heizung-sol.py Abfrage der Heizungswerte von der Ethernetbox2 bis ende nov 2022 # Script heizung-wp.py Abfrage der Heizungswerte von der Ethernetbox2 ab 2023 # 2017-03-21 H.Stummer # 2023-01-15 H.Stummer Waermepumpe # Autor: Heinrich Stummer import sys, traceback, os, datetime, time, socket ######## Pfade und Konstanten mypath = "/work/data/heizung" ## /work/data/heizung/year/month (wird autom. angelegt) myfile = "_heizung.txt" ## mm_sensors.txt mypath2 = "/media/ramdisk" ## ramdisk fuer ID files etc. # in mypath2/Z0 steht für die Aussentemperatur delim = "," # trennzeichen für die Datenzeile errorfile = "/work/data/heizung/heizung-error" ##Etherbox2 ip + port und Etherbox2 device-namen myip="192.168.1.114" myport=4000 # Definitionen Wärmepumpe WRL="pcmeasure.lpt1.2\n" # Wp Rücklauf WVL="pcmeasure.lpt1.4\n" # Wp Vorlauf HR="pcmeasure.lpt1.3\n" # Temp. Heizraum RL="pcmeasure.lpt2.1\n" # Rücklauf Heizkreis VL="pcmeasure.lpt2.2\n" # Vorlauf Heizkreis AUSSEN="pcmeasure.lpt2.4\n" # Aussentemperatur ACHTUNG: Hier ist ein PT1000 DC Verstärker für Negative Temp! nc="pcmeasure.com3.1\n" # Digital Input not used nc="pcmeasure.com1.1\n" # Digital Input not used nc="pcmeasure.com2.1\n" # Digital Input not used header= "TimeStamp,WRL,WVL,HR,RL,VL,AUSSEN,nc,nc,nc\r\n" # am Ende mit CR \r und Newline \n Version = "V1.00 2023-01-15" # Inhalt ID File ist : 2017-04-03 07:30:04 IP:Z0|T=11.6 # Z0 Ist Aussentemperatur Anzeige für andere Webseite # ID ist immer Z0 daher Filename ist immer /media/ramdisk/Z0 # Inhalt datenfile ist: # Datenfile für Auswertung Heizungsdaten # 2017-04-03 07:30:04 ,52.4,14,0,66.6,16.6,17.4,11.6,off,off,off # Filename ist /work/data/heizung/2017/04/03_heizung.txt ########## def getetherbox2(wert,method): mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) mysock.connect((myip,myport)) mysock.send(wert.encode('utf-8')) mdat=mysock.recv(64).decode('utf-8') ## 24Char mysock.close() if method == 16: # wert * 16 (Sensor 0-10V 0-160 grad C ) x = reinige(mdat) k = float(x) k = k*16 return('{:0.1f}'.format(k)) elif method == 30: # wert (* 10) - 30 (Sensor 0-10V -30 - +70 grad C ) x = reinige(mdat) k = float(x) k = k*10 k = k - 30 return('{:0.1f}'.format(k)) elif method == 2: # digital input (Digi 100.0 = Off oder 0.0 = ON x = reinige(mdat) if x < "1": return("on") else: return("off") return(reinige(mdat)) # nativer Wert ohne Berechnung def reinige(wert): # wert: valid=1;value= 3,2421; gibt nur 3,2421 zurück Enfernung von blabla, blanks, semicolon und nl k = wert.split('=') x = k[2].replace(" ","") x = x.replace(";","") x = x.replace("\n","") return(x) def writeIDfile(mylog,message): ## Sensor ID File Schreiben (overwrite) lfile = open(mylog,'w') lfile.write(message) lfile.close return def writelog(mylog,message): ## Datenfile und Errorfile schreiben (append) if os.path.isfile(mylog): logfile = open(mylog, 'a') else: logfile = open(mylog, 'w') logfile.write(header) logfile.write(message) logfile.close() print(message) return def checkdir(mydir): ## directory anlegen wenn fehlt if os.path.isdir(mydir) != True: os.mkdir(mydir) return def checkdate(): ## Timestanp bestimmen und aufbereiten global tnow, mymonth, myyear, ts, myday tnow = (datetime.datetime.now()) myyear = tnow.strftime("%Y") mymonth = tnow.strftime("%m") myday = tnow.strftime("%d") yday = tnow.strftime("%Y-%m-%d") ts = tnow.strftime("%Y-%m-%d %H:%M:%S") return # start script print ("Python Version: ",sys.version) checkdate() # Daten Abfragen dwrl = getetherbox2(WRL,16) dwvl = getetherbox2(WVL,16) dhr = getetherbox2(HR,16) drl = getetherbox2(RL,16) dvl = getetherbox2(VL,16) daussen = getetherbox2(AUSSEN,30) ncp1 = "off" # Pumpenstatus immer off da bei WP nicht verwendet, Kompatibel zur weiteren Verwendung - andere scripte.. data = delim + dwrl + delim + dwvl + delim + dhr + delim + drl + delim + dvl + delim + daussen + delim + ncp1 + delim + ncp1 + delim + ncp1 +"\r\n" try: ID="Z0" checkdate() # timestamp holen checkdir(mypath + "/" + myyear) # Year Dir anlegen wenn es nicht vorhanden ist checkdir(mypath + "/" + myyear + "/" + mymonth) # Monats Dir detto writeIDfile(mypath2 + "/" + ID, ts + " IP:" + ID + "|T=" + daussen + "\r\n") # ID File in ramdisk schreiben für die Webseite writelog(mypath + "/" + myyear + "/" + mymonth + "/" + myday + myfile, ts + " " + data) # Tagesfile schreiben except Exception: traceback.print_exc() traceback.print_exc(file=open(errorfile,"a")) writelog(errorfile, ts + "+++++++++++++++++++++++++++++++++") #EOF