An-Aus-Zeitplan VD

Advertisements

Inspriert von einem User habe ich eine Szene und ein virtuelles Device zur individuellen Steuerung einer Lampe erstellt. Und zwar nicht nur ein- und ausschalten, sondern auch einen Zeitplan aktivieren und deaktivieren.

An/Aus/Zeitplan VD

An/Aus/Zeitplan VD

Frage aus dem Forum

Der User Knallfrosch hat im siio Forum sinngemäß folgende Frage gestellt:

Ist es möglich, ein virtuelles Device zu erstellen welches es mir erlaubt einen Wallplug ein- und auszuschalten sowie einen hinterlegten Zeitplan zu aktivieren bzw. deaktivieren? Weiterhin wäre ein dynamisches Icon die Krönung um den aktuellen Status auf den ersten Blick ersichtlich zu machen.

Gedanken dazu

Ich habe auf den Beitrag geantwortet und meine Gedanken dazu niedergeschrieben.

Als erstes würde ich mir ein virtuelles Device erstellen welches eine globale Variable setzt. So was wie On/Off/Schedule. Dazu eine Szene die sowohl zyklisch läuft als auch über die oben genannte globale Variable getriggert wird und je nach Status der globalen Variable entweder einen Scheduler bedient oder das Gerät ein- bzw. ausschaltet.

Soweit so gut, aber das Thema hat mir keine Ruhe gelassen. Ich musste unbedingt wissen, ob es möglich ist eine Szene über einen Zeitplan und eine globale Variable zu triggern. Und zwar möglichst unabhängig voneinander.

Also habe ich mich kurzerhand ans Werk gemacht und habe versucht die Idee in die Tat umzusetzen.

Der Versuchsaufbau

Was ich benötigt habe um die Steuerung zu erstellen:

  • 1 virtuelles Device
  • 1 Szene mit Zeitplan
  • 3 Icons (On, Off, Zeitplan)
  • 1 globale Variable

Die Umsetzung

Die globale Variable und das virtuelle Device waren schnell erstellt und so ging es an die Szene. Da ich bisher – abgesehen vom Sonnenuntergang – nie mit zeitgesteuerten Szenen gearbeitet habe, bediente ich mich einer Blockszene und wandelte diese in Lua Code um. Der Zeitplan sollte jeden Montag um 17:30 greifen und meine Esszimmerlampe einschalten.

Standard Zeitplan Szene

So sieht die Szene mit Zeitplan aus, welche das Fibaro Home Center 2 aus der Blockszene generiert hat. Diese habe ich 1:1 übernommen und die Intelligenze für das virtuelle Device drumherum gebaut.

--[[
%% autostart
%% properties
%% events
%% globals
OnOffSchedule
--]]

--Szene im Autostart. 

local sourceTrigger = fibaro:getSourceTrigger();
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
local gOnOffSchedule = fibaro:getGlobalValue("OnOffSchedule")
local deviceID = 8
--fibaro:debug(gOnOffSchedule)
if (gOnOffSchedule == "Schedule")
then 
	fibaro:debug("Scheduler aktiv")
	local sourceTrigger = fibaro:getSourceTrigger();
	function tempFunc()
	local currentDate = os.date("*t");
	local startSource = fibaro:getSourceTrigger();
	if (
	 ( ((currentDate.wday == 2) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "20:26") )
	)
	then
		fibaro:call(deviceID, "turnOn");
	end

	setTimeout(tempFunc, 60*1000)
	end
	tempFunc()

elseif (gOnOffSchedule == "On")
then
	fibaro:call(deviceID, "turnOn")
	fibaro:debug("Lampe An")
elseif (gOnOffSchedule == "Off")
then
	fibaro:call(deviceID, "turnOff")
	fibaro:debug("Lampe Aus")
end

Szene mit On-Off-Schedule Intelligenz

Die fertige Szene sah dann folgendermaßen aus:

--[[
%% autostart
%% properties
%% events
%% globals
OnOffSchedule
--]]

--Szene im Autostart. 

local sourceTrigger = fibaro:getSourceTrigger();
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
local gOnOffSchedule = fibaro:getGlobalValue("OnOffSchedule")
local deviceID = 8
--fibaro:debug(gOnOffSchedule)
if (gOnOffSchedule == "Schedule")
then 
	fibaro:debug("Scheduler aktiv")
	local sourceTrigger = fibaro:getSourceTrigger();
	function tempFunc()
	local currentDate = os.date("*t");
	local startSource = fibaro:getSourceTrigger();
	if (
	 ( ((currentDate.wday == 2) and string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min) == "20:26") )
	)
	then
		fibaro:call(deviceID, "turnOn");
	end

	setTimeout(tempFunc, 60*1000)
	end
	tempFunc()

elseif (gOnOffSchedule == "On")
then
	fibaro:call(deviceID, "turnOn")
	fibaro:debug("Lampe An")
elseif (gOnOffSchedule == "Off")
then
	fibaro:call(deviceID, "turnOff")
	fibaro:debug("Lampe Aus")
end

Das virtuelle Device

Die drei unterschiedlichen Status des virtuellen Device:

Das virtuelle Device

Das virtuelle Device

In der Konfiguration muss die ID der Szene in das Feld für den TCP Port eingetragen werden, daraus bedient sich der Code der einzelnen Buttons.
Beispielhaft der Lua Code um das Licht auszuschalten:

vdID = fibaro:getSelfId() -- Ausleser der ID des virtuellen Devices
OnOffScene = fibaro:get(vdID, 'TCPPort'); -- Ausleser der anzubrechenden Szene aus dem TCP-Port Feld
fibaro:killScenes(OnOffScene) -- Abbrechen der Szene
fibaro:setGlobal("OnOffSchedule","Off") -- Globale Variable setzen
fibaro:call(vdID, "setProperty", "currentIcon", 246) -- Icon ändern

Wie man erkennt, wird beim Drücken einer Taste die Szene mit dem Scheduler abgebrochen und getriggert durch die Änderung der globalen Variable gleich wieder gestartet. Nur so konnte ich es erreichen, dass bei laufendem Zeitplan die Veränderung der globalen Variable auch bei der Szene ankommt.

Einbinden der dynamischen Icons

Das dynamischen ändern des Icons wird in der letzten Zeile des Button-Codes durchgeführt. Die Funktion benötigt die ID des Bildes. Diese erfährst Du indem Du nach dem Upload der 3 Icons über Icon ändern mit der Element untersuchen Funktion des Firefox Browser.

Element untersuchen im Firefox

Element untersuchen im Firefox

Icon ID herausfinden (hier 245)

Icon ID herausfinden (hier 245)

Für das On-Icon ist hier die Adresse /fibaro/n_vicons/User245.png hinterlegt. Um das Icon dynamisch anzupassen benötigst Du lediglich die Zahl, also 245. Du benötigst die IDs aller 3 Icons und musst diese im virtuellen Device in der jeweils letzten Zeile des Lua Codes für jeden Button eintragen.

Download und ToDo

Um das virtuelle Device bei Dir einsetzen zu können musst Du folgende Dinge anlegen bzw. anpassen:

  • Erstelle eine globale Variable mit dem Namen OnOffSchedule
  • Ändere in der Szene die Variable deviceID in die ID des zu schaltenden Devices
  • Passe den Zeitplan nach Deinen Bedürfnissen an
  • Erstelle eine Lua Szene mit dem Inhalt der .txt Datei
  • Importiere das virtuelle Device und trage die ID der Lua Szene in das Feld für den Port ein
  • Lade die 3 Icons auf Dein Home Center 2, bestimme die IDs der Icons und trage sie in den Lua Code des VDs ein (siehe oben)

Download:

Kommentar

Hast Du Fragen dazu, gefällt Dir die Umsetzung oder hast Du sie sogar in Dein Smart Home integriert? Dann hinterlasse mir einen Kommentar.

Posted in Licht, Strom and tagged , .

3 Comments

  1. Hallo Bastian,

    habe so etwas ähnliches – einen „Dummyraum“ angelegt, einen Heizplan erstellt der sich auf diesen Raum bezieht und aus Deinem „Heizplan für Feiertage“ die Routine zum Auslesen des Heizplans genommen. Alle 15 Min wird dann die aktuelle Temperatur geprüft („heatplan.properties.currentTemperature“) und anhand des Wertes die WallPlugs/Lichter etc. an bzw. ausgeschaltet. Unter der zusätzlichen Berücksichtigung des Sonnenstandes ergibt sich eine weitere Alternative zur Weihnachtsbeleuchtung.

    Da man im Heizplan Temperaturen von 4° bis 33° einstellen kann ergeben sich mit den 0.5° Werten 58 „Zustände“ – in meiner Routine werden diese dann von dezimal auf binär umgerechnet und ich kann dann, je nach Temperatur, 5 verschiedene Schalter an und aus schalten.

    Schöne Grüße
    Hubertus

  2. Hallo Bastian,

    super Tool. Habe es nach einigen Anlaufschwierikgeiten nach der Methode learning by doing doch zum laufen bekommen.

    Bei mir passiert jetzt noch folgendes, was ich mir nicht erklären kann bzw. vielleicht soll das so sein.

    Fall 1:
    Nach Betätigen des ON-Buttons schaltet Verbraucher ein, das Icon wechselt auf EIN und schaltet kurz später auf ZEITPLAN. Verbraucher bleibt an

    Fall 2:
    Nach Betätigen des OFF-Buttons schaltet Verbraucher aus, das Icon wechselt auf AUS und schaltet kurz später auf EIN.

    Fall 3:
    Nach Betätigen des ZEITPLAN-Buttons wechselt das Icon auf ZEITPLAN und schaltet kurz später auf OFF. Verbraucher ändert sich nicht

    Gibt es dafür eine Erklärung ?

    Wäre sehr froh um eine kurze Rückmeldung

    Gruß
    Achim

    • Hallo Achim,

      der Artikel ist schon ein wenig älter und ich habe das VD bei mir schon nicht mehr im Einsatz, daher muss ich mich da erstmal wieder reindenken.
      Und ich werde die Gelegenheit nutzen sowohl Szene, also auch Artikel mal einer Überarbeitung zu unterziehen.

      Grüße
      Bastian

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Ich akzeptiere