Last active
March 25, 2019 17:01
-
-
Save vovagod/c1825988eeb5ae007038cc03ff625740 to your computer and use it in GitHub Desktop.
Code examples
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
########### backend code example, views module, Python 3.5, Django 2.0 ################### | |
@login_required(redirect_field_name='registration/login') | |
def Device(request, system=None, controltype=None): | |
#print("ARXIV_SOBYTIY: {}".format(settings.EMAIL)) | |
#user_language = 'en' | |
#translation.activate(user_language) | |
#request.session[translation.LANGUAGE_SESSION_KEY] = user_language | |
# system objects getting | |
if system: | |
system = System.objects.filter(slug=system).first() | |
else: | |
return HttpResponse('System name is missing') | |
controltypes = ControlType.objects.exclude(slug="sobytiya").order_by('id') | |
categories2 = Category.objects.exclude(slug='vse') | |
categories1 = Category.objects.filter(slug='vse') | |
categories = list(chain(categories1, categories2)) | |
systems = System.objects.order_by('system', 'id') | |
control_name = controltypes.get(slug=controltype) | |
presence = systems.filter(system=system, controltype=control_name) | |
management = None | |
mantag = None | |
control = None | |
settings = None | |
event = None | |
alarm = None | |
picture = None | |
if controltype == 'vizualizaciya': | |
presence = False | |
systems1 = System.objects.filter(system=system) | |
management = systems1.filter(visualmanagement=True).order_by('parname') #was id | |
mantag = systems1.exclude(visualmantag='').order_by('id') | |
if management: | |
presence = True | |
control = systems1.exclude(visualtag='').order_by('id') | |
if control: | |
presence = True | |
settings = systems1.filter(visualsettings=True).order_by('parname') #was id | |
if settings: | |
presence = True | |
event = systems1.exclude(visualevent='').order_by('id') | |
if event: | |
presence = True | |
alarm = systems1.filter(visualalarm=True).order_by('id') | |
if alarm: | |
presence = True | |
pic = systems1.exclude(picture='').order_by('id') | |
if pic: | |
picture = 'image/' + pic[0].picture + '.png' | |
logging.info('picture is present') | |
logging.info(pic.count()) | |
else: | |
presence = False | |
dbvalue = None | |
dbvalues = None | |
if controltype == 'grafiki': | |
dbvalues = DataBaseValue.objects.filter(system=system, uniquemark=True).order_by('id') | |
dbvalue = dbvalues.first() | |
if dbvalue: | |
dbvalue = dbvalue.parname | |
else: | |
dbvalue = None | |
# paginator for the Events page | |
totalitem = None | |
ranges = 0 | |
numpage = 0 | |
itemsperlist = 20 # initial quantity of items per page | |
if controltype == 'arhiv-sobytij': | |
dbbit = DataBaseBit.objects.filter(system=system, bit=True).order_by('-datatime') | |
paginator = Paginator(dbbit, itemsperlist) # Show number of events per page | |
totalitem = paginator.count | |
ranges = paginator.page_range | |
numpage = paginator.num_pages | |
dbvalue_rest = 0 | |
point = 20 # initial number of points to show in chart | |
if dbvalue: | |
if controltype == 'grafiki': | |
dbvalue_num = DataBaseValue.objects.filter(system=system, parname=dbvalue).order_by('id') | |
dbvalue_count = dbvalue_num.count() | |
if dbvalue_count <= 200: | |
dbvalue_rest = 1 | |
else: | |
dbvalue_rest = (dbvalue_count-200)//200+1 | |
contex = {'categories':categories, | |
'systems':systems, | |
'system':system, | |
'controltype':controltype, | |
'controltypes':controltypes, | |
'presence': presence, | |
'dbvalues': dbvalues, | |
'dbvalue': dbvalue, | |
'range': ranges, | |
'totalitem': totalitem, | |
'itemsperlist': itemsperlist, | |
'numpages': numpage, | |
'points': point, | |
'dbvaluerests': dbvalue_rest, | |
'managements': management, | |
'mantag': mantag, | |
'controls': control, | |
'settings': settings, | |
'events': event, | |
'alarms': alarm, | |
'picture': picture, | |
} | |
for contype in controltypes: | |
if controltype in contype.slug: | |
templatename = contype.slug +'.html' | |
return render(request, templatename, contex) | |
def JsonPackAll(request): | |
''' | |
two-second cyclic ajax requests generate list of current parameters for all systems | |
''' | |
start = time.time() | |
systems = System.objects.order_by('category', 'system', 'controltype', 'parname') | |
categories = Category.objects.order_by('name') | |
control_type = ControlType.objects.order_by('id') | |
control_count = control_type.count() | |
count_sys = systems.count() | |
count_cat = categories.count() | |
data_d1 = serializers.serialize('json', systems, ensure_ascii = False, fields=('category', 'system', 'slug', 'controltype', 'parname', | |
'valueget', 'valueput', 'bitput', 'rangalarm', | |
'eventbit', 'offset', 'visualmanagement'), | |
use_natural_foreign_keys=True) | |
data_d = json.loads(data_d1) | |
data_d3 = ControlType.objects.values('slug') | |
# initialization of empty arrays | |
data_list = {} | |
data_list1 = {} | |
data_list2 = {} | |
data_pack = [] | |
data_pack1 = [] | |
data_array = [] | |
# C-code extention makes 20 time faster results!!! | |
start = time.time() | |
result = re.split(r'}', data_d1) | |
list_1 = ','.join(result) | |
list_array = bytes(list_1, encoding='utf-8', errors='strict') | |
arg = ffi.new("char old_array[]", list_array) | |
total_bytes = _dict_all.lib.new_array(arg, count_sys, control_count) | |
data_pack1 = ''.join([arg[i].decode(encoding='cp1251', errors='strict') for i in range(total_bytes-1)]) | |
data_dict = data_pack1.split(';') | |
x = 0 | |
for n in data_dict: | |
json_string = json.loads(n) | |
for y in data_d3: | |
if json_string['controltype'] == y['slug']: | |
x = x + 1 | |
break | |
data_pack.insert(x,json_string) | |
x = x + 1 | |
# python code that has been replaced by the above C-code extention | |
#for i in range(0, count_sys): | |
#for m in range(0, control_count): | |
#if data_d[i]['fields']['controltype'] == control_type[m].id: | |
#break | |
#data_list = {'category': data_d[i]['fields']['category'], | |
#'system': data_d[i]['fields']['system'], | |
#'controltype': control_type[m].slug, | |
#'parname': data_d[i]['fields']['parname'], | |
#'valueget': data_d[i]['fields']['valueget'], | |
#'valueput': data_d[i]['fields']['valueput'], | |
#'bitput': data_d[i]['fields']['bitput'], | |
#'rangalarm': data_d[i]['fields']['rangalarm'], | |
#'eventbit': data_d[i]['fields']['eventbit'], | |
#'offset': data_d[i]['fields']['offset'], | |
#} | |
#data_pack.insert(i,data_list) | |
#print('DATA_PACK:{}'.format(data_pack)) | |
pos = 0 | |
sys_count = 1 | |
for j in range(0, count_cat): | |
sys = systems.filter(category_id=categories[j].id) | |
sys_cat = sys.first() | |
if sys_cat: | |
sys_count = sys.count() | |
data_list1 = {'category': categories[j].name, | |
'cat': 1, 'system': 'None', 'slug': 'None'} | |
data_pack.insert(pos,data_list1) | |
pos = pos + 1 + sys_count | |
distinct = System.objects.order_by('category', 'system').values('system', 'slug').annotate(name_count=Count('slug', distinct=True)) #was system | |
distinct_count = distinct.count() | |
data_count = count_cat + count_sys + distinct_count - 1 | |
for l in range(0, distinct_count): | |
slug_name = distinct[l]['slug'] | |
for k in range(0, data_count): | |
sys_test = data_pack[k]['slug'] | |
if sys_test == slug_name: | |
data_list2 = {'system': distinct[l]['system'], 'slug': slug_name, | |
'sys': 1} | |
data_pack.insert(k,data_list2) | |
break | |
data_array.append(data_pack) | |
response = { 'records': data_pack } | |
end = time.time() | |
res = end - start | |
print("JSONPACKALL,START TIME:{}, DELAY:{}".format(datetime.now(tz=timezone.utc), res)) | |
return JsonResponse(response) | |
############ backend code example, models module, Python 3.5, Django 2.0 ################ | |
def registeriter(offset, control_order, slave_addr, control, MeterList, index): | |
''' | |
''' | |
registers_id = control_order.values_list('id', flat=True).order_by('valueread') | |
registers_list = control_order.values_list('valueread', flat=True).order_by('valueread') | |
divider_l = control_order.values_list('divider', flat=True).order_by('valueread') | |
registers_number = registers_list.count() | |
r_start = registers_id[0] | |
reg_start = registers_list[0] | |
reg_end = registers_list.reverse()[0] | |
registers_length = reg_end-reg_start | |
divider_list = [] | |
for idx in range (0, registers_length+1): | |
try: | |
divider_list.insert(idx, divider_l[idx]) | |
except IndexError: | |
divider_list.insert(idx, 1) | |
continue | |
ExceptionMessage.objects.filter(id=1).update(flag=False, exceptiontext='all OK', slave=0, register=0) | |
if registers_length+1 > 125: | |
ExceptionMessage.objects.filter(id=1).update(flag=True, exceptiontext='the number of registers exceeds 125', slave=slave_addr) | |
return | |
simulator = 1 # put 1 to activate simulator mode | |
registers = [] | |
params = RTUSettings.objects.get(id=1) | |
# Real modbus connection | |
addr_port = bytes(params.port, encoding='utf-8', errors='strict') | |
parity = bytes(params.parity, encoding='utf-8', errors='strict') | |
modbus = ModbusRtu(addr_port, params.baudrate, parity, params.bytesize, params.stopbits) | |
connect_status = modbus.connect() | |
if isinstance(connect_status, str): | |
print('Could not open USB port') | |
ExceptionMessage.objects.filter(id=1).update(flag=True, exceptiontext='Could not open USB port') | |
modbus.close() | |
return | |
slave_status = modbus.set_slave(slave_addr) | |
if isinstance(slave_status, str): | |
print('Could not set connection') | |
ExceptionMessage.objects.filter(id=1).update(flag=True, exceptiontext='Could not set connection') | |
modbus.close() | |
return | |
#timeout_get = modbus.get_response_timeout() | |
#timeout_set = modbus.set_response_timeout(0) | |
registers = modbus.read_registers(registers_list[0]+offset, registers_length) | |
if isinstance(registers, str): | |
print('Something wrong with registers') | |
ExceptionMessage.objects.filter(id=1).update(flag=True, exceptiontext='Something wrong with registers') | |
modbus.close() | |
return | |
modbus.close() | |
# simulator of slave device polling | |
if simulator: | |
registers = [] | |
for m in range (0, registers_length+1): | |
val = random.randint(-10, 10) | |
registers.append(val) | |
cursor = connection.cursor() | |
data = [(val/divider_list[idx], idx+r_start) for idx, val in enumerate(registers) if idx+r_start in registers_id] | |
SQL = "UPDATE base_system SET valueget = %s WHERE id = %s" | |
psycopg2.extras.execute_batch(cursor, SQL, data) | |
cursor.close() | |
# meter value simulator, for demo mode only | |
#text_list = control_order.values_list('parname', flat=True).order_by('valueread') | |
#initial_meter = control_order.values_list('initialmeter', flat=True).order_by('valueread') | |
#n=0 | |
#for first_word in text_list: | |
#word = re.findall(r'\w+', first_word)[0] | |
#if word in MeterList: | |
#System.objects.filter(slaveaddr=slave_addr, parname=first_word).update(initialmeter=int(initial_meter[n])+1) | |
#if initial_meter[n] > 1200: | |
#System.objects.filter(slaveaddr=slave_addr, parname=first_word).update(initialmeter=0) | |
#n = n + 1 | |
return | |
############ frontend code example, control page, AngularJS ################ | |
{% extends 'home.html' %} | |
{% load static %} | |
{% load i18n %} | |
{% block menu %} | |
<div class="w3-bar w3-black"> | |
{% for contype in controltypes %} | |
{% trans contype.name as contype_name %} | |
{% if contype.slug == controltype %}<a href="{{contype.slug}}" class="w3-bar-item w3-button w3-yellow">{{ contype_name }}</a> | |
{% else %}<a href="{{contype.slug}}" class="w3-bar-item w3-button">{{ contype_name }}</a>{% endif %} | |
{% endfor %} | |
</div> | |
{% endblock menu %} | |
{% block control %} | |
<div class="w3-padding-16"> | |
<h3 class="w3-center" style="color:darkblue; font-weight:700">{{system.system}}</h3> | |
</div> | |
<div id="sys" class="w3-row w3-container" ng-controller="myCtrlFour" data-sys="{{system.system}}" data-con="{{controltype}}"> | |
{% if presence %} | |
{% verbatim %} | |
<div ng-repeat="(key, value) in names"> | |
<div class="w3-quarter"> | |
<div class="loop w3-container w3-center w3-blue w3-border" style="height:64px"> | |
<p style="font-weight:600; margin:8px 0px 8px 0px">{{key}}</p> | |
</div> | |
<div class="w3-center w3-white w3-border"> | |
<div ng-if="value===2"> | |
<h4><i class="fa fa-exclamation-triangle fa-2x" style="color:red" aria-hidden="true"></i> {% endverbatim %}{% trans "тревога" %}{% verbatim %}</h4> | |
</div> | |
<div ng-if="value===1"> | |
<h4><i class="fa fa-exclamation-circle fa-2x" style="color:yellow" aria-hidden="true"></i> {% endverbatim %}{% trans "предупр" %}{% verbatim %}</h4> | |
</div> | |
<div ng-if="value===0"> | |
<h4><i class="fa fa-check-circle fa-2x" style="color:green" aria-hidden="true"></i> {% endverbatim %}{% trans "норма" %}{% verbatim %}</h4> | |
</div> | |
</div> | |
<br> | |
</div> | |
</div> | |
{% endverbatim %} | |
{% else %} | |
<h3 class="w3-center w3-text-blue"><i class="fa fa-frown-o fa-2x" style="color:rgb(33, 150, 243)"></i> {% trans "Нет аварий" %}</h3> | |
{% endif %} | |
</div> | |
<script> | |
var settick2; | |
// Angular script for alarms module | |
var app = angular.module('myApp', []); | |
app.config(['$httpProvider', function($httpProvider) { | |
$httpProvider.defaults.headers.common['X-CSRFToken'] = '{{ csrf_token|escapejs}}'; | |
}]); | |
app.factory('asinc', function($http) { | |
return { | |
getSession: function (system, controltype) { | |
return $http({ | |
method : "POST", | |
url : '{% url 'base:jsonpackalarms' %}', | |
data : {'system': system, 'controltype': controltype } | |
}).then(function mySuccess(response) { | |
var response1 = response; | |
return response1; | |
}, function myError(response) { | |
}) | |
}}; | |
}); | |
app.service('abcsorting', function() { | |
this.arr = function(obj) { | |
var arr_key = []; | |
var arr_key1 = []; | |
var arr_value = []; | |
var arr_sorted; | |
var l=0; | |
for (var key in obj) { | |
if (obj.hasOwnProperty(key)) { | |
arr_key[l] = key; | |
arr_key1[l] = key; | |
arr_value[l] = obj[key]; | |
l++; | |
} | |
} | |
arr_key.sort(); | |
arr_sorted = {}; | |
for (var j = 0; j < arr_key.length; j++){ | |
for (var k = 0; k < arr_key.length; k++){ | |
if (arr_key[j] == arr_key1[k]) { | |
arr_sorted[arr_key[j]] = arr_value[k]; | |
} | |
} | |
} | |
return arr_sorted; | |
}; | |
}); | |
app.controller('myCtrlFour', function($scope, $http, $interval, asinc, abcsorting) { | |
var sys = document.getElementById("sys"); | |
var system = sys.getAttribute("data-sys"); | |
var controltype = sys.getAttribute("data-con"); | |
asinc.getSession(system, controltype).then(function(response){ | |
if (response === undefined) { return; } | |
var obj1 = response.data.records[0]; | |
var max_length = 0; | |
for (var key in obj1) { | |
if(key.length > max_length){ | |
max_length = key.length; | |
} | |
} | |
// first boot | |
$scope.names = abcsorting.arr(obj1); | |
$(document).ready(function(){ | |
if (max_length > 31){ | |
var collection = document.querySelectorAll(".loop"); | |
var i; | |
for (i = 0; i < collection.length; i++) { | |
collection[i].setAttribute("style", "height:88px"); | |
} | |
} | |
}); | |
}); | |
//var settick2; | |
function AlarmTick(){ | |
asinc.getSession(system, controltype).then(function(response){ | |
if (response === undefined) { return; } | |
// alphabetical sorting | |
var obj = response.data.records[0]; | |
$scope.names = abcsorting.arr(obj); | |
}); | |
} | |
window.settick2 = setInterval(AlarmTick, 2000); | |
function handleVisibilityChange() { | |
if (document.hidden) { | |
clearInterval(window.settick2); | |
} else { | |
window.settick2 = setInterval(AlarmTick, 2000); | |
} | |
} | |
document.addEventListener("visibilitychange", handleVisibilityChange, false); | |
$scope.$on("$destroy", function () { | |
clearInterval(window.settick2); | |
}); | |
}); | |
</script> | |
{% endblock control %} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment