HAKOM PowerTSM® Documentation
3.11.3.2 3.11.3.1 3.11.3.0 3.11.2.3 3.11.2.2 3.11.2.1 3.11.2 3.11.1 3.11.0.1 3.11.0 3.10.6.6 3.10.6.5 3.10.6.4 3.10.6.3 3.10.6.2 3.10.6.1 3.10.5.5 3.10.5.4 3.10.5.1 3.10.4.7 3.10.3 3.10.2.2 3.10.1.1 3.10.0 3.9.2.12 English Deutsch
3.11.3.2 3.11.3.1 3.11.3.0 3.11.2.3 3.11.2.2 3.11.2.1 3.11.2 3.11.1 3.11.0.1 3.11.0 3.10.6.6 3.10.6.5 3.10.6.4 3.10.6.3 3.10.6.2 3.10.6.1 3.10.5.5 3.10.5.4 3.10.5.1 3.10.4.7 3.10.3 3.10.2.2 3.10.1.1 3.10.0 3.9.2.12 English Deutsch

Code Examples


Code Examples for Data Time Series & Attributes

C#
using System;
using System.Collections.Generic;
using System.Linq;
using HAKOM.Framework.Components2016;
using HAKOM.Framework.Components2016.Attribute;
using HAKOM.Framework.Components2016.TimeSeries;
using Microsoft.VisualStudio.TestTools.UnitTesting;
 
namespace Examples.DOTNET_API
{
	[TestClass]
	public class DotNetApiTest
	{
		private const string CONNECTION_NAME = "ZAMS";
		private ITimeSeriesRepository tsRepository = RepositoryFactory.GetTimeSeriesRepository(CONNECTION_NAME, attributesEnabled: false);
		private ITimeSeriesAttributeRepository tsAttributeRepository = RepositoryFactory.GetTimeSeriesAttributeRepository(CONNECTION_NAME);
 
		/// <summary>
		/// 1. Create time series with data for one day
		/// 2. Search time series by name
		/// 3. Get data as saved in DB
		/// 4. Get data with specific interval
		/// 5. Get data with specific interval and unit
		/// 6. Delete time series
		/// </summary>
		[TestMethod]
		public void BasicApiTest()
		{
			ITimeSeriesEntity timeSeriesEntity = EntityFactory.CreateTimeSeriesEntity(tsRepository);
			timeSeriesEntity.Definition.Name = Guid.NewGuid().ToString();
			timeSeriesEntity.Definition.Table = "FWT_TSDATA";
			timeSeriesEntity.Definition.Interval = new Interval(TimeSeriesInterval.Hour);
			timeSeriesEntity.Definition.Type = TimeSeriesType.Begin;
			timeSeriesEntity.Definition.Unit = "kW";
 
			const int hours = 24;
			DateTime from = DateTime.Today;
			DateTime to = DateTime.Today.AddDays(1);
 
			TimeSeriesData[] expected = new TimeSeriesData[hours];
			for(int i = 0; i < expected.Length; i++)
			{
				expected[i] = new TimeSeriesData(
					new TimeSeriesDateTime(from.AddHours(i)),
					new TimeSeriesDateTime(from.AddHours(i + 1)),
					i + 1,
					TimeSeriesFlag.Valid
				);
			}
 
			timeSeriesEntity.SetData(Operation.Set, expected);
			tsRepository.Save(timeSeriesEntity);
 
			try
			{
				var period = new Period(expected.First().FromDate, expected.Last().ToDate);
				bool loadDefinitionAndDataInOneStep = true;
				ITimeSeriesEntity tsLoaded;
 
				if(loadDefinitionAndDataInOneStep)
				{
					// Load data from DB into memory
					tsLoaded = tsRepository.Load(timeSeriesEntity.Definition.ID, period);
				}
				else
				{
					tsLoaded = tsRepository.Search(timeSeriesEntity.Definition.Name);
 
					// Load data from DB into memory
					tsRepository.Load(tsLoaded, period);
				}
 
				// Get data as saved in DB
				TimeSeriesData[] actual = tsLoaded.GetData(period).ToArray();
 
				CollectionAssert.AreEqual(expected, actual);
 
				expected = new TimeSeriesData[] {
					new TimeSeriesData(
						new TimeSeriesDateTime(from),
						new TimeSeriesDateTime(to),
						12.5,
						TimeSeriesFlag.Valid
					)
				};
 
				// Get data with specific interval (Aggregation depends on unit. Default: Average.")
				actual = tsLoaded.GetData(period, new Interval(TimeSeriesInterval.Day)).ToArray();
 
				CollectionAssert.AreEqual(expected, actual);
 
				expected = new TimeSeriesData[] {
					new TimeSeriesData(
						new TimeSeriesDateTime(from),
						new TimeSeriesDateTime(to),
						300,
						TimeSeriesFlag.Valid
					)
				};
 
				// Get data with specific interval and unit. Unit conversion according to rules defined in DB.
				actual = tsLoaded.GetData(period, new Interval(TimeSeriesInterval.Day), new ExchangeUnit("kWh")).ToArray();
 
				CollectionAssert.AreEqual(expected, actual);
			}
			finally
			{
				tsRepository.Delete(timeSeriesEntity.Definition.ID);
			}
		}
 
		[TestMethod]
		public void AttributesTest()
		{
			// Create new text attribute
			IAttributeEntity attributeEntity = EntityFactory.CreateAttributeEntity(
				Guid.NewGuid().ToString(),
				AttributeType.Text
			);
 
			tsAttributeRepository.Save(attributeEntity);
 
			// Create new time series
			ITimeSeriesEntity timeSeriesEntity = EntityFactory.CreateTimeSeriesEntity(tsRepository);
			timeSeriesEntity.Definition.Name = Guid.NewGuid().ToString();
			timeSeriesEntity.Definition.Table = "FWT_TSDATA";
			timeSeriesEntity.Definition.Interval = new Interval(TimeSeriesInterval.Hour);
			timeSeriesEntity.Definition.Type = TimeSeriesType.Begin;
 
			tsRepository.Save(timeSeriesEntity);
 
			// Assign attribute to time series
			var assignedAttributes = new AttributeValuesEntity[] {
				new AttributeValuesEntity(
					attributeEntity.ID,
					new Dictionary<TimeSeriesDateTime, string>() {
						{ new TimeSeriesDateTime(2017, 1, 1), "foo" },
						{ new TimeSeriesDateTime(2018, 1, 1), "moo" }
					})
			};
 
			tsRepository.SaveAttributeValues(timeSeriesEntity.Definition.ID, assignedAttributes);
 
			try
			{
				// Search time series by attribute name
				var definitionFilter = new DefinitionFilter()
				{
					Attributes = new AttributeFilter[] {
						new AttributeFilter(attributeEntity.Name)
					}
				};
 
				var result = tsRepository.Search(definitionFilter).ToArray();
				Assert.AreEqual(1, result.Length);
 
				// Search time series by attribute name and value
				definitionFilter = new DefinitionFilter()
				{
					Attributes = new AttributeFilter[] {
						new AttributeFilter(attributeEntity.Name, "foo")
					}
				};
 
				result = tsRepository.Search(definitionFilter).ToArray();
				Assert.AreEqual(1, result.Length);
			}
			finally
			{
				tsRepository.Delete(timeSeriesEntity.Definition.ID);
				tsAttributeRepository.Delete(attributeEntity.Name);
			}
		}
 
		[TestMethod]
		public void AttributesSumTest()
		{
			// Create new text attribute
			IAttributeEntity attribute = EntityFactory.CreateAttributeEntity(
				Guid.NewGuid().ToString(),
				AttributeType.Text
			);
 
			tsAttributeRepository.Save(attribute);
 
			// Create new time series
			ITimeSeriesEntity timeSeries1 = EntityFactory.CreateTimeSeriesEntity(tsRepository);
			timeSeries1.Definition.Name = Guid.NewGuid().ToString();
			timeSeries1.Definition.Table = "FWT_TSDATA";
			timeSeries1.Definition.Interval = new Interval(TimeSeriesInterval.Hour);
			timeSeries1.Definition.Type = TimeSeriesType.Begin;
 
			const int hours = 24;
			DateTime from = DateTime.Today;
			DateTime to = DateTime.Today.AddDays(1);
 
			TimeSeriesData[] tsData = new TimeSeriesData[hours];
			for(int i = 0; i < tsData.Length; i++)
			{
				tsData[i] = new TimeSeriesData(
					new TimeSeriesDateTime(from.AddHours(i)),
					new TimeSeriesDateTime(from.AddHours(i + 1)),
					i + 1,
					TimeSeriesFlag.Valid
				);
			}
 
			timeSeries1.SetData(Operation.Set, tsData);
			tsRepository.Save(timeSeries1);
 
			// Create new time series
			ITimeSeriesEntity timeSeries2 = EntityFactory.CreateTimeSeriesEntity(tsRepository);
			timeSeries2.Definition.Name = Guid.NewGuid().ToString();
			timeSeries2.Definition.Table = "FWT_TSDATA";
			timeSeries2.Definition.Interval = new Interval(TimeSeriesInterval.Hour);
			timeSeries2.Definition.Type = TimeSeriesType.Begin;
 
			timeSeries2.SetData(Operation.Set, tsData);
			tsRepository.Save(timeSeries2);
 
			// Assign attribute to time series
			var assignedAttributes = new AttributeValuesEntity[] {
				new AttributeValuesEntity(
					attribute.ID,
					new Dictionary<TimeSeriesDateTime, string>() {
						{ TimeSeriesDateTime.MinValue, "foo" }
					})
			};
 
			tsRepository.SaveAttributeValues(timeSeries1.Definition.ID, assignedAttributes);
			tsRepository.SaveAttributeValues(timeSeries2.Definition.ID, assignedAttributes);
 
			try
			{
				var period = new Period(tsData.First().FromDate, tsData.Last().ToDate);
 
				var attributeFilter = new AttributeFilter[] {
					new AttributeFilter(attribute.Name)
				};
 
				var actual = tsRepository.Sum(attributeFilter, period, new Interval(TimeSeriesInterval.Hour)).ToArray();
				var expected = tsData.Select(d => new TimeSeriesData(d.FromDate, d.ToDate, d.Value * 2, d.Flag)).ToArray();
 
				CollectionAssert.AreEqual(expected, actual);
			}
			finally
			{
				tsRepository.Delete(timeSeries1.Definition.ID);
				tsRepository.Delete(timeSeries2.Definition.ID);
				tsAttributeRepository.Delete(attribute.Name);
			}
		}
 
		[TestMethod]
		public void UnitConversionTest()
		{
			ITimeSeriesEntity tsExchangeDollarToEuro = EntityFactory.CreateTimeSeriesEntity(tsRepository);
			ITimeSeriesEntity tsDollar = EntityFactory.CreateTimeSeriesEntity(tsRepository);
 
			try
			{
				tsExchangeDollarToEuro.Definition.Name = "USD_EUR_" + Guid.NewGuid().ToString();
				tsExchangeDollarToEuro.Definition.Table = "FWT_TSDATA";
				tsExchangeDollarToEuro.Definition.Interval = new Interval(TimeSeriesInterval.Day);
				tsExchangeDollarToEuro.Definition.Type = TimeSeriesType.Begin;
				tsExchangeDollarToEuro.Definition.Unit = "USD/EUR";
 
				TimeSeriesDateTime from = new TimeSeriesDateTime(DateTime.Today);
				TimeSeriesDateTime to = new TimeSeriesDateTime(DateTime.Today.AddDays(1));
				var period = new Period(from, to);
 
				tsExchangeDollarToEuro.SetData(Operation.Set, 1.1234, period);
				tsRepository.Save(tsExchangeDollarToEuro);
 
				tsDollar.Definition.Name = "USD_" + Guid.NewGuid().ToString();
				tsDollar.Definition.Table = "FWT_TSDATA";
				tsDollar.Definition.Interval = new Interval(TimeSeriesInterval.Day);
				tsDollar.Definition.Type = TimeSeriesType.Begin;
				tsDollar.Definition.Unit = "USD";
				tsDollar.Definition.ExchangeTimeSeries = new List<int>() { tsExchangeDollarToEuro.Definition.ID };
 
				tsDollar.SetData(Operation.Set, 10000, period);
				tsRepository.Save(tsDollar);
 
				TimeSeriesData[] actual = tsDollar.GetData(period, new Interval(TimeSeriesInterval.Day), new ExchangeUnit("EUR")).ToArray();
 
				TimeSeriesData[] expected = new TimeSeriesData[] {
					new TimeSeriesData(
						from,
						to,
						10000 / 1.1234,
						TimeSeriesFlag.Valid
					)
				};
 
				CollectionAssert.AreEqual(expected, actual);
			}
			finally
			{
				if(tsExchangeDollarToEuro.Definition.ID > 0)
					tsRepository.Delete(tsExchangeDollarToEuro.Definition.ID);
 
				if(tsDollar.Definition.ID > 0)
					tsRepository.Delete(tsDollar.Definition.ID);
			}
		}
	}
}

Code Examples for Formula Time Series

C#
using System;
using System.Collections.Generic;
using System.Linq;
using HAKOM.Framework.Components2016;
using HAKOM.Framework.Components2016.TimeSeries;
using Microsoft.VisualStudio.TestTools.UnitTesting;
 
namespace EvalComponentTest
{
	[TestClass]
	public class EvalComponentTest
	{
		private const string CONNECTION_NAME = "ZAMS";
		private ITimeSeriesRepository tsRepository = RepositoryFactory.GetTimeSeriesRepository(CONNECTION_NAME, attributesEnabled: false);
 
		[TestMethod]
		public void UnitConversionTest()
		{
			ITimeSeriesEntity dataTS = EntityFactory.CreateTimeSeriesEntity(tsRepository);
			dataTS.Definition.Name = Guid.NewGuid().ToString();
			dataTS.Definition.Table = "FWT_TSDATA";
			dataTS.Definition.Interval = new Interval(TimeSeriesInterval.Hour);
			dataTS.Definition.Type = TimeSeriesType.Begin;
			dataTS.Definition.Unit = "KW";
 
			DateTime from = DateTime.Today;
			DateTime to = DateTime.Today.AddDays(1);
 
			TimeSeriesData[] data = new TimeSeriesData[24];
			for(int i = 0; i < data.Length; i++)
			{
				data[i] = new TimeSeriesData(
					new TimeSeriesDateTime(from.AddHours(i)),
					new TimeSeriesDateTime(from.AddHours(i + 1)),
					i + 1,
					TimeSeriesFlag.Valid
				);
			}
 
			dataTS.SetData(Operation.Set, data);
			tsRepository.Save(dataTS);
 
			try
			{
				ITimeSeriesEntity formulaTS = EntityFactory.CreateTimeSeriesEntity(tsRepository);
				formulaTS.Definition.Formula = new Dictionary<TimeSeriesDateTime, string>() {
					{ TimeSeriesDateTime.MinValue, string.Format("[{0}]", dataTS.Definition.ID) }
				};
				formulaTS.Definition.Interval = new Interval(TimeSeriesInterval.Day);
				formulaTS.Definition.Type = TimeSeriesType.Begin;
				formulaTS.Definition.Unit = "KWh";
 
				var period = new Period(new TimeSeriesDateTime(from), new TimeSeriesDateTime(to));
				tsRepository.Load(formulaTS, period);
 
				// Default-Aggregation: Average
				TimeSeriesData[] actual = formulaTS.GetData(period).ToArray();
				TimeSeriesData[] expected = new TimeSeriesData[] {
					new TimeSeriesData(
						new TimeSeriesDateTime(from),
						new TimeSeriesDateTime(to),
						12.5,
						TimeSeriesFlag.Valid
					)
				};
 
				CollectionAssert.AreEqual(expected, actual);
 
				// Force unit conversion: KWh
				formulaTS.Definition.Formula = new Dictionary<TimeSeriesDateTime, string>() {
					{ TimeSeriesDateTime.MinValue, string.Format("[{0},,KWh]", dataTS.Definition.ID) }
				};
				tsRepository.Load(formulaTS, period);
				actual = formulaTS.GetData(period).ToArray();
 
				expected = new TimeSeriesData[] {
					new TimeSeriesData(
						new TimeSeriesDateTime(from),
						new TimeSeriesDateTime(to),
						300,
						TimeSeriesFlag.Valid
					)
				};
 
				CollectionAssert.AreEqual(expected, actual);
			}
			finally
			{
				tsRepository.Delete(dataTS.Definition.ID);
			}
		}
 
		[TestMethod]
		public void AggregationTest()
		{
			ITimeSeriesEntity dataTS = EntityFactory.CreateTimeSeriesEntity(tsRepository);
			dataTS.Definition.Name = Guid.NewGuid().ToString();
			dataTS.Definition.Table = "FWT_TSDATA";
			dataTS.Definition.Interval = new Interval(TimeSeriesInterval.Hour);
			dataTS.Definition.Type = TimeSeriesType.Begin;
 
			DateTime from = DateTime.Today;
			DateTime to = DateTime.Today.AddDays(1);
 
			TimeSeriesData[] data = new TimeSeriesData[24];
			for(int i = 0; i < data.Length; i++)
			{
				data[i] = new TimeSeriesData(
					new TimeSeriesDateTime(from.AddHours(i)),
					new TimeSeriesDateTime(from.AddHours(i + 1)),
					i + 1,
					TimeSeriesFlag.Valid
				);
			}
 
			dataTS.SetData(Operation.Set, data);
			tsRepository.Save(dataTS);
 
			try
			{
				ITimeSeriesEntity formulaTS = EntityFactory.CreateTimeSeriesEntity(tsRepository);
				formulaTS.Definition.Formula = new Dictionary<TimeSeriesDateTime, string>() {
					{ TimeSeriesDateTime.MinValue, string.Format("[{0}]", dataTS.Definition.ID) }
				};
				formulaTS.Definition.Interval = new Interval(TimeSeriesInterval.Day);
				formulaTS.Definition.Type = TimeSeriesType.Begin;
 
				var period = new Period(new TimeSeriesDateTime(from), new TimeSeriesDateTime(to));
				tsRepository.Load(formulaTS, period);
 
				// Default-Aggregation: Average
				TimeSeriesData[] actual = formulaTS.GetData(period).ToArray();
				TimeSeriesData[] expected = new TimeSeriesData[] {
					new TimeSeriesData(
						new TimeSeriesDateTime(from),
						new TimeSeriesDateTime(to),
						12.5,
						TimeSeriesFlag.Valid
					)
				};
 
				CollectionAssert.AreEqual(expected, actual);
 
				// Force Aggregation: Sum
				formulaTS.Definition.Formula = new Dictionary<TimeSeriesDateTime, string>() {
					{ TimeSeriesDateTime.MinValue, string.Format("[{0},,,Sum]", dataTS.Definition.ID) }
				};
 
				tsRepository.Load(formulaTS, period);
				actual = formulaTS.GetData(period).ToArray();
 
				expected = new TimeSeriesData[] {
					new TimeSeriesData(
						new TimeSeriesDateTime(from),
						new TimeSeriesDateTime(to),
						300,
						TimeSeriesFlag.Valid
					)
				};
 
				CollectionAssert.AreEqual(expected, actual);
			}
			finally
			{
				tsRepository.Delete(dataTS.Definition.ID);
			}
		}
 
		[TestMethod]
		public void OffsetTest_Lead()
		{
			ITimeSeriesEntity dataTS = EntityFactory.CreateTimeSeriesEntity(tsRepository);
			dataTS.Definition.Name = Guid.NewGuid().ToString();
			dataTS.Definition.Table = "FWT_TSDATA";
			dataTS.Definition.Interval = new Interval(TimeSeriesInterval.Day);
			dataTS.Definition.Type = TimeSeriesType.Begin;
 
			DateTime today = DateTime.Today;
 
			TimeSeriesData[] data = new TimeSeriesData[5];
			for(int i = 0; i < data.Length; i++)
			{
				data[i] = new TimeSeriesData(
					new TimeSeriesDateTime(today.AddDays(i)),
					new TimeSeriesDateTime(today.AddDays(i + 1)),
					i + 1,
					TimeSeriesFlag.Valid
				);
			}
 
			dataTS.SetData(Operation.Set, data);
			tsRepository.Save(dataTS);
 
			try
			{
				ITimeSeriesEntity formulaTS = EntityFactory.CreateTimeSeriesEntity(tsRepository);
				formulaTS.Definition.Formula = new Dictionary<TimeSeriesDateTime, string>() {
					{ TimeSeriesDateTime.MinValue, string.Format("Lead([{0}, 1], 1)", dataTS.Definition.ID) }
				};
 
				formulaTS.Definition.Interval = new Interval(TimeSeriesInterval.Day);
				formulaTS.Definition.Type = TimeSeriesType.Begin;
 
				DateTime from = today.AddDays(1);
				DateTime to = today.AddDays(4);
				var period = new Period(new TimeSeriesDateTime(from), new TimeSeriesDateTime(to));
				tsRepository.Load(formulaTS, period);
 
				TimeSeriesData[] actual = formulaTS.GetData(period).ToArray();
				TimeSeriesData[] expected = data
					.Skip(1)
					.Take(3)
					.Select(d => new TimeSeriesData(d.FromDate, d.ToDate, d.Value + 1, d.Flag))
					.ToArray();
 
				CollectionAssert.AreEqual(expected, actual);
			}
			finally
			{
				tsRepository.Delete(dataTS.Definition.ID);
			}
		}
 
		[TestMethod]
		public void OffsetTest_Lag()
		{
			ITimeSeriesEntity dataTS = EntityFactory.CreateTimeSeriesEntity(tsRepository);
			dataTS.Definition.Name = Guid.NewGuid().ToString();
			dataTS.Definition.Table = "FWT_TSDATA";
			dataTS.Definition.Interval = new Interval(TimeSeriesInterval.Day);
			dataTS.Definition.Type = TimeSeriesType.Begin;
 
			DateTime today = DateTime.Today;
 
			TimeSeriesData[] data = new TimeSeriesData[5];
			for(int i = 0; i < data.Length; i++)
			{
				data[i] = new TimeSeriesData(
					new TimeSeriesDateTime(today.AddDays(i)),
					new TimeSeriesDateTime(today.AddDays(i + 1)),
					i + 1,
					TimeSeriesFlag.Valid
				);
			}
 
			dataTS.SetData(Operation.Set, data);
			tsRepository.Save(dataTS);
 
			try
			{
				ITimeSeriesEntity formulaTS = EntityFactory.CreateTimeSeriesEntity(tsRepository);
				formulaTS.Definition.Formula = new Dictionary<TimeSeriesDateTime, string>() {
					{ TimeSeriesDateTime.MinValue, string.Format("Lag([{0}, 1], 1)", dataTS.Definition.ID) }
				};
				formulaTS.Definition.Interval = new Interval(TimeSeriesInterval.Day);
				formulaTS.Definition.Type = TimeSeriesType.Begin;
 
				DateTime from = today.AddDays(1);
				DateTime to = today.AddDays(4);
				var period = new Period(new TimeSeriesDateTime(from), new TimeSeriesDateTime(to));
				tsRepository.Load(formulaTS, period);
 
				TimeSeriesData[] actual = formulaTS.GetData(period).ToArray();
				TimeSeriesData[] expected = data
					.Skip(1)
					.Take(3)
					.Select(d => new TimeSeriesData(d.FromDate, d.ToDate, d.Value - 1, d.Flag))
					.ToArray();
 
				CollectionAssert.AreEqual(expected, actual);
			}
			finally
			{
				tsRepository.Delete(dataTS.Definition.ID);
			}
		}
	}
}