1094 lines
38 KiB
Python
1094 lines
38 KiB
Python
|
|
from flask import Flask, Response, request
|
|||
|
|
from os import path, system, remove
|
|||
|
|
import datetime
|
|||
|
|
from time import sleep, time
|
|||
|
|
import matplotlib.pyplot as plt
|
|||
|
|
import numpy as np
|
|||
|
|
import cv2
|
|||
|
|
from subprocess import Popen, PIPE
|
|||
|
|
import json
|
|||
|
|
import requests
|
|||
|
|
|
|||
|
|
|
|||
|
|
import telebot
|
|||
|
|
tbToken='5536375305:AAHGkcHW-_PqhNDP8Zl27X7Q0_TD6vksQ9U'
|
|||
|
|
bot = telebot.TeleBot(tbToken)
|
|||
|
|
homeToken='5563613923:AAFGYdokQYJfTTQYhJftGZy3KtMDSZg5p6Q';
|
|||
|
|
homebot = telebot.TeleBot(homeToken)
|
|||
|
|
|
|||
|
|
alertsToken='6307305357:AAErNusrWuzZDb0KgSol5JGc7gqpFi7mqxk';
|
|||
|
|
alertsbot = telebot.TeleBot(alertsToken)
|
|||
|
|
vbat_low = 2.9
|
|||
|
|
def tg_alert(msg):
|
|||
|
|
#ids = '420641258,245058979'
|
|||
|
|
ids = '245058979'
|
|||
|
|
uids = ids.split(",")
|
|||
|
|
for uid in uids:
|
|||
|
|
alertsbot.send_message(uid, msg)
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
ap=path.abspath(__file__)
|
|||
|
|
script_dir = path.dirname(ap)
|
|||
|
|
log_file_tmpl = "%s/log/sb_%s_%s.log"
|
|||
|
|
show_html_file = "%s/show.html" % script_dir
|
|||
|
|
show_chart_file = "%s/templates/img.html" % script_dir
|
|||
|
|
sha_1a_html_file= "%s/templates/sba_1accel_img.html" % script_dir
|
|||
|
|
|
|||
|
|
app = Flask(__name__)
|
|||
|
|
|
|||
|
|
buf_file = 'data.buf'
|
|||
|
|
|
|||
|
|
chart_size = 12
|
|||
|
|
|
|||
|
|
home_dir = "/home/shurik/SmartBed/src"
|
|||
|
|
def make_1accel_graph(devid, lcnt):
|
|||
|
|
datadir = "log"
|
|||
|
|
log = "%s/%s/sbadat.%s" % (home_dir, datadir, devid)
|
|||
|
|
img_name = "%s/tmp/img_sbadat_%s.png" % (home_dir, devid)
|
|||
|
|
|
|||
|
|
databuf = Popen(["tail", "-n%i" % lcnt, log], stdout=PIPE, encoding='utf-8').communicate()[0]
|
|||
|
|
lines = [line.rstrip() for line in databuf.split("\n")]
|
|||
|
|
|
|||
|
|
x=[];y=[];z=[];stm=[];vbat=[];deltas=[]
|
|||
|
|
def parseLine(l):
|
|||
|
|
td=l.split("\t")
|
|||
|
|
if np.shape(td)[0]<3 :
|
|||
|
|
return
|
|||
|
|
dat_tmp=td[2].split("\\n")
|
|||
|
|
dat = dat_tmp[np.size(dat_tmp)-1].replace("'","").split(";")
|
|||
|
|
stm.append(td[0].split(" ")[1].split(".")[0])
|
|||
|
|
vbat.append(dat_tmp[np.size(dat_tmp)-2].split(" ")[-1].replace("\\r",''))
|
|||
|
|
for m in dat:
|
|||
|
|
# print("m=[%s]" % m)
|
|||
|
|
ms=m.split(",")
|
|||
|
|
x.append(int(ms[1]))
|
|||
|
|
y.append(int(ms[2]))
|
|||
|
|
z.append(int(ms[3]))
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
for l in lines:
|
|||
|
|
parseLine(l)
|
|||
|
|
#print(np.shape(x))
|
|||
|
|
deltas=[max(x)-min(x),max(y)-min(y),max(z)-min(z)]
|
|||
|
|
|
|||
|
|
image_shape = (720, 1280, 3) # (1080, 1920, 3)
|
|||
|
|
imH, imW = [720, 1280] # [1080, 1920]
|
|||
|
|
image = np.zeros(image_shape, dtype=np.uint8)
|
|||
|
|
|
|||
|
|
c0 = (255, 0, 0)
|
|||
|
|
c1 = (0, 255, 0)
|
|||
|
|
c2 = (0, 0, 255)
|
|||
|
|
|
|||
|
|
thickness = 2
|
|||
|
|
gpoints = np.shape(x)[0]
|
|||
|
|
rd=10 # смещение графика от верхнего/нижнего края
|
|||
|
|
gdelta = 20 # смещение графика от левого/правого края
|
|||
|
|
wStep = (imW - gdelta*2) / gpoints #/2
|
|||
|
|
|
|||
|
|
maxHVal = 16000
|
|||
|
|
halfH = imH/2
|
|||
|
|
xavg=np.mean(x); yavg=np.mean(y); zavg=np.mean(z)
|
|||
|
|
x=(np.array(x)-xavg)/maxHVal*imH + halfH
|
|||
|
|
y=(np.array(y)-yavg)/maxHVal*imH + halfH
|
|||
|
|
z=(np.array(z)-zavg)/maxHVal*imH + halfH
|
|||
|
|
|
|||
|
|
|
|||
|
|
xg=[];yg=[];zg=[]
|
|||
|
|
for j in range(gpoints):
|
|||
|
|
Wval = int(gdelta + wStep*j)
|
|||
|
|
xg.append([Wval, int(x[j])])
|
|||
|
|
yg.append([Wval, int(y[j])])
|
|||
|
|
zg.append([Wval, int(z[j])])
|
|||
|
|
|
|||
|
|
xg = np.array(xg, np.int32).reshape((-1, 1, 2))
|
|||
|
|
yg = np.array(yg, np.int32).reshape((-1, 1, 2))
|
|||
|
|
zg = np.array(zg, np.int32).reshape((-1, 1, 2))
|
|||
|
|
isClosed = False
|
|||
|
|
image = cv2.polylines(image, [xg], isClosed, c0, thickness)
|
|||
|
|
image = cv2.polylines(image, [yg], isClosed, c1, thickness)
|
|||
|
|
image = cv2.polylines(image, [zg], isClosed, c2, thickness)
|
|||
|
|
#cv2.putText(image, "%s / %sV" % (stm[0], vbat[0]), (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 2, (255, 255, 255), 2)
|
|||
|
|
cv2.putText(image, "%sV" % (vbat[-1]), (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 2, (255, 255, 255), 2)
|
|||
|
|
cv2.putText(image, "dlt %i" % (deltas[0]), (imW-200, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, c0, 2)
|
|||
|
|
cv2.putText(image, "dlt %i" % (deltas[1]), (imW-200, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, c1, 2)
|
|||
|
|
cv2.putText(image, "dlt %i" % (deltas[2]), (imW-200, 150), cv2.FONT_HERSHEY_SIMPLEX, 1, c2, 2)
|
|||
|
|
cv2.putText(image, "sum %i" % (sum(deltas)), (imW-200, 200), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
|
|||
|
|
|
|||
|
|
for i in range(lcnt-1):
|
|||
|
|
vline = [[int(imW/lcnt*(i+1)), 20], [int(imW/lcnt*(i+1)), imH-20]]
|
|||
|
|
vline = np.array(vline, np.int32).reshape((-1, 1, 2))
|
|||
|
|
cv2.polylines(image, [vline], isClosed, (200, 200, 200), thickness)
|
|||
|
|
cv2.putText(image, "%s" % (stm[i+1]), (int(imW/lcnt*(i+1))+5, imH-40), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)
|
|||
|
|
|
|||
|
|
|
|||
|
|
cv2.imwrite(img_name, image)
|
|||
|
|
return(img_name)
|
|||
|
|
|
|||
|
|
|
|||
|
|
ax_mid_lim = 512
|
|||
|
|
ax_max_lim = 1024
|
|||
|
|
def make_4axels_plot(dev, id, axl, ln, axel_cnt, steps, pdCnt):
|
|||
|
|
datadir = "log"
|
|||
|
|
logid = id
|
|||
|
|
log = "%s/%s/sb_%s_%s.log" % (home_dir, datadir, dev, logid)
|
|||
|
|
img_name = "%s/tmp/img_%s_%s_%s.png" % (home_dir, dev, logid, axl.replace(',', '-'))
|
|||
|
|
axels4graph=[int(an)-1 for an in axl.split(',')]
|
|||
|
|
maxaxels4graphcnt = 4
|
|||
|
|
axels4graphcnt = min(maxaxels4graphcnt, len(axels4graph))
|
|||
|
|
scale = 5 # увеличение сигнала на графике
|
|||
|
|
log_lines = int(ln)
|
|||
|
|
dd = 1 # data_delta - пропускаем первое значение - таймер
|
|||
|
|
log_recs_delta = 1.5 # интервал между записями в логе
|
|||
|
|
ax = [[[],[],[]] for n in range(axel_cnt)]
|
|||
|
|
times = []
|
|||
|
|
cc=0
|
|||
|
|
databuf = Popen(["tail", "-n%i" % log_lines, log], stdout=PIPE, encoding='utf-8').communicate()[0]
|
|||
|
|
lines = [line.rstrip() for line in databuf.split("\n")]
|
|||
|
|
for l in lines:
|
|||
|
|
if len(l) <=1 :
|
|||
|
|
break
|
|||
|
|
times.append(l.split("\t")[0])
|
|||
|
|
args = l.split("\t")[1].split(",")
|
|||
|
|
for sn in range(steps):
|
|||
|
|
dlt = sn * 3 * axel_cnt
|
|||
|
|
for i in range(axel_cnt):
|
|||
|
|
# dd - data_delta
|
|||
|
|
#ax[i][0].append(int(args[dlt + i*3+0+dd]) if int(args[dlt + i*3+0+dd]) < ax_mid_lim else int(args[dlt + i*3+0+dd]) - ax_max_lim)
|
|||
|
|
#ax[i][1].append(int(args[dlt + i*3+1+dd]) if int(args[dlt + i*3+1+dd]) < ax_mid_lim else int(args[dlt + i*3+1+dd]) - ax_max_lim)
|
|||
|
|
#ax[i][2].append(int(args[dlt + i*3+2+dd])-280 if int(args[dlt + i*3+2+dd]) < ax_mid_lim else int(args[dlt + i*3+2+dd]) - ax_max_lim)
|
|||
|
|
# NEW for mpu6050 data in float format
|
|||
|
|
ax[i][0].append(int(float(args[dlt + i*3+0+dd])*100));
|
|||
|
|
ax[i][1].append(int(float(args[dlt + i*3+1+dd])*100));
|
|||
|
|
ax[i][2].append(int(float(args[dlt + i*3+2+dd])*100-1000));
|
|||
|
|
cc+=1
|
|||
|
|
ax_shape = np.shape(ax)
|
|||
|
|
axMax = [[0, 0, 0] for n in range(axel_cnt)]
|
|||
|
|
axMin = [[0, 0, 0] for n in range(axel_cnt)]
|
|||
|
|
deltaMax = 0
|
|||
|
|
for ai in range(axel_cnt):
|
|||
|
|
for i in range(3):
|
|||
|
|
axMax[ai][i] = max(ax[ai][i])
|
|||
|
|
axMin[ai][i] = min(ax[ai][i])
|
|||
|
|
if axMax[ai][i] == axMin[ai][i]:
|
|||
|
|
axMax[ai][i] += 1
|
|||
|
|
deltaMax = (axMax[ai][i] - axMin[ai][i]) if (axMax[ai][i] - axMin[ai][i]) > deltaMax else deltaMax
|
|||
|
|
a1,a2,glen = np.shape(ax)
|
|||
|
|
imH, imW = [1080, 1920]
|
|||
|
|
image_shape = (imH, imW, 3)
|
|||
|
|
image = np.zeros(image_shape, dtype=np.uint8)
|
|||
|
|
gpoints = ax_shape[2]
|
|||
|
|
gphalf = gpoints / 2
|
|||
|
|
gdelta = 20 # смещение графика от левого/правого края
|
|||
|
|
hStep = (imH - 10) / (4 / 2) - 10
|
|||
|
|
wStep = (imW - gdelta*2) / gpoints /2
|
|||
|
|
hpix = 2 # int(65000 / hStep) # вес одного вертикального пикселя
|
|||
|
|
isClosed = False
|
|||
|
|
c0 = (255, 0, 0)
|
|||
|
|
c1 = (0, 255, 0)
|
|||
|
|
c2 = (0, 0, 255)
|
|||
|
|
thickness = 2
|
|||
|
|
vline = [[imW/2, 20], [imW/2, imH-20]]
|
|||
|
|
vline = np.array(vline, np.int32).reshape((-1, 1, 2))
|
|||
|
|
hline = [[20, imH/2], [imW-20, imH/2]]
|
|||
|
|
hline = np.array(hline, np.int32).reshape((-1, 1, 2))
|
|||
|
|
radius = 20
|
|||
|
|
color = [(0, 0, 225), (225, 225, 255)]
|
|||
|
|
aiH = [1, 1, 0, 0]
|
|||
|
|
aiW = [0, 1, 0, 1]
|
|||
|
|
cnt = 0
|
|||
|
|
fc = 0
|
|||
|
|
pdcnt = 0
|
|||
|
|
ret_val = True
|
|||
|
|
printflag=True
|
|||
|
|
gstep = 5
|
|||
|
|
dsize = 20 # размер анализируемого на движение участка
|
|||
|
|
msize = 3 # meter size / интервал измерения от текущей точки назад
|
|||
|
|
body = ["nogi", "ruki", "telo"]
|
|||
|
|
|
|||
|
|
|
|||
|
|
for istep in range(1):
|
|||
|
|
image *= 0
|
|||
|
|
image -=1
|
|||
|
|
acnt = 0 # int(cnt / input_frm_rates * (steps / log_recs_delta) )
|
|||
|
|
pdcnt = int(acnt/10)
|
|||
|
|
dstart = acnt-dsize if acnt> dsize else 0
|
|||
|
|
mstart = acnt-msize if acnt> msize else 0
|
|||
|
|
gstart = 0 # int((acnt-gphalf) if (acnt>gphalf) else 0)
|
|||
|
|
gstop = glen #int((acnt+gphalf) if (acnt<(glen-gphalf)) else glen)
|
|||
|
|
chartlen = int(gstop - gstart)
|
|||
|
|
ldelta = int(gdelta) #int(gdelta if (gstart>0) else gdelta + (gphalf - acnt)*wStep)
|
|||
|
|
ax4ch = [[[],[],[]] for n in range(axels4graphcnt)]
|
|||
|
|
j=0
|
|||
|
|
for i in range(gstart, gstop):
|
|||
|
|
Wval = [int(ldelta + wStep*j) , int(imW/2+ldelta + wStep*j)]
|
|||
|
|
for ai in range(axels4graphcnt):
|
|||
|
|
ax4ch[ai][0].append([Wval[aiW[ai]], int((ax[axels4graph[ai]][0][i]*scale+80)/hpix + 10 + aiH[ai]*hStep+150)])
|
|||
|
|
ax4ch[ai][1].append([Wval[aiW[ai]], int((ax[axels4graph[ai]][1][i]*scale+80)/hpix + 10 + aiH[ai]*hStep+150)])
|
|||
|
|
ax4ch[ai][2].append([Wval[aiW[ai]], int((ax[axels4graph[ai]][2][i]*scale+80)/hpix + 10 + aiH[ai]*hStep+150)])
|
|||
|
|
j += 1
|
|||
|
|
for i in range(axels4graphcnt):
|
|||
|
|
ax4ch[i][0] = np.array(ax4ch[i][0], np.int32).reshape((-1, 1, 2))
|
|||
|
|
ax4ch[i][1] = np.array(ax4ch[i][1], np.int32).reshape((-1, 1, 2))
|
|||
|
|
ax4ch[i][2] = np.array(ax4ch[i][2], np.int32).reshape((-1, 1, 2))
|
|||
|
|
for i in range(axels4graphcnt):
|
|||
|
|
image = cv2.polylines(image, [ax4ch[i][0]], isClosed, c0, thickness)
|
|||
|
|
image = cv2.polylines(image, [ax4ch[i][1]], isClosed, c1, thickness)
|
|||
|
|
image = cv2.polylines(image, [ax4ch[i][2]], isClosed, c2, thickness)
|
|||
|
|
image = cv2.polylines(image, [vline], isClosed, (200, 200, 200), thickness)
|
|||
|
|
image = cv2.polylines(image, [hline], isClosed, (200, 200, 200), thickness)
|
|||
|
|
for i in range(axels4graphcnt):
|
|||
|
|
labH = int(50+imH*aiH[i]/2)
|
|||
|
|
labW = int(20+imW*aiW[i]/2)
|
|||
|
|
cv2.putText(image, "axel %i" % (axels4graph[i]+1), (labW, labH), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
|
|||
|
|
cv2.imwrite(img_name,image)
|
|||
|
|
return(img_name)
|
|||
|
|
|
|||
|
|
|
|||
|
|
def make_plot(fname, id):
|
|||
|
|
# https://pyprog.pro/mpl/mpl_main_components.html
|
|||
|
|
with open(fname, 'r') as f:
|
|||
|
|
lines = [line.rstrip() for line in f]
|
|||
|
|
axel_cnt = 4
|
|||
|
|
steps = 10 # количество измерений в одной строке
|
|||
|
|
pd_delta = steps * axel_cnt * 3
|
|||
|
|
if len(lines)<=0:
|
|||
|
|
fig, chrts = plt.subplots(axel_cnt+1, 3, figsize=(20,25))
|
|||
|
|
img_name = "%s_chart.png" % fname
|
|||
|
|
plt.savefig(img_name)
|
|||
|
|
fig.clear()
|
|||
|
|
plt.close( fig )
|
|||
|
|
return(img_name)
|
|||
|
|
|
|||
|
|
ax = [ [[],[],[]],
|
|||
|
|
[[],[],[]],
|
|||
|
|
[[],[],[]],
|
|||
|
|
[[],[],[]]
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
ax1 = []
|
|||
|
|
ax2 = []
|
|||
|
|
ax3 = []
|
|||
|
|
pd = []
|
|||
|
|
cnt = 0
|
|||
|
|
acnt= 0
|
|||
|
|
for l in lines:
|
|||
|
|
b = l.split("\t")
|
|||
|
|
args = b[1].split(",")
|
|||
|
|
for sn in range(steps):
|
|||
|
|
sdif = sn * 3
|
|||
|
|
for i in range(axel_cnt):
|
|||
|
|
# ad +1 - skip timemark
|
|||
|
|
i0 = int(args[sdif+i*3+1])
|
|||
|
|
i1 = int(args[sdif+i*3+2])
|
|||
|
|
i2 = int(args[sdif+i*3+3])
|
|||
|
|
ax[i][0].append([acnt, i0 if i0 < ax_mid_lim else i0 - ax_max_lim])
|
|||
|
|
ax[i][1].append([acnt, i1 if i1 < ax_mid_lim else i1 - ax_max_lim])
|
|||
|
|
ax[i][2].append([acnt, i2 if i2 < ax_mid_lim else i2 - ax_max_lim])
|
|||
|
|
acnt += 1
|
|||
|
|
pd_val = (5 - int(args[pd_delta]) - int(args[pd_delta+1]) - int(args[pd_delta+2]) - int(args[pd_delta+3]) - int(args[pd_delta+4]))
|
|||
|
|
pd.append([cnt, pd_val])
|
|||
|
|
cnt += 1
|
|||
|
|
for i in range(axel_cnt):
|
|||
|
|
ax[i][0] = [list(n) for n in zip(*ax[i][0])]
|
|||
|
|
ax[i][1] = [list(n) for n in zip(*ax[i][1])]
|
|||
|
|
ax[i][2] = [list(n) for n in zip(*ax[i][2])]
|
|||
|
|
#fig = plt.figure(figsize=(20,10))
|
|||
|
|
#print(ax[1][0])
|
|||
|
|
pd = [list(n) for n in zip(*pd)]
|
|||
|
|
fig, chrts = plt.subplots(axel_cnt+1, 3, figsize=(20,25))
|
|||
|
|
for i in range(axel_cnt):
|
|||
|
|
chrts[i, 0].set_title("кровать %s / акселерометр %i ось 1" % (id, i), size = 10)
|
|||
|
|
chrts[i, 1].set_title("кровать %s / акселерометр %i ось 2" % (id, i), size = 10)
|
|||
|
|
chrts[i, 2].set_title("кровать %s / акселерометр %i ось 3" % (id, i), size = 10)
|
|||
|
|
chrts[i, 0].plot(ax[i][0][0], ax[i][0][1],color = 'green', linewidth = 2)
|
|||
|
|
chrts[i, 1].plot(ax[i][1][0], ax[i][1][1],color = 'red', linewidth = 2)
|
|||
|
|
chrts[i, 2].plot(ax[i][2][0], ax[i][2][1],color = 'blue', linewidth = 2)
|
|||
|
|
chrts[axel_cnt, 1].set_title("кровать %s / датчик давления" % id, size = 10)
|
|||
|
|
chrts[axel_cnt, 1].plot(pd[0], pd[1],color = 'magenta', linewidth = 2)
|
|||
|
|
img_name = "%s_chart.png" % fname
|
|||
|
|
plt.savefig(img_name)
|
|||
|
|
fig.clear()
|
|||
|
|
plt.close( fig )
|
|||
|
|
return(img_name)
|
|||
|
|
|
|||
|
|
|
|||
|
|
@app.route('/')
|
|||
|
|
def root_dir():
|
|||
|
|
return('Hello!')
|
|||
|
|
|
|||
|
|
@app.route('/SmartBed')
|
|||
|
|
def sb_get_data():
|
|||
|
|
id = request.args.get('id')
|
|||
|
|
if not id:
|
|||
|
|
id = '0'
|
|||
|
|
dev = request.args.get('dev')
|
|||
|
|
if not dev:
|
|||
|
|
dev = '0'
|
|||
|
|
data = request.args.get('data')
|
|||
|
|
if not data:
|
|||
|
|
return('no data\n')
|
|||
|
|
else:
|
|||
|
|
fname = "%s.%s_%s" % (buf_file, dev, id)
|
|||
|
|
with open(fname, 'w') as f:
|
|||
|
|
f.write(data)
|
|||
|
|
log_file = log_file_tmpl % (script_dir, dev, id)
|
|||
|
|
ts = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]
|
|||
|
|
with open(log_file, 'a') as f:
|
|||
|
|
f.write("%s\t%s\n" % (ts, data))
|
|||
|
|
return 'OK!\n'
|
|||
|
|
|
|||
|
|
@app.route('/SBShow')
|
|||
|
|
def sb_show_data():
|
|||
|
|
llimit = request.args.get('limit')
|
|||
|
|
if not llimit:
|
|||
|
|
llimit = '10'
|
|||
|
|
id = request.args.get('id')
|
|||
|
|
if not id:
|
|||
|
|
id = '0'
|
|||
|
|
dev = request.args.get('dev')
|
|||
|
|
if not dev:
|
|||
|
|
dev = '0'
|
|||
|
|
fname = "%s.%s_%s" % (buf_file, dev, id)
|
|||
|
|
log_file = log_file_tmpl % (script_dir, dev, id)
|
|||
|
|
data = ''
|
|||
|
|
try:
|
|||
|
|
if llimit :
|
|||
|
|
new_log = "%s---" % log_file
|
|||
|
|
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')
|
|||
|
|
|
|||
|
|
@app.route('/SBAxStat')
|
|||
|
|
def sb_axels_stat():
|
|||
|
|
t = request.args.get('axel_cnt')
|
|||
|
|
if not t:
|
|||
|
|
axel_cnt = 39
|
|||
|
|
else:
|
|||
|
|
axel_cnt = int(t)
|
|||
|
|
t = request.args.get('steps')
|
|||
|
|
if not t:
|
|||
|
|
steps = 10
|
|||
|
|
else:
|
|||
|
|
steps = int(t)
|
|||
|
|
t = request.args.get('pdCnt')
|
|||
|
|
if not t:
|
|||
|
|
pdCnt = 20
|
|||
|
|
else:
|
|||
|
|
pdCnt = int(t)
|
|||
|
|
pd_delta = steps * axel_cnt * 3 + 1 # пропускаем первое значение - таймер
|
|||
|
|
|
|||
|
|
id = request.args.get('id')
|
|||
|
|
llimit = request.args.get('l')
|
|||
|
|
if not id:
|
|||
|
|
id = '0'
|
|||
|
|
if not llimit:
|
|||
|
|
llimit = '1'
|
|||
|
|
if not dev:
|
|||
|
|
dev = '0'
|
|||
|
|
log_file = log_file_tmpl % (script_dir, dev, id)
|
|||
|
|
lines=[]
|
|||
|
|
try:
|
|||
|
|
new_log = "%s----" % log_file
|
|||
|
|
system("tail -n%s %s > %s" % (llimit, log_file, new_log))
|
|||
|
|
log_file = new_log
|
|||
|
|
with open(log_file, 'r') as f:
|
|||
|
|
lines = [line.rstrip() for line in f]
|
|||
|
|
except Exception as e:
|
|||
|
|
data = "data log is empty\n"
|
|||
|
|
|
|||
|
|
|
|||
|
|
# read data
|
|||
|
|
#with open(log_file, 'r') as f:
|
|||
|
|
# lines = [line.rstrip() for line in f]
|
|||
|
|
ax = [[0 for i in range(3)] for n in range(axel_cnt)]
|
|||
|
|
# prepare data
|
|||
|
|
cnt = 0
|
|||
|
|
for l in lines:
|
|||
|
|
args = l.split("\t")[1].split(",")
|
|||
|
|
for sn in range(steps):
|
|||
|
|
dlt = sn * 3 * axel_cnt
|
|||
|
|
for i in range(axel_cnt):
|
|||
|
|
# если уберут первое значение (метку таймера), то прибавку надо начинать не с 1, а с 0
|
|||
|
|
ax[i][0]+= 1 if int("0"+args[dlt + i*3+1]) == 0 else 0
|
|||
|
|
ax[i][1]+= 1 if int("0"+args[dlt + i*3+2]) == 0 else 0
|
|||
|
|
ax[i][2]+= 1 if int("0"+args[dlt + i*3+3]) == 0 else 0
|
|||
|
|
cnt+=1
|
|||
|
|
|
|||
|
|
# делаем таблицу
|
|||
|
|
buf = "<table border=1>\n<tr>"
|
|||
|
|
for i in range(axel_cnt):
|
|||
|
|
buf+="<td><b>%i</b> " % (i+1)
|
|||
|
|
buf+="[%i, %i, %i]</td>" % (ax[i][0],ax[i][1],ax[i][2])
|
|||
|
|
if i>0 and ((i+1)%3)==0:
|
|||
|
|
buf+="</tr>\n"
|
|||
|
|
if i<(axel_cnt-1):
|
|||
|
|
buf+="<tr>"
|
|||
|
|
if (axel_cnt%3) > 0:
|
|||
|
|
buf+="</tr>\n"
|
|||
|
|
buf+="</table>\n"
|
|||
|
|
data="<html><head></head><body>количество нулевых значений (из %i измерений, %i строк)\n" % (cnt*10, cnt)
|
|||
|
|
data+=buf
|
|||
|
|
data+="</body></html>"
|
|||
|
|
|
|||
|
|
return Response(data, mimetype='text/html')
|
|||
|
|
|
|||
|
|
@app.route('/SBShow_html')
|
|||
|
|
def sb_show_html():
|
|||
|
|
with open(show_html_file, 'r') as f:
|
|||
|
|
data = f.read()
|
|||
|
|
return Response(data, mimetype='text/html')
|
|||
|
|
|
|||
|
|
@app.route('/SBA_1a_html')
|
|||
|
|
def sba_1accel_html():
|
|||
|
|
id = request.args.get('id')
|
|||
|
|
if not id:
|
|||
|
|
id = '0'
|
|||
|
|
with open(sha_1a_html_file, 'r') as f:
|
|||
|
|
data = f.read()
|
|||
|
|
return Response(data.replace("<%id%>", id), mimetype='text/html')
|
|||
|
|
|
|||
|
|
@app.route('/SBA_1a_chart')
|
|||
|
|
def sba_1accel_chart():
|
|||
|
|
lines = 10
|
|||
|
|
id = request.args.get('id')
|
|||
|
|
if not id:
|
|||
|
|
id = '0'
|
|||
|
|
img_file = make_1accel_graph(id, lines)
|
|||
|
|
data = ''
|
|||
|
|
with open(img_file, 'rb') as f:
|
|||
|
|
data = f.read()
|
|||
|
|
return Response(data, mimetype='image/png')
|
|||
|
|
|
|||
|
|
|
|||
|
|
@app.route('/SBShow_chart_r')
|
|||
|
|
def sb_show_img_refreshl():
|
|||
|
|
with open(show_chart_file, 'r') as f:
|
|||
|
|
data = f.read()
|
|||
|
|
return Response(data, mimetype='text/html')
|
|||
|
|
|
|||
|
|
@app.route('/SBShow_chart')
|
|||
|
|
def sb_show_chart():
|
|||
|
|
id = request.args.get('id')
|
|||
|
|
if not id:
|
|||
|
|
id = '0'
|
|||
|
|
if not dev:
|
|||
|
|
dev = '0'
|
|||
|
|
log_file = log_file_tmpl % (script_dir, dev, id)
|
|||
|
|
tmp_file = "%s/tmp/sb_%s_%s" % (script_dir, dev, id)
|
|||
|
|
cmd = "tail -n%i %s > %s" % (chart_size, log_file, tmp_file)
|
|||
|
|
system(cmd)
|
|||
|
|
img_file = make_plot(tmp_file, dev, id)
|
|||
|
|
data = ''
|
|||
|
|
with open(img_file, 'rb') as f:
|
|||
|
|
data = f.read()
|
|||
|
|
return Response(data, mimetype='image/png')
|
|||
|
|
|
|||
|
|
@app.route('/SBShow_4axchart')
|
|||
|
|
def sb_show_4axels_chart():
|
|||
|
|
t = request.args.get('axel_cnt')
|
|||
|
|
if not t:
|
|||
|
|
axel_cnt = 39
|
|||
|
|
else:
|
|||
|
|
axel_cnt = int(t)
|
|||
|
|
t = request.args.get('steps')
|
|||
|
|
if not t:
|
|||
|
|
steps = 10
|
|||
|
|
else:
|
|||
|
|
steps = int(t)
|
|||
|
|
t = request.args.get('pdCnt')
|
|||
|
|
if not t:
|
|||
|
|
pdCnt = 20
|
|||
|
|
else:
|
|||
|
|
pdCnt = int(t)
|
|||
|
|
|
|||
|
|
id = request.args.get('id')
|
|||
|
|
if not id:
|
|||
|
|
id = '0'
|
|||
|
|
dev = request.args.get('dev')
|
|||
|
|
if not dev:
|
|||
|
|
dev = '0'
|
|||
|
|
axl = request.args.get('ax')
|
|||
|
|
if not axl:
|
|||
|
|
axl = '1'
|
|||
|
|
ln = request.args.get('l')
|
|||
|
|
if not ln:
|
|||
|
|
ln = '1'
|
|||
|
|
|
|||
|
|
|
|||
|
|
img_file = make_4axels_plot(dev, id, axl, ln, axel_cnt, steps, pdCnt)
|
|||
|
|
data = ''
|
|||
|
|
with open(img_file, 'rb') as f:
|
|||
|
|
data = f.read()
|
|||
|
|
return Response(data, mimetype='image/png')
|
|||
|
|
|
|||
|
|
|
|||
|
|
btnsNames = {
|
|||
|
|
'1': 'Гигиена',
|
|||
|
|
'2': 'Массаж',
|
|||
|
|
'3': 'Кормление',
|
|||
|
|
'4': 'Лекарства',
|
|||
|
|
'5': 'Переворот',
|
|||
|
|
'6': 'Прогулка'
|
|||
|
|
}
|
|||
|
|
iv_snapshots_tmpl="./iv_snapshots/%s.jpg"
|
|||
|
|
vid_data_file_tmpl = "./ivideon/data/vid/%s.%i"
|
|||
|
|
vid_counter_video = "./ivideon/data/counter.mp4"
|
|||
|
|
vid_duration = 10
|
|||
|
|
iv_cam_id = "100-0KW14UQLJmUe0KvQesKQku:0"
|
|||
|
|
def get_atok(pid):
|
|||
|
|
tok_file="./ivideon/data/%s.tok" % pid
|
|||
|
|
with open(tok_file, 'r') as f:
|
|||
|
|
data = f.read()
|
|||
|
|
jdat = json.loads(data)
|
|||
|
|
return(jdat['access_token'])
|
|||
|
|
|
|||
|
|
|
|||
|
|
def send_ivid_foto(ids, pult_id, id):
|
|||
|
|
uids = ids.split(",")
|
|||
|
|
gif_ids={}
|
|||
|
|
for uid in uids:
|
|||
|
|
repl=bot.send_video(chat_id=uid, video=open(vid_counter_video, 'rb'), supports_streaming=True)
|
|||
|
|
gif_ids[uid] = repl.message_id
|
|||
|
|
access_token = get_atok(pult_id)
|
|||
|
|
foto_cmd = "./iv_get_jpg.sh openapi-alpha-eu01.ivideon.com \"%s\" \"%s\" %s" % (iv_cam_id, access_token, pult_id)
|
|||
|
|
with open('foto_cmd.txt', 'w') as f:
|
|||
|
|
f.write(foto_cmd)
|
|||
|
|
system(foto_cmd)
|
|||
|
|
sleep(2)
|
|||
|
|
system(foto_cmd)
|
|||
|
|
imgfile = iv_snapshots_tmpl % id
|
|||
|
|
for uid in uids:
|
|||
|
|
bot.delete_message(chat_id=uid,message_id=gif_ids[uid])
|
|||
|
|
if(path.getsize(imgfile) < 300):
|
|||
|
|
with open(imgfile, 'r') as f:
|
|||
|
|
data = f.read()
|
|||
|
|
jdat = json.loads(data)
|
|||
|
|
msg = "%s / %s" % (jdat['code'], jdat['message'])
|
|||
|
|
for uid in uids:
|
|||
|
|
bot.send_message(uid, msg)
|
|||
|
|
else:
|
|||
|
|
#print("IVIDEON IMAGE FILE: %s" % imgfile)
|
|||
|
|
ts = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
|
|||
|
|
vid_start_cmd = "curl -X POST \"https://openapi-alpha-eu01.ivideon.com/cameras/%s?op=REC\" -d \"{\\\"duration\\\":%i}\" -H \"Authorization: Bearer %s\"" % (iv_cam_id, vid_duration, access_token)
|
|||
|
|
system(vid_start_cmd)
|
|||
|
|
vid_time_id = int(time())
|
|||
|
|
msg = "%s\n" %ts
|
|||
|
|
for uid in uids:
|
|||
|
|
repl=bot.send_photo(uid, open(imgfile, 'rb'), ts)
|
|||
|
|
msg+="%s/%s " % (uid, repl.message_id)
|
|||
|
|
msg=msg.rstrip()+"\n"
|
|||
|
|
vid_load_cmd = "./ivideon/puskach \"./ivideon/video_load.sh %s %i %i %s >/dev/null 2>&1\"" % (id, vid_duration, vid_time_id, iv_cam_id)
|
|||
|
|
msg+=vid_start_cmd+"\n"+vid_load_cmd+"\n"
|
|||
|
|
vid_data_file = vid_data_file_tmpl % (id, vid_time_id)
|
|||
|
|
with open(vid_data_file, 'w') as f:
|
|||
|
|
f.write(msg)
|
|||
|
|
system("mv %s ./tmp/iv.jpg" % imgfile)
|
|||
|
|
system(vid_load_cmd)
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
|
|||
|
|
doorOpsNames = {
|
|||
|
|
'1': 'открыта',
|
|||
|
|
'2': 'закрыта'
|
|||
|
|
}
|
|||
|
|
doorStateToOp = {
|
|||
|
|
'open': '1',
|
|||
|
|
'close': '2'
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@app.route('/shelly_door', methods = ['POST', 'GET'])
|
|||
|
|
def sb_shelly_door():
|
|||
|
|
id = request.args.get('id')
|
|||
|
|
if not id:
|
|||
|
|
id = '1'
|
|||
|
|
ts = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]
|
|||
|
|
with open("./log//shelly_door.log", "a") as f:
|
|||
|
|
f.write("%s: %s: " % (ts, request.method))
|
|||
|
|
if request.method == "GET":
|
|||
|
|
if(request.query_string):
|
|||
|
|
f.write("id=%s, " % id)
|
|||
|
|
f.write(str(request.query_string))
|
|||
|
|
else:
|
|||
|
|
f.write("no request.query_string")
|
|||
|
|
f.write("\n")
|
|||
|
|
# жёсткие установки для отладки
|
|||
|
|
ids = '420641258,245058979'
|
|||
|
|
id = 1
|
|||
|
|
#------------------------------
|
|||
|
|
doorid = request.args.get('door')
|
|||
|
|
if not doorid:
|
|||
|
|
doorid = '1'
|
|||
|
|
state = request.args.get('state')
|
|||
|
|
if state:
|
|||
|
|
if not (state in doorStateToOp):
|
|||
|
|
state = 'close'
|
|||
|
|
op = doorStateToOp[state]
|
|||
|
|
#op = request.args.get('op')
|
|||
|
|
#if not op:
|
|||
|
|
# op = '2'
|
|||
|
|
if not (op in doorOpsNames):
|
|||
|
|
op = '2'
|
|||
|
|
pult_id = id
|
|||
|
|
temp = request.args.get('temp')
|
|||
|
|
lux = request.args.get('lux')
|
|||
|
|
msg = "модуль %s. дверь %s. %s. Свет %s lux, темп. %s C" % (id, doorid, doorOpsNames[op], lux, temp)
|
|||
|
|
uids = ids.split(",")
|
|||
|
|
for uid in uids:
|
|||
|
|
bot.send_message(uid, msg)
|
|||
|
|
send_ivid_foto(ids, pult_id, id)
|
|||
|
|
return 'shelly door %s\n' % state
|
|||
|
|
return 'empty hook data\n'
|
|||
|
|
|
|||
|
|
|
|||
|
|
dbotcmd="src-c/wraponce -l \"python3 door2tlg.py --did %s --ds %s --dv %s --tgids %s --tgtok %s --t %s --h %s\""
|
|||
|
|
@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')
|
|||
|
|
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 not temp:
|
|||
|
|
temp = "-1"
|
|||
|
|
if not hum:
|
|||
|
|
hum = "-1"
|
|||
|
|
|
|||
|
|
ids = '420641258,245058979'
|
|||
|
|
#ids = '245058979'
|
|||
|
|
cmd = dbotcmd % (doorid, doorstat, vbat, ids, tbToken, temp, hum) #homeToken)
|
|||
|
|
system(cmd)
|
|||
|
|
|
|||
|
|
#ts = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
|
|||
|
|
#if(int(doorstat)==0):
|
|||
|
|
# msg = "Дверь %s. Закрытие. %s\n" % (doorid, ts)
|
|||
|
|
#else:
|
|||
|
|
# msg = "Дверь %s. Открытие. %s" % (doorid, ts)
|
|||
|
|
|
|||
|
|
#uid = "245058979"
|
|||
|
|
#homebot.send_message(uid, msg)
|
|||
|
|
return 'Сообщение отправлено\n'
|
|||
|
|
|
|||
|
|
|
|||
|
|
ids_list_tmpl = "./tlg_id_lists/%s.idl"
|
|||
|
|
@app.route('/btn2tlg')
|
|||
|
|
def sb_btn2tlg():
|
|||
|
|
btn = request.args.get('btn')
|
|||
|
|
id = request.args.get('id')
|
|||
|
|
if not id:
|
|||
|
|
id = '1'
|
|||
|
|
if not btn:
|
|||
|
|
return 'ERROR! No button number\n'
|
|||
|
|
#ids = request.args.get('idlist')
|
|||
|
|
#===========================================
|
|||
|
|
ids = '420641258,245058979'
|
|||
|
|
#ids = ''
|
|||
|
|
ids_file = ids_list_tmpl % id
|
|||
|
|
if path.exists(ids_file):
|
|||
|
|
with open(ids_file, 'r') as f:
|
|||
|
|
ids = f.read()
|
|||
|
|
ids.rstrip()
|
|||
|
|
#===========================================
|
|||
|
|
if not ids:
|
|||
|
|
return 'ERROR! No IDs list\n'
|
|||
|
|
cnt = 0
|
|||
|
|
ts = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
|
|||
|
|
if not (btn in btnsNames):
|
|||
|
|
btn = '0'
|
|||
|
|
if(int(btn)==0):
|
|||
|
|
msg = "Пульт %s. Включение\n" % id
|
|||
|
|
else:
|
|||
|
|
msg = "Пульт %s. Нажата кнопка №%s \"%s\"\n%s\n" % (id, btn,btnsNames[btn], ts)
|
|||
|
|
pult_id = id
|
|||
|
|
|
|||
|
|
uids = ids.split(",")
|
|||
|
|
for uid in uids:
|
|||
|
|
bot.send_message(uid, msg)
|
|||
|
|
cnt += 1
|
|||
|
|
if id == '1' and btn == '4':
|
|||
|
|
ids = '420641258,245058979'
|
|||
|
|
#ids = '245058979'
|
|||
|
|
send_ivid_foto(ids, pult_id, id)
|
|||
|
|
return 'Отправлено сообщений: %i\n' % cnt
|
|||
|
|
|
|||
|
|
@app.route('/btns')
|
|||
|
|
def sb_btns():
|
|||
|
|
id = request.args.get('id')
|
|||
|
|
if not id:
|
|||
|
|
id = '0'
|
|||
|
|
dev = request.args.get('dev')
|
|||
|
|
if not dev:
|
|||
|
|
dev = '0'
|
|||
|
|
cnt=0
|
|||
|
|
rf = []
|
|||
|
|
args_shape = []
|
|||
|
|
btn_status = ["OFF", "PRESS"]
|
|||
|
|
#if(True):
|
|||
|
|
log_file = log_file_tmpl % (script_dir, dev, id)
|
|||
|
|
buf=""
|
|||
|
|
try:
|
|||
|
|
with open(log_file, 'r') as f:
|
|||
|
|
lines = [line.rstrip() for line in f]
|
|||
|
|
except Exception as e:
|
|||
|
|
buf="can't open log file"
|
|||
|
|
lines=[]
|
|||
|
|
for l in lines:
|
|||
|
|
if len(l) <=1 :
|
|||
|
|
break
|
|||
|
|
times = l.split("\t")[0]
|
|||
|
|
args = l.split("\t")[1].split(",")
|
|||
|
|
if cnt==0:
|
|||
|
|
args_shape = np.shape(args)
|
|||
|
|
rf = np.zeros(args_shape, dtype=np.uint8)
|
|||
|
|
|
|||
|
|
chck=False
|
|||
|
|
n=0
|
|||
|
|
for a in args:
|
|||
|
|
if n :
|
|||
|
|
i = int(args[n])
|
|||
|
|
if rf[n] != i:
|
|||
|
|
chck = True
|
|||
|
|
rf[n] = i
|
|||
|
|
n+=1
|
|||
|
|
if chck or cnt==0 :
|
|||
|
|
ans = "%s:\t" % times
|
|||
|
|
for i in range(n-1):
|
|||
|
|
ans += " %s," % btn_status[rf[i+1]]
|
|||
|
|
#print(ans)
|
|||
|
|
#print(rf)
|
|||
|
|
buf += "%s\n" % ans
|
|||
|
|
cnt+=1
|
|||
|
|
return Response(buf, mimetype='text/plain')
|
|||
|
|
|
|||
|
|
# FOR GET FILES FROM TELEGA BOT
|
|||
|
|
foto_tbToken = '1917924056:AAFPW0bfl3ZihH9l0luaU0nt6WrRsVMLVT8'
|
|||
|
|
from pyzbar.pyzbar import decode
|
|||
|
|
from PIL import Image
|
|||
|
|
#import requests
|
|||
|
|
@app.route('/QRScan')
|
|||
|
|
def scan_qr_code():
|
|||
|
|
file_id = request.args.get('file_id')
|
|||
|
|
bot_token = request.args.get('token')
|
|||
|
|
if not file_id:
|
|||
|
|
answ = "no file id"
|
|||
|
|
else:
|
|||
|
|
if not bot_token:
|
|||
|
|
fotobot = telebot.TeleBot(foto_tbToken)
|
|||
|
|
else:
|
|||
|
|
fotobot = telebot.TeleBot(bot_token)
|
|||
|
|
answ = "file id is: %s" % file_id
|
|||
|
|
print(file_id)
|
|||
|
|
file_path = fotobot.get_file(file_id).file_path
|
|||
|
|
print(file_path)
|
|||
|
|
file = fotobot.download_file(file_path)
|
|||
|
|
af = file_path.split('.')
|
|||
|
|
print(af)
|
|||
|
|
file_ext = af[1]
|
|||
|
|
file_name = "tmp/foto_%s.%s" %(file_id, file_ext)
|
|||
|
|
with open(file_name, "wb") as code:
|
|||
|
|
code.write(file)
|
|||
|
|
answ = decode(Image.open(file_name))[0].data.decode("utf-8")
|
|||
|
|
print(answ)
|
|||
|
|
remove(file_name)
|
|||
|
|
return Response(answ, mimetype='text/plain')
|
|||
|
|
|
|||
|
|
# IVIDEON redirection url
|
|||
|
|
@app.route('/ivr')
|
|||
|
|
def ivr():
|
|||
|
|
answ = 'OK\n'
|
|||
|
|
rez = 1
|
|||
|
|
#if not ac:
|
|||
|
|
# answ = 'ERR autorization_code\n'
|
|||
|
|
# ac = 'no autorization_code'
|
|||
|
|
# #rez = 0
|
|||
|
|
code = request.args.get('code')
|
|||
|
|
if not code:
|
|||
|
|
answ = 'ERR code\n'
|
|||
|
|
rez = 0
|
|||
|
|
if rez == 1:
|
|||
|
|
fname = "ivideon_code_new"
|
|||
|
|
answ = "%scode\t%s\n" % (answ, code)
|
|||
|
|
with open(fname, 'w') as f:
|
|||
|
|
f.write("code\t%s\n" % code)
|
|||
|
|
#=============================================================
|
|||
|
|
#======= request =============================================
|
|||
|
|
payload = {
|
|||
|
|
'client_id' : 'knopka',
|
|||
|
|
'client_secret' : '29dc2e257b76be074d772e07f9a8f444',
|
|||
|
|
'grant_type' : 'authorization_code',
|
|||
|
|
'code' : code,
|
|||
|
|
'redirect_uri' : 'https://pilot.papageno.ru/ivr'
|
|||
|
|
}
|
|||
|
|
url = 'https://api.ivideon.com/auth/oauth/token'
|
|||
|
|
response = requests.post(url, data=payload, verify=False)
|
|||
|
|
with open(fname, 'a') as f:
|
|||
|
|
f.write("\n============================================\n")
|
|||
|
|
f.write("text\t%s\n" % response.text)
|
|||
|
|
f.write("\n============================================\n")
|
|||
|
|
#=============================================================
|
|||
|
|
with open(fname, 'r') as f:
|
|||
|
|
data = f.read()
|
|||
|
|
answ = "%s%s\n" % (answ, data)
|
|||
|
|
return Response(answ, mimetype='text/plain')
|
|||
|
|
|
|||
|
|
|
|||
|
|
def ivr_OLD():
|
|||
|
|
#ac = request.args.get('autorization_code')
|
|||
|
|
answ = 'OK\n'
|
|||
|
|
rez = 1
|
|||
|
|
#if not ac:
|
|||
|
|
# answ = 'ERR autorization_code\n'
|
|||
|
|
# ac = 'no autorization_code'
|
|||
|
|
# #rez = 0
|
|||
|
|
code = request.args.get('code')
|
|||
|
|
if not code:
|
|||
|
|
answ = 'ERR code\n'
|
|||
|
|
rez = 0
|
|||
|
|
if rez == 1:
|
|||
|
|
fname = "ivideon_code"
|
|||
|
|
answ = "%scode\t%s\n" % (answ, code)
|
|||
|
|
with open(fname, 'w') as f:
|
|||
|
|
f.write("code\t%s\n" % code)
|
|||
|
|
curl = "curl -X POST -d 'client_id=knopka&client_secret=29dc2e257b76be074d772e07f9a8f444&grant_type=authorization_code&code=%s&redirect_uri=https://pilot.papageno.ru/ivr' 'https://api.ivideon.com/auth/oauth/token'" % code
|
|||
|
|
answ = "%s%s\n" % (answ, curl)
|
|||
|
|
system("%s >> %s" % (curl, fname))
|
|||
|
|
|
|||
|
|
with open(fname, 'a') as f:
|
|||
|
|
f.write("\n===================== HEADERS ===============\n")
|
|||
|
|
if(request.headers):
|
|||
|
|
for hname in request.headers.keys():
|
|||
|
|
f.write("%s: %s\n" % (hname, request.headers[hname]))
|
|||
|
|
f.write("\n============================================\n")
|
|||
|
|
|
|||
|
|
|
|||
|
|
with open(fname, 'r') as f:
|
|||
|
|
data = f.read()
|
|||
|
|
answ = "%s%s\n" % (answ, data)
|
|||
|
|
return Response(answ, mimetype='text/plain')
|
|||
|
|
|
|||
|
|
# GET ENV and POST data
|
|||
|
|
@app.route('/sbadat', methods = ['POST']) # Smart Bed Acel DATa
|
|||
|
|
def sbadat():
|
|||
|
|
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("sbadat: data check")
|
|||
|
|
try:
|
|||
|
|
str_rdat = "%s" % rdat
|
|||
|
|
i = str_rdat.find("Start step")
|
|||
|
|
if(i < 0):
|
|||
|
|
tg_alert("SBADAT point %s DATA CORRUPT\n%s: %s\n%s" % (ap_id, ts, request.headers["Title"], str_rdat))
|
|||
|
|
return "SBA DATA CORRUPT"
|
|||
|
|
dat_tmp=str_rdat.split("\\n")
|
|||
|
|
vbat = dat_tmp[np.size(dat_tmp)-2].split(" ")[-1].replace("\\r",'')
|
|||
|
|
if(float(vbat) < vbat_low):
|
|||
|
|
tg_alert("SBADAT point %s VBAT LOW %s" % (ap_id, vbat))
|
|||
|
|
#==================================================================
|
|||
|
|
except Exception as e:
|
|||
|
|
print("SBADAT: data check error")
|
|||
|
|
print(e)
|
|||
|
|
with open("./log/sbadat.%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('/thermodat', methods = ['POST', 'GET']) # Smart Bed Acel DATa
|
|||
|
|
def thermodat():
|
|||
|
|
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("thermodat: data check")
|
|||
|
|
with open("./log/thermodat.%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("thermodat work error")
|
|||
|
|
return 'OK!\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],p[0], p[1],tm)
|
|||
|
|
if len(p) >=5 :
|
|||
|
|
cmd="mosquitto_pub -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}'" % (ma,p[2],p[0], p[1],int(p[3])/1000)
|
|||
|
|
else :
|
|||
|
|
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}'" % (ma,p[2],p[0], p[1],tm)
|
|||
|
|
print(cmd)
|
|||
|
|
system(cmd)
|
|||
|
|
else:
|
|||
|
|
print("test data?")
|
|||
|
|
return answ
|
|||
|
|
|
|||
|
|
@app.route('/hmShow')
|
|||
|
|
def nm_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.20'
|
|||
|
|
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('/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('/logtail')
|
|||
|
|
def logtail():
|
|||
|
|
try:
|
|||
|
|
logname = request.args.get('log')
|
|||
|
|
log = "%s/log/%s" % (home_dir, logname)
|
|||
|
|
print(log)
|
|||
|
|
lcnt=10
|
|||
|
|
databuf = Popen(["tail", "-n%i" % lcnt, log], stdout=PIPE, encoding='utf-8').communicate()[0]
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
databuf = "log file is empty or not exist\n"
|
|||
|
|
return Response(databuf, mimetype='text/plain')
|
|||
|
|
|
|||
|
|
|
|||
|
|
@app.route('/getMenu', methods = ['POST'])
|
|||
|
|
def getMenu():
|
|||
|
|
answ = 'OK'
|
|||
|
|
mtype = request.form['menuType']
|
|||
|
|
mtitle = request.form['menuTitle']
|
|||
|
|
mtext = request.form['menuText']
|
|||
|
|
if not mtype:
|
|||
|
|
mtype = 'not mtype'
|
|||
|
|
answ = 'ERR mtype'
|
|||
|
|
if not mtitle:
|
|||
|
|
mtitle = 'not mtitle'
|
|||
|
|
answ = 'ERR mtitle'
|
|||
|
|
if not mtext:
|
|||
|
|
mtext = 'not mtext'
|
|||
|
|
answ = 'ERR mtext'
|
|||
|
|
with open("./tmp/Dima_Menu", 'w') as f:
|
|||
|
|
f.write(mtype)
|
|||
|
|
f.write("\n============================================\n")
|
|||
|
|
f.write(mtitle)
|
|||
|
|
f.write("\n============================================\n")
|
|||
|
|
f.write(mtext)
|
|||
|
|
f.write("\n============ vv request.data vv ============\n")
|
|||
|
|
if(request.data):
|
|||
|
|
f.write(str(request.data))
|
|||
|
|
f.write("\n============================================\n")
|
|||
|
|
return answ
|
|||
|
|
|
|||
|
|
# GET ENV and POST data
|
|||
|
|
@app.route('/envdata', methods = ['POST', 'GET'])
|
|||
|
|
def envdata():
|
|||
|
|
with open("./tmp/env-and-post.data", 'w') as f:
|
|||
|
|
if(request.content_type):
|
|||
|
|
f.write(str(request.content_type))
|
|||
|
|
f.write("\n============================================\n")
|
|||
|
|
if(request.headers):
|
|||
|
|
for hname in request.headers.keys():
|
|||
|
|
f.write("%s: %s\n" % (hname, request.headers[hname]))
|
|||
|
|
f.write("\n============================================\n")
|
|||
|
|
if(request.data):
|
|||
|
|
f.write(str(request.data))
|
|||
|
|
f.write("\n============================================\n")
|
|||
|
|
if(request.query_string):
|
|||
|
|
#f.write("%s" % str(request.query_string))
|
|||
|
|
f.write(request.query_string)
|
|||
|
|
return 'OK!\n'
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == '__main__':
|
|||
|
|
app.run()
|