PowerAPI is a middleware toolkit for building software-defined power meters. Software-defined power meters are configurable software libraries that can estimate the power consumption of software in real-time. As a middleware toolkit, PowerAPI offers the capability of assembling power meters «à la carte» to accommodate user requirements. If you want to build your own power meter using PowerAPI, we provide a step by step guide.

Creating your own formula

To develop a formula you have to consider the following parts :

  • The configuration parameters needed by the actor
  • The dispatching rule of the reports to the different formula actors
  • The behavior of the formula actor

We provide a dummy formula that contain the template to develop your own formula. Next we provide a guide on developing your own formula using that template.


To develop a formula there is two major tasks. How to handle the formula actor, and the behavior of the formula actor.

The first thing you need to decide is what will your formula receive as inputs, how it will treat it and what will it return. Once you've decide this part you need to extract the parameters needed by the formula actor. In the next of this guide we will treat the handling of the formula actor then we will provide some advices on how to develop your formula actor.

Handling the actor

Once you've decided the parameters the formula actor will need, we need to build the chain to pass them from the configuration file to the actor.

First we need to build the parser that will extract the parameters from the configuration file. For that part we are working on generate_dummy_parser in __main__.py. For each parameters arg you should add the following lines :

        "arg",  # name of the arg
        help="help on arg",  # help to display when --help is used
        type=None,  # type expected
        default=None,  # Default value if not specified

Once the configuration is retrieved from the configuration file it is necessary to check it. For that we use a DummyConfigValidator that will check that each mandatory arguments are present and that each arguments have the correct type.

At this moment the configuration is a Dictionary, it will be transformed to a DummyFormulaConfig (in context.py) to be passed to the actor. You should put each parameters needed in the formula actor as attribute of that class.

In addition of the configuration you need to specify the dispatch rule of route_table. This rule decide which report is send to which formula actor. If you choose SENSOR, reports with the same sensor field will be send to the same actor. If you choose SOCKET the sort will be made on the sensor field.

Your formula

Now that you actor will receive its parameters, you need to build it. Your actor will be initialized two times, one as an object and one as an actor. You first need to define all the attributes as None is the __init__. The supervisor will then call _initialization with a StartMessage containing the configuration.

The receiveMsg_Report(self,message) method will be used each time a report is send to the formula actor. Once you have treated your reports and produced the output reports, send them to the pushers using the following commands :

for name, pusher in self.pushers.items():
    self.log_debug('send ' + str(report) + ' to ' + name)
    self.send(pusher, report)