[VD] Verlauf, darstellen von Wertänderungen

Hallo zusammen,

ich habe nach einer Möglichkeit gesucht, Werte im zeitlichen Verlauf ohne Debugfenster darzustellen. Es ist manchmal interessant sich ein Bild machen zu können wann etwas schaltet, wechselt oder sich ändert ohne gleich in irgendwelchen Fenstern wühlen zu müssen. Ich hab da jetzt nicht lange gesucht und mir ein VD programmiert. Ist jetzt doch etwas aufwändiger und allgemeingültiger aufgebaut als ursprünglich gewollt, so dass ich es teilen kann. Vielleicht kann es jemand brauchen. Anbei das VD und ein paar Bilder von der Oberfläche als Beispiele.

Wenn Fragen sind einfach melden.

Hier noch der Code der primären Schleife:

--[[
Verlauf-VD 1.0
Stellt Änderungen im zeitlichen Verlauf dar. Dargestellt werden entweder Werte von Geräten
(Value) oder Werte von Globalen Variablen. Es kann immer nur ein Gerät oder eine Globale 
pro VD überwacht werden. Der aktuellste Wert mit Angabe Datum/Zeit steht immer oben. Alle
älteren Werte werden nach unten geschoben. Zusätzlich ist es möglich Werte "übersetzen" zu
lassen, z.B. wenn der Wert 0 oder 1 ist kann stattdessen ein Text oder Symbol verwendet
werden (Tür auf/Tür zu etc). Die Anzeige wird nur alle 3 Sekunden aktualisiert. Änderungen
die sich schneller vollziehen werden nicht berücksichtigt (3s VD-Takt). Ändy 07.04.2019 
--]]

--Je nach Anwendungsfall entweder DeviceID angeben oder GlobalName eintragen.  
--Bei beiden Einstellungen zusammen wird die Globale verwendet und sDeviceID ignoriert.
local sDeviceID = 256 --Device/Sensor ID. Wenn nicht benötigt auf 0 stellen oder auskommentieren.  
local GlobalName = "" --Globale Name dessen Wert dargestellt werden soll. Unbenutzt=leer lassen ("") oder auskommentieren.
local sDeviceUnit = "°C ?️" --Einheit für Wert falls gewünscht (z.B. "°C"). Leer lassen ("") wenn nicht benötigt.

--Übersetzungstabelle
--1. Wert wird durch 2. Wert ersetzt
local TranslateValue = false --Werte übersetzen (true/false)
local TranslateMap = {
  					 	{"0", "✔️"}, 
  						{"1", "❌️️"}, 
  					 	--{"0", "❄️"},  --weitere Beispiele
  						--{"1", "?"}, 
  					 	--{"0", "⛅️"},
  						--{"1", "?️"}, 
  					 	--{"0", "☁️️"}, 
  						--{"1", "☀️️"}, 
					 }

--Ab hier nichts mehr ändern!
------------------------------------------------------------------------------------------

local vDeviceID = fibaro:getSelfId()
--fibaro:debug(selfId)

--Alle Werte nach unten schieben. Aktuellen Wert oben eintragen.
function WertEintragen(Wert)
  	local AnzahlLabels = 9
  	local x
  	local y = fibaro:get(vDeviceID, "ui.Label9.value") --letzten Wert sichern
  	for m=AnzahlLabels-1,1,-1 do --Werte nach unten schieben
  		x = fibaro:get(vDeviceID, "ui.Label"..m..".value")
  		fibaro:call(vDeviceID, "setProperty", "ui.Label"..(m+1)..".value", x) --Labels nach unten schieben
    end
  	--Neuer erster Wert
  	x = os.date("%d.%m.%Y %H:%M:%S", os.time()).." | "..Wert
  	fibaro:call(vDeviceID, "setProperty", "ui.Label1.value", x) --VD-Label1 aktualisieren
	--Überlauf kennzeichnen wenn letztes Label belegt war. Auskommentieren wenn nicht gewünscht.
  	if y ~= "" then
  		fibaro:call(vDeviceID, "setProperty", "ui.Label"..AnzahlLabels..".value", "..") --Letztes Label ".." bei zuviel Einträgen
    end
end

--Übersetzt Werte in schönere Darstellung
function Translate(Wert)
  	if (TranslateMap[1] ~= nil) then
    	for m=1, #TranslateMap do
       		if TranslateMap[m][1] ~= nil and TranslateMap[m][2] ~= nil then
         		if Wert == TranslateMap[m][1] then Wert = TranslateMap[m][2] end
        	else
        		fibaro:debug("Error: Check settings in TranslateMap!")
      	 	end
    	end
    else
    	fibaro:debug("Error: Check settings in TranslateMap!")
	end
  	return Wert
end

--Wert holen je nach Belegung ID oder Globale
local Wert 
if GlobalName ~= nil and GlobalName ~= "" then --wenn Globale
  	Wert = fibaro:getGlobalValue(GlobalName)
  	sDeviceUnit = "" --clear unit if global
else
	if sDeviceID ~= nil and sDeviceID > 0 then --wenn Sensor oder Device
		Wert = tonumber(fibaro:getValue(sDeviceID, "value"))
    else
		fibaro:debug("Error: Check settings. DeviceID: "..tostring(sDeviceID).." | GlobalName: "..tostring(GlobalName))
  	end
end

--Wert mit erstem Eintrag vergleichen
if Wert ~= nil then
	Wert = tostring(Wert)
	if TranslateValue then Wert = Translate(tostring(Wert)) end --Werte übersetzen
  	local Label = fibaro:get(vDeviceID, "ui.Label1.value") --Erstes Label holen
  	--Label = string.match (Label, "|.-$") --Datum vorne entfernen. Alles ab "|"
  	Label = string.match (Label, "|.*") --Datum vorne entfernen. Alles ab "|"
  	Label = string.gsub(tostring(Label),"| ","") --Trennzeichen entfernen
  	Label = string.gsub(tostring(Label),sDeviceUnit,"") --Einheit entfernen
  	--fibaro:debug("neuer Wert: " .. Wert .. " | alter Wert: " .. Label)
	if Wert ~= Label then --Wenn neuer Wert..
  		fibaro:debug("neuer Wert: " .. Wert .. " | alter Wert: " .. Label)
    	Wert = Wert..sDeviceUnit
  		WertEintragen(Wert) --..eintragen
    end
else
    fibaro:debug("Error: Check value of DeviceID: "..tostring(Wert))  
end

verlauf_temp.jpg

verlauf_global.jpg

verlauf_value2.jpg

Hi Ändy
Super tolle Idee!!
Werde das bei Gelegenehit mal probieren…

Wie viele Änderungswerte kann man über das VD maximal speichern?

Hi @pblacky,

freut mich wenn es Dir gefällt. Ich hab es nur bis 8/9 Zeilen programmiert da dann die Darstellung im Handy umbricht und es für meine Zwecke ausreicht. Wem das nicht reicht, der könnte natürlich auch beliebige Labels hinzufügen und den Code anpassen. Habe das aber nicht ausprobiert, sollte aber gehen. Es kommt dann eine Art Scrollbalken mit dem man nach unten fahren kann. Es sind glaube ich 2 Stellen die man im Code anpassen muss. Ich schaue es mir gern nochmal an wenn Interesse besteht.

Alles klar, danke für die rasche Antwort!
Ich hab derzeit keinen Anlassfall dafür, werde es also nur aus Neugierde ausprobieren :wink:
Finde deine Skripte immer sehr interessant, weil du auf so coole Ideen kommst, und diese dann noch so perfekt umsetzt.
Vielen Dank dafür!

Danke noch @pblacky für das Kompliment :slight_smile: Ich habe mal eine Version mit 20 Zeilen erzeugt. Ist bei manchen Werten doch hilfreicher mehr Werte zu haben. Hänge das VD mal an.