{"id":14064685,"url":"https://github.com/openclimatefix/pv-site-datamodel","last_synced_at":"2026-03-10T14:32:50.286Z","repository":{"id":65317800,"uuid":"585582995","full_name":"openclimatefix/pv-site-datamodel","owner":"openclimatefix","description":"Datamodel for PV sites","archived":false,"fork":false,"pushed_at":"2025-08-22T14:18:19.000Z","size":3406,"stargazers_count":2,"open_issues_count":15,"forks_count":22,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-12-15T15:19:59.398Z","etag":null,"topics":["dbml","pvsite"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/openclimatefix.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["openclimatefix"],"patreon":null,"open_collective":"openclimatefix","ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2023-01-05T14:41:50.000Z","updated_at":"2025-10-06T09:40:24.000Z","dependencies_parsed_at":"2024-06-03T13:25:30.127Z","dependency_job_id":"f7827280-11b2-4f6b-bd0b-fc5f24516699","html_url":"https://github.com/openclimatefix/pv-site-datamodel","commit_stats":{"total_commits":253,"total_committers":8,"mean_commits":31.625,"dds":0.5296442687747036,"last_synced_commit":"decdceb5d198846d405a76f0cc4af870144275a8"},"previous_names":["openclimatefix/pv-datamodel","openclimatefix/pvsite-datamodel"],"tags_count":114,"template":false,"template_full_name":null,"purl":"pkg:github/openclimatefix/pv-site-datamodel","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclimatefix%2Fpv-site-datamodel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclimatefix%2Fpv-site-datamodel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclimatefix%2Fpv-site-datamodel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclimatefix%2Fpv-site-datamodel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/openclimatefix","download_url":"https://codeload.github.com/openclimatefix/pv-site-datamodel/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclimatefix%2Fpv-site-datamodel/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30337246,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T12:41:07.687Z","status":"ssl_error","status_checked_at":"2026-03-10T12:41:06.728Z","response_time":106,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dbml","pvsite"],"created_at":"2024-08-13T07:04:01.174Z","updated_at":"2026-03-10T14:32:50.256Z","avatar_url":"https://github.com/openclimatefix.png","language":"Python","funding_links":["https://github.com/sponsors/openclimatefix","https://opencollective.com/openclimatefix"],"categories":["Python"],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003epvsite-datamodel\u003c/h1\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --\u003e\n[![All Contributors](https://img.shields.io/badge/all_contributors-18-orange.svg?style=flat-square)](#contributors-)\n\u003c!-- ALL-CONTRIBUTORS-BADGE:END --\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/openclimatefix/ocf-meta-repo?tab=readme-ov-file#overview-of-ocfs-nowcasting-repositories\" alt=\"Ease of Contribution\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/ease%20of%20contribution:%20easy-32bd50\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://pypi.org/project/pvsite-datamodel/0.1.18/\" alt=\"PyPi package\"\u003e\n        \u003cimg src=\"https://img.shields.io/pypi/v/pvsite-datamodel\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/openclimatefix/pv-datamodel/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc\" alt=\"Issues\"\u003e\n        \u003cimg src=\"https://img.shields.io/github/issues/openclimatefix/pv-datamodel\"/\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/openclimatefix/pv-datamodel/graphs/contributors\" alt=\"Contributors\"\u003e\n        \u003cimg src=\"https://img.shields.io/github/contributors/openclimatefix/pv-datamodel\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n**:warning: Note this repo will soon be deprecated in favour of a new Data Platform**\n\nDatabase schema specification for PV Site data.\n\n## Repository structure\n\n```yaml\npvsite_datamodel:\n  read: # Sub package containing modules for reading from the database\n  write: # Sub package containing modules for writing to the database\n    - connection.py # Class for connecting to the database\n    - sqlmodels.py # SQLAlchemy definitions of table schemas\ntests: # External tests package\n```\n\n### Top-level functions\n\nClasses specifying table schemas:\n\n- APIRequestSQL\n- GenerationSQL\n- ForecastSQL\n- ForecastValueSQL\n- MLModelSQL\n- UserSQL\n- LocationSQL\n- LocationGroupSQL\n- StatusSQL\n- ClientSQL\n\nDatabase connection objects:\n\n- DatabaseConnection\n\n### Read and write package functions\n\n- Read function currently accessible via `from pvsite_datamodel.read import \u003cfunc\u003e`.\n- Write function Currently accessible via `from pvsite_datamodels.write import \u003cfunc\u003e`.\n\n\n| **Read Package Functions**           | **Write Package Functions** |\n| ------------------------------------ | --------------------------- |\n| `get_user_by_email`                  | `insert_forecast_values`    |\n| `get_pv_generation_by_sites`         | `insert_generation_values`  |\n| `get_site_by_uuid`                   | `create_site`               |\n| `get_site_by_client_site_id`         | `create_site_group`         |\n| `get_site_by_client_site_name`       | `create_user`               |\n| `get_sites_by_client_name`           | `create_client`             |\n| `get_all_sites`                      | `make_fake_site`            |\n| `get_sites_by_country`               | `add_site_to_site_group`    |\n| `get_site_group_by_name`             | `change_user_site_group`    |\n| `get_latest_status`                  | `update_user_site_group`    |\n| `get_latest_forecast_values_by_site` | `edit_site`                 |\n| `get_client_by_name`                 | `edit_client`               |\n|                                      | `assign_site_to_client`     |\n|                                      | `delete_site`               |\n|                                      | `delete_user`               |\n|                                      | `delete_site_group`         |\nTODO update table\n\n## Local Repository Setup(Linux)\n\nThis guide walks you through setting up the repository locally, installing dependencies. Follow the steps carefully to get your development environment up and running.\n\n**Pre-requisite:** \nUse `uv` for virtual environment management.\n\n- Install Pgadmin4 for database management\n\n### Database Setup\n\nFollow these steps to set up the database locally:\n\n1. **Install PostgreSQL:**\nDownload and install PostgreSQL on your system : [Download PostgreSQL for Linux ](https://www.postgresql.org/download/linux/ubuntu/)\n\n\n2. **Start PostgreSQL Service:**\n```bash\nsudo service postgresql start\n```\n\n\n3. **Check PostgreSQL Status:**\nEnsure the service is running properly:\n```bash\nsudo service postgresql status\n```\n\n\n4. **Get Your Local IP Address:**\nCopy the IP address to configure your connection:\n```bash\nhostname -I\n```\n\n\n5. **Create the Database:**\nUse **pgAdmin 4** or the command line to create your database.\n\n\n6. **Run Migrations with Alembic:**\nExport the database URL and apply migrations:\n```bash\nexport DB_URL=\"postgresql://\u003cusername\u003e:\u003cpassword\u003e@\u003cyour_ip\u003e:5432/\u003cyour_database\u003e\"\n```\n\n\n- **Note:** Replace the placeholders with your actual database credentials.\n\n7. **Run the migrations:**\n```bash\n\nuv run alembic upgrade head\n```\n\n\n\n### Steps to setup the repository locally\n\n1. **Fork \u0026 Clone the Repository:**\n```bash\ngit clone https://github.com/openclimatefix/pv-site-datamodel.git\n```\n\n\n2. **Navigate to the Repository:**\n```bash\ncd pv-site-datamodel\n```\n\n3. **Install Dependencies:**\n```bash\nuv sync\n```\n\n\n4. **Activate Virtual Environment:**\n```bash\nsource .venv/bin/activate\n```\n\n\n5. **Set Database URL:**\n\nReplace the placeholder with your actual database connection string.\n```bash\nexport DB_URL=\"postgresql://\u003cusername\u003e:\u003cpassword\u003e@\u003cyour_ip\u003e:5432/\u003cyour_database\u003e\"\n```\n\n\n6. **Make Code Changes:**\n\nModify the necessary code files as needed.\n\n\n7. **Format the Code:**\n```bash\nmake format\n```\n\n\n8. **Lint the Code:**\n```bash\nmake lint\n```\n\n\n---\n\n\n## Running the tests\n\nRun the following command to execute the test suite:\n\n```bash\n    make test\n```\n\n\n## PVSite Database Schema\n\n```mermaid\n---\ntitle: SQLAlchemy relationships\n---\nclassDiagram\n\n    class UserSQL{\n        + user_uuid : UUID ≪ PK ≫\n        + email : String(255) ≪ U ≫\n        + location_group_uuid : UUID ≪ FK ≫\n    }\n        class LocationGroupSQL{\n        + location_group_uuid : UUID ≪ PK ≫\n        + location_group_name : String ≪ U ≫\n        + service_level : Integer ≪ U ≫\n    }\n\n    class LocationGroupLocationSQL{\n        + location_group_location_uuid : UUID ≪ PK ≫\n        + location_group_uuid : UUID ≪ FK ≫\n        + location_uuid : UUID ≪ FK ≫\n    }\n    \n    class LocationLocationSQL{\n        + location_location_uuid : UUID ≪ PK ≫\n        + location_parent_uuid : UUID ≪ FK ≫\n        + location_child_uuid : UUID ≪ FK ≫\n    }\n\n    class LocationSQL{\n        + location_uuid : UUID ≪ PK ≫\n        + client_location_id : Integer\n        + client_location_name : String\n        + country : String ≪ D ≫\n        + region : String\n        + location_type: Enum ≪ D ≫\n        + location_metadata : String\n        + dno : String\n        + gsp : String\n        + asset_type : Enum ≪ D ≫\n        + orientation : Float\n        + tilt : Float\n        + latitude : Float\n        + longitude : Float\n        + capacity_kw : Float\n        + inverter_capacity_kw : Float\n        + module_capacity_kw : Float\n        + ml_id : Integer ≪ U ≫\n        + client_uuid : UUID ≪ FK ≫\n        + ml_model_uuid : UUID ≪ FK ≫\n    }\n\n    class ClientSQL{\n        + client_uuid : UUID ≪ PK ≫\n        + client_name : String\n    }\n\n    class GenerationSQL{\n        + generation_uuid : UUID ≪ PK ≫\n        + location_uuid : UUID ≪ FK ≫\n        + generation_power_kw : Float\n        + start_utc : DateTime\n        + end_utc : DateTime\n    }\n\n    class ForecastSQL{\n        + forecast_uuid : UUID ≪ PK ≫\n        + location_uuid : UUID ≪ FK ≫\n        + timestamp_utc : DateTime\n        + forecast_version : String\n    }\n\n    class ForecastValueSQL{\n        + forecast_value_uuid : UUID ≪ PK ≫\n        + start_utc : DateTime\n        + end_utc : DateTime\n        + forecast_power_kw : Float\n        + horizon_minutes : Integer\n        + forecast_uuid : UUID ≪ FK ≫\n    }\n\n    class StatusSQL{\n        + status_uuid : UUID ≪ PK ≫\n        + status : String\n        + message : String\n    }\n\n    class InverterSQL{\n        + inverter_uuid : UUID ≪ PK ≫\n        + site_uuid : UUID ≪ FK ≫\n    }\n\n    class APIRequestSQL{\n        + uuid : UUID ≪ PK ≫\n        + url : String\n        + user_uuid : UUID ≪ FK ≫\n    }\n\n    class MLModelSQL{\n        + uuid : UUID ≪ PK ≫\n        + mode_name : String\n        + model_version : UUID ≪ FK ≫\n    }\n\n    UserSQL \"1\" -- \"N\" LocationGroupSQL : belongs_to\n    LocationGroupLocationSQL \"N\" -- \"1\" LocationSQL : contains\n    LocationGroupSQL \"1\" -- \"N\" LocationGroupLocationSQL : contains\n    LocationSQL \"1\" -- \"N\" GenerationSQL : generates\n    LocationSQL \"1\" -- \"N\" ForecastSQL : forecasts\n    LocationSQL \"N\" -- \"0\" MLModelSQL : ml_model\n    ForecastSQL \"1\" -- \"N\" ForecastValueSQL : contains\n    MLModelSQL \"1\" -- \"N\" ForecastValueSQL : forecasts\n    LocationSQL \"1\" -- \"N\" InverterSQL : contains\n    UserSQL \"1\" -- \"N\" APIRequestSQL : performs_request\n    ClientSQL \"1\" -- \"N\" LocationSQL : owns\n    LocationSQL \"1\" -- \"N\" LocationLocationSQL : contains\n    LocationLocationSQL \"N\" -- \"1\" LocationSQL : contains\n    \n    class Legend{\n    UUID: Universally Unique Identifier\n    PK: Primary Key\n    FK: Foreign Key\n    U: Unique Constraint\n    D: Default Value\n    }\n\n```\n\n## Multiple Clients\n\nWe have the ability to have these different scenarios\n\n1. one user - can add or view one site\n2. one user, can add or view multiple sites\n3. Two users (for example from the sample company), want to look at one site\n4. Two users, wanting to look at multiple sites (could be added by another user). Any user from site group can add a site.\n5. OCF user want to see everything (admin)\n\n### Solution\n\nLocation can mean site or region.\n\n```mermaid\n  graph TD;\n      User-- N:1 --\u003eLocationGroup;\n      LocationGroup-- N:N --\u003eLocation;\n```\n\n- One `user` is in one `loationgroup`. Each location group can have multiple users.\n- Each `locationroup` contains multiple `locations`. One `location` can be in multiple `locationgroups`\n\n### 1. one user - one site\n\n```mermaid\n  graph TD;\n      A(User=Alice)--\u003eB(LocationGroup=Alice1);\n      B --\u003e C(Site);\n```\n\n### 2. one user - two sites\n\n```mermaid\n  graph TD;\n      A(User=Alice)--\u003eB(LocationGroup=Alice1);\n      B --\u003e C1(Site1);\nB --\u003e C2(Site2);\n```\n\n### 3. Two users - one site\n\n```mermaid\n  graph TD;\n      A1(User=Alice)--\u003eB(LocationGroup);\nA2(User=Bob)--\u003eB(LocationGroup);\n      B --\u003e C1(Site1);\n```\n\n### 4. Two users - two site\n\n```mermaid\n  graph TD;\n      A1(User=Alice)--\u003eB(LocationGroup);\nA2(User=Bob)--\u003eB(LocationGroup);\n      B --\u003e C1(Site1);\nB --\u003e C2(Site2);\n```\n\n### 5. OCF can see everything\n\n```mermaid\n  graph TD;\n      A1(User=Alice)--\u003eB(LocationGroup1);\nA2(User=Bob)--\u003eB(LocationGroup1);\nA3(User=OCF)--\u003eB2(LocationGroup2);\n      B --\u003e C1(Site1);\nB --\u003e C2(Site2);\n      B2 --\u003e C1(Site1);\nB2 --\u003e C2(Site2);\nB2 --\u003e C3(Site3);\n```\n\n## Database migrations using alembic\n\n[./alembic](./alembic)\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/abhijelly\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/75399048?v=4?s=100\" width=\"100px;\" alt=\"Abhijeet\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAbhijeet\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/pv-site-datamodel/commits?author=abhijelly\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/devsjc\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/47188100?v=4?s=100\" width=\"100px;\" alt=\"devsjc\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003edevsjc\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/pv-site-datamodel/commits?author=devsjc\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/peterdudfield\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/34686298?v=4?s=100\" width=\"100px;\" alt=\"Peter Dudfield\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ePeter Dudfield\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/pv-site-datamodel/commits?author=peterdudfield\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://confusedmatrix.com\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/617309?v=4?s=100\" width=\"100px;\" alt=\"Chris Briggs\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eChris Briggs\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/pv-site-datamodel/commits?author=confusedmatrix\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"http://racheltipton.dev\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/86949265?v=4?s=100\" width=\"100px;\" alt=\"rachel tipton\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003erachel tipton\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/pv-site-datamodel/commits?author=rachel-labri-tipton\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/ericcccsliu\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/62641231?v=4?s=100\" width=\"100px;\" alt=\"Eric Liu\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eEric Liu\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/pv-site-datamodel/commits?author=ericcccsliu\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/braddf\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/41056982?v=4?s=100\" width=\"100px;\" alt=\"braddf\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ebraddf\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/pv-site-datamodel/commits?author=braddf\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/bikramb98\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/24806286?v=4?s=100\" width=\"100px;\" alt=\"Bikram Baruah\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eBikram Baruah\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/pv-site-datamodel/commits?author=bikramb98\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"http://andrewlester.net\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/23221268?v=4?s=100\" width=\"100px;\" alt=\"Andrew Lester\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAndrew Lester\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/pv-site-datamodel/commits?author=AndrewLester\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/suleman1412\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/37236131?v=4?s=100\" width=\"100px;\" alt=\"Suleman Karigar\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSuleman Karigar\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/pv-site-datamodel/commits?author=suleman1412\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/vishalj0501\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/92500255?v=4?s=100\" width=\"100px;\" alt=\"Vishal J\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eVishal J\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/pv-site-datamodel/commits?author=vishalj0501\" title=\"Tests\"\u003e⚠️\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/ProfessionalCaddie\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/180212671?v=4?s=100\" width=\"100px;\" alt=\"Nicholas Tucker\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eNicholas Tucker\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/pv-site-datamodel/commits?author=ProfessionalCaddie\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/PrabhasKalyan\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/146581074?v=4?s=100\" width=\"100px;\" alt=\"PrabhasKalyan\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ePrabhasKalyan\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/pv-site-datamodel/commits?author=PrabhasKalyan\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/hanaawad24\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/181783053?v=4?s=100\" width=\"100px;\" alt=\"hanaawad24\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ehanaawad24\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/pv-site-datamodel/commits?author=hanaawad24\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"https://github.com/openclimatefix/pv-site-datamodel/commits?author=hanaawad24\" title=\"Tests\"\u003e⚠️\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/mduffin95\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/6598483?v=4?s=100\" width=\"100px;\" alt=\"Matthew Duffin\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMatthew Duffin\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/pv-site-datamodel/commits?author=mduffin95\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/MAYANK12SHARMA\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/145884197?v=4?s=100\" width=\"100px;\" alt=\"MAYANK SHARMA\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMAYANK SHARMA\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/pv-site-datamodel/commits?author=MAYANK12SHARMA\" title=\"Tests\"\u003e⚠️\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://www.linkedin.com/in/ruth-velasquez070/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/142541875?v=4?s=100\" width=\"100px;\" alt=\"Ruth Velasquez\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eRuth Velasquez\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#ideas-abillama05\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/Praneeth-Suresh\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/86470588?v=4?s=100\" width=\"100px;\" alt=\"Praneeth Suresh\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ePraneeth Suresh\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/pv-site-datamodel/commits?author=Praneeth-Suresh\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003c!-- markdownlint-restore --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenclimatefix%2Fpv-site-datamodel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopenclimatefix%2Fpv-site-datamodel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenclimatefix%2Fpv-site-datamodel/lists"}