133 lines
4.9 KiB
Python
133 lines
4.9 KiB
Python
#!/usr/bin/python
|
|
|
|
import types
|
|
import traceback
|
|
import binascii
|
|
import threading
|
|
import time
|
|
import thread
|
|
import os
|
|
import struct
|
|
import sys
|
|
import serial
|
|
import minimalmodbus
|
|
import pickle
|
|
import re
|
|
from device_base import deviceBase
|
|
import micro800 as u800
|
|
|
|
import requests
|
|
try:
|
|
import json
|
|
except:
|
|
import simplejson as json
|
|
|
|
min_upload_time = 30
|
|
addr = '192.168.1.20'
|
|
|
|
|
|
|
|
|
|
|
|
class start(threading.Thread, deviceBase):
|
|
channels = {}
|
|
def updateGPS(self):
|
|
gps = self.mcu.gps
|
|
print("GPS found me at {0}".format(gps))
|
|
self.sendtodb("gps", gps, 0)
|
|
|
|
def setupChannels(self):
|
|
with open('drivers/vfd_ipp_channels.p', 'rb') as ch_f:
|
|
self.channels = pickle.load(ch_f)
|
|
print("Channel List\n================")
|
|
for x in self.channels.keys():
|
|
print x
|
|
print("================")
|
|
|
|
def __init__(self, name=None, number=None, mac=None, Q=None, mcu=None, companyId=None, offset=None, mqtt=None, Nodes=None):
|
|
threading.Thread.__init__(self)
|
|
deviceBase.__init__(self, name=name, number=number, mac=mac, Q=Q, mcu=mcu, companyId=companyId, offset=offset, mqtt=mqtt, Nodes=Nodes)
|
|
|
|
self.daemon = True
|
|
self.version = "2"
|
|
self.device_address = addr
|
|
self.finished = threading.Event()
|
|
threading.Thread.start(self)
|
|
self.sendtodbJSON("device_address", self.device_address, 0)
|
|
self.setupChannels()
|
|
# self.run()
|
|
|
|
|
|
# self.updateGPS()
|
|
# this is a required function for all drivers, its goal is to upload some piece of data
|
|
# about your device so it can be seen on the web
|
|
def register(self):
|
|
self.channels["status"]["last_value"] = ""
|
|
|
|
def run(self):
|
|
print("****************\n*************\nEXECUTING RUN\n********************\n****************")
|
|
self.runLoopStatus = ""
|
|
last_OK_state = 0
|
|
while True:
|
|
if len(self.channels) > 0:
|
|
try:
|
|
for i in self.channels:
|
|
runLoopStatus = i
|
|
print("reading {0}".format(i))
|
|
valData = u800.readMicroTag(self.device_address, self.channels[i]['tag'])
|
|
print(valData)
|
|
if valData:
|
|
nowVal = valData[0]
|
|
ch = self.channels[i]
|
|
if ch['data_type'] == "BOOL":
|
|
if ch['last_value'] == "":
|
|
self.sendtodbJSON(i, nowVal, 0)
|
|
ch['last_time_uploaded'] = time.time()
|
|
ch['last_value'] = nowVal
|
|
elif (not (ch['last_value'] == nowVal)) or ((time.time() - ch['last_time_uploaded']) > ch['max_time_between_uploads']):
|
|
self.sendtodbJSON(i, nowVal, 0)
|
|
ch['last_time_uploaded'] = time.time()
|
|
ch['last_value'] = nowVal
|
|
if (ch['data_type'] == "REAL") or (ch['data_type'][-3:] == "INT"):
|
|
if ch['last_value'] == "":
|
|
self.sendtodbJSON(i, nowVal, 0)
|
|
ch['last_time_uploaded'] = time.time()
|
|
ch['last_value'] = nowVal
|
|
elif (abs(ch['last_value'] - nowVal) > ch['change_amount']) or ((time.time() - ch['last_time_uploaded']) > ch['max_time_between_uploads']):
|
|
self.sendtodbJSON(i, nowVal, 0)
|
|
ch['last_time_uploaded'] = time.time()
|
|
ch['last_value'] = nowVal
|
|
|
|
runLoopStatus = "Complete"
|
|
OK_state = 1
|
|
if not OK_state == last_OK_state:
|
|
self.sendtodbJSON("driver_ok", OK_state, 0)
|
|
last_OK_state = OK_state
|
|
time.sleep(10)
|
|
except Exception, e:
|
|
OK_state = 0
|
|
if not OK_state == last_OK_state:
|
|
self.sendtodbJSON("driver_ok", OK_state, 0)
|
|
last_OK_state = OK_state
|
|
sleep_timer = 30
|
|
print "Error during {0} of run loop: {1}\nWill try again in {2} seconds...".format(runLoopStatus, e, sleep_timer)
|
|
time.sleep(sleep_timer)
|
|
else:
|
|
print("Apparently no self.channels... length shows {0}".format(len(self.channels)))
|
|
print self.channels
|
|
self.setupChannels()
|
|
time.sleep(30)
|
|
|
|
def vfdipp_sync(self, name, value):
|
|
self.sendtodb("connected", "true", 0)
|
|
return True
|
|
|
|
def vfdipp_address(self, name, value):
|
|
self.device_address = value
|
|
return True
|
|
|
|
|
|
def vfdipp_gpsUpdate(self, name, value):
|
|
updateGPS()
|
|
return True
|