@@ -24,9 +24,19 @@ api_arg_format = { | |||||
} | } | ||||
__all__ = ['Eagle', 'to_unix_time'] | |||||
__all__ = ['Eagle', 'to_epoch_1970, to_epoch_2000'] | |||||
def to_unix_time(t) : | |||||
def to_epoch_2000(t) : | |||||
""" converts time stored as | |||||
to unix's epoch of 1970 | |||||
offset in seconds from "Jan 1 00:00:00 2000" | |||||
""" | |||||
if isinstance(t, time.struct_time ) : | |||||
t = time.mktime(t) | |||||
return t - 946684800 | |||||
def to_epoch_1970(t) : | |||||
""" converts time stored as | """ converts time stored as | ||||
offset in seconds from "Jan 1 00:00:00 2000" | offset in seconds from "Jan 1 00:00:00 2000" | ||||
to unix's epoch of 1970 | to unix's epoch of 1970 | ||||
@@ -79,18 +89,18 @@ def _et2d(et) : | |||||
d[child.tag] = child.text | d[child.tag] = child.text | ||||
return d | return d | ||||
def _tohex(n, width=10) : | |||||
""" convert arg to string with hex representation if possible""" | |||||
if isinstance(n, str) : | |||||
if n.isdigit() : | |||||
return "{:#{width}x}".format(int(n), width=width) | |||||
else : | |||||
return n | |||||
if isinstance(n, (int, long) ) : | |||||
return "{:#{width}x}".format(n, width=width) | |||||
if isinstance(n, float) : | |||||
def _tohex(n, width=10) : | |||||
""" convert arg to string with hex representation if possible""" | |||||
if isinstance(n, str) : | |||||
if n.isdigit() : | |||||
return "{:#{width}x}".format(int(n), width=width) | return "{:#{width}x}".format(int(n), width=width) | ||||
return n | |||||
else : | |||||
return n | |||||
if isinstance(n, (int, long) ) : | |||||
return "{:#{width}x}".format(n, width=width) | |||||
if isinstance(n, float) : | |||||
return "{:#{width}x}".format(int(n), width=width) | |||||
return n | |||||
@@ -298,18 +308,31 @@ class Eagle(object) : | |||||
# http commands as class functions | # http commands as class functions | ||||
def get_setting_data(self) : | def get_setting_data(self) : | ||||
""" | |||||
get settings | |||||
""" | |||||
comm_responce = self._send_http_comm("get_setting_data") | comm_responce = self._send_http_comm("get_setting_data") | ||||
return comm_responce | return comm_responce | ||||
def get_device_config(self) : | def get_device_config(self) : | ||||
""" | |||||
get configs | |||||
""" | |||||
comm_responce = self._send_http_comm("get_device_config") | comm_responce = self._send_http_comm("get_device_config") | ||||
return comm_responce | return comm_responce | ||||
def get_timezone(self) : | def get_timezone(self) : | ||||
""" | |||||
get current timezone configuration | |||||
""" | |||||
comm_responce = self._send_http_comm("get_timezone") | comm_responce = self._send_http_comm("get_timezone") | ||||
return comm_responce | return comm_responce | ||||
def get_time_source(self, macid=None) : | def get_time_source(self, macid=None) : | ||||
""" | |||||
get time source for device | |||||
retrrns value "meter" or "nternet" | |||||
""" | |||||
comm_responce = self._send_http_comm("get_time_source") | comm_responce = self._send_http_comm("get_time_source") | ||||
return comm_responce | return comm_responce | ||||
@@ -456,7 +479,7 @@ class Eagle(object) : | |||||
# Support functions | # Support functions | ||||
def _connect(self) : | def _connect(self) : | ||||
self.soc = socket.create_connection( (self.addr, self.port), 10) | |||||
self.soc = socket.create_connection( (self.addr, self.port), self.timeout) | |||||
def _disconnect(self): | def _disconnect(self): | ||||
try : | try : | ||||
@@ -509,8 +532,8 @@ class Eagle(object) : | |||||
try: | try: | ||||
self._connect() | self._connect() | ||||
if cmd == "get_history_data" : | |||||
self.soc.settimeout(45) | |||||
# if cmd == "get_history_data" : | |||||
# self.soc.settimeout(45) | |||||
self.soc.sendall(commstr) | self.soc.sendall(commstr) | ||||
if self.debug : | if self.debug : | ||||
print "commstr : \n", commstr | print "commstr : \n", commstr | ||||
@@ -14,10 +14,11 @@ __copyright__ = "Copyright (C) 2014 Peter Shipley" | |||||
__license__ = "BSD" | __license__ = "BSD" | ||||
from EagleClass import Eagle | |||||
import EagleClass | |||||
from EagleClass import Eagle, to_epoch_1970, to_epoch_2000 | |||||
#from RainEagle.EagleClass import Eagle | #from RainEagle.EagleClass import Eagle | ||||
__all__ = ['Eagle'] | |||||
__all__ = ['Eagle', 'to_epoch_1970', 'to_epoch_2000'] | |||||
@@ -8,6 +8,7 @@ based on TalkToEagle.py | |||||
import socket | import socket | ||||
import sys | import sys | ||||
import time | import time | ||||
import xml.etree.ElementTree as ET | |||||
my_macid = "0xd8d5b90000001296" | my_macid = "0xd8d5b90000001296" | ||||
@@ -16,6 +17,43 @@ my_macid = "0xd8d5b90000001296" | |||||
# Enter your Eagle's IP below | # Enter your Eagle's IP below | ||||
Eagle_IP = "10.1.1.39" | Eagle_IP = "10.1.1.39" | ||||
def print_summ(cs) : | |||||
# global last_delivered | |||||
# time_stamp = eg.to_epoch_1970(cs['TimeStamp']) | |||||
_delivered = cs.find('SummationDelivered').text | |||||
_received = cs.find('SummationReceived').text | |||||
_multiplier = cs.find('Multiplier').text | |||||
_divisor = cs.find('Divisor').text | |||||
# print "Multiplier=", _multiplier, "Divisor=", _divisor, "Delivered=", _delivered, "Received=", _received | |||||
multiplier=int(_multiplier, 16) | |||||
divisor=int(_divisor, 16) | |||||
delivered=int(_delivered, 16) | |||||
received=int(_received, 16) | |||||
time_stamp = 946684800 + int(cs.find('TimeStamp').text, 16) | |||||
# print "Multiplier=", multiplier, "Divisor=", divisor, "Delivered=", delivered, "Received=", received, "TimeStamp", time_stamp | |||||
if multiplier == 0 : | |||||
multiplier=1 | |||||
if divisor == 0 : | |||||
divisor=1 | |||||
reading_received = received * multiplier / float (divisor ) | |||||
reading_delivered = delivered * multiplier / float (divisor ) | |||||
#reading_delta = (reading_delivered - last_delivered) | |||||
#last_delivered = reading_delivered | |||||
print time.asctime(time.localtime(time_stamp)), " : ", reading_received, "\t", reading_delivered | |||||
def print_reading(eg, rd) : | |||||
for dat in rd['Reading'] : | |||||
time_stamp = time.asctime(time.localtime( to_epoch_1970(dat['TimeStamp']) ) ) | |||||
## list_devices | ## list_devices | ||||
s = socket.create_connection( (Eagle_IP, 5002), 10) | s = socket.create_connection( (Eagle_IP, 5002), 10) | ||||
@@ -62,13 +100,26 @@ time.sleep(1) | |||||
print "Eagle response: \n\r" | print "Eagle response: \n\r" | ||||
j=0 | |||||
buf_list = [] | |||||
while 1: | while 1: | ||||
buf = s.recv(1000) | buf = s.recv(1000) | ||||
if not buf: | if not buf: | ||||
break | break | ||||
sys.stdout.write(buf) | |||||
buf_list.append(buf) | |||||
#sys.stdout.write(buf) | |||||
j = j + 1 | |||||
result_xml = ''.join(buf_list) | |||||
print result_xml | |||||
etree = ET.fromstring(result_xml) | |||||
for cs in etree.iter('CurrentSummation'): | |||||
print_summ(cs) | |||||
print "j =", j | |||||
s.close() | s.close() | ||||
#main() | |||||
exit(0) | exit(0) |
@@ -0,0 +1,116 @@ | |||||
#!/usr/local/bin/python2.7 | |||||
""" | |||||
A simple script get current meter values | |||||
""" | |||||
__author__ = "Peter Shipley" | |||||
import sys | |||||
sys.path.append('/usr/home/shipley/Projects/Eagle') # temp | |||||
# import RainEagle | |||||
from RainEagle import Eagle, to_epoch_1970 | |||||
import time | |||||
from pprint import pprint | |||||
import json | |||||
last_delivered = 0 | |||||
debug = 0 | |||||
def main() : | |||||
eg = Eagle( debug=debug , addr="10.1.1.39") | |||||
# timeout=45, | |||||
# print "\nlist_devices :" | |||||
# r = eg.list_devices() | |||||
# print "pprint 2" | |||||
# pprint(r) | |||||
print "\nget_device_data :" | |||||
r = eg.get_device_data() | |||||
# pprint(r['InstantaneousDemand']) | |||||
print_instantdemand( r['InstantaneousDemand']) | |||||
# pprint(r['CurrentSummation']) | |||||
print_currentsummation(r['CurrentSummation']) | |||||
exit(0) | |||||
def print_currentsummation(cs) : | |||||
multiplier=int(cs['Multiplier'], 16) | |||||
divisor=int(cs['Divisor'], 16) | |||||
delivered=int(cs['SummationDelivered'], 16) | |||||
received=int(cs['SummationReceived'], 16) | |||||
if multiplier == 0 : | |||||
multiplier=1 | |||||
if divisor == 0 : | |||||
divisor=1 | |||||
reading_received = received * multiplier / float (divisor ) | |||||
reading_delivered = delivered * multiplier / float (divisor ) | |||||
time_stamp = to_epoch_1970(cs['TimeStamp']) | |||||
print time.asctime(time.localtime(time_stamp)), " : " | |||||
print "\tReceived=", reading_received, "Kw" | |||||
print "\tDelivered=", reading_delivered, "Kw" | |||||
print "\t\t", (reading_delivered - reading_received) | |||||
# print "{0}\t{1:.4f}\t{2:0.4f}\t{3:.4f}".format( | |||||
# time.strftime("%Y-%m-%d %H:%M:%S", time_struct), | |||||
# reading_received, | |||||
# reading_delivered, | |||||
# (reading_delivered - reading_received) ) | |||||
def print_instantdemand(idemand) : | |||||
time_stamp = to_epoch_1970(idemand['TimeStamp']) | |||||
multiplier=int(idemand['Multiplier'], 16) | |||||
divisor=int(idemand['Divisor'], 16) | |||||
demand=int(idemand['Demand'], 16) | |||||
# print "Multiplier=", multiplier, "Divisor=", divisor, "Demand=", demand | |||||
if multiplier == 0 : | |||||
multiplier=1 | |||||
if divisor == 0 : | |||||
divisor=1 | |||||
reading = demand * multiplier / float (divisor ) | |||||
print time.asctime(time.localtime(time_stamp)), " : " | |||||
print "\tDemand=", reading, "Kw" | |||||
print "\tAmps={:.3f}".format( ((reading * 1000) / 240) ) | |||||
def print_reading(eg, rd) : | |||||
for dat in rd['Reading'] : | |||||
the_time = time.asctime(time.localtime( to_epoch_1970(dat['TimeStamp']) ) ) | |||||
print the_time, "Type=", dat['Type'], "Value=", dat['Value'] | |||||
# | |||||
if __name__ == "__main__": | |||||
# import __main__ | |||||
# print(__main__.__file__) | |||||
# print("syntax ok") | |||||
main() | |||||
exit(0) | |||||