rabin 4 years ago
parent
commit
2514fe9388

+ 11 - 2
admin/page/device.py

@@ -143,12 +143,21 @@ class info_path(Load):
 					else:
 						status = 'disabled'
 					url = '/device/info'
-					if value['value'] == '1':
+					import math
+					value['value'] = math.ceil(float(value['value']))
+					if value['value'] == 1:
+						value['value'] = '开'
+					else:
+						value['value'] = '关'
+
+					'''
+					if value['value'] == 1:
 						#disabled
 						self.data['list'][key]['value'] = '<input type="checkbox" name="switch" lay-filter="switch" lay-skin="switch" checked '+status+' value="1" data-value="0" data-id="'+value['id']+'" data-url="'+url+'">'
 					else:
 						self.data['list'][key]['value'] = '<input type="checkbox" lay-filter="switch" name="switch" lay-skin="switch" '+status+' value="0" data-value="1" data-id="'+value['id']+'" data-url="'+url+'">'
-					self.data['list'][key]['value'] = ''
+					'''
+					self.data['list'][key]['value'] = value['value']
 				elif value['hardware_type'] == 5:
 					if value['value'] == '1':
 						self.data['list'][key]['value'] = '已连接'

+ 6 - 6
admin/page/setting.py

@@ -33,8 +33,8 @@ class server_update_path(Load):
 	def get(self):
 		self.set(
 			path = '/setting/server'
-			,label = (u'服务名称',u'服务类型',u'服务地址',u'服务端口')
-			,update = ('name-input-required','server_type-select-required','server_host-input-required','server_port-input-required')
+			,label = (u'服务名称',u'服务类型',u'服务地址',u'服务端口',u'请求间隔')
+			,update = ('name-input-required','server_type-select-required','server_host-input-required','server_port-input-required','server_time-input-required')
 			,update_server_type = Demeter.service('core', 'setting').server_type()
 		)
 		self.one('setting_server')
@@ -154,12 +154,12 @@ class modbus_code_update_path(Load):
 	def get(self):
 		self.set(
 			path = '/setting/modbus_code'
-			,label = (u'命令码名称',u'所属产品',u'设备类型',u'表达式',u'硬件类型',u'操作类型',u'从机id',u'寄存器类型',u'寄存器地址')
-			,update = ('name-input-required','product_id-select-required','device_type_key-text-required-直接输入设备类型的key,多个用换行隔开','exp-text--{n}为当前数据,多个用换行隔开','hardware_type-select-required','oper_type-select-required','slave_id-input-required','register_type-select-required','register_address-text-required-多个用换行隔开,地址,长度')
+			,label = (u'命令码名称',u'所属产品',u'设备类型',u'表达式',u'硬件类型',u'从机id',u'寄存器读取地址',u'寄存器写入地址')
+			,update = ('name-input-required','product_id-select-required','device_type_key-text-required-直接输入设备类型的key,多个用换行隔开','exp-text--{n}为当前数据,多个用换行隔开','hardware_type-select-required','slave_id-input-required','register_read_address-text-required-多个用换行隔开,寄存器类型,地址,长度','register_write_address-text--多个用换行隔开,寄存器类型,地址,长度(可为空)')
 			,update_product_id = self.service('common').list('setting_product')
 			,update_device_type = self.service('common').list('setting_device_type')
-			,update_oper_type = Demeter.service('core', 'setting').oper_type()
-			,update_register_type = Demeter.service('core', 'setting').register_type()
+			#,update_oper_type = Demeter.service('core', 'setting').oper_type()
+			#,update_register_type = Demeter.service('core', 'setting').register_type()
 			,update_hardware_type = self.service('common').list('hardware_type')
 		)
 		self.one('setting_modbus_code')

+ 8 - 181
cron.py

@@ -1,192 +1,19 @@
-#!/usr/bin/env python
 # -*- coding: utf-8 -*-
 """
     demeter web
     name:admin.py
     author:rabin
 """
-import time
 from demeter.core import *
-from gevent import monkey; monkey.patch_socket()
-import gevent
-from pic import pic
-from demeter.mqtt import *
-# 处理定时命令、周期命令、条件控制、消息、设备状态等
-timeSleep = 10
 
-# 开关设备
-def switch(value):
-	Demeter.service('device').switchMul(value)
-				
+param = {}
+param['method'] = 'm'
+Demeter.getopt(param)
 
-# 更改设备状态(离线)
-def device():
-	while 1:
-		model = Demeter.model('device_info')
-		cur = Demeter.time() - 1800
-		model.cdate.assgin(cur, '<=')
-		model.status = True
-		data = model.select()
-		for v in data:
-			model.id = v['id']
-			if v['hardware_type'] == 5:
-				model.update(value='0', status=False)
-			elif v['hardware_type'] != 7 and v['hardware_type'] != 6:
-				model.update(status=False)
-		gevent.sleep(60)
+Demeter.echo(Demeter.option['method'])
 
-# 更改控制设备的超时状态
-def control():
-	while 1:
-		model = Demeter.model('device_info')
-		cur = Demeter.time() - 10
-		model.operdate.assgin(cur, '<=')
-		model.oper = True
-		model.hardware_type = 3
-		service = Demeter.service('device')
-		data = model.select()
-		if data:
-			for v in data:
-				model.id = v['id']
-				if v['exp'] == '-1':
-					msg = service.notice('timeout')
-					service.mul(v, v['name'] + '失败:' + msg, False)
-					model.update(exp=msg, oper=True, operdate=Demeter.time())
-				else:
-					msg = '1'
-					service.mul(v, '', True)
-					model.update(exp=msg, oper=False, operdate=Demeter.time())
+method = Demeter.option['method']
 
-		gevent.sleep(1)
-		
-
-# 批量控制的队列 这块有点乱,但时间太紧,只有两天时间,以后改造优化
-def mulQueue():
-	while 1:
-		mul_model = Demeter.model('device_mul')
-		device_model = Demeter.model('device_info')
-		model = Demeter.model('device_mul_queue')
-
-		model.status = 1
-		data = model.select(type='fetchone', order='inorder asc,udate asc,hardware_id asc')
-		service = Demeter.service('device')
-
-		# 查看当前有没有正在执行的设备,如果有,不能继续执行了
-		msg = service.notice('timeout')
-		device_model.oper = True
-		device_model.exp.nq(msg)
-		device_model.hardware_type = 3
-		device = device_model.select(type='fetchone')
-
-		if not device and data and not data['operstate']:
-			service.switch(data['device_id'], switch=data['value'], mul=False, queue=data['id'])
-			model.id = data['id']
-			model.update(operstate=True)
-			#mul_model.id = data['mul_id']
-			#mul_model.update(oper='')
-
-		# 将执行完成的进行清理
-		mul_model.oper.nq('')
-		data = mul_model.select()
-		if data:
-			for v in data:
-				devicesNum = len(tuple(eval(v['devices'])))
-				model.status.ins((2,3))
-				cur = Demeter.time() - 10
-				model.operdate.assgin(cur, '<=')
-				queue = model.select()
-				num = len(queue)
-				if num == devicesNum:
-					errorNum = 0
-					model.mul_id = v['id']
-					model.update(status=4)
-					for qv in queue:
-						if qv['status'] == 3:
-							errorNum = errorNum + 1
-					mul_model.id = v['id']
-					if errorNum == devicesNum:
-						mul_model.update(oper='', value=v['old'])
-					else:
-						mul_model.update(oper='')
-
-		gevent.sleep(1)
-
-# 批量控制的队列清理,10小时清理一次24小时之前完成的数据
-def mulQueueDrop():
-	while 1:
-		num = 3600*24
-		model = Demeter.model('device_mul_queue')
-		model.status = 4
-		cur = Demeter.time() - num
-		model.operdate.assgin(cur, '<=')
-		model.delete()
-
-		gevent.sleep(36000)
-
-def timing():
-	while 1:
-		model = Demeter.model('device_set_timing')
-		model.status = 0
-		cur = Demeter.time()
-		model.zdate.assgin(cur, '<=')
-		data = model.select()
-		if data:
-			for value in data:
-				switch(value)
-				model.id = value['id']
-				model.update(status=1)
-		gevent.sleep(timeSleep)
-
-def loop():
-	while 1:
-		model = Demeter.model('device_set_loop')
-		cur = Demeter.time()
-		date = Demeter.date(cur, '%Y-%m-%d-%w-%H-%M')
-		date = date.split('-')
-		week = date[3]
-		day = date[2]
-		model.status = True
-		model.hour = date[4]
-		model.minute = date[5]
-		data = model.select()
-		if data:
-			for value in data:
-				state = False
-				value['loop'] = value['loop'].split(',')
-				if value['looptype'] == 2:
-					if week in value['loop']:
-						state = True
-				elif value['looptype'] == 3:
-					if day in value['loop']:
-						state = True
-				if state:
-					switch(value)
-		gevent.sleep(timeSleep)
-
-def savePic():
-	while 1:
-		pic()
-		gevent.sleep(1800)
-
-# 同步时间,24小时同步一次
-def timeSync():
-	while 1:
-		pub = Pub()
-		key = 'time/bh'
-		value = Demeter.date(Demeter.time())
-		pub.push(key, value)
-		gevent.sleep(3600*24)
-
-def handle():
-	gevent.joinall([
-		gevent.spawn(timing),
-		gevent.spawn(loop),
-		gevent.spawn(device),
-		gevent.spawn(savePic),
-		gevent.spawn(control),
-		gevent.spawn(timeSync),
-		gevent.spawn(mulQueue),
-		gevent.spawn(mulQueueDrop),
-	])
-
-handle()
+cron = Demeter.service(method, 'cron')
+while(True):
+	cron.handle()

+ 3 - 2
install.py

@@ -33,8 +33,8 @@ def device():
 
 	# 初始化默认服务
 	setting_server = (
-		{'name':'默认mqtt服务', 'server_type':1, 'server_host': '192.168.33.10', 'server_port':'8010'}
-		,{'name':'默认modbusTcp服务', 'server_type':2, 'server_host': '192.168.33.10', 'server_port':'8010'}
+		{'name':'默认mqtt服务', 'server_type':1, 'server_host': '192.168.33.10', 'server_port':'8010', 'server_time': '200'}
+		,{'name':'默认modbusTcp服务', 'server_type':2, 'server_host': '192.168.33.10', 'server_port':'8010', 'server_time': '200'}
 		)
 	model = Demeter.model('setting_server')
 	for value in setting_server:
@@ -47,6 +47,7 @@ def device():
 			model.server_type = value['server_type']
 			model.server_host = value['server_host']
 			model.server_port = value['server_port']
+			model.server_time = value['server_time']
 			model.insert()
 
 	# 初始化默认产品

+ 17 - 7
modbus.py

@@ -14,11 +14,21 @@ Demeter.getopt(param)
 
 Demeter.echo(Demeter.option['method'])
 
-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()
-elif Demeter.option['method'] == 'server':
-	Demeter.service('tcp', 'modbus').server()
+method = ''
+if 'tcp' in Demeter.option['method']:
+	method = 'tcp'
 else:
-	Demeter.service('tcp', 'modbus').test2()
+	method = 'rtu'
+
+if Demeter.option['method'] == method + '_client' and Demeter.option['id']:
+	# 测试某一个客户端
+	Demeter.service(method, 'modbus').client(Demeter.option['id'])
+elif Demeter.option['method'] == method + '_start':
+	# 启动所有客户端
+	Demeter.service(method, 'modbus').start()
+elif Demeter.option['method'] == method + 'server':
+	# 启动服务端
+	Demeter.service(method, 'modbus').server()
+else:
+	# 测试
+	Demeter.service('old', 'modbus').server()

+ 3 - 0
model/device_info.py

@@ -13,12 +13,15 @@ class Device_info(Model):
 	id = Fields(type='uuid', primaryKey=True, comment='设备ID', uuid='farm_id')
 	farm_id = Fields(type='int', default='setting.farm', comment='园区ID', match='not')
 	name = Fields(type='varchar(50)', comment='设备名')
+	#hardware_id = Fields(type='bigint', comment='硬件id', match='number|硬件id必须是数字', unique=True)
 	hardware_id = Fields(type='bigint', comment='硬件id', match='number|硬件id必须是数字')
 	hardware_type = Fields(type='int', comment='硬件类型')
 	server_id = Fields(type='int', comment='服务id')
 	product_id = Fields(type='int', comment='产品id')
 	gateway_id = Fields(type='uuid', comment='网关id')
 	type_id = Fields(type='int', comment='设备类型id')
+	code_id = Fields(type='int', comment='命令码id')
+	code_index = Fields(type='int', comment='命令码索引key')
 	value = Fields(type='varchar(1000)', comment='设备传过来的值')
 	exp = Fields(type='varchar(500)', comment='表达式')
 	max = Fields(type='float', comment='最大上限', match='numberFloat|最大上限必须是数字')

+ 3 - 4
model/setting_modbus_code.py

@@ -15,9 +15,8 @@ class Setting_modbus_code(Model):
 	product_id = Fields(type='int', comment='产品id')
 	exp = Fields(type='varchar(300)', comment='设备计算公式,多个用换行隔开')
 	hardware_type = Fields(type='int', comment='硬件类型')
-	oper_type = Fields(type='int', comment='1读取2写入')
-	slave_id = Fields(type='int', comment='从机id', unique=True)
-	register_type = Fields(type='int', comment='寄存器类型')
-	register_address = Fields(type='varchar(200)', comment='寄存器地址和长度,多个用换行隔开,与设备名称对应')
+	slave_id = Fields(type='int', comment='从机id')
+	register_read_address = Fields(type='varchar(200)', comment='寄存器读取地址和长度,多个用换行隔开,与设备名称对应')
+	register_write_address = Fields(type='varchar(200)', comment='寄存器写入地址和长度,多个用换行隔开,与设备名称对应')
 	state = Fields(type='boolean', default='True', comment='数据存在状态')
 	cdate = Fields(type='int', default='time', comment='创建时间')

+ 1 - 0
model/setting_server.py

@@ -14,5 +14,6 @@ class Setting_server(Model):
 	server_type = Fields(type='int', comment='服务协议类型1mqtt2modbus_tcp3modbus_rtu')
 	server_host = Fields(type='varchar(50)', comment='服务地址')
 	server_port = Fields(type='varchar(50)', comment='服务端口')
+	server_time = Fields(type='varchar(50)', comment='每次请求时间间隔,直接填写秒数')
 	state = Fields(type='boolean', default='True', comment='数据存在状态')
 	cdate = Fields(type='int', default='time', comment='创建时间')

+ 1 - 1
runtime/postgresql/device_gateway

@@ -1 +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]]
+[["cdate", 1], ["server_id", 1], ["id", 1], ["state", 1], ["product_id", 1], ["stat", 1], ["hardware_id", 1], ["camera", 1], ["pic", 1], ["farm_id", 1], ["name", 1]]

+ 1 - 1
runtime/postgresql/device_info

@@ -1 +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]]
+[["code_id", 1], ["status", 1], ["farm_id", 1], ["product_id", 1], ["cxdate", 1], ["udate", 1], ["operdate", 1], ["cxnum", 1], ["max", 1], ["hardware_type", 1], ["value", 1], ["server_id", 1], ["min", 1], ["type_id", 1], ["state", 1], ["id", 1], ["cdate", 1], ["code_index", 1], ["inorder", 1], ["name", 1], ["cxtype", 1], ["exp", 1], ["hardware_id", 1], ["oper", 1], ["gateway_id", 1]]

+ 1 - 1
runtime/postgresql/device_mul

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

+ 1 - 1
runtime/postgresql/device_page

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

+ 1 - 1
runtime/postgresql/device_set_condition

@@ -1 +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]]
+[["device_id", 1], ["cdate", 1], ["value", 1], ["notice", 1], ["farm_id", 1], ["state", 1], ["status", 1], ["id", 1], ["oper", 1], ["condition", 1], ["devices", 1]]

+ 0 - 1
runtime/postgresql/device_set_timing

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

+ 1 - 1
runtime/postgresql/farm

@@ -1 +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]]
+[["location", 1], ["welcome", 1], ["master_name", 1], ["cdate", 1], ["state", 1], ["master_pic", 1], ["gateway", 1], ["name", 1], ["info", 1], ["id", 1], ["address", 1], ["tel", 1], ["pic", 1]]

+ 0 - 1
runtime/postgresql/farm_env

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

+ 1 - 1
runtime/postgresql/farm_product

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

+ 1 - 1
runtime/postgresql/farm_user

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

+ 1 - 1
runtime/postgresql/farm_work

@@ -1 +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]]
+[["cdate", 1], ["method_id", 1], ["id", 1], ["land_id", 1], ["state", 1], ["category_id", 1], ["workdate", 1], ["pic", 1], ["farm_id", 1], ["amount", 1]]

+ 1 - 1
runtime/postgresql/farm_work_category

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

+ 1 - 1
runtime/postgresql/farm_work_land

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

+ 0 - 1
runtime/postgresql/farm_work_method

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

+ 1 - 1
runtime/postgresql/hardware_type

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

+ 1 - 1
runtime/postgresql/manage_admin

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

+ 1 - 1
runtime/postgresql/manage_log

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

+ 1 - 1
runtime/postgresql/manage_role

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

+ 1 - 1
runtime/postgresql/msg

@@ -1 +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]]
+[["push", 1], ["content", 1], ["uid", 1], ["status", 1], ["cdate", 1], ["state", 1], ["farm_id", 1], ["link", 1], ["type_id", 1], ["device_id", 1], ["id", 1]]

+ 1 - 1
runtime/postgresql/msg_type

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

+ 1 - 1
runtime/postgresql/notice_type

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

+ 0 - 1
runtime/postgresql/origin_batch

@@ -1 +0,0 @@
-[["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]]

+ 0 - 1
runtime/postgresql/setting_device

@@ -1 +0,0 @@
-[["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], ["key", 1], ["name", 1], ["id", 1], ["cdate", 1], ["agreement", 1]]
+[["name", 1], ["id", 1], ["key", 1], ["cdate", 1], ["state", 1], ["agreement", 1]]

+ 1 - 1
runtime/postgresql/setting_server

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

+ 30 - 6
test.py

@@ -1,9 +1,33 @@
 # -*- coding: utf-8 -*-
-"""
-    demeter web
-    name:admin.py
-    author:rabin
-"""
+
+import os
+import sys
+import time
 from demeter.core import *
+from daemon import Daemon
+
+class MyTestDaemon(Daemon):
+	def run(self):
+		sys.stdout.write('Daemon started with pid {}\n'.format(os.getpid()))
+		while True:
+			sys.stdout.write('Daemon Alive! {}\n'.format(time.ctime()))
+			sys.stdout.flush()
+
+			time.sleep(5)
+
+if __name__ == '__main__':
+	daemon = MyTestDaemon(key='deamon')
+
+	if len(sys.argv) != 2:
+		print('Usage: {} [start|stop]'.format(sys.argv[0]), file=sys.stderr)
+		raise SystemExit(1)
 
-Demeter.service('tcp', 'modbus').server()
+	if 'start' == sys.argv[1]:
+		daemon.start()
+	elif 'stop' == sys.argv[1]:
+		daemon.stop()
+	elif 'restart' == sys.argv[1]:
+		daemon.restart()
+	else:
+		print('Unknown command {!r}'.format(sys.argv[1]), file=sys.stderr)
+		raise SystemExit(1)