pamoja-codec
CBOR, JSON, and raw codecs behind one trait, and batch packing for metered links: delta and varint for integers, and a quantizer for f32 readings. One capability of pamoja, one memory-safe Rust core with bindings for TypeScript, Python, and C#.
Install
pip install pamoja-codec
from pamoja import codec
This pulls in pamoja-native, the compiled engine. pip install pamoja is the whole framework in one package.
Example
The script the test suite runs, spliced here as it ran.
From bindings/python/guides/codec.py:
import json
import math
from pamoja.codec import Quantizer, from_cbor, pack_samples, to_cbor, unpack_samples
from pamoja.core import PamojaError
from pamoja.lora import plan_for
# The gauge reports over LoRaWAN in the US915 plan, at the slowest data rate because it
# reaches farthest. An uplink there carries only a few bytes of payload.
budget = plan_for("US915").max_payload(0).application
def fits(size: int) -> str:
return "fits one uplink" if size <= budget else "too big for one uplink"
print(f"uplink carries {budget} bytes at the slowest US915 data rate")
# One reading as the JSON a web service would take. CBOR carries the same document in
# fewer bytes, but every key name still rides along with every reading.
reading = {"depth_cm": 142.5, "air_c": -6.5, "battery_mv": 3712}
as_json = json.dumps(reading, separators=(",", ":")).encode()
cbor = to_cbor(reading)
print(f"json {len(as_json)} bytes, {fits(len(as_json))}")
print(f"cbor {len(cbor)} bytes, {fits(len(cbor))}")
print(f"cbor reads back as {json.dumps(from_cbor(cbor), separators=(',', ':'))}")
# A batch the gauge and the server agree on needs no key names. Six hourly depths, kept to
# the millimeter, pack to a count, the first depth, and five small steps.
quantizer = Quantizer(10)
depths = [142.5, 143.8, 145.2, 146.0, 145.7, 145.5]
depth_batch = quantizer.encode(depths)
depth_bytes = len(depth_batch)
print(f"depths {len(depths)} readings in {depth_bytes} bytes, {fits(depth_bytes)}")
depths_back = [f"{depth:.1f}" for depth in quantizer.decode(depth_batch)]
print(f"depths read back as {', '.join(depths_back)}")
# Battery millivolts are whole numbers already, so they pack with no scale, and a falling
# voltage packs as small as a rising one.
battery = [3712, 3709, 3705, 3702, 3698, 3695]
battery_batch = pack_samples(battery)
battery_bytes = len(battery_batch)
print(f"battery {len(battery)} readings in {battery_bytes} bytes, {fits(battery_bytes)}")
print(f"battery reads back as {', '.join(map(str, unpack_samples(battery_batch)))}")
# Heavy snowfall can swallow the sensor's echo, leaving no depth at all. The quantizer
# refuses the batch rather than send the gap as a depth.
try:
quantizer.encode([145.5, math.nan])
except PamojaError as error:
print(f"depths refused a batch with a missing depth: {error}")
The same capability in every language
| Language | Package | Reference |
|---|---|---|
| Rust | pamoja-codec |
reference, docs.rs, install |
| TypeScript | @pamoja/codec |
reference, install |
| Python | pamoja-codec |
reference, install |
| C# | Pamoja.Codec |
reference, install |
Documentation
pamoja.codecreference, every class and function in this module.- The Codecs guide, with the same example in Rust, TypeScript, and C#.
- Every capability, and the install page.
License
MIT
Release files for pamoja-codec 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pamoja_codec-0.2.0.tar.gz | 4.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pamoja_codec-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 10.5 kB
Release files / pamoja_codec-0.2.0.tar.gz
| Download URL | pamoja_codec-0.2.0.tar.gz |
|---|---|
| Size | 4.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7b4e64168dfbc44ea149371879f2f4eb7b31d0d4c3e5bba637562f9c3f16ff96
|
|
BLAKE2b-256 checksum How to use checksums |
6fc76ae3f2ce5ae9581a5ce0be6e3a875829edb8f30332dc9b01aa6363ab0724
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.15
|
Release files / pamoja_codec-0.2.0-py3-none-any.whl
| Download URL | pamoja_codec-0.2.0-py3-none-any.whl |
|---|---|
| Size | 5.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a9772a15866a5c7927e26dfadd3abaa57db773689b8fee3dfdf3423945813f4b
|
|
BLAKE2b-256 checksum How to use checksums |
0ea27fa717861a69f26487f8abd6ed70b9cdfd4ae34507b5c07deea1d994fd7e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.15
|