def _ParseTranslation( translation_body: syaml.YAML) -> Dict[str, ft_lib.FieldTranslation]: """Parses YAML defining the translation of an entity's points. see: https://github.com/google/digitalbuildings/blob/master/ontology/docs/building_config.md#defining-translations Args: translation_body: YAML body for the entity translation Returns: A dictionary from field names to FieldTranslation instances """ if isinstance(translation_body, str): raise ValueError(translation_body + ' is not a valid translation') translation = {} for std_field_name in translation_body: ft = translation_body[std_field_name] if isinstance(ft, str): if not ft: raise ValueError( 'Translation details were empty for standard field name: ' + std_field_name) elif ft == ft_lib.PresenceMode.MISSING.value: translation[std_field_name] = ft_lib.UndefinedField( std_field_name) continue # TODO(b/187757180): support UDMI-compliant shorthand raise ValueError(ft + ' is not yet an allowed scalar') raw_field_name = str(ft[parse.PRESENT_VALUE_KEY]) ft_object = None if parse.UNITS_KEY in ft: unit_field_name = ft[parse.UNITS_KEY][parse.UNIT_NAME_KEY] unit_mappings = ft[parse.UNITS_KEY][parse.UNIT_VALUES_KEY] ft_object = ft_lib.DimensionalValue(std_field_name, raw_field_name, unit_field_name, unit_mappings) if parse.STATES_KEY in ft: if ft_object: raise ValueError( 'states and units are not allowed in the same translation') ft_object = ft_lib.MultiStateValue(std_field_name, raw_field_name, ft[parse.STATES_KEY]) if not ft_object: ft_object = ft_lib.NonDimensionalValue(std_field_name, raw_field_name) translation[std_field_name] = ft_object return translation
def testInstanceMultipleUnitsNotAllowed(self): entity = entity_instance.EntityInstance( _UPDATE, 'VAV-123', etag='1234', translation={ 'foo_bar': field_translation.DimensionalValue( std_field_name='foo/bar', unit_field_name='foo/unit', raw_field_name='foo/raw', unit_mappings={'standard_unit_1': 'raw_unit_1'}), 'foo_baz': field_translation.DimensionalValue( std_field_name='foo/baz', unit_field_name='bar/unit', raw_field_name='bar/raw', unit_mappings={'standard_unit_1': 'raw_unit_2'}), }) self.assertFalse(self.update_validator.Validate(entity))
def testInstance_DimensionalValue_unitsExpected_noUnitsFails(self): entity = entity_instance.EntityInstance( _UPDATE, 'VAV-123', etag='1234', translation={ 'zone_air_cooling_temperature_setpoint': field_translation.DimensionalValue( std_field_name='foo/bar', unit_field_name='foo/unit', raw_field_name='foo/raw', unit_mappings={'no_units': 'no_units'}), }) self.assertFalse(self.update_validator.Validate(entity))
def testInstance_DimensionalValue_noUnitsExpected_noUnitsPasses(self): entity = entity_instance.EntityInstance( _UPDATE, 'VAV-123', etag='1234', translation={ 'line_powerfactor_sensor': field_translation.DimensionalValue( std_field_name='foo/bar', unit_field_name='foo/unit', raw_field_name='foo/raw', unit_mappings={'no_units': 'no_units'}), }) self.assertTrue(self.update_validator.Validate(entity))
def testInstance_DimensionalTranslation_FieldIsValid(self): entity = entity_instance.EntityInstance( _UPDATE, 'VAV-123', etag='1234', translation={ 'return_water_temperature_sensor': field_translation.DimensionalValue( std_field_name='foo/bar', unit_field_name='foo/unit', raw_field_name='foo/raw', unit_mappings={'degrees_fahrenheit': 'degF'}) }) self.assertTrue(self.update_validator.Validate(entity))
def testInstance_DimensionalTranslation_FieldHasInvalidUnit(self): entity = entity_instance.EntityInstance( _UPDATE, 'VAV-123', etag='1234', translation={ 'return_water_temperature_sensor': field_translation.DimensionalValue( std_field_name='foo/bar', unit_field_name='foo/unit', raw_field_name='foo/raw', unit_mappings={'INVALID_SENSOR_UNIT': 'degF'}) }) self.assertFalse(self.update_validator.Validate(entity))
def testInstance_DimensionalTranslation_UndefinedField(self): entity = entity_instance.EntityInstance( _UPDATE, 'VAV-123', etag='1234', translation={ 'UNDEFINED_UNIT': field_translation.DimensionalValue( std_field_name='foo/bar', unit_field_name='foo/unit', raw_field_name='foo/raw', unit_mappings={'foo': 'bar'}) }) self.assertFalse(self.update_validator.Validate(entity))
def testInstance_DimensionalTranslation_MissingUnitMapping(self): try: entity_instance.EntityInstance( _UPDATE, 'VAV-123', etag='1234', translation={ 'foo_bar': field_translation.DimensionalValue( std_field_name='foo/bar', unit_field_name='foo/unit', raw_field_name='foo/raw', unit_mappings={}), }) except ValueError as e: self.assertEqual(type(e), ValueError) else: self.fail(f'{ValueError} was not raised')