feat(application): integrate measured-load ingestion training and planner source
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
"""Explicit identity/provenance for the OBSERVATION-ONLY Symcon receiver.
|
||||
This is not a dispatch permit and does not make a shadow plan executable locally.
|
||||
"""
|
||||
from copy import deepcopy
|
||||
|
||||
|
||||
def control_context(operation):
|
||||
assets = {}
|
||||
for b in operation['batteries']:
|
||||
rearm = b.get('rearmSocPercent')
|
||||
assets[b['id']] = {
|
||||
'capacityKwh': b['capacityKwh'],
|
||||
'minSocPercent': b['minSocPercent'],
|
||||
'maxSocPercent': b['maxSocPercent'],
|
||||
'physicalMinSocPercent': b.get('physicalMinSocPercent', 0.0),
|
||||
'rearmSocPercent': b['minSocPercent'] if rearm is None else rearm,
|
||||
'gridCharging': b['gridCharging'],
|
||||
}
|
||||
return {'batteries': assets, 'limits': deepcopy(operation['limits'])}
|
||||
|
||||
|
||||
def provenance(inputs):
|
||||
# Capture BEFORE optimization. Never attach a newer operation to an older plan.
|
||||
return {'inputRefs': {kind: inputs[kind]['eventId'] for kind in ('operation', 'forecast', 'tariffs')},
|
||||
'controlContext': control_context(inputs['operation'])}
|
||||
Reference in New Issue
Block a user