Skip to main content

SDK for interacting with the PVSite database

Project description

pvsite-datamodel

All Contributors

Database schema specification for PV Site data.

Repository structure

pvsite_datamodel:
  read: # Sub package containing modules for reading from the database
  write: # Sub package containing modules for writing to the database
  - connection.py # Class for connecting to the database
  - sqlmodels.py # SQLAlchemy definitions of table schemas
tests: # External tests package

Top-level functions

Classes specifying table schemas:

  • APIRequestSQL
  • GenerationSQL
  • ForecastSQL
  • ForecastValueSQL
  • MLModelSQL
  • UserSQL
  • SiteSQL
  • SiteGroupSQL
  • StatusSQL
  • ClientSQL

Database connection objects:

  • DatabaseConnection

Read package functions

Currently available functions accessible via from pvsite_datamodel.read import <func>:

  • get_user_by_email
  • get_pv_generation_by_sites
  • get_site_by_uuid
  • get_site_by_client_site_id
  • get_site_by_client_site_name
  • get_sites_by_client_name
  • get_all_sites
  • get_sites_by_country
  • get_site_group_by_name
  • get_latest_status
  • get_latest_forecast_values_by_site
  • get_client_by_name

Write package functions

Currently available write functions accessible via from pvsite_datamodels.write import <func>:

  • insert_forecast_values
  • insert_generation_values
  • create_site
  • create_site_group
  • create_user
  • add_site_to_site_group
  • change_user_site_group
  • update_user_site_group
  • edit_site
  • delete_site
  • delete_user
  • delete_site_group
  • make_fake_site
  • create_client
  • edit_client
  • assign_site_to_client

Install the dependencies (requires poetry)

poetry install

Coding style

Format the code in place.

make format

Lint the code

make lint

Running the tests

make test

PVSite Database Schema

---
title: SQLAlchemy relationships
---
classDiagram

    class UserSQL{
        + user_uuid : UUID ≪ PK ≫
        + email : String(255) ≪ U ≫
        + site_group_uuid : UUID ≪ FK ≫
    }
        class SiteGroupSQL{
        + site_group_uuid : UUID ≪ PK ≫
        + site_group_name : String(255) ≪ U ≫
        + service_level : Integer ≪ U ≫
    }

    class SiteGroupSiteSQL{
        + site_group_site_uuid : UUID ≪ PK ≫
        + site_group_uuid : UUID ≪ FK ≫
        + site_uuid : UUID ≪ FK ≫
    }

    class SiteSQL{
        + site_uuid : UUID ≪ PK ≫
        + client_site_id : Integer
        + client_site_name : String(255)
        + country : String(255) ≪ D ≫
        + region : String(255)
        + dno : String(255)
        + gsp : String(255)
        + asset_type : Enum ≪ D ≫
        + orientation : Float
        + tilt : Float
        + latitude : Float
        + longitude : Float
        + capacity_kw : Float
        + inverter_capacity_kw : Float
        + module_capacity_kw : Float
        + ml_id : Integer ≪ U ≫
        + client_uuid : UUID ≪ FK ≫
    }

    class ClientSQL{
        + client_uuid : UUID ≪ PK ≫
        + client_name : String(255)
    }

    class GenerationSQL{
        + generation_uuid : UUID ≪ PK ≫
        + site_uuid : UUID ≪ FK ≫
        + generation_power_kw : Float
        + start_utc : DateTime
        + end_utc : DateTime
    }

    class ForecastSQL{
        + forecast_uuid : UUID ≪ PK ≫
        + site_uuid : UUID ≪ FK ≫
        + timestamp_utc : DateTime
        + forecast_version : String(32)
    }

    class ForecastValueSQL{
        + forecast_value_uuid : UUID ≪ PK ≫
        + start_utc : DateTime
        + end_utc : DateTime
        + forecast_power_kw : Float
        + horizon_minutes : Integer
        + forecast_uuid : UUID ≪ FK ≫
    }

    class StatusSQL{
        + status_uuid : UUID ≪ PK ≫
        + status : String(255)
        + message : String(255)
    }

    class InverterSQL{
        + inverter_uuid : UUID ≪ PK ≫
        + site_uuid : UUID ≪ FK ≫
    }

    class APIRequestSQL{
        + uuid : UUID ≪ PK ≫
        + url : String
        + user_uuid : UUID ≪ FK ≫
    }
    
    class MLModelSQL{
        + uuid : UUID ≪ PK ≫
        + mode_name : String
        + model_version : UUID ≪ FK ≫
    }

    UserSQL "1" -- "N" SiteGroupSQL : belongs_to
    SiteGroupSQL "N" -- "N" SiteSQL : contains
    SiteGroupSQL "1" -- "N" SiteGroupSiteSQL : contains
    SiteSQL "1" -- "N" GenerationSQL : generates
    SiteSQL "1" -- "N" ForecastSQL : forecasts
    ForecastSQL "1" -- "N" ForecastValueSQL : contains
    MLModelSQL "1" -- "N" ForecastValueSQL : forecasts
    SiteSQL "1" -- "N" InverterSQL : contains
    UserSQL "1" -- "N" APIRequestSQL : performs_request
    ClientSQL "1" -- "N" SiteSQL : owns
    class Legend{
    UUID: Universally Unique Identifier
    PK: Primary Key
    FK: Foreign Key
    U: Unique Constraint
    D: Default Value
    }

Multiple Clients

We have the ability to have these different scenarios

  1. one user - can add or view one site
  2. one user, can add or view multiple sites
  3. Two users (for example from the sample company), want to look at one site
  4. Two users, wanting to look at multiple sites (could be added by another user). Any user from site group can add a site.
  5. OCF user want to see everything (admin)

Solution

  graph TD;
      User-- N:1 -->SiteGroup;
      SiteGroup-- N:N -->Site;
  • One user is in one sitegroup. Each site group can have multiple users.
  • Each sitegroup contains multiple sites. One site can be in multiple sitegroups

1. one user - one site

  graph TD;
      A(User=Alice)-->B(SiteGroup=Alice1);
      B --> C(Site);

2. one user - two sites

  graph TD;
      A(User=Alice)-->B(SiteGroup=Alice1);
      B --> C1(Site1);
B --> C2(Site2);

3. Two users - one site

  graph TD;
      A1(User=Alice)-->B(SiteGroup);
A2(User=Bob)-->B(SiteGroup);
      B --> C1(Site1);

4. Two users - two site

  graph TD;
      A1(User=Alice)-->B(SiteGroup);
A2(User=Bob)-->B(SiteGroup);
      B --> C1(Site1);
B --> C2(Site2);

5. OCF can see everything

  graph TD;
      A1(User=Alice)-->B(SiteGroup1);
A2(User=Bob)-->B(SiteGroup1);
A3(User=OCF)-->B2(SiteGroup2);
      B --> C1(Site1);
B --> C2(Site2);
      B2 --> C1(Site1);
B2 --> C2(Site2);
B2 --> C3(Site3);

Database migrations using alembic

./alembic

Contributors ✨

Thanks goes to these wonderful people (emoji key):

Abhijeet
Abhijeet

💻
devsjc
devsjc

💻
Peter Dudfield
Peter Dudfield

💻
Chris Briggs
Chris Briggs

💻
rachel tipton
rachel tipton

💻
Eric Liu
Eric Liu

💻
braddf
braddf

💻
Bikram Baruah
Bikram Baruah

💻
Andrew Lester
Andrew Lester

💻
Suleman Karigar
Suleman Karigar

💻
Vishal J
Vishal J

⚠️
Nicholas Tucker
Nicholas Tucker

💻

This project follows the all-contributors specification. Contributions of any kind welcome!

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pvsite_datamodel-1.0.43.tar.gz (3.4 MB view details)

Uploaded Source

Built Distribution

pvsite_datamodel-1.0.43-py3-none-any.whl (3.4 MB view details)

Uploaded Python 3

File details

Details for the file pvsite_datamodel-1.0.43.tar.gz.

File metadata

  • Download URL: pvsite_datamodel-1.0.43.tar.gz
  • Upload date:
  • Size: 3.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for pvsite_datamodel-1.0.43.tar.gz
Algorithm Hash digest
SHA256 e189070470fc74d4d1d7e629d360e816e1cc054471f714d286c032125495a66c
MD5 813b9a941e1e89963b99c37eac0e5d74
BLAKE2b-256 3bec252a0722f39075e02c5c99d3018544fc28c620614503d15855e13fa1838a

See more details on using hashes here.

File details

Details for the file pvsite_datamodel-1.0.43-py3-none-any.whl.

File metadata

File hashes

Hashes for pvsite_datamodel-1.0.43-py3-none-any.whl
Algorithm Hash digest
SHA256 bab596979b4acec84806a57ecef02463dfb92d086c39cf8f1e4e6476f19c2fcd
MD5 70248fd694dd8f60f11e6b6087f15f68
BLAKE2b-256 81451915bf7384030d5b919d207ae97ba86851031b1a4a8958cef7a7fd13c89e

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page