Temperatur + Zeit an Danfoss Heizkörperregler übergeben

Hallo,

ich habe schon mehrfach das Forum durchsucht, jedoch habe ich noch keine richtig passende Variante gefunden.

Anliegen:
Per Fernbedienung (Remotec Szenen Master) ein LUA Skript ausführen, welches an Heizkörper entsprechende Temperatur + Zeit übergibt.

Habe bisher folgendes probiert, abgekürzt:

local toID1 = 10
local req_temp = 24
local req_time = 240
fibaro:call(toID1, "setTargetLevel", req_temp)
fibaro:call(toID1, "setTime", tonumber(os.time(t)) + req_time*60)

Egal welche gewünschte Zeit ich übergebe, erscheint anstatt 4 Stunden, nach dem aufwachen der Geräte (LC-13), nur 2:15 Stunden (zuvor 4:15 Stunden zu sehen). Manchmal stimmte auch kurz, per Zufall, die Zeit bei einem Regler, bei dem Rest jedoch nicht …
Was bedeutet eigentlich das t bei tonumber(os.time(t))? Habe diesen Befehl auch schon ohne t gesehen…
Woher kommen die 15 Minuten? Ich habe doch nur 4 Stunden übermittelt…
Kann man nicht direkt die 4 Stunden übergeben, ohne tonumber?
Ich hatte dann zum Test / Notlösung eine 15 Min. Pause eingebaut und anschließender erneuter Zeitzuweisung.
Dadurch wird die 15 Min. Aufwachphase abgewartet, anschließend werden die 4 Stunden übernommen.
Wenn diese jedoch abgelaufen sind, erscheint aber erneut 2 Stunden im “Zeitfenster”…
Das scheint mir noch keine saubere Lösung zu sein.

Könnte ich generell auch gleich die Temperatur auf die ID des Raumes übergeben (http://HC2_IP/api/panels/heating), sodass ich nicht jedem Heizkörperregler einzeln die Temperatur übergeben muss?

Für Euch ist dies sicherlich simpel. Ich komme aber gerade nicht weiter.
Bitte um Hilfe.
Vielen Dank!!!

Hi FreshEleph,
Danke für die Frage!

Ich bin auch auf der Suche nach einer Lösung für dieses Problem!
Habe inzwischen herausgefunden, dass man die Heizungszonen über die Smartphone App für eine bestimmte Zeit “überregeln” kann.
Es muss also eine Möglichkeit geben, das auch via Skript zu machen.

Wäre auch für ein paar Tipps hier dankbar!!

Ich bastle schon recht lange an einer funktionierenden Heizungssteuerung mit LC-13 herum (hab 5 Stk.) Das ist alles andere als simpel.
Vielleichtt kann ich was dazu beitragen.

Ich gehe davon aus, dass das Setzen der Solltemperatur funktioniert? oder?
Prinzipiell holt sich das LC-13 die Werte beim HC ab und zwar im Rhythmus der Aufwachzeit.
Wenn man am LC-13 die Temp manuell verstellt hat man immer 2 Std im Icon des Modules stehen. Daniel (boomx) meinte mal ich hätte keine Chance das zu verstellen.
Ich hab dann ein heating Override VD mit dem ich das wiederum abändern kann. Also denke ich mal (heißt ich weiß es nicht) man kann dem LC-13 keine Zeit übermitteln besser es ist sinnlos weil die beim gleichen/nächsten Aufwecken wieder verstellt wird.
Nachdem das manuelle Einstellen per App oder im HC eigentlich funktioniert hat, gehe ich davon aus man müsste diese Zeit anpassen. Im Heizplan steht z.B. 18°. Also ich verstelle die Temp am LC manuell zb. auf 20° dann steht eigentlich sofort (funktioniert aber bei mir nicht immer genauso wie das aufwecken des Modul durch drücken der mittleren Taste) 20° und 2H im Icon. Wenn ich jetzt dort 15 Min wähle, geht das LC nach 15 Min wieder auf 18° zurück.

Ich komme deswegen auf diese umständliche Idee:
Nachdem es mir nicht gelungen ist das LC dazu zu bewegen SOFORT wenn ich 24° (zum Duschen z.b) einstelle das Ventil aufzumachen hab ich mir ein Eurotronics Spirit mit FLIRS gekauft. Wenn ich dort eine andere Temp eingestellt habe reagiert es sofort (FLIRS) ABER habe ich z.b von 18° aus dem Panel auf 20° gestellt stand es innerhalb von Sekunden wieder auf 18°. (Es sei denn BOOST) Seit V 4.16 vom HC ist daas nicht mehr (im Update erläutert)so. Das heißt doch das HC überschreibt was du im LC einstellst oder seht Ihr das anders?
Das würde auch das was Fresh sagt erklären wenn man bedenkt, dass das LC eine längere Aufweckzeit hat und die Module unterschiedlich wach werden.

Wenns interessiert kann ich den LUA code aus dem VD zum Zeit einstellen mal rein kopieren.

Gruß Gerhard

Ach so das tonumber() mach aus dem String (text z.B. 20:10) eine Zahl. Damit kannst du dann rechnen also zb. T + 60000. Wenn du nur die Zeit anzeigen lassen willst kannst du dir das ja sparen, also gehts mal mit mal ohne tonumber().

Habs gerade nochmal durchgelesen das oben war gar nicht deine Frage. Die Zeit im Linuxsystem wir in Sekunden ab dem 1.1.1970 (keine Ahnung mehr welches Datum) gespeichert.
Das t ist genau dieser Wert, %XY ist dann die Darstellung als MM.TT.JJJJ oder JJJJMMTT und so. Tonumber(os.time(%J))+1 wäre dann also die Zahl 2019.
Ich hab mir das mal gegoogelt als ich das Heatingpanel exportiert habe und die Zahl dannin ein Datum Uhrzeit umgerechnet habe. Man findet das einigermaßen gut.

Hi Ihr Lieben,
Ich bin gerade etwas verwirrt, und vermute wir Diskutieren hier 2 unterschiedliche Dinge, aber für das selbe Problem!

1.) will FreshEleph dem Thermostat eine Temperatur und eine Zeit via Skript übergeben und erwartet, dass diese Temperatur dann über die eingestellte Zeit vom Thermostat gehalten wird

2.) Interessiert mich der Ansatz DIREKT auf dem Thermostat (habe sowohl LC-13 als auch den neuen Eurotronic mit FLIRS) eine Temperatur einzustellen, die dann eine gewisse Zeit eingestellt bleibt.

Der Wunsch ist der Selbe: Eine gewisse Temp für eine Gewisse Zeit zu fixieren!

Tatsache ist, dass DERZEIT ohne Skript eine am Thermostat eingestellte Temparatur von der HC2 sofort (bei Flirs) oder nach dem Aufwach Interwall (beim LC-13) auf den Wert des Heizplanes zurückgestellt wird.

Und die Frage ist, welche Möglichkeiten gibt es, das zu überregeln???
Oder hab ich das falsch verstanden ??

Hi Blacky,
2. Interessiert mich der Ansatz DIREKT auf dem Thermostat dh. manuell über die Tasten am Ventil? da wüsste ich nicht wie eine Zeit eingestellt werden kann, aber so hast du wahrscheinlich nicht gemeint.
Tatsache ist, dass DERZEIT ohne Skript eine am Thermostat eingestellte Temparatur von der HC2 sofort (bei Flirs) oder nach dem Aufwach Interwall (beim LC-13) auf den Wert des Heizplanes zurückgestellt wird. Da hab ich mit der neuen Version andere Erfahrungen gemacht. Was früher (bei Flirsgeräten) nicht ging geht jetzt mit V4.16. Die manuell eingestellte Temperatur bleibt für 2 Stunden. Was mir nicht gelungen ist dies 2 Stunden “global” zu ändern. Man kann die natürlich, wie du schon sagst per Script anpassen, aber eben nicht so, dass die dann prinzipiell auf z.B.1 Std reduziert ist.

Hab gerade nochmal getestet. Ich hab für das Kellerbüro mit LC13 keinen Heizplan. Wenn ich z.b von 23° auf 22 Grad manuell stelle und dann im HC auf z.b 30 Minuten dann bleibt die Temp auch nach den 30 Minuten auf 22 Grad. Ist ein Heizplan angelegt geht die Temp nach 30 Minuten zurück auf den aktuellen Heizplanwert, finde ich soweit ok. Also dein Problem wie ich es verstanden habe sollt prinzipiell gelöst sein. Verhält sich das bei dir nicht so?

Schiebst du allerdings einen Wert direkt (per LUA) auf das Ventil wird er zeitnah überschrieben. Deswegen denke ich das “setTime” nicht ideal ist bekomme aus dem VD-Code allerdings nicht heraus wie er das macht, dass es funktioniert, denn mit dem VD kannst du das einstellen. Allerdings wird nicht setTime verwendet.

--=============================================
-- oneHourButton
--=============================================
--=============================================
-- Declarations
--=============================================
local selfId = fibaro:getSelfId()
local currentMode = ""
local overrideMode = ""
local tempTimeLabel = ""
local overridenTempOrTime = false
local labelTemp = 0
local labelEndTimestamp = 0
local overrideDurationHours = 1
local currentTimestamp = os.time()

if (not HC2) then
  HC2 = Net.FHttp("127.0.0.1", 11111)
end

--=============================================
-- Functions
--=============================================
-- getTemperatureUnit
---------------------
-- Return the temperature unit from the system settings

function getTemperatureUnit()

	-- Default to °C just in case the api call fails
	local tempUnit = "°C"
	
	-- Get the Temperature Unit
	local response ,status, errorCode = HC2:GET("/api/settings/info/")
	local info = json.decode(response)
	
	if (status == "200") then
		tempUnit = "°" .. info.temperatureUnit
	else
		fibaro:debug("Unable to get the temperature unit")
	end
	
	return tempUnit
end

-- formatTempTime
-----------------
-- Format the Temperature and Time into a string so that
-- we can output to a label

function formatTempTime(override, temp, endTimestamp)

	local label = ""
	
	if (override) then
		label = "* "
	end
	
	label = label .. temp .. getTemperatureUnit()
	
	if (endTimestamp > 0) then
		local duration = math.ceil((endTimestamp - currentTimestamp) / 60)
	
		local days = math.floor(duration / (24*60))
		local hours = math.floor((duration - days*24*60) / 60)
		local minutes = math.floor(duration - days*24*60 - hours*60)
		
		label = label .. " for "
		
		if (days > 0) then
			label = label .. string.format("%d", days) .. "d "
		end
		
		if (hours > 0 or days > 0) then
			label = label .. string.format("%d", hours) .. "h "
		end
		
		label = label .. string.format("%d", minutes) .. "m"
		
		label = label .. " until " .. os.date("%H:%M", endTimestamp)
		
		-- Only output the date if more than 24 hours from now
		if (endTimestamp >= currentTimestamp + 24*60*60) then
			label = label .. " " .. os.date("%A %d/%m/%Y", endTimestamp)
		end
	end
	
	return label
end

-- deformatTempTime
-------------------
-- Extract the temperature, duration and end time and date
-- from the Temp/Time label

function deformatTempTime(tempTime)
	local override = false
	local temp = 0
	local endTimestamp = 0
	local endTime = ""
	local endDate = ""
	local pos = 1
	
	-- Has the temperature or time been overridden?
	if (tempTimeLabel:sub(pos,1) == "*") then
		override = true
		pos = pos + 1
	end
	
	-- Find the temperature = the first number
	local start, finish = tempTime:find("%d+", pos)
	
	if (start ~= nil) then
		temp = tonumber(tempTime:sub(start, finish))
		pos = finish + 1
	end
	
	-- Find the End Time
	start, finish = tempTime:find("%d+:%d+", pos)
	if (start ~= nil) then
		endTime = tempTime:sub(start, finish)
	end
	
	-- Find the End Date
	start, finish = tempTime:find("%d+/%d+/%d+", pos)
	if (start ~= nil) then
		endDate = tempTime:sub(start, finish)
	end
	
	-- Convert the date and time to a timestamp
	if (endTime ~= nil and endTime ~= "") then
		
		-- Assume that the End Time is today
		local dateTime = os.date("*t")
		dateTime.hour = tonumber(endTime:sub(1,2))
		dateTime.min = tonumber(endTime:sub(4,5))
		dateTime.sec = 0

		-- Do we have a date?
		if (endDate ~= nil and endDate ~= "") then
			dateTime.day = tonumber(endDate:sub(1,2))
			dateTime.month = tonumber(endDate:sub(4,5))
			dateTime.year = tonumber(endDate:sub(7,10))
		end
		
		endTimestamp = os.time(dateTime)
		
		-- If the timestamp is less than the current timestamp, then add on a day
		if (endTimestamp < currentTimestamp) then
			endTimestamp = endTimestamp + 24*60*60
		end
	end
	
	return override, temp, endTimestamp
end

--=============================================
-- Main
--=============================================

-- Get the current mode
currentMode = fibaro:get(selfId, "ui.modeLabel.value")

-- Override the mode to Manual unless already set to Manual or Vacation
-- Prefix with the asterisk to signify that the mode has been overridden
if (currentMode == "Auto") then
	overrideMode = "* Manual"
else
	overrideMode = currentMode
end

-- Get the current Temp/Time label and deformat it
tempTimeLabel = fibaro:get(selfId, "ui.tempTimeLabel.value")
fibaro:debug(tempTimeLabel)

overridenTempOrTime, labelTemp, labelEndTimestamp = deformatTempTime(tempTimeLabel)

-- Set the duration to 1 hour and set the override flag
-- but only if we're currently displaying a time
if (labelEndTimestamp ~= 0) then 
	overridenTempOrTime = true
	labelEndTimestamp = currentTimestamp + overrideDurationHours*60*60
end

-- Reformat the label
tempTimeLabel = formatTempTime(overridenTempOrTime, labelTemp, labelEndTimestamp)

fibaro:call(selfId, "setProperty", "ui.tempTimeLabel.value", tempTimeLabel)
fibaro:call(selfId, "setProperty", "ui.modeLabel.value", overrideMode)

Hi Fresh,
nur zum Thema simple! Mit dem Code oben kannst du definitiv die eingegebene Solltemperatur für 1 Stunde fixieren. Funktioniert bei meinen LC-13s.
Durch Veränderung des Wertes in Zeile 14 kannst du die gewünschte Zeit die die übermittelte Solltemperatur (in Stunden) gültig ist anpassen.

Deswegen glaube ich nicht, dass das direkte setzen einer Zeitdauer im LC-13 so (fibaro:call(toID1, “setTime”, tonumber(os.time(t)) + req_time*60)) funktioniert.

Hi Gerhard,
Habe das mit dem manuellen verstellen nun mit dem Spirit ausprobiert, klappt leider nicht.
Wenn ich die Temp von 18 Grad auf 28 Grad erhöhe, dann stellt der Heizplan die Temperatur nahezu sofort (ca. 10 Min) wieder zurück!
Muss ich da irgendwas konfigurieren, damit das klappt?

Das Einzige was funktioniert, den Heizplan über die Webmaske oder über die Smartphone App zu “überregeln” aber das ist hjalt leider nicht WAF tauglich :wink:

Hi Blacky,
ab der 4.16 für das HC sollte das funktionieren. Hast du die sicher drauf?. Mit den Versionen davor verhält es sich so wie du es beschreibst, aber nur beim spirit.
Die LC-13 sollten die manuell eingestellte Temperatur für 2 Stunden, auch schon mit der Version davor, halten.