diff --git a/tests/src/TecDummy.cc b/tests/src/TecDummy.cc
index a8609defa0b38afd1e78554df97c7d91756c3d1c..5aafffac01359f6299ebca1bdfda09f15f03f72f 100644
--- a/tests/src/TecDummy.cc
+++ b/tests/src/TecDummy.cc
@@ -6,6 +6,58 @@
 #include <boost/crc.hpp>
 #include <sstream>
 
+// Read-only tec variables as per tec communication specification document
+static std::vector<TecFrame::TecParameter> READ_ONLY_VARS = {
+    // Parameters 100-999 are read-only, except 108 (Enable/disable save to flash)
+    TecFrame::TecParameter::DeviceType,
+    TecFrame::TecParameter::HardwareVersion,
+    TecFrame::TecParameter::SerialNumber,
+    TecFrame::TecParameter::FirmwareVersion,
+    TecFrame::TecParameter::DeviceStatus,
+    TecFrame::TecParameter::ErrorNumber,
+    TecFrame::TecParameter::ErrorInstance,
+    TecFrame::TecParameter::ErrorParameter,
+    TecFrame::TecParameter::ParameterSystemFlashStatus,
+
+    // All monitoring parmaters are read-only
+    TecFrame::TecParameter::MonObjectTemperature,
+    TecFrame::TecParameter::MonSinkTemperature,
+    TecFrame::TecParameter::MonTargetObjectTemperature,
+    TecFrame::TecParameter::MonRampNominalObjectTemperature,
+    TecFrame::TecParameter::MonThermalPowerModelCurrent,
+    TecFrame::TecParameter::MonActualOutputCurrent,
+    TecFrame::TecParameter::MonActualOutputVoltage,
+    TecFrame::TecParameter::MonPIDLowerLimitation,
+    TecFrame::TecParameter::MonPIDUpperLimitation,
+    TecFrame::TecParameter::MonPIDControlVariable,
+    TecFrame::TecParameter::MonObjectSensorRawADCValue,
+    TecFrame::TecParameter::MonSinkSensorRawADCValue,
+    TecFrame::TecParameter::MonObjectSensorResistance,
+    TecFrame::TecParameter::MonSinkSensorResitance,
+    TecFrame::TecParameter::MonSinkSensorTemperature,
+    TecFrame::TecParameter::MonObjectSensorTemperature,
+    TecFrame::TecParameter::MonObjectSensorType, // and 1046
+    TecFrame::TecParameter::MonFirmwareVersion,
+    TecFrame::TecParameter::MonFirmwareBuildNumber,
+    TecFrame::TecParameter::MonHardwareVersion,
+    TecFrame::TecParameter::MonSerialNumber,
+    TecFrame::TecParameter::MonDriverInputVoltage,
+    TecFrame::TecParameter::MonMedVInternalSupply,
+    TecFrame::TecParameter::Mon33VInternalSupply,
+    TecFrame::TecParameter::MonBasePlateTemperature,
+    TecFrame::TecParameter::MonErrorNumber,
+    TecFrame::TecParameter::MonErrorInstance,
+    TecFrame::TecParameter::MonErrorParameter,
+    TecFrame::TecParameter::MonParallelActualOutputCurrent,
+    TecFrame::TecParameter::MonDriverStatus,
+    TecFrame::TecParameter::MonParameterSystemFlashStatus,
+    TecFrame::TecParameter::MonFanRelativeCoolingPower,
+    TecFrame::TecParameter::MonFanNominalFanSpeed,
+    TecFrame::TecParameter::MonFanActualFanSpeed,
+    TecFrame::TecParameter::MonFanActualPwmLevel,
+    TecFrame::TecParameter::MonTemperatureIsStable,
+};
+
 #define TEC_MAGIC_TIMEOUT 0xfaceb00b
 
 TecDummy::BackendRegisterer TecDummy::backendRegisterer;
@@ -159,7 +211,6 @@ std::string TecDummy::processFrame(const std::string& command) {
       static_cast<TecFrame::TecParameter>(std::stoul("0x" + parsedFrame[TecFramePart::PARAMETER_ID], nullptr, 16));
 
   if(errorFlags[parameterId] != TecErrorCode::NO_ERROR) {
-    // Returing an error has been requested through the dummy interface
     // Returning an error has been requested through the dummy interface
     result = "!" + parsedFrame[TecFramePart::ADDRESS] + parsedFrame[TecFramePart::SEQUENCE];
     result += "+"; // marks the error
@@ -169,6 +220,15 @@ std::string TecDummy::processFrame(const std::string& command) {
     result += getCrc(result);
   }
   else if(parsedFrame[TecFramePart::COMMAND] == "VS") {
+    if (std::find(READ_ONLY_VARS.begin(), READ_ONLY_VARS.end(), parameterId) != READ_ONLY_VARS.end()) {
+      // Write requested to a read-only variable
+      result = "!" + parsedFrame[TecFramePart::ADDRESS] + parsedFrame[TecFramePart::SEQUENCE];
+      result += "+"; // marks the error
+      std::stringstream ss;
+      ss << std::hex << std::setw(2) << std::setfill('0') << std::uppercase << static_cast<int>(TecErrorCode::EER_PAR_NOT_WRITABLE);
+      result += ss.str();
+      result += getCrc(result);
+    }
     // Handle store command
     int32_t value = std::stol("0x" + parsedFrame[TecFramePart::PAYLOAD], nullptr, 16);