|
From: <ni...@us...> - 2010-11-10 16:20:07
|
Revision: 101
http://openautomation.svn.sourceforge.net/openautomation/?rev=101&view=rev
Author: nilss1
Date: 2010-11-10 16:20:00 +0000 (Wed, 10 Nov 2010)
Log Message:
-----------
added sendcycle for datastore objects added sendcycleoption average
Modified Paths:
--------------
PyWireGate/trunk/datastore.py
PyWireGate/trunk/owfs_connector/OWFS_Connector.py
PyWireGate/trunk/owfs_connector/sensors.ini
Modified: PyWireGate/trunk/datastore.py
===================================================================
--- PyWireGate/trunk/datastore.py 2010-11-10 14:35:53 UTC (rev 100)
+++ PyWireGate/trunk/datastore.py 2010-11-10 16:20:00 UTC (rev 101)
@@ -33,6 +33,10 @@
self.log("DATASTORE starting up")
self.DBLOADED = False
self.dataobjects = {}
+
+ self.cycleThreadLock = threading.RLock()
+ self.cycleThreads = {}
+
self.locked = threading.RLock()
self.locked.acquire()
## Load JSON Database
@@ -141,8 +145,37 @@
dbfile.write(utfdb)
dbfile.close()
+
+ def attachThread(self,obj,threadObj=False):
+ try:
+ self.cycleThreadLock.acquire()
+ ## check only
+ if not threadObj:
+ return obj in self.cycleThreads
+ self.cycleThreads[obj] = threadObj
+ finally:
+ self.cycleThreadLock.release()
+
+ return self.cycleThreads[obj]
+
+
+ def removeThread(self,obj):
+ self.cycleThreadLock.acquire()
+ del self.cycleThreads[obj]
+ self.cycleThreadLock.release()
+
+
def shutdown(self):
+ self.cycleThreadLock.acquire()
+ for obj in self.cycleThreads:
+ try:
+ obj.cancel()
+ obj.join()
+ except:
+ pass
+ self.cycleThreadLock.release()
self.save()
+
def debug(self,msg):
####################################################
@@ -198,6 +231,8 @@
## connector specific vars
self.config = {}
+ self.cyclestore = []
+
## connected Logics, communication objects ... goes here
self.connected = []
@@ -213,6 +248,23 @@
self.write_mutex.release()
def setValue(self,val,send=False):
+ if 'sendcycle' in self.config:
+ if not self.WG.DATASTORE.attachThread(self):
+ self._parent.debug("start Cycle ID: %s" % self.id)
+ cycletime = float(self.config['sendcycle']) + self.lastupdate - time.time()
+ if cycletime < 0.0:
+ cycletime = 0
+ self.cyclestore.append(val)
+ _cyclethread = self.WG.DATASTORE.attachThread(self,threading.Timer(cycletime,self._cycle))
+ #_cyclethread.setDaemon(1)
+ _cyclethread.start()
+ else:
+ self._parent.debug("ignore Cycle ID: %s" % self.id)
+ self.cyclestore.append(val)
+ else:
+ self._real_setValue(val,send)
+
+ def _real_setValue(self,val,send):
try:
## get read lock
self.read_mutex.acquire()
@@ -241,4 +293,18 @@
## release lock
self.read_mutex.release()
-
+ def _cycle(self):
+ self._parent.debug("execute Cycle ID: %s" % self.id)
+ self.WG.DATASTORE.removeThread(self)
+ val = self.getValue()
+ if 'sendcycleoption' in self.config:
+ if self.config['sendcycleoption'] == 'average' and type(self.cyclestore[0]) in (int,float):
+ val = type(self.cyclestore[0])(0)
+ for i in self.cyclestore:
+ val += i
+ val = val / len(self.cyclestore)
+ self._parent.debug("Cycle ID: %s average: %f (%r)" % (self.id, val, self.cyclestore ))
+ self.cyclestore = []
+ else:
+ val = self.cyclestore.pop()
+ self._real_setValue(val,False)
Modified: PyWireGate/trunk/owfs_connector/OWFS_Connector.py
===================================================================
--- PyWireGate/trunk/owfs_connector/OWFS_Connector.py 2010-11-10 14:35:53 UTC (rev 100)
+++ PyWireGate/trunk/owfs_connector/OWFS_Connector.py 2010-11-10 16:20:00 UTC (rev 101)
@@ -37,7 +37,7 @@
self.mutex = threading.RLock()
defaultconfig = {
- 'cycletime' : 60,
+ 'cycletime' : 15,
'server' : '127.0.0.1',
'port' : 4304
}
Modified: PyWireGate/trunk/owfs_connector/sensors.ini
===================================================================
--- PyWireGate/trunk/owfs_connector/sensors.ini 2010-11-10 14:35:53 UTC (rev 100)
+++ PyWireGate/trunk/owfs_connector/sensors.ini 2010-11-10 16:20:00 UTC (rev 101)
@@ -2,9 +2,11 @@
[DS18B20]
-cycle = 60
+cycle = 15
interfaces = temperature,power
config_temperature_resolution = 10
+config_temperature_sendcycle = 60
+config_temperature_sendcycleoption = average
[DS2438]
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|