5 changed files with 347 additions and 0 deletions
Binary file not shown.
@ -0,0 +1,48 @@ |
|||||
|
from django.contrib import admin |
||||
|
from .models import * |
||||
|
from .views import * |
||||
|
|
||||
|
class EnvdataAdmin(admin.ModelAdmin): |
||||
|
admin.site.site_header = "ENV后台管理" |
||||
|
list_display = ('spot', 'errcode', 'rectime') |
||||
|
list_filter = ('spot', 'errcode') |
||||
|
fields = ('spot', 'errcode', 'electricity', 'fire', 'water', 'temperature', 'humidity', 'rectime') |
||||
|
readonly_fields = ('spot', 'errcode', 'electricity', 'fire', 'water', 'temperature', 'humidity', 'rectime') |
||||
|
list_per_page = 30 |
||||
|
|
||||
|
class AlarmAdmin(admin.ModelAdmin): |
||||
|
list_display = ('spot', 'almname', 'almtime') |
||||
|
list_filter = ('spot', 'almname') |
||||
|
fields = ('spot', 'errcode', 'almname', 'almvalue', 'almtime') |
||||
|
readonly_fields = ('spot', 'errcode', 'almname', 'almvalue', 'almtime') |
||||
|
list_per_page = 30 |
||||
|
|
||||
|
class SpotAdmin(admin.ModelAdmin): |
||||
|
list_display = ('name', 'ip') |
||||
|
|
||||
|
class AlarmsetAdmin(admin.ModelAdmin): |
||||
|
list_display = ('spot',) |
||||
|
|
||||
|
class SmsAdmin(admin.ModelAdmin): |
||||
|
list_display = ('name',) |
||||
|
|
||||
|
class SendlogAdmin(admin.ModelAdmin): |
||||
|
list_display = ('sendtype', 'sendresult', 'sendtime') |
||||
|
readonly_fields = ('sendtype', 'sendresult', 'sendtime', 'sendto') |
||||
|
|
||||
|
class ChartAdmin(admin.ModelAdmin): |
||||
|
def changelist_view(self, request, extra_content=None): |
||||
|
return chart_index(request) |
||||
|
|
||||
|
class SysAdmin(admin.ModelAdmin): |
||||
|
def changelist_view(self, request, extra_content=None): |
||||
|
return sys_cmd(request) |
||||
|
|
||||
|
admin.site.register(Spot, SpotAdmin) |
||||
|
admin.site.register(Envdata, EnvdataAdmin) |
||||
|
admin.site.register(Alarm, AlarmAdmin) |
||||
|
admin.site.register(Alarmset, AlarmsetAdmin) |
||||
|
admin.site.register(Sms, SmsAdmin) |
||||
|
admin.site.register(Sendlog, SendlogAdmin) |
||||
|
admin.site.register(Envchart, ChartAdmin) |
||||
|
admin.site.register(Sysmanager, SysAdmin) |
@ -0,0 +1,6 @@ |
|||||
|
from django.apps import AppConfig |
||||
|
|
||||
|
|
||||
|
class EnvConfig(AppConfig): |
||||
|
default_auto_field = 'django.db.models.BigAutoField' |
||||
|
name = 'env' |
@ -0,0 +1,265 @@ |
|||||
|
from .models import Spot, Envdata, Alarm, Alarmset, Sms, Sendlog, Device |
||||
|
from django.db.models.aggregates import Count |
||||
|
from datetime import datetime, timedelta |
||||
|
from hashlib import sha1 |
||||
|
from .sms import sendSMS |
||||
|
from .mail import sendmail |
||||
|
|
||||
|
SECRET_KEY = '@This is a Secret $tr!' |
||||
|
SEND_TIMES = {} |
||||
|
FIRST_ALM_TIME = {} |
||||
|
COMMAND_QUEUE = [] |
||||
|
|
||||
|
def deal_post(postdata): |
||||
|
spot = None |
||||
|
try: |
||||
|
sn = postdata['sn'] |
||||
|
spot = Spot.objects.get(sn=sn) |
||||
|
errcode = int(postdata['errcode']) |
||||
|
if postdata['electricity'] == 'True': |
||||
|
electricity = 1 |
||||
|
else: |
||||
|
electricity = 0 |
||||
|
fire = int(postdata['fire']) |
||||
|
if postdata['water'] == 'True': |
||||
|
water = 1 |
||||
|
else: |
||||
|
water = 0 |
||||
|
temperature = float(postdata['temperature']) |
||||
|
humidity = float(postdata['humidity']) |
||||
|
save_data(spot,errcode,electricity,fire,water,temperature,humidity) |
||||
|
except: |
||||
|
# record data fail |
||||
|
return None |
||||
|
if errcode > 0: |
||||
|
errvalue = 0 |
||||
|
errname = '' |
||||
|
if errcode == 2: |
||||
|
errvalue = int(temperature) |
||||
|
errname = '高温' |
||||
|
elif errcode == 3: |
||||
|
errvalue = int(humidity) |
||||
|
errname = '高湿' |
||||
|
elif errcode == 4: |
||||
|
errvalue = 0 |
||||
|
errname = '断电' |
||||
|
elif errcode == 5: |
||||
|
errvalue = 1 |
||||
|
errname = '漏水' |
||||
|
elif errcode == 6: |
||||
|
errvalue = fire |
||||
|
errname = '火情' |
||||
|
elif errcode == 7: |
||||
|
errvalue = 0 # network failure 1-online 0-offline |
||||
|
errname = '离线' |
||||
|
save_alarm(spot, errcode, errname, errvalue) |
||||
|
envdata = {'electricity':electricity, 'fire':fire, 'water':water, 'temperature':temperature, 'humidity':humidity} |
||||
|
send_alm_message(spot, errcode, errname, errvalue, **envdata) |
||||
|
|
||||
|
def check_spot(sn): |
||||
|
# Check if the spot has recent(within 2 sec) record and return spot id |
||||
|
r = True |
||||
|
spt = Spot.objects.get(sn=sn) |
||||
|
if spt: |
||||
|
env = Envdata.objects.filter(spot=spt).order_by('-rectime') |
||||
|
if env.exists(): |
||||
|
if datetime.now() - env[0].rectime < timedelta(seconds=3): |
||||
|
r = False |
||||
|
return r |
||||
|
|
||||
|
def check_token(tkstr): |
||||
|
global SECRET_KEY |
||||
|
r = False |
||||
|
dt = datetime.now() |
||||
|
stamp = str(dt.year) + '##' + str(dt.hour%10) |
||||
|
m = sha1() |
||||
|
m.update((SECRET_KEY + stamp).encode('utf-8')) |
||||
|
token = m.hexdigest() |
||||
|
# print(token) |
||||
|
# print(tkstr) |
||||
|
# print(token == tkstr) |
||||
|
if token == tkstr: |
||||
|
r = True |
||||
|
return r |
||||
|
|
||||
|
def save_data(spot, errcode, electricity, fire, water, temperature, humidity): |
||||
|
if spot: |
||||
|
Envdata.objects.create(spot=spot,errcode=errcode,electricity=electricity,fire=fire,water=water,temperature=temperature,humidity=humidity,rectime=datetime.now()) |
||||
|
return True |
||||
|
|
||||
|
def save_alarm(spot, errcode, errname, errvalue): |
||||
|
if spot: |
||||
|
Alarm.objects.create(spot=spot, errcode=errcode, almname=errname, almvalue=errvalue, almtime=datetime.now()) |
||||
|
return True |
||||
|
|
||||
|
def send_alm_message(spot, errcode, errname, errvalue, **envdata): |
||||
|
global SEND_TIMES, FIRST_ALM_TIME |
||||
|
if not spot: |
||||
|
return False |
||||
|
if not SEND_TIMES.get(spot.sn): |
||||
|
SEND_TIMES[spot.sn] = 0 |
||||
|
if not FIRST_ALM_TIME.get(spot.sn): |
||||
|
FIRST_ALM_TIME[spot.sn] = datetime.now() |
||||
|
triglist = [] # to compare the errcode |
||||
|
almset = Alarmset.objects.get(spot=spot) |
||||
|
if almset: |
||||
|
if almset.connection: |
||||
|
triglist.append(7) |
||||
|
if almset.fire: |
||||
|
triglist.append(6) |
||||
|
if almset.water: |
||||
|
triglist.append(5) |
||||
|
if almset.electricity: |
||||
|
triglist.append(4) |
||||
|
if almset.temperature: |
||||
|
triglist.append(2) |
||||
|
if almset.humidity: |
||||
|
triglist.append(3) |
||||
|
if errcode in triglist and SEND_TIMES[spot.sn] < 3: |
||||
|
if SEND_TIMES[spot.sn] == 0: |
||||
|
FIRST_ALM_TIME[spot.sn] = datetime.now() |
||||
|
elif SEND_TIMES[spot.sn] > 0 and datetime.now() - FIRST_ALM_TIME[spot.sn] < timedelta(seconds=10): |
||||
|
return None |
||||
|
# get alert person's maillist & phonelist |
||||
|
smslist = Sms.objects.all().values_list('phone', flat=True) |
||||
|
maillist = Sms.objects.all().values_list('email', flat=True) |
||||
|
smstext = '%s机房%s报警,请及时处理。报警代码:%s,报警参数:%s。' % (spot.name, errname, str(errcode), str(errvalue)) |
||||
|
mailtext = smstext |
||||
|
if envdata: |
||||
|
mailtext = mailtext + '\n详细监测参数:漏水-%s 供电-%s 火情-%s 温度-%s 湿度-%s' % (envdata['water'], envdata['electricity'], envdata['fire'], envdata['temperature'], envdata['humidity']) |
||||
|
try: |
||||
|
if sendSMS(smstext.encode('gb2312'), ','.join(list(smslist))): |
||||
|
Sendlog.objects.create(sendtype='sms', sendresult=True, sendtime=datetime.now(), sendto=','.join(list(smslist))) |
||||
|
else: |
||||
|
Sendlog.objects.create(sendtype='sms', sendresult=False, sendtime=datetime.now(), sendto=','.join(list(smslist))) |
||||
|
if sendmail(list(maillist), '机房环境监测报警', mailtext): |
||||
|
Sendlog.objects.create(sendtype='mail', sendresult=True, sendtime=datetime.now(), sendto=','.join(list(maillist))) |
||||
|
else: |
||||
|
Sendlog.objects.create(sendtype='mail', sendresult=False, sendtime=datetime.now(), sendto=','.join(list(maillist))) |
||||
|
SEND_TIMES[spot.sn] += 1 |
||||
|
except: |
||||
|
Sendlog.objects.create(sendtype='sms', sendresult=False, sendtime=datetime.now(), sendto=','.join(list(smslist))) |
||||
|
Sendlog.objects.create(sendtype='mail', sendresult=False, sendtime=datetime.now(), sendto=','.join(list(maillist))) |
||||
|
if datetime.now() - FIRST_ALM_TIME[spot.sn] > timedelta(hours=1) and SEND_TIMES[spot.sn] >= 3: |
||||
|
SEND_TIMES[spot.sn] = 0 |
||||
|
return True |
||||
|
|
||||
|
def get_spots(): |
||||
|
spots = Spot.objects.all() |
||||
|
return spots |
||||
|
|
||||
|
def alarm_statics(spot, starttime, endtime): |
||||
|
res = Alarm.objects.filter(spot__name=spot,almtime__range=[starttime,endtime]).values('almname').annotate(in_times=Count('almname')) |
||||
|
return res |
||||
|
|
||||
|
def env_statics(spot, tp, starttime, endtime): |
||||
|
if not tp: |
||||
|
return [] |
||||
|
tpdict = {'温度数据':'temperature', '湿度数据':'humidity', '火情数据':'fire', '漏水数据':'water', '断电数据':'electricity'} |
||||
|
envdata = Envdata.objects.exclude(temperature=0).exclude(humidity=0) |
||||
|
res = envdata.filter(spot__name=spot,rectime__range=[starttime,endtime]).values(tpdict[tp], 'rectime') |
||||
|
return res |
||||
|
|
||||
|
def compre_statics(starttime, endtime): |
||||
|
res = Envdata.objects.filter(rectime__range=[starttime,endtime]).values('errcode').annotate(in_times=Count('errcode')).order_by('spot','errcode').values('spot__name','in_times','errcode') |
||||
|
# envtag = {'0':'正常', '2':'高温', '3':'高湿', '4':'断电', '5':'漏水', '6':'火情'} |
||||
|
spotslist = list(Spot.objects.all().order_by('pk').values_list('name', flat=True)) |
||||
|
rlist = [] |
||||
|
for spot in spotslist: |
||||
|
rlist.append({'spot':spot,'data':[0,0,0,0,0,0,0]}) |
||||
|
for spdata in rlist: |
||||
|
for rdata in res: |
||||
|
if spdata['spot'] == rdata['spot__name']: |
||||
|
spdata['data'][rdata['errcode']] = rdata['in_times'] |
||||
|
spdata['data'].pop(1) |
||||
|
return rlist |
||||
|
|
||||
|
def parse_spots(spots): |
||||
|
lst = [] |
||||
|
if spots: |
||||
|
for spt in spots: |
||||
|
lst.append(spt.name) |
||||
|
return lst |
||||
|
|
||||
|
def get_cmdlist(): |
||||
|
# 查询所有未执行的命令列表 |
||||
|
global COMMAND_QUEUE |
||||
|
return COMMAND_QUEUE |
||||
|
|
||||
|
def store_cmd(spot, cmd, param): |
||||
|
global COMMAND_QUEUE |
||||
|
device = Device.objects.filter(spot=spot).first() |
||||
|
if cmd!='REBOOT': |
||||
|
try: |
||||
|
float(param) |
||||
|
except: |
||||
|
return False |
||||
|
if device and cmd != 'REBOOT': |
||||
|
# 保持设备的最新状态 |
||||
|
# if cmd == 'SERVER_URL': |
||||
|
# device.servaddr = param |
||||
|
if cmd == 'TIMESPAN': |
||||
|
device.timespan = param |
||||
|
elif cmd == 'A_FIRE': |
||||
|
device.afire = param |
||||
|
elif cmd == 'A_TEMP': |
||||
|
device.atemp = param |
||||
|
elif cmd == 'A_HUM': |
||||
|
device.ahum = param |
||||
|
device.save() |
||||
|
elif not device and cmd != 'REBOOT': |
||||
|
dev = Device() |
||||
|
if cmd == 'SERVER_URL': |
||||
|
dev.servaddr = param |
||||
|
elif cmd == 'TIMESPAN': |
||||
|
dev.timespan = param |
||||
|
elif cmd == 'A_FIRE': |
||||
|
dev.afire = param |
||||
|
elif cmd == 'A_TEMP': |
||||
|
dev.atemp = param |
||||
|
elif cmd == 'A_HUM': |
||||
|
dev.ahum = param |
||||
|
dev.save() |
||||
|
COMMAND_QUEUE.append(spot+'$'+cmd+'$'+param) |
||||
|
|
||||
|
def pop_cmd(spot): |
||||
|
global COMMAND_QUEUE |
||||
|
c = 'nocmd' |
||||
|
if not spot: |
||||
|
return c |
||||
|
for idx,val in enumerate(COMMAND_QUEUE): |
||||
|
if spot in val: |
||||
|
c = COMMAND_QUEUE.pop(idx) |
||||
|
c = c.replace(spot+'$', '') |
||||
|
return c |
||||
|
return c |
||||
|
|
||||
|
def save_deviceinfo(spot, timespan, afire, atemp, ahum): |
||||
|
if not spot: |
||||
|
return False |
||||
|
try: |
||||
|
device = Device.objects.filter(spot=spot).first() |
||||
|
if not device: |
||||
|
device = Device() |
||||
|
device.spot = spot |
||||
|
# device.servaddr = servaddr |
||||
|
device.timespan = timespan |
||||
|
device.afire = afire |
||||
|
device.atemp = atemp |
||||
|
device.ahum = ahum |
||||
|
device.save() |
||||
|
return True |
||||
|
except: |
||||
|
return False |
||||
|
|
||||
|
def get_deviceinfo(spot): |
||||
|
deviceinfo = {"TIMESPAN":"","A_FIRE":"","A_TEMP":"","A_HUM":""} |
||||
|
if not spot: |
||||
|
return deviceinfo |
||||
|
dinfo = Device.objects.filter(spot=spot).first() |
||||
|
if dinfo: |
||||
|
deviceinfo['TIMESPAN'] = str(dinfo.timespan) |
||||
|
deviceinfo['A_FIRE'] = str(dinfo.afire) |
||||
|
deviceinfo['A_TEMP'] = str(dinfo.atemp) |
||||
|
deviceinfo['A_HUM'] = str(dinfo.ahum) |
||||
|
return deviceinfo |
@ -0,0 +1,28 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
import smtplib |
||||
|
from email.mime.text import MIMEText |
||||
|
import urllib.request |
||||
|
|
||||
|
def sendmail(receiver, subject, content): |
||||
|
try: |
||||
|
email_host = 'smtp.sina.com' # 发送者是sina邮箱 |
||||
|
email_user = 'xxxxx@sina.com' # 发送者账号 |
||||
|
email_pwd = 'Wj12345' # 发送者密码 |
||||
|
# maillist = 'test123@yeah.net' # 接收者账号,本来想写成[]list的,但是报错,还没解决! |
||||
|
|
||||
|
# 三个参数:第一个为文本内容,第二个 html 设置文本格式,第三个 utf-8 设置编码 |
||||
|
msg = MIMEText(content, 'html', 'utf-8') # 邮件内容 |
||||
|
msg['Subject'] = subject # 邮件主题 |
||||
|
msg['From'] = email_user # 发送者账号 |
||||
|
msg['To'] = ','.join(receiver) # 接收者账号列表(列表没实现) |
||||
|
|
||||
|
smtp = smtplib.SMTP(email_host) # 如上变量定义的,是163邮箱 |
||||
|
smtp.login(email_user, email_pwd) # 发送者的邮箱账号,密码 |
||||
|
smtp.sendmail(email_user, receiver, msg.as_string()) # 参数分别是发送者,接收者,第三个不知道 |
||||
|
smtp.quit() # 发送完毕后退出smtp |
||||
|
return True |
||||
|
except: |
||||
|
return False |
||||
|
|
||||
|
if __name__ == '__main__': |
||||
|
sendmail(['abc123@yeah.net','xxxxx@163.com','abc123@cz.gov.cn'],'测试邮件','测试邮件,以下是测试内容!') |
Loading…
Reference in new issue