Multiple data bindings - WeeWX 5.0
Author: Tom Keffer <tkeffer@gmail.com>

Skip to content

# Using multiple bindings

It's easy to use more than one database in your reports. Here's an example. In my office I have two consoles: a VantagePro2 connected to a Dell Optiplex, and a WMR100N, connected to a Raspberry Pi. Each is running WeeWX. The Dell is using SQLite, the RPi, MySQL.

Suppose I wish to compare the inside temperatures of the two consoles. How would I do that?

It's easier to access MySQL across a network than SQLite, so let's run the reports on the Dell, but access the RPi's MySQL database remotely. Here's how the bindings and database sections of `weewx.conf` would look on the Dell:

    [DataBindings]
        # This section binds a data store to an actual database

        [[wx_binding]]
            # The database to be used - it should match one of the sections in [Databases]
            database = archive_sqlite
            # The name of the table within the database
            table_name = archive
            # The class to manage the database
            manager = weewx.manager.DaySummaryManager
            # The schema defines to structure of the database contents
            schema = schemas.wview_extended.schema

        [[wmr100_binding]]
            # Binding for my WMR100 on the RPi
            database = rpi_mysql
            # The name of the table within the database
            table_name = archive
            # The class to manage the database
            manager = weewx.manager.DaySummaryManager
            # The schema defines to structure of the database contents
            schema = schemas.wview_extended.schema

    [Databases]
        # This section binds to the actual database to be used

        [[archive_sqlite]]
            database_type = SQLite
            database_name = weewx.sdb

        [[rpi_mysql]]
            database_type = MySQL
            database_name = weewx
            host = rpi-bug

    [DatabaseTypes]
        #   This section defines defaults for the different types of databases.

        [[SQLite]]
            driver = weedb.sqlite
            # Directory in which the database files are located
            SQLITE_ROOT = archive

        [[MySQL]]
            driver = weedb.mysql
            # The host where the database is located
            host = localhost
            # The user name for logging in to the host
            user = weewx
            # The password for the user name
            password = weewx

The two additions have been highlighted. The first, `[[wmr100_binding]]`, adds a new binding called `wmr100_binding`. It links ("binds") to the new database, called `rpi_mysql`, through the option `database`. It also defines some characteristics of the binding, such as which manager is to be used and what its schema looks like.

The second addition, `[[rpi-mysql]]`, defines the new database. Option `database_type` is set to `MySQL`, indicating that it is a MySQL database. Defaults for MySQL databases are defined in the section `[[MySQL]]`. The new database accepts all of them, except for `host`, which as been set to the remote host `rpi-bug`, the name of my Raspberry Pi.

## Explicit binding in tags

How do we use this new binding? First, let's do a text comparison, using tags. Here's what our template looks like:

    <table>
      <tr>
        <td class="stats_label">Inside Temperature, Vantage</td>
        <td class="stats_data">$current.inTemp</td>
      </tr>
      <tr>
        <td class="stats_label">Inside Temperature, WMR100</td>
        <td class="stats_data">$latest($data_binding='wmr100_binding').inTemp</td>
      </tr>
    </table>

The explicit binding to `wmr100_binding` is highlighted. This tells the reporting engine to override the default binding specifed in `[StdReport]`, generally `wx_binding`, and use `wmr100_binding` instead.

Inside Temperature, Vantage 68.7°F
Inside Temperature, WMR100 68.9°F

## Explicit binding in images

How would we produce a graph of the two different temperatures? Here's what the relevant section of the `skin.conf` file would look like.

    [[[daycompare]]]
       [[[[inTemp]]]]
           label = Vantage inTemp
       [[[[WMR100Temp]]]]
           data_type = inTemp
           data_binding = wmr100_binding
           label = WMR100 inTemp

This will produce an image with name `daycompare.png`, with two plot lines. The first will be of the temperature from the Vantage. It uses the default binding, `wx_binding`, and will be labeled `Vantage inTemp`. The second line explicitly uses the `wmr100_binding`. Because it uses the same variable name (`inTemp`) as the first line, we had to explicitly specify it using option `data_type`, in order to avoid using the same sub-section name twice (see the section Including a type more than once in a plot for details). It will be labeled `WMR100 inTemp`. The results look like this:

## Stupid detail

At first, I could not get this example to work. The problem turned out to be that the RPi was processing things just a beat behind the Dell, so the temperature for the "current" time wasn't ready when the Dell needed it. I kept getting `N/A`. To avoid this, I introduced the tag `$latest`, which uses the last available timestamp in the binding, which may or may not be the same as what `$current` uses. That's why the example above uses `$latest` instead of `$current`.