operating_data.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. """显式合成的两份时序样例;与原始检测报告及人工转录夹具独立。"""
  2. import hashlib
  3. import json
  4. from pathlib import Path
  5. from algorithms.main_fan.models import Device, Evidence, FanStateRecord, OperatingSeries
  6. def load_operating_data(directory, *, base_url="http://127.0.0.1:8766"):
  7. result = {'devices':[], 'operating_series':[], 'fan_state_records':[], 'raw_curves':{}}
  8. identity = None
  9. for kind, filename in (('switch-states','mock_switch_states.json'),('airflow','mock_airflow_series.json')):
  10. path = Path(directory)/filename
  11. raw = json.loads(path.read_text(encoding='utf-8'))
  12. if raw.get('schema_version') != 1 or raw.get('data_kind') != 'synthetic':
  13. raise ValueError('模拟时序必须声明 schema_version=1、data_kind=synthetic')
  14. current = (raw['mine_code'],raw['mine_name'])
  15. if identity is not None and current != identity:
  16. raise ValueError('两份模拟时序的矿井身份不一致')
  17. identity = current
  18. result['raw_curves'][kind] = raw
  19. evidence = Evidence(source=base_url.rstrip('/')+'/mock/main-fan/curves/'+kind,
  20. label='主备风机整机开停模拟数据' if kind == 'switch-states' else '主备风机风量模拟数据',
  21. excerpt=raw['description'],sha256=hashlib.sha256(path.read_bytes()).hexdigest(),method='synthetic')
  22. common = {'mine_code':current[0],'mine_name':current[1],'evidence':evidence}
  23. for series in raw['series']:
  24. if kind == 'switch-states':
  25. if series['state_scope'] != 'whole_fan':
  26. raise ValueError('开停样例必须是整机状态')
  27. result['devices'].append(Device(device_code=series['fan_id'],name=series['fan_name'],**common).model_dump(mode='json'))
  28. for sample in series['samples']:
  29. if sample['value'] not in (0,1):
  30. raise ValueError('整机开停状态只允许0或1')
  31. result['fan_state_records'].append(FanStateRecord(fan_id=series['fan_id'],
  32. observed_at=sample['observed_at'],state='running' if sample['value'] == 1 else 'stopped',
  33. complete_fan_state=True,**common).model_dump(mode='json'))
  34. else:
  35. result['operating_series'].append(OperatingSeries(fan_id=series['fan_id'],metric='flow',unit=series['unit'],
  36. sensor_id=series['sensor_id'],mapping_confirmed=series['mapping_confirmed'],samples=series['samples'],
  37. **common).model_dump(mode='json'))
  38. if {d['device_code'] for d in result['devices']} != {s['fan_id'] for s in result['operating_series']}:
  39. raise ValueError('开停和风量样例的两台风机标识不一致')
  40. return result