diff --git a/one2.php b/one2.php
deleted file mode 100644
index b699d95..0000000
--- a/one2.php
+++ /dev/null
@@ -1,255 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/onenew.php b/onenew.php
deleted file mode 100644
index b9c9ee9..0000000
--- a/onenew.php
+++ /dev/null
@@ -1,265 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/power3new.py b/power3new.py
deleted file mode 100644
index d254169..0000000
--- a/power3new.py
+++ /dev/null
@@ -1,209 +0,0 @@
-import requests
-import polyline
-import json
-import psycopg2
-import psycopg2.extensions
-from datetime import datetime, timezone
-from geojson import Point, Feature, FeatureCollection, dump
-import re
-
-conn = psycopg2.connect(host='localhost', database='nws', user='nws', password='nws')
-cursor = conn.cursor()
-proxies = {"http":"http://nws:nws@localhost:9000"}
-
-aepohmeta = "http://outagemap.aepohio.com.s3.amazonaws.com/resources/data/external/interval_generation_data/metadata.json"
-aepwvmeta = "http://outagemap.appalachianpower.com.s3.amazonaws.com/resources/data/external/interval_generation_data/metadata.json"
-firstpowerwvmeta = "https://s3.amazonaws.com/outages.sc4.firstenergycorp.com/resources/data/mdwv/interval_generation_data/metadata.json"
-aepkymeta = 'http://outagemap.kentuckypower.com.s3.amazonaws.com/resources/data/external/interval_generation_data/metadata.json'
-
-
-
-aepwvbase = "http://outagemap.appalachianpower.com.s3.amazonaws.com/resources/data/external/interval_generation_data/"
-aepohbase = "http://outagemap.aepohio.com.s3.amazonaws.com/resources/data/external/interval_generation_data/"
-firstpowerwvbase = "https://s3.amazonaws.com/outages.sc4.firstenergycorp.com/resources/data/mdwv/interval_generation_data/"
-aepkybase = 'http://outagemap.kentuckypower.com.s3.amazonaws.com/resources/data/external/interval_generation_data/'
-graysoncounty = 'https://outages.graysonrecc.com/data/boundaries.json'
-#flemingjson = 'https://outage.fme.coop/data/boundaries.json'
-
-#buckeye rec
-#https://outage.buckeyerec.coop/maps/OutageWebMap/maps/GWT.rpc
-#washington
-#https://weci.ebill.coop/woViewer/MapWiseWeb/GWT.rpc
-allcountyoutages = []
-
-S = requests.Session()
-
-
-
-
-def fleming():
- state = 'KY'
- company = 'FLEM'
- temp = S.get(flemingjson)
- tempdata = json.loads(temp.text)
- for j in tempdata[0]['boundaries']:
- outageinfo = j.get('customersOutNow'),j.get('customersServed'),j.get('name'),state,company
- allcountyoutages.append(outageinfo)
-
-
-
-
-
-def bigsandy():
- state = 'OH'
- company = 'BS'
- temp = S.get('http://outagemap.bigsandyrecc.com/data/boundaries.json')
- tempdata = json.loads(temp.text)
- for j in tempdata[0]['boundaries']:
- outageinfo = j.get('customersOutNow'),j.get('customersServed'),j.get('name'),state,company
- allcountyoutages.append(outageinfo)
-
-
-
-
-def southcentralpower():
- company = 'SCP'
- url = 'http://outage.southcentralpower.com/data/boundaries.json'
- Sp = requests.Session()
-# Sp.proxies.update(proxies)
- temp = Sp.get(url).text
- tempdata = json.loads(temp)
- state = 'OH'
-
- for j in tempdata[0]['boundaries']:
- outageinfo = j.get('customersOutNow'),j.get('customersServed'),j.get('name'),state,company
- allcountyoutages.append(outageinfo)
-
-
-def ku_get_url():
- url = 'https://stormcenter.lge-ku.com/reports/1d6f7e68-e192-43c1-bfdc-d809333d8e40'
- r = requests.get(url).text
- x = re.search(r"instanceId: '(.*?)',",r)
- urlcom = x.group(1)
- urlcom = 'https://kubra.io/stormcenter/api/v1/stormcenters/' + urlcom + '/views/a6cee9e4-312b-4b77-9913-2ae371eb860d/currentState?preview=false'
- stuff = S.get(urlcom)
- jsonstuff = json.loads(stuff.text)
- interval_data = jsonstuff.get('data').get('interval_generation_data')
- urlcom = 'https://kubra.io/' + interval_data + '/public/reports/1d6f7e68-e192-43c1-bfdc-d809333d8e40_report.json'
- return urlcom
-
-
-def county_json(meta,url,jsonname):
- metainfo = json.loads(S.get(meta).text)
- metadir = metainfo['directory']
- url = url + metadir + jsonname
- outage = S.get(url)
- return outage
-
-
-
-def ku():
- ku = []
- url = ku_get_url()
- data = S.get(url).text
- tempdata = json.loads(data)
- temp = tempdata['file_data']['areas'][2]['areas'][0]['areas']
- temp1 = tempdata['file_data']['areas'][2]['areas'][1]['areas']
- temp2 = tempdata['file_data']['areas'][1]['areas'][0]['areas']
-
- for i in temp:
- ku.append(i)
- for i in temp1:
- ku.append(i)
- for i in temp2:
- ku.append(i)
- for o in ku:
- outageinfo = o['cust_a']['val'],o['cust_s'],o['name'].capitalize(),o['state'],o['utility']
- allcountyoutages.append(outageinfo)
-
-
-def grayson():
- company = 'GRE'
- outage = S.get(graysoncounty)
- if outage.headers.get('Content-Type').startswith('application/json'):
- tempdata = json.loads(outage.text)
- state = 'KY'
- for j in tempdata[0]['boundaries']:
- outageinfo = j.get('customersOutNow'),j.get('customersServed'),j.get('name'),state,company
- allcountyoutages.append(outageinfo)
-
-
-def aep_county_vawv(meta,url,jsonname):
- company = 'AEP'
- outage = county_json(meta,url,jsonname)
- if outage.headers.get('Content-Type').startswith('application/octet-stream'):
- tempdata = json.loads(outage.text)
- state = 'WV'
- for j in tempdata['file_data']['areas'][0]['areas'][2]['areas']:
- outageinfo = j.get('cust_a').get('val'), j.get('cust_s'), j.get('area_name'), state, company
- allcountyoutages.append(outageinfo)
- state = 'VA'
- for j in tempdata['file_data']['areas'][0]['areas'][1]['areas']:
- outageinfo = j.get('cust_a').get('val'), j.get('cust_s'), j.get('area_name').capitalize(), state, company
- allcountyoutages.append(outageinfo)
-
-def aep_county_oh(meta,url,jsonname):
- company = 'AEP'
- state = 'OH'
- outage = county_json(meta,url,jsonname)
- tempdata = json.loads(outage.text)
- for j in tempdata['file_data']['areas'][0]['areas'][0]['areas']:
- outageinfo = j.get('cust_a').get('val'), j.get('cust_s'), j.get('area_name').capitalize(), state, company
- allcountyoutages.append(outageinfo)
-
-def aep_county_ky(meta,url,jsonname):
- company = 'AEP'
- state = 'KY'
- outage = county_json(meta,url,jsonname)
- tempdata = json.loads(outage.text)
- for j in tempdata['file_data']['areas'][0]['areas'][0]['areas']:
- outageinfo = j.get('cust_a').get('val'), j.get('cust_s'), j.get('area_name').capitalize(), state, company
- allcountyoutages.append(outageinfo)
-
-def firstenergy_county(meta,url,jsonname):
- company = 'FE'
- state = 'WV'
- outage = county_json(meta,url,jsonname)
- if outage.headers.get('Content-Type').startswith('application/octet-stream'):
- tempdata = json.loads(outage.text)
- for j in tempdata['file_data']['areas'][0]['areas'][0]['areas']:
- outageinfo = j.get('cust_a').get('val'), j.get('cust_s'), j.get('area_name').capitalize(),state, company
- allcountyoutages.append(outageinfo)
-
-
-aep_county_vawv(aepwvmeta,'https://d2oclp3li76tyy.cloudfront.net/resources/data/external/interval_generation_data/','/report_county.json')
-firstenergy_county('https://s3.amazonaws.com/outages.sc4.firstenergycorp.com/resources/data/mdwv/interval_generation_data/metadata.json','https://s3.amazonaws.com/outages.sc4.firstenergycorp.com/resources/data/mdwv/interval_generation_data/','/report_county_ctv_wv.json')
-aep_county_oh(aepohmeta,'http://outagemap.aepohio.com.s3.amazonaws.com/resources/data/external/interval_generation_data/','/report_county.json')
-aep_county_ky(aepkymeta, aepkybase, '/report_county.json')
-grayson()
-ku()
-southcentralpower()
-bigsandy()
-
-
-
-current_timestamp = str(datetime.utcnow())
-for i in allcountyoutages:
- sql = 'insert into countyoutages (outages, served, county, state, update, company) values (%s, %s, %s, %s, %s, %s)'
- val = (i[0], i[1], i[2], i[3], current_timestamp, i[4])
- cursor.execute(sql,val)
-conn.commit()
-
-cursor.execute('update countyoutages set cwa = county.cwa from county where county.countyname = countyoutages.county and county.state = countyoutages.state and countyoutages.cwa is null')
-
-conn.commit()
-
-#cursor.execute("delete from countyoutages where cwa != 'RLX'")
-cursor.execute("delete from countyoutages where cwa is null")
-cursor.execute("delete from countyoutages where update < now () - interval '365 days'")
-conn.commit()
-
-
-
-
-
-
-
-
-#print(allcountyoutages)
-
diff --git a/power_outages.txt b/power_outages.txt
deleted file mode 100644
index d81f1fa..0000000
--- a/power_outages.txt
+++ /dev/null
@@ -1,82 +0,0 @@
-Color: 255 0 0
-Font: 1, 11, 1, "Arial"
-Threshold: 9999
-Place: -82.33573 37.99161, icon=2, label="Outage #4
-Cause: None
-Last Update: 2025-04-06 21:25: UTC"
-Place: -81.61944 38.92038, icon=2, label="Outage #19
-Cause: Pending Investigation
-Last Update: 2025-04-06 21:25: UTC"
-Place: -81.72974 39.15171, icon=2, label="Outage #19
-Cause: Pending Investigation
-Last Update: 2025-04-06 21:25: UTC"
-Place: -81.53436 39.20742, icon=2, label="Outage #19
-Cause: Pending Investigation
-Last Update: 2025-04-06 21:25: UTC"
-Place: -80.25851 39.16533, icon=2, label="Outage #19
-Cause: Pending Investigation
-Last Update: 2025-04-06 21:25: UTC"
-Place: -80.57541 39.34415, icon=2, label="Outage #19
-Cause: Pending Investigation
-Last Update: 2025-04-06 21:25: UTC"
-Place: -81.248 38.77818, icon=2, label="Outage #19
-Cause: Pending Investigation
-Last Update: 2025-04-06 21:25: UTC"
-Place: -80.52457 38.39864, icon=2, label="Outage #19
-Cause: Pending Investigation
-Last Update: 2025-04-06 21:25: UTC"
-Place: -80.41218 38.46986, icon=2, label="Outage #19
-Cause: Pending Investigation
-Last Update: 2025-04-06 21:25: UTC"
-Place: -80.45523 38.45674, icon=2, label="Outage #19
-Cause: Pending Investigation
-Last Update: 2025-04-06 21:25: UTC"
-Place: -81.46448 38.43202, icon=2, label="Outage #163
-Cause: Tree Contact
-Last Update: 2025-04-06 21:25: UTC"
-Place: -81.48033 38.70811, icon=2, label="Outage #108
-Cause: None
-Last Update: 2025-04-06 21:25: UTC"
-Place: -81.08233 38.33495, icon=2, label="Outage #14
-Cause: Tree Contact
-Last Update: 2025-04-06 21:25: UTC"
-Place: -80.64911 38.42277, icon=2, label="Outage #19
-Cause: Tree Damage
-Last Update: 2025-04-06 21:00: UTC"
-Place: -80.64508 38.42421, icon=2, label="Outage #19
-Cause: Emergency Equipment Repair
-Last Update: 2025-04-06 21:00: UTC"
-Place: -80.64925 38.42389, icon=2, label="Outage #19
-Cause: Pending Investigation
-Last Update: 2025-04-06 21:00: UTC"
-Place: -81.16478 38.32286, icon=2, label="Outage #4
-Cause: None
-Last Update: 2025-04-06 21:10: UTC"
-Place: -81.54974 38.53972, icon=2, label="Outage #7
-Cause: None
-Last Update: 2025-04-06 21:25: UTC"
-Place: -81.13474 38.01172, icon=2, label="Outage #23
-Cause: None
-Last Update: 2025-04-06 21:25: UTC"
-Place: -82.47047 37.15274, icon=2, label="Outage #46
-Cause: None
-Last Update: 2025-04-06 21:25: UTC"
-Place: -82.39272 37.04287, icon=2, label="Outage #147
-Cause: Tree Contact
-Last Update: 2025-04-06 21:25: UTC"
-Place: -83.059326 38.44866, icon=2, label="Outage #9
-Cause: None
-Last Update: 2025-04-06 21:11: UTC"
-Place: -81.7956 37.56702, icon=2, label="Outage #64
-Cause: Tree Contact
-Last Update: 2025-04-06 21:25: UTC"
-Place: -81.80097 37.5298, icon=2, label="Outage #4
-Cause: Equipment Related
-Last Update: 2025-04-06 21:25: UTC"
-Place: -81.91268 39.47965, icon=2, label="Outage #4
-Cause: None
-Last Update: 2025-04-06 21:25: UTC"
-Place: -81.44512 39.42116, icon=2, label="Outage #4
-Cause: None
-Last Update: 2025-04-06 21:25: UTC"
-End:
diff --git a/power_outages_gr2.txt b/power_outages_gr2.txt
deleted file mode 100644
index 72c81de..0000000
--- a/power_outages_gr2.txt
+++ /dev/null
@@ -1,188 +0,0 @@
-Refresh: 1
-Threshold: 999 nautical_miles
-Title: Power Outages (RLX CWA) - Triangles
-Font: 1, 11, 0, "Courier New"
-Color: 255 0 0
-Triangles:
- 37.15803, -82.2399
- 37.19803, -82.2399
- 37.17803, -82.1799
-End:
-Color: 0 0 255
-Text: 37.17803, -82.2099, 1, "Outage #4", "Outage #4\nCause: None\nLast Update: 2025-04-06 21:50: UTC"
-Triangles:
- 37.13274, -82.50047
- 37.172740000000005, -82.50047
- 37.15274, -82.44047
-End:
-Color: 0 0 255
-Text: 37.15274, -82.47047, 1, "Outage #46", "Outage #46\nCause: None\nLast Update: 2025-04-06 21:50: UTC"
-Triangles:
- 37.02287, -82.42272
- 37.062870000000004, -82.42272
- 37.04287, -82.36272
-End:
-Color: 0 0 255
-Text: 37.04287, -82.39272, 1, "Outage #147", "Outage #147\nCause: Tree Contact\nLast Update: 2025-04-06 21:50: UTC"
-Triangles:
- 38.31505, -81.11213000000001
- 38.355050000000006, -81.11213000000001
- 38.33505, -81.05213
-End:
-Color: 0 0 255
-Text: 38.33505, -81.08213, 1, "Outage #13", "Outage #13\nCause: Tree Contact\nLast Update: 2025-04-06 21:50: UTC"
-Triangles:
- 38.40376, -81.50807
- 38.443760000000005, -81.50807
- 38.42376, -81.44807
-End:
-Color: 0 0 255
-Text: 38.42376, -81.47807, 1, "Outage #8", "Outage #8\nCause: Tree Contact\nLast Update: 2025-04-06 21:50: UTC"
-Triangles:
- 38.51972, -81.57974
- 38.559720000000006, -81.57974
- 38.53972, -81.51974
-End:
-Color: 0 0 255
-Text: 38.53972, -81.54974, 1, "Outage #7", "Outage #7\nCause: None\nLast Update: 2025-04-06 21:50: UTC"
-Triangles:
- 38.688109999999995, -81.51033
- 38.72811, -81.51033
- 38.70811, -81.45033
-End:
-Color: 0 0 255
-Text: 38.70811, -81.48033, 1, "Outage #108", "Outage #108\nCause: None\nLast Update: 2025-04-06 21:50: UTC"
-Triangles:
- 39.459649999999996, -81.94268
- 39.49965, -81.94268
- 39.47965, -81.88268
-End:
-Color: 0 0 255
-Text: 39.47965, -81.91268, 1, "Outage #4", "Outage #4\nCause: None\nLast Update: 2025-04-06 21:50: UTC"
-Triangles:
- 38.90038, -81.64944
- 38.940380000000005, -81.64944
- 38.92038, -81.58944
-End:
-Color: 0 0 255
-Text: 38.92038, -81.61944, 1, "Outage #19", "Outage #19\nCause: Pending Investigation\nLast Update: 2025-04-06 21:50: UTC"
-Triangles:
- 39.13171, -81.75974000000001
- 39.171710000000004, -81.75974000000001
- 39.15171, -81.69974
-End:
-Color: 0 0 255
-Text: 39.15171, -81.72974, 1, "Outage #19", "Outage #19\nCause: Pending Investigation\nLast Update: 2025-04-06 21:50: UTC"
-Triangles:
- 39.37441999999999, -80.6919
- 39.41442, -80.6919
- 39.39442, -80.6319
-End:
-Color: 0 0 255
-Text: 39.39442, -80.6619, 1, "Outage #19", "Outage #19\nCause: Pending Investigation\nLast Update: 2025-04-06 21:50: UTC"
-Triangles:
- 38.828689999999995, -81.20764
- 38.86869, -81.20764
- 38.84869, -81.14764
-End:
-Color: 0 0 255
-Text: 38.84869, -81.17764, 1, "Outage #30", "Outage #30\nCause: Pending Investigation\nLast Update: 2025-04-06 21:50: UTC"
-Triangles:
- 39.187419999999996, -81.56436000000001
- 39.22742, -81.56436000000001
- 39.20742, -81.50436
-End:
-Color: 0 0 255
-Text: 39.20742, -81.53436, 1, "Outage #19", "Outage #19\nCause: Pending Investigation\nLast Update: 2025-04-06 21:50: UTC"
-Triangles:
- 39.145329999999994, -80.28851
- 39.18533, -80.28851
- 39.16533, -80.22851
-End:
-Color: 0 0 255
-Text: 39.16533, -80.25851, 1, "Outage #19", "Outage #19\nCause: Pending Investigation\nLast Update: 2025-04-06 21:50: UTC"
-Triangles:
- 39.324149999999996, -80.60541
- 39.36415, -80.60541
- 39.34415, -80.54541
-End:
-Color: 0 0 255
-Text: 39.34415, -80.57541, 1, "Outage #19", "Outage #19\nCause: Pending Investigation\nLast Update: 2025-04-06 21:50: UTC"
-Triangles:
- 38.758179999999996, -81.278
- 38.79818, -81.278
- 38.77818, -81.218
-End:
-Color: 0 0 255
-Text: 38.77818, -81.248, 1, "Outage #19", "Outage #19\nCause: Pending Investigation\nLast Update: 2025-04-06 21:50: UTC"
-Triangles:
- 38.449859999999994, -80.44218000000001
- 38.48986, -80.44218000000001
- 38.46986, -80.38218
-End:
-Color: 0 0 255
-Text: 38.46986, -80.41218, 1, "Outage #19", "Outage #19\nCause: Pending Investigation\nLast Update: 2025-04-06 21:50: UTC"
-Triangles:
- 38.43674, -80.48523
- 38.47674000000001, -80.48523
- 38.45674, -80.42523
-End:
-Color: 0 0 255
-Text: 38.45674, -80.45523, 1, "Outage #19", "Outage #19\nCause: Pending Investigation\nLast Update: 2025-04-06 21:50: UTC"
-Triangles:
- 37.5098, -81.83097000000001
- 37.549800000000005, -81.83097000000001
- 37.5298, -81.77097
-End:
-Color: 0 0 255
-Text: 37.5298, -81.80097, 1, "Outage #4", "Outage #4\nCause: Equipment Related\nLast Update: 2025-04-06 21:50: UTC"
-Triangles:
- 38.314949999999996, -81.11233
- 38.35495, -81.11233
- 38.33495, -81.05233
-End:
-Color: 0 0 255
-Text: 38.33495, -81.08233, 1, "Outage #14", "Outage #14\nCause: Tree Contact\nLast Update: 2025-04-06 21:40: UTC"
-Triangles:
- 39.40116, -81.47512
- 39.44116, -81.47512
- 39.42116, -81.41512
-End:
-Color: 0 0 255
-Text: 39.42116, -81.44512, 1, "Outage #4", "Outage #4\nCause: None\nLast Update: 2025-04-06 21:40: UTC"
-Triangles:
- 38.37864, -80.55457
- 38.41864, -80.55457
- 38.39864, -80.49457
-End:
-Color: 0 0 255
-Text: 38.39864, -80.52457, 1, "Outage #19", "Outage #19\nCause: Pending Investigation\nLast Update: 2025-04-06 21:30: UTC"
-Triangles:
- 37.547019999999996, -81.8256
- 37.58702, -81.8256
- 37.56702, -81.76559999999999
-End:
-Color: 0 0 255
-Text: 37.56702, -81.7956, 1, "Outage #64", "Outage #64\nCause: Tree Contact\nLast Update: 2025-04-06 21:25: UTC"
-Triangles:
- 38.41202, -81.49448
- 38.452020000000005, -81.49448
- 38.43202, -81.43448
-End:
-Color: 0 0 255
-Text: 38.43202, -81.46448, 1, "Outage #163", "Outage #163\nCause: Tree Contact\nLast Update: 2025-04-06 21:25: UTC"
-Triangles:
- 37.991719999999994, -81.16474
- 38.03172, -81.16474
- 38.01172, -81.10473999999999
-End:
-Color: 0 0 255
-Text: 38.01172, -81.13474, 1, "Outage #23", "Outage #23\nCause: None\nLast Update: 2025-04-06 21:25: UTC"
-Triangles:
- 37.97161, -82.36573
- 38.011610000000005, -82.36573
- 37.99161, -82.30573
-End:
-Color: 0 0 255
-Text: 37.99161, -82.33573, 1, "Outage #4", "Outage #4\nCause: None\nLast Update: 2025-04-06 21:25: UTC"
-End:
diff --git a/powerapi.py b/powerapi.py
deleted file mode 100644
index 130b7cb..0000000
--- a/powerapi.py
+++ /dev/null
@@ -1,110 +0,0 @@
- $2 and update < $3 order by update asc",
-array('RLX',$starttime,$endtime)) or die('Query failed: ' . pg_last_error());
-
-while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {
- $array[] = $line;
-}
-echo json_encode($array);
-}}}
-
-
-//Archive point data
-if($_GET['archivepoint']) {
-if($_GET['start']) {
-$starttime = pg_escape_string($_GET['start']);
-if($_GET['end']) {
-$endtime = pg_escape_string($_GET['end']);
-$result = pg_query_params($dbconn,
-"SELECT json_build_object('type', 'FeatureCollection','features', json_agg(json_build_object('type','Feature', 'geometry', ST_AsGeoJSON(realgeom)::json,'properties',json_build_object('time',startguess,'county',county,'state',state,'outage',outagen,'lastchange',lastchange,'cause',cause))order by startguess asc)) FROM power WHERE cwa = $1 and startguess > $2 and lastchange < $3"
-,array('RLX',$starttime,$endtime)) or die('Query failed: ' . pg_last_error());
-
-$resultArray = pg_fetch_all($result);
-echo($resultArray[0]['json_build_object']);
-
-
-}}}
-
-
-
-//if($_GET['svr']=='current') {
-//$result = pg_query_params($dbconn,
-//"SELECT json_build_object('type', 'FeatureCollection','features', json_agg(json_build_object('type','Feature', 'geometry', ST_AsGeoJSON(nwspoly)::json,'properties',json_build_object('issue',issue,'end',endtime,'vtec',vtec,'type',warntype)))) FROM svr where issue < now() and endtime > now()"
-//,array('2023-01-01 01:00','2023-02-12 10:00')) or die('Query failed: ' . pg_last_error());
-//$resultArray = pg_fetch_all($result);
-//echo($resultArray[0]['json_build_object']);
-//}
-
-if($_GET['svr']=='current') {
-$result = pg_query($dbconn,
-"SELECT json_build_object('type', 'FeatureCollection','features', json_agg(json_build_object('type','Feature', 'geometry', ST_AsGeoJSON(nwspoly)::json,'properties',json_build_object('issue',issue,'end',endtime,'vtec',vtec,'type',warntype)))) FROM svr where issue < now() and endtime > now()") or die('Query failed: ' . pg_last_error());
-$resultArray = pg_fetch_all($result);
-echo($resultArray[0]['json_build_object']);
-}
-
-
-
-
-if($_GET['svr'] == 'archive') {
-if($_GET['start']) {
-$starttime = pg_escape_string($_GET['start']);
-if($_GET['end']) {
-$endtime = pg_escape_string($_GET['end']);
-
-
-$result = pg_query_params($dbconn,
-"SELECT json_build_object('type', 'FeatureCollection','features', json_agg(json_build_object('type','Feature', 'geometry', ST_AsGeoJSON(nwspoly)::json,'properties',json_build_object('issue',issue,'end',endtime,'vtec',vtec,'type',warntype)))) FROM svr where issue > $1 and endtime < $2"
-,array($starttime,$endtime)) or die('Query failed: ' . pg_last_error());
-$resultArray = pg_fetch_all($result);
-echo($resultArray[0]['json_build_object']);
-}
-}
-
-if(!isset($_GET['start']) && !isset($_GET['end'])) {
-$result = pg_query($dbconn,
-"SELECT json_build_object('type', 'FeatureCollection','features', json_agg(json_build_object('type','Feature', 'geometry', ST_AsGeoJSON(nwspoly)::json,'properties',json_build_object('issue',issue,'end',endtime,'vtec',vtec,'type',warntype)))) FROM svr where issue < now() - interval '24 hours' and endtime > now() - interval '24 hours'") or die('Query failed: ' . pg_last_error());
-$resultArray = pg_fetch_all($result);
-echo($resultArray[0]['json_build_object']);
-
-
-}
-}
-
-pg_free_result($result);
-pg_close($dbconn);
-?>
diff --git a/powerapi2.php b/powerapi2.php
deleted file mode 100644
index 62b89d6..0000000
--- a/powerapi2.php
+++ /dev/null
@@ -1,109 +0,0 @@
- $2 and update < $3 order by update asc",
-"select distinct on (county,state,update) county,state,sum(outages) as outage, update as time, sum(served) as served from countyoutages where update > $2 and update < $3 and cwa = $1 group by county,state,update",
-array('RLX',$starttime,$endtime)) or die('Query failed: ' . pg_last_error());
-
-while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {
- $array[] = $line;
-}
-echo json_encode($array);
-}}}
-
-
-//Archive point data
-if($_GET['archivepoint']) {
-$starttime = pg_escape_string($_GET['start']);
-$endtime = pg_escape_string($_GET['end']);
-$result = pg_query_params($dbconn,
-"SELECT json_build_object('type', 'FeatureCollection','features', json_agg(json_build_object('type','Feature', 'geometry', ST_AsGeoJSON(realgeom)::json,'properties',json_build_object('time',startguess,'county',county,'state',state,'outage',outagen,'lastchange',lastchange,'cause',cause))order by startguess asc)) FROM power WHERE cwa = $1 and startguess > $2 and lastchange < $3",
-array('RLX',$starttime,$endtime)) or die('Query failed: ' . pg_last_error());
-$resultArray = pg_fetch_all($result);
-echo($resultArray[0]['json_build_object']);
-
-
-}
-
-
-
-//if($_GET['svr']=='current') {
-//$result = pg_query_params($dbconn,
-//"SELECT json_build_object('type', 'FeatureCollection','features', json_agg(json_build_object('type','Feature', 'geometry', ST_AsGeoJSON(nwspoly)::json,'properties',json_build_object('issue',issue,'end',endtime,'vtec',vtec,'type',warntype)))) FROM svr where issue < now() and endtime > now()"
-//,array('2023-01-01 01:00','2023-02-12 10:00')) or die('Query failed: ' . pg_last_error());
-//$resultArray = pg_fetch_all($result);
-//echo($resultArray[0]['json_build_object']);
-//}
-
-if($_GET['svr']=='current') {
-$result = pg_query($dbconn,
-"SELECT json_build_object('type', 'FeatureCollection','features', json_agg(json_build_object('type','Feature', 'geometry', ST_AsGeoJSON(nwspoly)::json,'properties',json_build_object('issue',issue,'end',endtime,'vtec',vtec,'type',warntype)))) FROM svr where issue < now() and endtime > now()") or die('Query failed: ' . pg_last_error());
-$resultArray = pg_fetch_all($result);
-echo($resultArray[0]['json_build_object']);
-}
-
-
-
-
-if($_GET['svr'] == 'archive') {
-if($_GET['start']) {
-$starttime = pg_escape_string($_GET['start']);
-if($_GET['end']) {
-$endtime = pg_escape_string($_GET['end']);
-
-
-$result = pg_query_params($dbconn,
-"SELECT json_build_object('type', 'FeatureCollection','features', json_agg(json_build_object('type','Feature', 'geometry', ST_AsGeoJSON(nwspoly)::json,'properties',json_build_object('issue',issue,'end',endtime,'vtec',vtec,'type',warntype)))) FROM svr where issue > $1 and endtime < $2"
-,array($starttime,$endtime)) or die('Query failed: ' . pg_last_error());
-$resultArray = pg_fetch_all($result);
-echo($resultArray[0]['json_build_object']);
-}
-}
-
-if(!isset($_GET['start']) && !isset($_GET['end'])) {
-$result = pg_query($dbconn,
-"SELECT json_build_object('type', 'FeatureCollection','features', json_agg(json_build_object('type','Feature', 'geometry', ST_AsGeoJSON(nwspoly)::json,'properties',json_build_object('issue',issue,'end',endtime,'vtec',vtec,'type',warntype)))) FROM svr where issue < now() - interval '24 hours' and endtime > now() - interval '24 hours'") or die('Query failed: ' . pg_last_error());
-$resultArray = pg_fetch_all($result);
-echo($resultArray[0]['json_build_object']);
-
-
-}
-}
-
-pg_free_result($result);
-pg_close($dbconn);
-?>
diff --git a/powerapilwx.php b/powerapilwx.php
deleted file mode 100644
index 119b2f8..0000000
--- a/powerapilwx.php
+++ /dev/null
@@ -1,141 +0,0 @@
- '2023-04-01' and update < '2023-04-02' and cwa = 'RLX' group by county,state,update) as potato group by county,state;
-"select distinct on (county,state) max(outage),county,state from (select distinct on (county,state,update) county,state,sum(outages) as outage, update as time, sum(served) as served from countyoutages where update > $2 and update < $3 and cwa = $1 group by county,state,update) as potato group by county,state",
-array('LWX',$starttime,$endtime)) or die('Query failed: ' . pg_last_error());
-
-while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {
- $array[] = $line;
-}
-echo json_encode($array);
-}}}
-
-
-
-
-
-
-
-
-
-//county current
-//"SELECT distinct on (county,state) update as time, county, state, outages as outage,served FROM countyoutages where cwa = $1 order by county,state,update desc",
-if($_GET['county'] ?? null) {
-$result = pg_query_params($dbconn,
-"select distinct on (county,state) county,state,sum(outages) as outage, update as time, sum(served) as served from countyoutages where update = (select max(update) from countyoutages) and (cwa = $1 or cwa = $2 or cwa = $3 or cwa = $4 or cwa = $5 or cwa = $6 or cwa = $7) group by county,state,update",
-array('RLX','JKL','ILN','PBZ','MRX','LWX','RNK')) or die('Query failed: ' . pg_last_error());
-
-while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {
- $array[] = $line;
-}
-echo json_encode($array);
-}
-
-//county archive
-if($_GET['countyarchive'] ?? null) {
-
-if($_GET['start'] ?? null) {
-$starttime = pg_escape_string($_GET['start']);
-if($_GET['end'] ?? null) {
-$endtime = pg_escape_string($_GET['end']);
-
-
-
-$result = pg_query_params($dbconn,
-//"SELECT county,state, update as time, county, state, outages as outage,served FROM countyoutages where cwa = $1 and update > $2 and update < $3 order by update asc",
-"select distinct on (county,state,update) county,state,sum(outages) as outage, update as time, sum(served) as served from countyoutages where update > $8 and update < $9 and (cwa = $1 or cwa = $2 or cwa = $3 or cwa = $4 or cwa = $5 or cwa = $6 or cwa = $7) group by county,state,update",
-array('RLX','JKL','ILN','PBZ','MRX','LWX','RNK',$starttime,$endtime)) or die('Query failed: ' . pg_last_error());
-
-while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {
- $array[] = $line;
-}
-echo json_encode($array);
-}}}
-
-
-//Archive point data
-if($_GET['archivepoint'] ?? null) {
-$starttime = pg_escape_string($_GET['start']);
-$endtime = pg_escape_string($_GET['end']);
-$result = pg_query_params($dbconn,
-"SELECT json_build_object('type', 'FeatureCollection','features', json_agg(json_build_object('type','Feature', 'geometry', ST_AsGeoJSON(realgeom)::json,'properties',json_build_object('time',startguess,'county',county,'state',state,'outage',outagen,'lastchange',lastchange,'cause',cause))order by startguess asc)) FROM power WHERE cwa = $1 and startguess > $2 and lastchange < $3",
-array('LWX',$starttime,$endtime)) or die('Query failed: ' . pg_last_error());
-$resultArray = pg_fetch_all($result);
-echo($resultArray[0]['json_build_object']);
-
-
-}
-
-
-
-//if($_GET['svr']=='current') {
-//$result = pg_query_params($dbconn,
-//"SELECT json_build_object('type', 'FeatureCollection','features', json_agg(json_build_object('type','Feature', 'geometry', ST_AsGeoJSON(nwspoly)::json,'properties',json_build_object('issue',issue,'end',endtime,'vtec',vtec,'type',warntype)))) FROM svr where issue < now() and endtime > now()"
-//,array('2023-01-01 01:00','2023-02-12 10:00')) or die('Query failed: ' . pg_last_error());
-//$resultArray = pg_fetch_all($result);
-//echo($resultArray[0]['json_build_object']);
-//}
-
-if($_GET['svr'] ?? null =='current') {
-$result = pg_query($dbconn,
-"SELECT json_build_object('type', 'FeatureCollection','features', json_agg(json_build_object('type','Feature', 'geometry', ST_AsGeoJSON(nwspoly)::json,'properties',json_build_object('issue',issue,'end',endtime,'vtec',vtec,'type',warntype)))) FROM svr where issue < now() and endtime > now()") or die('Query failed: ' . pg_last_error());
-$resultArray = pg_fetch_all($result);
-echo($resultArray[0]['json_build_object']);
-}
-
-
-
-
-if($_GET['svr'] ?? null == 'archive') {
-if($_GET['start'] ?? null) {
-$starttime = pg_escape_string($_GET['start']);
-if($_GET['end'] ?? null) {
-$endtime = pg_escape_string($_GET['end']);
-
-
-$result = pg_query_params($dbconn,
-"SELECT json_build_object('type', 'FeatureCollection','features', json_agg(json_build_object('type','Feature', 'geometry', ST_AsGeoJSON(nwspoly)::json,'properties',json_build_object('issue',issue,'end',endtime,'vtec',vtec,'type',warntype)))) FROM svr where issue > $1 and endtime < $2"
-,array($starttime,$endtime)) or die('Query failed: ' . pg_last_error());
-$resultArray = pg_fetch_all($result);
-echo($resultArray[0]['json_build_object']);
-}
-}
-
-if(!isset($_GET['start']) && !isset($_GET['end'])) {
-$result = pg_query($dbconn,
-"SELECT json_build_object('type', 'FeatureCollection','features', json_agg(json_build_object('type','Feature', 'geometry', ST_AsGeoJSON(nwspoly)::json,'properties',json_build_object('issue',issue,'end',endtime,'vtec',vtec,'type',warntype)))) FROM svr where issue < now() - interval '24 hours' and endtime > now() - interval '24 hours'") or die('Query failed: ' . pg_last_error());
-$resultArray = pg_fetch_all($result);
-echo($resultArray[0]['json_build_object']);
-
-
-}
-}
-
-pg_free_result($result);
-pg_close($dbconn);
-?>
diff --git a/powercounty.py b/powercounty.py
deleted file mode 100644
index dbab0b1..0000000
--- a/powercounty.py
+++ /dev/null
@@ -1,593 +0,0 @@
-# powercounty.py
-
-import logging
-import requests
-import json
-import psycopg2
-from datetime import datetime
-import re
-from collections import defaultdict
-import threading
-
-
-# Set up logging
-logging.basicConfig(
- level=logging.INFO,
- format='%(asctime)s - %(levelname)s - %(message)s',
- handlers=[
- logging.FileHandler('powercounty.log'),
- logging.StreamHandler()
- ]
-)
-
-# Set up a logger for this module
-logger = logging.getLogger(__name__)
-
-# Database connection parameters
-DB_PARAMS = {
- 'host': 'localhost',
- 'database': 'nws',
- 'user': 'nws',
- 'password': 'nws'
-}
-
-# Set up a requests session
-S = requests.Session()
-
-# Power company metadata and URLs (from power3.py)
-AEP_OH_META = "http://outagemap.aepohio.com.s3.amazonaws.com/resources/data/external/interval_generation_data/metadata.json"
-AEP_WV_META = "http://outagemap.appalachianpower.com.s3.amazonaws.com/resources/data/external/interval_generation_data/metadata.json"
-AEP_KY_META = 'http://outagemap.kentuckypower.com.s3.amazonaws.com/resources/data/external/interval_generation_data/metadata.json'
-WV_FE_META = 'https://kubra.io/stormcenter/api/v1/stormcenters/6c715f0e-bbec-465f-98cc-0b81623744be/views/5ed3ddf1-3a6f-4cfd-8957-eba54b5baaad/currentState?preview=false'
-AEP_WV_KUBRA_META = "https://kubra.io/stormcenter/api/v1/stormcenters/6674f49e-0236-4ed8-a40a-b31747557ab7/views/8cfe790f-59f3-4ce3-a73f-a9642227411f/currentState?preview=false"
-AEP_OH_KUBRA_META = 'https://kubra.io/stormcenter/api/v1/stormcenters/9c0735d8-b721-4dce-b80b-558e98ce1083/views/9b2feb80-69f8-4035-925e-f2acbcf1728e/currentState?preview=false'
-AEP_KY_KUBRA_META = 'https://kubra.io/stormcenter/api/v1/stormcenters/23dcd38e-2573-4e20-a463-959b11cae011/views/60f31606-5702-4a1e-a74c-08d866b7a6fa/currentState?preview=false'
-
-AEP_WV_BASE = "http://outagemap.appalachianpower.com.s3.amazonaws.com/resources/data/external/interval_generation_data/"
-AEP_OH_BASE = "http://outagemap.aepohio.com.s3.amazonaws.com/resources/data/external/interval_generation_data/"
-AEP_KY_BASE = 'http://outagemap.kentuckypower.com.s3.amazonaws.com/resources/data/external/interval_generation_data/'
-GRAYSON_COUNTY = 'https://outages.graysonrecc.com/data/boundaries.json'
-
-# Additional URLs from power3.py
-flemingjson = 'https://outage.fme.coop/data/boundaries.json'
-bigsandy_url = 'http://outagemap.bigsandyrecc.com/data/boundaries.json'
-southcentralpower_url = 'https://outage.southcentralpower.com/data/boundaries.json'
-
-# Global list to collect all outage data
-allcountyoutages = []
-
-
-# This function will try to get a URL and log any errors
-def safe_request(url, description="Fetching data"):
- try:
- logger.info(f"{description}: {url}")
- response = S.get(url)
- response.raise_for_status() # Raise an exception for bad status codes
- logger.info(f"Successfully fetched data from {url}")
- return response
- except requests.exceptions.RequestException as e:
- logger.error(f"Failed to {description} from {url}: {e}")
- return None
-
-# This function will parse a JSON response and log errors
-def safe_json_load(response, description="Parsing JSON"):
- try:
- logger.info(f"{description}")
- data = json.loads(response.text)
- logger.info("Successfully parsed JSON data")
- return data
- except (json.JSONDecodeError, AttributeError) as e:
- logger.error(f"Failed to {description}: {e}")
- return None
-
-# Ported functions from power3.py with enhanced logging
-
-def fleming():
- """Fetch outage data for Fleming County, KY"""
- logger.info("Fetching Fleming County outage data")
- state = 'KY'
- company = 'FLEM'
- temp = safe_request(flemingjson, "fetching Fleming data")
- if temp is None:
- return
-
- tempdata = safe_json_load(temp, "parsing Fleming JSON")
- if tempdata is None:
- return
-
- try:
- for j in tempdata[0]['boundaries']:
- outageinfo = j.get('customersOutNow'), j.get('customersServed'), j.get('name'), state, company
- allcountyoutages.append(outageinfo)
- logger.info(f"Successfully processed {len(tempdata[0]['boundaries'])} Fleming County boundaries")
- except (KeyError, IndexError) as e:
- logger.error(f"Error processing Fleming County data: {e}")
-
-def bigsandy():
- """Fetch outage data for Big Sandy RECC"""
- logger.info("Fetching Big Sandy RECC outage data")
- state = 'OH'
- company = 'BS'
- temp = safe_request(bigsandy_url, "fetching Big Sandy data")
- if temp is None:
- return
-
- tempdata = safe_json_load(temp, "parsing Big Sandy JSON")
- if tempdata is None:
- return
-
- try:
- for j in tempdata[0]['boundaries']:
- outageinfo = j.get('customersOutNow'), j.get('customersServed'), j.get('name'), state, company
- allcountyoutages.append(outageinfo)
- logger.info(f"Successfully processed {len(tempdata[0]['boundaries'])} Big Sandy boundaries")
- except (KeyError, IndexError) as e:
- logger.error(f"Error processing Big Sandy data: {e}")
-
-def southcentralpower():
- """Fetch outage data for South Central Power"""
- logger.info("Fetching South Central Power outage data")
- company = 'SCP'
- url = southcentralpower_url
- temp = safe_request(url, "fetching South Central Power data")
- if temp is None:
- return
-
- tempdata = safe_json_load(temp, "parsing South Central Power JSON")
- if tempdata is None:
- return
-
- state = 'OH'
- try:
- for j in tempdata[0]['boundaries']:
- outageinfo = j.get('customersOutNow'), j.get('customersServed'), j.get('name'), state, company
- allcountyoutages.append(outageinfo)
- logger.info(f"Successfully processed {len(tempdata[0]['boundaries'])} South Central Power boundaries")
- except (KeyError, IndexError) as e:
- logger.error(f"Error processing South Central Power data: {e}")
-
-def ku_get_url():
- """Get KU outage data URL"""
- logger.info("Getting KU outage data URL")
- url = 'https://stormcenter.lge-ku.com/reports/1d6f7e68-e192-43c1-bfdc-d809333d8e40'
- r = safe_request(url, "fetching KU report page")
- if r is None:
- return None
-
- try:
- x = re.search(r"instanceId: '(.*?)',", r.text)
- if not x:
- logger.error("Could not extract instanceId from KU report page")
- return None
-
- urlcom = x.group(1)
- urlcom = 'https://kubra.io/stormcenter/api/v1/stormcenters/' + urlcom + '/views/a6cee9e4-312b-4b77-9913-2ae371eb860d/currentState?preview=false'
- stuff = safe_request(urlcom, "fetching KU stormcenter data")
- if stuff is None:
- return None
-
- jsonstuff = safe_json_load(stuff, "parsing KU stormcenter JSON")
- if jsonstuff is None:
- return None
-
- interval_data = jsonstuff.get('data').get('interval_generation_data')
- urlcom = 'https://kubra.io/' + interval_data + '/public/reports/1d6f7e68-e192-43c1-bfdc-d809333d8e40_report.json'
- logger.info(f"Successfully constructed KU data URL: {urlcom}")
- return urlcom
- except Exception as e:
- logger.error(f"Error getting KU URL: {e}")
- return None
-
-def county_json(meta, url, jsonname):
- """Generic function to get county JSON data"""
- metainfo_response = safe_request(meta, "fetching metadata for county JSON")
- if metainfo_response is None:
- return None
-
- metainfo = safe_json_load(metainfo_response, "parsing metadata for county JSON")
- if metainfo is None:
- return None
-
- try:
- metadir = metainfo['directory']
- url = url + metadir + jsonname
- outage_response = safe_request(url, "fetching county JSON data")
- return outage_response
- except KeyError as e:
- logger.error(f"Error accessing metadata directory: {e}")
- return None
-
-def ku():
- """Fetch KU outage data"""
- logger.info("Fetching KU outage data")
- ku_list = []
- url = ku_get_url()
- if url is None:
- return
-
- data_response = safe_request(url, "fetching KU data")
- if data_response is None:
- return
-
- tempdata = safe_json_load(data_response, "parsing KU data JSON")
- if tempdata is None:
- return
-
- try:
- temp = tempdata['file_data']['areas'][2]['areas'][0]['areas']
- temp1 = tempdata['file_data']['areas'][2]['areas'][1]['areas']
- temp2 = tempdata['file_data']['areas'][1]['areas'][0]['areas']
-
- for i in temp:
- ku_list.append(i)
- for i in temp1:
- ku_list.append(i)
- for i in temp2:
- ku_list.append(i)
-
- for o in ku_list:
- outageinfo = o['cust_a']['val'], o['cust_s'], o['name'].capitalize(), o['state'], o['utility']
- allcountyoutages.append(outageinfo)
-
- logger.info(f"Successfully processed {len(ku_list)} KU outage records")
- except (KeyError, IndexError) as e:
- logger.error(f"Error processing KU data: {e}")
-
-def grayson():
- """Fetch Grayson County outage data"""
- logger.info("Fetching Grayson County outage data")
- company = 'GRE'
- outage_response = safe_request(GRAYSON_COUNTY, "fetching Grayson County data")
- if outage_response is None:
- return
-
- if not outage_response.headers.get('Content-Type', '').startswith('application/json'):
- logger.error(f"Unexpected content type from Grayson County: {outage_response.headers.get('Content-Type')}")
- return
-
- tempdata = safe_json_load(outage_response, "parsing Grayson County JSON")
- if tempdata is None:
- return
-
- state = 'KY'
- try:
- for j in tempdata[0]['boundaries']:
- outageinfo = j.get('customersOutNow'), j.get('customersServed'), j.get('name'), state, company
- allcountyoutages.append(outageinfo)
- logger.info(f"Successfully processed {len(tempdata[0]['boundaries'])} Grayson County boundaries")
- except (KeyError, IndexError) as e:
- logger.error(f"Error processing Grayson County data: {e}")
-
-def aep_county_vawv(meta, url, jsonname):
- """Fetch AEP county data for VA and WV"""
- logger.info("Fetching AEP county data for VA and WV")
- company = 'AEP'
- outage_response = county_json(meta, url, jsonname)
- if outage_response is None:
- return
-
- if not outage_response.headers.get('Content-Type', '').startswith('application/octet-stream'):
- logger.error(f"Unexpected content type from AEP VA/WV: {outage_response.headers.get('Content-Type')}")
- return
-
- tempdata = safe_json_load(outage_response, "parsing AEP VA/WV JSON")
- if tempdata is None:
- return
-
- try:
- # WV data
- state = 'WV'
- for j in tempdata['file_data']['areas'][0]['areas'][2]['areas']:
- outageinfo = j.get('cust_a').get('val'), j.get('cust_s'), j.get('area_name'), state, company
- allcountyoutages.append(outageinfo)
-
- # VA data
- state = 'VA'
- for j in tempdata['file_data']['areas'][0]['areas'][1]['areas']:
- outageinfo = j.get('cust_a').get('val'), j.get('cust_s'), j.get('area_name').capitalize(), state, company
- allcountyoutages.append(outageinfo)
-
- logger.info("Successfully processed AEP VA/WV county data")
- except (KeyError, IndexError) as e:
- logger.error(f"Error processing AEP VA/WV data: {e}")
-
-def aep_county_oh(meta, url, jsonname):
- """Fetch AEP county data for Ohio"""
- logger.info("Fetching AEP county data for Ohio")
- company = 'AEP'
- state = 'OH'
- outage_response = county_json(meta, url, jsonname)
- if outage_response is None:
- return
-
- tempdata = safe_json_load(outage_response, "parsing AEP OH JSON")
- if tempdata is None:
- return
-
- try:
- for j in tempdata['file_data']['areas'][0]['areas'][0]['areas']:
- outageinfo = j.get('cust_a').get('val'), j.get('cust_s'), j.get('area_name').capitalize(), state, company
- allcountyoutages.append(outageinfo)
- logger.info("Successfully processed AEP OH county data")
- except (KeyError, IndexError) as e:
- logger.error(f"Error processing AEP OH data: {e}")
-
-def aep_county_ky(meta, url, jsonname):
- """Fetch AEP county data for Kentucky"""
- logger.info("Fetching AEP county data for Kentucky")
- company = 'AEP'
- state = 'KY'
- outage_response = county_json(meta, url, jsonname)
- if outage_response is None:
- return
-
- tempdata = safe_json_load(outage_response, "parsing AEP KY JSON")
- if tempdata is None:
- return
-
- try:
- for j in tempdata['file_data']['areas'][0]['areas'][0]['areas']:
- outageinfo = j.get('cust_a').get('val'), j.get('cust_s'), j.get('area_name').capitalize(), state, company
- allcountyoutages.append(outageinfo)
- logger.info("Successfully processed AEP KY county data")
- except (KeyError, IndexError) as e:
- logger.error(f"Error processing AEP KY data: {e}")
-
-def firstenergy_county(meta, url, jsonname):
- """Fetch First Energy county data"""
- logger.info("Fetching First Energy county data")
- company = 'FE'
- state = 'WV'
- outage_response = county_json(meta, url, jsonname)
- if outage_response is None:
- return
-
- if not outage_response.headers.get('Content-Type', '').startswith('application/octet-stream'):
- logger.error(f"Unexpected content type from First Energy: {outage_response.headers.get('Content-Type')}")
- return
-
- tempdata = safe_json_load(outage_response, "parsing First Energy JSON")
- if tempdata is None:
- return
-
- try:
- for j in tempdata['file_data']['areas'][0]['areas'][0]['areas']:
- outageinfo = j.get('cust_a').get('val'), j.get('cust_s'), j.get('area_name').capitalize(), state, company
- allcountyoutages.append(outageinfo)
- logger.info("Successfully processed First Energy county data")
- except (KeyError, IndexError) as e:
- logger.error(f"Error processing First Energy data: {e}")
-
-def get_kubra_hexes(url):
- """Get Kubra hex data"""
- outage_response = safe_request(url, "fetching Kubra hex data")
- if outage_response is None:
- return None, None
-
- if not outage_response.headers.get('Content-Type', '').startswith('application/json'):
- logger.error(f"Unexpected content type from Kubra: {outage_response.headers.get('Content-Type')}")
- return None, None
-
- tempdata = safe_json_load(outage_response, "parsing Kubra hex JSON")
- if tempdata is None:
- return None, None
-
- try:
- bothhex = tempdata.get('data').get('cluster_interval_generation_data')
- hexes = bothhex.split('/')
- logger.info(f"Successfully extracted Kubra hexes: {hexes}")
- return hexes[2], hexes[3]
- except (KeyError, AttributeError) as e:
- logger.error(f"Error extracting Kubra hexes: {e}")
- return None, None
-
-def kubra_fe(baseurl1, baseurl2, meta):
- """Fetch Kubra First Energy data"""
- logger.info("Fetching Kubra First Energy data")
- hex2 = get_kubra_hexes(meta)
- if hex2[0] is None:
- return
-
- url = baseurl1 + hex2[1] + baseurl2
- company = 'FE'
- state = 'WV'
- outage_response = safe_request(url, "fetching Kubra FE data")
- if outage_response is None:
- return
-
- if not outage_response.headers.get('Content-Type', '').startswith('application/json'):
- logger.error(f"Unexpected content type from Kubra FE: {outage_response.headers.get('Content-Type')}")
- return
-
- tempdata = safe_json_load(outage_response, "parsing Kubra FE JSON")
- if tempdata is None:
- return
-
- try:
- for j in tempdata['file_data']['areas']:
- if j.get('key') == "county":
- outageinfo = j.get('cust_a').get('val'), j.get('cust_s'), j.get('name').capitalize(), state, company
- allcountyoutages.append(outageinfo)
- logger.info("Successfully processed Kubra FE county data")
- except (KeyError, IndexError) as e:
- logger.error(f"Error processing Kubra FE data: {e}")
-
-def kubra_aep(baseurl1, baseurl2, meta, company='AEP'):
- """Fetch Kubra AEP data"""
- logger.info(f"Fetching Kubra AEP data for company: {company}")
- hex2 = get_kubra_hexes(meta)
- if hex2[0] is None:
- return
-
- url = baseurl1 + hex2[1] + baseurl2
- outage_response = safe_request(url, "fetching Kubra AEP data")
- if outage_response is None:
- return
-
- if not outage_response.headers.get('Content-Type', '').startswith('application/json'):
- logger.error(f"Unexpected content type from Kubra AEP: {outage_response.headers.get('Content-Type')}")
- return
-
- tempdata = safe_json_load(outage_response, "parsing Kubra AEP JSON")
- if tempdata is None:
- return
-
- process_outage_data(tempdata, company)
-
-def process_outage_data(data, company):
- """Process outage data with enhanced error handling"""
- try:
- # Navigate to the primary list of areas
- primary_areas = data.get("file_data", {}).get("areas", [])
-
- # If the list is empty, there's nothing to process
- if not primary_areas:
- logger.warning("No 'areas' data found in outage data.")
- return
-
- # Check the key of the first item to determine the format
- first_item_key = primary_areas[0].get("key")
-
- if first_item_key == "state":
- # Format 1: Loop through each state object
- for state_area in primary_areas:
- state_name = state_area.get("name", "Unknown State")
- # Get the nested list of counties for this state
- county_list = state_area.get("areas", [])
- for county in county_list:
- # We are now at the county level
- if county.get("key") == "county":
- outageinfo = county.get('cust_a').get('val'), county.get('cust_s'), county.get('name').capitalize(), county.get('state'), company
- allcountyoutages.append(outageinfo)
- elif first_item_key == "county":
- # Format 2: The primary list is already the county list
- for county in primary_areas:
- # We are now at the county level
- if county.get("key") == "county":
- outageinfo = county.get('cust_a').get('val'), county.get('cust_s'), county.get('name').capitalize(), county.get('state'), company
- allcountyoutages.append(outageinfo)
- else:
- logger.warning(f"Unknown data format. Could not find 'state' or 'county' key. Found: {first_item_key}")
-
- except (KeyError, IndexError) as e:
- logger.error(f"Error processing outage data: {e}")
-
-def insert_outage_data(cursor, outage_data, current_timestamp):
- """Insert outage data into the new table"""
- if not outage_data:
- logger.info("No outage data to insert into the database.")
- return
-
- sql = 'INSERT INTO newcountyoutages (outages, served, county, state, update, company) VALUES (%s, %s, %s, %s, %s, %s)'
- try:
- logger.info(f"Inserting {len(outage_data)} rows into the database.")
- cursor.executemany(sql, outage_data)
- logger.info("Successfully inserted data into the database.")
- except Exception as e:
- logger.error(f"Failed to insert data into the database: {e}")
- raise
-
-def main():
- """Main function to collect and insert outage data"""
- conn = None
- try:
- conn = psycopg2.connect(**DB_PARAMS)
- cursor = conn.cursor()
- logger.info("Successfully connected to the database.")
-
- # Clear the global list at the start
- global allcountyoutages
- allcountyoutages = []
-
- # Collect outage data for each provider
- logger.info("Starting data collection.")
-
- # --- Kubra First Energy ---
- try:
- kubra_fe('https://kubra.io/data/', '/public/reports/8c3b0b30-c9e8-4e8f-8b0d-999c568bb085_report.json', WV_FE_META)
- except Exception as e:
- logger.error(f"Error collecting Kubra FE data: {e}")
-
- # --- Kubra AEP WV ---
- try:
- kubra_aep('https://kubra.io/data/', '/public/reports/7929429f-635d-4761-b6c7-78f646cef3c2_report.json', AEP_WV_KUBRA_META)
- except Exception as e:
- logger.error(f"Error collecting Kubra AEP WV data: {e}")
-
- # --- Kubra AEP OH ---
- try:
- kubra_aep('https://kubra.io/data/', '/public/reports/1bc6bd19-2315-4548-980a-6df73b93b355_report.json', AEP_OH_KUBRA_META)
- except Exception as e:
- logger.error(f"Error collecting Kubra AEP OH data: {e}")
-
- # --- Kubra AEP KY ---
- try:
- kubra_aep('https://kubra.io/data/', '/public/reports/8c3b0b30-c9e8-4e8f-8b0d-999c568bb085_report.json', AEP_KY_KUBRA_META)
- except Exception as e:
- logger.error(f"Error collecting Kubra AEP KY data: {e}")
-
- # --- Grayson County ---
- try:
- grayson()
- except Exception as e:
- logger.error(f"Error collecting Grayson County data: {e}")
-
- # --- KU ---
- try:
- ku()
- except Exception as e:
- logger.error(f"Error collecting KU data: {e}")
-
- # --- South Central Power ---
- try:
- southcentralpower()
- except Exception as e:
- logger.error(f"Error collecting South Central Power data: {e}")
-
- # --- Big Sandy ---
- try:
- bigsandy()
- except Exception as e:
- logger.error(f"Error collecting Big Sandy data: {e}")
-
- # --- AEP Direct (OH, WV, KY) ---
- try:
- aep_county_oh(AEP_OH_META, AEP_OH_BASE, "metadata.json")
- except Exception as e:
- logger.error(f"Error collecting AEP OH data: {e}")
-
- try:
- aep_county_vawv(AEP_WV_META, AEP_WV_BASE, "metadata.json")
- except Exception as e:
- logger.error(f"Error collecting AEP WV/VA data: {e}")
-
- try:
- aep_county_ky(AEP_KY_META, AEP_KY_BASE, "metadata.json")
- except Exception as e:
- logger.error(f"Error collecting AEP KY data: {e}")
-
- # --- First Energy Direct ---
- try:
- firstenergy_county(WV_FE_META, 'https://s3.amazonaws.com/outages.sc4.firstenergycorp.com/resources/data/mdwv/interval_generation_data/', "metadata.json")
- except Exception as e:
- logger.error(f"Error collecting First Energy data: {e}")
-
- # Insert collected data into the new table
- current_timestamp = str(datetime.utcnow())
- insert_outage_data(cursor, allcountyoutages, current_timestamp)
- conn.commit()
- logger.info("Data collection and database insert completed successfully.")
-
- except Exception as e:
- logger.exception("An error occurred during the main execution.")
- if conn:
- conn.rollback()
- finally:
- if conn:
- cursor.close()
- conn.close()
- logger.info("Database connection closed.")
-
-
-if __name__ == '__main__':
- main()
diff --git a/powersum.py b/powersum.py
deleted file mode 100644
index 4eea522..0000000
--- a/powersum.py
+++ /dev/null
@@ -1,50 +0,0 @@
-import requests
-import polyline
-import json
-import psycopg2
-import psycopg2.extensions
-from datetime import datetime, timezone
-from geojson import Point, Feature, FeatureCollection, dump
-
-conn = psycopg2.connect(host='localhost', database='nws', user='nws', password='nws')
-cursor = conn.cursor()
-
-
-
-allcountyoutages = []
-
-S = requests.Session()
-
-
-#select distinct on (county,state,update) county,state,sum(outages) as outage, update as time, sum(served) as served from countyoutages where update > $2 and update < $3 and cwa = $1 group by county,state,update
-#select distinct on (county,state) max(outage),county,state from (select distinct on (county,state,update) county,state,sum(outages) as outage, update as time, sum(served) as served from countyoutages where update > '2023-04-01' and update < '2023-04-02' and cwa = 'RLX' group by county,state,update) as potato group by county,state;
-cursor.execute("select distinct on (county,state,update) county,state,sum(outages) as outage, update as time, sum(served) as served from countyoutages where update > $2 and update < $3 and cwa = $1 group by county,state,update")
-
-
-current_timestamp = str(datetime.utcnow())
-for i in allcountyoutages:
- sql = 'insert into countyoutages (outages, served, county, state, update, company) values (%s, %s, %s, %s, %s, %s)'
- val = (i[0], i[1], i[2], i[3], current_timestamp, i[4])
- cursor.execute(sql,val)
-conn.commit()
-
-cursor.execute('update countyoutages set cwa = county.cwa from county where county.countyname = countyoutages.county and county.state = countyoutages.state and countyoutages.cwa is null')
-
-conn.commit()
-
-cursor.execute("delete from countyoutages where cwa != 'RLX'")
-cursor.execute("delete from countyoutages where cwa is null")
-cursor.execute("delete from countyoutages where update < now () - interval '30 days'")
-conn.commit()
-
-
-
-
-
-
-
-
-
-
-cursor.close()
-conn.close()