def _fetch_powerwall_data(power_wall: Powerwall) -> PowerwallData: """Process and update powerwall data.""" return PowerwallData( charge=power_wall.get_charge(), site_master=power_wall.get_sitemaster(), meters=power_wall.get_meters(), grid_services_active=power_wall.is_grid_services_active(), grid_status=power_wall.get_grid_status(), )
def main(): pp = pprint.PrettyPrinter(indent=2) creds = get_login_credentials() power_wall = Powerwall(POWERWALL_HOST) try: power_wall.detect_and_pin_version() except PowerwallUnreachableError as e: print(e) return print("Detected and pinned version: {}".format( power_wall.get_pinned_version())) _ = power_wall.login(creds["password"]) print("Current charge: {}".format(power_wall.get_charge())) print("Device Type: {}".format(power_wall.get_device_type())) print(f"Authenticated: {power_wall.get_api().is_authenticated()}") print(f"Sitemaster: {power_wall.get_sitemaster()}") print(f"Grid status: {power_wall.get_grid_status()}") print(f"Grid service activer: {power_wall.is_grid_services_active()}") site_info = power_wall.get_site_info() print(f"Site info: {pp.pformat(site_info.response)}") status = power_wall.get_status() print(f"Status: {pp.pformat(status.response)}") print(f"Device type: {power_wall.get_device_type()}") print(f"Serial numbers: {power_wall.get_serial_numbers()}") print(f"Version: {power_wall.get_version()}") # # XXX These methods need auth: print(f"Operation mode: {power_wall.get_operation_mode()}") # print(f"Backup reserved pct: {power_wall.get_backup_reserved_percentage()}") print(f"Solars: {power_wall.get_solars()}") print(f"VIN: {power_wall.get_vin()}") meters = power_wall.get_meters() # print(f"Meters: {pp.pformat(meters.response)}") for meter_type in MeterType: meter = meters.get_meter(meter_type) print(f"Meter: {meter_type}") print(f" Energy exported: {meter.energy_exported}") print(f" Energy imported: {meter.energy_imported}") print(f" Instant power: {meter.instant_power}") print(f" meter info: {pp.pformat(meter)}") # print(f" Instant reactive power: {meter.instant_reactive_power}") # print(f" Instant apparent power: {meter.instant_apparent_power}") # print(f" Instant average voltage: {meter.instant_average_voltage}") # print(f" Instant total current: {meter.instant_total_current}") # print(f" Is Active: {meter.is_active()}") # print(f" Is drawing from: {meter.is_drawing_from()}") # print(f" Is sending to: {meter.is_sending_to()}") return
def _fetch_powerwall_data(power_wall: Powerwall) -> PowerwallData: """Process and update powerwall data.""" try: backup_reserve = power_wall.get_backup_reserve_percentage() except MissingAttributeError: backup_reserve = None return PowerwallData( charge=power_wall.get_charge(), site_master=power_wall.get_sitemaster(), meters=power_wall.get_meters(), grid_services_active=power_wall.is_grid_services_active(), grid_status=power_wall.get_grid_status(), backup_reserve=backup_reserve, )
def powerwall(): strm="" try: powerwall = Powerwall(GW_IP) powerwall.login(GW_PASSWORD, GW_USER) charge=powerwall.get_charge() meters = powerwall.get_meters() meters.charge=charge strm = str(meters.__dict__) except Exception as ex: print("Could not access Tesla Gateway: "+ str(ex)) return Response(str(ex), mimetype="application/json") return Response(strm, mimetype="application/json")
def main(): """ Get credentials from vault. Poke backup gateway. Push stats to influxdb """ vault = get_hvac_client() bg_creds = vault.secrets.kv.v1.read_secret(BG_GATEWAY_SECRETS_PATH) influxdb_creds = vault.secrets.kv.v1.read_secret(INFLUXDB_CREDS_PATH) powerwall = Powerwall(BG_GATEWAY_HOST) try: powerwall.detect_and_pin_version() except PowerwallUnreachableError as e: print(e) return _ = powerwall.login(bg_creds["email"], bg_creds["password"]) battery_pct_charge = powerwall.get_charge() site_info = powerwall.get_site_info() meters = power_wall.get_meters() meter_data = meters.response for (meter, data) in meters.items(): pass return
class TestPowerwall(unittest.TestCase): def setUp(self) -> None: self.powerwall = Powerwall(POWERWALL_IP) self.powerwall.login(POWERWALL_PASSWORD) def tearDown(self) -> None: self.powerwall.close() def test_get_charge(self) -> None: charge = self.powerwall.get_charge() self.assertIsInstance(charge, float) def test_get_meters(self) -> None: meters = self.powerwall.get_meters() self.assertIsInstance(meters, MetersAggregates) self.assertIsInstance(meters.site, Meter) self.assertIsInstance(meters.solar, Meter) self.assertIsInstance(meters.battery, Meter) self.assertIsInstance(meters.load, Meter) self.assertIsInstance(meters.get_meter(MeterType.SOLAR), Meter) for meter_type in MeterType: meter = meters.get_meter(meter_type) meter = meters.battery meter.energy_exported meter.energy_imported meter.instant_power meter.last_communication_time meter.frequency meter.average_voltage meter.get_energy_exported() meter.get_energy_imported() self.assertIsInstance(meter.get_power(), float) self.assertIsInstance(meter.is_active(), bool) self.assertIsInstance(meter.is_drawing_from(), bool) self.assertIsInstance(meter.is_sending_to(), bool) def test_sitemaster(self) -> None: sitemaster = self.powerwall.get_sitemaster() self.assertIsInstance(sitemaster, SiteMaster) sitemaster.status sitemaster.is_running sitemaster.is_connected_to_tesla sitemaster.is_power_supply_mode def test_site_info(self) -> None: site_info = self.powerwall.get_site_info() self.assertIsInstance(site_info, SiteInfo) site_info.nominal_system_energy site_info.site_name site_info.timezone def get_grid_status(self) -> None: grid_status = self.powerwall.get_grid_status() self.assertIsInstance(grid_status, GridStatus) def get_status(self) -> None: status = self.powerwall.get_status() self.assertIsInstance(status, PowerwallStatus) status.up_time_seconds status.start_time status.version
class TestPowerWall(unittest.TestCase): def setUp(self): self.powerwall = Powerwall(ENDPOINT) def test_get_api(self): self.assertIsInstance(self.powerwall.get_api(), API) def test_pins_version_on_creation(self): pw = Powerwall(ENDPOINT, pin_version="1.49.0") self.assertEqual(pw.get_pinned_version(), version.LooseVersion("1.49.0")) pw = Powerwall(ENDPOINT, pin_version=version.LooseVersion("1.49.0")) self.assertEqual(pw.get_pinned_version(), version.LooseVersion("1.49.0")) @responses.activate def test_get_charge(self): add( Response(GET, url=f"{ENDPOINT}system_status/soe", json={"percentage": 53.123423})) self.assertEqual(self.powerwall.get_charge(), 53.123423) @responses.activate def test_get_sitemaster(self): add( Response(responses.GET, url=f"{ENDPOINT}sitemaster", json=SITEMASTER_RESPONSE)) sitemaster = self.powerwall.get_sitemaster() self.assertIsInstance(sitemaster, SiteMaster) self.assertEqual(sitemaster.status, "StatusUp") self.assertEqual(sitemaster.is_running, True) self.assertEqual(sitemaster.is_connected_to_tesla, True) self.assertEqual(sitemaster.is_power_supply_mode, False) @responses.activate def test_get_meters(self): add( Response(responses.GET, url=f"{ENDPOINT}meters/aggregates", json=METERS_AGGREGATES_RESPONSE)) meters = self.powerwall.get_meters() self.assertIsInstance(meters, MetersAggregates) self.assertIsInstance(meters.site, Meter) self.assertIsInstance(meters.solar, Meter) self.assertIsInstance(meters.battery, Meter) self.assertIsInstance(meters.load, Meter) self.assertIsInstance(meters.get_meter(MeterType.SOLAR), Meter) @responses.activate def test_meter(self): add( Response(responses.GET, url=f"{ENDPOINT}meters/aggregates", json=METERS_AGGREGATES_RESPONSE)) @responses.activate def test_is_sending(self): add( Response(responses.GET, url=f"{ENDPOINT}meters/aggregates", json=METERS_AGGREGATES_RESPONSE)) meters = self.powerwall.get_meters() self.assertEqual(meters.solar.is_sending_to(), False) self.assertEqual(meters.solar.is_active(), True) self.assertEqual(meters.solar.is_drawing_from(), True) self.assertEqual(meters.site.is_sending_to(), True) self.assertEqual(meters.load.is_sending_to(), True) self.assertEqual(meters.load.is_drawing_from(), False) self.assertEqual(meters.load.is_active(), True) @responses.activate def test_get_grid_status(self): add( Response(responses.GET, url=f"{ENDPOINT}system_status/grid_status", json=GRID_STATUS_RESPONSE)) grid_status = self.powerwall.get_grid_status() self.assertEqual(grid_status, GridStatus.CONNECTED) @responses.activate def test_is_grid_services_active(self): add( Response(responses.GET, url=f"{ENDPOINT}system_status/grid_status", json=GRID_STATUS_RESPONSE)) self.assertEqual(self.powerwall.is_grid_services_active(), False) @responses.activate def test_get_site_info(self): add( Response(responses.GET, url=f"{ENDPOINT}site_info", json=SITE_INFO_RESPONSE)) site_info = self.powerwall.get_site_info() self.assertEqual(site_info.nominal_system_energy, 27) self.assertEqual(site_info.site_name, "test") self.assertEqual(site_info.timezone, "Europe/Berlin") @responses.activate def test_get_status(self): add( Response(responses.GET, url=f"{ENDPOINT}status", json=STATUS_RESPONSE)) status = self.powerwall.get_status() self.assertEqual( status.up_time_seconds, datetime.timedelta(seconds=61891, microseconds=214751)) self.assertEqual( status.start_time, datetime.datetime(2020, 10, 28, 20, 14, 11, tzinfo=datetime.timezone( datetime.timedelta(seconds=28800)))) self.assertEqual(status.device_type, DeviceType.GW1) self.assertEqual(status.version, "1.50.1") @responses.activate def test_get_device_type(self): add( Response(responses.GET, url=f"{ENDPOINT}status", json=STATUS_RESPONSE)) device_type = self.powerwall.get_device_type() self.assertIsInstance(device_type, DeviceType) self.assertEqual(device_type, DeviceType.GW1) @responses.activate def test_get_serial_numbers(self): add( Response(responses.GET, url=f"{ENDPOINT}powerwalls", json=POWERWALLS_RESPONSE)) serial_numbers = self.powerwall.get_serial_numbers() self.assertEqual(serial_numbers, ["SerialNumber1", "SerialNumber2"]) @responses.activate def test_get_backup_reserved_percentage(self): add( Response(responses.GET, url=f"{ENDPOINT}operation", json=OPERATION_RESPONSE)) @responses.activate def test_get_operation_mode(self): add( Response(responses.GET, url=f"{ENDPOINT}operation", json=OPERATION_RESPONSE)) @responses.activate def test_get_version(self): add( Response(responses.GET, url=f"{ENDPOINT}status", json=STATUS_RESPONSE)) self.assertEqual(self.powerwall.get_version(), "1.50.1") @responses.activate def test_detect_and_pin_version(self): add( Response(responses.GET, url=f"{ENDPOINT}status", json=STATUS_RESPONSE)) vers = version.LooseVersion("1.50.1") pw = Powerwall(ENDPOINT) self.assertEqual(pw.detect_and_pin_version(), vers) self.assertEqual(pw._pin_version, vers) def test_helpers(self): resp = {"a": 1} with self.assertRaises(MissingAttributeError): assert_attribute(resp, "test") with self.assertRaises(MissingAttributeError): assert_attribute(resp, "test", "test") self.assertEqual(convert_to_kw(2500, -1), 2.5)
write_api = client.write_api(write_options=SYNCHRONOUS) # Powerwall ip = os.getenv("POWERWALL_IP") if ip is None: raise ValueError("POWERWALL_IP must be set") email = os.getenv("POWERWALL_EMAIL") password = os.getenv("POWERWALL_PASSWORD") power_wall = Powerwall(ip) # Program # Identify the powerwall version power_wall.detect_and_pin_version() print("Detected and pinned version: {}".format( power_wall.get_pinned_version())) print("Current charge: {}".format(power_wall.get_charge())) print("Device Type: {}".format(power_wall.get_device_type())) # Sending Data while True: p = influxdb_client.Point("Measurement").field("Charge", power_wall.get_charge) write_api.write(bucket=bucket, org=org, record=p) sleep(1)
class TestPowerWall(unittest.TestCase): def setUp(self): self.powerwall = Powerwall(ENDPOINT) def test_endpoint_setup(self): test_endpoint_1 = "1.1.1.1" pw = Powerwall(test_endpoint_1) self.assertEqual(pw._endpoint, f"https://{test_endpoint_1}/api/") test_endpoint_2 = "http://1.1.1.1" pw = Powerwall(test_endpoint_2) self.assertEqual(pw._endpoint, f"https://1.1.1.1/api/") test_endpoint_3 = "https://1.1.1.1/api/" pw = Powerwall(test_endpoint_3) self.assertEqual(pw._endpoint, test_endpoint_3) @responses.activate def test_get_charge(self): add( Response( GET, url=f"{ENDPOINT}system_status/soe", json={"percentage": 53.123423} ) ) self.assertEqual(self.powerwall.get_charge(), 53) self.assertEqual(self.powerwall.get_charge(rounded=False), 53.123423) @responses.activate def test_process_response(self): res = requests.Response() res.request = requests.Request(method="GET", url=f"{ENDPOINT}test").prepare() res.status_code = 401 with self.assertRaises(AccessDeniedError): self.powerwall._process_response(res) res.status_code = 502 with self.assertRaises(PowerwallUnreachableError): self.powerwall._process_response(res) res.status_code = 200 res._content = b'{"error": "test_error"}' with self.assertRaises(APIError): self.powerwall._process_response(res) res._content = b'{"response": "ok"}' self.assertEqual(self.powerwall._process_response(res), {"response": "ok"}) @responses.activate def test_get(self): add(Response(GET, url=f"{ENDPOINT}test_get", json={"test_get": True})) self.assertEqual(self.powerwall._get("test_get"), {"test_get": True}) @responses.activate def test_post(self): def post_callback(request): resp_body = {"test_post": True} headers = {} return (200, headers, json.dumps(resp_body)) responses.add_callback( responses.POST, url=f"{ENDPOINT}test_post", callback=post_callback, content_type="application/json", ) resp = self.powerwall._post("test_post", {"test": True}) self.assertIsInstance(resp, dict) self.assertEqual(resp, {"test_post": True}) @responses.activate def test_meters(self): add( Response( responses.GET, url=f"{ENDPOINT}meters/aggregates", json=METERS_RESPONSE ) ) meters = self.powerwall.get_meters() self.assertIsInstance(meters, MetersAggregateResponse) self.assertIsInstance(meters.site, MetersResponse) self.assertIsInstance(meters.solar, MetersResponse) self.assertIsInstance(meters.battery, MetersResponse) self.assertIsInstance(meters.load, MetersResponse) @responses.activate def test_is_sending(self): add( Response( responses.GET, url=f"{ENDPOINT}meters/aggregates", json=METERS_RESPONSE ) ) meters = self.powerwall.get_meters() self.assertEqual(meters.solar.is_sending_to(), False) self.assertEqual(meters.solar.is_active(), True) self.assertEqual(meters.solar.is_drawing_from(), True) self.assertEqual(meters.site.is_sending_to(), True) self.assertEqual(meters.load.is_sending_to(), True) self.assertEqual(meters.load.is_drawing_from(), False) self.assertEqual(meters.load.is_active(), True) @responses.activate def test_optional_json_attrs(self): add( Response( responses.GET, url=f"{ENDPOINT}site_info", json=SITE_INFO_RESPONSE_WITHOUT_OPTIONS, ) ) add( Response( responses.GET, url=f"{ENDPOINT}site_info", json=SITE_INFO_RESPONSE_WITH_OPTIONS, ) ) site_info = self.powerwall.get_site_info() self.assertEqual(site_info.has_optional_attrs_set(), False) self.assertEqual(site_info.has_key("utility"), False) self.assertEqual(site_info.grid_voltage_setting, 230) self.assertEqual(site_info.has_optional_attrs(), True) site_info = self.powerwall.get_site_info() self.assertEqual(site_info.has_optional_attrs_set(), True) self.assertEqual(site_info.has_key("utility"), True) self.assertEqual(site_info.retailer, "*")
print (f"Checking auth status of PW: {powerwall.is_authenticated()}") # Manually create API object #api = API(f'https://{POWERWALL_IP}/') # From existing powerwall api = powerwall.get_api() # Perform get on 'system_status/soe' soe = api.get_system_status_soe() print(f"Got SOE:{soe}") installer = api.get_installer() print(f"Got installer:{installer}") charge = powerwall.get_charge() print(f"Got Charge:{charge}") status = powerwall.get_status() print(f"Got Status: {status}") ''' status.version #=> '1.49.0' status.up_time_seconds #=> datetime.timedelta(days=13, seconds=63287, microseconds=146455) status.start_time #=> datetime.datetime(2020, 9, 23, 23, 31, 16, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800))) status.device_type '''
def draw_plot(i, creds, ax, ax2, x_axis, meter_values, battery_pct): """ Read values from the powerwall and plot them vs time. Keyword Arguments: i -- creds -- x_axis -- meter_values -- battery_pct -- """ powerwall = Powerwall(POWERWALL_HOST) try: powerwall.detect_and_pin_version() except PowerwallUnreachableError as e: print(e) return _ = powerwall.login(creds["password"]) # Get new values.. now = datetime.now(tz=pytz.utc) now = now.astimezone(TIMEZONE) x_axis.append(now) battery_pct.append(powerwall.get_charge()) meters = powerwall.get_meters() for meter_type in MeterType: meter = meters.get_meter(meter_type) meter_type = meter_type.value meter_values[meter_type].append(meter.instant_power) # Truncate at our horizon for number of samples to keep # x_axis = x_axis[-NUM_SAMPLE_HORIZON:] battery_pct = battery_pct[-NUM_SAMPLE_HORIZON:] for meter_type in MeterType: meter_type = meter_type.value meter_values[meter_type] = meter_values[meter_type][ -NUM_SAMPLE_HORIZON:] # Write our file out to both by-date and last 24h files as json # data = { "meter_values": meter_values, "x_axis": [x.strftime(DATE_FMT) for x in x_axis], "battery_pct": battery_pct, } try: with open(LAST_DAY_FILE, "w") as f: json.dump(data, f) today_file = HISTORY_FILE_DIR / now.strftime(HISTORY_FILE_FMT) with open(today_file, "w") as f: json.dump(data, f) except Exception: pass ax.clear() ax2.clear() legend_lines = [] legend_names = [] for meter_type in MeterType: meter_type = meter_type.value (l, ) = ax.plot(x_axis, meter_values[meter_type]) legend_lines.append(l) legend_names.append(meter_type) ax.set_ylabel("Wh") ax.grid(which="major", axis="both", color="grey") (l, ) = ax2.plot(x_axis, battery_pct, color="lightblue", linestyle="dashed") legend_lines.append(l) legend_names.append("Battery % Chg") ax2.set_ylabel("% Chg") ax2.grid(which="major", color="lightblue", linestyle="dotted") hours = mdates.HourLocator(interval=1) h_fmt = mdates.DateFormatter("%H", tz=now.tzinfo) qtr_hr = mdates.MinuteLocator(byminute=[15, 30, 45], interval=1) ax.legend(legend_lines, legend_names, loc="best") ax.xaxis.set_major_formatter(h_fmt) ax.xaxis.set_major_locator(hours) ax.xaxis.set_minor_locator(qtr_hr) plt.title("AS Powerwall")
class TestPowerwall(unittest.TestCase): def setUp(self) -> None: self.powerwall = Powerwall(POWERWALL_IP) self.powerwall.login(POWERWALL_PASSWORD) def tearDown(self) -> None: self.powerwall.close() def test_get_charge(self) -> None: charge = self.powerwall.get_charge() self.assertIsInstance(charge, float) def test_get_meters(self) -> None: meters = self.powerwall.get_meters() self.assertIsInstance(meters, MetersAggregates) self.assertIsInstance(meters.get_meter(MeterType.BATTERY), Meter) for meter_type in meters.meters: meter = meters.get_meter(meter_type) meter.energy_exported meter.energy_imported meter.instant_power meter.last_communication_time meter.frequency meter.average_voltage meter.get_energy_exported() meter.get_energy_imported() self.assertIsInstance(meter.get_power(), float) self.assertIsInstance(meter.is_active(), bool) self.assertIsInstance(meter.is_drawing_from(), bool) self.assertIsInstance(meter.is_sending_to(), bool) def test_sitemaster(self) -> None: sitemaster = self.powerwall.get_sitemaster() self.assertIsInstance(sitemaster, SiteMaster) sitemaster.status sitemaster.is_running sitemaster.is_connected_to_tesla sitemaster.is_power_supply_mode def test_site_info(self) -> None: site_info = self.powerwall.get_site_info() self.assertIsInstance(site_info, SiteInfo) site_info.nominal_system_energy site_info.site_name site_info.timezone def test_capacity(self) -> None: self.assertIsInstance(self.powerwall.get_capacity(), int) def test_energy(self) -> None: self.assertIsInstance(self.powerwall.get_energy(), int) def test_batteries(self) -> None: batteries = self.powerwall.get_batteries() self.assertGreater(len(batteries), 0) for battery in batteries: battery.wobble_detected battery.energy_discharged battery.energy_charged battery.energy_remaining battery.capacity battery.part_number battery.serial_number def test_grid_status(self) -> None: grid_status = self.powerwall.get_grid_status() self.assertIsInstance(grid_status, GridStatus) def test_status(self) -> None: status = self.powerwall.get_status() self.assertIsInstance(status, PowerwallStatus) status.up_time_seconds status.start_time status.version
class tesla_info: def __init__(self, ISYname, ISY_Id, teslaConnection): self.TEST = False LOGGER.debug('class tesla_info - init') self.localPassword = '' self.localEmail = '' self.IPAddress = '' self.cloudEmail = '' self.cloudPassword = '' self.controllerID = ISY_Id self.controllerName = ISYname self.captchaMethod = '' self.captchaCode = '' self.captchaAPIKey = '' self.generatorInstalled = True # I have not found a way to identify this on clould only connection so it will report even if not there self.solarInstalled = False self.ISYCritical = {} self.localAccessUp = False self.cloudAccessUp = False self.ISYmap = {} self.isyINFO = isyHandling() self.lastDay = date.today() if teslaConnection == 'BOTH': self.TPWlocalAccess = True self.TPWcloudAccess = True elif teslaConnection == 'LOCAL': self.TPWlocalAccess = True self.TPWcloudAccess = False elif teslaConnection == 'CLOUD': self.TPWlocalAccess = False self.TPWcloudAccess = True else: self.TPWlocalAccess = False self.TPWcloudAccess = False LOGGER.debug('No connection specified') def loginLocal(self, email, password, IPaddress): self.localEmail = email self.localPassword = password self.IPAddress = IPaddress LOGGER.debug('Local Access Supported') self.TPWlocal = Powerwall(IPaddress) self.TPWlocal.login(self.localPassword, self.localEmail) if not (self.TPWlocal.is_authenticated()): LOGGER.debug('Error Logging into Tesla Power Wall') self.localAccessUp = False else: self.localAccessUp = True self.metersDayStart = self.TPWlocal.get_meters() generator = self.TPWlocal._api.get('generators') if not (generator['generators']): self.generatorInstalled = False else: self.generatorInstalled = True solar = self.TPWlocal.get_solars() if solar: self.solarInstalled = True else: self.solarInstalled = False def loginCloud(self, email, password, captchaAPIkey=''): self.cloudEmail = email self.cloudPassword = password self.captchaAPIKey = captchaAPIkey LOGGER.debug('Cloud Access Supported') self.TPWcloud = TeslaCloudAPI(self.cloudEmail, self.cloudPassword, self.captchaAPIKey) self.TPWcloudAccess = True def teslaCloudConnect(self): LOGGER.debug('teslaCloudConnect') if not (self.TPWcloud.teslaCloudConnect()): LOGGER.debug( 'Error connecting to Tesla Could - check email, password, and API key' ) else: LOGGER.debug('Logged in Cloud - retrieving data') self.TPWcloudAccess = True self.TPWcloud.teslaCloudInfo() self.TPWcloud.teslaRetrieveCloudData() self.solarInstalled = self.TPWcloud.teslaGetSolar() def teslaInitializeData(self): LOGGER.debug('teslaInitializeData') if not (self.TPWcloudAccess): LOGGER.debug( 'no access to cloud data - starting accumulting from 0') self.yesterdayTotalSolar = 0 self.yesterdayTotalConsumption = 0 self.yesterdayTotalGeneration = 0 self.yesterdayTotalBattery = 0 self.yesterdayTotalGridServices = 0 self.yesterdayTotalGenerator = 0 self.daysTotalGridServices = 0 #Does not seem to exist self.daysTotalGenerator = 0 #needs to be updated - may not ex else: self.TPWcloud.teslaUpdateCloudData('all') self.TPWcloud.teslaCalculateDaysTotals() self.daysTotalSolar = self.TPWcloud.teslaExtractDaysSolar() self.daysTotalConsumption = self.TPWcloud.teslaExtractDaysConsumption( ) self.daysTotalGeneraton = self.TPWcloud.teslaExtractDaysGeneration( ) self.daysTotalBattery = self.TPWcloud.teslaExtractDaysBattery() self.daysTotalGenerator = self.TPWcloud.teslaExtractDaysGeneratorUse( ) self.daysTotalGridServices = self.TPWcloud.teslaExtractDaysGridServicesUse( ) self.yesterdayTotalSolar = self.TPWcloud.teslaExtractYesteraySolar( ) self.yesterdayTotalConsumption = self.TPWcloud.teslaExtractYesterdayConsumption( ) self.yesterdayTotalGeneration = self.TPWcloud.teslaExtractYesterdayGeneraton( ) self.yesterdayTotalBattery = self.TPWcloud.teslaExtractYesterdayBattery( ) self.yesterdayTotalGridServices = self.TPWcloud.teslaExtractYesterdayGridServiceUse( ) self.yesterdayTotalGenerator = self.TPWcloud.teslaExtractYesterdayGeneratorUse( ) #self.OPERATING_MODES = ["backup", "self_consumption", "autonomous"] #self.TOU_MODES = ["economics", "balanced"] self.metersStart = True self.gridstatus = { 'on_grid': 0, 'islanded_ready': 1, 'islanded': 2, 'transition ot grid': 3 } self.ISYgridEnum = {} for key in self.gridstatus: self.ISYgridEnum[self.gridstatus[key]] = key self.gridStatusEnum = { GridStatus.CONNECTED.value: 'on_grid', GridStatus.ISLANEDED_READY.value: 'islanded_ready', GridStatus.ISLANEDED.value: 'islanded', GridStatus.TRANSITION_TO_GRID.value: 'transition ot grid' } self.operationLocalEnum = { OperationMode.BACKUP.value: 'backup', OperationMode.SELF_CONSUMPTION.value: 'self_consumption', OperationMode.AUTONOMOUS.value: 'autonomous', OperationMode.SITE_CONTROL.value: 'site_ctrl' } self.operationModeEnum = { 0: 'backup', 1: 'self_consumption', 2: 'autonomous', 3: 'site_ctrl' } self.ISYoperationModeEnum = {} for key in self.operationModeEnum: self.ISYoperationModeEnum[self.operationModeEnum[key]] = key self.operationCloudEnum = {} if self.TPWcloudAccess: ModeList = self.TPWcloud.supportedOperatingModes() for i in range(0, len(ModeList)): self.operationCloudEnum[i] = ModeList[i] ModeList = self.ISYoperationModeEnum for key in ModeList: self.operationCloudEnum[ModeList[key]] = key ModeList = self.TPWcloud.supportedTouModes() self.touCloudEnum = {} self.ISYtouEnum = {} for i in range(0, len(ModeList)): self.touCloudEnum[i] = ModeList[i] self.ISYtouEnum[ModeList[i]] = i else: ModeList = None self.createISYsetup() #self.pollSystemData('all') def createISYsetup(self): self.setupNodeID = 'pwsetup' self.statusName = 'STATUS' self.nodeServerUp = 'nodeServerUp' self.setupNodeName = 'Control Parameters' self.statusNodeID = 'pwstatus' self.statusNodeName = 'Power Wall Status' self.nodeIDlist = [self.statusNodeID, self.setupNodeID] self.chargeLevel = 'chargeLevel' self.backoffLevel = 'backoffLevel' self.gridStatus = 'gridStatus' self.solarSupply = 'solarSupply' self.batterySupply = 'batterySupply' self.gridSupply = 'gridSupply' self.load = 'load' self.daysSolar = 'daysSolar' self.daysConsumption = 'daysConsumption' self.daysGeneration = 'daysGeneration' self.daysBattery = 'daysBattery' self.daysGridServices = 'daysGridServices' self.daysGenerator = 'daysGenerator' self.operationMode = 'operationMode' self.ConnectedTesla = 'connectedTesla' self.running = 'running' self.powerSupplyMode = 'powerSupplyMode' self.gridServiceActive = 'gridServiceActive' self.stormMode = 'stormMode' self.touMode = 'touMode' #self.backupPercent = 'backup_percent' self.weekendOffPeakStartSec = 'weekendOffPeakStart' self.weekendOffPeakEndSec = 'weekendOffPeakStop' self.weekendPeakStartSec = 'weekendPeakStart' self.weekendPeakEndSec = 'weekendPeakStop' self.weekdayOffPeakStartSec = 'weekdayOffPeakStart' self.weekdayOffPeakEndSec = 'weekdayOffPeakStop' self.weekdayPeakStartSec = 'weekdayPeakStart' self.weekdayPeakEndSec = 'weekdayPeakStop' self.yesterdaySolar = 'yesterdaysSolar' self.yesterdayConsumption = 'yesterdayConsumption' self.yesterdayGeneration = 'yesterdayGeneration' self.yesterdayBattery = 'yesterdayBattery' self.yesterdayGridServices = 'yesterdayGridServices' self.yesterdayGenerator = 'yesterGenerator' self.isyINFO.addISYcontroller(self.controllerID, self.controllerName, 'Electricity') self.isyINFO.addISYstatus(self.controllerID, self.statusName) self.isyINFO.addISYcommandSend(self.controllerID, 'DON') self.isyINFO.addISYcommandSend(self.controllerID, 'DOF') self.isyINFO.addIsyVaraiable(self.controllerID, self.nodeServerUp, 'raw1bunsign', 0, 255, None, None, 0, 'Missed LongPolls', None) self.isyINFO.addISYcommandReceive(self.controllerID, 'UPDATE', 'Update System Data', None) #self.isyINFO.addControllerDefStruct(self.controllerID, self.controllerName ) self.isyINFO.addISYnode(self.statusNodeID, self.statusNodeName, 'Electricity') self.isyINFO.addISYcommandReceive(self.statusNodeID, 'UPDATE', 'Update System Data', None) self.isyINFO.addIsyVaraiable(self.statusNodeID, self.chargeLevel, 'percent', 0, 100, None, None, 2, 'Battery Charge Level', None) self.isyINFO.addIsyVaraiable(self.statusNodeID, self.operationMode, 'list', None, None, '0-3', None, None, 'Operation Mode', self.operationModeEnum) self.isyINFO.addIsyVaraiable(self.statusNodeID, self.gridStatus, 'list', None, None, '0-3', None, None, 'Grid Status', self.ISYgridEnum) if self.TPWlocalAccess: self.isyINFO.addIsyVaraiable(self.statusNodeID, self.ConnectedTesla, 'list', None, None, '0-1', None, None, 'Connected to Tesla', { 0: 'False', 1: 'True' }) self.isyINFO.addIsyVaraiable(self.statusNodeID, self.gridServiceActive, 'list', None, None, '0-1', None, None, 'Grid Services Active', { 0: 'False', 1: 'True' }) if self.solarInstalled or PG_CLOUD_ONLY: # only add if solar exist - cannot test if this works as intented, and I cannot remove solar (I have solar) self.isyINFO.addIsyVaraiable(self.statusNodeID, self.solarSupply, 'KWh', 0, 20, None, None, 2, 'Current Solar Supply', None) self.isyINFO.addIsyVaraiable(self.statusNodeID, self.daysSolar, 'KWh', -100, 100, None, None, 2, 'Solar Power Today', None) self.isyINFO.addIsyVaraiable(self.statusNodeID, self.yesterdaySolar, 'KWh', -100, 100, None, None, 2, 'Solar Power Yesterday', None) self.isyINFO.addIsyVaraiable(self.statusNodeID, self.batterySupply, 'KWh', -20, 20, None, None, 2, 'Current Battery Supply', None) self.isyINFO.addIsyVaraiable(self.statusNodeID, self.daysBattery, 'KWh', -100, -100, None, None, 2, 'Battery Power Today', None) self.isyINFO.addIsyVaraiable(self.statusNodeID, self.yesterdayBattery, 'KWh', -100, 100, None, None, 2, 'Battery Power Yesterday', None) self.isyINFO.addIsyVaraiable(self.statusNodeID, self.gridSupply, 'KWh', -100, 100, None, None, 2, 'Current Grid Supply', None) self.isyINFO.addIsyVaraiable(self.statusNodeID, self.daysConsumption, 'KWh', -100, 100, None, None, 2, 'Power Consumed Today', None) self.isyINFO.addIsyVaraiable(self.statusNodeID, self.yesterdayConsumption, 'KWh', -100, 100, None, None, 2, 'Power Consumed Yesterday', None) self.isyINFO.addIsyVaraiable(self.statusNodeID, self.load, 'KWh', -100, 100, None, None, 1, 'Current Load', None) self.isyINFO.addIsyVaraiable(self.statusNodeID, self.daysGeneration, 'KWh', -100, 100, None, None, 2, 'Total Power Today', None) self.isyINFO.addIsyVaraiable(self.statusNodeID, self.yesterdayGeneration, 'KWh', -100, 100, None, None, 2, 'Total Power Yesterday', None) if self.TPWcloudAccess: self.isyINFO.addIsyVaraiable(self.statusNodeID, self.daysGridServices, 'KWh', -100, 100, None, None, 2, 'Grid Service Power Today', None) self.isyINFO.addIsyVaraiable(self.statusNodeID, self.yesterdayGridServices, 'KWh', -100, 100, None, None, 2, 'Grid Service Power Yesterday', None) if self.generatorInstalled and ( self.TPWcloudAccess and not (self.TPWlocalAccess) ) or (PG_CLOUD_ONLY): #I have no generator so I cannot test this if it self.isyINFO.addIsyVaraiable(self.statusNodeID, self.daysGenerator, 'KWh', -100, 100, None, None, 2, 'Generator Power Today', None) self.isyINFO.addIsyVaraiable(self.statusNodeID, self.yesterdayGenerator, 'KWh', -100, 100, None, None, 2, 'Generator Power Yesterday', None) self.addISYCriticalParam(self.statusNodeID, self.operationMode) if self.TPWcloudAccess: self.isyINFO.addISYnode(self.setupNodeID, self.setupNodeName, 'Electricity') self.isyINFO.addISYcommandReceive(self.setupNodeID, 'BACKUP_PCT', 'Backup Reserve (%)', self.backoffLevel) self.isyINFO.addIsyVaraiable(self.setupNodeID, self.backoffLevel, 'percent', 0, 100, None, None, 1, 'Backup Reserve (%)', None) self.isyINFO.addISYcommandReceive(self.setupNodeID, 'OP_MODE', 'Operating Mode', self.operationMode) self.isyINFO.addIsyVaraiable( self.setupNodeID, self.operationMode, 'list', None, None, '0-' + str(len(self.operationModeEnum) - 1), None, None, 'Operating Mode', self.operationModeEnum) self.isyINFO.addISYcommandReceive(self.setupNodeID, 'STORM_MODE', 'Set Storm Mode', self.stormMode) self.isyINFO.addIsyVaraiable(self.setupNodeID, self.stormMode, 'list', None, None, '0-1', None, None, 'Storm Mode', { 0: 'Disabled', 1: 'Enabled' }) self.isyINFO.addISYcommandReceive(self.setupNodeID, 'TOU_MODE', 'Time of Use Mode', self.touMode) self.isyINFO.addIsyVaraiable( self.setupNodeID, self.touMode, 'list', None, None, '0-' + str(len(self.touCloudEnum) - 1), None, None, 'Time of Use Mode', self.touCloudEnum) self.isyINFO.addIsyVaraiable(self.setupNodeID, self.weekendOffPeakStartSec, 'durationSec', 0, 86400, None, None, 0, 'Weekend Off-peak Start time (sec)', None) self.isyINFO.addISYcommandReceive( self.setupNodeID, 'WE_O_PEAK_START', 'Weekend Off-peak Start Time (sec)', self.weekendOffPeakStartSec) self.isyINFO.addIsyVaraiable(self.setupNodeID, self.weekendOffPeakEndSec, 'durationSec', 0, 86400, None, None, 0, 'Weekend Off-peak End time (sec)', None) self.isyINFO.addISYcommandReceive( self.setupNodeID, 'WE_O_PEAK_END', 'Weekend Off-peak Stop Time (sec)', self.weekendOffPeakEndSec) self.isyINFO.addIsyVaraiable(self.setupNodeID, self.weekendPeakStartSec, 'durationSec', 0, 86400, None, None, 0, 'Weekend Peak Start Time (sec)', None) self.isyINFO.addISYcommandReceive(self.setupNodeID, 'WE_PEAK_START', 'Weekend Peak Start Time (sec)', self.weekendPeakStartSec) self.isyINFO.addIsyVaraiable(self.setupNodeID, self.weekendPeakEndSec, 'durationSec', 0, 86400, None, None, 0, 'Weekend Peak End Time (sec)', None) self.isyINFO.addISYcommandReceive(self.setupNodeID, 'WE_PEAK_END', 'Weekend Peak Stop Time (sec)', self.weekendPeakEndSec) self.isyINFO.addIsyVaraiable(self.setupNodeID, self.weekdayOffPeakStartSec, 'durationSec', 0, 86400, None, None, 0, 'Weekday Off-Peak Start Time (sec)', None) self.isyINFO.addISYcommandReceive( self.setupNodeID, 'WK_O_PEAK_START', 'Weekday Off-peak Start Time (sec)', self.weekdayOffPeakStartSec) self.isyINFO.addIsyVaraiable(self.setupNodeID, self.weekdayOffPeakEndSec, 'durationSec', 0, 86400, None, None, 0, 'Weekday Off-peak End time (sec)', None) self.isyINFO.addISYcommandReceive( self.setupNodeID, 'WK_O_PEAK_END', 'Weekday Off-peak Stop Time (sec)', self.weekdayOffPeakEndSec) self.isyINFO.addIsyVaraiable(self.setupNodeID, self.weekdayPeakStartSec, 'durationSec', 0, 86400, None, None, 0, 'Weekday Peak Start Time (sec)', None) self.isyINFO.addISYcommandReceive(self.setupNodeID, 'WK_PEAK_START', 'Weekday Peak Start Time (sec)', self.weekdayPeakStartSec) self.isyINFO.addIsyVaraiable(self.setupNodeID, self.weekdayPeakEndSec, 'durationSec', 0, 86400, None, None, 0, 'Weekday Peak End Time (sec)', None) self.isyINFO.addISYcommandReceive(self.setupNodeID, 'WK_PEAK_END', 'Weekday Peak Stop Time (sec)', self.weekdayPeakEndSec) self.isyINFO.addISYcommandReceive(self.setupNodeID, 'UPDATE', 'Update System Data', None) #self.isyINFO.addNodeDefStruct(self.setupNodeID, self.setupNodeName) self.isyINFO.addControllerDefStruct(self.controllerID, self.controllerName) self.isyINFO.addNodeDefStruct(self.statusNodeID, self.statusNodeName) self.isyINFO.addNodeDefStruct(self.setupNodeID, self.setupNodeName) self.isyINFO.createSetupFiles('nodedefs.xml', 'editors.xml', 'en_us.txt') self.ISYmap = self.isyINFO.createISYmapping() def createISYsetupfiles(self, nodeDefFile, editorFile, nlsFile): self.isyINFO.createSetupFiles(nodeDefFile, editorFile, nlsFile) self.ISYmap = self.isyINFO.createISYmapping() def createLogFile(self, enabled): self.logFileEnabled = enabled def storeDaysData(self, filename, solar, consumption, generation, battery, gridUse, generator, dayInfo): try: if not (os.path.exists('./dailyData')): os.mkdir('./dailyData') dataFile = open('./dailyData/' + filename, 'w+') dataFile.write( 'Date, solarKW, ConsumptionKW, GenerationKW, BatteryKW, GridServicesUseKW, GeneratorKW \n' ) dataFile.close() dataFile = open('./dailyData/' + filename, 'a') dataFile.write( str(dayInfo) + ',' + str(solar) + ',' + str(consumption) + ',' + str(generation) + ',' + str(battery) + ',' + str(gridUse) + ',' + str(generator) + '\n') dataFile.close() except Exception as e: LOGGER.error('Exception storeDaysData: ' + str(e)) LOGGER.error('Failed to add data to ' + str(filename)) def getISYSendCommands(self, nodeId): LOGGER.debug('getISYSendCommands :' + str(nodeId)) self.isyINFO.getISYSendCommands(nodeId) def getISYReceiveCommands( self, nodeId, ): LOGGER.debug('getISYReceiveCommands :' + str(nodeId)) self.isyINFO.getISYReceiveCommands(nodeId) def supportedParamters(self, nodeId): if nodeId in self.ISYmap: temp = self.ISYmap[nodeId] else: LOGGER.error('Unknown Node Id: ' + str(nodeId)) temp = None return (temp) def getNodeIdList(self): return (self.isyINFO.getISYnodeList()) def getNodeName(self, nodeID): return (self.isyINFO.getISYNodeName(nodeID)) def getStatusNodeID(self): return (self.statusNodeID) def getSetupNodeID(self): return (self.setupNodeID) def addISYCriticalParam(self, Id, value): if Id in self.ISYCritical: self.ISYCritical[Id].append(value) else: self.ISYCritical[Id] = [] self.ISYCritical[Id].append(value) def criticalParamters(self, nodeId): temp = [] if nodeId in self.ISYCritical: if self.ISYCritical[nodeId]: for key in self.ISYCritical[nodeId]: temp.append(self.isyINFO.varToISY(nodeId, key)) else: LOGGER.debug('No critical Params fpr Node Id: ' + str(nodeId)) else: LOGGER.debug('No critical Params fpr Node Id: ' + str(nodeId)) return (temp) #return(self.ISYCritical[nodeId]) def pollSystemData(self, level): #LOGGER.debug('PollSystemData - ' + str(level)) try: self.nowDay = date.today() if (self.lastDay.day != self.nowDay.day) or self.TEST: # we passed midnight if not (PG_CLOUD_ONLY) and self.logFileEnabled: self.storeDaysData('dailydata.txt', self.daysTotalSolar, self.daysTotalConsumption, self.daysTotalGeneraton, self.daysTotalBattery, self.daysTotalGridServices, self.daysTotalGenerator, self.lastDay) self.yesterdayTotalSolar = self.daysTotalSolar self.yesterdayTotalConsumption = self.daysTotalConsumption self.yesterdayTotalGeneration = self.daysTotalGeneraton self.yesterdayTotalBattery = self.daysTotalBattery self.yesterdayTotalGridServices = self.daysTotalGridServices self.yesterdayTotalGenerator = self.daysTotalGenerator if self.TPWlocalAccess: self.metersDayStart = self.TPWlocal.get_meters() self.lastDay = self.nowDay if level == 'critical': if self.TPWcloudAccess: LOGGER.debug('pollSystemData - CLOUD - critical') self.TPWcloud.teslaUpdateCloudData('critical') if self.TPWlocalAccess: LOGGER.debug( 'pollSystemData - local CRITICAL - local connection = ' + str(self.localAccessUp)) if self.TPWlocal: if not (self.TPWlocal.is_authenticated()): self.TPWlocal.logout() time.sleep(1) if self.loginLocal(self.localEmail, self.localPassword, self.IPAddress): self.localAccessUp = True else: LOGGER.info( 'Not able to connecto to local power wall - trying gain later' ) return (False) else: if self.loginLocal(self.localEmail, self.localPassword, self.IPAddress): self.localAccessUp = True else: LOGGER.info( 'Not able to connecto to local power wall - tryng again later' ) self.localAccessUp = False return (False) if self.TPWlocal.is_authenticated(): self.localAccessUp = True self.status = self.TPWlocal.get_sitemaster() self.meters = self.TPWlocal.get_meters() #if self.getTPW_ConnectedTesla() and self.TPWcloudAccess: # self.TPWcloud.teslaUpdateCloudData('critical') return (True) if level == 'all': if self.TPWlocalAccess: LOGGER.debug( 'pollSystemData - local ALL - local connection = ' + str(self.localAccessUp)) if self.TPWlocal: if not (self.TPWlocal.is_authenticated()): self.TPWlocal.logout() time.sleep(1) if self.loginLocal(self.localEmail, self.localPassword, self.IPAddress): self.localAccessUp = True else: LOGGER.info( 'Not able to connecto to local power wall - trying gain later' ) return (False) else: if self.loginLocal(self.localEmail, self.localPassword, self.IPAddress): self.localAccessUp = True else: LOGGER.info( 'Not able to connecto to local power wall - tryng again later' ) self.localAccessUp = False return (False) if self.TPWlocal.is_authenticated(): self.localAccessUp = True self.status = self.TPWlocal.get_sitemaster() self.meters = self.TPWlocal.get_meters() self.daysTotalSolar = ( self.meters.solar.energy_exported - self.metersDayStart.solar.energy_exported) self.daysTotalConsumption = ( self.meters.load.energy_imported - self.metersDayStart.load.energy_imported) self.daysTotalGeneraton = ( self.meters.site.energy_exported - self.metersDayStart.site.energy_exported - (self.meters.site.energy_imported - self.metersDayStart.site.energy_imported)) self.daysTotalBattery = (float( self.meters.battery.energy_exported - self.metersDayStart.battery.energy_exported - (self.meters.battery.energy_imported - self.metersDayStart.battery.energy_imported))) if self.TPWcloudAccess: self.daysTotalGenerator = self.TPWcloud.teslaExtractDaysGeneratorUse( ) self.daysTotalGridServices = self.TPWcloud.teslaExtractDaysGridServicesUse( ) else: self.daysTotalGridServices = 0.0 #Does not seem to exist self.daysTotalGenerator = 0.0 #needs to be updated - may not exist return (True) else: LOGGER.error( 'No connection to Local Tesla Power Wall - trying again later' ) self.localAccessUp = False return (False) if self.TPWcloudAccess: LOGGER.debug('pollSystemData - CLOUD all') self.cloudAccessUp = self.TPWcloud.teslaUpdateCloudData( 'all') self.TPWcloud.teslaCalculateDaysTotals() self.daysTotalSolar = self.TPWcloud.teslaExtractDaysSolar() self.daysTotalConsumption = self.TPWcloud.teslaExtractDaysConsumption( ) self.daysTotalGeneraton = self.TPWcloud.teslaExtractDaysGeneration( ) self.daysTotalBattery = self.TPWcloud.teslaExtractDaysBattery( ) self.daysTotalGenerator = self.TPWcloud.teslaExtractDaysGeneratorUse( ) self.daysTotalGridServices = self.TPWcloud.teslaExtractDaysGridServicesUse( ) self.yesterdayTotalSolar = self.TPWcloud.teslaExtractYesteraySolar( ) self.yesterdayTotalConsumption = self.TPWcloud.teslaExtractYesterdayConsumption( ) self.yesterdayTotalGeneration = self.TPWcloud.teslaExtractYesterdayGeneraton( ) self.yesterdayTotalBattery = self.TPWcloud.teslaExtractYesterdayBattery( ) self.yesterdayTotalGridServices = self.TPWcloud.teslaExtractYesterdayGridServiceUse( ) self.yesterdayTotalGenerator = self.TPWcloud.teslaExtractYesterdayGeneratorUse( ) return (True) except Exception as e: LOGGER.error('Exception PollSystemData: ' + str(e)) LOGGER.error('problems extracting data from tesla power wall') # NEED To logout and log back in locally # Need to retrieve/renew token from cloud def getISYvalue(self, ISYvar, node): #LOGGER.debug( 'getISYvalue - ' + str(node)) if ISYvar in self.ISYmap[node]: self.teslaVarName = self.ISYmap[node][ISYvar]['systemVar'] #LOGGER.debug('tesla Var Name: ' + str(self.teslaVarName)) if self.teslaVarName == self.chargeLevel: return (self.getTPW_chargeLevel()) elif self.teslaVarName == self.backoffLevel: return (self.getTPW_backoffLevel()) elif self.teslaVarName == self.gridStatus: return (self.getTPW_gridStatus()) elif self.teslaVarName == self.solarSupply: return (self.getTPW_solarSupply()) elif self.teslaVarName == self.batterySupply: return (self.getTPW_batterySupply()) elif self.teslaVarName == self.gridSupply: return (self.getTPW_gridSupply()) elif self.teslaVarName == self.load: return (self.getTPW_load()) elif self.teslaVarName == self.daysSolar: return (self.getTPW_daysSolar()) elif self.teslaVarName == self.daysConsumption: return (self.getTPW_daysConsumption()) elif self.teslaVarName == self.daysGeneration: return (self.getTPW_daysGeneration()) elif self.teslaVarName == self.daysBattery: return (self.getTPW_daysBattery()) elif self.teslaVarName == self.daysGridServices: return (self.getTPW_daysGridServicesUse()) elif self.teslaVarName == self.daysGenerator: return (self.getTPW_daysGeneratorUse()) elif self.teslaVarName == self.operationMode: return (self.getTPW_operationMode()) elif self.teslaVarName == self.powerSupplyMode: return (self.getTPW_powerSupplyMode()) elif self.teslaVarName == self.gridServiceActive: return (self.getTPW_gridServiceActive()) elif self.teslaVarName == self.stormMode: return (self.getTPW_stormMode()) elif self.teslaVarName == self.touMode: return (self.getTPW_touMode()) elif self.teslaVarName == self.daysBattery: return (self.getTPW_daysBattery()) elif self.teslaVarName == self.daysGridServices: return (self.getTPW_daysGridServicesUse()) elif self.teslaVarName == self.ConnectedTesla: return (self.getTPW_ConnectedTesla()) elif self.teslaVarName == self.yesterdaySolar: return (self.getTPW_yesterdaySolar()) elif self.teslaVarName == self.yesterdayConsumption: return (self.getTPW_yesterdayConsumption()) elif self.teslaVarName == self.yesterdayGeneration: return (self.getTPW_yesterdayConsumption()) elif self.teslaVarName == self.yesterdayBattery: return (self.getTPW_yesterdayBattery()) elif self.teslaVarName == self.yesterdayGridServices: return (self.getTPW_yesterdayGridServicesUse()) elif self.teslaVarName == self.yesterdayGenerator: return (self.getTPW_yesterdayGeneratorUse()) elif self.teslaVarName == self.weekendOffPeakStartSec: return (self.getTPW_getTouData('weekend', 'off_peak', 'start')) elif self.teslaVarName == self.weekendOffPeakEndSec: return (self.getTPW_getTouData('weekend', 'off_peak', 'stop')) elif self.teslaVarName == self.weekendPeakStartSec: return (self.getTPW_getTouData('weekend', 'peak', 'start')) elif self.teslaVarName == self.weekendPeakEndSec: return (self.getTPW_getTouData('weekend', 'peak', 'stop')) elif self.teslaVarName == self.weekdayOffPeakStartSec: return (self.getTPW_getTouData('weekday', 'off_peak', 'start')) elif self.teslaVarName == self.weekdayOffPeakEndSec: return (self.getTPW_getTouData('weekday', 'off_peak', 'stop')) elif self.teslaVarName == self.weekdayPeakStartSec: return (self.getTPW_getTouData('weekday', 'peak', 'start')) elif self.teslaVarName == self.weekdayPeakEndSec: return (self.getTPW_getTouData('weekday', 'peak', 'stop')) elif (self.teslaVarName == self.nodeServerUp) or (self.teslaVarName == self.statusName): return (self.isNodeServerUp()) else: LOGGER.debug('Error - unknown variable: ' + str(self.teslaVarName)) else: LOGGER.debug('Error - unknown variable: ' + str(ISYvar)) # Need to be imlemented def isNodeServerUp(self): LOGGER.debug('isNodeServerUp - called') if self.localAccessUp == True or self.cloudAccessUp == True: return (1) else: return (0) def TPW_updateMeter(self): self.pollSystemData('all') return (None) def getTPW_chargeLevel(self): if self.TPWlocalAccess: chargeLevel = self.TPWlocal.get_charge() else: chargeLevel = self.TPWcloud.teslaExtractChargeLevel() LOGGER.debug('getTPW_chargeLevel' + str(chargeLevel)) return (round(chargeLevel, 1)) def getTPW_backoffLevel(self): if self.TPWlocalAccess: backoffLevel = self.TPWlocal.get_backup_reserve_percentage() else: backoffLevel = self.TPWcloud.teslaExtractBackoffLevel() LOGGER.debug('getTPW_backoffLevel' + str(backoffLevel)) return (round(backoffLevel, 1)) def getBackupPercentISYVar(self, node): return (self.isyINFO.varToISY(node, self.backoffLevel)) def setTPW_backoffLevel(self, backupPercent): return (self.TPWcloud.teslaSetBackoffLevel(backupPercent)) def getTPW_gridStatus(self): if self.TPWlocalAccess: statusVal = self.TPWlocal.get_grid_status() if statusVal.value in self.gridStatusEnum: key = self.gridStatusEnum[statusVal.value] #LOGGER.debug(key) else: key = self.TPWcloud.teslaExtractGridStatus() LOGGER.debug('grid status ' + str(self.gridstatus[key])) return (self.gridstatus[key]) def getTPW_solarSupply(self): if self.TPWlocalAccess: #LOGGER.debug(self.meters) solarPwr = self.meters.solar.instant_power else: solarPwr = self.TPWcloud.teslaExtractSolarSupply() LOGGER.debug('getTPW_solarSupply - ' + str(solarPwr)) return (round(solarPwr / 1000, 2)) #site_live def getTPW_batterySupply(self): if self.TPWlocalAccess: batteryPwr = self.meters.battery.instant_power else: batteryPwr = self.TPWcloud.teslaExtractBatterySupply() LOGGER.debug('getTPW_batterySupply' + str(batteryPwr)) return (round(batteryPwr / 1000, 2)) #site_live def getTPW_gridSupply(self): if self.TPWlocalAccess: gridPwr = self.meters.site.instant_power else: gridPwr = self.TPWcloud.teslaExtractGridSupply() LOGGER.debug('getTPW_gridSupply' + str(gridPwr)) return (round(gridPwr / 1000, 2)) def getTPW_load(self): if self.TPWlocalAccess: loadPwr = self.meters.load.instant_power else: loadPwr = self.TPWcloud.teslaExtractLoad() LOGGER.debug('getTPW_load ' + str(loadPwr)) return (round(loadPwr / 1000, 2)) def getTPW_daysSolar(self): if self.TPWlocalAccess: Pwr = self.daysTotalSolar else: Pwr = self.TPWcloud.teslaExtractDaysSolar() LOGGER.debug('getTPW_daysSolar ' + str(Pwr)) return (round(Pwr / 1000, 2)) def getTPW_daysConsumption(self): if self.TPWlocalAccess: Pwr = self.daysTotalConsumption else: Pwr = self.TPWcloud.teslaExtractDaysConsumption() LOGGER.debug('getTPW_daysConsumption ' + str(Pwr)) return (round(Pwr / 1000, 2)) def getTPW_daysGeneration(self): if self.TPWlocalAccess: Pwr = self.daysTotalGeneraton else: Pwr = self.TPWcloud.teslaExtractDaysGeneration() LOGGER.debug('getTPW_daysGeneration ' + str(Pwr)) return (round(Pwr / 1000, 2)) def getTPW_daysBattery(self): if self.TPWlocalAccess: Pwr = self.daysTotalBattery else: Pwr = self.TPWcloud.teslaExtractDaysBattery() LOGGER.debug('getTPW_daysBattery ' + str(Pwr)) return (round(Pwr / 1000, 2)) def getTPW_daysGridServicesUse(self): if self.TPWlocalAccess: Pwr = self.daysTotalGridServices else: Pwr = self.TPWcloud.teslaExtractDaysGridServicesUse() LOGGER.debug('getTPW_daysGridServicesUse ' + str(Pwr)) return (round(Pwr / 1000, 2)) def getTPW_daysGeneratorUse(self): if self.TPWlocalAccess: Pwr = self.daysTotalGenerator else: Pwr = self.TPWcloud.teslaExtractDaysGeneratorUse() LOGGER.debug('getTPW_daysGeneratorUse ' + str(Pwr)) return (round(Pwr / 1000, 2)) def getTPW_yesterdaySolar(self): if self.TPWlocalAccess: Pwr = self.yesterdayTotalSolar else: Pwr = self.TPWcloud.teslaExtractYesteraySolar() LOGGER.debug('getTPW_daysSolar ' + str(Pwr)) return (round(Pwr / 1000, 2)) def getTPW_yesterdayConsumption(self): if self.TPWlocalAccess: Pwr = self.yesterdayTotalConsumption else: Pwr = self.TPWcloud.teslaExtractYesterdayConsumption() LOGGER.debug('getTPW_daysConsumption ' + str(Pwr)) return (round(Pwr / 1000, 2)) def getTPW_yesterdayGeneration(self): if self.TPWlocalAccess: Pwr = self.yesterdayTotalGeneration else: Pwr = self.TPWcloud.teslaExtractYesterdayGeneraton() LOGGER.debug('getTPW_daysGeneration ' + str(Pwr)) return (round(Pwr / 1000, 2)) def getTPW_yesterdayBattery(self): if self.TPWlocalAccess: Pwr = self.yesterdayTotalBattery else: Pwr = self.TPWcloud.teslaExtractYesterdayBattery() LOGGER.debug('getTPW_daysBattery ' + str(Pwr)) return (round(Pwr / 1000, 2)) def getTPW_yesterdayGridServicesUse(self): if self.TPWlocalAccess: Pwr = self.yesterdayTotalGridServices else: Pwr = self.TPWcloud.teslaExtractYesterdayGridServiceUse() LOGGER.debug('getTPW_daysGridServicesUse ' + str(Pwr)) return (round(Pwr / 1000, 2)) #bat_history def getTPW_yesterdayGeneratorUse(self): if self.TPWlocalAccess: Pwr = self.yesterdayTotalGenerator else: Pwr = self.TPWcloud.teslaExtractYesterdayGeneratorUse() LOGGER.debug('getTPW_daysGeneratorUse ' + str(Pwr)) return (round(Pwr / 1000, 2)) #bat_history def getTPW_operationMode(self): if self.TPWlocalAccess: operationVal = self.TPWlocal.get_operation_mode() key = self.operationLocalEnum[operationVal.value] else: key = self.TPWcloud.teslaExtractOperationMode() return (self.ISYoperationModeEnum[key]) def getOperatingModeISYVar(self, node): return (self.isyINFO.varToISY(node, self.operationMode)) def setTPW_operationMode(self, index): return (self.TPWcloud.teslaSetOperationMode( self.operationModeEnum[index])) ''' def getTPW_running(self): if self.status.is_running: return(1) else: return(0) ''' def getTPW_powerSupplyMode(self): if self.status.is_power_supply_mode: return (1) else: return (0) def getTPW_ConnectedTesla(self): # can check other direction if self.status.is_connected_to_tesla: return (1) else: return (0) def getTPW_gridServiceActive(self): if self.TPWlocalAccess: res = self.TPWlocal.is_grid_services_active() else: res = self.TPWcloud.teslaExtractGridServiceActive() if res: return (1) else: return (0) def getTPW_stormMode(self): if self.TPWcloudAccess: if self.TPWcloud.teslaExtractStormMode(): return (1) else: return (0) def getStormModeISYVar(self, node): return (self.isyINFO.varToISY(node, self.stormMode)) def setTPW_stormMode(self, mode): return (self.TPWcloud.teslaSetStormMode(mode == 1)) def getTPW_touMode(self): if self.TPWcloudAccess: return (self.ISYtouEnum[self.TPWcloud.teslaExtractTouMode()]) def getTOUmodeISYVar(self, node): return (self.isyINFO.varToISY(node, self.touMode)) def getTPW_touSchedule(self): if self.TPWcloudAccess: return (self.TPWcloud.teslaExtractTouScheduleList()) def setTPW_touMode(self, index): if self.TPWcloudAccess: return (self.TPWcloud.teslaSetTimeOfUseMode( self.touCloudEnum[index])) def setTPW_touSchedule(self, peakOffpeak, weekWeekend, startEnd, time_s): if self.TPWcloudAccess: return (self.TPWcloud.teslaSetTouSchedule(peakOffpeak, weekWeekend, startEnd, time_s)) def setTPW_updateTouSchedule(self, peakOffpeak, weekWeekend, startEnd, time_s): if self.TPWcloudAccess: return (self.TPWcloud.teslaSetTouSchedule(peakOffpeak, weekWeekend, startEnd, time_s)) def getTPW_getTouData(self, days, peakMode, startEnd): if self.TPWcloudAccess: return (self.TPWcloud.teslaExtractTouTime(days, peakMode, startEnd)) def getTouWeekendOffpeakStartISYVar(self, node): if self.TPWcloudAccess: return (self.isyINFO.varToISY(node, self.weekendOffPeakStartSec)) def getTouWeekendOffpeakEndISYVar(self, node): if self.TPWcloudAccess: return (self.isyINFO.varToISY(node, self.weekendOffPeakEndSec)) def getTouWeekendPeakStartISYVar(self, node): if self.TPWcloudAccess: return (self.isyINFO.varToISY(node, self.weekendPeakStartSec)) def getTouWeekendPeakEndISYVar(self, node): if self.TPWcloudAccess: return (self.isyINFO.varToISY(node, self.weekendPeakEndSec)) def getTouWeekOffpeakStartISYVar(self, node): if self.TPWcloudAccess: return (self.isyINFO.varToISY(node, self.weekdayOffPeakStartSec)) def getTouWeekOffpeakEndISYVar(self, node): if self.TPWcloudAccess: return (self.isyINFO.varToISY(node, self.weekdayOffPeakEndSec)) def getTouWeekPeakStartISYVar(self, node): if self.TPWcloudAccess: return (self.isyINFO.varToISY(node, self.weekdayPeakStartSec)) def getTouWeekPeakEndISYVar(self, node): if self.TPWcloudAccess: return (self.isyINFO.varToISY(node, self.weekdayPeakEndSec)) def disconnectTPW(self): if self.TPWlocal != None: self.TPWlocal.close()