Repository: NREL/OpenStudio (language: python)

Issue:
API breaking changes to consider
Enhancement Request
--------------

This is meant as a running list of API breaking changes we should consider for a future version.


## Detailed Description

### Getters returning an optional<X> when there is a default in the IDD, or when there is a Ctor harcoded value and no `reset`

- [ ] CoilCoolingDXSingleSpeed: ratedCOP, ratedEvaporatorFanPowerPerVolumeFlowRate, and others return an optional<double> when it should be a double.  The IDD has a default **AND** the ctor still hardcodes the same default... AND there isn't a `reset` function either... 
https://github.com/NREL/OpenStudio/blob/7801af2670f7fdf4f0ea71d9a3288d4bbe256065/src/model/CoilCoolingDXSingleSpeed.hpp#L92-L96
   - ratedCOP
   - ratedEvaporatorFanPowerPerVolumeFlowRate
   - nominalTimeForCondensateRemovalToBegin
   - ratioOfInitialMoistureEvaporationRateAndSteadyStateLatentCapacity
   - maximumCyclingRate
   - latentCapacityTimeConstant
   - evaporativeCondenserEffectiveness
   - crankcaseHeaterCapacity
   - maximumOutdoorDryBulbTemperatureForCrankcaseHeaterOperation
   - basinHeaterCapacity
   - basinHeaterSetpointTemperature
   - **Should we just make all these required-field so we don't need `reset` and `isDefaulted` methods?** Same for CoilCoolingDXTwoSpeed below.

- [ ] CoilCoolingDXTwoSpeed
   - ratedHighSpeedCOP
   - ratedLowSpeedCOP
   - highSpeedEvaporativeCondenserEffectiveness
   - lowSpeedEvaporativeCondenserEffectiveness
   - basinHeaterCapacity (sets a different value between ctors)
   - basinHeaterSetpointTemperature (sets a different value between ctors)

- [x] EvaporativeFluidCooler:SingleSpeed
    - performanceInputMethod (make required-field, and change boost::optional<std::string> to std::string)
    - Cf  #4642

### Others

Hotfix #4644 - VT rules missing for Coil:Cooling:DX:SingleSpeed and TwoSpeed
Issue overview
--------------

cf https://github.com/NREL/OpenStudio/pull/4644#issuecomment-1253829037

## Current Behavior

The reg tests are all OS_ASSERTing because this is missing VT rules.

```
[BOOST_ASSERT] <2> Assertion value failed on line 327 of double openstudio::model::detail::CoilCoolingDXSingleSpeed_Impl::latentCapacityTimeConstant() const in file /Users/julien/Software/Others/OpenStudio/src/model/CoilCoolingDXSingleSpeed.cpp.
[BOOST_ASSERT] <2> Assertion value failed on line 284 of double openstudio::model::detail::CoilCoolingDXSingleSpeed_Impl::nominalTimeForCondensateRemovalToBegin() const in file /Users/julien/Software/Others/OpenStudio/src/model/CoilCoolingDXSingleSpeed.cpp.
[BOOST_ASSERT] <2> Assertion value failed on line 299 of double openstudio::model::detail::CoilCoolingDXSingleSpeed_Impl::ratioOfInitialMoistureEvaporationRateAndSteadyStateLatentCapacity() const in file /Users/julien/Software/Others/OpenStudio/src/model/CoilCoolingDXSingleSpeed.cpp.
[BOOST_ASSERT] <2> Assertion value failed on line 313 of double openstudio::model::detail::CoilCoolingDXSingleSpeed_Impl::maximumCyclingRate() in file /Users/julien/Software/Others/OpenStudio/src/model/CoilCoolingDXSingleSpeed.cpp.
[BOOST_ASSERT] <2> Assertion value failed on line 327 of double openstudio::model::detail::CoilCoolingDXSingleSpeed_Impl::latentCapacityTimeConstant() const in file /Users/julien/Software/Others/OpenStudio/src/model/CoilCoolingDXSingleSpeed.cpp.
```

## Expected Behavior
<!--- Tell us what should happen -->

## Steps to Reproduce
<!-- Provide an unambiguous set of steps to reproduce this bug. -->
<!--- Provide a link to a model that has the bug (a minimum complete and verifiable example (MCVE) is preferred) and/or code to reproduce -->
1.
2.
3.
4.

## Possible Solution
<!--- Optional, but if you can, suggest a fix/reason for the bug, -->

## Details

### Environment

Some additional details about your environment for this issue (if relevant):
 - Platform (Operating system, version):
 - Version of OpenStudio (if using an intermediate build, include SHA):

### Context
<!--- How has this issue affected you? What are you trying to accomplish? -->

Hotfix #4644 - VT rules missing for Coil:Cooling:DX:SingleSpeed and TwoSpeed
Issue overview
--------------

cf https://github.com/NREL/OpenStudio/pull/4644#issuecomment-1253829037

## Current Behavior

The reg tests are all OS_ASSERTing because this is missing VT rules.

```
[BOOST_ASSERT] <2> Assertion value failed on line 327 of double openstudio::model::detail::CoilCoolingDXSingleSpeed_Impl::latentCapacityTimeConstant() const in file /Users/julien/Software/Others/OpenStudio/src/model/CoilCoolingDXSingleSpeed.cpp.
[BOOST_ASSERT] <2> Assertion value failed on line 284 of double openstudio::model::detail::CoilCoolingDXSingleSpeed_Impl::nominalTimeForCondensateRemovalToBegin() const in file /Users/julien/Software/Others/OpenStudio/src/model/CoilCoolingDXSingleSpeed.cpp.
[BOOST_ASSERT] <2> Assertion value failed on line 299 of double openstudio::model::detail::CoilCoolingDXSingleSpeed_Impl::ratioOfInitialMoistureEvaporationRateAndSteadyStateLatentCapacity() const in file /Users/julien/Software/Others/OpenStudio/src/model/CoilCoolingDXSingleSpeed.cpp.
[BOOST_ASSERT] <2> Assertion value failed on line 313 of double openstudio::model::detail::CoilCoolingDXSingleSpeed_Impl::maximumCyclingRate() in file /Users/julien/Software/Others/OpenStudio/src/model/CoilCoolingDXSingleSpeed.cpp.
[BOOST_ASSERT] <2> Assertion value failed on line 327 of double openstudio::model::detail::CoilCoolingDXSingleSpeed_Impl::latentCapacityTimeConstant() const in file /Users/julien/Software/Others/OpenStudio/src/model/CoilCoolingDXSingleSpeed.cpp.
```

## Expected Behavior
<!--- Tell us what should happen -->

## Steps to Reproduce
<!-- Provide an unambiguous set of steps to reproduce this bug. -->
<!--- Provide a link to a model that has the bug (a minimum complete and verifiable example (MCVE) is preferred) and/or code to reproduce -->
1.
2.
3.
4.

## Possible Solution
<!--- Optional, but if you can, suggest a fix/reason for the bug, -->

## Details

### Environment

Some additional details about your environment for this issue (if relevant):
 - Platform (Operating system, version):
 - Version of OpenStudio (if using an intermediate build, include SHA):

### Context
<!--- How has this issue affected you? What are you trying to accomplish? -->



Discussion / hints:

Fix patch:
diff --git a/src/model/CoilCoolingDXSingleSpeed.cpp b/src/model/CoilCoolingDXSingleSpeed.cpp
index d45eda52ce4..94bfbfa6994 100644
--- a/src/model/CoilCoolingDXSingleSpeed.cpp
+++ b/src/model/CoilCoolingDXSingleSpeed.cpp
@@ -922,11 +922,8 @@ namespace model {
     setEnergyInputRatioFunctionOfTemperatureCurve(energyInputRatioFofTemp);
     setEnergyInputRatioFunctionOfFlowFractionCurve(energyInputRatioFofFlow);
     setPartLoadFractionCorrelationCurve(partLoadFraction);
-    setEvaporativeCondenserEffectiveness(0.0);
-    autosizeEvaporativeCondenserAirFlowRate();                //autosize
-    autosizeEvaporativeCondenserPumpRatedPowerConsumption();  //autosize
-    setCrankcaseHeaterCapacity(0.0);
-    setMaximumOutdoorDryBulbTemperatureForCrankcaseHeaterOperation(0.0);
+    autosizeEvaporativeCondenserAirFlowRate();                         //autosize
+    autosizeEvaporativeCondenserPumpRatedPowerConsumption();           //autosize
     setMinimumOutdoorDryBulbTemperatureforCompressorOperation(-25.0);  // Per E+ IDD default
     setNominalTimeForCondensateRemovalToBegin(0.0);
     setRatioOfInitialMoistureEvaporationRateAndSteadyStateLatentCapacity(0.0);
@@ -937,7 +934,7 @@ namespace model {
     setCrankcaseHeaterCapacity(0.0);
     setMaximumOutdoorDryBulbTemperatureForCrankcaseHeaterOperation(10.0);
     setBasinHeaterCapacity(0.0);
-    setBasinHeaterSetpointTemperature(10.0);
+    setBasinHeaterSetpointTemperature(2.0);
 
     auto schedule = model.alwaysOnDiscreteSchedule();
     setAvailabilitySchedule(schedule);
@@ -964,11 +961,8 @@ namespace model {
     setEnergyInputRatioFunctionOfTemperatureCurve(energyInputRatioFofTemp);
     setEnergyInputRatioFunctionOfFlowFractionCurve(energyInputRatioFofFlow);
     setPartLoadFractionCorrelationCurve(partLoadFraction);
-    setEvaporativeCondenserEffectiveness(0.0);
-    autosizeEvaporativeCondenserAirFlowRate();                //autosize
-    autosizeEvaporativeCondenserPumpRatedPowerConsumption();  //autosize
-    setCrankcaseHeaterCapacity(0.0);
-    setMaximumOutdoorDryBulbTemperatureForCrankcaseHeaterOperation(0.0);
+    autosizeEvaporativeCondenserAirFlowRate();                         //autosize
+    autosizeEvaporativeCondenserPumpRatedPowerConsumption();           //autosize
     setMinimumOutdoorDryBulbTemperatureforCompressorOperation(-25.0);  // Per E+ IDD default
     setNominalTimeForCondensateRemovalToBegin(0.0);
     setRatioOfInitialMoistureEvaporationRateAndSteadyStateLatentCapacity(0.0);
@@ -979,7 +973,7 @@ namespace model {
     setCrankcaseHeaterCapacity(0.0);
     setMaximumOutdoorDryBulbTemperatureForCrankcaseHeaterOperation(10.0);
     setBasinHeaterCapacity(0.0);
-    setBasinHeaterSetpointTemperature(10.0);
+    setBasinHeaterSetpointTemperature(2.0);
   }
 
   CoilCoolingDXSingleSpeed::CoilCoolingDXSingleSpeed(std::shared_ptr<detail::CoilCoolingDXSingleSpeed_Impl> p) : StraightComponent(std::move(p)) {}
diff --git a/src/model/CoilCoolingDXTwoSpeed.cpp b/src/model/CoilCoolingDXTwoSpeed.cpp
index 96f77176c8f..26ccb5f1650 100644
--- a/src/model/CoilCoolingDXTwoSpeed.cpp
+++ b/src/model/CoilCoolingDXTwoSpeed.cpp
@@ -863,13 +863,13 @@ namespace model {
     //  A13, \field Condenser Type
     setCondenserType("AirCooled");
     //   N9, \field High Speed Evaporative Condenser Effectiveness
-    setHighSpeedEvaporativeCondenserEffectiveness(0.0);
+    setHighSpeedEvaporativeCondenserEffectiveness(0.9);
     //  N10, \field High Speed Evaporative Condenser Air Flow Rate
     setHighSpeedEvaporativeCondenserAirFlowRate(boost::none);  //autosize
     //  N11, \field High Speed Evaporative Condenser Pump Rated Power Consumption
     setHighSpeedEvaporativeCondenserPumpRatedPowerConsumption(boost::none);  //autosize
     //  N12, \field Low Speed Evaporative Condenser Effectiveness
-    setLowSpeedEvaporativeCondenserEffectiveness(0.0);
+    setLowSpeedEvaporativeCondenserEffectiveness(0.9);
     //  N13, \field Low Speed Evaporative Condenser Air Flow Rate
     setLowSpeedEvaporativeCondenserAirFlowRate(boost::none);  //autosize
     //  N14, \field Low Speed Evaporative Condenser Pump Rated Power Consumption
@@ -881,7 +881,7 @@ namespace model {
     //  N15, \field Basin Heater Capacity
     setBasinHeaterCapacity(0.0);
     //  N16, \field Basin Heater Setpoint Temperature
-    setBasinHeaterSetpointTemperature(10.0);
+    setBasinHeaterSetpointTemperature(2.0);
     //  A16; \field Basin Heater Operating Schedule Name
     setString(OS_Coil_Cooling_DX_TwoSpeedFields::BasinHeaterOperatingScheduleName, "");
     setMinimumOutdoorDryBulbTemperatureforCompressorOperation(-25.0);  // Per E+ IDD default
@@ -979,13 +979,13 @@ namespace model {
     setLowSpeedTotalCoolingCapacityFunctionOfTemperatureCurve(coolingLowSpdCurveFofTemp);
     setLowSpeedEnergyInputRatioFunctionOfTemperatureCurve(energyLowSpdInputRatioFofTemp);
     setCondenserType("AirCooled");
-    setHighSpeedEvaporativeCondenserEffectiveness(0.0);
+    setHighSpeedEvaporativeCondenserEffectiveness(0.9);
     setHighSpeedEvaporativeCondenserAirFlowRate(boost::none);                //autosize
     setHighSpeedEvaporativeCondenserPumpRatedPowerConsumption(boost::none);  //autosize
-    setLowSpeedEvaporativeCondenserEffectiveness(0.0);
+    setLowSpeedEvaporativeCondenserEffectiveness(0.9);
     setLowSpeedEvaporativeCondenserAirFlowRate(boost::none);                //autosize
     setLowSpeedEvaporativeCondenserPumpRatedPowerConsumption(boost::none);  //autosize
-    setBasinHeaterCapacity(10.0);
+    setBasinHeaterCapacity(0.0);
     setBasinHeaterSetpointTemperature(2.0);
     setString(OS_Coil_Cooling_DX_TwoSpeedFields::BasinHeaterOperatingScheduleName, "");
     setMinimumOutdoorDryBulbTemperatureforCompressorOperation(-25.0);  // Per E+ IDD default
diff --git a/src/osversion/VersionTranslator.cpp b/src/osversion/VersionTranslator.cpp
index 0c46f7445fb..6eb0797227a 100644
--- a/src/osversion/VersionTranslator.cpp
+++ b/src/osversion/VersionTranslator.cpp
@@ -7083,6 +7083,38 @@ namespace osversion {
           m_new.emplace_back(std::move(varAdded));
         }
 
+      } else if (iddname == "OS:Coil:Cooling:DX:SingleSpeed") {
+
+        // Remove Construction with Material:AirWall layer
+        // Replace with Construction:AirBoundary
+
+        auto iddObject = idd_3_4_1.getObject(iddname);
+        IdfObject newObject(iddObject.get());
+
+        // new defaults
+        // From blank to zero
+        // "Nominal Time for Condensate Removal to Begin"=>16 (blank => 0),
+        // "Ratio of Initial Moisture Evaporation Rate and Steady State Latent Capacity"=>17,
+        // "Maximum Cycling Rate"=>18,
+        // "Latent Capacity Time Constant"=>19,
+        for (size_t i = 16; i <= 19; ++i) {
+          newObject.setDouble(i, 0.0);
+        }
+
+        // "Evaporative Condenser Effectiveness"=>22 (from 0.0 to 0.9),
+        // "Maximum Outdoor Dry-Bulb Temperature for Crankcase Heater Operation"=>26 (from 0.0 to 10.0)
+        newObject.setDouble(22, 0.9);
+        newObject.setDouble(26, 10.0);
+
+        for (size_t i = 0; i < object.numFields(); ++i) {
+          if ((value = object.getString(i, false, true))) {
+            newObject.setString(i, value.get());
+          }
+        }
+
+        m_refactored.push_back(RefactoredObjectData(object, newObject));
+        ss << newObject;
+
         // No-op
       } else {
         ss << object;


Test patch:
diff --git a/src/model/test/CoilCoolingDXTwoSpeed_GTest.cpp b/src/model/test/CoilCoolingDXTwoSpeed_GTest.cpp
index ce21ef8358f..7d834165841 100644
--- a/src/model/test/CoilCoolingDXTwoSpeed_GTest.cpp
+++ b/src/model/test/CoilCoolingDXTwoSpeed_GTest.cpp
@@ -98,10 +98,10 @@ TEST_F(ModelFixture, CoilCoolingDXTwoSpeed_CoilCoolingDXTwoSpeed) {
   //ASSERT_EQ("Autosize",coil.getRatedHighSpeedTotalCoolingCapacity().get());
   ASSERT_EQ(3, coil.ratedHighSpeedCOP());
   ASSERT_EQ(3, coil.ratedLowSpeedCOP());
-  ASSERT_EQ(0, coil.highSpeedEvaporativeCondenserEffectiveness());
-  ASSERT_EQ(0, coil.lowSpeedEvaporativeCondenserEffectiveness());
+  ASSERT_EQ(0.9, coil.highSpeedEvaporativeCondenserEffectiveness());
+  ASSERT_EQ(0.9, coil.lowSpeedEvaporativeCondenserEffectiveness());
   ASSERT_EQ(0, coil.basinHeaterCapacity());
-  ASSERT_EQ(10, coil.basinHeaterSetpointTemperature());
+  ASSERT_EQ(2, coil.basinHeaterSetpointTemperature());
   ASSERT_EQ("AirCooled", coil.condenserType());
 }
 
diff --git a/src/osversion/test/3_4_1/test_vt_CoilCoolingDXSingleSpeed.osm b/src/osversion/test/3_4_1/test_vt_CoilCoolingDXSingleSpeed.osm
new file mode 100644
index 00000000000..14d8b85b88e
--- /dev/null
+++ b/src/osversion/test/3_4_1/test_vt_CoilCoolingDXSingleSpeed.osm
@@ -0,0 +1,197 @@
+
+OS:Version,
+  {d0cf8c93-672f-4b73-97d8-df5593a8dc15}, !- Handle
+  3.4.0;                                  !- Version Identifier
+
+OS:Coil:Cooling:DX:SingleSpeed,
+  {0deb5c73-7be0-4772-9bd4-9e7d72c25f48}, !- Handle
+  CC with blanks,                         !- Name
+  {071de9ca-eee2-4bcf-b184-25b4bdad21b2}, !- Availability Schedule Name
+  autosize,                               !- Rated Total Cooling Capacity {W}
+  autosize,                               !- Rated Sensible Heat Ratio
+  3,                                      !- Rated COP {W/W}
+  autosize,                               !- Rated Air Flow Rate {m3/s}
+  773.3,                                  !- Rated Evaporator Fan Power Per Volume Flow Rate {W/(m3/s)}
+  ,                                       !- Air Inlet Node Name
+  ,                                       !- Air Outlet Node Name
+  {4916e517-feb6-4d34-9f11-e73eedab994f}, !- Total Cooling Capacity Function of Temperature Curve Name
+  {0bc3d776-bc05-4b32-828d-e078ad0942ed}, !- Total Cooling Capacity Function of Flow Fraction Curve Name
+  {d7a809cd-f065-4581-a6a3-f02612ece149}, !- Energy Input Ratio Function of Temperature Curve Name
+  {ecdc39de-57b5-4b70-b927-73c516ea11f4}, !- Energy Input Ratio Function of Flow Fraction Curve Name
+  {f4cd41f0-8626-4826-a0e7-01bb9fe78f77}, !- Part Load Fraction Correlation Curve Name
+  -25,                                    !- Minimum Outdoor Dry-Bulb Temperature for Compressor Operation {C}
+  ,                                       !- Nominal Time for Condensate Removal to Begin {s}
+  ,                                       !- Ratio of Initial Moisture Evaporation Rate and Steady State Latent Capacity {dimensionless}
+  ,                                       !- Maximum Cycling Rate {cycles/hr}
+  ,                                       !- Latent Capacity Time Constant {s}
+  ,                                       !- Condenser Air Inlet Node Name
+  AirCooled,                              !- Condenser Type
+  0,                                      !- Evaporative Condenser Effectiveness {dimensionless}
+  Autosize,                               !- Evaporative Condenser Air Flow Rate {m3/s}
+  Autosize,                               !- Evaporative Condenser Pump Rated Power Consumption {W}
+  0,                                      !- Crankcase Heater Capacity {W}
+  0,                                      !- Maximum Outdoor Dry-Bulb Temperature for Crankcase Heater Operation {C}
+  ,                                       !- Supply Water Storage Tank Name
+  ,                                       !- Condensate Collection Water Storage Tank Name
+  0,                                      !- Basin Heater Capacity {W/K}
+  10,                                     !- Basin Heater Setpoint Temperature {C}
+  ;                                       !- Basin Heater Operating Schedule Name
+
+OS:Curve:Biquadratic,
+  {4916e517-feb6-4d34-9f11-e73eedab994f}, !- Handle
+  Curve Biquadratic 1,                    !- Name
+  0.942587793,                            !- Coefficient1 Constant
+  0.009543347,                            !- Coefficient2 x
+  0.00068377,                             !- Coefficient3 x**2
+  -0.011042676,                           !- Coefficient4 y
+  5.249e-06,                              !- Coefficient5 y**2
+  -9.72e-06,                              !- Coefficient6 x*y
+  17,                                     !- Minimum Value of x
+  22,                                     !- Maximum Value of x
+  13,                                     !- Minimum Value of y
+  46;                                     !- Maximum Value of y
+
+OS:Curve:Quadratic,
+  {0bc3d776-bc05-4b32-828d-e078ad0942ed}, !- Handle
+  Curve Quadratic 1,                      !- Name
+  0.8,                                    !- Coefficient1 Constant
+  0.2,                                    !- Coefficient2 x
+  0,                                      !- Coefficient3 x**2
+  0.5,                                    !- Minimum Value of x
+  1.5;                                    !- Maximum Value of x
+
+OS:Curve:Biquadratic,
+  {d7a809cd-f065-4581-a6a3-f02612ece149}, !- Handle
+  Curve Biquadratic 2,                    !- Name
+  0.342414409,                            !- Coefficient1 Constant
+  0.034885008,                            !- Coefficient2 x
+  -0.0006237,                             !- Coefficient3 x**2
+  0.004977216,                            !- Coefficient4 y
+  0.000437951,                            !- Coefficient5 y**2
+  -0.000728028,                           !- Coefficient6 x*y
+  17,                                     !- Minimum Value of x
+  22,                                     !- Maximum Value of x
+  13,                                     !- Minimum Value of y
+  46;                                     !- Maximum Value of y
+
+OS:Curve:Quadratic,
+  {ecdc39de-57b5-4b70-b927-73c516ea11f4}, !- Handle
+  Curve Quadratic 2,                      !- Name
+  1.1552,                                 !- Coefficient1 Constant
+  -0.1808,                                !- Coefficient2 x
+  0.0256,                                 !- Coefficient3 x**2
+  0.5,                                    !- Minimum Value of x
+  1.5;                                    !- Maximum Value of x
+
+OS:Curve:Quadratic,
+  {f4cd41f0-8626-4826-a0e7-01bb9fe78f77}, !- Handle
+  Curve Quadratic 3,                      !- Name
+  0.85,                                   !- Coefficient1 Constant
+  0.15,                                   !- Coefficient2 x
+  0,                                      !- Coefficient3 x**2
+  0,                                      !- Minimum Value of x
+  1;                                      !- Maximum Value of x
+
+OS:Schedule:Constant,
+  {071de9ca-eee2-4bcf-b184-25b4bdad21b2}, !- Handle
+  Always On Discrete,                     !- Name
+  {e1321e24-1577-4379-ab41-733f485024fb}, !- Schedule Type Limits Name
+  1;                                      !- Value
+
+OS:ScheduleTypeLimits,
+  {e1321e24-1577-4379-ab41-733f485024fb}, !- Handle
+  OnOff,                                  !- Name
+  0,                                      !- Lower Limit Value
+  1,                                      !- Upper Limit Value
+  Discrete,                               !- Numeric Type
+  Availability;                           !- Unit Type
+
+OS:Coil:Cooling:DX:SingleSpeed,
+  {4a9fb6f7-417f-42bd-a889-f4a1e2b79e3f}, !- Handle
+  CC with numbers,                        !- Name
+  {071de9ca-eee2-4bcf-b184-25b4bdad21b2}, !- Availability Schedule Name
+  autosize,                               !- Rated Total Cooling Capacity {W}
+  autosize,                               !- Rated Sensible Heat Ratio
+  3,                                      !- Rated COP {W/W}
+  autosize,                               !- Rated Air Flow Rate {m3/s}
+  773.3,                                  !- Rated Evaporator Fan Power Per Volume Flow Rate {W/(m3/s)}
+  ,                                       !- Air Inlet Node Name
+  ,                                       !- Air Outlet Node Name
+  {9cddf1c2-a0a1-4c70-ae30-b5c1a1f8ec2a}, !- Total Cooling Capacity Function of Temperature Curve Name
+  {013dac57-dd3d-4930-a024-dbfbe717ca15}, !- Total Cooling Capacity Function of Flow Fraction Curve Name
+  {fe2115d6-be6a-4268-a5e3-ebeb08dd486f}, !- Energy Input Ratio Function of Temperature Curve Name
+  {c30d952b-7b3e-4969-90d6-e77f0440cfa8}, !- Energy Input Ratio Function of Flow Fraction Curve Name
+  {392e6e64-135e-4d83-a568-06dcc877c795}, !- Part Load Fraction Correlation Curve Name
+  15,                                     !- Minimum Outdoor Dry-Bulb Temperature for Compressor Operation {C}
+  16,                                     !- Nominal Time for Condensate Removal to Begin {s}
+  0.17,                                   !- Ratio of Initial Moisture Evaporation Rate and Steady State Latent Capacity {dimensionless}
+  0.18,                                   !- Maximum Cycling Rate {cycles/hr}
+  19,                                     !- Latent Capacity Time Constant {s}
+  ,                                       !- Condenser Air Inlet Node Name
+  EvaporativelyCooled,                    !- Condenser Type
+  0.22,                                   !- Evaporative Condenser Effectiveness {dimensionless}
+  Autosize,                               !- Evaporative Condenser Air Flow Rate {m3/s}
+  Autosize,                               !- Evaporative Condenser Pump Rated Power Consumption {W}
+  25,                                     !- Crankcase Heater Capacity {W}
+  26,                                     !- Maximum Outdoor Dry-Bulb Temperature for Crankcase Heater Operation {C}
+  ,                                       !- Supply Water Storage Tank Name
+  ,                                       !- Condensate Collection Water Storage Tank Name
+  0,                                      !- Basin Heater Capacity {W/K}
+  10,                                     !- Basin Heater Setpoint Temperature {C}
+  ;                                       !- Basin Heater Operating Schedule Name
+
+OS:Curve:Biquadratic,
+  {9cddf1c2-a0a1-4c70-ae30-b5c1a1f8ec2a}, !- Handle
+  Curve Biquadratic 3,                    !- Name
+  0.942587793,                            !- Coefficient1 Constant
+  0.009543347,                            !- Coefficient2 x
+  0.00068377,                             !- Coefficient3 x**2
+  -0.011042676,                           !- Coefficient4 y
+  5.249e-06,                              !- Coefficient5 y**2
+  -9.72e-06,                              !- Coefficient6 x*y
+  17,                                     !- Minimum Value of x
+  22,                                     !- Maximum Value of x
+  13,                                     !- Minimum Value of y
+  46;                                     !- Maximum Value of y
+
+OS:Curve:Quadratic,
+  {013dac57-dd3d-4930-a024-dbfbe717ca15}, !- Handle
+  Curve Quadratic 4,                      !- Name
+  0.8,                                    !- Coefficient1 Constant
+  0.2,                                    !- Coefficient2 x
+  0,                                      !- Coefficient3 x**2
+  0.5,                                    !- Minimum Value of x
+  1.5;                                    !- Maximum Value of x
+
+OS:Curve:Biquadratic,
+  {fe2115d6-be6a-4268-a5e3-ebeb08dd486f}, !- Handle
+  Curve Biquadratic 4,                    !- Name
+  0.342414409,                            !- Coefficient1 Constant
+  0.034885008,                            !- Coefficient2 x
+  -0.0006237,                             !- Coefficient3 x**2
+  0.004977216,                            !- Coefficient4 y
+  0.000437951,                            !- Coefficient5 y**2
+  -0.000728028,                           !- Coefficient6 x*y
+  17,                                     !- Minimum Value of x
+  22,                                     !- Maximum Value of x
+  13,                                     !- Minimum Value of y
+  46;                                     !- Maximum Value of y
+
+OS:Curve:Quadratic,
+  {c30d952b-7b3e-4969-90d6-e77f0440cfa8}, !- Handle
+  Curve Quadratic 5,                      !- Name
+  1.1552,                                 !- Coefficient1 Constant
+  -0.1808,                                !- Coefficient2 x
+  0.0256,                                 !- Coefficient3 x**2
+  0.5,                                    !- Minimum Value of x
+  1.5;                                    !- Maximum Value of x
+
+OS:Curve:Quadratic,
+  {392e6e64-135e-4d83-a568-06dcc877c795}, !- Handle
+  Curve Quadratic 6,                      !- Name
+  0.85,                                   !- Coefficient1 Constant
+  0.15,                                   !- Coefficient2 x
+  0,                                      !- Coefficient3 x**2
+  0,                                      !- Minimum Value of x
+  1;                                      !- Maximum Value of x
+
diff --git a/src/osversion/test/3_4_1/test_vt_CoilCoolingDXSingleSpeed.rb b/src/osversion/test/3_4_1/test_vt_CoilCoolingDXSingleSpeed.rb
new file mode 100644
index 00000000000..78a4fdbf88c
--- /dev/null
+++ b/src/osversion/test/3_4_1/test_vt_CoilCoolingDXSingleSpeed.rb
@@ -0,0 +1,27 @@
+#require '/usr/local/openstudio-3.4.0/Ruby/openstudio'
+
+include OpenStudio::Model
+
+m = Model.new
+
+cc1 = CoilCoolingDXSingleSpeed.new(m)
+cc1.setName("CC with blanks")
+[16, 17, 18, 19].each { |i|
+  raise if !cc1.isEmpty(i)
+}
+
+cc = CoilCoolingDXSingleSpeed.new(m)
+cc.setName("CC with numbers")
+cc.setMinimumOutdoorDryBulbTemperatureforCompressorOperation(15)
+cc.setNominalTimeForCondensateRemovalToBegin(16)
+cc.setRatioOfInitialMoistureEvaporationRateAndSteadyStateLatentCapacity(0.17)
+cc.setMaximumCyclingRate(0.18)
+cc.setLatentCapacityTimeConstant(19)
+
+cc.setCondenserType("EvaporativelyCooled")
+cc.setEvaporativeCondenserEffectiveness(0.22)
+
+cc.setCrankcaseHeaterCapacity(25)
+cc.setMaximumOutdoorDryBulbTemperatureForCrankcaseHeaterOperation(26)
+
+m.save('test_vt_CoilCoolingDXSingleSpeed.osm', true)
diff --git a/src/osversion/test/VersionTranslator_GTest.cpp b/src/osversion/test/VersionTranslator_GTest.cpp
index 3367d1bb612..ce02b8eb7dd 100644
--- a/src/osversion/test/VersionTranslator_GTest.cpp
+++ b/src/osversion/test/VersionTranslator_GTest.cpp
@@ -2012,3 +2012,48 @@ TEST_F(OSVersionFixture, update_3_4_0_to_3_4_1_TableMultiVariableLookup_twoDims)
     }
   }
 }
+
+TEST_F(OSVersionFixture, update_3_4_0_to_3_4_1_CoilCoolingDXSingleSpeed) {
+  openstudio::path path = resourcesPath() / toPath("osversion/3_4_1/test_vt_CoilCoolingDXSingleSpeed.osm");
+  osversion::VersionTranslator vt;
+  boost::optional<model::Model> model = vt.loadModel(path);
+  ASSERT_TRUE(model) << "Failed to load " << path;
+
+  openstudio::path outPath = resourcesPath() / toPath("osversion/3_4_1/test_vt_CoilCoolingDXSingleSpeed_updated.osm");
+  model->save(outPath, true);
+
+  std::vector<WorkspaceObject> ccs = model->getObjectsByType("OS:Coil:Cooling:DX:SingleSpeed");
+  ASSERT_EQ(2, ccs.size());
+
+  {
+    auto cc = model->getObjectByTypeAndName("OS:Coil:Cooling:DX:SingleSpeed", "CC with numbers").get();
+    EXPECT_EQ(15, cc.getDouble(15).get());
+    EXPECT_EQ(16, cc.getDouble(16).get());
+    EXPECT_EQ(0.17, cc.getDouble(17).get());
+    EXPECT_EQ(0.18, cc.getDouble(18).get());
+    EXPECT_EQ(19, cc.getDouble(19).get());
+
+    EXPECT_EQ("EvaporativelyCooled", cc.getString(21).get());
+    EXPECT_EQ(0.22, cc.getDouble(22).get());
+    EXPECT_EQ("Autosize", cc.getString(23).get());
+    EXPECT_EQ("Autosize", cc.getString(24).get());
+    EXPECT_EQ(25, cc.getDouble(25).get());
+    EXPECT_EQ(26, cc.getDouble(26).get());
+  }
+
+  {
+    auto cc = model->getObjectByTypeAndName("OS:Coil:Cooling:DX:SingleSpeed", "CC with blanks").get();
+    EXPECT_EQ(-25, cc.getDouble(15).get());
+    EXPECT_EQ(0, cc.getInt(16).get());
+    EXPECT_EQ(0, cc.getInt(17).get());
+    EXPECT_EQ(0, cc.getInt(18).get());
+    EXPECT_EQ(0, cc.getInt(19).get());
+
+    EXPECT_EQ("AirCooled", cc.getString(21).get());
+    EXPECT_EQ(0.0, cc.getInt(22).get());
+    EXPECT_EQ("Autosize", cc.getString(23).get());
+    EXPECT_EQ("Autosize", cc.getString(24).get());
+    EXPECT_EQ(0, cc.getInt(25).get());
+    EXPECT_EQ(0, cc.getInt(26).get());
+  }
+}