{ "info": { "author": "Praneeth Balakrishna, Gerrit Book, Felix Book, Darius Jakobeit, Wilhelm Kirchg\u00e4ssner, Pramod Manjunatha, Pascal Peters, Max Schenke, Arne Traue, Oliver Wallscheid", "author_email": "", "bugtrack_url": null, "classifiers": [], "description": "# Gym Electric Motor\n![](docs/plots/Motor_Logo.png)\n\n\n[**Overview paper**](https://joss.theoj.org/papers/10.21105/joss.02498)\n| [**Reinforcement learning paper**](https://arxiv.org/abs/1910.09434)\n| [**Quickstart**](#getting-started)\n| [**Install guide**](#installation)\n| [**Reference docs**](https://upb-lea.github.io/gym-electric-motor/)\n| [**Release notes**](https://github.com/upb-lea/gym-electric-motor/releases)\n\n[![Build Status](https://github.com/upb-lea/gym-electric-motor/actions/workflows/build_and_test.yml/badge.svg)](https://github.com/upb-lea/gym-electric-motor/actions/workflows/build_and_test.yml)\n[![codecov](https://codecov.io/gh/upb-lea/gym-electric-motor/branch/master/graph/badge.svg)](https://codecov.io/gh/upb-lea/gym-electric-motor)\n[![PyPI version shields.io](https://img.shields.io/pypi/v/gym-electric-motor.svg)](https://pypi.python.org/pypi/gym-electric-motor/)\n[![License](https://img.shields.io/github/license/mashape/apistatus.svg?maxAge=2592000)](https://github.com/upb-lea/gym-electric-motor/blob/master/LICENSE)\n[![DOI Zenodo](https://zenodo.org/badge/DOI/10.5281/zenodo.4355691.svg)](https://doi.org/10.5281/zenodo.4355691)\n[![DOI JOSS](https://joss.theoj.org/papers/10.21105/joss.02498/status.svg)](https://doi.org/10.21105/joss.02498)\n\n## Overview\nThe gym-electric-motor (GEM) package is a Python toolbox for the simulation and control of various electric motors.\nIt is built upon [OpenAI Gym Environments](https://gym.openai.com/), and, therefore, can be used for both, classical control simulation and [reinforcement learning](https://github.com/upb-lea/reinforcement_learning_course_materials) experiments. It allows you to construct a typical drive train with the usual building blocks, i.e., supply voltages, converters, electric motors and load models, and obtain not only a closed-loop simulation of this physical structure, but also a rich interface for plugging in any decision making algorithm, from linear feedback control to [Deep Deterministic Policy Gradient](https://spinningup.openai.com/en/latest/algorithms/ddpg.html) agents.\n\n## Getting Started\nAn easy way to get started with GEM is by playing around with the following interactive notebooks in Google Colaboratory. Most important features of GEM as well as application demonstrations are showcased, and give a kickstart for engineers in industry and academia.\n\n* [GEM cookbook](https://colab.research.google.com/github/upb-lea/gym-electric-motor/blob/master//examples/environment_features/GEM_cookbook.ipynb)\n* [Keras-rl2 example](https://colab.research.google.com/github/upb-lea/gym-electric-motor/blob/master/examples/reinforcement_learning_controllers/keras_rl2_dqn_disc_pmsm_example.ipynb)\n* [Stable-baselines3 example](https://colab.research.google.com/github/upb-lea/gym-electric-motor/blob/master/examples/reinforcement_learning_controllers/stable_baselines3_dqn_disc_pmsm_example.ipynb)\n* [MPC example](https://colab.research.google.com/github/upb-lea/gym-electric-motor/blob/master/examples/model_predictive_controllers/pmsm_mpc_dq_current_control.ipynb)\n\nThere is a list of [standalone example scripts](examples/) as well for minimalistic demonstrations.\n\nA basic routine is as simple as:\n```py\nimport gym_electric_motor as gem\n\nif __name__ == '__main__':\n env = gem.make(\"Finite-CC-PMSM-v0\") # instantiate a discretely controlled PMSM\n env.reset()\n for _ in range(10000):\n env.render() # visualize environment\n (states, references), rewards, done, _ =\\ \n \tenv.step(env.action_space.sample()) # pick random control actions\n if done:\n (states, references) = env.reset()\n env.close()\n```\n\n\n\n## Installation\n- Install gym-electric-motor from PyPI (recommended):\n\n```\npip install gym-electric-motor\n```\n\n- Install from Github source:\n\n```\ngit clone git@github.com:upb-lea/gym-electric-motor.git \ncd gym-electric-motor\n# Then either\npython setup.py install\n# or alternatively\npip install -e .\n```\n\n## Building Blocks\nA GEM environment consists of following building blocks:\n- Physical structure:\n - Supply voltage\n - Converter\n - Electric motor\n - Load model\n- Utility functions for reference generation, reward calculation and visualization\n \n### Information Flow in a GEM Environment\n![](docs/plots/SCML_Overview.png)\n\nAmong various DC-motor models, the following AC motors - together with their power electronic counterparts - are available:\n- Permanent magnet synchronous motor (PMSM), \n- Synchronous reluctance motor (SynRM)\n- Squirrel cage induction motor (SCIM)\n- Doubly-fed induction motor (DFIM)\n\nThe converters can be driven by means of a duty cycle (continuous control set) or switching commands (finite control set). \n\n### Citation\nA white paper for the general toolbox in the context of drive simulation and control prototyping can be found in the [Journal of Open Sorce Software (JOSS)](https://joss.theoj.org/papers/10.21105/joss.02498). Please use the following BibTeX entry for citing it:\n```\n@article{Balakrishna2021,\n doi = {10.21105/joss.02498},\n url = {https://doi.org/10.21105/joss.02498},\n year = {2021},\n publisher = {The Open Journal},\n volume = {6},\n number = {58},\n pages = {2498},\n author = {Praneeth {Balakrishna} and Gerrit {Book} and Wilhelm {Kirchg\u00e4ssner} and Maximilian {Schenke} and Arne {Traue} and Oliver {Wallscheid}},\n title = {gym-electric-motor (GEM): A Python toolbox for the simulation of electric drive systems},\n journal = {Journal of Open Source Software}\n}\n\n```\n\nA white paper for the utilization of this framework within reinforcement learning is available at [IEEE-Xplore](https://ieeexplore.ieee.org/document/9241851) (preprint: [arxiv.org/abs/1910.09434](https://arxiv.org/abs/1910.09434)). Please use the following BibTeX entry for citing it:\n```\n@article{9241851, \n doi={10.1109/TNNLS.2020.3029573}\n author={A. {Traue} and G. {Book} and W. {Kirchg\u00e4ssner} and O. {Wallscheid}}, \n journal={IEEE Transactions on Neural Networks and Learning Systems}, \n title={Toward a Reinforcement Learning Environment Toolbox for Intelligent Electric Motor Control}, \n year={2020}, volume={}, number={}, \n pages={1-10}, \n}\n```\n\n### Running Unit Tests with Pytest\nTo run the unit tests ''pytest'' is required.\nAll tests can be found in the ''tests'' folder.\nExecute pytest in the project's root folder:\n```\n>>> pytest\n```\nor with test coverage:\n```\n>>> pytest --cov=./\n```\nAll tests shall pass.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/upb-lea/gym-electric-motor", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "gym-electric-motor", "package_url": "https://pypi.org/project/gym-electric-motor/", "platform": "", "project_url": "https://pypi.org/project/gym-electric-motor/", "project_urls": { "Homepage": "https://github.com/upb-lea/gym-electric-motor" }, "release_url": "https://pypi.org/project/gym-electric-motor/1.0.1/", "requires_dist": [ "matplotlib (>=3.1.2)", "numpy (>=1.16.4)", "scipy (>=1.4.1)", "gym (>=0.15.4)", "pytest (>=5.2.2)", "pytest-cov", "keras-rl2 ; extra == 'examples'", "stable-baselines3 ; extra == 'examples'", "gekko ; extra == 'examples'" ], "requires_python": ">=3.6", "summary": "An OpenAI gym environment for electric motor control.", "version": "1.0.1", "yanked": false, "yanked_reason": null }, "last_serial": 12362436, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "05fbe0650c39ea1c1f2ec023e6448a21", "sha256": "544847eaab4da6edc4eda2173bea4a578cfbab4409f546c3dca520323b819f9c" }, "downloads": -1, "filename": "gym_electric_motor-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "05fbe0650c39ea1c1f2ec023e6448a21", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 2036, "upload_time": "2019-10-21T14:18:48", "upload_time_iso_8601": "2019-10-21T14:18:48.390788Z", "url": "https://files.pythonhosted.org/packages/07/67/f126488b6c6f2547536e1dae0865e9af9431934dd56b83c859c0b27fa575/gym_electric_motor-0.0.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "4bf2cd48bc40e88a617d02648f833f75", "sha256": "5995f0d885d2cecc63f93e11c86021064aa67a6e560234cb36e8949a04ac4ead" }, "downloads": -1, "filename": "gym_electric_motor-0.0.1.tar.gz", "has_sig": false, "md5_digest": "4bf2cd48bc40e88a617d02648f833f75", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3211, "upload_time": "2019-10-21T14:18:51", "upload_time_iso_8601": "2019-10-21T14:18:51.838779Z", "url": "https://files.pythonhosted.org/packages/10/c7/3afe5d4fe0201298b5e2f07e4b1838dd70507337c44e54a6e3cb3024ccad/gym_electric_motor-0.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "f3940023e8b8eb9355dea85b1ead65ef", "sha256": "d8ee5bd123d46de069225d8399e200b4b71549ba8dd8584c3558d7c4e496ef8d" }, "downloads": -1, "filename": "gym_electric_motor-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "f3940023e8b8eb9355dea85b1ead65ef", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 2054, "upload_time": "2020-02-04T10:21:21", "upload_time_iso_8601": "2020-02-04T10:21:21.816195Z", "url": "https://files.pythonhosted.org/packages/87/58/1df8c7f6a29a9d79b06e9fc788b29bd155c8a2b40067ed9d7b0d53d0a7f4/gym_electric_motor-0.0.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "77af00e08c9424a9e09fdc8509709e61", "sha256": "7046b3b849ba25de134ece107dc8a124becaee8f2e7067887e91cfb359b1dbbb" }, "downloads": -1, "filename": "gym_electric_motor-0.0.3.tar.gz", "has_sig": false, "md5_digest": "77af00e08c9424a9e09fdc8509709e61", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4407, "upload_time": "2020-02-04T10:21:23", "upload_time_iso_8601": "2020-02-04T10:21:23.537409Z", "url": "https://files.pythonhosted.org/packages/1f/40/7406398e537582b55702f7f054219ac49582867cc7137ffea28baed1b117/gym_electric_motor-0.0.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "64a8050cee563dc74fb482c6a6ed87ea", "sha256": "4f7c1922ce77a4c2745e0a3d2e464ed913a4ee992a283c37dacdf780d2939dbe" }, "downloads": -1, "filename": "gym_electric_motor-0.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "64a8050cee563dc74fb482c6a6ed87ea", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 122504, "upload_time": "2020-02-08T10:14:47", "upload_time_iso_8601": "2020-02-08T10:14:47.385530Z", "url": "https://files.pythonhosted.org/packages/20/df/f29e9445364804ebf612ff738b83e59c69bf0fe3827e1e4d379542253ca6/gym_electric_motor-0.0.4-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "992a43d179ea82a8b721f70fb0b2acf9", "sha256": "51c2f09361e5689e774d83fc3010088dc97459d05078b0a474ca0cae416ee24b" }, "downloads": -1, "filename": "gym_electric_motor-0.0.4.tar.gz", "has_sig": false, "md5_digest": "992a43d179ea82a8b721f70fb0b2acf9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 95727, "upload_time": "2020-02-08T10:14:49", "upload_time_iso_8601": "2020-02-08T10:14:49.490781Z", "url": "https://files.pythonhosted.org/packages/54/96/8a6214c97ddf8b19336929b04b10600e51f9b127c57b2804f24f1fbff8c2/gym_electric_motor-0.0.4.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "ac083c74c13cd65bb0c0a9d7b0131186", "sha256": "a434454d6495835e0aadd52a193bd72aec4fc69c4bb165c0e0c23bcfb6d52eb3" }, "downloads": -1, "filename": "gym_electric_motor-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "ac083c74c13cd65bb0c0a9d7b0131186", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 131241, "upload_time": "2020-04-24T07:17:21", "upload_time_iso_8601": "2020-04-24T07:17:21.383519Z", "url": "https://files.pythonhosted.org/packages/bb/63/e569c4722e1d8bc8cae5a74ffe88238056756732647bcd3120e639455fa7/gym_electric_motor-0.1.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "95e495e299a41e3753bc2227d3a942db", "sha256": "5be4599274806cedcf36fefc2746592d6ea0fb03558a6ba8fdc9315a0de996b9" }, "downloads": -1, "filename": "gym_electric_motor-0.1.0.tar.gz", "has_sig": false, "md5_digest": "95e495e299a41e3753bc2227d3a942db", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 100630, "upload_time": "2020-04-24T07:17:23", "upload_time_iso_8601": "2020-04-24T07:17:23.051877Z", "url": "https://files.pythonhosted.org/packages/1d/89/63c16d44bbc1f040160200b06433385d384d81a8356888fddfd76adb879c/gym_electric_motor-0.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "ed52799f7a268c86882576ef1c9d73ef", "sha256": "e8ba29b6c5386d09fa50885031db4e5fa3bea322403e48a7a69bd8f23025218e" }, "downloads": -1, "filename": "gym_electric_motor-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "ed52799f7a268c86882576ef1c9d73ef", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 131276, "upload_time": "2020-04-29T09:36:03", "upload_time_iso_8601": "2020-04-29T09:36:03.700305Z", "url": "https://files.pythonhosted.org/packages/0e/ec/34d75b645d4c4f062d3c3fe95386d2a95ddd3e20722614db17aacc6aa3bd/gym_electric_motor-0.1.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "e5a6d244fda36ead4924d9295a947a32", "sha256": "b811c18ac13fe07c7b2fbead2ca690f94f43c7bbccdffc5227caed10bc5758dd" }, "downloads": -1, "filename": "gym_electric_motor-0.1.1.tar.gz", "has_sig": false, "md5_digest": "e5a6d244fda36ead4924d9295a947a32", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 100850, "upload_time": "2020-04-29T09:36:05", "upload_time_iso_8601": "2020-04-29T09:36:05.919245Z", "url": "https://files.pythonhosted.org/packages/e1/cf/7527f18009abc45b1a3447d69d324b4b567c0a5be6aaf1ed28d9689a9c47/gym_electric_motor-0.1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "f9601861cb93742c23cdf296636fcbf1", "sha256": "264b8c9f9b986c5c547b486961c642b8314647195fb9ed56431c6a3d080cf64e" }, "downloads": -1, "filename": "gym_electric_motor-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "f9601861cb93742c23cdf296636fcbf1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 141164, "upload_time": "2020-04-30T15:02:11", "upload_time_iso_8601": "2020-04-30T15:02:11.844327Z", "url": "https://files.pythonhosted.org/packages/9e/34/13223c7fd5348ee09649aa20747c1fe8a02385c351dc40c0aa74bae61aa2/gym_electric_motor-0.2.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "fe719a0e2a266de9995ef695ccfa8709", "sha256": "674f95f9b792765198b41bf70ea1382af7027af014db8116735deb174f53bba6" }, "downloads": -1, "filename": "gym_electric_motor-0.2.0.tar.gz", "has_sig": false, "md5_digest": "fe719a0e2a266de9995ef695ccfa8709", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 108961, "upload_time": "2020-04-30T15:02:13", "upload_time_iso_8601": "2020-04-30T15:02:13.734027Z", "url": "https://files.pythonhosted.org/packages/5d/8a/12a9548d87fa17f9bf1ff55056ab103e2340f037d68f9fda9b9380d1ab0a/gym_electric_motor-0.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "b72d62445bc3a628e8e67752e6007ac7", "sha256": "99e9cadbb1ff5ca4fda2eb6e730bda2fc269a98f8ec63ded12455cf22d067656" }, "downloads": -1, "filename": "gym_electric_motor-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "b72d62445bc3a628e8e67752e6007ac7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 140292, "upload_time": "2020-05-29T12:06:01", "upload_time_iso_8601": "2020-05-29T12:06:01.606383Z", "url": "https://files.pythonhosted.org/packages/52/6f/894d34fcb2f36b06b43cd7a2745ef5690771841cb8649716f0e5b30f96a0/gym_electric_motor-0.2.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "0b8277a8e6ff4e29bb7d55c831069014", "sha256": "08b6665b69cf3a9f4110d214f3b11cedcf1e4570be7de2718e32c2790a57bb4a" }, "downloads": -1, "filename": "gym_electric_motor-0.2.1.tar.gz", "has_sig": false, "md5_digest": "0b8277a8e6ff4e29bb7d55c831069014", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 105400, "upload_time": "2020-05-29T12:06:03", "upload_time_iso_8601": "2020-05-29T12:06:03.021892Z", "url": "https://files.pythonhosted.org/packages/4c/ea/115c062933b11c4efed09f125b62b5691825d958aa9060f82c8fee96c283/gym_electric_motor-0.2.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "b4e9f244e6f8dca5e33be97271f6955c", "sha256": "ee284ad896ed41eb578639cd3e376d167ad15724ead6ea9d63d11825101367a7" }, "downloads": -1, "filename": "gym_electric_motor-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "b4e9f244e6f8dca5e33be97271f6955c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 151430, "upload_time": "2020-10-22T20:43:10", "upload_time_iso_8601": "2020-10-22T20:43:10.587027Z", "url": "https://files.pythonhosted.org/packages/99/88/d2b814a2f00ea6c83f9a11023c5a61dce77f6e0516bf2ed96500f6f420ba/gym_electric_motor-0.3.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "cc08c74965e0169bd93ba2873b24cef2", "sha256": "4b91d943ca26bd951b4d6c17fb0b8dc24d6e3c97eaa61c85615fefea9fd596d6" }, "downloads": -1, "filename": "gym_electric_motor-0.3.0.tar.gz", "has_sig": false, "md5_digest": "cc08c74965e0169bd93ba2873b24cef2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 118190, "upload_time": "2020-10-22T20:43:12", "upload_time_iso_8601": "2020-10-22T20:43:12.509910Z", "url": "https://files.pythonhosted.org/packages/86/37/703b72dc6b441dc0318d3b3a7a6a1a8a08a67dc84dad79e047083f7397fb/gym_electric_motor-0.3.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "9254e16ca1e449eb839298c6768b38de", "sha256": "84e359f1f42bacade607b94034b01fd63b1b656d6d9c2ce90c618724c04c5b34" }, "downloads": -1, "filename": "gym_electric_motor-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "9254e16ca1e449eb839298c6768b38de", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 162696, "upload_time": "2020-12-18T15:49:52", "upload_time_iso_8601": "2020-12-18T15:49:52.490040Z", "url": "https://files.pythonhosted.org/packages/c7/0c/8d97f90fa1a63674d97a012d1572bbe7740fb52e8c9167ca4b2a8d7073b3/gym_electric_motor-0.3.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "b34489c22e2af2c65813bbc7d5f060f5", "sha256": "f40c570842e27d808e422e24d78169eef1b75da06e62725388a0caa226b3f375" }, "downloads": -1, "filename": "gym_electric_motor-0.3.1.tar.gz", "has_sig": false, "md5_digest": "b34489c22e2af2c65813bbc7d5f060f5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 117400, "upload_time": "2020-12-18T15:49:54", "upload_time_iso_8601": "2020-12-18T15:49:54.223987Z", "url": "https://files.pythonhosted.org/packages/ae/bf/2b0a4c0f2d3ff3b2f5c61454f3b861ad07d7a7513aff88076581c559a660/gym_electric_motor-0.3.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "10381eb455a5f7065aa60cc5778e5ab5", "sha256": "0a2da4705b8a1681c4f3b7a39f53d6baed867ae76c9cc39eda56483f97ff4b82" }, "downloads": -1, "filename": "gym_electric_motor-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "10381eb455a5f7065aa60cc5778e5ab5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 317642, "upload_time": "2021-08-23T14:21:17", "upload_time_iso_8601": "2021-08-23T14:21:17.075057Z", "url": "https://files.pythonhosted.org/packages/ea/70/d4eeeac357b02294913ae4ac40bffe5932c10d32e6cba79e3aaac7ec4959/gym_electric_motor-1.0.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "5537d6b4d874ca2ef9e041eb4cad1dbe", "sha256": "30c7355faff89c60d4849ffd66c499f110bd5861ea28fa36cc97e48808a15e90" }, "downloads": -1, "filename": "gym_electric_motor-1.0.0.tar.gz", "has_sig": false, "md5_digest": "5537d6b4d874ca2ef9e041eb4cad1dbe", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 124293, "upload_time": "2021-08-23T14:21:20", "upload_time_iso_8601": "2021-08-23T14:21:20.234785Z", "url": "https://files.pythonhosted.org/packages/84/7d/74be717bce5a43be73053ada7b48f24a0616df02c33a9bc1ec079df1fbfe/gym_electric_motor-1.0.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "b38e4abd24f6a2f567996e3eeecedb6d", "sha256": "c6d2e11fa3b5378d7c9c4b9040b8c74f009139aa7f0ec242b98a4afc14d78d05" }, "downloads": -1, "filename": "gym_electric_motor-1.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "b38e4abd24f6a2f567996e3eeecedb6d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 319034, "upload_time": "2021-12-20T16:05:38", "upload_time_iso_8601": "2021-12-20T16:05:38.054181Z", "url": "https://files.pythonhosted.org/packages/1a/4b/c0f8c4a91bfbf42be092f803a85f9d7fc93ff23e72c63502199497a3988d/gym_electric_motor-1.0.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "26fefe95a43fabc59d8941d9ab6fd085", "sha256": "23f744a7c437ae09d2626ced6005ce2d0662f3975df7531a9bcae8f4780f1772" }, "downloads": -1, "filename": "gym_electric_motor-1.0.1.tar.gz", "has_sig": false, "md5_digest": "26fefe95a43fabc59d8941d9ab6fd085", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 125830, "upload_time": "2021-12-20T16:05:40", "upload_time_iso_8601": "2021-12-20T16:05:40.390006Z", "url": "https://files.pythonhosted.org/packages/dd/e7/dbb8bd7ec8e3ccbae83649caf310bc7d7518b4c9c3f19f2b4c0c6df7afaa/gym_electric_motor-1.0.1.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "b38e4abd24f6a2f567996e3eeecedb6d", "sha256": "c6d2e11fa3b5378d7c9c4b9040b8c74f009139aa7f0ec242b98a4afc14d78d05" }, "downloads": -1, "filename": "gym_electric_motor-1.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "b38e4abd24f6a2f567996e3eeecedb6d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 319034, "upload_time": "2021-12-20T16:05:38", "upload_time_iso_8601": "2021-12-20T16:05:38.054181Z", "url": "https://files.pythonhosted.org/packages/1a/4b/c0f8c4a91bfbf42be092f803a85f9d7fc93ff23e72c63502199497a3988d/gym_electric_motor-1.0.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "26fefe95a43fabc59d8941d9ab6fd085", "sha256": "23f744a7c437ae09d2626ced6005ce2d0662f3975df7531a9bcae8f4780f1772" }, "downloads": -1, "filename": "gym_electric_motor-1.0.1.tar.gz", "has_sig": false, "md5_digest": "26fefe95a43fabc59d8941d9ab6fd085", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 125830, "upload_time": "2021-12-20T16:05:40", "upload_time_iso_8601": "2021-12-20T16:05:40.390006Z", "url": "https://files.pythonhosted.org/packages/dd/e7/dbb8bd7ec8e3ccbae83649caf310bc7d7518b4c9c3f19f2b4c0c6df7afaa/gym_electric_motor-1.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }