astra/iphone-encoder-counter
A CR2450-powered MSP430 FRAM counter combines an always-on dual-channel TMR rotation sensor, pushbutton input, and ST25DV NFC tag with an integrated tuned printed antenna and I²C/GPIO interface.
- Version
- 1.0.3
- License
- unset
- Stars
- 0
scripts/check_parts.py
"""Capture fresh JLC catalog results without placing an order."""
from pathlib import Path
import concurrent.futures,subprocess,json,datetime
root=Path(__file__).resolve().parents[1]
parts=json.loads((root/'selected-parts.json').read_text())
ids=sorted({x[0] for x in parts.values()}|{'C191026','C5267456','C470426','C964809','C17208043'})
def query(c):
p=subprocess.run(['tsci','search','--jlcpcb','--json',c],capture_output=True,text=True,check=True)
return c,json.loads(p.stdout)
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as pool:results=dict(pool.map(query,ids))
out={'checked_at_utc':datetime.datetime.now(datetime.timezone.utc).isoformat(),'source':'tsci search --jlcpcb --json','parts':results}
(root/'jlc-catalog-check.json').write_text(json.dumps(out,indent=2)+'\n')
for c,r in results.items():
p=r['results'][0] if r['results'] else None
print(c,p['mfr'] if p else 'not found',p.get('stock') if p else 'separate source')