5 changed files with 200 additions and 0 deletions
@ -0,0 +1,88 @@ |
|||||
|
from django.db import models |
||||
|
from datetime import datetime |
||||
|
|
||||
|
class Spot(models.Model): |
||||
|
name = models.CharField(max_length=30, verbose_name='地点名称') |
||||
|
sn = models.CharField(max_length=20, verbose_name='设备序列号') |
||||
|
ip = models.CharField(max_length=15, verbose_name='设备IP') |
||||
|
def __str__(self): |
||||
|
return self.name |
||||
|
class Meta: |
||||
|
verbose_name_plural='地点设置' |
||||
|
|
||||
|
class Envdata(models.Model): |
||||
|
spot = models.ForeignKey('Spot', on_delete=models.CASCADE, verbose_name='地点') |
||||
|
errcode = models.IntegerField(default=0, verbose_name='错误代码') |
||||
|
electricity = models.SmallIntegerField(default=1, verbose_name='供电') |
||||
|
fire = models.IntegerField(default=0, verbose_name='火情') |
||||
|
water = models.SmallIntegerField(default=0, verbose_name='漏水') |
||||
|
temperature = models.FloatField(default=0.0, verbose_name='温度') |
||||
|
humidity = models.FloatField(default=0.0, verbose_name='湿度') |
||||
|
rectime = models.DateTimeField(verbose_name='记录时间') |
||||
|
def __str__(self): |
||||
|
return self.spot.name |
||||
|
class Meta: |
||||
|
verbose_name_plural='采集数据' |
||||
|
|
||||
|
class Alarm(models.Model): |
||||
|
spot = models.ForeignKey('Spot', on_delete=models.CASCADE, verbose_name='地点') |
||||
|
errcode = models.IntegerField(default=0, verbose_name='报警代码') |
||||
|
almname = models.CharField(max_length=20, null=True, verbose_name='报警名称') |
||||
|
almvalue = models.IntegerField(default=0, verbose_name='报警数值') |
||||
|
almtime = models.DateTimeField(verbose_name='报警时间') |
||||
|
def __str__(self): |
||||
|
return self.almname |
||||
|
class Meta: |
||||
|
verbose_name_plural='报警数据' |
||||
|
|
||||
|
class Sms(models.Model): |
||||
|
name = models.CharField(max_length=10, verbose_name='姓名') |
||||
|
phone = models.CharField(max_length=11, verbose_name='手机', null=True) |
||||
|
email = models.CharField(max_length=25, verbose_name='邮箱', null=True) |
||||
|
def __str__(self): |
||||
|
return self.name |
||||
|
class Meta: |
||||
|
verbose_name_plural='通讯设置' |
||||
|
|
||||
|
class Alarmset(models.Model): |
||||
|
spot = models.ForeignKey('Spot', on_delete=models.CASCADE, verbose_name='地点') |
||||
|
connection = models.BooleanField(default=False, verbose_name='设备离线') |
||||
|
electricity = models.BooleanField(default=False, verbose_name='断电') |
||||
|
fire = models.BooleanField(default=False, verbose_name='火情') |
||||
|
water = models.BooleanField(default=False, verbose_name='漏水') |
||||
|
temperature = models.BooleanField(default=False, verbose_name='温度') |
||||
|
humidity = models.BooleanField(default=False, verbose_name='湿度') |
||||
|
def __str__(self): |
||||
|
return self.spot.name |
||||
|
class Meta: |
||||
|
verbose_name_plural='报警设置' |
||||
|
|
||||
|
class Sendlog(models.Model): |
||||
|
sendtype = models.CharField(max_length=8, default='mail', verbose_name='发送类型') |
||||
|
sendresult = models.BooleanField(default=True, verbose_name='发送结果') |
||||
|
sendto = models.CharField(max_length=200, default='', verbose_name='发送对象') |
||||
|
sendtime = models.DateTimeField(default=datetime.now(), verbose_name='发送时间') |
||||
|
def __str__(self): |
||||
|
return self.sendtype |
||||
|
class Meta: |
||||
|
verbose_name_plural = '发送日志' |
||||
|
|
||||
|
class Device(models.Model): |
||||
|
spot = models.CharField(max_length=20, verbose_name='设备序列号') |
||||
|
# servaddr = models.CharField(max_length=30, default='http://172.18.17.136:8000', verbose_name='服务器地址') |
||||
|
timespan = models.IntegerField(default=1, verbose_name='采集时间间隔') |
||||
|
afire = models.IntegerField(default=15000, verbose_name='火情报警阈值') |
||||
|
atemp = models.FloatField(default=32.0, verbose_name='温度报警阈值') |
||||
|
ahum = models.FloatField(default=75.0, verbose_name='湿度报警阈值') |
||||
|
def __str__(self): |
||||
|
return self.spot |
||||
|
class Meta: |
||||
|
verbose_name_plural = '设备管理' |
||||
|
|
||||
|
class Envchart(models.Model): |
||||
|
class Meta: |
||||
|
verbose_name_plural = '统计图表' |
||||
|
|
||||
|
class Sysmanager(models.Model): |
||||
|
class Meta: |
||||
|
verbose_name_plural = '系统管理' |
@ -0,0 +1,57 @@ |
|||||
|
import subprocess, platform |
||||
|
import os, sys |
||||
|
import django |
||||
|
from datetime import datetime,timedelta |
||||
|
|
||||
|
|
||||
|
parDIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir) |
||||
|
BASE_DIR = os.path.dirname(os.path.join(parDIR, os.pardir)) |
||||
|
sys.path.append(BASE_DIR) |
||||
|
print(BASE_DIR) |
||||
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'envdect.settings') |
||||
|
django.setup() |
||||
|
|
||||
|
from env.models import * |
||||
|
from env.envpost import save_alarm, send_alm_message |
||||
|
# from env.sms import sendSMS |
||||
|
from env.mail import sendmail |
||||
|
|
||||
|
alert_people = ['nfa@yeah.net',] |
||||
|
|
||||
|
def pingTEST(host): |
||||
|
res = False |
||||
|
try: |
||||
|
output = subprocess.check_output("ping -{} 6 {}".format('n' if platform.system().lower()=="windows" else 'c', host), shell=True) |
||||
|
if output.index(b'TTL=') > 0: |
||||
|
res = True |
||||
|
except: |
||||
|
return False |
||||
|
return res |
||||
|
|
||||
|
def online_dect(): |
||||
|
alms = Alarmset.objects.all() |
||||
|
for alm in alms: |
||||
|
host = alm.spot.ip |
||||
|
print('testing ip :', host) |
||||
|
r = pingTEST(host) |
||||
|
print('Testing result:', r) |
||||
|
if not r: |
||||
|
save_alarm(alm.spot, 7, '设备离线', 0) |
||||
|
if alm.connection: |
||||
|
send_alm_message(alm.spot, 7, '设备离线', 0) |
||||
|
|
||||
|
def device_dect(): |
||||
|
spots = Spot.objects.all() |
||||
|
for spot in spots: |
||||
|
device = Envdata.objects.filter(spot=spot).order_by('-rectime').first() |
||||
|
if device: |
||||
|
mailtext = '%s机房设备离线,请及时处理,上次提交数据时间:%s。' % (device.spot.name, datetime.strftime(device.rectime,'%Y-%m-%d %H:%M:%S')) |
||||
|
if datetime.now() - device.rectime >= timedelta(minutes=20): |
||||
|
sendmail(alert_people, '机房环境监测报警', mailtext) |
||||
|
|
||||
|
if __name__ == '__main__': |
||||
|
# host = input('Please input the IP address:') |
||||
|
# r = pingTEST(host) |
||||
|
# print(r) |
||||
|
# online_dect() |
||||
|
device_dect() |
@ -0,0 +1,40 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
from urllib import request,parse |
||||
|
import time,datetime |
||||
|
|
||||
|
def sendSMS(txtBody,phone): |
||||
|
url = 'http://sms.api.ums86.com:8899/sms/Api/Send.do' |
||||
|
data = { |
||||
|
'SpCode': 'xxxxxx', |
||||
|
'LoginName': 'cz_xxxxx', |
||||
|
'Password': 'xxxxxxxx', |
||||
|
'MessageContent': txtBody, |
||||
|
'UserNumber': phone, |
||||
|
'SerialNumber': getSerial(), |
||||
|
'f': '1' |
||||
|
} |
||||
|
res = False |
||||
|
try: |
||||
|
data = parse.urlencode(data).encode('gb2312') |
||||
|
print(data) |
||||
|
req = request.Request(url, data=data) |
||||
|
page = request.urlopen(req).read() |
||||
|
page = page.decode('gb2312') |
||||
|
if 'result=0' in page: |
||||
|
res = True |
||||
|
except: |
||||
|
page = '' |
||||
|
print(page) |
||||
|
return res |
||||
|
|
||||
|
def getSerial(): |
||||
|
t = time.localtime() |
||||
|
h = '888018' |
||||
|
s = h + time.strftime('%Y%m%d%H%M%S', t) |
||||
|
return s |
||||
|
|
||||
|
if __name__ == '__main__': |
||||
|
pn = 18951210000 |
||||
|
txt = u'机房设备离线报警,请及时处理。报警代码:7,报警参数:0。' |
||||
|
r = sendSMS(txt.encode('gb2312'), pn) |
||||
|
print(r) |
@ -0,0 +1,3 @@ |
|||||
|
from django.test import TestCase |
||||
|
|
||||
|
# Create your tests here. |
@ -0,0 +1,12 @@ |
|||||
|
from django.urls import path, include |
||||
|
from .views import * |
||||
|
|
||||
|
urlpatterns = [ |
||||
|
path('time/', ntp_time, name='ntptime'), |
||||
|
path('api/', epost, name='envpost'), |
||||
|
path('envchart/', chart_index, name='chartindex'), |
||||
|
path('cmdmanager/', sys_cmd, name='sysmanager'), |
||||
|
path('cmd/', cmd_query, name='cmd'), |
||||
|
path('cmdqueue/', cmd_queue, name='cmdqueue'), |
||||
|
path('deviceinfo/', query_deviceinfo, name='deviceinfo'), |
||||
|
] |
Loading…
Reference in new issue