{"id":191728,"name":"optihood","description":"A Python-based framework to optimize the investment in alternative energy technologies as well as the operation of available energy resources for decentralized energy networks on a neighbourhood-scale.","url":"https://github.com/spf-ost/optihood","last_synced_at":"2026-04-07T23:30:26.330Z","repository":{"id":49878469,"uuid":"370617226","full_name":"SPF-OST/optihood","owner":"SPF-OST","description":"The package provides a complete python-based framework to OPTImize the investment in alternative energy technologies (heat pump, solar thermal, PV, etc.) as well as the operation of available energy resources (natural gas, sun, grid electricity, etc.) at a neighbourHOOD-scale","archived":false,"fork":false,"pushed_at":"2026-03-26T18:57:05.000Z","size":154466,"stargazers_count":9,"open_issues_count":51,"forks_count":10,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-27T07:53:54.759Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://optihood.readthedocs.io/","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SPF-OST.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}},"created_at":"2021-05-25T08:18:43.000Z","updated_at":"2026-03-04T13:37:06.000Z","dependencies_parsed_at":"2024-02-12T09:04:49.607Z","dependency_job_id":"71eaa6a5-6e24-495d-a993-911d3097e18e","html_url":"https://github.com/SPF-OST/optihood","commit_stats":{"total_commits":802,"total_committers":23,"mean_commits":"34.869565217391305","dds":0.7618453865336658,"last_synced_commit":"faa6bc668879996a24c09ebbf913374c8493840f"},"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/SPF-OST/optihood","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SPF-OST%2Foptihood","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SPF-OST%2Foptihood/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SPF-OST%2Foptihood/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SPF-OST%2Foptihood/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SPF-OST","download_url":"https://codeload.github.com/SPF-OST/optihood/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SPF-OST%2Foptihood/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31160155,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-29T18:55:37.765Z","status":"ssl_error","status_checked_at":"2026-03-29T18:55:04.089Z","response_time":89,"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":"SPF-OST","name":"SPF Institute for Solar Technology","uuid":"50168589","kind":"organization","description":null,"email":null,"website":"www.spf.ch","location":"Rapperswil, Switzerland","twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/50168589?v=4","repositories_count":8,"last_synced_at":"2024-04-16T02:59:50.703Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/SPF-OST","funding_links":[],"total_stars":16,"followers":10,"following":0,"created_at":"2022-11-15T05:03:59.637Z","updated_at":"2024-04-16T02:59:55.137Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SPF-OST","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SPF-OST/repositories"},"packages":[],"commits":{"id":1548337,"full_name":"spf-ost/optihood","default_branch":"main","total_commits":1044,"total_committers":17,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":61.411764705882355,"dds":0.7116858237547893,"past_year_total_commits":208,"past_year_total_committers":3,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":69.33333333333333,"past_year_dds":0.46153846153846156,"last_synced_at":"2026-03-31T20:03:20.053Z","last_synced_commit":"6f6ed52cdc213dbfef75b25fc8aa0df54e06257f","created_at":"2024-04-26T00:08:45.359Z","updated_at":"2026-03-31T20:01:46.301Z","committers":[{"name":"ahobeost","email":"ahobeost@github.com","login":null,"count":301},{"name":"Neha Dimri","email":"83694401+nehadimri1991","login":"nehadimri1991","count":300},{"name":"nigglo","email":"95635158+nigglo","login":"nigglo","count":208},{"name":"Agnès François","email":"84960119+agnesfrancois","login":"agnesfrancois","count":121},{"name":"jeremy.remus","email":"jeremy.remus@ost.ch","login":"jremus94","count":51},{"name":"Fabian Paulsson","email":"fabian.paulsson@ost.ch","login":"FabianJoelPaulsson","count":14},{"name":"ahobeost","email":"122869062+ahobeost","login":"ahobeost","count":12},{"name":"betaxell","email":"54779498+betaxell","login":"betaxell","count":7},{"name":"vjacquot","email":"vincent.jacquot@mines-albi.fr","login":"vjacquot","count":7},{"name":"MartFese","email":"marten.fesefeldt@heig-vd.ch","login":"martenfese","count":7},{"name":"xavijoba","email":"xavier.jobard@heig-vd.ch","login":"xavijoba","count":5},{"name":"nehadimri1991","email":"googleC2091","login":null,"count":4},{"name":"spfRechenknecht","email":"mjn.ost@gmail.com","login":null,"count":2},{"name":"mikelarelarra","email":"mikelarelarra@github.com","login":null,"count":2},{"name":"ELZOost","email":"elias.zoller@ost.ch","login":"ELZOost","count":1},{"name":"dzenhaeusern","email":"daniel.zenhaeusern@gmail.com","login":"dzenhaeusern","count":1},{"name":"pmurios-github","email":"60061119+pmurios-github","login":"pmurios-github","count":1}],"past_year_committers":[{"name":"ahobeost","email":"ahobeost@github.com","login":null,"count":112},{"name":"Neha Dimri","email":"83694401+nehadimri1991","login":"nehadimri1991","count":89},{"name":"ahobeost","email":"122869062+ahobeost","login":"ahobeost","count":7}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/spf-ost%2Foptihood/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-02T00:00:08.713Z","repositories_count":6210001,"commits_count":927159417,"contributors_count":35795832,"owners_count":1144775,"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":"spf-ost/optihood","html_url":"https://github.com/spf-ost/optihood","last_synced_at":"2026-03-27T18:01:42.312Z","status":"active","issues_count":84,"pull_requests_count":126,"avg_time_to_close_issue":29264328.083333332,"avg_time_to_close_pull_request":569068.0789473684,"issues_closed_count":36,"pull_requests_closed_count":114,"pull_request_authors_count":9,"issue_authors_count":7,"avg_comments_per_issue":0.40476190476190477,"avg_comments_per_pull_request":0.1984126984126984,"merged_pull_requests_count":102,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":50,"past_year_pull_requests_count":24,"past_year_avg_time_to_close_issue":1693495.7777777778,"past_year_avg_time_to_close_pull_request":777039.2105263158,"past_year_issues_closed_count":9,"past_year_pull_requests_closed_count":19,"past_year_pull_request_authors_count":2,"past_year_issue_authors_count":2,"past_year_avg_comments_per_issue":0.24,"past_year_avg_comments_per_pull_request":0.7083333333333334,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":18,"created_at":"2024-04-26T00:09:18.062Z","updated_at":"2026-03-27T18:01:42.312Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/spf-ost%2Foptihood","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/spf-ost%2Foptihood/issues","issue_labels_count":{},"pull_request_labels_count":{},"issue_author_associations_count":{"CONTRIBUTOR":54,"COLLABORATOR":23,"NONE":7},"pull_request_author_associations_count":{"COLLABORATOR":73,"CONTRIBUTOR":50,"NONE":3},"issue_authors":{"ahobeost":57,"nehadimri1991":16,"vjacquot":5,"xavijoba":2,"agnesfrancois":2,"spfRechenknecht":1,"ArthurduVignau":1},"pull_request_authors":{"nigglo":34,"nehadimri1991":34,"ahobeost":26,"jremus94":25,"xavijoba":2,"vjacquot":2,"mikelarelarra":1,"SPA75":1,"martenfese":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-03-27T00:00:09.101Z","repositories_count":13948341,"issues_count":34652191,"pull_requests_count":113334313,"authors_count":11210883,"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":{},"past_year_pull_request_labels_count":{},"past_year_issue_author_associations_count":{"CONTRIBUTOR":41,"COLLABORATOR":9},"past_year_pull_request_author_associations_count":{"COLLABORATOR":14,"CONTRIBUTOR":10},"past_year_issue_authors":{"ahobeost":41,"nehadimri1991":9},"past_year_pull_request_authors":{"nehadimri1991":14,"ahobeost":10},"maintainers":[{"login":"nehadimri1991","count":50,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/nehadimri1991"},{"login":"nigglo","count":33,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/nigglo"},{"login":"vjacquot","count":7,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/vjacquot"},{"login":"xavijoba","count":4,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/xavijoba"},{"login":"mikelarelarra","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/mikelarelarra"},{"login":"martenfese","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/martenfese"}],"active_maintainers":[{"login":"nehadimri1991","count":23,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/nehadimri1991"}]},"events":{"total":{"ReleaseEvent":2,"DeleteEvent":25,"MemberEvent":1,"PullRequestEvent":28,"ForkEvent":2,"IssuesEvent":40,"WatchEvent":1,"IssueCommentEvent":23,"PushEvent":125,"PullRequestReviewCommentEvent":57,"PullRequestReviewEvent":45,"CreateEvent":23},"last_year":{"ReleaseEvent":2,"DeleteEvent":21,"PullRequestEvent":15,"ForkEvent":2,"IssuesEvent":37,"WatchEvent":1,"IssueCommentEvent":18,"PushEvent":82,"PullRequestReviewCommentEvent":57,"PullRequestReviewEvent":44,"CreateEvent":16}},"keywords":[],"dependencies":[{"ecosystem":"pypi","filepath":"docs/requirements.txt","sha":null,"kind":"manifest","created_at":"2024-02-12T09:04:45.291Z","updated_at":"2024-02-12T09:04:45.291Z","repository_link":"https://github.com/SPF-OST/optihood/blob/main/docs/requirements.txt","dependencies":[{"id":16179444866,"package_name":"recommonmark","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":16179444867,"package_name":"sphinx-rtd-theme","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"requirements.txt","sha":null,"kind":"manifest","created_at":"2024-02-12T09:04:45.322Z","updated_at":"2024-02-12T09:04:45.322Z","repository_link":"https://github.com/SPF-OST/optihood/blob/main/requirements.txt","dependencies":[{"id":16179444868,"package_name":"alabaster","ecosystem":"pypi","requirements":"==0.7.12","direct":true,"kind":"runtime","optional":false},{"id":16179444869,"package_name":"arch","ecosystem":"pypi","requirements":"==5.0.1","direct":true,"kind":"runtime","optional":false},{"id":16179444871,"package_name":"asttokens","ecosystem":"pypi","requirements":"==2.0.5","direct":true,"kind":"runtime","optional":false},{"id":16179444872,"package_name":"attrs","ecosystem":"pypi","requirements":"==22.1.0","direct":true,"kind":"runtime","optional":false},{"id":16179444873,"package_name":"Babel","ecosystem":"pypi","requirements":"==2.9.1","direct":true,"kind":"runtime","optional":false},{"id":16179444874,"package_name":"backcall","ecosystem":"pypi","requirements":"==0.2.0","direct":true,"kind":"runtime","optional":false},{"id":16179444875,"package_name":"black","ecosystem":"pypi","requirements":"==21.12b0","direct":true,"kind":"runtime","optional":false},{"id":16179444876,"package_name":"blinker","ecosystem":"pypi","requirements":"==1.4","direct":true,"kind":"runtime","optional":false},{"id":16179444877,"package_name":"bokeh","ecosystem":"pypi","requirements":"==2.3.3","direct":true,"kind":"runtime","optional":false},{"id":16179444878,"package_name":"build","ecosystem":"pypi","requirements":"==1.0.3","direct":true,"kind":"runtime","optional":false},{"id":16179444879,"package_name":"certifi","ecosystem":"pypi","requirements":"==2021.5.30","direct":true,"kind":"runtime","optional":false},{"id":16179444880,"package_name":"charset-normalizer","ecosystem":"pypi","requirements":"==2.0.4","direct":true,"kind":"runtime","optional":false},{"id":16179444881,"package_name":"click","ecosystem":"pypi","requirements":"==8.0.3","direct":true,"kind":"runtime","optional":false},{"id":16179444882,"package_name":"colorama","ecosystem":"pypi","requirements":"==0.4.4","direct":true,"kind":"runtime","optional":false},{"id":16179444883,"package_name":"commonmark","ecosystem":"pypi","requirements":"==0.9.1","direct":true,"kind":"runtime","optional":false},{"id":16179444884,"package_name":"convertdate","ecosystem":"pypi","requirements":"==2.4.0","direct":true,"kind":"runtime","optional":false},{"id":16179444901,"package_name":"cycler","ecosystem":"pypi","requirements":"==0.10.0","direct":true,"kind":"runtime","optional":false},{"id":16179444902,"package_name":"decorator","ecosystem":"pypi","requirements":"==5.1.1","direct":true,"kind":"runtime","optional":false},{"id":16179444903,"package_name":"dill","ecosystem":"pypi","requirements":"==0.3.4","direct":true,"kind":"runtime","optional":false},{"id":16179444904,"package_name":"docutils","ecosystem":"pypi","requirements":"==0.17.1","direct":true,"kind":"runtime","optional":false},{"id":16179444905,"package_name":"et-xmlfile","ecosystem":"pypi","requirements":"==1.1.0","direct":true,"kind":"runtime","optional":false},{"id":16179444906,"package_name":"executing","ecosystem":"pypi","requirements":"==0.8.2","direct":true,"kind":"runtime","optional":false},{"id":16179444907,"package_name":"fastjsonschema","ecosystem":"pypi","requirements":"==2.16.2","direct":true,"kind":"runtime","optional":false},{"id":16179444908,"package_name":"h5py","ecosystem":"pypi","requirements":"==3.4.0","direct":true,"kind":"runtime","optional":false},{"id":16179444909,"package_name":"idna","ecosystem":"pypi","requirements":"==3.2","direct":true,"kind":"runtime","optional":false},{"id":16179444910,"package_name":"imagesize","ecosystem":"pypi","requirements":"==1.3.0","direct":true,"kind":"runtime","optional":false},{"id":16179444911,"package_name":"importlib-metadata","ecosystem":"pypi","requirements":"==4.11.3","direct":true,"kind":"runtime","optional":false},{"id":16179444912,"package_name":"ipython","ecosystem":"pypi","requirements":"==8.0.0","direct":true,"kind":"runtime","optional":false},{"id":16179444913,"package_name":"jedi","ecosystem":"pypi","requirements":"==0.18.1","direct":true,"kind":"runtime","optional":false},{"id":16179444914,"package_name":"Jinja2","ecosystem":"pypi","requirements":"==3.0.1","direct":true,"kind":"runtime","optional":false},{"id":16179444915,"package_name":"joblib","ecosystem":"pypi","requirements":"==1.1.0","direct":true,"kind":"runtime","optional":false},{"id":16179444916,"package_name":"jsonschema","ecosystem":"pypi","requirements":"==4.16.0","direct":true,"kind":"runtime","optional":false},{"id":16179444917,"package_name":"jupyter-core","ecosystem":"pypi","requirements":"==4.11.1","direct":true,"kind":"runtime","optional":false},{"id":16179444918,"package_name":"kaleido","ecosystem":"pypi","requirements":"==0.2.1","direct":true,"kind":"runtime","optional":false},{"id":16179444919,"package_name":"kiwisolver","ecosystem":"pypi","requirements":"==1.3.2","direct":true,"kind":"runtime","optional":false},{"id":16179444920,"package_name":"lunardate","ecosystem":"pypi","requirements":"==0.2.0","direct":true,"kind":"runtime","optional":false},{"id":16179444939,"package_name":"MarkupSafe","ecosystem":"pypi","requirements":"==2.0.1","direct":true,"kind":"runtime","optional":false},{"id":16179444941,"package_name":"matplotlib","ecosystem":"pypi","requirements":"==3.4.3","direct":true,"kind":"runtime","optional":false},{"id":16179444942,"package_name":"matplotlib-inline","ecosystem":"pypi","requirements":"==0.1.3","direct":true,"kind":"runtime","optional":false},{"id":16179444943,"package_name":"mc-simulation","ecosystem":"pypi","requirements":"==0.0.5","direct":true,"kind":"runtime","optional":false},{"id":16179445077,"package_name":"mypy-extensions","ecosystem":"pypi","requirements":"==0.4.3","direct":true,"kind":"runtime","optional":false},{"id":16179445078,"package_name":"nbformat","ecosystem":"pypi","requirements":"==5.6.0","direct":true,"kind":"runtime","optional":false},{"id":16179445079,"package_name":"networkx","ecosystem":"pypi","requirements":"==2.6.2","direct":true,"kind":"runtime","optional":false},{"id":16179445080,"package_name":"nose","ecosystem":"pypi","requirements":"==1.3.7","direct":true,"kind":"runtime","optional":false},{"id":16179445081,"package_name":"numpy","ecosystem":"pypi","requirements":"==1.21.2","direct":true,"kind":"runtime","optional":false},{"id":16179445082,"package_name":"oemof.network","ecosystem":"pypi","requirements":"==0.4.0rc0","direct":true,"kind":"runtime","optional":false},{"id":16179445115,"package_name":"oemof.solph","ecosystem":"pypi","requirements":"==0.4.4","direct":true,"kind":"runtime","optional":false},{"id":16179445116,"package_name":"oemof.tools","ecosystem":"pypi","requirements":"==0.4.1","direct":true,"kind":"runtime","optional":false},{"id":16179445117,"package_name":"openpyxl","ecosystem":"pypi","requirements":"==3.0.7","direct":true,"kind":"runtime","optional":false},{"id":16179445118,"package_name":"packaging","ecosystem":"pypi","requirements":"==21.0","direct":true,"kind":"runtime","optional":false},{"id":16179445119,"package_name":"pandas","ecosystem":"pypi","requirements":"==1.1.0","direct":true,"kind":"runtime","optional":false},{"id":16179445120,"package_name":"parso","ecosystem":"pypi","requirements":"==0.8.3","direct":true,"kind":"runtime","optional":false},{"id":16179445121,"package_name":"pathspec","ecosystem":"pypi","requirements":"==0.9.0","direct":true,"kind":"runtime","optional":false},{"id":16179445122,"package_name":"patsy","ecosystem":"pypi","requirements":"==0.5.2","direct":true,"kind":"runtime","optional":false},{"id":16179445123,"package_name":"pickleshare","ecosystem":"pypi","requirements":"==0.7.5","direct":true,"kind":"runtime","optional":false},{"id":16179445124,"package_name":"Pillow","ecosystem":"pypi","requirements":"==8.3.2","direct":true,"kind":"runtime","optional":false},{"id":16179445125,"package_name":"pip-tools","ecosystem":"pypi","requirements":"==7.3.0","direct":true,"kind":"runtime","optional":false},{"id":16179445126,"package_name":"platformdirs","ecosystem":"pypi","requirements":"==2.4.1","direct":true,"kind":"runtime","optional":false},{"id":16179445127,"package_name":"plotly","ecosystem":"pypi","requirements":"==5.3.1","direct":true,"kind":"runtime","optional":false},{"id":16179445128,"package_name":"ply","ecosystem":"pypi","requirements":"==3.11","direct":true,"kind":"runtime","optional":false},{"id":16179445129,"package_name":"prompt-toolkit","ecosystem":"pypi","requirements":"==3.0.24","direct":true,"kind":"runtime","optional":false},{"id":16179445130,"package_name":"property-cached","ecosystem":"pypi","requirements":"==1.6.4","direct":true,"kind":"runtime","optional":false},{"id":16179445131,"package_name":"pure-eval","ecosystem":"pypi","requirements":"==0.2.1","direct":true,"kind":"runtime","optional":false},{"id":16179445132,"package_name":"pvlib","ecosystem":"pypi","requirements":"==0.9.0","direct":true,"kind":"runtime","optional":false},{"id":16179445272,"package_name":"pycosat","ecosystem":"pypi","requirements":"==0.6.3","direct":true,"kind":"runtime","optional":false},{"id":16179445273,"package_name":"Pygments","ecosystem":"pypi","requirements":"==2.11.2","direct":true,"kind":"runtime","optional":false},{"id":16179445274,"package_name":"pyluach","ecosystem":"pypi","requirements":"==2.0.2","direct":true,"kind":"runtime","optional":false},{"id":16179445275,"package_name":"PyMeeus","ecosystem":"pypi","requirements":"==0.5.11","direct":true,"kind":"runtime","optional":false},{"id":16179445276,"package_name":"Pyomo","ecosystem":"pypi","requirements":"==5.7.2","direct":true,"kind":"runtime","optional":false},{"id":16179445277,"package_name":"pyparsing","ecosystem":"pypi","requirements":"==2.4.7","direct":true,"kind":"runtime","optional":false},{"id":16179445278,"package_name":"pyproject_hooks","ecosystem":"pypi","requirements":"==1.0.0","direct":true,"kind":"runtime","optional":false},{"id":16179445279,"package_name":"PyQt5","ecosystem":"pypi","requirements":"==5.15.6","direct":true,"kind":"runtime","optional":false},{"id":16179445280,"package_name":"PyQt5-Qt5","ecosystem":"pypi","requirements":"==5.15.2","direct":true,"kind":"runtime","optional":false},{"id":16179445281,"package_name":"PyQt5-sip","ecosystem":"pypi","requirements":"==12.9.0","direct":true,"kind":"runtime","optional":false},{"id":16179445282,"package_name":"pyrsistent","ecosystem":"pypi","requirements":"==0.18.1","direct":true,"kind":"runtime","optional":false},{"id":16179445283,"package_name":"python-dateutil","ecosystem":"pypi","requirements":"==2.8.2","direct":true,"kind":"runtime","optional":false},{"id":16179445284,"package_name":"pytz","ecosystem":"pypi","requirements":"==2021.1","direct":true,"kind":"runtime","optional":false},{"id":16179445285,"package_name":"PyUtilib","ecosystem":"pypi","requirements":"==6.0.0","direct":true,"kind":"runtime","optional":false},{"id":16179445286,"package_name":"pywin32","ecosystem":"pypi","requirements":"==304","direct":true,"kind":"runtime","optional":false},{"id":16179445287,"package_name":"PyYAML","ecosystem":"pypi","requirements":"==5.4.1","direct":true,"kind":"runtime","optional":false},{"id":16179445288,"package_name":"recommonmark","ecosystem":"pypi","requirements":"==0.7.1","direct":true,"kind":"runtime","optional":false},{"id":16179445289,"package_name":"reportlab","ecosystem":"pypi","requirements":"==3.6.5","direct":true,"kind":"runtime","optional":false},{"id":16179445290,"package_name":"requests","ecosystem":"pypi","requirements":"==2.26.0","direct":true,"kind":"runtime","optional":false},{"id":16179445291,"package_name":"scikit-learn","ecosystem":"pypi","requirements":"==1.0.2","direct":true,"kind":"runtime","optional":false},{"id":16179445292,"package_name":"scipy","ecosystem":"pypi","requirements":"==1.7.1","direct":true,"kind":"runtime","optional":false},{"id":16179445293,"package_name":"six","ecosystem":"pypi","requirements":"==1.16.0","direct":true,"kind":"runtime","optional":false},{"id":16179445294,"package_name":"sklearn","ecosystem":"pypi","requirements":"==0.0","direct":true,"kind":"runtime","optional":false},{"id":16179445295,"package_name":"snowballstemmer","ecosystem":"pypi","requirements":"==2.2.0","direct":true,"kind":"runtime","optional":false},{"id":16179445296,"package_name":"Sphinx","ecosystem":"pypi","requirements":"==4.5.0","direct":true,"kind":"runtime","optional":false},{"id":16179445297,"package_name":"sphinx-rtd-theme","ecosystem":"pypi","requirements":"==1.0.0","direct":true,"kind":"runtime","optional":false},{"id":16179445298,"package_name":"sphinxcontrib-applehelp","ecosystem":"pypi","requirements":"==1.0.2","direct":true,"kind":"runtime","optional":false},{"id":16179445299,"package_name":"sphinxcontrib-devhelp","ecosystem":"pypi","requirements":"==1.0.2","direct":true,"kind":"runtime","optional":false},{"id":16179445300,"package_name":"sphinxcontrib-htmlhelp","ecosystem":"pypi","requirements":"==2.0.0","direct":true,"kind":"runtime","optional":false},{"id":16179445301,"package_name":"sphinxcontrib-jsmath","ecosystem":"pypi","requirements":"==1.0.1","direct":true,"kind":"runtime","optional":false},{"id":16179445302,"package_name":"sphinxcontrib-qthelp","ecosystem":"pypi","requirements":"==1.0.3","direct":true,"kind":"runtime","optional":false},{"id":16179445303,"package_name":"sphinxcontrib-serializinghtml","ecosystem":"pypi","requirements":"==1.1.5","direct":true,"kind":"runtime","optional":false},{"id":16179445304,"package_name":"stack-data","ecosystem":"pypi","requirements":"==0.1.4","direct":true,"kind":"runtime","optional":false},{"id":16179445305,"package_name":"statsmodels","ecosystem":"pypi","requirements":"==0.12.2","direct":true,"kind":"runtime","optional":false},{"id":16179445306,"package_name":"tabulate","ecosystem":"pypi","requirements":"==0.8.9","direct":true,"kind":"runtime","optional":false},{"id":16179445307,"package_name":"tenacity","ecosystem":"pypi","requirements":"==8.0.1","direct":true,"kind":"runtime","optional":false},{"id":16179445308,"package_name":"threadpoolctl","ecosystem":"pypi","requirements":"==3.0.0","direct":true,"kind":"runtime","optional":false},{"id":16179445309,"package_name":"tomli","ecosystem":"pypi","requirements":"==1.2.3","direct":true,"kind":"runtime","optional":false},{"id":16179445310,"package_name":"tornado","ecosystem":"pypi","requirements":"==6.1","direct":true,"kind":"runtime","optional":false},{"id":16179445311,"package_name":"traitlets","ecosystem":"pypi","requirements":"==5.1.1","direct":true,"kind":"runtime","optional":false},{"id":16179445312,"package_name":"ttictoc","ecosystem":"pypi","requirements":"==0.5.6","direct":true,"kind":"runtime","optional":false},{"id":16179445313,"package_name":"typing-extensions","ecosystem":"pypi","requirements":"==3.10.0.2","direct":true,"kind":"runtime","optional":false},{"id":16179445314,"package_name":"tzdata","ecosystem":"pypi","requirements":"==2022.6","direct":true,"kind":"runtime","optional":false},{"id":16179445315,"package_name":"urllib3","ecosystem":"pypi","requirements":"==1.26.6","direct":true,"kind":"runtime","optional":false},{"id":16179445316,"package_name":"wcwidth","ecosystem":"pypi","requirements":"==0.2.5","direct":true,"kind":"runtime","optional":false},{"id":16179445317,"package_name":"workalendar","ecosystem":"pypi","requirements":"==16.4.0","direct":true,"kind":"runtime","optional":false},{"id":16179445318,"package_name":"xlrd","ecosystem":"pypi","requirements":"==2.0.1","direct":true,"kind":"runtime","optional":false},{"id":16179445319,"package_name":"xlwt","ecosystem":"pypi","requirements":"==1.3.0","direct":true,"kind":"runtime","optional":false},{"id":16179445320,"package_name":"zipp","ecosystem":"pypi","requirements":"==3.8.0","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"setup.py","sha":null,"kind":"manifest","created_at":"2024-02-12T09:04:49.553Z","updated_at":"2024-02-12T09:04:49.553Z","repository_link":"https://github.com/SPF-OST/optihood/blob/main/setup.py","dependencies":[]}],"score":6.927557906278317,"created_at":"2024-04-26T00:02:45.058Z","updated_at":"2026-04-07T23:30:26.334Z","avatar_url":"https://github.com/SPF-OST.png","language":"HTML","category":"Energy Systems","sub_category":"Renewable Energy Integration","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"# optihood: energy modelling and optimization framework\n\noptihood provides a complete python-based framework to **OPTI**mize the investment in alternative energy\ntechnologies (heat pump, solar thermal, PV, etc.) as well as the operation of available energy resources (natural gas,\nsun, grid electricity, etc.) for decentralized energy networks on a neighbour**HOOD**-scale. It is designed to facilitate \nthe researchers and energy planners in optimizing an energy neighbourhood in terms of cost and/or environmental criteria. \nIt enables the users to perform both single-objective and multi-objective optimization and analysis. The energy model and \nit's associated parameters can be defined easily using an excel file. Additionally, a variety of plotting methods are \ndefined for easy and fast result visualization.\n\n## Documentation\nThe documentation can be found on https://optihood.readthedocs.io/.\n\n## Prerequisites\nIn order to use optihood, the following prerequisites are needed on your machine:\n\n- [Python \u003e=3.9](https://www.python.org/downloads/) is installed. Python 3.12 is recommended.\n- Git is installed\n- An active [Github](https://github.com/) account to clone the repo.\n- A solver is installed. [Gurobi solver](https://www.gurobi.com/resource/parallelism-linear-mixed-integer-programming/)\nis recommended, although other solvers like CBC, GLPK, Cplex could also be used.\n\n## Installation\n\nAs of now, optihood is available as an open source code and needs to be installed from source. Please follow the\ninstructions mentioned below to complete the installation. The commands given below are suited for the Windows platform\nand should be run from within the optihood directory in a Command Prompt. For other platforms, similar alternative\ncommands could be used.\n\n1. Clone the optihood repo to a folder called 'optihood' on your local machine:\n    ```commandline\n    git clone https://github.com/SPF-OST/OptiHood.git\n    ```\n2. All the next commands should be run from within the optihood folder. Create a virtual environment and activate it:\n    ```commandline\n    py -3.12 -m venv venv\n    venv\\Scripts\\activate\n    ```    \n   If using python version other than 3.12, replace -3.12 with -3.X (3.X being the python version).\n\n3. Install the requirements into the created virtual environment. The requirements.txt file needs Python 3.12. If using another version, use pip tools to compile the provided requirements.in file before installing the requirements:\n    ```commandline\n    venv\\Scripts\\python -m pip install --upgrade pip\n    venv\\Scripts\\python -m pip install wheel pip-compile-multi uv\n    venv\\Scripts\\python -m uv pip install --no-compile -r requirements/requirements.txt\n    ```\n    It might be required to install C++ build tools. To do that, click on the link that appears with the error message and follow the instructions (it is the lapack package that is missing). In order to be able to install the missing package, it is required to have a complete Visual Studio instance and installing it with the \"Desktop development with C++\" workload.\n\u003c!---\n4. Verify the installation of the oemof package and the solver by running the installation test in your virtual environment:\n    ```commandline\n    oemof_installation_test\n    ```\n\n    \n    If the installation is successful a message similar to the following would display (the installed solver would be marked as working):\n    ```commandline\n    *****************************\n    Solver installed with oemof\n    cbc: not working\n    glpk: not working\n    gurobi: working\n    cplex: not working\n    \n    *****************************\n    oemof successfully installed.\n    *****************************\n    ```\n--\u003e\n\n4. To test whether the installation worked well, you could run a [basic example](https://github.com/SPF-OST/OptiHood/tree/main/data/examples/).\n\n5. Run the test suite using:\n```commandline\n    venv\\Scripts\\python -m uv pip install --no-compile -r requirements/requirements_dev.txt\n    venv\\Scripts\\python dev-tools/devTools.py --unit \"not manual\" --keep-results\n```\n\n6. To upgrade the environment using an updated requirement/requirements.in file:\n```commandline\n    pip-compile-multi --use-cache --backtracking --uv --no-upgrade -d .\\requirements\\\n```\n\n## Defining an energy network\n\nOptihood offers a several functionalities to define an energy network, optimize it and visualize the results, which\nprovides the user with a complete framework for optimization without the need to code by hand. \n\nAn energy network can be defined as an object of the EnergyNetworkIndiv class or the EnergyNetworkGroup class. This\nobject then acts as the primary container for the model. The EnergyNetworkClass is the main parent class, from which \ntwo child classes EnergyNetworkIndiv and EnergyNetworkGroup are inherited. Either EnergyNetworkIndiv class or \nEnergyNetworkGroup class could be used to define an energy network. The choice mainly depends on whether the buildings \nare linked together (electrically and/or thermally) or not.\n\nIf the buildings within an energy network do not share electricity and/or heat, EnergyNetworkIndiv class is used:\n\n    import EnergyNetworkIndiv\n    network = EnergyNetworkIndiv(dateTimeIndex, tSH=35, tDHW=55)\n    \nOtherwise, if the buildings are expected to share energy (electrical and/or heat), EnergyNetworkGroup class is used:\n\n    import EnergyNetworkGroup\n    network = EnergyNetworkGroup(dateTimeIndex, tSH=35, tDHW=55)\n    \nThe first parameter to be passed in both the cases is a Datetime index. This parameter gives the time range for an\noptimization model. The Datetime index could be defined using date_range() in pandas:\n\n    import pandas as pd\n    dateTimeIndex = pd.date_range('2021-01-01 00:00:00', '2021-12-31 23:00:00', freq=\"60min\")\n    \nThe second and the third parameters tSH and tDHW define the temperatures for space heating and domestic hot water\nproduction, respectively.\n\nOnce the 'network' object has been created, the next step then is to build the model from an input excel file which\ndefines different components which constitute the model, how they are connected and their associated parameters:\n\n    network.setFromExcel(inputExcelFilePath, numberOfBuildings, clusterSize, opt)\n    \n'inputExcelFilePath' gives the path of the excel input file. 'numberofBuildings' is an integer parameter specifying the\nnumber of buildings defined in the excel file. The last two parameters clusterSize and opt are optional. The 'opt'\nparameter could be either 'costs' (default value) or 'env' depending on which criteria should be optimized. The\n'clusterSize' parameter is used to provide a selected number of days which could be assumed representative of the entire\ntime range. For example: two typical days could be selected to model the entire year, which could represent two clusters\nsummer and winter. This would improve the optimization speed. If not given during the function call, the default value\nof the clusterSize parameter assumes no day clusters.\n\n## Input Excel File\n\nThe input excel file is used to define an optimization model and set the model parameters. Each sheet of this excel file\nis structured to defin different components, such as buses, storages and transformers, their respective parameters,\nconnections between these components and the building to which they belong.\n\nThe input excel file typically has 9-10 sheets, each defining a different component type of the model.\n\n### buses\nThis excel sheet defines the buses used in the energy network. Buses define the connections between different\ncomponents. Each row of this excel sheet represents a bus node in the model.\n\n- **label** (string):\n    label name of the bus. Should be unique for each building i.e. different buildings could have the same label for two\n    buses but for one building the buses should not have duplicate labels.\n\n- **active** (0 or 1):\n    If set to 1 then the corresponding bus is active, otherwise (if 0) then the bus is inactive in the model. Could be\n    used to optimize different scenarios with different buses without the need to re-construct the base excel file.\n\n- **excess** (0 or 1):\n    If set to 1 then the corresponding bus has the possibility of having an excess flow unbalanced to the demand. An\n    additional sink node is automatically added in this case to accept this excess flow. If set to 0 then the bus cannot\n    have an excess flow.\n\n- **excess costs** (float):\n    The associated cost of excess flow from a bus. Relevant only if **excess** is set to 1. Could be negative to denote\n    monetary gains such as in case of PV feed-in.\n\n- **building** (integer):\n    Building number to which the bus belongs. Should be unique for each building.\n\n### commodity_sources\nThis sheet defines the different commodity sources which serve as an energy input to the model. The parameters **label**,\n**active** and **building** are analogous to the parameters described earlier for buses.\n\n- **to** (string):\n    Label of bus to which the energy from the commodity source flows. The corresponding bus label should exist in\n    the buses sheet.\n\n- **variable costs** (float):\n    Cost per kW of the commodity source.\n\n- **CO2 impact** (float):\n    CO2 impact per kW of the commodity source.\n\n### demand\nThe nodes related to the energy demand i.e. sink are defined in this sheet. The parameters **label**, **active** and\n**building** are analogous to the parameters described earlier for buses.\n\n- **from** (string):\n    Label of the bus from which the energy flows to the demand node. The corresponding bus label should exist in\n    the buses sheet.\n\n- **fixed** (0 or 1):\n    If set to 1, the energy demand profiles are fixed and a path to the demand profiles should then be given in the\n    csv_data sheet of the input excel file. If set to 0, the optimizer will select the demand profiles for optimum\n    operation (a total annual demand profile could be given in this case). At the present development stage only fixed\n    demands are accepted.\n\n- **nominal value** (float):\n    The demand profiles series should be normalized values. this parameter then defines the maximum demand with which\n    the normalized series is multiplied to obtain the actual demand profile series. If set to 1, then the given demand\n    profile series is taken as it is (not normalized).\n\n### transformers\nThe nodes related to the energy conversion units (or transformers) such as CHP, heat pump, etc. are given in this excel\nsheet. The parameters **label**, **active** and **building** are analogous to the parameters described earlier for buses.\n\n- **from** (string):\n    Label of bus from which the energy flows to the transformer node. The corresponding bus label should exist in\n    the buses sheet.\n\n- **to** (strings separated by comma):\n    Label of the bus(es) to which the energy flows from the transformer node. Different bus labels should be separated\n    by a comma (,), for example: Bus1, Bus2, Bus3. The bus label(s) should exist in the buses sheet.\n\n- **efficiency** (float values separated by comma):\n    Conversion efficiency from input to the output(s) of the transformer node. Efficiencies should be separated by\n    a comma (,) in the case with more than one outputs (i.e. when more than one buses are listed under **to**).\n\n- **capacity_DHW** (float):\n    Maximum capacity limit for domestic hot water (DHW) production from the transformer unit in kW. Could be left blank\n    if the parameter is not relevant to a transformer (for example if a transformer does not produce DHW)\n\n- **capacity_SH** (float):\n    Maximum capacity limit for space heat (SH) production from the transformer unit in kW. Could be left blank if the\n    parameter is not relevant to a transformer (for example if a transformer does not produce SH)\n\n- **capacity_el** (float):\n    Maximum capacity limit for electricity production from the transformer unit in kW. Could be left blank if the\n    parameter is not relevant to a transformer (for example if a transformer does not produce electricity). Note for CHP\n    this parameter acts as the main capacity against which optimization is performed.\n\n- **capacity_min** (float):\n    Minimum capacity to be installed in kW for an investment in the transformer unit.\n\n- **lifetime** (non-negative integer):\n    Lifetime of the node in years.\n\n- **invest_base** (float):\n    Base investment cost of the node.\n\n- **invest_cap** (float):\n    Investment cost per unit installed capacity (i.e. per kW) of the node.\n\n- **maintenance** (float):\n    Maintenance cost of the node. Given as a percentage of the base investment cost **invest_base**. For example:\n    if the investment cost is to be taken as 5% of **invest_base**, then the value of **maintenance** field should be 0.05.\n    Set as 0 if this cost is to be ignored.\n\n- **installation** (float):\n    Installation cost of the node. Given as a percentage of the base investment cost **invest_base**. For example:\n    if the Installation cost is to be taken as 15% of **invest_base**, then **installation** field should be 0.15. Set\n    as 0 if this cost is to be ignored.\n\n- **planification** (float):\n    Cost associated with planning. Given as a percentage of the base investment cost **invest_base**. For example:\n    if the planning cost is 5% of **invest_base**, then **planification** should be 0.05. Set as 0 if this cost is to be\n    ignored.\n\n- **heat_impact** (float):\n    Environmental impact for heat production. Set as 0 if there is no impact due to heat production.\n\n- **elec_impact** (float):\n    Environmental impact for electricity production. Set as 0 if there is no impact due to electricity production.\n\n- **impact_cap** (float):\n    Environmental impact per unit installed capacity i.e. per kW of the node. Set as 0 if there is no impact per\n    installed capacity of the node.\n\n### solar\nThis excel sheet defines the parameters related to the solar components such as solar thermal collector and PV panels.\nThe parameters **label**, **active** and **building** are analogous to the parameters described earlier for buses.\n**from** and **to** parameters have been previously defined for commodity sources and demand sheets, respectively, while\nthe cost and environmental impact paramaters are described under transformers sheet.\n\n- **connect** (string):\n    Label of the bus which connects a solar collector to the model. This bus allows excess heat production from the solar\n    collector. A node for heat sink is created automatically. The given bus label should exist in the buses sheet. This\n    parameter is irrelevant for PV.\n\n- **electrical_consumption** (float):\n    Electrical consumption of the solar component. Given as a percentage fraction of the energy produced. 0.02 means\n    the electrical consumption is 2% of the energy is produced.\n\n- **peripheral_losses** (float):\n    Peripheral losses of the solar component. Given as a percentage fraction of the energy produced. 0.05 means 5% of\n    the energy produced is lost to the surrounding environment.\n\n- **latitude** (float):\n    Latitude of the geographical location where the solar collector/panel is placed. Given in degrees.\n\n- **longitude** (float):\n    Longitude of the geographical location where the solar collector/panel is placed. Given in degrees.\n\n- **tilt** (float):\n    Tilt angle of the solar collector/panel. Given in degrees.\n\n- **azimuth** (float):\n    Azimuth angle of the solar collector/panel. Given in degrees.\n\n- **eta_0**, **a_1** and **a_2** (float):\n    Efficiency parameters of the solar thermal collector. Solar thermal collector is linearized using the pre-calculations\n    given in [oemof-thermal](https://oemof-thermal.readthedocs.io/en/latest/solar_thermal_collector.html).\n\n- **temp_collector_inlet** (float):\n    Inlet fluid temperature of the solar thermal collector. Given in degree C.\n\n- **delta_temp_n** (float):\n    Temperature difference between the inlet fluid and the mean fluid temperature in case of solar collector. For PV,\n    this parameter denotes the temperature difference between the solar cells and the ambient.\n\n- **capacity_max** (float):\n    Maximum capacity limit in kW.\n\n- **capacity_min** (float):\n    Minimum possible capacity in kW for the installation of solar collector/panel.\n\n### storages\nThis excel sheet defines the parameters related to the energy storage units such as battery and hot water tank. **label**,\n**active** and **building** have been defined previously for buses excel sheet. A description of **from** and **to** has\nbeen given in commodity sources and demand sheets, respectively. The cost and environmental impact parameters are\ndescribed in the transformers sheet section. **capacity_min** and **capacity_max** are described in the solar excel sheet\nsection.\n\n- **efficiency inflow** (float):\n    Charging efficiency of battery. This parameter is not relevant for thermal storages.\n\n- **efficiency outflow** (float):\n    Discharging efficiency of battery. This parameter is not relevant for thermal storages.\n\n- **initial capacity** (float):\n    initial capacity of the storage. This parameter is expressed as a fraction of the total storage capacity. 0 means storage is initially \n    assumed to be empty, 1 denotes that the storage is 100% full initially, while 0.5 means the storage is at 50% capacity initially.\n\n- **capacity loss** (float):\n    Losses from battery storage. This parameter is not relevant for thermal storages.\n\n### stratified_storage\nThis excel sheet defines the parameters relevant to stratified thermal storage. The pre-calculations given in [oemof-thermal](https://oemof-thermal.readthedocs.io/en/latest/stratified_thermal_storage.html)\nhave been used to linearize the thermal hot water storage. The parameter names used here are similar to the parameters\ndefined in oemof-thermal.\n\n### links\nThis excel sheet defines the parameters for electricity and space heating links. The buildings could share electricity\nproduction and/or space heat production. Links allow this sharing to be possible. **label** and **active** have been\ndefined already for buses excel sheet. **invest_base** and **invest_cap** parameters (defined in the transformers sheet\nsection) are only relevant for space heating links in the present stage of development.\n\n- **buildingA** (integer):\n    Building number of the first building of the link. This should match with the values typically given in the\n    **building** parameter in the other excel sheets.\n\n- **buildingB** (integer):\n    Building number of the second building of the link. This should match with the values typically given in the\n    **building** parameter in the other excel sheets.\n\n- **efficiency from A to B** (integer):\n    Efficiency of energy transfer over the link from **buildingA** to **buildingB**.\n\n- **efficiency from B to A** (integer):\n    Efficiency of energy transfer over the link from **buildingB** to **buildingA**.\n\n### csv_data\nThe paths to CSV files containing demand profiles, weather data and electricity impact data are to be given in this\nexcel sheet. **INFO** gives further information about each row.\n\n### grid_connection\nThis excel sheet should not be modified by the users. It defines the separation of the flows from electricity grid and\nthe produced electricity flows to make sure that the grid electricity is not stored in batteries.\n\n\n## Collaborators\n\nSPF/OST \u0026 HEIG-VD\n","funding_links":[],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":[],"project_url":"https://ost.ecosyste.ms/api/v1/projects/191728","html_url":"https://ost.ecosyste.ms/projects/191728"}