@@ -203,12 +203,19 @@ project = env_ops.add_ag_wall_to_project(project, area_key, wall)
203203
204204``` python
205205projects = client.list_projects()
206- target = next (p for p in projects if p[" title " ] == " My office" )
206+ target = next (p for p in projects if p[" name " ] == " My office" ) # key is "name", not "title"
207207project_obj = client.get_project(target[" _id" ]) # note the underscore
208208project_obj.project.projectTitle = " My office (revised)"
209209client.update_project(project_id = target[" _id" ], project_data = project_obj)
210210```
211211
212+ ` list_projects() ` returns ** raw, untyped dicts** straight from the API
213+ (no TypedDict enforces the shape). Each entry looks like:
214+ `{"_ id", "name", "energyCode", "status", "sharing", "ownedByMe",
215+ "lastUpdated"}` . The display name is under ` "name"` — there is ** no
216+ ` "title" ` key** (matching on ` "title" ` silently fails with
217+ ` StopIteration ` /` KeyError ` ).
218+
212219` get_project(project_id, mode="json") ` returns a raw dict instead of
213220a ` ComBuilding ` model — handy when you just need the JSON shape.
214221
@@ -247,6 +254,12 @@ else:
247254 ` EnergyCodeOptions.CEZ_90_1_2022 ` . Setting them to raw strings
248255 works at runtime but emits ` PydanticSerializationUnexpectedValue `
249256 warnings every time the model serializes.
257+ - ** There is no ` STEEL_FRAME ` wall type — steel framing maps to
258+ ` METAL_FRAME_* ` .** ` WallTypeOptions ` members are ` WOOD_FRAME_16/24 ` ,
259+ ` METAL_FRAME_16/24 ` , ` METAL_WALL_WO_TB ` , ` METAL_BLDG ` , ` CONCRETE ` ,
260+ ` MASONRY ` , ` OTHER ` (each suffixed ` _AG_WALL ` ). A user asking for a
261+ "steel-frame wall" wants ` WallTypeOptions.METAL_FRAME_16_AG_WALL `
262+ (or ` _24_ ` ).
250263- ** ` COMcheckClient(api_key=...) ` does not auto-read env vars.** No
251264 ` COM_API_KEY ` fallback exists in ` __init__ ` . Pass it explicitly.
252265- ** ` SimulationStatus ` is a known-values catalog, not an exhaustive
@@ -256,6 +269,16 @@ else:
256269 don't crash polling. Only ` SUCCESS ` and ` FAILED ` are guaranteed
257270 terminal — break/raise on those, keep polling for everything
258271 else (don't enumerate non-terminals).
272+ - ** A 500 from ` start_run_simulation ` usually means bad project
273+ data, not a server outage.** All HTTP errors surface as the same
274+ ` COMCheckHTTPError ` — there is no validation-specific exception, so
275+ a payload the engine rejects (e.g. a malformed shape like assigning
276+ a list to an object field, or project state the engine won't
277+ accept) comes back as a bare HTTP 500, indistinguishable from a
278+ real outage. To tell them apart, simulate a fresh
279+ ` get_default_project_template() ` project: if that succeeds, the 500
280+ is your project data, not the server. Inspect
281+ ` COMCheckHTTPError.status_code ` / ` .response_data ` for detail.
259282
260283## When you need more detail
261284
0 commit comments