Skip to main content

Energy inference and EV charging ETA utilities (SoC-based).

Project description

stroomer

Stroomer

PyPI Downloads Python versions License types: typed Ask questions

NumPy-style quick links:


Utilities untuk appliance inference (menebak perangkat yang menyala dari V, I, PF, P) dan EV charging ETA (berbasis SoC).

  • Catalog built-in: tiap perangkat punya watt, pf, type, phase, standby_w, surge_mult.
  • Prediksi multi-fitur: cocokkan P, I, PF (bukan power saja).
  • Standby-aware: total daya = standby seluruh unit + kontribusi aktif unit ON.
  • SoC ETA: prediksi durasi & waktu selesai charging berbasis kapasitas, target SoC, efisiensi.

Repo: https://github.com/foldadjo/stroomer


Tabel Isi


Install

Dari PyPI:

pip install stroomer

(Opsional) Dari TestPyPI:

pip install -i https://test.pypi.org/simple --extra-index-url https://pypi.org/simple stroomer

Disarankan Python 3.9+.


Quickstart

Appliance inference

from stroomer import StroomerPredictor

p = StroomerPredictor()

# Lihat daftar elektronik di katalog (nama → spesifikasi)
catalog = p.electronic_list()
# print(catalog)

# Daftarkan JUMLAH MAKSIMAL unit yang mungkin ADA (nama fleksibel/alias)
p.set_appliances({
    "kipas": 5,
    "lampu_18W": 5,
    "lampu_32W": 5,
    "lampu": 3,
    "TV": 2,
    "Kulkas": 2,
    "AC": 1,
    "ev_charger": 1,
    "mesin_cuci": 1,
    "chrger_motor": 3,  # alias typo → otomatis dipetakan
})

# (Opsional) Sesuaikan katalog untuk site tertentu
p.configure_catalog({
    "ev_charger": {"watt": 3200, "pf": 0.99},
})

# Snapshot meter
V, I, PF, P = 220, 6, 0.95, 2301  # jika P real tersedia, berikan (diprioritaskan)

out = p.predict(voltage=V, current=I, power_factor=PF, power=P)

print("Perangkat ON :", out["on"])        # contoh: {"lampu_18w": 3, "kipas_berdiri": 1}
print("Target       :", out["target"])     # {"P":..., "I":..., "PF":..., "V":...}
print("Prediksi     :", out["pred"])       # {"P":..., "I":..., "PF":...}
print("Loss         :", out["loss"])       # skor gabungan (semakin kecil semakin baik)
print("RelErr P     :", out["rel_error_P"])

Jika V*I*PF dan P tidak konsisten (lumrah antar meter), model memprioritaskan P sambil tetap menilai I & PF untuk kombinasi yang masuk akal.


EV charging ETA

from stroomer import ChargingTimePredictor

eta = ChargingTimePredictor(
    capacity_kwh=50,  # kapasitas baterai
    target_soc=90,    # target SoC (%)
    efficiency=0.92   # efisiensi pengisian
)

result = eta.predict(power=8000, SoC=30)
print(result)
# -> {"FinishDuration":"03:14","FinishTime":"2025-08-18T13:25:00+00:00"}

API Ringkas

StroomerPredictor

  • electronic_list() -> dict
    Katalog efektif (watt, pf, type, phase, standby_w, surge_mult).

  • configure_catalog(overrides: dict)
    Override sebagian atribut, mis. {"ev_charger": {"watt": 3500, "pf": 0.99}}.

  • set_appliances(counts: dict[str,int])
    Daftarkan jumlah maksimal unit per perangkat di lokasi (nama fleksibel/alias).

  • predict(voltage=None, current=None, power_factor=None, power=None, ...) -> dict
    Mengembalikan:

    {
      "on": {"nama": jumlah_on, ...},
      "target": {"P":..., "I":..., "PF":..., "V":...},
      "pred":   {"P":..., "I":..., "PF":...},
      "loss": float,              # skor gabungan
      "rel_error_P": float        # |P_pred - P_meas| / P_meas
    }
    

ChargingTimePredictor

  • __init__(capacity_kwh, target_soc=90.0, efficiency=0.92)
  • predict(power: W, SoC: %) -> {"FinishDuration": "HH:MM", "FinishTime": ISO8601_UTC}

Konfigurasi & Tuning

  • Bobot loss: menyeimbangkan pentingnya P, I, PF

    p.weights = {"P": 0.6, "I": 0.3, "PF": 0.1}
    
  • Tolerance pruning (relatif di domain P)

    p.tolerance = 0.08  # 8% → pruning lebih agresif
    
  • Batas hard per perangkat

    p.global_count_cap = 30
    

Tips akurasi

  • Sesuaikan pf dan watt di katalog agar mendekati kondisi lapangan via configure_catalog.
  • Berikan P dari meter jika tersedia; jika tidak, berikan kombinasi V, I, PF yang reliabel.
  • set_appliances sebaiknya upper bound realistis, bukan jumlah pasti.

Catatan Akurasi

  • PF tipikal pada katalog adalah nilai rata-rata umum; silakan sesuaikan.
  • Standby-aware: algoritma menghitung baseline standby + kontribusi aktif unit ON.
  • Perbedaan instrumen/pipeline dapat membuat P dan V·I·PF tidak identik—model memadukan semuanya (dengan bobot).

Kontribusi

Kontribusi sangat diterima 🙌
Buka issue atau pull request di:

https://github.com/foldadjo/stroomer

Untuk pengembangan lokal:

git clone https://github.com/foldadjo/stroomer.git
cd stroomer
pip install -U build twine pytest
pip install -e .
pytest -q

Ikuti PEP8 dan tambahkan test untuk setiap fitur/perbaikan.


Lisensi

MIT © Stroomer Team — lihat berkas LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

stroomer-0.1.6.tar.gz (16.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

stroomer-0.1.6-py3-none-any.whl (14.2 kB view details)

Uploaded Python 3

File details

Details for the file stroomer-0.1.6.tar.gz.

File metadata

  • Download URL: stroomer-0.1.6.tar.gz
  • Upload date:
  • Size: 16.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.3

File hashes

Hashes for stroomer-0.1.6.tar.gz
Algorithm Hash digest
SHA256 edd53e1ef4036baa72758c2f8d6d334268419cffdf43b7f8ef1f179b65067ce2
MD5 e178244ab31b63cd30e8e39aecd6809b
BLAKE2b-256 1fc6611eca5a1128f8de8b966476d7547ea17befb47d584ccc5da60661291308

See more details on using hashes here.

File details

Details for the file stroomer-0.1.6-py3-none-any.whl.

File metadata

  • Download URL: stroomer-0.1.6-py3-none-any.whl
  • Upload date:
  • Size: 14.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.3

File hashes

Hashes for stroomer-0.1.6-py3-none-any.whl
Algorithm Hash digest
SHA256 e57793f1a9175de8f2d324b25d5a2584d67d6d05c5092e47e8c640c1fdb7f403
MD5 cba67e983e41999da11c4dfcf7f1f7ac
BLAKE2b-256 943bbde241a36e43d380103e985097c77366de1fe1ed2a16fe6176466bae2339

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page