smartermeter 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +2 -0
- data/README.md +65 -0
- data/Rakefile +182 -0
- data/bin/smartermeter +10 -0
- data/build_configuration.rb +89 -0
- data/lib/smartermeter/daemon.rb +236 -0
- data/lib/smartermeter/main.rb +9 -0
- data/lib/smartermeter/sample.rb +68 -0
- data/lib/smartermeter/service.rb +78 -0
- data/lib/smartermeter/transports/cacert.pem +3509 -0
- data/lib/smartermeter/transports/google_powermeter.erb +16 -0
- data/lib/smartermeter/transports/google_powermeter.rb +42 -0
- data/lib/smartermeter.rb +8 -0
- data/smartermeter.gemspec +90 -0
- data/specs/fixtures/data.csv +21 -0
- data/specs/fixtures/expected_google_request.xml +292 -0
- data/specs/sample_spec.rb +18 -0
- data/specs/service_spec.rb +8 -0
- data/specs/spec_helper.rb +9 -0
- data/specs/transports/google_powermeter_spec.rb +19 -0
- metadata +136 -0
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'mechanize'
|
2
|
+
require 'csv'
|
3
|
+
|
4
|
+
module SmarterMeter
|
5
|
+
class Service
|
6
|
+
LOGIN_URL = "http://www.pge.com/myhome/"
|
7
|
+
OVERVIEW_URL = "https://www.pge.com/csol/actions/login.do?aw"
|
8
|
+
ENERGYGUIDE_AUTH_URL = "https://www.energyguide.com/LoadAnalysis/LoadAnalysis.aspx?Referrerid=154"
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@agent = WWW::Mechanize.new { |agent|
|
12
|
+
agent.user_agent_alias = 'Mac Safari'
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
# Returns true upon succesful login and false otherwise
|
17
|
+
def login(username, password)
|
18
|
+
@agent.get(LOGIN_URL) do |page|
|
19
|
+
logged_in_page = page.form_with(:action => 'https://www.pge.com/eum/login') do |login|
|
20
|
+
login.USER = username
|
21
|
+
login.PASSWORD = password
|
22
|
+
end.submit
|
23
|
+
end
|
24
|
+
|
25
|
+
# There is a crazy meta-reload thing here that mechanize doesn't handle
|
26
|
+
# correctly by itself so let's help it along...
|
27
|
+
@agent.get(OVERVIEW_URL) do |page|
|
28
|
+
|
29
|
+
return false if page.title =~ /PG&E Login/
|
30
|
+
|
31
|
+
# Load the PG&E Terms of Use page
|
32
|
+
tou_page = @agent.click(page.link_with(:href => '/csol/actions/billingDisclaimer.do?actionType=hourly'))
|
33
|
+
form = tou_page.forms().first
|
34
|
+
agree_button = form.button_with(:value => 'I Understand - Proceed')
|
35
|
+
|
36
|
+
# Agree to the terms of use
|
37
|
+
form['agreement'] = 'yes'
|
38
|
+
|
39
|
+
# Load up the PG&E frame page for historical data
|
40
|
+
hourly_usage_container = form.submit(agree_button)
|
41
|
+
|
42
|
+
# Now load up the frame with the content
|
43
|
+
hourly_usage = @agent.click(hourly_usage_container.frames.select{|f| f.href == "/csol/nexus/content.jsp"}.first)
|
44
|
+
|
45
|
+
# Now post the authentication information from PG&E to energyguide.com
|
46
|
+
@data_page = hourly_usage.form_with(:action => ENERGYGUIDE_AUTH_URL).submit
|
47
|
+
end
|
48
|
+
true
|
49
|
+
end
|
50
|
+
|
51
|
+
def fetch_csv(date)
|
52
|
+
# TODO: Check if the authentication has been called
|
53
|
+
|
54
|
+
# Now we almost actually have data. However we need to setup the desired
|
55
|
+
# parameters first before we can get the exportable data. This really shouldn't
|
56
|
+
# be necessary.
|
57
|
+
hourly_data = @data_page.form_with(:action => "/LoadAnalysis/LoadAnalysis.aspx") do |form|
|
58
|
+
form['__EVENTTARGET'] = "objChartSelect$butSubmit"
|
59
|
+
form['objTimePeriods$objExport$hidChart'] = "Hourly Usage"
|
60
|
+
form['objTimePeriods$objExport$hidChartID'] = 8
|
61
|
+
form['objChartSelect$ddChart'] = 8 # Hourly usage
|
62
|
+
|
63
|
+
form['objTimePeriods$objExport$hidTimePeriod'] = "Week"
|
64
|
+
form['objTimePeriods$objExport$hidTimePeriodID'] = 3
|
65
|
+
form['objTimePeriods$rlPeriod'] = 3
|
66
|
+
|
67
|
+
form['objChartSelect$ccSelectedDate1'] = date.strftime("%m/%d/%Y")
|
68
|
+
end.submit
|
69
|
+
|
70
|
+
# Now the beautiful data...
|
71
|
+
hourly_csv = hourly_data.form_with(:action => "/LoadAnalysis/LoadAnalysis.aspx") do |form|
|
72
|
+
form['__EVENTTARGET'] = "objTimePeriods$objExport$butExport"
|
73
|
+
end.submit
|
74
|
+
|
75
|
+
hourly_csv.body
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|