Metadata-Version: 2.4
Name: nmicheck
Version: 0.4.0
Summary: Functions to validate National Metering Identifiers (NMIs)
Author-email: Alex Guinman <alex@guinman.id.au>
Requires-Python: >=3.10
Description-Content-Type: text/markdown
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.14
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.10
Classifier: Operating System :: OS Independent
License-File: LICENSE
Requires-Dist: pytest >=2.7.3 ; extra == "test"
Requires-Dist: pytest-cov ; extra == "test"
Project-URL: Source, https://github.com/aguinane/NMI-Checksum/
Provides-Extra: test

# NMI-Checksum

[![PyPI version](https://img.shields.io/pypi/pyversions/nmicheck)][pypi]
[![PyPi downloads](https://img.shields.io/pypi/dw/nmicheck)][pypi]

[pypi]: https://pypi.org/project/nmicheck/


A library to validate National Metering Identifiers (NMIs)

The validation rules are as per the Australian [National Metering Identifier Procedure](https://aemo.com.au/Electricity/National-Electricity-Market-NEM/Retail-and-metering/-/media/EBA9363B984841079712B3AAD374A859.ashx).

## Usage

```python
from nmicheck import nmi_checksum

checksum = nmi_checksum("QAAAVZZZZZ")
print(checksum)  # 3
```

```python
from nmicheck import nmi_checksum_valid

print(nmi_checksum_valid("QAAAVZZZZZ3"))  # True
print(nmi_checksum_valid("QAAAVZZZZZ0"))  # False
```

```python
from nmicheck import long_nmi, short_nmi

print(long_nmi("NMI00012345"))    # NMI000123458
print(short_nmi("NMI000123458"))  # NMI00012345
```

If you want to obfuscate a NMI (such as for privacy reasons) there is a helper function for that.

```python
from nmicheck import obfuscate_nmi
print(obfuscate_nmi("NMI00012345", salt="secret"))  # 0E6816DCBA3
print(obfuscate_nmi("NMI00012345", salt="other"))   # 756C6E4B029
```

You can also look up the participant code for a particular NMI (which DNSP or TNSP) based on the [NMI Allocation List](https://www.aemo.com.au/-/media/Files/Electricity/NEM/Retail_and_Metering/Metering-Procedures/NMI-Allocation-List.pdf).

```python
from nmicheck import nmi_participant

participant = nmi_participant("6102000000")
print(participant)  # CITIPP

participant = nmi_participant("3202000000")
print(participant)  # PLINKP
```
