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
disable původního volání procedur InterfaceBee.ProcessingLastValues() a InterfaceBee.ProcessingWeightTrends(), tj. T-SQL subUpdateLastValuesAll a subUpdateWeightTrendsAll v minutových intervalech
aktivace triggeru [dbo].[triTemperatureOnInsert] ON [dbo].[tblTemperature] AFTER INSERT
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)