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