{"id":342611,"name":"Solar Consumer","description":"This code can be used to download solar forecasts and save them to a PostgreSQL database by retrieving solar generation estimates for embedded solar farms and preparing the data for analysis.","url":"https://github.com/openclimatefix/solar-consumer","last_synced_at":"2026-04-08T10:30:19.007Z","repository":{"id":265895369,"uuid":"895658029","full_name":"openclimatefix/solar-consumer","owner":"openclimatefix","description":"Pull and save solar generation and forecasts","archived":false,"fork":false,"pushed_at":"2026-03-25T17:12:47.000Z","size":681,"stargazers_count":8,"open_issues_count":23,"forks_count":29,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-03-30T06:37:07.779Z","etag":null,"topics":[],"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":"2024-11-28T16:12:39.000Z","updated_at":"2026-03-25T17:12:26.000Z","dependencies_parsed_at":"2026-03-03T18:01:05.768Z","dependency_job_id":null,"html_url":"https://github.com/openclimatefix/solar-consumer","commit_stats":null,"previous_names":["openclimatefix/neso-solar-consumer","openclimatefix/solar-consumer"],"tags_count":78,"template":false,"template_full_name":null,"purl":"pkg:github/openclimatefix/solar-consumer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclimatefix%2Fsolar-consumer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclimatefix%2Fsolar-consumer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclimatefix%2Fsolar-consumer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclimatefix%2Fsolar-consumer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/openclimatefix","download_url":"https://codeload.github.com/openclimatefix/solar-consumer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclimatefix%2Fsolar-consumer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31342696,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-03T06:57:30.245Z","status":"ssl_error","status_checked_at":"2026-04-03T06:57:29.849Z","response_time":107,"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"}},"owner":{"login":"openclimatefix","name":"Open Climate Fix","uuid":"48357542","kind":"organization","description":"Using open science to mitigate climate change","email":"info@openclimatefix.org","website":"openclimatefix.org","location":"London","twitter":"openclimatefix","company":null,"icon_url":"https://avatars.githubusercontent.com/u/48357542?v=4","repositories_count":88,"last_synced_at":"2024-04-15T07:32:15.529Z","metadata":{"has_sponsors_listing":true,"funding":{"github":["openclimatefix"],"patreon":null,"open_collective":"openclimatefix","ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"html_url":"https://github.com/openclimatefix","funding_links":["https://github.com/sponsors/openclimatefix","https://opencollective.com/openclimatefix"],"total_stars":1200,"followers":377,"following":0,"created_at":"2022-11-13T14:36:57.075Z","updated_at":"2024-04-15T07:33:23.163Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/openclimatefix","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/openclimatefix/repositories"},"packages":[],"commits":{"id":11615197,"full_name":"openclimatefix/solar-consumer","default_branch":"master","total_commits":413,"total_committers":28,"total_bot_commits":38,"total_bot_committers":1,"mean_commits":14.75,"dds":0.6707021791767555,"past_year_total_commits":304,"past_year_total_committers":21,"past_year_total_bot_commits":14,"past_year_total_bot_committers":1,"past_year_mean_commits":14.476190476190476,"past_year_dds":0.5855263157894737,"last_synced_at":"2026-04-05T09:05:30.582Z","last_synced_commit":"e9b9a0a41235a59125d6930bb0acf93df28fe2c5","created_at":"2026-01-25T00:01:28.080Z","updated_at":"2026-04-05T09:04:16.929Z","committers":[{"name":"Peter Dudfield","email":"peter.dudfield@hotmail.com","login":"peterdudfield","count":136},{"name":"Pavan Kulkarni","email":"pavankulkarni369@gmail.com","login":"PavanRaghavendraKulkarni","count":48},{"name":"allcontributors[bot]","email":"46447321+allcontributors[bot]","login":"allcontributors[bot]","count":38},{"name":"BumpVersion Action","email":"bumpversion@github-actions","login":null,"count":27},{"name":"katyalmohit","email":"128162892+katyalmohit","login":"katyalmohit","count":27},{"name":"Siddharth","email":"siddharth899@gmail.com","login":"siddharth7113","count":26},{"name":"Vishal","email":"vishal.goyal7711@gmail.com","login":"CodeVishal-17","count":13},{"name":"Reem-Albadwy","email":"158544054+Reem-Albadwy","login":"Reem-Albadwy","count":12},{"name":"Rahul Ahuja","email":"rahul.ahuja@live.com","login":"rahul-ahuja","count":11},{"name":"alirashidAR","email":"alirashid.38@yahoo.com","login":"alirashidAR","count":11},{"name":"aca23si","email":"sismail3@sheffield.ac.uk","login":"Shohail-Ismail","count":11},{"name":"ram-from-tvl","email":"ramfromtvl@gmail.com","login":"ram-from-tvl","count":8},{"name":"devsjc","email":"47188100+devsjc","login":"devsjc","count":7},{"name":"anxkhn","email":"anxkhn28@gmail.com","login":"anxkhn","count":6},{"name":"Pavan","email":"pavan@Pavans-MacBook-Pro.local","login":null,"count":5},{"name":"Rahul-JOON","email":"rahuljoon16@gmail.com","login":"Rahul-JOON","count":4},{"name":"Alexandra Udaltsova","email":"43303448+AUdaltsova","login":"AUdaltsova","count":3},{"name":"Peter Ireland","email":"pireland@windesco.com","login":"pjireland","count":3},{"name":"michael-gendy","email":"64384201+michael-gendy","login":"michael-gendy","count":3},{"name":"Satyam Agrawal","email":"lmcsatyam@gmail.com","login":"Seao7","count":3},{"name":"Prafful Vyas","email":"praffulvyas07@gmail.com","login":"Prafful-Vyas","count":2},{"name":"rahul","email":"vashisth.rahul13@gmail.com","login":"vashisthrahul13","count":2},{"name":"James Fulton","email":"41546094+dfulu","login":"dfulu","count":2},{"name":"Conor O'Callaghan","email":"4090256+Conor0Callaghan","login":"Conor0Callaghan","count":1},{"name":"ManzoorAhmedShaikh","email":"manzoorahmedshaikh234@gmail.com","login":"ManzoorAhmedShaikh","count":1},{"name":"Pavan Kulkarni","email":"pavankulkarni@Pavans-MacBook-Pro.local","login":null,"count":1},{"name":"Niaha lalwani","email":"nishalalwani@Niaha-lalwanis-MacBook-Air.local","login":null,"count":1},{"name":"Sagarpillai","email":"Sagarpillai@icloud.com","login":"Sagarpillai","count":1}],"past_year_committers":[{"name":"Peter Dudfield","email":"peter.dudfield@hotmail.com","login":"peterdudfield","count":126},{"name":"Pavan Kulkarni","email":"pavankulkarni369@gmail.com","login":"PavanRaghavendraKulkarni","count":48},{"name":"katyalmohit","email":"128162892+katyalmohit","login":"katyalmohit","count":27},{"name":"allcontributors[bot]","email":"46447321+allcontributors[bot]","login":"allcontributors[bot]","count":14},{"name":"BumpVersion Action","email":"bumpversion@github-actions","login":null,"count":13},{"name":"Vishal","email":"vishal.goyal7711@gmail.com","login":"CodeVishal-17","count":13},{"name":"Reem-Albadwy","email":"158544054+Reem-Albadwy","login":"Reem-Albadwy","count":12},{"name":"aca23si","email":"sismail3@sheffield.ac.uk","login":"Shohail-Ismail","count":11},{"name":"ram-from-tvl","email":"ramfromtvl@gmail.com","login":"ram-from-tvl","count":8},{"name":"devsjc","email":"47188100+devsjc","login":"devsjc","count":7},{"name":"Pavan","email":"pavan@Pavans-MacBook-Pro.local","login":null,"count":5},{"name":"Rahul-JOON","email":"rahuljoon16@gmail.com","login":"Rahul-JOON","count":4},{"name":"Alexandra Udaltsova","email":"43303448+AUdaltsova","login":"AUdaltsova","count":3},{"name":"michael-gendy","email":"64384201+michael-gendy","login":"michael-gendy","count":3},{"name":"Prafful Vyas","email":"praffulvyas07@gmail.com","login":"Prafful-Vyas","count":2},{"name":"Rahul Ahuja","email":"rahul.ahuja@live.com","login":"rahul-ahuja","count":2},{"name":"James Fulton","email":"41546094+dfulu","login":"dfulu","count":2},{"name":"Sagarpillai","email":"Sagarpillai@icloud.com","login":"Sagarpillai","count":1},{"name":"Pavan Kulkarni","email":"pavankulkarni@Pavans-MacBook-Pro.local","login":null,"count":1},{"name":"Niaha lalwani","email":"nishalalwani@Niaha-lalwanis-MacBook-Air.local","login":null,"count":1},{"name":"alirashidAR","email":"alirashid.38@yahoo.com","login":"alirashidAR","count":1}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclimatefix%2Fsolar-consumer/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-07T00:00:11.408Z","repositories_count":6211327,"commits_count":918910950,"contributors_count":35637260,"owners_count":1142579,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"openclimatefix/solar-consumer","html_url":"https://github.com/openclimatefix/solar-consumer","last_synced_at":"2026-04-03T08:00:57.708Z","status":"active","issues_count":22,"pull_requests_count":86,"avg_time_to_close_issue":1478156.1666666667,"avg_time_to_close_pull_request":555428.8088235294,"issues_closed_count":12,"pull_requests_closed_count":68,"pull_request_authors_count":24,"issue_authors_count":5,"avg_comments_per_issue":3.3636363636363638,"avg_comments_per_pull_request":1.4069767441860466,"merged_pull_requests_count":63,"bot_issues_count":0,"bot_pull_requests_count":11,"past_year_issues_count":21,"past_year_pull_requests_count":71,"past_year_avg_time_to_close_issue":1064587.2727272727,"past_year_avg_time_to_close_pull_request":518898.679245283,"past_year_issues_closed_count":11,"past_year_pull_requests_closed_count":53,"past_year_pull_request_authors_count":20,"past_year_issue_authors_count":5,"past_year_avg_comments_per_issue":3.2857142857142856,"past_year_avg_comments_per_pull_request":1.2112676056338028,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":6,"past_year_merged_pull_requests_count":51,"created_at":"2025-08-29T12:44:46.944Z","updated_at":"2026-04-03T08:00:57.708Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclimatefix%2Fsolar-consumer","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclimatefix%2Fsolar-consumer/issues","issue_labels_count":{"contributions-welcome":9,"good first issue":4,"ocf-internal":3,"bug":2,"enhancement":2,"documentation":1,"discussion":1},"pull_request_labels_count":{},"issue_author_associations_count":{"CONTRIBUTOR":21,"MEMBER":1},"pull_request_author_associations_count":{"CONTRIBUTOR":74,"NONE":11,"MEMBER":1},"issue_authors":{"peterdudfield":18,"dfulu":1,"rahul-ahuja":1,"Shohail-Ismail":1,"AUdaltsova":1},"pull_request_authors":{"peterdudfield":29,"allcontributors[bot]":11,"rahul-ahuja":7,"Shohail-Ismail":6,"michael-gendy":4,"katyalmohit":3,"CodeVishal-17":3,"lambaaryan011":2,"Rahul-JOON":2,"PavanRaghavendraKulkarni":2,"alirashidAR":2,"Prafful-Vyas":2,"ADIMANV":2,"Koolvansh07":1,"AdityaShome":1,"ManzoorAhmedShaikh":1,"vashisthrahul13":1,"ram-from-tvl":1,"xingzihai":1,"devsjc":1,"pavankulkarni007":1,"dfulu":1,"pjireland":1,"spyke7":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-03T00:00:08.051Z","repositories_count":14056099,"issues_count":34380513,"pull_requests_count":112367581,"authors_count":11219717,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{"contributions-welcome":8,"good first issue":3,"ocf-internal":3,"bug":2,"enhancement":2,"documentation":1,"discussion":1},"past_year_pull_request_labels_count":{},"past_year_issue_author_associations_count":{"CONTRIBUTOR":20,"MEMBER":1},"past_year_pull_request_author_associations_count":{"CONTRIBUTOR":61,"NONE":9,"MEMBER":1},"past_year_issue_authors":{"peterdudfield":17,"AUdaltsova":1,"dfulu":1,"rahul-ahuja":1,"Shohail-Ismail":1},"past_year_pull_request_authors":{"peterdudfield":27,"allcontributors[bot]":6,"Shohail-Ismail":6,"michael-gendy":4,"rahul-ahuja":4,"CodeVishal-17":3,"katyalmohit":3,"ADIMANV":2,"alirashidAR":2,"Rahul-JOON":2,"PavanRaghavendraKulkarni":2,"Prafful-Vyas":2,"xingzihai":1,"spyke7":1,"ram-from-tvl":1,"pavankulkarni007":1,"Koolvansh07":1,"dfulu":1,"devsjc":1,"AdityaShome":1},"maintainers":[{"login":"dfulu","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/dfulu"}],"active_maintainers":[{"login":"dfulu","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/dfulu"}]},"events":{"total":{"DeleteEvent":25,"PullRequestEvent":56,"ForkEvent":5,"IssuesEvent":35,"WatchEvent":3,"IssueCommentEvent":74,"PushEvent":142,"PullRequestReviewCommentEvent":84,"PullRequestReviewEvent":94,"CreateEvent":47},"last_year":{"DeleteEvent":25,"PullRequestEvent":56,"ForkEvent":5,"IssuesEvent":35,"WatchEvent":3,"IssueCommentEvent":74,"PushEvent":142,"PullRequestReviewCommentEvent":84,"PullRequestReviewEvent":94,"CreateEvent":47}},"keywords":[],"dependencies":[{"ecosystem":"pypi","filepath":"pyproject.toml","sha":null,"kind":"manifest","created_at":"2026-03-03T18:01:00.654Z","updated_at":"2026-03-03T18:01:00.654Z","repository_link":"https://github.com/openclimatefix/solar-consumer/blob/main/pyproject.toml","dependencies":[{"id":25830159521,"package_name":"pandas","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25830159522,"package_name":"sqlalchemy","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25830159525,"package_name":"nowcasting-datamodel","ecosystem":"pypi","requirements":"==1.5.56","direct":true,"kind":"runtime","optional":false},{"id":25830159532,"package_name":"pvsite-datamodel","ecosystem":"pypi","requirements":"==1.2.0","direct":true,"kind":"runtime","optional":false},{"id":25830159537,"package_name":"testcontainers","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25830159549,"package_name":"pyproj","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25830159590,"package_name":"tqdm","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25830159591,"package_name":"loguru","ecosystem":"pypi","requirements":"==0.7.3","direct":true,"kind":"runtime","optional":false},{"id":25830159592,"package_name":"pvlive-api","ecosystem":"pypi","requirements":"\u003e=1.5.1","direct":true,"kind":"runtime","optional":false},{"id":25830159594,"package_name":"dp-sdk","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25830159617,"package_name":"betterproto","ecosystem":"pypi","requirements":"==2.0.0b7","direct":true,"kind":"runtime","optional":false},{"id":25830159620,"package_name":"grpclib","ecosystem":"pypi","requirements":"==0.4.8","direct":true,"kind":"runtime","optional":false},{"id":25830159628,"package_name":"pytest-asyncio","ecosystem":"pypi","requirements":"\u003e=1.2.0","direct":true,"kind":"runtime","optional":false},{"id":25830159640,"package_name":"requests-mock","ecosystem":"pypi","requirements":"\u003e=1.12.1","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/merged-ci.yml","sha":null,"kind":"manifest","created_at":"2026-03-03T18:00:59.584Z","updated_at":"2026-03-03T18:00:59.584Z","repository_link":"https://github.com/openclimatefix/solar-consumer/blob/main/.github/workflows/merged-ci.yml","dependencies":[]},{"ecosystem":"actions","filepath":".github/workflows/tagged_ci.yml","sha":null,"kind":"manifest","created_at":"2026-03-03T18:00:59.625Z","updated_at":"2026-03-03T18:00:59.625Z","repository_link":"https://github.com/openclimatefix/solar-consumer/blob/main/.github/workflows/tagged_ci.yml","dependencies":[]},{"ecosystem":"actions","filepath":".github/workflows/branch-ci.yml","sha":null,"kind":"manifest","created_at":"2026-03-03T18:00:59.539Z","updated_at":"2026-03-03T18:00:59.539Z","repository_link":"https://github.com/openclimatefix/solar-consumer/blob/main/.github/workflows/branch-ci.yml","dependencies":[]},{"ecosystem":"docker","filepath":"Dockerfile","sha":null,"kind":"manifest","created_at":"2026-03-03T18:00:59.666Z","updated_at":"2026-03-03T18:00:59.666Z","repository_link":"https://github.com/openclimatefix/solar-consumer/blob/main/Dockerfile","dependencies":[{"id":25830159472,"package_name":"python","ecosystem":"docker","requirements":"3.12-slim-bookworm","direct":true,"kind":"build","optional":false},{"id":25830159473,"package_name":"build-deps","ecosystem":"docker","requirements":"latest","direct":true,"kind":"build","optional":false}]},{"ecosystem":"docker","filepath":"docker-compose.yml","sha":null,"kind":"manifest","created_at":"2026-03-03T18:01:00.603Z","updated_at":"2026-03-03T18:01:00.603Z","repository_link":"https://github.com/openclimatefix/solar-consumer/blob/main/docker-compose.yml","dependencies":[{"id":25830159519,"package_name":"postgres","ecosystem":"docker","requirements":"15.5","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"uv.lock","sha":null,"kind":"lockfile","created_at":"2026-03-03T18:01:02.440Z","updated_at":"2026-03-03T18:01:02.440Z","repository_link":"https://github.com/openclimatefix/solar-consumer/blob/main/uv.lock","dependencies":[{"id":25830159710,"package_name":"alembic","ecosystem":"pypi","requirements":"1.17.1","direct":false,"kind":"runtime","optional":false},{"id":25830159711,"package_name":"annotated-types","ecosystem":"pypi","requirements":"0.7.0","direct":false,"kind":"runtime","optional":false},{"id":25830159712,"package_name":"beautifulsoup4","ecosystem":"pypi","requirements":"4.14.2","direct":false,"kind":"runtime","optional":false},{"id":25830159713,"package_name":"betterproto","ecosystem":"pypi","requirements":"2.0.0b7","direct":false,"kind":"runtime","optional":false},{"id":25830159714,"package_name":"black","ecosystem":"pypi","requirements":"25.11.0","direct":false,"kind":"runtime","optional":false},{"id":25830159719,"package_name":"bs4","ecosystem":"pypi","requirements":"0.0.2","direct":false,"kind":"runtime","optional":false},{"id":25830159720,"package_name":"certifi","ecosystem":"pypi","requirements":"2025.10.5","direct":false,"kind":"runtime","optional":false},{"id":25830159721,"package_name":"charset-normalizer","ecosystem":"pypi","requirements":"3.4.4","direct":false,"kind":"runtime","optional":false},{"id":25830159722,"package_name":"click","ecosystem":"pypi","requirements":"8.3.0","direct":false,"kind":"runtime","optional":false},{"id":25830159723,"package_name":"colorama","ecosystem":"pypi","requirements":"0.4.6","direct":false,"kind":"runtime","optional":false},{"id":25830159724,"package_name":"docker","ecosystem":"pypi","requirements":"7.1.0","direct":false,"kind":"runtime","optional":false},{"id":25830159725,"package_name":"dp-sdk","ecosystem":"pypi","requirements":"0.16.0","direct":false,"kind":"runtime","optional":false},{"id":25830159726,"package_name":"freezegun","ecosystem":"pypi","requirements":"1.5.5","direct":false,"kind":"runtime","optional":false},{"id":25830159733,"package_name":"greenlet","ecosystem":"pypi","requirements":"3.2.4","direct":false,"kind":"runtime","optional":false},{"id":25830159783,"package_name":"grpcio","ecosystem":"pypi","requirements":"1.76.0","direct":false,"kind":"runtime","optional":false},{"id":25830159802,"package_name":"grpclib","ecosystem":"pypi","requirements":"0.4.8","direct":false,"kind":"runtime","optional":false},{"id":25830159803,"package_name":"h2","ecosystem":"pypi","requirements":"4.3.0","direct":false,"kind":"runtime","optional":false},{"id":25830159809,"package_name":"hpack","ecosystem":"pypi","requirements":"4.1.0","direct":false,"kind":"runtime","optional":false},{"id":25830159826,"package_name":"hyperframe","ecosystem":"pypi","requirements":"6.1.0","direct":false,"kind":"runtime","optional":false},{"id":25830159836,"package_name":"idna","ecosystem":"pypi","requirements":"3.11","direct":false,"kind":"runtime","optional":false},{"id":25830159837,"package_name":"iniconfig","ecosystem":"pypi","requirements":"2.3.0","direct":false,"kind":"runtime","optional":false},{"id":25830159838,"package_name":"loguru","ecosystem":"pypi","requirements":"0.7.3","direct":false,"kind":"runtime","optional":false},{"id":25830159839,"package_name":"mako","ecosystem":"pypi","requirements":"1.3.10","direct":false,"kind":"runtime","optional":false},{"id":25830159842,"package_name":"markupsafe","ecosystem":"pypi","requirements":"3.0.3","direct":false,"kind":"runtime","optional":false},{"id":25830159843,"package_name":"multidict","ecosystem":"pypi","requirements":"6.7.0","direct":false,"kind":"runtime","optional":false},{"id":25830159848,"package_name":"mypy-extensions","ecosystem":"pypi","requirements":"1.1.0","direct":false,"kind":"runtime","optional":false},{"id":25830159855,"package_name":"nowcasting-datamodel","ecosystem":"pypi","requirements":"1.5.56","direct":false,"kind":"runtime","optional":false},{"id":25830159856,"package_name":"numpy","ecosystem":"pypi","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":25830159857,"package_name":"packaging","ecosystem":"pypi","requirements":"25.0","direct":false,"kind":"runtime","optional":false},{"id":25830159858,"package_name":"pandas","ecosystem":"pypi","requirements":"2.3.3","direct":false,"kind":"runtime","optional":false},{"id":25830159859,"package_name":"pathspec","ecosystem":"pypi","requirements":"0.12.1","direct":false,"kind":"runtime","optional":false},{"id":25830159870,"package_name":"platformdirs","ecosystem":"pypi","requirements":"4.5.0","direct":false,"kind":"runtime","optional":false},{"id":25830159871,"package_name":"pluggy","ecosystem":"pypi","requirements":"1.6.0","direct":false,"kind":"runtime","optional":false},{"id":25830159872,"package_name":"psycopg2-binary","ecosystem":"pypi","requirements":"2.9.11","direct":false,"kind":"runtime","optional":false},{"id":25830159875,"package_name":"pvlive-api","ecosystem":"pypi","requirements":"1.5.1","direct":false,"kind":"runtime","optional":false},{"id":25830159876,"package_name":"pvsite-datamodel","ecosystem":"pypi","requirements":"1.2.0","direct":false,"kind":"runtime","optional":false},{"id":25830159877,"package_name":"pydantic","ecosystem":"pypi","requirements":"2.5.3","direct":false,"kind":"runtime","optional":false},{"id":25830159878,"package_name":"pydantic-core","ecosystem":"pypi","requirements":"2.14.6","direct":false,"kind":"runtime","optional":false},{"id":25830159879,"package_name":"pygments","ecosystem":"pypi","requirements":"2.19.2","direct":false,"kind":"runtime","optional":false},{"id":25830159880,"package_name":"pyproj","ecosystem":"pypi","requirements":"3.6.1","direct":false,"kind":"runtime","optional":false},{"id":25830159881,"package_name":"pytest","ecosystem":"pypi","requirements":"9.0.0","direct":false,"kind":"runtime","optional":false},{"id":25830159882,"package_name":"pytest-asyncio","ecosystem":"pypi","requirements":"1.3.0","direct":false,"kind":"runtime","optional":false},{"id":25830159883,"package_name":"python-dateutil","ecosystem":"pypi","requirements":"2.9.0.post0","direct":false,"kind":"runtime","optional":false},{"id":25830159884,"package_name":"python-dotenv","ecosystem":"pypi","requirements":"1.2.1","direct":false,"kind":"runtime","optional":false},{"id":25830159885,"package_name":"pytokens","ecosystem":"pypi","requirements":"0.3.0","direct":false,"kind":"runtime","optional":false},{"id":25830159895,"package_name":"pytz","ecosystem":"pypi","requirements":"2025.2","direct":false,"kind":"runtime","optional":false},{"id":25830159896,"package_name":"pywin32","ecosystem":"pypi","requirements":"311","direct":false,"kind":"runtime","optional":false},{"id":25830159916,"package_name":"requests","ecosystem":"pypi","requirements":"2.32.5","direct":false,"kind":"runtime","optional":false},{"id":25830159917,"package_name":"requests-mock","ecosystem":"pypi","requirements":"1.12.1","direct":false,"kind":"runtime","optional":false},{"id":25830159918,"package_name":"ruff","ecosystem":"pypi","requirements":"0.14.4","direct":false,"kind":"runtime","optional":false},{"id":25830159919,"package_name":"six","ecosystem":"pypi","requirements":"1.17.0","direct":false,"kind":"runtime","optional":false},{"id":25830159920,"package_name":"solar-consumer","ecosystem":"pypi","requirements":"*","direct":false,"kind":"runtime","optional":false},{"id":25830159944,"package_name":"soupsieve","ecosystem":"pypi","requirements":"2.8","direct":false,"kind":"runtime","optional":false},{"id":25830159945,"package_name":"sqlalchemy","ecosystem":"pypi","requirements":"2.0.44","direct":false,"kind":"runtime","optional":false},{"id":25830159946,"package_name":"structlog","ecosystem":"pypi","requirements":"25.5.0","direct":false,"kind":"runtime","optional":false},{"id":25830159947,"package_name":"testcontainers","ecosystem":"pypi","requirements":"4.13.2","direct":false,"kind":"runtime","optional":false},{"id":25830159948,"package_name":"tqdm","ecosystem":"pypi","requirements":"4.67.1","direct":false,"kind":"runtime","optional":false},{"id":25830159949,"package_name":"typing-extensions","ecosystem":"pypi","requirements":"4.15.0","direct":false,"kind":"runtime","optional":false},{"id":25830159950,"package_name":"tzdata","ecosystem":"pypi","requirements":"2025.2","direct":false,"kind":"runtime","optional":false},{"id":25830159951,"package_name":"urllib3","ecosystem":"pypi","requirements":"2.5.0","direct":false,"kind":"runtime","optional":false},{"id":25830159952,"package_name":"win32-setctime","ecosystem":"pypi","requirements":"1.2.0","direct":false,"kind":"runtime","optional":false},{"id":25830159956,"package_name":"wrapt","ecosystem":"pypi","requirements":"2.0.1","direct":false,"kind":"runtime","optional":false}]}],"score":6.76619171466035,"created_at":"2026-01-25T00:01:22.414Z","updated_at":"2026-04-08T10:30:19.008Z","avatar_url":"https://github.com/openclimatefix.png","language":"Python","category":"Renewable Energy","sub_category":"Photovoltaics and Solar Energy","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"# Solar Consumer\n\u003c!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --\u003e\n[![All Contributors](https://img.shields.io/badge/all_contributors-17-orange.svg?style=flat-square)](#contributors-)\n\u003c!-- ALL-CONTRIBUTORS-BADGE:END --\u003e\n\n[![ease of contribution: easy](https://img.shields.io/badge/ease%20of%20contribution:%20easy-32bd50)](https://github.com/openclimatefix#how-easy-is-it-to-get-involved)\n\nThis code can be used to download solar forecasts and save them to a PostgreSQL database. It fetches solar generation estimates for embedded solar farms and processes the data for analysis.\nWe currently collect\n- UK: Forecast can be retreived from NESO. Generation Data can be retrevied from PVLive. \n- NL: Generation values from Ned NL, both national and region. National Forecast values from Ned NL too. \n- DE: Generation values from ENTSOE for several TSOs. \n- BE: Solar PV forecast data (national and regional) from Elia Open Data API.\n- India (Rajasthan): Real-time solar and wind generation data from RUVNL (Rajasthan Urja Vikas Nigam Limited).\n\n### India – RUVNL (Rajasthan)\n\nThe solar consumer supports **RUVNL (Rajasthan, India)** real-time generation data.\n\n- Both **solar and wind** generation are supported\n- Data is fetched via `solar-consumer`\n- Generation data can be saved directly to the **site_database**\n- Separate sites are created for solar and wind generation\n- No separate `ruvnl-consumer` service is required\n\n\n\n\nHere are the different sources of data, and which methods can be used to save the results\n\n| Source | Country | CSV | Data Platform | DB (Legacy) | Site DB (Legacy) |\n| --- | ---  | --- | --- | --- |  ---|\n| PVLive | 🇬🇧 | ✅ | ✅ | | |\n| NESO forecast | 🇬🇧 | ✅ | ✅ | ✅| \n| Ned-nl | 🇳🇱 | ✅ | ✅ | | ✅ |\n| Ned-nl forecast | 🇳🇱 | ✅ ||| ✅ |\n| Germany (ENTSOE) | 🇩🇪 |  ✅ ||| ✅ |\n| Elia Open Data | 🇧🇪 | ✅ | ✅ |  |  |\n| RUVNL (Rajasthan SLDC) | 🇮🇳 | ✅ |  |  | ✅ |\n\n\n## Requirements\n\n- Docker\n- Docker Compose\n\n## Installation \u0026 Running\n\n1. Clone the repository:\n```bash\ngit clone https://github.com/openclimatefix/neso-solar-consumer.git\ncd neso-solar-consumer\n```\n\n2. Copy the example environment file:\n```bash\ncp .example.env .env\n```\n\n3. Start the application:\n```bash\ndocker compose up -d\n```\n\nThe above command will:\n- Start a PostgreSQL database container\n- Build and start the NESO Solar Consumer application\n- Configure all necessary networking between containers\n\nTo stop the application:\n```bash\ndocker compose down\n```\n\nTo view logs:\n```bash\ndocker compose logs -f\n```\n\n\u003e **Note**: The PostgreSQL data is persisted in a Docker volume. To completely reset the database, use:\n\u003e ```bash\n\u003e docker compose down -v\n\u003e ```\n\n## Documentation\n\nThe package provides three main functionalities:\n\n1. **Data Fetching**: Retrieves solar forecast data from the NESO API\n2. **Data Formatting**: Processes the data into standardized forecast objects\n3. **Data Storage**: Saves the formatted forecasts to a PostgreSQL database\n\n### Key Components:\n\n- `fetch_data.py`: Handles API data retrieval\n- `format_forecast.py`: Converts raw data into forecast objects\n- `save_forecast.py`: Manages database operations\n- `app.py`: Orchestrates the entire pipeline\n\n### Environment Variables: (Can be found in the .example.env / .env file)\n\n- `DB_URL=postgresql://postgres:postgres@localhost:5432/neso_solar` : Database Configuration\n- `COUNTRY=\"gb\"` : Country code for fetching data. Currently, other options are [\"be\", \"ind_rajasthan\", \"nl\"] \n- `SAVE_METHOD`: Ways to store the data. Options are [\"db\", \"csv\", \"site-db\"].  \n  `site-db` is supported for NL, DE, and India (RUVNL).\n- `CSV_DIR=None` : Directory to save CSV files if `SAVE_METHOD=\"csv\"`.\n- `UK_PVLIVE_REGIME=in-day`: For UK PVLive, the regime. Can be \"in-day\" or \"day-after\"\n- `UK_PVLIVE_N_GSPS=342`: For UK PVLive, the amount of gsps we pull data for.\n- `UK_PVLIVE_BACKFILL_HOURS=2`: For UK PVLive, the amount of backfill hours we pull, when regime=\"in-day\"\n\n## Adding a New Country\n\nThis guide explains how to add a new country data source to Solar Consumer.\n\n### Overview\n\nAdding a country typically involves:\n- Identifying a reliable data source or API\n- Implementing a country-specific fetch function\n- Adding tests\n- Saving data locally (CSV) and/or to the data platform\n\n---\n\n### Step 1: Find a Data Source / API\n\nIdentify a reliable data source for the country:\n- Prefer official grid operators or government-backed APIs\n- Ensure timestamps, units, and generation values are clearly defined\n\nIf the API requires credentials:\n- Add the variable to `.example.env`\n- Document the required environment variable name\n\n---\n\n### Step 2: Create a Fetch Function\n\nAdd a new country-specific fetch module inside the `solar_consumer` package.\n\nExample naming convention:\n```text\nsolar_consumer/data/fetch_\u003ccountry\u003e.py\n```\n\n\n### Next Steps\nAfter adding the fetch function:\n- Register the country in the main fetch dispatcher\n- Add unit and integration tests under `tests/`\n- Verify the data runs locally and can be saved to CSV\n- If supported, ensure data can be saved to the data platform\n- Open a pull request for review\n\n### Saving Data to the Data Platform\n\nIf the country supports saving data to the data platform:\n\n1. Clone the data platform repository:\n   ```bash\n   git clone https://github.com/openclimatefix/data-platform.git\n   ```\n2. Follow the data-platform README to start it locally (Docker-based setup).\n3. Configure Solar Consumer to point to the local data-platform instance.\n4. Run the consumer and verify data is ingested successfully.\n\n\n## Development\n\n1. Set up the development environment:\n```bash\npip install \".[dev]\"\n```\n\n2. Run tests:\n```bash\npytest\n```\n\n3. Format code:\n```bash\nblack .\n```\n\n4. Run linter:\n```bash\nruff check .\n```\n\n### Running the Test Suite\n\nThe test suite includes unit tests and integration tests:\n\n```bash\n# Run all tests\npytest\n\n# Run specific test file\npytest tests/test_fetch_data.py\n\n# Run with coverage\npytest --cov=neso_solar_consumer\n```\n### Continuous Integration (CI)\n\nThis reposistory has 2 main CI workflows - `branch-ci` and `merged-ci`. \n\n- `branch-ci` is triggered on all pushes to any branch except `main`, and on any pull request that is opened, reopened or updated. It runs the tests suite, lints the project, and builds and pushes a dev image.\n- `merged-ci` is triggered on any pull request merged into `main`. It bumps the git tag, and builds and pushes a container with that tag.\n\n## FAQ\n\n**Q: What format is the data stored in?**\nA: The data is stored in PostgreSQL using SQLAlchemy models, with timestamps in UTC and power values in megawatts.\n\n**Q: How often should I run the consumer?**\nA: This depends on your use case and the NESO API update frequency. The consumer can be scheduled using cron jobs or other scheduling tools.\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## Contributing and community\n\n[![issues badge](https://img.shields.io/github/issues/openclimatefix/neso-solar-consumer?color=FFAC5F)](https://github.com/openclimatefix/neso-solar-consumer/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc)\n\n- PR's are welcome! See the [Organisation Profile](https://github.com/openclimatefix) for details on contributing\n- Find out about our other projects in the [OCF Meta Repo](https://github.com/openclimatefix/ocf-meta-repo)\n- Check out the [OCF blog](https://openclimatefix.org/blog) for updates\n- Follow OCF on [LinkedIn](https://uk.linkedin.com/company/open-climate-fix)\n\n\n## Contributors\n\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/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=\"#ideas-peterdudfield\" 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/Seao7\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/100257888?v=4?s=100\" width=\"100px;\" alt=\"Seao7\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSeao7\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/solar-consumer/commits?author=Seao7\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"http://siddharth7113.github.io\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/114160268?v=4?s=100\" width=\"100px;\" alt=\"Siddharth\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSiddharth\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/solar-consumer/pulls?q=is%3Apr+reviewed-by%3Asiddharth7113\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e \u003ca href=\"#infra-siddharth7113\" title=\"Infrastructure (Hosting, Build-Tools, etc)\"\u003e🚇\u003c/a\u003e \u003ca href=\"https://github.com/openclimatefix/solar-consumer/commits?author=siddharth7113\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/Conor0Callaghan\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/4090256?v=4?s=100\" width=\"100px;\" alt=\"Conor O Callaghan\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eConor O Callaghan\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/solar-consumer/commits?author=Conor0Callaghan\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/alirashidAR\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/110668489?v=4?s=100\" width=\"100px;\" alt=\"Ali Rashid\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAli Rashid\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/solar-consumer/commits?author=alirashidAR\" title=\"Tests\"\u003e⚠️\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/ManzoorAhmedShaikh\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/110716002?v=4?s=100\" width=\"100px;\" alt=\"Manzoor Ahmed Shaikh\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eManzoor Ahmed Shaikh\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/solar-consumer/commits?author=ManzoorAhmedShaikh\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"http://anaskhan.me\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/83116240?v=4?s=100\" width=\"100px;\" alt=\"Anas Khan\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAnas Khan\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/solar-consumer/commits?author=anxkhn\" title=\"Documentation\"\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/pjireland\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/16693035?v=4?s=100\" width=\"100px;\" alt=\"Peter Ireland\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ePeter Ireland\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/solar-consumer/commits?author=pjireland\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/vashisthrahul13\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/182660137?v=4?s=100\" width=\"100px;\" alt=\"vashisthrahul13\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003evashisthrahul13\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/solar-consumer/commits?author=vashisthrahul13\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/rahul-ahuja\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/21355015?v=4?s=100\" width=\"100px;\" alt=\"rahul-ahuja\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003erahul-ahuja\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/solar-consumer/commits?author=rahul-ahuja\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://rahul-joon.github.io/My-Website/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/61495262?v=4?s=100\" width=\"100px;\" alt=\"Rahul Joon\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eRahul Joon\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/solar-consumer/commits?author=Rahul-JOON\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/michael-gendy\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/64384201?v=4?s=100\" width=\"100px;\" alt=\"michael-gendy\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003emichael-gendy\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#infra-michael-gendy\" title=\"Infrastructure (Hosting, Build-Tools, etc)\"\u003e🚇\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/Shohail-Ismail\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/149825575?v=4?s=100\" width=\"100px;\" alt=\"Shohail Ismail\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eShohail Ismail\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/solar-consumer/commits?author=Shohail-Ismail\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/Prafful-Vyas\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/118352579?v=4?s=100\" width=\"100px;\" alt=\"Prafful Vyas\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ePrafful Vyas\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/solar-consumer/commits?author=Prafful-Vyas\" 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=\"http://www.linkedin.com/in/ram-from-tvl\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/114728749?v=4?s=100\" width=\"100px;\" alt=\"Ramkumar R\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eRamkumar R\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/solar-consumer/commits?author=ram-from-tvl\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/katyalmohit\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/128162892?v=4?s=100\" width=\"100px;\" alt=\"Mohit\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMohit\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/solar-consumer/commits?author=katyalmohit\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/CodeVishal-17\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/227045715?v=4?s=100\" width=\"100px;\" alt=\"Vishal Goyal\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eVishal Goyal\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/solar-consumer/commits?author=CodeVishal-17\" 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*Part of the [Open Climate Fix](https://github.com/orgs/openclimatefix/people) community.*\n\n[![OCF Logo](https://cdn.prod.website-files.com/62d92550f6774db58d441cca/6324a2038936ecda71599a8b_OCF_Logo_black_trans.png)](https://openclimatefix.org)\n","funding_links":["https://github.com/sponsors/openclimatefix","https://opencollective.com/openclimatefix"],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":["nowcasting","eumetsat","dbml","pvsite","pvoutput","solar","forecasting-models","graph-neural-networks","weather"],"project_url":"https://ost.ecosyste.ms/api/v1/projects/342611","html_url":"https://ost.ecosyste.ms/projects/342611"}