Hodnoty a trendy k úlům

**> Vyhodnocování posledních hodnot a trendů k úlům

pátek 17. května 2019

11:46

Stávající stav

 

TEST20(ProBee koncept)

 

Via interface2.aspx. Původně se tento proces volal pouze na podnět poslání dat z centrály (ze staré centrály). Nyní je spouštěn službou každých 5 minut. Provádí se následujícíc akce:

Bee.SendMsSqlStatus() ... emailova notifikace jako zcela prvni
Bee.Log() ... zapise do test20 tblLog, nic vic nedela
Bee.GetPostData() ... zapise do test20 tblRecords, tblSubRecords a tblUnitsRecords hodnoty z POSTu
BeeInterface.ImportAll() ... importy z test20 do tabulek www_probee_cz tblVoltage, tblWeight, tblTemperature
BeeUtlum.VyhodnoceniUtlumu() ... vyhodnoceni utlumu z test20 tabulek, vysledek se posle via WS ()

 

 

ProBee.cz(hlavní site)

 

Via FreeArea/process1min.aspx v minutových intervalech:

 

'zpracovani dat (SigFox POST -> tblTemperatureExternal, tblWeight, tblVoltage, tblGPS, tblAlarm)

InterfaceBee.ProcessingPostData()

 

'prirazeni dat BLOBU senzorum

InterfaceBee.AssignBlob2Sensor()

 

'zaslani vyzadanych (na urcity cas) invokacnich SMS kameram

InterfaceBee.SendInvocationSms()

InterfaceBee.SendInvocationSms1()

InterfaceBee.SendInvocationSms2()

 

'pocasi

FunkceOpenWeather.GetForecastInfo()

FunkceOpenWeather.GetWeatherInfo()

 

'alerty (pohybovy alarm) + SMS invoke kamery

FunkceBee.SendNotificationsAlarm()

 

'alerty (skokové změny váhy) + SMS invoke kamery

FunkceBee.SendNotificationsWeight()

 

'alerty (napeti akumulatoru)

FunkceBee.SendNotificationsVoltage()

 

'posilani dat na ZUC

InterfaceBee.doAllPosts("probee:sofech2017", 10)

InterfaceBee.doAllPostsT("probee:sofech2017", 10)

 

'zpracovani poslednich hodnot teploty, vahy, napeti a trendu vahy k tabulce ULY (neresi posledni hodnoty k tabulce SENZORY)

InterfaceBee.ProcessingLastValues() … T-SQL procedura subUpdateLastValuesAll

InterfaceBee.ProcessingWeightTrends() … T-SQL procedura subUpdateWeightTrendsAll

 

Jakým algoritmem fungují procedury lastvalues a weighttrends ?

 

subUpdateLastValuesAll

 

Aktualizace hodnot v tabulce tblUl:

  • UL.UlTemperature = t.TempDecimal ,

  • UL.UlTemperatureMin = ISNULL(t.TempDecimalMin, 0.0) ,

  • UlTemperatureMax = ISNULL(t.TempDecimalMax, 0.0) ,

  • UlVoltage = v.VoltDecimal ,

  • UlVoltageMin = ISNULL(v.VoltDecimalMin, 0.0) ,

  • UlVoltageMax = ISNULL(v.VoltDecimalMax, 0.0) ,

  • UlVaha = w.WeiDecimal ,

  • UlVahaMin = ISNULL(w.WeiDecimalMin, 0.0) ,

  • UlVahaMax = ISNULL(w.WeiDecimalMax, 0.0) ,

  • UlLastDateTime

     

Jedná se o poslední hodnoty teploty v úlu, váhy pod úlem (ne trend, ten řeší níže uvedený proces) a . Napětí u úlu nemá smysl, řeší se napětí senzorů. Dále se ukládájí aktuálně platné max a min rozsahy senzorů k úlu.

 

Původní zdrojový kód:

 

USE [www_probee_cz]

GO

/****** Object: StoredProcedure [dbo].[subUpdateLastValuesAll] Script Date: 28.05.2019 17:36:04 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

-- =============================================

-- Author:                Pavel Vanecek

-- Create date: 2017/10

-- Description:        Update poslednich hodnot teploty, vahy atd.

-- Pro vsechny uzivatele, spousti se kazdou minutu,

-- ale k prepoctu defakto dojde kazdou hodinu (@everyXXXhours)

-- Dale pokud udaj neni @hoursBack (standardne 4 hod nazpet) k dispozici,

-- vraci se NULL namisto 0 (udaj neni znam)

 

-- Slouzi pro barevne znazorneni hodnot teploty, napeti a vahy pro ul, patrne casem zrusime,

-- protoze vyhodnoceni alarmu se deje pro kazdy senzor jinde

-- =============================================

ALTER PROCEDURE [dbo].[subUpdateLastValuesAll]

@forceRecalculate AS BIT = 0 ,

@everyXXXhours AS INT = -1 ,

@hoursBack AS INT = -4

AS

BEGIN

 

SET NOCOUNT ON;

 

-- now

DECLARE @NowDateTime AS DATETIME = GETDATE();

-- limitni datumcas do historie (pokud bude posledni udaj starsi, pak ukazu NULL jako by nebyl/vypadek)

DECLARE @Limit AS DATETIME = DATEADD(HOUR, @hoursBack, @NowDateTime);

-- prepocet se deje jen kazdou hodinu (standardne)

DECLARE @Every AS DATETIME = DATEADD(HOUR, @everyXXXhours, @NowDateTime);

 

-- naleznu, kdy byl proveden posledni prepocet (bere se minimalni hodnota, ale mely by byt vsechny datumy shodne), opet jen pro uly ve vcelnicich, prirazene nejakemu uzivateli

DECLARE @LastRecalculateDateTime AS DATETIME;

SELECT @LastRecalculateDateTime = MIN(UlLastDateTime)

FROM dbo.tblUl

INNER JOIN dbo.tblVcelnice ON tblVcelnice.VceID = tblUl.UlVcelID

INNER JOIN dbo.tblUzivatel ON tblUzivatel.UzvID = tblVcelnice.VcelUzvID;

 

-- kdyz se nebude prepocitavat, tak navrat

IF ( @LastRecalculateDateTime IS NULL )

SET @LastRecalculateDateTime = @Every;

 

IF ( @LastRecalculateDateTime > @Every

AND @forceRecalculate = 0

)

RETURN;

 

-- provedeni aktualizace

UPDATE UL

SET UL.UlTemperature = t.TempDecimal ,

UL.UlTemperatureMin = ISNULL(t.TempDecimalMin, 0.0) ,

UlTemperatureMax = ISNULL(t.TempDecimalMax, 0.0) ,

UlVoltage = v.VoltDecimal ,

UlVoltageMin = ISNULL(v.VoltDecimalMin, 0.0) ,

UlVoltageMax = ISNULL(v.VoltDecimalMax, 0.0) ,

UlVaha = w.WeiDecimal ,

UlVahaMin = ISNULL(w.WeiDecimalMin, 0.0) ,

UlVahaMax = ISNULL(w.WeiDecimalMax, 0.0) ,

UlLastDateTime = @NowDateTime

FROM tblUl UL

INNER JOIN tblVcelnice ON tblVcelnice.VceID = UL.UlVcelID

INNER JOIN dbo.tblUzivatel ON tblUzivatel.UzvID = tblVcelnice.VcelUzvID

OUTER APPLY ( SELECT TOP 1 *

FROM tblTemperature te

WHERE te.TempUlId = UL.UlID

AND te.TempDateTime >= @Limit

ORDER BY te.TempDateTime DESC

) AS t

OUTER APPLY ( SELECT TOP 1 *

FROM tblVoltage vo

WHERE vo.VoltUlId = UL.UlID

AND vo.VoltDateTime >= @Limit

ORDER BY vo.VoltDateTime DESC

) AS v

OUTER APPLY ( SELECT TOP 1 *

FROM tblWeight we

WHERE we.WeiUlId = UL.UlID

AND we.WeiDateTime >= @Limit

ORDER BY we.WeiDateTime DESC

) AS w;

 

 

END;

 

 

 

subUpdateWeightTrendsAll

 

Description:        Aktualizace trendu vahy

Pro vsechny uzivatele, spousti se kazdou minutu,

ale k prepoctu defakto dojde jen jednou denne

 

Standardně se řeší s parametrem daysback = 2 dny. Pokud není hodnota 2 dny známa, pak neukáže žádný trend (což je asi pro uživatele matoucí). Trend se ukazuje jako poměr deviace průměru z maximálních hodnot minulých dnů vůči maximu vyhodnocovaného dne.

 

Plní se položky tabulky tblUl:

UlLastTrend … datum vyhodnoceného dne

UlTrend = 0 … nic, 1 … stoupá, -1 … klesá

 

 

Zdrojový kód pro případ, že bude vhodné se k původnímu řešení vrátit.

 

USE [www_probee_cz]

GO

/****** Object: StoredProcedure [dbo].[subUpdateWeightTrendsAll] Script Date: 21.05.2019 9:58:42 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

-- =============================================

-- Author:                Pavel Vanecek

-- Create date: 2017/10

-- Description:        Aktualizace trendu vahy

-- Pro vsechny uzivatele, spousti se kazdou minutu,

-- ale k prepoctu defakto dojde jen jednou denne

-- Dale pokud udaj neni @DaysBack k dispozici,

-- vraci se NULL (udaj neni znam)

 

-- Slouzi pro barevne znazorneni trendu vahy pro ul

-- =============================================

ALTER PROCEDURE [dbo].[subUpdateWeightTrendsAll]

@DaysBack AS INT = -2 ,

@Deviation AS DECIMAL = 0.05 ,

@top AS INT = 100

AS

BEGIN

 

SET NOCOUNT ON;

 

-- deklarace

DECLARE @UlID AS INT;

DECLARE @FETCH_STATUS INT;

DECLARE @AvgVal AS DECIMAL(18, 3);

DECLARE @CurVal AS DECIMAL(18, 3);

DECLARE @Trend AS INT;

 

-- zpracuje se vzdy jen @top pocet ulu, aby vypacet netrval dlouho

-- spousti se v minutovych intervalech, takze se dokoci v dalsim kole

 

-- now

DECLARE @NowDate AS DATETIME = ( SELECT DATEADD(

DAY ,

DATEDIFF(

DAY ,

0 ,

GETDATE()

) ,

0

)

);

 

-- limitni datumcas do historie (pokud bude posledni udaj starsi, pak ukazu NULL jako by nebyl)

DECLARE @DayFrom AS DATETIME = DATEADD(DAY, @DaysBack, @NowDate);

DECLARE @DayTo AS DATETIME = DATEADD(DAY, -2, @NowDate);

DECLARE @DayCurrent AS DATETIME = DATEADD(DAY, -1, @NowDate);

 

-- cyklus prez vsechny uly vsech uzivatelu, ktere nejsou prepocteny k aktualnimu dnu a ktere patri nekam do vcelnice

-- tedy zbytecne se nedela prepocet pri kazdem spusteni

DECLARE lc CURSOR LOCAL FOR

SELECT TOP ( @top ) UlID

FROM dbo.tblUl

INNER JOIN dbo.tblVcelnice ON tblVcelnice.VceID = tblUl.UlVcelID

INNER JOIN dbo.tblUzivatel ON tblUzivatel.UzvID = tblVcelnice.VcelUzvID

WHERE ( UlLastTrend < @DayCurrent

OR UlLastTrend IS NULL

);

 

OPEN lc;

FETCH NEXT FROM lc

INTO @UlID;

 

SET @FETCH_STATUS = @@FETCH_STATUS;

WHILE ( @FETCH_STATUS = 0 )

BEGIN

 

SELECT @AvgVal = AVG(MA.MAD)

FROM ( SELECT WeiDate ,

MAX(WeiDecimal) AS MAD

FROM dbo.tblWeight

WHERE WeiUlId = @UlID

AND WeiDate

BETWEEN @DayFrom AND @DayTo

GROUP BY WeiDate

) MA;

 

SELECT @CurVal = MAX(WeiDecimal)

FROM dbo.tblWeight

WHERE WeiUlId = @UlID

AND WeiDate = @DayCurrent;

 

IF ( @AvgVal IS NULL

OR @CurVal IS NULL

)

SET @Trend = NULL;

ELSE IF ( ABS(@AvgVal - @CurVal) <= @Deviation )

SET @Trend = 0;

ELSE IF @AvgVal > @CurVal

SET @Trend = -1;

ELSE

SET @Trend = 1;

 

UPDATE dbo.tblUl

SET UlLastTrend = @DayCurrent ,

UlTrend = @Trend

WHERE UlID = @UlID;

 

FETCH NEXT FROM lc

INTO @UlID;

SET @FETCH_STATUS = @@FETCH_STATUS;

END;

CLOSE lc;

DEALLOCATE lc;

 

END;

 

 

 

 

Přepracované řešení

 

Současný stav má k dispozici hodnoty vztažené k senzoru. Cílem je tyto poslední hodnoty zpracovat s ohledem na přiřazení senzoru k úlu.

Což je problém, protože je třeba nějak řešit více senzorů stejných ukazatelů, umístěných v jednom úlu.

 

Dále je cílem opustit pravidelně volané procedury

InterfaceBee.ProcessingLastValues() … T-SQL procedura subUpdateLastValuesAll

InterfaceBee.ProcessingWeightTrends() … T-SQL procedura subUpdateWeightTrendsAll

a vše transformovat do triggeru nebo jediné T-SQL procedury, která údaje z tblSensors bude portovat do tblUl.

 

Cílem je jednotné řešení, situované v triggeru ONINSERT každé veličiny (jako např. TRIGGER [dbo].[triBehaviorResultOnInsert] ON [dbo].[tblBehaviorResult]). Týká se to tabulek, které se vztahují k hodnotám úlu: tblWeight, tblTemperature.

 

Poslední hodnoty senzoru:

 

[SenLastData]

[SenLastGpsStatus]

[SenLastAlarm]

[SenLastAlarmChanged]

[SenLastAlarmChangedDateTime]

[SenLastTempDecimal]

[SenLastExternalTempDecimal]

[SenLastWeightDecimal]

[SenLastVoltageDecimal]

[SenLastVoltagePerCent]

[SenLastAlarmIchKey]

[SenLastActDateTime]

[SenLastVoltageStatus]

[SenLastVoltageStatusChanged]

[SenLastVoltageStatusChangedDateTime]

[SenLastActDateTime1]

[SenLastActDateTime2]

[SenLastWeightAlarm]

[SenLastWeightAlarmDate]

 

Nové položky v tblUl

 

  • UlTemperatureLastDateTime

  • UlVahaLastDateTime

     

     

Princip volby senzoru, který bude vyhodnocen, jako určující pro poslední hodnotu k úlu

 

Vezme se ze seznamu všech aktuálně aktivních ten, který měří teplotu a má nejvyšší SenKey. Hodnoty ze všech dalších senzorů teplot, které sice patří k úlu, ale mají nižší SenKey, se ignorují (co se týká posledních hodnot k úlu)

 

Plnění se děje v násl.triggerech:

 

[triWeightOnInsert]

 

UlVaha

UlVahaMin

UlVahaMax

UlVahaLastDateTime

UlTrend (0 … nic, 1 … stoupá, -1 … klesá)

UlLastTrend

UlLastDateTime

 

USE [www_probee_cz];

GO

/****** Object: Trigger [dbo].[triWeightOnInsert] Script Date: 28.05.2019 16:00:28 ******/

SET ANSI_NULLS ON;

GO

SET QUOTED_IDENTIFIER ON;

GO

-- =============================================

-- Author:                Pavel Vanecek

-- Create date: 2018/04

-- Description:        

-- Po insertu vety se zapise posledni hodnota take do tblSensors.SenLastXXXXXXX

-- CHANGELOG 2019/02 ... nove se zapisujie a vyhodnocuje hodnota SenLastWeightAlarm , SenLastWeightAlarmDate

-- CHANGELOG 2019/05/28 ... vyhodnoceni poslednich hodnot a trendu do tabulky tblUl

-- Trend teploty nahoru dolu se resi tak, ze se porovna aktualni hodnota vuci prumeru za poslednich XXX hodin

-- =============================================

ALTER TRIGGER [dbo].[triWeightOnInsert]

ON [dbo].[tblWeight]

AFTER INSERT

AS

BEGIN

SET NOCOUNT ON;

 

-- rekurzivni trigger, zakazat

IF TRIGGER_NESTLEVEL(OBJECT_ID('dbo.triWeightOnInsert')) > 1

RETURN;

 

-- parametry pro vyhodnoceni trendu (prumerna hodnota za XXX minut nazpet, minimalni rozdil v stC)

DECLARE @TrendTimeDifferenceMinutes AS INT = 120;

DECLARE @TrendWeightDifference AS DECIMAL = 0.05;

 

-- parametry pro skokovou zmenu vahy, zatim bez moznosti externe upravovat (min rozdil vahy v kg za max.casovy rozdil v minutach)

DECLARE @WeightDifference AS DECIMAL = 5;

DECLARE @TimeDifferenceMinutes AS INT = 60;

-- pokud jsou parametry splneny, pak se nahodi priznak SenLastWeightAlarm, pokud ne, pak se ponecha beze zmeny (neshazuje se) !

 

-- okamzik vlozeni a XXX minut nazpet

DECLARE @now AS DATETIME = GETDATE();

DECLARE @bef AS DATETIME = DATEADD(

MINUTE ,

( -1 )

* @TrendTimeDifferenceMinutes,

@now

);

 

 

-- update hodnot v tabulce tblSensors

WITH sen

AS ( SELECT TOP 100 PERCENT dbo.tblSensors.SenLastWeightDecimal ,

dbo.tblSensors.SenLastData ,

Inserted.WeiDecimal ,

dbo.tblSensors.SenLastWeightAlarm ,

dbo.tblSensors.SenLastWeightAlarmDate

FROM Inserted

INNER JOIN dbo.tblSensors ON Inserted.WeiSenKey = SenKey

ORDER BY Inserted.WeiDateTime ASC

)

UPDATE sen

SET sen.SenLastWeightAlarmDate = CASE WHEN ( ( ABS(sen.SenLastWeightDecimal

- sen.WeiDecimal

) >= @WeightDifference

)

AND ( DATEDIFF(

MINUTE ,

sen.SenLastData,

@now

) <= @TimeDifferenceMinutes

)

) THEN @now

ELSE sen.SenLastWeightAlarmDate

END ,

sen.SenLastWeightAlarm = CASE WHEN ( ( ABS(sen.SenLastWeightDecimal

- sen.WeiDecimal

) >= @WeightDifference

)

AND ( DATEDIFF(

MINUTE ,

sen.SenLastData,

@now

) <= @TimeDifferenceMinutes

)

) THEN CAST(1 AS BIT)

ELSE sen.SenLastWeightAlarm

END ,

sen.SenLastWeightDecimal = sen.WeiDecimal ,

sen.SenLastData = @now;

 

-- update poslednich hodnot v tblUl, ale jen když pocházejí z uloveho vahoveho (!) senzoru, který je aktivní a má max SenKey

-- UlVaha

-- UlVahaMin

-- UlVahaMax

-- UlVahaLastDateTime

-- UlLastDateTime

-- UlTrend (0 … nic, 1 … stoupá, -1 … klesá)

-- UlLastTrend

 

WITH ul

AS ( SELECT TOP 100 PERCENT dbo.tblUl.UlVaha ,

dbo.tblUl.UlVahaMin ,

dbo.tblUl.UlVahaMax ,

dbo.tblUl.UlVahaLastDateTime ,

dbo.tblUl.UlLastDateTime ,

dbo.tblUl.UlTrend ,

dbo.tblUl.UlLastTrend ,

Inserted.WeiDecimal ,

Inserted.WeiDecimalMin ,

Inserted.WeiDecimalMax ,

( SELECT AVG(W.WeiDecimal)

FROM dbo.tblWeight W

WHERE W.WeiUlId = UlID

AND W.WeiSenKey = Inserted.WeiSenKey

AND W.WeiDateTime

BETWEEN @bef AND @now

) AS avt

FROM dbo.tblUl

INNER JOIN Inserted ON Inserted.WeiUlId = tblUl.UlID

INNER JOIN dbo.tblSensors ON Inserted.WeiSenKey = dbo.tblSensors.SenKey

WHERE SenKey = ( SELECT MAX(SEN.SenKey)

FROM dbo.tblSensors AS SEN

WHERE SEN.SenActive = 1

AND SEN.SenUlID = dbo.tblUl.UlID

AND SEN.SenWeightAvailable = 1

)

)

UPDATE ul

SET ul.UlVaha = ul.WeiDecimal ,

ul.UlVahaMin = ul.WeiDecimalMin ,

ul.UlVahaMax = ul.WeiDecimalMax ,

ul.UlLastDateTime = @now ,

ul.UlVahaLastDateTime = @now ,

ul.UlTrend = CASE WHEN ( ul.WeiDecimal > ul.avt ) THEN 1

WHEN ( ul.WeiDecimal < ul.avt ) THEN -1

ELSE 0

END ,

ul.UlLastTrend = @now;

 

 

 

END;

 

 

 

[triTemperatureOnInsert]

 

Plní se položky:

UlTemperature

UlTemperatureMin

UlTemperatureMax

UlTemperatureLastDateTime

UlLastDateTime

 

USE [www_probee_cz];

GO

/****** Object: Trigger [dbo].[triTemperatureOnInsert] Script Date: 28.05.2019 20:52:39 ******/

SET ANSI_NULLS ON;

GO

SET QUOTED_IDENTIFIER ON;

GO

-- =============================================

-- Author:                Pavel Vanecek

-- Create date: 2018/04

-- Description:        

-- Po insertu vety se zapise posledni hodnota take do tblSensors.SenLastXXXXXXX

-- CHANGELOG 2019/05/28 ... vyhodnoceni poslednich hodnot do tabulky tblUl

-- =============================================

ALTER TRIGGER [dbo].[triTemperatureOnInsert]

ON [dbo].[tblTemperature]

AFTER INSERT

AS

BEGIN

SET NOCOUNT ON;

 

-- rekurzivni trigger, zakazat

IF TRIGGER_NESTLEVEL(OBJECT_ID('dbo.triTemperatureOnInsert')) > 1

RETURN;

 

DECLARE @LastData AS DATETIME = GETDATE();

-- update poslednich hodnot v tblUl, ale jen když pocházejí z úlového teplotního (!) senzoru, který je aktivní a má max SenKey

WITH ul

AS ( SELECT TOP 100 PERCENT dbo.tblUl.UlTemperature ,

dbo.tblUl.UlTemperatureMin ,

dbo.tblUl.UlTemperatureMax ,

dbo.tblUl.UlLastDateTime ,

dbo.tblUl.UlTemperatureLastDateTime ,

Inserted.TempDecimal ,

Inserted.TempDecimalMin ,

Inserted.TempDecimalMax

FROM dbo.tblUl

INNER JOIN Inserted ON Inserted.TempUlId = tblUl.UlID

INNER JOIN dbo.tblSensors ON Inserted.TempSenKey = dbo.tblSensors.SenKey

WHERE SenKey = ( SELECT MAX(SEN.SenKey)

FROM dbo.tblSensors AS SEN

WHERE SEN.SenActive = 1

AND SEN.SenUlID = dbo.tblUl.UlID

AND SEN.SenTempAvailable = 1

)

)

UPDATE ul

SET ul.UlTemperature = ul.TempDecimal ,

ul.UlTemperatureMin = ul.TempDecimalMin ,

ul.UlTemperatureMax = ul.TempDecimalMax ,

ul.UlLastDateTime = @LastData ,

ul.UlTemperatureLastDateTime = @LastData;

 

 

-- update poslednich hodnot v tblSensors

WITH sen

AS ( SELECT TOP 100 PERCENT dbo.tblSensors.SenLastTempDecimal ,

dbo.tblSensors.SenLastData ,

Inserted.TempDecimal

FROM Inserted

INNER JOIN dbo.tblSensors ON Inserted.TempSenKey = SenKey

ORDER BY Inserted.TempDateTime ASC

)

UPDATE sen

SET sen.SenLastTempDecimal = sen.TempDecimal ,

sen.SenLastData = @LastData;

 

 

END;

 

 

Nasazení do ostrého provozu - postup

 

  1. disable původního volání procedur InterfaceBee.ProcessingLastValues() a InterfaceBee.ProcessingWeightTrends(), tj. T-SQL subUpdateLastValuesAll a subUpdateWeightTrendsAll v minutových intervalech

  2. aktivace triggeru [dbo].[triTemperatureOnInsert] ON [dbo].[tblTemperature] AFTER INSERT

  3. aktivace triggeru [dbo].[triWeightOnInsert] ON [dbo].[tblWeight] AFTER INSERT

     

Testování objevení se nových hodnot UlTemperatureLastDateTime a UlVahaLastDateTime v tabullce tblUl.

 

 

O.K.

 

Úprava zobrazování trendu a hlavně ? při výpadku v seznamu úlů.

 

Jedná se o zobrazení ikony a barvy u teploty a u váhy. Úprava procedur:

 

FunkceBee.TempIcon_

Volá funkci GetRainbowIcon.

 

FunkceBee.TempColor_

Volá funkci GetRainbowColor.

 

FunkceBee.VahaTrendIcon_

Volá funkci GetTrendIcon.

 

FunkceBee.VahaTrendColor_

Volá funkci GetTrendColor.

 

Upravená verze kódu

 

'CHANGELOG 2019/05 ... pretizene funkce s novou polozkou datumu posledni hodnoty a poctu hodin zpet pred nastavenim ?

Public Function TempIcon_(value As Object, minvalue As Decimal, maxvalue As Decimal, lastdate As DateTime, hoursback As Int32) As String

If lastdate.AddHours(hoursback) < DateTime.Now Then value = Nothing

Return GetRainbowIcon("fas fa-thermometer-{0}", "fa fa-question", value, minvalue, maxvalue, min_index, max_index)

End Function

Public Function TempColor_(value As Object, minvalue As Decimal, maxvalue As Decimal, lastdate As DateTime, hoursback As Int32) As String

If lastdate.AddHours(hoursback) < DateTime.Now Then value = Nothing

Return GetRainbowColor(value, emptycolor, maxvalue, minvalue)

End Function

Public Function VahaTrendIcon_(trend As Object, lastdate As DateTime, hoursback As Int32) As String

If lastdate.AddHours(hoursback) < DateTime.Now Then trend = Nothing

Return GetTrendIcon("fas fa-arrow-{0}", "fa fa-question", trend)

End Function

Public Function VahaTrendColor_(trend As Object, lastdate As DateTime, hoursback As Int32) As String

If lastdate.AddHours(hoursback) < DateTime.Now Then trend = Nothing

Return GetTrendColor(trend, emptycolor)

End Function

 

 

 

Princip spočívá v tom, že se při každém poslání dat ze senzoru aktualizuje okamžik poslední hodnoty.

Jakmile je tento okamžik více než XXX hodin starý (hodnota je stará, kladné číslo), pak se místo ikony zobrazí ? a barva je defaultní.

Tato hodnota je globálně nastavitelná v WEB.CONFIG jako položka (TODO večer)