from . import config
from . import messages as msg
#from . import convert
#from .DeviceData import DeviceData
#from .DeviceInfo import DeviceInfo
#from .InstantDemand import InstantDemand
#from .Reading import Reading
#from .Total import Total
import defusedxml.ElementTree as ET
import socket
#==========================================================================
def all():
# Newlines are required
xmlCmd = "\nget_device_data\n" \
"%s\n\n" % ( config.macAddress )
xmlData = sendXml( xmlCmd )
# Add fake wrapper for parsing list of elements
xmlData = "%s" % xmlData
root = ET.fromstring( xmlData )
return DeviceData( root )
#==========================================================================
def device():
# Newlines are required
xmlCmd = "\nlist_devices\n\n"
xmlData = sendXml( xmlCmd )
root = ET.fromstring( xmlData )
return msg.DeviceInfo( root )
#==========================================================================
def instant():
# Newlines are required
xmlCmd = "\nget_instantaneous_demand\n" \
"%s\n\n" % ( config.macAddress )
xmlData = sendXml( xmlCmd )
root = ET.fromstring( xmlData )
return msg.InstantaneousDemand( root )
#==========================================================================
def history( start ):
"start == datetime in utc"
startHex = convert.fromTime( start )
# Newlines are required
xmlCmd = "\nget_history_data\n" \
"%s\n%s\n" \
"\n" % ( config.macAddress, startHex )
xmlData = sendXml( xmlCmd )
# Add fake wrapper for parsing list of elements
root = ET.fromstring( xmlData )
return [ Total( child ) for child in root ]
#==========================================================================
def instantHistory( interval ):
"interval = 'hour', 'day', 'week'"
assert( interval in [ 'hour', 'day', 'week' ] )
# Newlines are required
xmlCmd = "\nget_demand_values\n" \
"%s\n\n" % ( config.macAddress )
xmlData = sendXml( xmlCmd )
# Add fake wrapper for parsing list of elements
xmlData = "%s" % xmlData
root = ET.fromstring( xmlData )
return msg.Reading.xmlToList( root )
#==========================================================================
def totalHistory( interval ):
"interval = 'day', 'week', 'month', 'year'"
assert( interval in [ 'day', 'week', 'month', 'year' ] )
# Newlines are required
xmlCmd = "\nget_summation_values\n" \
"%s\n\n" % ( config.macAddress )
xmlData = sendXml( xmlCmd )
# Add fake wrapper for parsing list of elements
xmlData = "%s" % xmlData
root = ET.fromstring( xmlData )
return msg.Reading.xmlToList( root )
#==========================================================================
def sendXml( xmlCmd ):
sock = socket.create_connection( ( config.host, config.port ) )
try:
sock.send( xmlCmd )
buf = ""
while True:
s = sock.recv( 1024 )
if not s:
break
buf += s
finally:
sock.close()
return buf
#==========================================================================