Skip to content

Instantly share code, notes, and snippets.

@vovagod
Last active March 25, 2019 17:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vovagod/c1825988eeb5ae007038cc03ff625740 to your computer and use it in GitHub Desktop.
Save vovagod/c1825988eeb5ae007038cc03ff625740 to your computer and use it in GitHub Desktop.
Code examples
########### 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>&nbsp;&nbsp;{% 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>&nbsp;&nbsp;{% 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>&nbsp;&nbsp;{% 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