dever 4 years ago
parent
commit
46fd6a400d
46 changed files with 270 additions and 106 deletions
  1. 13 1
      conf/dev.conf
  2. 0 1
      front/__init__.py
  3. 3 9
      front/main.py
  4. 1 14
      front/page/__init__.py
  5. 10 11
      front/page/__load__.py
  6. 6 8
      front/page/device.py
  7. 1 1
      front/page/main.py
  8. 1 2
      front/page/msg.py
  9. 1 2
      front/page/origin.py
  10. 2 3
      front/page/upload.py
  11. 1 2
      front/page/user.py
  12. 1 2
      front/page/work.py
  13. 1 1
      front/templates/pc/device/alert/device.html
  14. 12 7
      front/templates/pc/device/inc/data.html
  15. 1 1
      front/templates/pc/inc/top.html
  16. 5 2
      modbus.py
  17. 3 2
      model/data.py
  18. 1 1
      model/device_page.py
  19. 1 1
      runtime/postgresql/device_gateway
  20. 1 1
      runtime/postgresql/device_info
  21. 1 0
      runtime/postgresql/device_mul
  22. 1 0
      runtime/postgresql/device_page
  23. 1 0
      runtime/postgresql/device_set_condition
  24. 1 0
      runtime/postgresql/device_set_timing
  25. 1 1
      runtime/postgresql/farm
  26. 1 0
      runtime/postgresql/farm_env
  27. 1 0
      runtime/postgresql/farm_product
  28. 1 0
      runtime/postgresql/farm_user
  29. 1 1
      runtime/postgresql/farm_work
  30. 1 1
      runtime/postgresql/farm_work_category
  31. 1 1
      runtime/postgresql/farm_work_land
  32. 1 0
      runtime/postgresql/farm_work_method
  33. 1 1
      runtime/postgresql/hardware_type
  34. 1 1
      runtime/postgresql/manage_admin
  35. 1 1
      runtime/postgresql/manage_log
  36. 1 1
      runtime/postgresql/manage_role
  37. 1 0
      runtime/postgresql/msg
  38. 1 1
      runtime/postgresql/msg_type
  39. 1 1
      runtime/postgresql/notice_type
  40. 1 0
      runtime/postgresql/origin_batch
  41. 1 1
      runtime/postgresql/setting_device
  42. 1 1
      runtime/postgresql/setting_product
  43. 1 1
      runtime/postgresql/setting_server
  44. 3 3
      service/device.py
  45. 178 17
      service/modbus/tcp.py
  46. 1 1
      service/setting/core.py

+ 13 - 1
conf/dev.conf

@@ -80,4 +80,16 @@ max_buffer_size		= 210763776
 process				= 0
 url					= http://192.168.33.10:8088/device
 qrcode				= http://pan.baidu.com/share/qrcode?w=300&h=300&url=
-mobile				= True
+mobile				= True
+
+;网站前台配置
+[web]
+port                = 8089
+debug               = True
+max_buffer_size     = 210763776
+process             = 0
+;url                    = http://www.xinnongbaohe.com:8089/
+;farmurl                = http://www.xinnongbaohe.com:8089/farm?id=
+url                 = http://www.xinnongbaohe.com/
+farmurl             = http://farm.xinnongbaohe.com/?id=
+originurl           = http://s.xinnongbaohe.com/?id=

+ 0 - 1
front/__init__.py

@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # -*- coding: utf-8 -*-
 """
     demeter init

+ 3 - 9
front/main.py

@@ -1,10 +1,4 @@
-#!/usr/bin/env python
-#coding=utf-8
-"""
-    demeter web
-    name:main.py
-    author:rabin
-"""
-from page import *
+# -*- coding: utf-8 -*-
 from demeter.web import *
-Web.start(url)
+import front.page
+Web.start(application=[front.page,])

+ 1 - 14
front/page/__init__.py

@@ -1,14 +1 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-"""
-    demeter init
-    author:rabin
-    这里写页面逻辑
-"""
-from demeter.web import *
-path = os.path.split(os.path.realpath(__file__))[0] + '/'
-files = Web.file(path)
-url = []
-for key in files:
-	module = __import__(key, globals())
-	url = Web.url(module, key, url)
+# -*- coding: utf-8 -*-

+ 10 - 11
front/page/__load__.py

@@ -1,10 +1,10 @@
-#!/usr/bin/env python
 # -*- coding: utf-8 -*-
 """
     demeter load
     author:rabin
 """
 from demeter.web import *
+from datetime import *
 
 class Load(Base):
 	KEYS = ('user', 'farm')
@@ -19,13 +19,13 @@ class Load(Base):
 		else:
 			self.data['ajax'] = False
 		self.data['auth'] = True
-		if 'user' in self.data['setting'] and self.data['setting']['user'] > 0:
-			self.data['setting']['userInfo'] = self.service('common').one('farm_user', id=self.data['setting']['user'])
+		if 'user' in self.data['setting'] and self.data['setting']['user']:
+			self.data['setting']['userInfo'] = self.service('common').one('farm_user', id=self.data['setting']['user'].decode())
 			self.data['setting']['farm'] = self.data['setting']['userInfo']['farm_id']
 		else:
 			return
 
-		if 'farm' in self.data['setting'] and self.data['setting']['farm'] > 0:
+		if 'farm' in self.data['setting'] and self.data['setting']['farm']:
 			self.data['setting']['farmInfo'] = self.service('common').one('farm', id=self.data['setting']['farm'])
 			self.data['setting']['farmInfo']['gateways'] = ''
 			if self.data['setting']['farmInfo']['gateway']:
@@ -179,8 +179,8 @@ class Device(object):
 		self.data['camera'] = []
 		if self.data['device']:
 			for value in self.data['device']:
-				if value['type_id'] > 0:
-					type_info = self.service('common').one('device_type', id=value['type_id'])
+				if value['type_id']:
+					type_info = self.service('common').one('setting_device', id=value['type_id'])
 					value['unit'] = type_info['unit']
 					value['typeName'] = type_info['name']
 				# 获取网关状态
@@ -240,7 +240,7 @@ class Device(object):
 								self.data['stat'] = v
 							self.data['show'] = True
 						if v['type_id'] > 0:
-							type_info = self.service('common').one('device_type', id=v['type_id'])
+							type_info = self.service('common').one('setting_device', id=v['type_id'])
 							self.data['group'][key]['device'][k]['unit'] = type_info['unit']
 							self.data['group'][key]['device'][k]['typeName'] = type_info['name']
 
@@ -304,7 +304,7 @@ class Device(object):
 		if not self.data['deviceInfo']:
 			self.view('404.html')
 			return
-		self.data['type'] = self.service('common').one('device_type', id=self.data['deviceInfo']['type_id'])
+		self.data['type'] = self.service('common').one('setting_device', id=self.data['deviceInfo']['type_id'])
 
 		model = Demeter.model('data', 'tsdb')
 		self.data['group'] = model.dateConfig()
@@ -366,7 +366,6 @@ class Device(object):
 
 			if datas:
 				import csv,codecs
-				from datetime import *
 				import uuid
 
 				dates = sorted(datas.keys())
@@ -408,8 +407,8 @@ class Device(object):
 		for value in self.data['device']:
 			ids.append(value['id'])
 			value['cdates'] = Demeter.date(value['udate'], '%Y.%m.%d')
-			if value['type_id'] > 0:
-				info = self.service('common').one('device_type', id=value['type_id'])
+			if value['type_id']:
+				info = self.service('common').one('setting_device', id=value['type_id'])
 				if info['id'] not in device_type:
 					device_type[info['id']] = {'name':info['name'], 'num':1, 'cdate':value['cdates']}
 				else:

+ 6 - 8
front/page/device.py

@@ -1,12 +1,10 @@
-#!/usr/bin/env python
 # -*- coding: utf-8 -*-
 """
     demeter web page
     name:device.py
     author:rabin
 """
-from __load__ import *
-from demeter.mqtt import *
+from .__load__ import *
 # 首页
 class index_path(Load):
 	@Web.auth
@@ -85,7 +83,7 @@ class screen_path(Load):
 		if self.data['device']:
 			for key, value in enumerate(self.data['device']):
 				if value['type_id'] > 0:
-					type_info = self.service('common').one('device_type', id=value['type_id'])
+					type_info = self.service('common').one('setting_device', id=value['type_id'])
 					self.data['device'][key]['unit'] = type_info['unit']
 					self.data['device'][key]['typeName'] = type_info['name']
 					if not device and not deviceInfo:
@@ -143,6 +141,7 @@ class screen_set_path(Load):
 		else:
 			value = self.data['setting']['farmInfo']['name']
 		key = 'update/w/' + id
+		from demeter.mqtt import Pub
 		pub = Pub()
 		pub.push(key, value)
 		state = self.service('common').update('farm', id, update)
@@ -170,7 +169,7 @@ class screens_path(Load):
 		if deviceList:
 			for key, value in enumerate(deviceList):
 				if value['type_id'] > 0:
-					type_info = self.service('common').one('device_type', id=value['type_id'])
+					type_info = self.service('common').one('setting_device', id=value['type_id'])
 					value['unit'] = type_info['unit']
 					value['typeName'] = type_info['name']
 					self.data['device'][str(value['farm_id'])].append(value)
@@ -242,7 +241,6 @@ class out_path(Load):
 	@Web.setting
 	def get(self):
 		#Device.out(self)
-		print 22
 		self.view("device/out.html")
 
 #设备日志
@@ -283,7 +281,7 @@ class update_device_path(Load):
 		if id:
 			self.data['set'] = self.service('common').one('device_info', id=id)
 			if self.data['set'] and self.data['set']['type_id'] > 0:
-				self.data['type'] = self.service('common').one('device_type', id=self.data['set']['type_id'])
+				self.data['type'] = self.service('common').one('setting_device', id=self.data['set']['type_id'])
 		self.view("device/alert/device.html")
 
 	@Web.auth
@@ -651,7 +649,7 @@ class set_condition_path(Load):
 				device = self.service('common').one('device_info', id=value['device_id'])
 				if device:
 					self.data['list'][key]['deviceName'] = device['name']
-					type_info = self.service('common').one('device_type', id=device['type_id'])
+					type_info = self.service('common').one('setting_device', id=device['type_id'])
 					self.data['list'][key]['unit'] = type_info['unit']
 
 		self.view("device/set/condition.html")

+ 1 - 1
front/page/main.py

@@ -5,7 +5,7 @@
     name:main.py
     author:rabin
 """
-from __load__ import *
+from .__load__ import *
 
 class Farm(object):
 	@staticmethod

+ 1 - 2
front/page/msg.py

@@ -1,11 +1,10 @@
-#!/usr/bin/env python
 # -*- coding: utf-8 -*-
 """
     demeter web page
     name:msg.py
     author:rabin
 """
-from __load__ import *
+from .__load__ import *
 
 class index_path(Load):
 	@Web.auth

+ 1 - 2
front/page/origin.py

@@ -1,11 +1,10 @@
-#!/usr/bin/env python
 # -*- coding: utf-8 -*-
 """
     demeter web page
     name:origin.py
     author:rabin
 """
-from __load__ import *
+from .__load__ import *
 #import qrcode
 from datetime import *
 import os

+ 2 - 3
front/page/upload.py

@@ -1,17 +1,16 @@
-#!/usr/bin/env python
 # -*- coding: utf-8 -*-
 """
     demeter web page
     name:upload.py
     author:rabin
 """
-from __load__ import *
+from .__load__ import *
 from datetime import *
 import os
 import uuid
 
 class upload_path(Load):
- 	@Web.auth
+	@Web.auth
 	@Web.setting
 	def post(self, *args, **kwargs):
 		url = self.request.protocol + "://" + self.request.host

+ 1 - 2
front/page/user.py

@@ -1,11 +1,10 @@
-#!/usr/bin/env python
 # -*- coding: utf-8 -*-
 """
     demeter web page
     name:user.py
     author:rabin
 """
-from __load__ import *
+from .__load__ import *
 
 class login_path(Load):
 	def get(self):

+ 1 - 2
front/page/work.py

@@ -1,11 +1,10 @@
-#!/usr/bin/env python
 # -*- coding: utf-8 -*-
 """
     demeter web page
     name:work.py
     author:rabin
 """
-from __load__ import *
+from .__load__ import *
 
 class Work(object):
 	@staticmethod

+ 1 - 1
front/templates/pc/device/alert/device.html

@@ -1,4 +1,4 @@
-<input type="hidden" name="id" id="id" value="{% if 'set' in data and data['set'] and 'id' in data['set'] and data['set']['id'] > 0 %}{{data['set']['id']}}{% end %}" />
+<input type="hidden" name="id" id="id" value="{% if 'set' in data and data['set'] and 'id' in data['set'] and data['set']['id'] %}{{data['set']['id']}}{% end %}" />
 
 {% if data['type']['unit'] %}
 <span style="color:#bababa;">单位:{{data['type']['unit']}}</span>

+ 12 - 7
front/templates/pc/device/inc/data.html

@@ -25,10 +25,15 @@
             <dd class="tit">{{value['name']}}</dd>          
         </dl>
         {% elif value['hardware_type'] == 2 or value['hardware_type'] == 4 %}
+        {% if value['value'] %}
         {%set v = float(value['value']) %}
+        {% else %}
+        {%set v = 0 %}
+        {%set value['value'] = 0 %}
+        {% end %}
         <dl>
             {% if 'noset' not in data %}
-            <dd class="controller">{% if value['status'] == False %}<em class="error">离线</em>{% elif value['max'] != None and v > value['max'] %}<em class="error">上限超标</em>{% elif value['min'] != None and v < value['min'] %}<em class="error">下限超标</em>{% else %}<em>正常</em>{% end %}<a href="javascript:;" onclick="Farm.Page('{{value['typeName']}}限制设置', '/device/update_device?id={{value['id']}}')" class="icons ico-setting"></a>
+            <dd class="controller">{% if not value['status'] %}<em class="error">离线</em>{% elif value['max'] != None and value['max'] and v > value['max'] %}<em class="error">上限超标</em>{% elif value['min'] != None and  value['min'] and v < value['min'] %}<em class="error">下限超标</em>{% else %}<em>正常</em>{% end %}<a href="javascript:;" onclick="Farm.Page('{{value['typeName']}}限制设置', '/device/update_device?id={{value['id']}}')" class="icons ico-setting"></a>
             </dd>
             {% end %}
             <dt>{{value['value']}}</dt>
@@ -37,32 +42,32 @@
         {% elif value['hardware_type'] == 3 and value['unit'] == 'button' %}
         <dl class="button">
             {% if 'noset' not in data %}
-            <dd class="controller">{% if value['status'] == False %}<em class="error">离线</em>{% end %}</dd>
+            <dd class="controller">{% if not value['status'] %}<em class="error">离线</em>{% end %}</dd>
             {% end %}
             {%set layer = '' %}
             {% if value['exp'] != '-1' and  value['exp'] != '1' and value['exp'] != 'None' and value['exp'] %}
             {%set layer = value['exp'] %}
             {% end %}
             <dt>
-                <button {% if layer %}data-hint="{{layer}}"{% end %} onclick="Farm.Button(this, '/device/update', '{{value['id']}}', 1, '#button_down_{{value['id']}}')" id="button_up_{{value['id']}}" class="btn-switch {% if layer and value['cxnum'] in (1,4) %}hint--top hint--error hint--always {% end %} {% if value['exp'] == '-1' and value['cxnum'] in (1,4) %}loading{% end %} {% if value['value'] in ('2','3') %}disabled{% end %} {% if value['value'] in ('1','4') %}open{% end %} {% if value['status'] == False %}disabled{% end %}">升</button>
+                <button {% if layer %}data-hint="{{layer}}"{% end %} onclick="Farm.Button(this, '/device/update', '{{value['id']}}', 1, '#button_down_{{value['id']}}')" id="button_up_{{value['id']}}" class="btn-switch {% if layer and value['cxnum'] in (1,4) %}hint--top hint--error hint--always {% end %} {% if value['exp'] == '-1' and value['cxnum'] in (1,4) %}loading{% end %} {% if value['value'] in ('2','3') %}disabled{% end %} {% if value['value'] in ('1','4') %}open{% end %} {% if not value['status'] %}disabled{% end %}">升</button>
 
-                <button {% if layer %}data-hint="{{layer}}"{% end %} onclick="Farm.Button(this, '/device/update', '{{value['id']}}', 5)" id="button_stop_{{value['id']}}" class="btn-switch {% if layer and value['cxnum'] == 5 %}hint--top hint--error hint--always {% end %} {% if value['exp'] == '-1' and value['cxnum'] == 5 %}loading{% end %} {% if value['value'] == '5' %}open{% end %} {% if value['status'] == False %}disabled{% end %}">停</button>
+                <button {% if layer %}data-hint="{{layer}}"{% end %} onclick="Farm.Button(this, '/device/update', '{{value['id']}}', 5)" id="button_stop_{{value['id']}}" class="btn-switch {% if layer and value['cxnum'] == 5 %}hint--top hint--error hint--always {% end %} {% if value['exp'] == '-1' and value['cxnum'] == 5 %}loading{% end %} {% if value['value'] == '5' %}open{% end %} {% if not value['status'] %}disabled{% end %}">停</button>
 
-                <button {% if layer %}data-hint="{{layer}}"{% end %} onclick="Farm.Button(this, '/device/update', '{{value['id']}}', 2, '#button_up_{{value['id']}}')" id="button_down_{{value['id']}}" class="btn-switch {% if layer and value['cxnum'] in (2,3) %}hint--top hint--error hint--always {% end %} {% if value['exp'] == '-1' and value['cxnum'] in (2,3) %}loading{% end %} {% if value['value'] in ('1','4') %}disabled{% end %} {% if value['value'] in ('2','3') %}open{% end %} {% if value['status'] == False %}disabled{% end %}">降</button>
+                <button {% if layer %}data-hint="{{layer}}"{% end %} onclick="Farm.Button(this, '/device/update', '{{value['id']}}', 2, '#button_up_{{value['id']}}')" id="button_down_{{value['id']}}" class="btn-switch {% if layer and value['cxnum'] in (2,3) %}hint--top hint--error hint--always {% end %} {% if value['exp'] == '-1' and value['cxnum'] in (2,3) %}loading{% end %} {% if value['value'] in ('1','4') %}disabled{% end %} {% if value['value'] in ('2','3') %}open{% end %} {% if not value['status'] %}disabled{% end %}">降</button>
             </dt>
             <dd class="tit">{{value['name']}}</dd>          
         </dl>
         {% elif value['hardware_type'] == 3 %}
         <dl>
             {% if 'noset' not in data %}
-            <dd class="controller">{% if value['status'] == False %}<em class="error">离线</em>{% end %}</dd>
+            <dd class="controller">{% if not value['status'] %}<em class="error">离线</em>{% end %}</dd>
             {% end %}
             {%set layer = '' %}
             {% if value['exp'] != '-1' and  value['exp'] != '1' and value['exp'] != 'None' and value['exp'] %}
             {%set layer = value['exp'] %}
             {% end %}
             <dt>
-                <p href="javascript:;" {% if layer %}data-hint="{{layer}}"{% end %} data-status="{% if value['value'] == '1' %}2{% else %}1{% end %}"  onclick="Farm.Switch(this, '/device/update', '{{value['id']}}')" class="{% if layer %}hint--top hint--error hint--always {% end %} {% if value['exp'] != '-1' and  value['exp'] != '1' %}data-layer{% end %} btn-switch {% if value['exp'] == '-1' %}loading{% end %} {% if value['value'] == '1' %}open{% end %} {% if value['status'] == False %}disabled{% end %}"><i></i></p>
+                <p href="javascript:;" {% if layer %}data-hint="{{layer}}"{% end %} data-status="{% if value['value'] == '1' %}2{% else %}1{% end %}"  onclick="Farm.Switch(this, '/device/update', '{{value['id']}}')" class="{% if layer %}hint--top hint--error hint--always {% end %} {% if value['exp'] != '-1' and  value['exp'] != '1' %}data-layer{% end %} btn-switch {% if value['exp'] == '-1' %}loading{% end %} {% if value['value'] == '1' %}open{% end %} {% if not value['status'] %}disabled{% end %}"><i></i></p>
             </dt>
             <dd class="tit">{{value['name']}}</dd>          
         </dl>

+ 1 - 1
front/templates/pc/inc/top.html

@@ -2,7 +2,7 @@
     <h1 style="font-weight: bold;">{{data['setting']['farmInfo']['name']}}</h1>
     <div class="menu">
         <ul>
-        	<li><a href="/msg" class="icons ico-msg">{% if 'msgNum' in data['setting'] and data['setting']['msgNum'] > 0 %}<i>{{data['setting']['msgNum']}}</i>{% end %}</a></li>
+        	<li><a href="/msg" class="icons ico-msg">{% if 'msgNum' in data['setting'] and data['setting']['msgNum'] %}<i>{{data['setting']['msgNum']}}</i>{% end %}</a></li>
             <li><a href="{% if 'web' in data['setting'] and data['setting']['web'] %}{{data['setting']['web']}}{% end %}" class="icons ico-home"></a></li>
             <li><a href="/user/login" class="icons ico-pwd"></a></li>
             <li><a href="/user/loginout" class="icons ico-quit"></a></li>

+ 5 - 2
modbus.py

@@ -8,11 +8,14 @@ from demeter.core import *
 
 param = {}
 param['method'] = 'm'
+param['id'] = 'i'
 Demeter.getopt(param)
 
 Demeter.echo(Demeter.option['method'])
 
-if Demeter.option['method'] == 'client':
-	Demeter.service('tcp', 'modbus').client()
+if Demeter.option['method'] == 'client' and Demeter.option['id']:
+    Demeter.service('tcp', 'modbus').client(Demeter.option['id'])
+elif Demeter.option['method'] == 'start':
+	Demeter.service('tcp', 'modbus').start()
 else:
 	Demeter.service('tcp', 'modbus').server()

+ 3 - 2
model/data.py

@@ -12,8 +12,9 @@ import calendar
 class Data(Model):
 	__table__ = 'data'
 
-	def setTable(self, data):
-		self.table = self.__table__ + '_' + str(data['farm']) + '_' + str(data['device']) + '1'
+	def setTable(self, data=False):
+		if data and 'farm' in data:
+			self.table = self.__table__ + '_' + str(data['farm']) + '_' + str(data['device']) + '1'
 
 	def insert(self, data):
 		self.setTable(data)

+ 1 - 1
model/device_page.py

@@ -4,7 +4,7 @@
     name:device_page.py
     author:rabin
 """
-from .__load__ import * *
+from .__load__ import *
 class Device_page(Model):
 	__table__ = 'device_page'
 	__comment__ = '设备页面管理'

+ 1 - 1
runtime/postgresql/device_gateway

@@ -1 +1 @@
-[["cdate", 1], ["id", 1], ["state", 1], ["server_id", 1], ["name", 1], ["camera", 1], ["product_id", 1], ["hardware_id", 1], ["pic", 1], ["stat", 1], ["farm_id", 1]]
+[["id", 1], ["product_id", 1], ["cdate", 1], ["stat", 1], ["camera", 1], ["name", 1], ["pic", 1], ["state", 1], ["farm_id", 1], ["server_id", 1], ["hardware_id", 1]]

+ 1 - 1
runtime/postgresql/device_info

@@ -1 +1 @@
-[["cxtype", 1], ["state", 1], ["min", 1], ["type_id", 1], ["cxnum", 1], ["oper", 1], ["name", 1], ["inorder", 1], ["udate", 1], ["gateway_id", 1], ["max", 1], ["id", 1], ["operdate", 1], ["farm_id", 1], ["hardware_type", 1], ["cxdate", 1], ["exp", 1], ["value", 1], ["cdate", 1], ["hardware_id", 1], ["status", 1]]
+[["cdate", 1], ["type_id", 1], ["product_id", 1], ["min", 1], ["exp", 1], ["value", 1], ["udate", 1], ["id", 1], ["oper", 1], ["cxdate", 1], ["name", 1], ["cxnum", 1], ["max", 1], ["hardware_type", 1], ["server_id", 1], ["hardware_id", 1], ["cxtype", 1], ["status", 1], ["inorder", 1], ["state", 1], ["farm_id", 1], ["operdate", 1], ["gateway_id", 1]]

+ 1 - 0
runtime/postgresql/device_mul

@@ -0,0 +1 @@
+[["devices", 1], ["id", 1], ["state", 1], ["oper", 1], ["value", 1], ["cdate", 1], ["name", 1], ["old", 1], ["farm_id", 1], ["device_type", 1]]

+ 1 - 0
runtime/postgresql/device_page

@@ -0,0 +1 @@
+[["ico", 1], ["cdate", 1], ["farm_id", 1], ["stat", 1], ["state", 1], ["name", 1], ["inorder", 1], ["id", 1]]

+ 1 - 0
runtime/postgresql/device_set_condition

@@ -0,0 +1 @@
+[["farm_id", 1], ["state", 1], ["notice", 1], ["device_id", 1], ["id", 1], ["cdate", 1], ["value", 1], ["condition", 1], ["devices", 1], ["oper", 1], ["status", 1]]

+ 1 - 0
runtime/postgresql/device_set_timing

@@ -0,0 +1 @@
+[["farm_id", 1], ["oper", 1], ["devices", 1], ["zdate", 1], ["id", 1], ["status", 1], ["cdate", 1], ["state", 1]]

+ 1 - 1
runtime/postgresql/farm

@@ -1 +1 @@
-[["name", 1], ["cdate", 1], ["welcome", 1], ["state", 1], ["pic", 1], ["info", 1], ["master_name", 1], ["location", 1], ["id", 1], ["gateway", 1], ["tel", 1], ["address", 1], ["master_pic", 1]]
+[["tel", 1], ["location", 1], ["id", 1], ["master_name", 1], ["gateway", 1], ["master_pic", 1], ["cdate", 1], ["state", 1], ["pic", 1], ["info", 1], ["address", 1], ["welcome", 1], ["name", 1]]

+ 1 - 0
runtime/postgresql/farm_env

@@ -0,0 +1 @@
+[["state", 1], ["inorder", 1], ["farm_id", 1], ["cdate", 1], ["id", 1], ["type_id", 1], ["name", 1], ["device_id", 1]]

+ 1 - 0
runtime/postgresql/farm_product

@@ -0,0 +1 @@
+[["state", 1], ["charact", 1], ["farm_id", 1], ["id", 1], ["pic", 1], ["status", 1], ["notice", 1], ["cdate", 1], ["area", 1], ["name", 1], ["yields", 1]]

+ 1 - 0
runtime/postgresql/farm_user

@@ -0,0 +1 @@
+[["mobile", 1], ["state", 1], ["cdate", 1], ["farm_id", 1], ["id", 1], ["username", 1], ["password", 1]]

+ 1 - 1
runtime/postgresql/farm_work

@@ -1 +1 @@
-[["state", 1], ["amount", 1], ["id", 1], ["land_id", 1], ["category_id", 1], ["method_id", 1], ["cdate", 1], ["farm_id", 1], ["pic", 1], ["workdate", 1]]
+[["land_id", 1], ["state", 1], ["pic", 1], ["method_id", 1], ["farm_id", 1], ["id", 1], ["amount", 1], ["category_id", 1], ["workdate", 1], ["cdate", 1]]

+ 1 - 1
runtime/postgresql/farm_work_category

@@ -1 +1 @@
-[["state", 1], ["id", 1], ["cdate", 1], ["farm_id", 1], ["name", 1]]
+[["id", 1], ["state", 1], ["name", 1], ["cdate", 1], ["farm_id", 1]]

+ 1 - 1
runtime/postgresql/farm_work_land

@@ -1 +1 @@
-[["state", 1], ["id", 1], ["cdate", 1], ["farm_id", 1], ["name", 1]]
+[["id", 1], ["state", 1], ["name", 1], ["cdate", 1], ["farm_id", 1]]

+ 1 - 0
runtime/postgresql/farm_work_method

@@ -0,0 +1 @@
+[["id", 1], ["state", 1], ["name", 1], ["cdate", 1], ["farm_id", 1], ["category_id", 1]]

+ 1 - 1
runtime/postgresql/hardware_type

@@ -1 +1 @@
-[["name", 1], ["cdate", 1], ["id", 1], ["state", 1], ["key", 1]]
+[["state", 1], ["cdate", 1], ["key", 1], ["name", 1], ["id", 1]]

+ 1 - 1
runtime/postgresql/manage_admin

@@ -1 +1 @@
-[["username", 1], ["state", 1], ["mobile", 1], ["role_id", 1], ["cdate", 1], ["password", 1], ["id", 1]]
+[["state", 1], ["password", 1], ["role_id", 1], ["id", 1], ["mobile", 1], ["username", 1], ["cdate", 1]]

+ 1 - 1
runtime/postgresql/manage_log

@@ -1 +1 @@
-[["cdate", 1], ["id", 1], ["state", 1], ["data", 1], ["model", 1], ["method", 1], ["admin_id", 1]]
+[["id", 1], ["model", 1], ["cdate", 1], ["data", 1], ["state", 1], ["method", 1], ["admin_id", 1]]

+ 1 - 1
runtime/postgresql/manage_role

@@ -1 +1 @@
-[["name", 1], ["top", 1], ["state", 1], ["oper", 1], ["auth", 1], ["cdate", 1], ["id", 1]]
+[["state", 1], ["oper", 1], ["top", 1], ["auth", 1], ["id", 1], ["cdate", 1], ["name", 1]]

+ 1 - 0
runtime/postgresql/msg

@@ -0,0 +1 @@
+[["link", 1], ["status", 1], ["device_id", 1], ["uid", 1], ["farm_id", 1], ["push", 1], ["content", 1], ["cdate", 1], ["id", 1], ["type_id", 1], ["state", 1]]

+ 1 - 1
runtime/postgresql/msg_type

@@ -1 +1 @@
-[["name", 1], ["push", 1], ["state", 1], ["key", 1], ["cdate", 1], ["id", 1]]
+[["state", 1], ["key", 1], ["id", 1], ["push", 1], ["cdate", 1], ["name", 1]]

+ 1 - 1
runtime/postgresql/notice_type

@@ -1 +1 @@
-[["name", 1], ["cdate", 1], ["id", 1], ["state", 1], ["key", 1]]
+[["state", 1], ["cdate", 1], ["key", 1], ["name", 1], ["id", 1]]

+ 1 - 0
runtime/postgresql/origin_batch

@@ -0,0 +1 @@
+[["land_id", 1], ["state", 1], ["device_camera_id", 1], ["product_id", 1], ["amount", 1], ["cdate", 1], ["csdate", 1], ["devices", 1], ["farm_id", 1], ["id", 1], ["zzdate", 1], ["number", 1], ["name", 1]]

+ 1 - 1
runtime/postgresql/setting_device

@@ -1 +1 @@
-[["name", 1], ["modbus_register_length", 1], ["modbus_register_address", 1], ["state", 1], ["modbus_slave_id", 1], ["unit", 1], ["product_id", 1], ["key", 1], ["oper_type", 1], ["exp", 1], ["data_type", 1], ["data_option", 1], ["cdate", 1], ["id", 1], ["modbus_register_type", 1]]
+[["modbus_register_length", 1], ["modbus_slave_id", 1], ["unit", 1], ["data_type", 1], ["cdate", 1], ["product_id", 1], ["state", 1], ["oper_type", 1], ["id", 1], ["key", 1], ["modbus_register_type", 1], ["exp", 1], ["data_option", 1], ["name", 1], ["modbus_register_address", 1]]

+ 1 - 1
runtime/postgresql/setting_product

@@ -1 +1 @@
-[["state", 1], ["id", 1], ["agreement", 1], ["cdate", 1], ["key", 1], ["name", 1]]
+[["state", 1], ["key", 1], ["name", 1], ["id", 1], ["cdate", 1], ["agreement", 1]]

+ 1 - 1
runtime/postgresql/setting_server

@@ -1 +1 @@
-[["id", 1], ["server_type", 1], ["cdate", 1], ["name", 1], ["server_host", 1], ["server_port", 1], ["state", 1]]
+[["state", 1], ["server_type", 1], ["server_port", 1], ["server_host", 1], ["id", 1], ["cdate", 1], ["name", 1]]

+ 3 - 3
service/device.py

@@ -138,7 +138,7 @@ class Device(object):
 			gateway_info = model.select(type='fetchone')
 
 			if info['type_id'] > 0:
-				model = Demeter.model('device_type')
+				model = Demeter.model('setting_device')
 				model.id = info['type_id']
 				type_info = model.select(type='fetchone')
 				if type_info:
@@ -197,7 +197,7 @@ class Device(object):
 
 	def msg(self, type_id, switch):
 		oper = ''
-		type_model = Demeter.model('device_type')
+		type_model = Demeter.model('setting_device')
 		type_model.id = type_id
 		type_info = type_model.select(type='fetchone')
 		if type_info['unit'] == 'button':
@@ -437,7 +437,7 @@ class Device(object):
 		Demeter.service('tcp', 'modbus').send(server, device, value)
 
 	def send_pub(self, type_info, gateway_info, info, value):
-		from demeter.mqtt import *
+		from demeter.mqtt import Pub
 		pub = Pub()
 		key = type_info['key'] + '/' + gateway_info['hardware_id']  + '/' + info['hardware_id']
 		update = 'update/' + key

+ 178 - 17
service/modbus/tcp.py

@@ -11,27 +11,163 @@ class Tcp(object):
 
 	def server(self):
 		# 启动服务
-		server = modbus_tcp.TcpServer(port=Demeter.config['modbus']['port'])
+		server = modbus_tcp.TcpServer(port=1152)
 		server.start()
 		slave_1 = server.add_slave(1)
-		slave_1.add_block('block1', modbus_tk.defines.ANALOG_INPUTS, 0, 2)
+		slave_1.add_block('block1', modbus_tk.defines.HOLDING_REGISTERS, 0, 16)
 
 		while 1:
-			bb = random.random()
-			aa = struct.unpack('>HH', struct.pack('>f', bb))
-			Demeter.echo('bb:' + str(bb))
-			Demeter.echo('aa:' + str(aa))
-			slave_1.set_values('block1', 0, aa)
+			tempr = round(((random.random()*1000)+10000), 2)
+			value = struct.unpack('>HH', struct.pack('>f', tempr))
+			Demeter.echo('tempr:' + str(tempr))
+			Demeter.echo('value:' + str(value))
+			slave_1.set_values('block1', 0, value)
 			Demeter.echo('=========')
 			time.sleep(3)
 
+	def server_s(self):
+		server = modbus_tk.modbus_tcp.TcpServer(port=1152, address='0.0.0.0', timeout_in_sec=3)       
+		server.start()  
+		slave_1 = server.add_slave(1)  
+		slave_3 = server.add_slave(3)
+		slave_2 = server.add_slave(2)
+		slave_5 = server.add_slave(5)
+		# 创建寄存器,寄存器的别名为block1,寄存器为保持寄存器(Holding_Register),寄存器起始地址为0,寄存器个数为...
+
+		slave_1.add_block('block1', modbus_tk.defines.HOLDING_REGISTERS, 0, 10) 
+		slave_3.add_block('block1', modbus_tk.defines.HOLDING_REGISTERS, 0, 2)
+		slave_2.add_block('block1', modbus_tk.defines.READ_INPUT_REGISTERS, 0, 44)
+		slave_5.add_block('block1', modbus_tk.defines.READ_INPUT_REGISTERS, 0, 28)
+
+		#给slave_1添加一个模块(模块名,只读,地址,长度)  
+		valueAll_1 = slave_1.get_values('block1', 0, 10)
+		print('valueAll--1: ', valueAll_1)
+
+		valueAll_3 = slave_3.get_values('block1', 0, 2)
+		print('valueAll--3: ', valueAll_3)
+
+		valueAll_2 = slave_2.get_values('block1', 0, 44)
+		print('valueAll--2: ', valueAll_2)
+
+		valueAll_5 = slave_5.get_values('block1', 0, 28)
+		print('valueAll--5: ', valueAll_5)
+
+		# value0 = slave_1.get_values('block1', 0, 1)   # 寄存器0000 -- 状态位初始值为全0
+		# print 'value0:  ', value0
+
+		while True:
+			# slave只set数据,不再读取数据,以防端口被占用,master读不上来
+			#value_all = slave_1.get_values('block1', 0, 10)
+			#sys.stdout.write('done: values read: %s\r\n' % (str(value_all)))    
+
+			# 室内温度
+			# 小数点后保留2位
+			tempr = round(((random.random()*1000)+10000), 2)
+
+			# 室内湿度
+			humid = round(((random.random()*1000)+10000), 2)
+
+			# 光照
+			sunlight = round(((random.random()*900)+10000), 2)
+
+			# CO2
+			co2 = round(((random.random()*1000)+10000), 2)
+
+			# 营养液温度
+			nuTempr = round(((random.random()*1000)+10000), 2)
+
+			# 含氧量
+			oxyg = round((random.uniform(200, 600)), 2)
+
+			# 室内温度1
+			tempr1 = round(random.uniform(10000, 20000), 2)
+
+			# 室内湿度1
+			humid1 = round(random.uniform(10000, 12000), 2)
+
+			# CO2_1
+			co2_1 = round(random.uniform(10000, 15000), 2)
+
+			# 瓶内温度1
+			bo_tempr1 = round(random.uniform(10000, 20000), 2)
+
+			# 室内温度2
+			tempr2 = round(random.uniform(10000, 20000), 2)
+
+			# 室内湿度2
+			humid2 = round(random.uniform(10000, 13000), 2)
+
+			# CO2
+			co2_2 = round(random.uniform(10000, 20000), 2)
+
+			# 瓶内温度2
+			bo_tempr2 = round(random.uniform(10000, 14000), 2)
+
+			# slave_1
+			slave_1.set_values('block1', 1, tempr) 
+			slave_1.set_values('block1', 3, humid)
+			slave_1.set_values('block1', 5, sunlight)
+			slave_1.set_values('block1', 7, co2)
+			slave_1.set_values('block1', 9, nuTempr)
+
+			#slave_3
+			slave_3.set_values('block1', 1, oxyg) 
+
+			# slave_2
+			slave_2.set_values('block1', 0, tempr1) 
+			slave_2.set_values('block1', 1, humid1)
+			slave_2.set_values('block1', 2, co2_1)
+			slave_2.set_values('block1', 3, bo_tempr1)
+			slave_2.set_values('block1', 8, tempr2)
+			slave_2.set_values('block1', 9, humid2) 
+			slave_2.set_values('block1', 10, co2_2)
+			slave_2.set_values('block1', 11, bo_tempr2)
+			slave_2.set_values('block1', 16, tempr1)
+			slave_2.set_values('block1', 17, humid1)
+			slave_2.set_values('block1', 18, co2_1)
+			slave_2.set_values('block1', 19, bo_tempr1)
+			slave_2.set_values('block1', 24, tempr2)
+			slave_2.set_values('block1', 25, humid2)
+			slave_2.set_values('block1', 26, co2_2)
+			slave_2.set_values('block1', 27, bo_tempr2)
+			slave_2.set_values('block1', 32, tempr1)
+			slave_2.set_values('block1', 33, humid1)
+			slave_2.set_values('block1', 34, co2_1)
+			slave_2.set_values('block1', 35, bo_tempr1)
+			slave_2.set_values('block1', 40, tempr2)
+			slave_2.set_values('block1', 41, humid2)
+			slave_2.set_values('block1', 42, co2_2)
+			slave_2.set_values('block1', 43, bo_tempr2)
+
+			# slave_5
+			slave_5.set_values('block1', 0, tempr1) 
+			slave_5.set_values('block1', 1, humid1)
+			slave_5.set_values('block1', 2, co2_1)
+			slave_5.set_values('block1', 3, bo_tempr1)
+			slave_5.set_values('block1', 8, tempr2)
+			slave_5.set_values('block1', 9, humid2) 
+			slave_5.set_values('block1', 10, co2_2)
+			slave_5.set_values('block1', 11, bo_tempr2)
+			slave_5.set_values('block1', 16, tempr1)
+			slave_5.set_values('block1', 17, humid1)
+			slave_5.set_values('block1', 18, co2_1)
+			slave_5.set_values('block1', 19, bo_tempr1)
+			slave_5.set_values('block1', 24, tempr2)
+			slave_5.set_values('block1', 25, humid2)
+			slave_5.set_values('block1', 26, co2_2)
+			slave_5.set_values('block1', 27, bo_tempr2)
+
+
+			print('======================')
+			time.sleep(1)
+
 	def master(self, master, id):
-		info = Demeter.service('common').list('device_info', search={server_id:id})
+		info = Demeter.service('common').list('device_info', search={'server_id':id})
 		if info:
 			for v in info:
 				if v['type_id']:
 					device = Demeter.service('common').one('setting_device', id=v['type_id'])
-					if device.oper_type == 1:
+					if device['oper_type'] == 1:
 						self.setValue(device, master, v)
 
 	def setValue(self, device, master, info):
@@ -43,7 +179,7 @@ class Tcp(object):
 		config['child'] = info['hardware_id']
 		value = self.getValue(device, master, info)
 		name = info['name']
-		device_type = device['id']
+		device_type = device
 		Demeter.service('device').save(config,value, name, device_type)
 
 	def getValue(self, device, master, info):
@@ -57,7 +193,13 @@ class Tcp(object):
 		elif device['modbus_register_type'] == 4:
 			modbus_register_type = mdef.READ_INPUT_REGISTERS
 
-		value = master.execute(device['modbus_slave_id'], modbus_register_type, device['modbus_register_address'], device['modbus_register_length'])
+		temp = master.execute(int(device['modbus_slave_id']), modbus_register_type, int(device['modbus_register_address']), int(device['modbus_register_length']))
+
+		#Demeter.echo('temp:' + str(temp) + 'size:' + str(len(temp)))
+		value = struct.unpack('>f', struct.pack('>HH', temp[0], temp[1]))
+		value = str(round(value[0], 2))
+		#print(value)
+
 		
 		if 'exp' in device:
 			value = Demeter.exp(device['exp'], value)
@@ -66,7 +208,7 @@ class Tcp(object):
 		return value
 
 	def send(self, server, device, info, value):
-		master = modbus_tcp.TcpMaster(host=server['host'], port=server['port'])
+		master = modbus_tcp.TcpMaster(host=server['host'], port=int(server['port']))
 		master.set_timeout(30)  #timeout表示若超过3秒没有连接上slave就会自动断开
 		if 'exp' in device:
 			value = Demeter.exp(device['exp'], value)
@@ -92,15 +234,34 @@ class Tcp(object):
 			result = master.execute(device['modbus_slave_id'], modbus_register_type, device['modbus_register_address'], len(value))
 		return result
 
-	def client(self):
-		server = Demeter.service('common').list('setting_server', search={server_type:2})
+	def start(self):
+		server = Demeter.service('common').list('setting_server', search={'server_type':2})
 		if server:
+			modbus = Demeter.path + 'modbus.py'
 			for v in server:
-				master = modbus_tcp.TcpMaster(host=v['host'], port=v['port'])
-				master.set_timeout(300)  #timeout表示若超过3秒没有连接上slave就会自动断开
-				self.master(master, v['id'])
+				Shell.popen('python3 ' + modbus + ' -m client -i ' + v['id'])
+
+	def client(self, id):
+		server = Demeter.service('common').one('setting_server', id=id)
+		master = modbus_tcp.TcpMaster(host=server['server_host'], port=int(server['server_port']))
+		master.set_timeout(300)  #timeout表示若超过300秒没有连接上slave就会自动断开
+		while(True):
+			self.master(master, server['id'])
 
 	def test(self):
+		master = modbus_tcp.TcpMaster(host="192.168.33.10", port=1152)
+		master.set_timeout(3)  #timeout表示若超过3秒没有连接上slave就会自动断开
+		tempr = master.execute(1, modbus_tk.defines.READ_HOLDING_REGISTERS, 0, 2)
+		#(slave id,只读,block地址,长度:即字节乘个数)
+		Demeter.echo('tempr:' + str(tempr) + 'size:' + str(len(tempr)))
+		value = struct.unpack('>f', struct.pack('>HH', tempr[0], tempr[1]))
+		#在slave中,是先打包成'>f'在以'>HH'解包的,在master中刚好相反
+		#struct.unpack里解出来的是一个元组,可以用bb, = 或者输出bb[0]
+		print(value)
+		Demeter.echo('value:' + str(round(value[0], 2)))
+		time.sleep(3)
+
+	def test1(self):
 		master = modbus_tcp.TcpMaster(host="192.168.33.10", port=1152)
 		master.set_timeout(3)  #timeout表示若超过3秒没有连接上slave就会自动断开
 		aa = master.execute(1, modbus_tk.defines.ANALOG_INPUTS, 0, 2)

+ 1 - 1
service/setting/core.py

@@ -16,7 +16,7 @@ class Core(object):
         ,{'id':4,'name':'输入寄存器'}]
 
     def oper_type(self):
-        return [{'id':1,'name':'读取'},{'id':2,'name':'写入'},{'id':3,'name':'拍照'},{'id':4,'name':'摄像'}]
+        return [{'id':1,'name':'读取'},{'id':2,'name':'写入'}]
 
     def data_type(self):
         return [