Often this is modeled just with conductive heat transfer through surface connections, but if you want to have airflow across the zones you probably want to use ZoneMixing. Here is another post on ZoneMixing. OpenStudio doesn't currently support ZoneMixing, unless you add it using an EnergyPlus measure. There aren't any published yet, but I did a proof of concept a while ago but I didn't have a chance to publish it. I'll post link here if II post it to BCL, but below is the basic part of the code that adds the zone mixing object. You can see it is basically just the raw text for the IDF object with variables injected into it. The variables could come from user arguments. You could add multiple instances of a measure like this to make more complex models. You could also try to use the air wall construction to identify zones pairs where mixing should occur.
# add a new zone mixing to the model
zone_mixing_string = "
ZoneMixing,
#{zone_name} Zone Mixing, !- Name
#{zone_name}, !- Zone Name
#{schedule_name}, !- Schedule Name
#{zm_calc_method}, !- Design Flow Rate Calculation Method
#{design_level_si}, !- Design Level
, !- Volume Flow Rate per Area {m3/s/m2}
, !- Volume Flow Rate Per Person {m3/s/person}
, !- Air Changes per Hour {ACH}
#{source_zone_name}, !- Source Zone Name
0.0; !- Delta Temperature
"
idfObject = OpenStudio::IdfObject::load(zone_mixing_string)
object = idfObject.get
wsObject = workspace.addObject(object)
new_zone_mixing_object = wsObject.get