/// <summary>
        /// Initializes a new instance of the <see cref="ProgramType" /> class.
        /// </summary>
        /// <param name="people">People to describe the occupancy of the program. If None, no occupancy will be assumed for the program..</param>
        /// <param name="lighting">Lighting to describe the lighting usage of the program. If None, no lighting will be assumed for the program..</param>
        /// <param name="electricEquipment">ElectricEquipment to describe the usage of electric equipment within the program. If None, no electric equipment will be assumed..</param>
        /// <param name="gasEquipment">GasEquipment to describe the usage of gas equipment within the program. If None, no gas equipment will be assumed..</param>
        /// <param name="serviceHotWater">ServiceHotWater object to describe the usage of hot water within the program. If None, no hot water will be assumed..</param>
        /// <param name="infiltration">Infiltration to describe the outdoor air leakage of the program. If None, no infiltration will be assumed for the program..</param>
        /// <param name="ventilation">Ventilation to describe the minimum outdoor air requirement of the program. If None, no ventilation requirement will be assumed..</param>
        /// <param name="setpoint">Setpoint object to describe the temperature and humidity setpoints of the program.  If None, the ProgramType cannot be assigned to a Room that is conditioned..</param>
        /// <param name="identifier">Text string for a unique object ID. This identifier remains constant as the object is mutated, copied, and serialized to different formats (eg. dict, idf, osm). This identifier is also used to reference the object across a Model. It must be &lt; 100 characters, use only ASCII characters and exclude (, ; ! \\n \\t). (required).</param>
        /// <param name="displayName">Display name of the object with no character restrictions..</param>
        public ProgramType
        (
            string identifier,                                                                                                                                                                                                                                                                                                     // Required parameters
            string displayName = default, People people = default, Lighting lighting = default, ElectricEquipment electricEquipment = default, GasEquipment gasEquipment = default, ServiceHotWater serviceHotWater = default, Infiltration infiltration = default, Ventilation ventilation = default, Setpoint setpoint = default // Optional parameters
        ) : base(identifier: identifier, displayName: displayName)                                                                                                                                                                                                                                                                 // BaseClass
        {
            this.People            = people;
            this.Lighting          = lighting;
            this.ElectricEquipment = electricEquipment;
            this.GasEquipment      = gasEquipment;
            this.ServiceHotWater   = serviceHotWater;
            this.Infiltration      = infiltration;
            this.Ventilation       = ventilation;
            this.Setpoint          = setpoint;

            // Set non-required readonly properties with defaultValue
            this.Type = "ProgramType";
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="ProgramType" /> class.
        /// </summary>
        /// <param name="people">People to describe the occupancy of the program. If None, no occupancy will be assumed for the program..</param>
        /// <param name="lighting">Lighting to describe the lighting usage of the program. If None, no lighting will be assumed for the program..</param>
        /// <param name="electricEquipment">ElectricEquipment to describe the usage of electric equipment within the program. If None, no electric equipment will be assumed..</param>
        /// <param name="gasEquipment">GasEquipment to describe the usage of gas equipment within the program. If None, no gas equipment will be assumed..</param>
        /// <param name="serviceHotWater">ServiceHotWater object to describe the usage of hot water within the program. If None, no hot water will be assumed..</param>
        /// <param name="infiltration">Infiltration to describe the outdoor air leakage of the program. If None, no infiltration will be assumed for the program..</param>
        /// <param name="ventilation">Ventilation to describe the minimum outdoor air requirement of the program. If None, no ventilation requirement will be assumed..</param>
        /// <param name="setpoint">Setpoint object to describe the temperature and humidity setpoints of the program.  If None, the ProgramType cannot be assigned to a Room that is conditioned..</param>
        /// <param name="identifier">Text string for a unique object ID. This identifier remains constant as the object is mutated, copied, and serialized to different formats (eg. dict, idf, osm). This identifier is also used to reference the object across a Model. It must be &lt; 100 characters, use only ASCII characters and exclude (, ; ! \\n \\t). (required).</param>
        /// <param name="displayName">Display name of the object with no character restrictions..</param>
        /// <param name="userData">Optional dictionary of user data associated with the object.All keys and values of this dictionary should be of a standard data type to ensure correct serialization of the object (eg. str, float, int, list)..</param>
        public ProgramType
        (
            string identifier,                                                                                                                                                                                                                                                                                                                                // Required parameters
            string displayName = default, Object userData = default, People people = default, Lighting lighting = default, ElectricEquipment electricEquipment = default, GasEquipment gasEquipment = default, ServiceHotWater serviceHotWater = default, Infiltration infiltration = default, Ventilation ventilation = default, Setpoint setpoint = default // Optional parameters
        ) : base(identifier: identifier, displayName: displayName, userData: userData)                                                                                                                                                                                                                                                                        // BaseClass
        {
            this.People            = people;
            this.Lighting          = lighting;
            this.ElectricEquipment = electricEquipment;
            this.GasEquipment      = gasEquipment;
            this.ServiceHotWater   = serviceHotWater;
            this.Infiltration      = infiltration;
            this.Ventilation       = ventilation;
            this.Setpoint          = setpoint;

            // Set non-required readonly properties with defaultValue
            this.Type = "ProgramType";

            // check if object is valid, only check for inherited class
            if (this.GetType() == typeof(ProgramType))
            {
                this.IsValid(throwException: true);
            }
        }