Tuesday, November 8, 2011

Can You Feel the Power?

WattDepot is an open source application developed to monitor the power usage of the Hale Aloha freshman dorms at the University of Hawaii at Manoa. In the Hale Aloha system, there are four identical towers: Ilima, Mokihana, Lehua, and Lokelani. In each of these buildings in the same place, there are sensors that monitor the power usage of the residents. The data provided will assist us in pushing for a more sustainable campus.

Similar to Robocode, I attempted a few kata in assist in familiarizing myself with manipulating data received from WattDepot. The following kata were given:


Kata 1: SourceListing

Implement a class called SourceListing, whose main() method accepts one argument (the URL of the WattDepot server) and which writes out the URL argument and a list of all sources defined on that server and their descriptions, sorted in alphabetical order by source name.  Use the System.out.format method to provide a nicely formatted list.  For example:

Server: http://server.wattdepot.org:8190/wattdepot/

Source                 Description
Bar                    Represents the energy consumed by the Bar building.
Baz                    Represents the energy consumed by the Baz floor of the Bar building.
Foo                    Energy generated by the Foo power plant.
Qux                    The energy meter associated with the Qux household.



Kata 2: SourceLatency

Implement a class called SourceLatency, whose main() method accepts one argument (the URL of the WattDepot server) and which writes out the URL argument and a list of all sources defined on that server and the number of seconds since data was received for that source, sorted in ascending order by this latency value.  If no data has every been received for that source, indicate that.  Use the System.out.format method to provide a nicely formatted list.  For example:

Server: http://server.wattdepot.org:8190/wattdepot/

Source                 Latency (in seconds, as of 12-Oct-2011 14:32:12)
Baz                    9
Bar                    10 
Foo                    14
Qux                    No data received.

Kata 3: SourceHierarchy

Implement a class called SourceHierarchy, whose main() method accepts one argument (the URL of the WattDepot server) and which writes out the URL argument and a hierarchical list of all sources defined on that server.  The hierarchy represents the source and subsource relationship between sources. For example:

Server: http://server.wattdepot.org:8190/wattdepot/

Source Hierarchy
Baz
  Bar
  Zob
    Zob-A
    Zob-B
Foo
Qux 

Thus, the source Baz has two subsources, Bar and Zob.  The source Zob has two subsources, Zob-A and Zob-B.  Foo and Qux have no subsources. The hierarchy is represented by two space indentation.

Kata 4: EnergyYesterday

Implement a class called EnergyYesterday, whose main() method accepts one argument (the URL of the WattDepot server) and which writes out the URL argument and a list of all sources defined on that server and the amount of energy in watt-hours consumed by that source during the previous day, sorted in ascending order by watt-hours of consumption.  If no energy has every been consumed by that source, indicate zero.  Use the System.out.format method to provide a nicely formatted list.  For example:

Server: http://server.wattdepot.org:8190/wattdepot/

Source                 Energy consumed in watt-hours (19-Oct-2011)
Baz                    932
Bar                    1025 
Foo                    1436
Qux                    2357
Kata 5: HighestRecordedPowerYesterday

Implement a class called HighestRecordedPowerYesterday, whose main() method accepts one argument (the URL of the WattDepot server) and which writes out the URL argument and a list of all sources defined on that server and the highest recorded power associated with that source during the previous day, sorted in ascending order by watts.  Also indicate the time when that power value was observed. If no power data is associated with that source, indicate that.  Use the System.out.format method to provide a nicely formatted list.  For example:

Server: http://server.wattdepot.org:8190/wattdepot/

Source                 Highest recorded power in watts (12-Oct-2011)
Baz                    10,034 10:30am
Bar                    10,456 2:45pm
Foo                    14,876 12:30pm
Qux                    23,578 4:15pm

This is a little tricky due to the presence of both virtual and non-virtual sources. For non-virtual sources, you could retrieve all of the sensor data and just iterate through to find the maximum power value. However, virtual sources represent an aggregate of non-virtual sources, so there is no sensor data associated with them directly, and it is unlikely that the sensor data timestamps for its constituent sources will be synchronized exactly.

One reasonable way to deal with this is to request the computed power at (say) 15 minute intervals for the entire day, which provides 96 data points per source whether it is virtual or non-virtual.

Kata 6: MondayAverageEnergy

Implement a class called MondayAverageEnergy, whose main() method accepts one argument (the URL of the WattDepot server) and which writes out the URL argument and a list of all sources defined on that server and the average energy consumed by that source during the previous two Mondays, sorted in ascending order by watt-hours.  Use the System.out.format method to provide a nicely formatted list.  For example:

Server: http://server.wattdepot.org:8190/wattdepot/

Source                 Average energy for last two Mondays in watt-hours (24-Oct-2011, 17-Oct-2011)
Baz                    10,034 
Bar                    10,456 
Foo                    14,876 
Qux                    23,578 

Kata 1 was fairly straight forward and did not take much time; maybe around 15 minutes. This is because the provided SimpleApplication.java file provided nearly all the method calls needed to solve it. All it took was slight formatting.

Kata 2 took a little longer; maybe around 30 minutes mainly because I was not familiar with Java's Calendar, Date, and XMLGregorianCalendar classes. After much reading into the API and a lot of guess and check works, I was able to format the outputs to correctly show the current date and time.

Kata 3 is where it started getting a bit difficult and took me a couple of hours to complete, mainly because I was reading through the API trying to figure out how to find the subsources. The formatting was also quite difficult and was not able to get it to work very nicely and resulted in me hardcoding the indentations. It works nicely for this problem, but if the code were to be used where a subsource contains a subsource, the indentations may be off.

Kata 4 was even more difficult than Kata 3 and also took me a few hours to complete, mainly because it took me some time to get used to the XMLGregorianCalendar class required in one of the methods. It also took me quite some time to figure out how to set the days correctly so it would get "yesterday's" data, rather than "today's".

Kata 5 was a bit confusing at first because a lot of problems happened while writing it. The first thing wrong (I guess you could say) is the fact that the system times out after a certain amount of time because it takes too long run run the queries if the increment time was small (ie. 5 or 15 minutes). Because of this, I had to set my intervals to 60 minutes so that it the program stopped timing out. Another problem I had and was unable to fix was not being able to display the actual time where the most energy was consumed.

The final kata, kata 6 was the one I was unable to finish. I am currently still working on manipulating the time based variables and was unable to manipulate it so that it would give me the time for "Monday". The could seemed simple enough, but I would always get errors when I tried passing it my variables as arguments and/or trying to get the manipulation to work.

Like Robocode, I learned quite a bit from doing these Kata. It was my first time really dealing with real world data that was always changing. I also learned that because the data is coming from real time, the results can sometimes be insanely slow and even time out, which can frustrate even the most patient programmer since you aren't always able to check if the outputs are correct. I hope to continue working on these Kata to really practice manipulating the times.

No comments:

Post a Comment