diff --git a/sdk/basyx/aas/model/base.py b/sdk/basyx/aas/model/base.py index 35ccad5a..edb1c302 100644 --- a/sdk/basyx/aas/model/base.py +++ b/sdk/basyx/aas/model/base.py @@ -10,6 +10,7 @@ """ import abc +from datetime import datetime import inspect import itertools from enum import Enum, unique @@ -26,6 +27,7 @@ ValueDataType = datatypes.AnyXSDType # any xsd atomic type (from .datatypes) ValueList = Set["ValueReferencePair"] BlobType = bytes +DateTimeUTC = datetime # The following string aliases are constrained by the decorator functions defined in the string_constraints module, # wherever they are used for an instance attributes. diff --git a/sdk/basyx/aas/model/submodel.py b/sdk/basyx/aas/model/submodel.py index 9e7321c4..86556c37 100644 --- a/sdk/basyx/aas/model/submodel.py +++ b/sdk/basyx/aas/model/submodel.py @@ -10,6 +10,7 @@ import abc import uuid +from datetime import timezone from typing import Optional, Set, Iterable, TYPE_CHECKING, List, Type, TypeVar, Generic, Union from . import base, datatypes, _string_constraints @@ -1284,7 +1285,7 @@ def __init__(self, message_topic: Optional[base.MessageTopicType] = None, message_broker: Optional[base.ModelReference[Union[Submodel, SubmodelElementList, SubmodelElementCollection, Entity]]] = None, - last_update: Optional[datatypes.DateTime] = None, + last_update: Optional[base.DateTimeUTC] = None, min_interval: Optional[datatypes.Duration] = None, max_interval: Optional[datatypes.Duration] = None, display_name: Optional[base.MultiLanguageNameType] = None, @@ -1310,7 +1311,11 @@ def __init__(self, self.message_topic: Optional[base.MessageTopicType] = message_topic self.message_broker: Optional[base.ModelReference[Union[Submodel, SubmodelElementList, SubmodelElementCollection, Entity]]] = message_broker - self.last_update: Optional[datatypes.DateTime] = last_update + self.last_update: Optional[base.DateTimeUTC] = last_update + if ((last_update and last_update.tzinfo and + last_update.tzinfo.utcoffset(last_update) != timezone.utc.utcoffset(None)) + or (last_update and last_update.tzinfo is None)): + raise ValueError("Last update must be in UTC!") self.min_interval: Optional[datatypes.Duration] = min_interval self.max_interval: Optional[datatypes.Duration] = max_interval