commit 94a994511d1b49a8a81c4388fefde184560116dc Author: shurik Date: Mon May 25 16:45:21 2026 +0300 Загрузить файлы в «aid03» diff --git a/aid03/app.py b/aid03/app.py new file mode 100644 index 0000000..c3f5da5 --- /dev/null +++ b/aid03/app.py @@ -0,0 +1,271 @@ +from flask import Flask, Response, request, redirect +from os import path, system, remove +import datetime +import numpy as np +from time import sleep, time +from subprocess import Popen, PIPE + +ap=path.abspath(__file__) +script_dir = path.dirname(ap) +tlfList = "%s/data/tlf.list" % script_dir + +app = Flask(__name__) + +import telebot +tbToken='7764038785:AAFNwMoOZWhqH9hQxDJsoWqSS3BYL4P9ua4' +bot = telebot.TeleBot(tbToken) +homeToken='5563613923:AAFGYdokQYJfTTQYhJftGZy3KtMDSZg5p6Q'; +homebot = telebot.TeleBot(homeToken) + +@app.route('/') +def root_dir(): + return('Hello!') + +@app.route('/ok') +def say_ok(): + return('Ok') + +@app.route('/gettlf', methods = ['POST', 'GET']) +def get_tlf(): + tlfline="" + def check_tlf(tnum): + with open(tlfList, 'r') as f: + lines = [line.rstrip() for line in f] + for l in lines: + b = l.split("\t") + if tnum == b[0]: + tlfline = l + return (True, l) + return (False, "nonum") + opendoor = True + rez = 'Ok' + ts = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3] + tlf = request.args.get('t') + if not tlf: + try: + tlf = request.form['t'] + if not tlf: + tlf = '00000000000' + opendoor = False + rez = 'NT' + except Exception as e: + tlf = '00000000000' + opendoor = False + rez = 'ERR' + with open("./log/tlf.log", 'a') as f: + f.write("%s\t%s\n" % (ts, tlf)) + if(opendoor): + chktlf, tlfline = check_tlf(tlf) + if chktlf: + system("curl -X GET http://192.168.50.63/openDoor") + bot.send_message('-1002333671072', "%s - открывание ворот" % tlfline) + else: + rez = 'NN' + return(rez) + +@app.route('/doorchk') +def sb_doorchk(): + doorid = request.args.get('doorid') + doorstat = request.args.get('doorstat') + vbat = request.args.get('vbat') + temp = request.args.get('t') + hum = request.args.get('h') + msgadd = "" + if not doorid: + return 'ERROR! No door number\n' + if not doorstat: + return 'ERROR! No door status\n' + if not vbat: + vbat = "-1" + #//else: + #// if(float(vbat) < vbat_low): + #// tg_alert("DOOR CHECK [%s] VBAT LOW %s" % (doorid, vbat)) + if temp: + msgadd = " / Температура %.2fV" % float(temp) + if hum: + msgadd = "%s / Влажность %.2fV" % (msgadd, float(hum)) + + msgadd = "" + ts = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + if(int(doorstat)==0): + msg = "Калитка %s. Открытие. %s%s\n" % (doorid, ts, msgadd) + else: + msg = "Калитка %s. Закрытие. %s%s\n" % (doorid, ts, msgadd) + + uid = "245058979" + #homebot.send_message(uid, msg) + bot.send_message('-1002333671072', msg) + return 'Сообщение отправлено\n' + +@app.route('/hm') +def heart_mon(): + data = request.args.get('data') + answ = 'OK' + if not data: + data = 'data empty' + answ = 'ERR' + ts = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3] + with open("./log/heart_mon.stat", 'a') as f: + f.write("%s\t%s\n" % (ts, data)) + p=data.split(",") + tm=int(time()) + if len(p) >=3 : + ma=p[2].replace(':','') + #cmd="mosquitto_pub -u \"shurik\" -P \"Iehbr2023\" -h 127.0.0.1 -p 1883 -t \"homeassistant/sensor/sugar001/state\" -m '{\"MAC\":\"%s\",\"mmol\":%s,\"temp\":%s,\"time\":%i}'" % (p[2 + if len(p) >=5 : + cmd="mosquitto_pub -r -u \"shurik\" -P \"Iehbr2023\" -h 127.0.0.1 -p 1883 -t \"sugarcontrol/sensor/sugar/%s/state\" -m '{\"MAC\":\"%s\",\"mmol\":%s,\"temp\":%s,\"time\":%i,\"sensor\":\"%s\"}'" % (p[4],p[2],p[0], p[1],int(p[3])/1000,p[4]) + #cmd="mosquitto_pub -u \"shurik\" -P \"Iehbr2023\" -h 127.0.0.1 -p 1883 -t \"homeassistant/sensor/sugar/%s/state\" -m '{\"MAC\":\"%s\",\"mmol\":%s,\"temp\":%s,\"time\":%i}'" % + else : + cmd="mosquitto_pub -r -u \"shurik\" -P \"Iehbr2023\" -h 127.0.0.1 -p 1883 -t \"homeassistant/sensor/sugar/%s/state\" -m '{\"MAC\":\"%s\",\"mmol\":%s,\"temp\":%s,\"time\":%i}'" % (ma,p[2],p[0], p[1],tm) + print(cmd) + system(cmd) + else: + print("test data?") + return answ + +@app.route('/hmShow') +def hm_show(): + llimit = 10 + log_file = "./log/heart_mon.stat" + new_log = "%s.tmp" % (log_file) + data = '' + try: + if llimit : + system("tail -n%s %s > %s" % (llimit, log_file, new_log)) + log_file = new_log + with open(log_file, 'r') as f: + data = f.read() + except Exception as e: + data = "data log is empty\n" + return Response(data, mimetype='text/plain') + +import psycopg2 +DBName='tgbot' #'lifecontrol' +DBUser='tgbot' #'lifecontrol' +DBPass='' +DBPort='6432' +#DBHost='213.252.97.166' +DBHost='185.212.88.27' +def write2log(logfile, msg): + with open(logfile, "a") as f: + ts = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3] + f.write("%s: %s\n" % (ts, msg)) + +@app.route('/drl') +def get_drug_list(): + dataval = request.args.get('drp') + if not dataval: + return Response("не задан шаблон для поиска лекарств", mimetype='text/plain') + qs=str('%'+dataval+'%') + q="SELECT name_rus FROM drugs WHERE name_rus LIKE '%s'" % qs.upper() + write2log('./log/get_drug_list.log', q) + conn = psycopg2.connect(dbname=DBName, user=DBUser, password=DBPass, host=DBHost, port=DBPort) + cursor = conn.cursor() + cursor.execute(q) + records = cursor.fetchall() + data='По заданному шаблону лекарства не найдены' + i=1 + for r in records: + if(i == 1): + data=r[0] + else: + data=data+"\n"+r[0] + i=i+1 + cursor.close() + conn.close() + #data="АСПИРИН\nПЕНТАЛГИН\nПУРГЕН" + return Response(data, mimetype='text/plain') + + +@app.route('/pox', methods = ['POST']) # pulseoximeter +def pox(): + try: + if(not request.headers): + return('ERR headers\n') + if(not request.headers["Title"]): + return('ERR Title\n') + i = request.headers["Title"].find(",") + ap_id = request.headers["Title"][:i] + ts = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3] + rdat = request.data + #================================================================== + print("ld2410dat: data check") + with open("./log/pox_dat.%s" % ap_id, 'a') as f: + f.write("%s\t%s\t%s\n" % (ts, request.headers["Title"], rdat)) + except Exception as e: + print(e) + return("sba work error") + return 'OK!\n' + +@app.route('/getmr', methods = ['GET']) +def get_mr60(): + datadir = "log" + lcnt=20 + mrid = request.args.get('id') + if not mrid: + mrid = "01" + log = "%s/%s/pox_dat.R60_8266_%s" % (script_dir, datadir, mrid) + if not path.isfile(log): + return Response("no log file", mimetype='text/plain') + buf = "time,\t\t\tpulse,\tdyh-e,\tdist,\tmove\n" + databuf = Popen(["tail", "-n%i" % lcnt, log], stdout=PIPE, encoding='utf-8').communicate()[0] + lines = databuf.split("\n") + for line in lines: + p = line.split("\t") + if len(p) >=3 : + tdat = p[1].split(", ") + ttime = p[0].split(".")[0] + buf = buf + "%s\t%s\t%s\t%s\t%s\n" % (ttime, tdat[1], tdat[3], tdat[5], tdat[7]) + return Response(buf, mimetype='text/plain') + +@app.route('/mr60dat') +def mr60data(): + datadir = "log" + lcnt=1 + mrid = request.args.get('id') + if not mrid: + log = "%s/%s/pox_dat.R60_GERMAN" % (script_dir, datadir) + else: + log = "%s/%s/pox_dat.R60_8266_%s" % (script_dir, datadir, mrid) + if not path.isfile(log): + return Response("no log file %s" % log, mimetype='text/plain') + line = Popen(["tail", "-n%i" % lcnt, log], stdout=PIPE, encoding='utf-8').communicate()[0] + wa_file = "%s/templates/R60.html" % script_dir + data = '' + try: + with open(wa_file, 'r') as f: + data = f.read() + except Exception as e: + data = "data file is empty %s\n" % wa_file + p = line.split("\t") + #print("=================================================") + #print(len(p)) + if len(p) >=3 : + tdat = p[1].split(", ") + #print(tdat) + ttime = p[0].split(".")[0] + data=data.replace("<%time%>", ttime).replace("<%heart%>", tdat[1]).replace("<%breath%>", tdat[3]).replace("<%dist%>", tdat[5]).replace("<%move%>", tdat[7]) + #print("=================================================") + return Response(data, mimetype='text/html') + +@app.route('/tgwebapp') +def tg_webapp(): + wa_file = "./templates/webapp.html" + data = '' + try: + with open(wa_file, 'r') as f: + data = f.read() + except Exception as e: + data = "webapp file is empty\n" + return Response(data, mimetype='text/html') + +@app.route('/tgpsybot') +def tg_psybot(): + #rurl = "https://t.me/aipsyassistantbot" + rurl = "https://www.vysotamed.ru/" + return redirect(rurl) + + +if __name__ == '__main__': + app.run() + diff --git a/aid03/start_uwsgi.sh b/aid03/start_uwsgi.sh new file mode 100644 index 0000000..67742b7 --- /dev/null +++ b/aid03/start_uwsgi.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +cd /home/shurik/aid03/src +while true +do + TM=`date +"%Y-%m-%d_%H%M%S"` + echo $TM "UWSGI started" >> uwsgi.log + /home/shurik/uwsgi/uwsgi --ini /home/shurik/aid03/src/uwsgi.ini + sleep 10 +done diff --git a/aid03/uwsgi.ini b/aid03/uwsgi.ini new file mode 100644 index 0000000..d340e31 --- /dev/null +++ b/aid03/uwsgi.ini @@ -0,0 +1,22 @@ +[uwsgi] +master = true +processes = 5 +chdir=/home/shurik/aid03/src +#socket=0.0.0.0:433 +##shared-socket = 0.0.0.0:443 +shared-socket = 62.117.97.3:443 +uid = shurik +gid = www-data + +https = =0,/home/shurik/aid03/https/fullchain.pem,/home/shurik/aid03/https/privkey.pem,HIGH +#http-to = /tmp/uwsgi.sock +#http = aid.03.ru:80 + +enable-threads = true +vacuum = true +die-on-term = true +buffer-size=32768 +wsgi-file = app.py +callable = app +#module=app.py:application +pidfile=/tmp/aid03_app.pid