Integrera natomrade med EnergiCRM
Berika kundregistret med korrekt nätägare och elområde via API.
Use case
Du har en CRM (t.ex. EnergiCRM eller annan) där varje kund har en adress eller ett postnummer. Du vill berika varje kund med:
- Vilket elområde de tillhör (SE1-SE4)
- Vilken nätägare (Ellevio, Vattenfall, E.ON, lokala bolag)
- Energiskattenivå (normal/reducerad)
- EDIEL-ID på nätägaren (för EDIFACT-routing senare)
Lösning: en batch-uppdatering
import requests, psycopg2
API = "https://natomrade.airpipe.ai/api/v1/lookup/postal"
HEADERS = {"X-API-Key": "zk_din_nyckel"}
conn = psycopg2.connect("postgresql://crm:pwd@localhost/energicrm")
with conn.cursor() as cur:
cur.execute("SELECT id, postnr FROM kunder WHERE elomrade IS NULL")
kunder = cur.fetchall()
for kid, postnr in kunder:
r = requests.get(API, params={"code": postnr}, headers=HEADERS, timeout=10)
if r.status_code != 200:
continue
d = r.json()
with conn.cursor() as cur:
cur.execute('''
UPDATE kunder SET
elomrade = %s,
natagare_namn = %s,
natagare_ediel_id = %s,
energiskatt_typ = %s,
berikad_at = NOW()
WHERE id = %s
''', (
d.get("elomrade", {}).get("code"),
(d.get("grid_owner") or {}).get("name"),
(d.get("grid_owner") or {}).get("ediel_id"),
(d.get("energy_tax") or {}).get("rate_type"),
kid,
))
conn.commit()
Throttling
För 10 000 kunder med en free-tier-nyckel (5 000/dygn): det tar 2 dygn. Med starter-tier (20 000/dygn) klart på ~2 timmar.
För att undvika 429:
import time
last = 0
def throttle():
global last
elapsed = time.time() - last
if elapsed < 0.05:
time.sleep(0.05 - elapsed)
last = time.time()
Cache invalidation
Datat ändras sällan — efter sortering ovan kan du köra om hela jobbet 1×/månad. Vid:
- Postnr-byte hos kund → kör om för den kunden
- Nytt postnr-område införs (sällan) → behov av re-run
Konsekvens-check
Innan du sätter datat i produktion: kontrollera fördelningen.
SELECT elomrade, COUNT(*) FROM kunder
WHERE elomrade IS NOT NULL
GROUP BY elomrade ORDER BY elomrade;
Förväntad fördelning för Sverige som helhet är ungefär:
| Område | Andel hushåll |
|---|---|
| SE1 | ~5% |
| SE2 | ~10% |
| SE3 | ~60% |
| SE4 | ~25% |
Avviker det kraftigt — kanske finns en bug i din mappning eller datakällan.