| @@ -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 | |||
| offset in seconds from "Jan 1 00:00:00 2000" | |||
| to unix's epoch of 1970 | |||
| @@ -79,18 +89,18 @@ def _et2d(et) : | |||
| d[child.tag] = child.text | |||
| 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 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 | |||
| def get_setting_data(self) : | |||
| """ | |||
| get settings | |||
| """ | |||
| comm_responce = self._send_http_comm("get_setting_data") | |||
| return comm_responce | |||
| def get_device_config(self) : | |||
| """ | |||
| get configs | |||
| """ | |||
| comm_responce = self._send_http_comm("get_device_config") | |||
| return comm_responce | |||
| def get_timezone(self) : | |||
| """ | |||
| get current timezone configuration | |||
| """ | |||
| comm_responce = self._send_http_comm("get_timezone") | |||
| return comm_responce | |||
| 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") | |||
| return comm_responce | |||
| @@ -456,7 +479,7 @@ class Eagle(object) : | |||
| # Support functions | |||
| 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): | |||
| try : | |||
| @@ -509,8 +532,8 @@ class Eagle(object) : | |||
| try: | |||
| self._connect() | |||
| if cmd == "get_history_data" : | |||
| self.soc.settimeout(45) | |||
| # if cmd == "get_history_data" : | |||
| # self.soc.settimeout(45) | |||
| self.soc.sendall(commstr) | |||
| if self.debug : | |||
| print "commstr : \n", commstr | |||
| @@ -14,10 +14,11 @@ __copyright__ = "Copyright (C) 2014 Peter Shipley" | |||
| __license__ = "BSD" | |||
| from EagleClass import Eagle | |||
| import EagleClass | |||
| from EagleClass import Eagle, to_epoch_1970, to_epoch_2000 | |||
| #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 sys | |||
| import time | |||
| import xml.etree.ElementTree as ET | |||
| my_macid = "0xd8d5b90000001296" | |||
| @@ -16,6 +17,43 @@ my_macid = "0xd8d5b90000001296" | |||
| # Enter your Eagle's IP below | |||
| 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 | |||
| s = socket.create_connection( (Eagle_IP, 5002), 10) | |||
| @@ -62,13 +100,26 @@ time.sleep(1) | |||
| print "Eagle response: \n\r" | |||
| j=0 | |||
| buf_list = [] | |||
| while 1: | |||
| buf = s.recv(1000) | |||
| if not buf: | |||
| 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() | |||
| #main() | |||
| 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) | |||