summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2023-05-10 03:44:29 +0000
committerCoprDistGit <infra@openeuler.org>2023-05-10 03:44:29 +0000
commit8c3a98185da6d294a71e6a10ed49cc14b53999aa (patch)
tree65df7cf2a78253179575091809443dfc431908d9
parent5441c308fec466288b2da6e241f85f8ebaddb85b (diff)
automatic import of python-elkm1-libopeneuler20.03
-rw-r--r--.gitignore1
-rw-r--r--python-elkm1-lib.spec782
-rw-r--r--sources1
3 files changed, 784 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..f8443fc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/elkm1_lib-2.2.2.tar.gz
diff --git a/python-elkm1-lib.spec b/python-elkm1-lib.spec
new file mode 100644
index 0000000..03924be
--- /dev/null
+++ b/python-elkm1-lib.spec
@@ -0,0 +1,782 @@
+%global _empty_manifest_terminate_build 0
+Name: python-elkm1-lib
+Version: 2.2.2
+Release: 1
+Summary: Library for interacting with ElkM1 alarm/automation panel.
+License: MIT
+URL: https://github.com/gwww/elkm1
+Source0: https://mirrors.nju.edu.cn/pypi/web/packages/a9/38/7742fe806c0bd5dc1d314556f264bd48f29328194a1149ba7db55c41c943/elkm1_lib-2.2.2.tar.gz
+BuildArch: noarch
+
+Requires: python3-async-timeout
+Requires: python3-pyserial-asyncio
+
+%description
+# Python ElkM1 library
+
+[![PyPI version](https://badge.fury.io/py/elkm1-lib.svg)](https://badge.fury.io/py/elkm1-lib)
+[![CI](https://github.com/gwww/elkm1/actions/workflows/code-quality.yml/badge.svg)](https://github.com/gwww/elkm1/actions/workflows/code-quality.yml)
+[![Downloads](https://pepy.tech/badge/elkm1-lib)](https://pepy.tech/project/elkm1-lib)
+[![License](https://img.shields.io/github/license/mashape/apistatus.svg)](https://pypi.org/project/elkm1_lib/)
+
+Library for interacting with ElkM1 alarm/automation panel.
+
+https://github.com/gwww/elkm1
+
+## Requirements
+
+- Python 3.9 (or higher)
+
+## Description
+
+This package is created as a library to interact with an ElkM1 alarm/automation
+pattern. The motivation to write this was to use with the Home Assistant
+automation platform. The library can be used for writing other ElkM1 integration
+applications. The IO with the panel is asynchronous over TCP or over the
+serial port.
+
+## Installation
+
+```bash
+ $ pip install elkm1_lib
+```
+
+## Overview
+
+Basic connection to the Elk panel:
+
+```python
+ from elkm1_lib import Elk
+ import logging
+
+ # Print to STDOUT
+ LOG = logging.getLogger(__name__)
+ logging.basicConfig(level=logging.DEBUG, format='%(message)s')
+
+ # Connect to elk
+ elk = Elk({'url': 'elk://192.168.1.100'})
+ elk.connect()
+ elk.run()
+```
+
+The above will connect to the Elk panel at IP address 192.168.1.100. the `elk://`
+prefix specifies that the connect is plaintext. Alternatively, `elks://` will
+connect over TLS. In this case a userid and password must be specified
+and the call to `Elk` changes to:
+
+```python
+ elk = Elk(
+ {'url': 'elks://192.168.1.100', 'userid': 'test', 'password': 'pass'}
+ )
+```
+
+The following ElkM1 connection protocols are supported:
+- serial:// - Serial port;
+- elk:// - Elk M1XEP Ethernet, non-secure
+- elks:// - Elk M1XEP Ethernet, secure, TLS 1.0
+- elksv1_0:// - Elk M1XEP Ethernet, secure, TLS 1.0, supported on M1XEP version < 2.0.46
+- elksv1_2:// - Elk M1XEP Ethernet, secure, TLS 1.2, supported on M1XEP version = 2.0.46
+- elksv1_3:// - Elk M1XEP Ethernet, secure, TLS 1.2, not yet supported on M1XEP, reserved for future
+
+A username and password are required for any of the secure modes.
+
+To see working example code take a look at the script `bin/simple`.
+
+The `Elk` object supports the concept of `Elements`. An `Element`
+is the base class representation of `Zones`, `Lights`, etc. So, for
+example there is a list of zones: `elk.zones` and each zone can be
+accessed by `elk.zones[index]`. Each element has a `__str__`
+representation so that it is easy to print its contents.
+
+All `Elements` are referenced starting at 0. Even though the Elk panel
+refers to, for example, zones 1-208, the library references them
+as zones 0-207. All translation from base 0 to 1 and vice-versa is
+handled internally in the `elkm1_lib.message` module.
+
+After creating the `Elk` object and connecting to the panel the
+library code will synchronize all the elements to the data from the Elk panel.
+
+Many Elk messages are handled by the library, caching their contents. When a
+message causes a change to an attribute of an `Element`, registered
+callbacks are called so that user use of the library can be notified
+of changing elements. The following user code shows registering a callback:
+
+```python
+ def call_me(element, changeset):
+ print(changeset)
+
+ for zone_number in range(Max.ZONES.value):
+ elk.zones[zone_number].add_callback(call_me)
+```
+
+The library encodes, decodes, and processes messages to/from the
+Elk panel. All the encoding and decoding is done in `elkm1_lib.message` module.
+
+Messages received are handled with callbacks. The library
+internally registers callbacks so that decoded messages
+can be used to update an `Element`. The user of the
+library may also register callbacks. Any particular message
+may have multiple callbacks.
+
+When the message is received it is decoded
+and some validation is done. The message handler is called
+with the fields of from the decoded message. Each type of
+message has parameters that match the message type. All handler parameters
+are named parameters.
+
+Here is an example of a message handler being registered and how it is called:
+
+```python
+ def zone_status_change_handler(zone_number, zone_status):
+ print(zone_number, zone_status)
+
+ elk.add_handler('ZC', zone_status_change_handler)
+```
+
+The above code registers a callback for 'ZC' (Elk zone status change)
+messages. When a ZC message is received the handler functions are called
+with the zone_number and zone_status.
+
+There are a number of pseudo-handlers that act like the handlers. These are
+called when events happen. The pseudo-handlers are:
+
+- `connect`: When a successful connection to the ElkM1 is completed.
+- `disconnect`: When a connection to a panel is disconnected.
+- `login`: When a login is made to the panel (using `elks://` connection mode.
+ A single boolean parameter is passed `succeeded`.
+- `sync_complete`: When the panel has completed synchonizing all its elements.
+- `timeout`: When a send of a message to the ElkM1 times out (fails to send).
+- `unknown`: When a message from the ElkM1 is received and the library does
+ not have a method to decode the message. The message is passed to this handler
+ and can be decoded outside of the library.
+
+## Utilities
+
+The `bin` directory of the library has one utility program and
+a couple of example uses of the library.
+
+### `mkdoc`
+
+The utility `mkdoc` creates a Markdown table of the list of Elk
+messages with a check mark for those messages have encoders/decoders
+and an X for those messages are not planned to be implemented.
+There are no parameters to `mkdoc`. It outputs to stdout.
+The data for the report comes from the ElkM1 library code mostly.
+A couple of things are hard coded in the mkdoc script, notably
+the "no plans to implement" list.
+
+### `simple`
+
+The `simple` Python script is a trivial use of the ElkM1 library.
+It connects to the panel, syncs to internal memory, and continues
+listening for any messages from the panel. The URL of the ElkM1 to
+connect to is retrieved from an environment variable named `ELKM1_URL`.
+
+### `elk`
+
+The `elk` Python script is a bit of a command interpretor. It can run in
+two modes. Non-interactive mode is the default. Just run the `elk` command.
+The non-interactive mode is similar to `simple` except there are a
+couple of message handlers (`timeout` and `unknown` handlers).
+
+The `elk` can also be run in interactive mode by invoking it by
+`elk -i`. In this mode is uses curses (full screen use of the terminal)
+that has a command line and an output window. `TAB` switches between
+the command line and output windows. In the output window the arrow keys
+and scrollwheel scroll the contents of the window.
+
+In the command line when running `elk -i` there are a
+number of commands. Start with `help`. Then `help <command>` for
+details on each command. In general there are commands to dump the internal
+state of elements and to invoke any of the encoders to send a message
+to the Elk panel.
+
+For example, `light <4, 8, 12-14` would invoke the `__str__` method
+for the light element to print the cached info for lights 0-3, 8, and 12-14.
+
+Another example would be `pf 3` which issues the pf (Turn light off)
+command for light number 3 (light 4 on the panel -- remember 0
+versus 1 base).
+
+All of the commands that send messages to the panel are automatically
+discovered and are all the XX_encode functions in the ``elkm1_lib.message``
+module. The docstring and the XX_encode's parameters are shown as part
+of the help.
+
+## Development
+
+This project uses [poetry](https://poetry.eustace.io/) for development dependencies. Installation instructions are on their website.
+
+To get started developing:
+
+```
+git clone https://github.com/gwww/elkm1.git
+cd elkm1
+poetry install
+poetry shell # Or activate the created virtual environment
+make test # to ensure everything installed properly
+```
+
+There is a `Makefile` in the root directory as well. The `make` command
+followed by one of the targets in the `Makefile` can be used. If you don't
+have or wish to use `make` the `Makefile` serves as examples of common
+commands that can be run.
+
+## Reporting a Bug
+
+No problem ;) — report the bugs! But, logs are most often required. If you
+are using Home Assistant, which is about the only use I'm aware of for
+this library, then add the following to your `configuration.yaml`:
+```
+logger:
+ default: info
+ logs:
+ custom_components.elkm1: debug
+ elkm1_lib: debug
+```
+
+Do everything in your power to trim to logs down to their smallest. One way is
+to reproduce your problem quickly so that few other logs are not generated in
+between. Another recommendation is to use the simplest configuration that you
+can think of to reproduce the problem.
+
+Can you reproduce the problem in other ways? If this is a problem that is
+being experienced while using Home Assistant try using the `Services` in `Developer Tools`.
+
+Sometime logs may have sensitive information in them. You may want to
+scan your logs for that info and "X" it out. In addition, you can send logs
+directly to me. Support email is in the `pyproject.toml` file. You may also
+send a link to somewhere you've stored/shared the file (DropBox for example).
+
+
+
+%package -n python3-elkm1-lib
+Summary: Library for interacting with ElkM1 alarm/automation panel.
+Provides: python-elkm1-lib
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%description -n python3-elkm1-lib
+# Python ElkM1 library
+
+[![PyPI version](https://badge.fury.io/py/elkm1-lib.svg)](https://badge.fury.io/py/elkm1-lib)
+[![CI](https://github.com/gwww/elkm1/actions/workflows/code-quality.yml/badge.svg)](https://github.com/gwww/elkm1/actions/workflows/code-quality.yml)
+[![Downloads](https://pepy.tech/badge/elkm1-lib)](https://pepy.tech/project/elkm1-lib)
+[![License](https://img.shields.io/github/license/mashape/apistatus.svg)](https://pypi.org/project/elkm1_lib/)
+
+Library for interacting with ElkM1 alarm/automation panel.
+
+https://github.com/gwww/elkm1
+
+## Requirements
+
+- Python 3.9 (or higher)
+
+## Description
+
+This package is created as a library to interact with an ElkM1 alarm/automation
+pattern. The motivation to write this was to use with the Home Assistant
+automation platform. The library can be used for writing other ElkM1 integration
+applications. The IO with the panel is asynchronous over TCP or over the
+serial port.
+
+## Installation
+
+```bash
+ $ pip install elkm1_lib
+```
+
+## Overview
+
+Basic connection to the Elk panel:
+
+```python
+ from elkm1_lib import Elk
+ import logging
+
+ # Print to STDOUT
+ LOG = logging.getLogger(__name__)
+ logging.basicConfig(level=logging.DEBUG, format='%(message)s')
+
+ # Connect to elk
+ elk = Elk({'url': 'elk://192.168.1.100'})
+ elk.connect()
+ elk.run()
+```
+
+The above will connect to the Elk panel at IP address 192.168.1.100. the `elk://`
+prefix specifies that the connect is plaintext. Alternatively, `elks://` will
+connect over TLS. In this case a userid and password must be specified
+and the call to `Elk` changes to:
+
+```python
+ elk = Elk(
+ {'url': 'elks://192.168.1.100', 'userid': 'test', 'password': 'pass'}
+ )
+```
+
+The following ElkM1 connection protocols are supported:
+- serial:// - Serial port;
+- elk:// - Elk M1XEP Ethernet, non-secure
+- elks:// - Elk M1XEP Ethernet, secure, TLS 1.0
+- elksv1_0:// - Elk M1XEP Ethernet, secure, TLS 1.0, supported on M1XEP version < 2.0.46
+- elksv1_2:// - Elk M1XEP Ethernet, secure, TLS 1.2, supported on M1XEP version = 2.0.46
+- elksv1_3:// - Elk M1XEP Ethernet, secure, TLS 1.2, not yet supported on M1XEP, reserved for future
+
+A username and password are required for any of the secure modes.
+
+To see working example code take a look at the script `bin/simple`.
+
+The `Elk` object supports the concept of `Elements`. An `Element`
+is the base class representation of `Zones`, `Lights`, etc. So, for
+example there is a list of zones: `elk.zones` and each zone can be
+accessed by `elk.zones[index]`. Each element has a `__str__`
+representation so that it is easy to print its contents.
+
+All `Elements` are referenced starting at 0. Even though the Elk panel
+refers to, for example, zones 1-208, the library references them
+as zones 0-207. All translation from base 0 to 1 and vice-versa is
+handled internally in the `elkm1_lib.message` module.
+
+After creating the `Elk` object and connecting to the panel the
+library code will synchronize all the elements to the data from the Elk panel.
+
+Many Elk messages are handled by the library, caching their contents. When a
+message causes a change to an attribute of an `Element`, registered
+callbacks are called so that user use of the library can be notified
+of changing elements. The following user code shows registering a callback:
+
+```python
+ def call_me(element, changeset):
+ print(changeset)
+
+ for zone_number in range(Max.ZONES.value):
+ elk.zones[zone_number].add_callback(call_me)
+```
+
+The library encodes, decodes, and processes messages to/from the
+Elk panel. All the encoding and decoding is done in `elkm1_lib.message` module.
+
+Messages received are handled with callbacks. The library
+internally registers callbacks so that decoded messages
+can be used to update an `Element`. The user of the
+library may also register callbacks. Any particular message
+may have multiple callbacks.
+
+When the message is received it is decoded
+and some validation is done. The message handler is called
+with the fields of from the decoded message. Each type of
+message has parameters that match the message type. All handler parameters
+are named parameters.
+
+Here is an example of a message handler being registered and how it is called:
+
+```python
+ def zone_status_change_handler(zone_number, zone_status):
+ print(zone_number, zone_status)
+
+ elk.add_handler('ZC', zone_status_change_handler)
+```
+
+The above code registers a callback for 'ZC' (Elk zone status change)
+messages. When a ZC message is received the handler functions are called
+with the zone_number and zone_status.
+
+There are a number of pseudo-handlers that act like the handlers. These are
+called when events happen. The pseudo-handlers are:
+
+- `connect`: When a successful connection to the ElkM1 is completed.
+- `disconnect`: When a connection to a panel is disconnected.
+- `login`: When a login is made to the panel (using `elks://` connection mode.
+ A single boolean parameter is passed `succeeded`.
+- `sync_complete`: When the panel has completed synchonizing all its elements.
+- `timeout`: When a send of a message to the ElkM1 times out (fails to send).
+- `unknown`: When a message from the ElkM1 is received and the library does
+ not have a method to decode the message. The message is passed to this handler
+ and can be decoded outside of the library.
+
+## Utilities
+
+The `bin` directory of the library has one utility program and
+a couple of example uses of the library.
+
+### `mkdoc`
+
+The utility `mkdoc` creates a Markdown table of the list of Elk
+messages with a check mark for those messages have encoders/decoders
+and an X for those messages are not planned to be implemented.
+There are no parameters to `mkdoc`. It outputs to stdout.
+The data for the report comes from the ElkM1 library code mostly.
+A couple of things are hard coded in the mkdoc script, notably
+the "no plans to implement" list.
+
+### `simple`
+
+The `simple` Python script is a trivial use of the ElkM1 library.
+It connects to the panel, syncs to internal memory, and continues
+listening for any messages from the panel. The URL of the ElkM1 to
+connect to is retrieved from an environment variable named `ELKM1_URL`.
+
+### `elk`
+
+The `elk` Python script is a bit of a command interpretor. It can run in
+two modes. Non-interactive mode is the default. Just run the `elk` command.
+The non-interactive mode is similar to `simple` except there are a
+couple of message handlers (`timeout` and `unknown` handlers).
+
+The `elk` can also be run in interactive mode by invoking it by
+`elk -i`. In this mode is uses curses (full screen use of the terminal)
+that has a command line and an output window. `TAB` switches between
+the command line and output windows. In the output window the arrow keys
+and scrollwheel scroll the contents of the window.
+
+In the command line when running `elk -i` there are a
+number of commands. Start with `help`. Then `help <command>` for
+details on each command. In general there are commands to dump the internal
+state of elements and to invoke any of the encoders to send a message
+to the Elk panel.
+
+For example, `light <4, 8, 12-14` would invoke the `__str__` method
+for the light element to print the cached info for lights 0-3, 8, and 12-14.
+
+Another example would be `pf 3` which issues the pf (Turn light off)
+command for light number 3 (light 4 on the panel -- remember 0
+versus 1 base).
+
+All of the commands that send messages to the panel are automatically
+discovered and are all the XX_encode functions in the ``elkm1_lib.message``
+module. The docstring and the XX_encode's parameters are shown as part
+of the help.
+
+## Development
+
+This project uses [poetry](https://poetry.eustace.io/) for development dependencies. Installation instructions are on their website.
+
+To get started developing:
+
+```
+git clone https://github.com/gwww/elkm1.git
+cd elkm1
+poetry install
+poetry shell # Or activate the created virtual environment
+make test # to ensure everything installed properly
+```
+
+There is a `Makefile` in the root directory as well. The `make` command
+followed by one of the targets in the `Makefile` can be used. If you don't
+have or wish to use `make` the `Makefile` serves as examples of common
+commands that can be run.
+
+## Reporting a Bug
+
+No problem ;) — report the bugs! But, logs are most often required. If you
+are using Home Assistant, which is about the only use I'm aware of for
+this library, then add the following to your `configuration.yaml`:
+```
+logger:
+ default: info
+ logs:
+ custom_components.elkm1: debug
+ elkm1_lib: debug
+```
+
+Do everything in your power to trim to logs down to their smallest. One way is
+to reproduce your problem quickly so that few other logs are not generated in
+between. Another recommendation is to use the simplest configuration that you
+can think of to reproduce the problem.
+
+Can you reproduce the problem in other ways? If this is a problem that is
+being experienced while using Home Assistant try using the `Services` in `Developer Tools`.
+
+Sometime logs may have sensitive information in them. You may want to
+scan your logs for that info and "X" it out. In addition, you can send logs
+directly to me. Support email is in the `pyproject.toml` file. You may also
+send a link to somewhere you've stored/shared the file (DropBox for example).
+
+
+
+%package help
+Summary: Development documents and examples for elkm1-lib
+Provides: python3-elkm1-lib-doc
+%description help
+# Python ElkM1 library
+
+[![PyPI version](https://badge.fury.io/py/elkm1-lib.svg)](https://badge.fury.io/py/elkm1-lib)
+[![CI](https://github.com/gwww/elkm1/actions/workflows/code-quality.yml/badge.svg)](https://github.com/gwww/elkm1/actions/workflows/code-quality.yml)
+[![Downloads](https://pepy.tech/badge/elkm1-lib)](https://pepy.tech/project/elkm1-lib)
+[![License](https://img.shields.io/github/license/mashape/apistatus.svg)](https://pypi.org/project/elkm1_lib/)
+
+Library for interacting with ElkM1 alarm/automation panel.
+
+https://github.com/gwww/elkm1
+
+## Requirements
+
+- Python 3.9 (or higher)
+
+## Description
+
+This package is created as a library to interact with an ElkM1 alarm/automation
+pattern. The motivation to write this was to use with the Home Assistant
+automation platform. The library can be used for writing other ElkM1 integration
+applications. The IO with the panel is asynchronous over TCP or over the
+serial port.
+
+## Installation
+
+```bash
+ $ pip install elkm1_lib
+```
+
+## Overview
+
+Basic connection to the Elk panel:
+
+```python
+ from elkm1_lib import Elk
+ import logging
+
+ # Print to STDOUT
+ LOG = logging.getLogger(__name__)
+ logging.basicConfig(level=logging.DEBUG, format='%(message)s')
+
+ # Connect to elk
+ elk = Elk({'url': 'elk://192.168.1.100'})
+ elk.connect()
+ elk.run()
+```
+
+The above will connect to the Elk panel at IP address 192.168.1.100. the `elk://`
+prefix specifies that the connect is plaintext. Alternatively, `elks://` will
+connect over TLS. In this case a userid and password must be specified
+and the call to `Elk` changes to:
+
+```python
+ elk = Elk(
+ {'url': 'elks://192.168.1.100', 'userid': 'test', 'password': 'pass'}
+ )
+```
+
+The following ElkM1 connection protocols are supported:
+- serial:// - Serial port;
+- elk:// - Elk M1XEP Ethernet, non-secure
+- elks:// - Elk M1XEP Ethernet, secure, TLS 1.0
+- elksv1_0:// - Elk M1XEP Ethernet, secure, TLS 1.0, supported on M1XEP version < 2.0.46
+- elksv1_2:// - Elk M1XEP Ethernet, secure, TLS 1.2, supported on M1XEP version = 2.0.46
+- elksv1_3:// - Elk M1XEP Ethernet, secure, TLS 1.2, not yet supported on M1XEP, reserved for future
+
+A username and password are required for any of the secure modes.
+
+To see working example code take a look at the script `bin/simple`.
+
+The `Elk` object supports the concept of `Elements`. An `Element`
+is the base class representation of `Zones`, `Lights`, etc. So, for
+example there is a list of zones: `elk.zones` and each zone can be
+accessed by `elk.zones[index]`. Each element has a `__str__`
+representation so that it is easy to print its contents.
+
+All `Elements` are referenced starting at 0. Even though the Elk panel
+refers to, for example, zones 1-208, the library references them
+as zones 0-207. All translation from base 0 to 1 and vice-versa is
+handled internally in the `elkm1_lib.message` module.
+
+After creating the `Elk` object and connecting to the panel the
+library code will synchronize all the elements to the data from the Elk panel.
+
+Many Elk messages are handled by the library, caching their contents. When a
+message causes a change to an attribute of an `Element`, registered
+callbacks are called so that user use of the library can be notified
+of changing elements. The following user code shows registering a callback:
+
+```python
+ def call_me(element, changeset):
+ print(changeset)
+
+ for zone_number in range(Max.ZONES.value):
+ elk.zones[zone_number].add_callback(call_me)
+```
+
+The library encodes, decodes, and processes messages to/from the
+Elk panel. All the encoding and decoding is done in `elkm1_lib.message` module.
+
+Messages received are handled with callbacks. The library
+internally registers callbacks so that decoded messages
+can be used to update an `Element`. The user of the
+library may also register callbacks. Any particular message
+may have multiple callbacks.
+
+When the message is received it is decoded
+and some validation is done. The message handler is called
+with the fields of from the decoded message. Each type of
+message has parameters that match the message type. All handler parameters
+are named parameters.
+
+Here is an example of a message handler being registered and how it is called:
+
+```python
+ def zone_status_change_handler(zone_number, zone_status):
+ print(zone_number, zone_status)
+
+ elk.add_handler('ZC', zone_status_change_handler)
+```
+
+The above code registers a callback for 'ZC' (Elk zone status change)
+messages. When a ZC message is received the handler functions are called
+with the zone_number and zone_status.
+
+There are a number of pseudo-handlers that act like the handlers. These are
+called when events happen. The pseudo-handlers are:
+
+- `connect`: When a successful connection to the ElkM1 is completed.
+- `disconnect`: When a connection to a panel is disconnected.
+- `login`: When a login is made to the panel (using `elks://` connection mode.
+ A single boolean parameter is passed `succeeded`.
+- `sync_complete`: When the panel has completed synchonizing all its elements.
+- `timeout`: When a send of a message to the ElkM1 times out (fails to send).
+- `unknown`: When a message from the ElkM1 is received and the library does
+ not have a method to decode the message. The message is passed to this handler
+ and can be decoded outside of the library.
+
+## Utilities
+
+The `bin` directory of the library has one utility program and
+a couple of example uses of the library.
+
+### `mkdoc`
+
+The utility `mkdoc` creates a Markdown table of the list of Elk
+messages with a check mark for those messages have encoders/decoders
+and an X for those messages are not planned to be implemented.
+There are no parameters to `mkdoc`. It outputs to stdout.
+The data for the report comes from the ElkM1 library code mostly.
+A couple of things are hard coded in the mkdoc script, notably
+the "no plans to implement" list.
+
+### `simple`
+
+The `simple` Python script is a trivial use of the ElkM1 library.
+It connects to the panel, syncs to internal memory, and continues
+listening for any messages from the panel. The URL of the ElkM1 to
+connect to is retrieved from an environment variable named `ELKM1_URL`.
+
+### `elk`
+
+The `elk` Python script is a bit of a command interpretor. It can run in
+two modes. Non-interactive mode is the default. Just run the `elk` command.
+The non-interactive mode is similar to `simple` except there are a
+couple of message handlers (`timeout` and `unknown` handlers).
+
+The `elk` can also be run in interactive mode by invoking it by
+`elk -i`. In this mode is uses curses (full screen use of the terminal)
+that has a command line and an output window. `TAB` switches between
+the command line and output windows. In the output window the arrow keys
+and scrollwheel scroll the contents of the window.
+
+In the command line when running `elk -i` there are a
+number of commands. Start with `help`. Then `help <command>` for
+details on each command. In general there are commands to dump the internal
+state of elements and to invoke any of the encoders to send a message
+to the Elk panel.
+
+For example, `light <4, 8, 12-14` would invoke the `__str__` method
+for the light element to print the cached info for lights 0-3, 8, and 12-14.
+
+Another example would be `pf 3` which issues the pf (Turn light off)
+command for light number 3 (light 4 on the panel -- remember 0
+versus 1 base).
+
+All of the commands that send messages to the panel are automatically
+discovered and are all the XX_encode functions in the ``elkm1_lib.message``
+module. The docstring and the XX_encode's parameters are shown as part
+of the help.
+
+## Development
+
+This project uses [poetry](https://poetry.eustace.io/) for development dependencies. Installation instructions are on their website.
+
+To get started developing:
+
+```
+git clone https://github.com/gwww/elkm1.git
+cd elkm1
+poetry install
+poetry shell # Or activate the created virtual environment
+make test # to ensure everything installed properly
+```
+
+There is a `Makefile` in the root directory as well. The `make` command
+followed by one of the targets in the `Makefile` can be used. If you don't
+have or wish to use `make` the `Makefile` serves as examples of common
+commands that can be run.
+
+## Reporting a Bug
+
+No problem ;) — report the bugs! But, logs are most often required. If you
+are using Home Assistant, which is about the only use I'm aware of for
+this library, then add the following to your `configuration.yaml`:
+```
+logger:
+ default: info
+ logs:
+ custom_components.elkm1: debug
+ elkm1_lib: debug
+```
+
+Do everything in your power to trim to logs down to their smallest. One way is
+to reproduce your problem quickly so that few other logs are not generated in
+between. Another recommendation is to use the simplest configuration that you
+can think of to reproduce the problem.
+
+Can you reproduce the problem in other ways? If this is a problem that is
+being experienced while using Home Assistant try using the `Services` in `Developer Tools`.
+
+Sometime logs may have sensitive information in them. You may want to
+scan your logs for that info and "X" it out. In addition, you can send logs
+directly to me. Support email is in the `pyproject.toml` file. You may also
+send a link to somewhere you've stored/shared the file (DropBox for example).
+
+
+
+%prep
+%autosetup -n elkm1-lib-2.2.2
+
+%build
+%py3_build
+
+%install
+%py3_install
+install -d -m755 %{buildroot}/%{_pkgdocdir}
+if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
+if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
+if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
+if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
+pushd %{buildroot}
+if [ -d usr/lib ]; then
+ find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/lib64 ]; then
+ find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/bin ]; then
+ find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/sbin ]; then
+ find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+touch doclist.lst
+if [ -d usr/share/man ]; then
+ find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst
+fi
+popd
+mv %{buildroot}/filelist.lst .
+mv %{buildroot}/doclist.lst .
+
+%files -n python3-elkm1-lib -f filelist.lst
+%dir %{python3_sitelib}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Wed May 10 2023 Python_Bot <Python_Bot@openeuler.org> - 2.2.2-1
+- Package Spec generated
diff --git a/sources b/sources
new file mode 100644
index 0000000..7b0765b
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+3a7a3c857a010b58c095b72e4dfa907b elkm1_lib-2.2.2.tar.gz