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