статус с резервуара теперь берется из бд сайта
This commit is contained in:
parent
f7dbad696a
commit
71e9fc37e9
@ -18,8 +18,5 @@ from django.urls import path
|
|||||||
from . import views
|
from . import views
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', views.view_index, name='index'),
|
path('', views.view_index, name='index')
|
||||||
path('fetch/stats', views.view_stats, name='fetch-stats'),
|
|
||||||
path('fetch/tank-chart', views.view_tank_chart, name='fetch-tank-chart'),
|
|
||||||
# path('methods/<str:method_name>', views.call_method, name='call_method')
|
|
||||||
]
|
]
|
||||||
|
@ -1,36 +1,9 @@
|
|||||||
import os
|
|
||||||
|
|
||||||
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden
|
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
# from django.db.models import Manager
|
# from django.db.models import Manager
|
||||||
from django.contrib.auth.decorators import login_required, permission_required
|
from django.contrib.auth.decorators import login_required
|
||||||
|
|
||||||
# только для тестирования!
|
|
||||||
import requests
|
|
||||||
|
|
||||||
TEST_BASE_FETCH = "https://test.wawaa.ru/dev-fetch.php"
|
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def view_index(request):
|
def view_index(request):
|
||||||
return render(request, 'index.html')
|
return render(request, 'index.html')
|
||||||
|
|
||||||
|
|
||||||
@permission_required(perm='view_logs', raise_exception=True)
|
|
||||||
def view_stats(request):
|
|
||||||
# TODO: вставить использование привилегий для получения данных
|
|
||||||
# только для тестирования!
|
|
||||||
res = requests.get(TEST_BASE_FETCH + "?stats", headers={'Authorization': os.getenv("TEST_AUTH")})
|
|
||||||
response = HttpResponse(res.content)
|
|
||||||
response.headers["Content-type"] = response.headers["Content-type"]
|
|
||||||
return response
|
|
||||||
|
|
||||||
|
|
||||||
@permission_required(perm='view_logs', raise_exception=True)
|
|
||||||
def view_tank_chart(request):
|
|
||||||
# только для тестирования!
|
|
||||||
days = request.GET.get('days', '7')
|
|
||||||
res = requests.get(TEST_BASE_FETCH + "?tank_chart=" + days, headers={'Authorization': os.getenv("TEST_AUTH")})
|
|
||||||
response = HttpResponse(res.content)
|
|
||||||
response.headers["Content-type"] = response.headers["Content-type"]
|
|
||||||
return response
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
from datetime import datetime
|
from datetime import datetime, timedelta
|
||||||
# select UNIX_TIMESTAMP(datetime), level_percentage, radar_low_reg, status_reg from tcs
|
# select UNIX_TIMESTAMP(datetime), level_percentage, radar_low_reg, status_reg from tcs
|
||||||
|
|
||||||
|
|
||||||
@ -12,6 +12,26 @@ class MbTankRecord(models.Model):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"({self.id}) {self.dt}: radar={self.radar_raw}, level={self.level}"
|
return f"({self.id}) {self.dt}: radar={self.radar_raw}, level={self.level}"
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def load_stats():
|
||||||
|
result = {
|
||||||
|
'last_update': None, # последнее обновление, unix time
|
||||||
|
'level': None, # текущее показание, пересчитанное в %
|
||||||
|
'radar': None, # текущее показание с радара
|
||||||
|
'status': None, # статусный регистр
|
||||||
|
'last_radar_values': [] # последние показания за 15 минут
|
||||||
|
}
|
||||||
|
|
||||||
|
last_save = MbTankRecord.objects.order_by('-dt').first()
|
||||||
|
if last_save is not None:
|
||||||
|
result['last_update'] = last_save.dt.timestamp()
|
||||||
|
result['level'] = last_save.level
|
||||||
|
result['radar'] = last_save.radar_raw
|
||||||
|
result['status'] = last_save.status
|
||||||
|
query = MbTankRecord.objects.filter(dt__gt=(datetime.now() - timedelta(minutes=15))).order_by('dt')
|
||||||
|
result['last_radar_values'] = [(int(item.dt.timestamp()), item.radar_raw) for item in query]
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
class MbPumpRecord(models.Model):
|
class MbPumpRecord(models.Model):
|
||||||
dt = models.DateTimeField(verbose_name="Время записи", default=datetime.now)
|
dt = models.DateTimeField(verbose_name="Время записи", default=datetime.now)
|
||||||
|
@ -14,7 +14,7 @@ class MbClearHistoryService(Thread):
|
|||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
while True:
|
while True:
|
||||||
self.model.objects.filter(dt__lt=(timezone.now() - timezone.timedelta(days=60))).delete()
|
self.model.objects.filter(dt__lt=(datetime.now() - timedelta(days=60))).delete()
|
||||||
time.sleep(10)
|
time.sleep(10)
|
||||||
|
|
||||||
|
|
||||||
@ -79,21 +79,10 @@ class MbService(Thread):
|
|||||||
else:
|
else:
|
||||||
last_query = datetime.now()
|
last_query = datetime.now()
|
||||||
|
|
||||||
def to_json(self):
|
|
||||||
return {}
|
|
||||||
|
|
||||||
|
|
||||||
class MbTankService(MbService):
|
class MbTankService(MbService):
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
super().__init__(**kwargs)
|
super().__init__(**kwargs)
|
||||||
self.registers = {}
|
|
||||||
# {
|
|
||||||
# 'last_update': None, # последнее обновление, unix time
|
|
||||||
# 'level': None, # текущее показание, пересчитанное в %
|
|
||||||
# 'radar': None, # текущее показание с радара
|
|
||||||
# 'status': None, # статусный регистр
|
|
||||||
# 'last_radar_values': [] # последние показания за 15 минут
|
|
||||||
# }
|
|
||||||
|
|
||||||
self._curr_state = None
|
self._curr_state = None
|
||||||
# {
|
# {
|
||||||
@ -102,23 +91,8 @@ class MbTankService(MbService):
|
|||||||
# "radar": int
|
# "radar": int
|
||||||
# }
|
# }
|
||||||
|
|
||||||
# для фильтрации уровня, чтобы его в бд писать
|
|
||||||
self.level_filter = []
|
|
||||||
|
|
||||||
def _update_last_radar_values(self):
|
|
||||||
res = [[item.dt.timestamp(), item.radar_raw]
|
|
||||||
for item in MbTankRecord.objects.filter(dt__gt=(datetime.now() - timedelta(minutes=15))).order_by('-dt')]
|
|
||||||
self.registers['last_radar_values'] = res
|
|
||||||
|
|
||||||
def _init_state(self):
|
def _init_state(self):
|
||||||
self.last_save = MbTankRecord.objects.order_by('-dt').first()
|
pass
|
||||||
print(f"Initializing MbTankService: last_save={self.last_save}")
|
|
||||||
if self.last_save is not None:
|
|
||||||
self.registers['last_update'] = self.last_save.dt
|
|
||||||
self.registers['level'] = self.last_save.level
|
|
||||||
self.registers['radar'] = self.last_save.radar_raw
|
|
||||||
self.registers['status'] = self.last_save.status
|
|
||||||
self._update_last_radar_values()
|
|
||||||
|
|
||||||
def _push_current_state(self):
|
def _push_current_state(self):
|
||||||
record = MbTankRecord(radar_raw=self._curr_state['radar'],
|
record = MbTankRecord(radar_raw=self._curr_state['radar'],
|
||||||
@ -137,14 +111,10 @@ class MbTankService(MbService):
|
|||||||
"status": values[5],
|
"status": values[5],
|
||||||
"radar": (values[1] << 16) | values[2]
|
"radar": (values[1] << 16) | values[2]
|
||||||
}
|
}
|
||||||
self.registers['last_update'] = datetime.now()
|
|
||||||
|
|
||||||
def _check_need_save(self):
|
def _check_need_save(self):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def to_json(self):
|
|
||||||
return self.registers
|
|
||||||
|
|
||||||
|
|
||||||
class MbPumpService(MbService):
|
class MbPumpService(MbService):
|
||||||
_config = {
|
_config = {
|
||||||
|
23
logs_service/urls.py
Normal file
23
logs_service/urls.py
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
"""logs_service URL Configuration
|
||||||
|
|
||||||
|
The `urlpatterns` list routes URLs to views. For more information please see:
|
||||||
|
https://docs.djangoproject.com/en/3.2/topics/http/urls/
|
||||||
|
Examples:
|
||||||
|
Function views
|
||||||
|
1. Add an import: from my_app import views
|
||||||
|
2. Add a URL to urlpatterns: path('', views.home, name='home')
|
||||||
|
Class-based views
|
||||||
|
1. Add an import: from other_app.views import Home
|
||||||
|
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
|
||||||
|
Including another URLconf
|
||||||
|
1. Import the include() function: from django.urls import include, path
|
||||||
|
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
||||||
|
"""
|
||||||
|
|
||||||
|
from django.urls import path
|
||||||
|
from . import views
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
path('stats', views.view_stats, name='fetch-stats'),
|
||||||
|
path('tank-chart', views.view_tank_chart, name='fetch-tank-chart'),
|
||||||
|
]
|
40
logs_service/views.py
Normal file
40
logs_service/views.py
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import json
|
||||||
|
|
||||||
|
from django.shortcuts import render
|
||||||
|
import os
|
||||||
|
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden
|
||||||
|
from django.contrib.auth.decorators import login_required, permission_required
|
||||||
|
from .models import MbTankRecord
|
||||||
|
|
||||||
|
# только для тестирования!
|
||||||
|
import requests
|
||||||
|
|
||||||
|
TEST_BASE_FETCH = "https://test.wawaa.ru/dev-fetch.php"
|
||||||
|
|
||||||
|
|
||||||
|
@permission_required(perm='logs_service.view_mbtankrecord', raise_exception=True)
|
||||||
|
def view_stats(request):
|
||||||
|
# TODO: вставить использование привилегий для получения данных
|
||||||
|
# только для тестирования!
|
||||||
|
ext_stats = requests.get(TEST_BASE_FETCH + "?stats", headers={'Authorization': os.getenv("TEST_AUTH")})
|
||||||
|
|
||||||
|
out = {
|
||||||
|
'stats': {
|
||||||
|
'tank': MbTankRecord.load_stats(),
|
||||||
|
'pump': ext_stats.json()['stats']['pump']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
response = HttpResponse(json.dumps(out))
|
||||||
|
response.headers["Content-type"] = response.headers["Content-type"]
|
||||||
|
return response
|
||||||
|
|
||||||
|
|
||||||
|
@permission_required(perm='view_logs', raise_exception=True)
|
||||||
|
def view_tank_chart(request):
|
||||||
|
# только для тестирования!
|
||||||
|
days = request.GET.get('days', '7')
|
||||||
|
res = requests.get(TEST_BASE_FETCH + "?tank_chart=" + days, headers={'Authorization': os.getenv("TEST_AUTH")})
|
||||||
|
response = HttpResponse(res.content)
|
||||||
|
response.headers["Content-type"] = response.headers["Content-type"]
|
||||||
|
return response
|
@ -22,5 +22,6 @@ from django.contrib.staticfiles.views import serve
|
|||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', include('index.urls')),
|
path('', include('index.urls')),
|
||||||
path('account/', include('users.urls')),
|
path('account/', include('users.urls')),
|
||||||
|
path('fetch/', include('logs_service.urls')),
|
||||||
path('admin/', admin.site.urls),
|
path('admin/', admin.site.urls),
|
||||||
]
|
]
|
||||||
|
@ -133,22 +133,22 @@ const updateFunctions = {
|
|||||||
|
|
||||||
// Текущий уровень воды: <span id="tank-level-now"></span>%
|
// Текущий уровень воды: <span id="tank-level-now"></span>%
|
||||||
'tank-level-now': (element, dataset) => {
|
'tank-level-now': (element, dataset) => {
|
||||||
element.innerHTML = dataset['tank']['last_percentage']
|
element.innerHTML = dataset['tank']['level']
|
||||||
// тут все хорошо если влезаем в установленные рамки +-2% (69-80%)
|
// тут все хорошо если влезаем в установленные рамки +-2% (69-80%)
|
||||||
_setIndicatorClass(element, 67 <= dataset['tank']['last_percentage'] <= 82)
|
_setIndicatorClass(element, 67 <= dataset['tank']['last_percentage'] <= 82)
|
||||||
},
|
},
|
||||||
|
|
||||||
// Текущее значение с радара
|
// Текущее значение с радара
|
||||||
'tank-raw-now': (element, dataset) => {
|
'tank-raw-now': (element, dataset) => {
|
||||||
element.innerHTML = dataset['tank']['last_radar']
|
element.innerHTML = dataset['tank']['radar']
|
||||||
},
|
},
|
||||||
|
|
||||||
// Статус: <span id="tank-status"></span>
|
// Статус: <span id="tank-status"></span>
|
||||||
'tank-status': (element, dataset) => {
|
'tank-status': (element, dataset) => {
|
||||||
const shur_status_bits = ['нужна вода', 'поплавок нижний', 'поплавок верхний', 'поплавок аварийный']
|
const shur_status_bits = ['нужна вода', 'поплавок нижний', 'поплавок верхний', 'поплавок аварийный']
|
||||||
element.innerHTML = unpackBits(dataset['tank']['status_reg'], shur_status_bits) + " (" + dataset['tank']['status_reg'] + ")"
|
element.innerHTML = unpackBits(dataset['tank']['status'], shur_status_bits) + " (" + dataset['tank']['status'] + ")"
|
||||||
// тут все хорошо, пока нет аварийного поплавка
|
// тут все хорошо, пока нет аварийного поплавка
|
||||||
_setIndicatorClass(element, (dataset['tank']['status_reg'] & 0x8) === 0)
|
_setIndicatorClass(element, (dataset['tank']['status'] & 0x8) === 0)
|
||||||
},
|
},
|
||||||
|
|
||||||
// Частота ПЧ: <span id="pump-vfd-freq"></span>Гц
|
// Частота ПЧ: <span id="pump-vfd-freq"></span>Гц
|
||||||
|
Loading…
x
Reference in New Issue
Block a user