Startseite Foren Fibaro Forum (Z-Wave) Fibaro LUA Scripts für HC2 Wakeup – Wecker Szene via LUA + virtual Device

Dieses Thema enthält 25 Antworten und 7 Teilnehmer. Es wurde zuletzt aktualisiert von  Rocco vor 10 Monate, 3 Wochen.

Ansicht von 15 Beiträgen - 1 bis 15 (von insgesamt 26)
  • Autor
    Beiträge
  • #19013
    crissxcross
    crissxcross
    Moderator

    Hier ein Script, welches durch ein virtuelles Modul gestartet wird. In dem Virtuellen Modul kann die Weckzeit, sowie die Wochentage angegeben werden und der Wecker auf aktiv und inaktiv geschalten werden. Ausserdem gibt es eine Möglichkeit, Rollos oder Jalousien via RollerShutter2 von Fibaro automatisch nach dem Weckalarm zu öffnen.
    Quelle: http://jonnylarsson.se/JL/ACWUT.lua

    Virtual Device:
    http://siio.de/alarmclock-2-1


    Gründer & Blogger von siio.de / siio.com
    #19015
    crissxcross
    crissxcross
    Moderator

    Hier nocheinmal das gleiche Script etwas modifiziert. Es kann nun auch durch ein Tür/ Fensterkontakt getriggert werden.
    Die ID in den Properties, sowie die ID „local WeckerID“ sind hierbei dem Tür/ Fensterkontakt anzupassen.


    Gründer & Blogger von siio.de / siio.com
    #20384

    sasan
    Teilnehmer

    Hallo Crissxcross,
    vielen Dank für deine tollen Codes. Ich habe allerdings ein Problem mit dem VD. Ich habe einfach deine autom. installationsdatei importiert. Das neue VD funktioniert bei mir allerdings nicht. Liegt es daran, dass ich meine eigenen Werte des Homecenters bei der Zeile:
    local HC2 = Net.FHttp(„192.168.178.38“, 11111);
    eingeben muss? Oder was ist damit gemeint? Was ist 11111?
    Keine Ahnung aber das VD funktioniert bei mir nicht! Wenn ich irgendwas klicke, z.b. Die Weckzeiten um Stunden / Minuten ändern, passiert nichts!

    #20386

    boomx
    Teilnehmer

    Hi,

    ja, die IP musst du anpassen ;) 11111 ist der Port, den unverändert lassen.

    Gruß

    #20396

    sasan
    Teilnehmer

    Was ganz genau bewirkt eigentlich die Hardware Wecker Funktion? Wenn ich den Kontakt betätige geht der Wecker sofort los. Sinnvoller wäre doch, dass der voreingestellte Wecker auch nur dann funktioniert wenn der Hardwareweckerkontakt betätigt wurde. So müsste man nicht immer wieder den Wecker neu ein oder ausschalten.
    Bei mir funktioniert der Hardwarewecker so: Wenn der Kontakt offen ist, dann bleibt das Programm einfach stecken. Sobald der Kontakt geschlossen ist, fängt der Dimmer sofort an und beendet sich auch selbst nach wenigen Minuten. Na ja irgendwie funktioniert das alles nicht, was mache ich falsch?
    Hier mein Code:
    –[[
    %% autostart
    %% properties
    74 value
    %% globals
    AlarmClockStatus
    AlarmClockDays1
    AlarmClockDays2
    AlarmClockTime1
    AlarmClockTime2
    –]]

    –[[

    INSTRUCTIONS
    *
    * add those devices you want to use in this script to „devices“
    * set dimmer device to a „_maxValue“
    * set „_duration“ to a value in minutes for how long the dim function should be active
    * to activate debug, helper and versionCheck set the value to true or false

    * helper is to show all „lights“ in your system.
    * debug is debug :)
    * versionCheck checks if script is updated. Click on „Get it“

    –]]

    — SCENE SCENARIO
    — Advanced wakeup scene to turnOn lights at specified time, time you set in
    — alarm clock virtual device
    — Set value for how much the blinds should open with the slider in VD.

    — REFERENCE
    — forum.fibaro.com, lua.org, domotique-fibaro.fr, http://www.gronahus.se
    — Thanks to robmac, stevenvd for good LUA functions code.

    — 2015-11-01 ver 2.0.0 new version of scene and virtual device. Supports 2 alarm.
    — 2015-11-02 ver 2.0.1 list all lights in scene. Add those you want to use in ‚User Settings‘ section
    — 2015-11-27 ver 2.1.1 adjustment of debug lines and added variable to %% globals

    version = „{2.1.1}“

    ——————– USER SETTINGS ———————–
    devices = {55} — Lights, dimmers and blinds
    _maxValue = 70 — When dimmer reach this value it will stop there
    _duration = 20 — Time in minutes for how long wakeUp should be active
    debug = true — set debug to true or false
    helper = false — loop through all devices and search for lights/dimmers/binarySwitch etc

    — HARDWARE-WECKER (IM HEADER EINFÜGEN)
    local weckerID = 74

    — EXTRA FUNCTIONS, OPTIONS
    — Start Radio
    vDeviceID = 393 — Id of VD
    vDeviceButton = 7 — Play
    vDeviceFunc = false — set to true to activate Sonos/Internet Radio

    — Dimmers to set to fixed value when alarmWakeup
    Dimdevices = {343} — Dimmers to set to fixed value
    fixedValue = 50 — Dimmer value
    DimdevicesFunc = false — set to true or false

    –TimeOfDay variable —
    varTOD = „TimeOfDay“ — TOD translate
    varTODMorning = „Morgon“ — TOD Morning translate
    varState = „SleepState“ — TOD translate
    varStateMorning = „Vaken“ — TOD Morning translate
    variableFunc = true — set to true or false
    ———————————————————–
    timeNow = os.date(„%H:%M“)
    dayName = os.date(„%A“)

    ————- DO NOT CHANGE LINES BELOW ——————-
    startSource = fibaro:getSourceTrigger();
    sortedtbl = {}
    tmptbl = {}
    runOnce = true
    alarmTime1 = fibaro:getGlobal(„AlarmClockTime1“)
    alarmTime2 = fibaro:getGlobal(„AlarmClockTime2“)
    alarmDay1 = fibaro:getGlobal(„AlarmClockDays1“)
    alarmDay2 = fibaro:getGlobal(„AlarmClockDays2“)
    blindUpLevel = fibaro:getGlobal(„openBlinds“)

    alarmTimes = {alarmTime1, alarmTime2}
    alarmDays = {alarmDay1, alarmDay2}

    — Give debug a fancy color
    Debug = function ( color, message )
    fibaro:debug(string.format(‚<%s style=“color:%s;“>%s</%s>‘, „span“, color, message, „span“));
    end

    Debug( „orange“, „WakeUpTime scene – LUA Scripting by Jonny Larsson/Optimiert für siio.de by boomx“ );
    Debug( „orange“, „Version: „..version);
    Debug( „lightgreen“, „– Setze Alarmzeit im Virtuellen Device –„);
    Debug( „lightgreen“, „– Setze slider wie weit die Rollläden geöffnet werden –„);
    if alarmDay1 ~= „Off“ then
    Debug( „grey“, „Nächste Alarmzeit ist gesetzt „..alarmDay1..“:“..alarmTime1)
    end
    if alarmDay2 ~= „Off“ then
    Debug( „grey“, „Nächste Alarmzeit ist gesetzt „..alarmDay2..“:“..alarmTime2)
    end

    function timerFunction()
    timeNow = os.date(„%H:%M“)
    if alarmDay2 == „Off“ then
    table.remove(alarmDays, 2)
    table.remove(alarmTimes, 2)
    end
    for i = 1,#alarmDays do
    if timeNow == alarmDays[i] and alarmTimes[i] then
    sortTable()
    end
    end

    setTimeout(timerFunction, 60*1000)
    end

    sortTable = function()
    for i = 1,#devices do
    lightItems = devices[i];
    if fibaro:getType(lightItems) == „com.fibaro.FGR221“ or fibaro:getType(lightItems) == „com.fibaro.FGRM222“ or fibaro:getType(lightItems) == „com.fibaro.rollerShutter“ or fibaro:getType(lightItems) == „com.fibaro.FGWP101“ then
    table.insert(sortedtbl,lightItems)
    elseif fibaro:getType(lightItems) == „com.fibaro.binarySwitch“ then
    table.insert(sortedtbl,lightItems)
    elseif fibaro:getType(lightItems) == „com.fibaro.multilevelSwitch“ then
    table.insert(sortedtbl,lightItems)
    end
    end
    turnLightOn()
    end

    — TurnOn lights, functions
    turnLightOn = function()
    for i = 1,#sortedtbl do
    lightItems = sortedtbl[i];
    if fibaro:getType(lightItems) == „com.fibaro.FGR221“ or fibaro:getType(lightItems) == „com.fibaro.FGRM222“ or fibaro:getType(lightItems) == „com.fibaro.rollerShutter“ or fibaro:getType(lightItems) == „com.fibaro.FGWP101“ then
    fibaro:call(lightItems, „setValue“, blindUpLevel)
    elseif fibaro:getType(lightItems) == „com.fibaro.binarySwitch“ then
    fibaro:call(lightItems, „turnOn“)
    elseif fibaro:getType(lightItems) == „com.fibaro.multilevelSwitch“ then
    table.insert(tmptbl,lightItems)
    end
    end
    if (DimdevicesFunc) then
    for i = 1,#Dimdevices do
    DimItems = Dimdevices[i];
    fibaro:call(DimItems, „setValue“, fixedValue);
    end
    end
    if (vDeviceFunc) then
    fibaro:call(vDeviceID, „pressButton“, vDeviceButton)
    end
    if tmptbl == nil then
    if (debug) then
    Debug( „red“,’Keine Dimmer in der Tabelle gefunden, führe nächste Funktion nicht aus‘)
    end
    else wakeUpFunc()end

    end

    — Now its time to turnOn some lights
    wakeUpFunc = function()
    if (debug) then
    Debug( „green“,’Starte sanftes wakeup-light‘)
    end
    for i = 1,#tmptbl do
    lightItems = tmptbl[i];
    fibaro:call(lightItems, „setValue“, „0“);
    fibaro:sleep(200);
    addValue = _maxValue / tonumber(_duration);
    local currentValueLights = tonumber(fibaro:getValue(lightItems, „value“));
    local newValue = currentValueLights + addValue;
    end
    fibaro:sleep(1000);

    for variable = 0, _maxValue – 1, addValue do
    local currentValueLights = tonumber(fibaro:getValue(lightItems, „value“));
    if (variable ~= 0 and currentValueLights == 0 ) then
    if (debug) then
    Debug( „blue“,“Timer gestoppt, Lampen werden ausgeschaltet.“);
    end
    break;
    end
    local newValue = currentValueLights + addValue;
    if (debug) then
    Debug( „yellow“,’Erhöhe die Helligkeit auf ‚ .. newValue)
    end
    for i = 1,#tmptbl do
    lightItems = tmptbl[i];
    fibaro:call(lightItems, „setValue“, newValue);
    end
    fibaro:sleep(60*1000);
    end
    end

    insert2Table = function()
    if runOnce then
    sortedtbl = {}
    for i = 1, 500 do
    if („com.fibaro.FGR221“ == fibaro:getType(i) or „com.fibaro.FGRM222“ == fibaro:getType(i) or „com.fibaro.rollerShutter“ == fibaro:getType(i) or „com.fibaro.multilevelSwitch“ == fibaro:getType(i) or „com.fibaro.multilevelSwitch“ == fibaro:getType(i) or „com.fibaro.binarySwitch“ == fibaro:getType(i) or „com.fibaro.FGWP101“ == fibaro:getType(i)) then
    table.insert(sortedtbl,i)
    end
    end
    end
    Debug( „grey“,“Alle gefundenen Lampen werden in der Tabelle dargestellt, füge diese bei devices in den ‚User Settings‘ hinzu“)
    Debug( „grey“,json.encode(sortedtbl))
    runOnce = false
    end

    —————— START OF SCENE ———————-
    if ( startSource[„type“] == „autostart“ ) or ( startSource[„type“] == „global“ ) then
    if helper then
    insert2Table()
    end
    if alarmDay1 ~= „Off“ or alarmDay2 ~= „Off“ then
    timerFunction()
    else Debug( „blue“,“Szene ist nicht aktiv, solange keine Alarmzeit im Virtuellen device gesetzt ist.“)
    end
    else
    local wecker = tonumber(fibaro:getValue(weckerID, ‚value‘))
    Debug( „green“,“Hardwarewecker ausgelöst. Prüfe Value.“)
    if (wecker==0) then
    Debug( „green“,“Hardwarewecker ausgelöst. Starte Weckvorgang.“)
    sortTable()
    end
    end

    Habe ich irgendwas falsch übertragen?

    hier der Debug des Weckers:
    [DEBUG] 10:00:56: WakeUpTime scene – LUA Scripting by Jonny Larsson/Optimiert für siio.de by boomx
    [DEBUG] 10:00:56: Version: {2.1.1}
    [DEBUG] 10:00:56: — Setze Alarmzeit im Virtuellen Device —
    [DEBUG] 10:00:56: — Setze slider wie weit die Rollläden geöffnet werden —
    [DEBUG] 10:00:56: Nächste Alarmzeit ist gesetzt Weekdays:05:45
    [DEBUG] 10:00:56: Nächste Alarmzeit ist gesetzt Weekdays:10:00
    [DEBUG] 10:00:56: Hardwarewecker ausgelöst. Prüfe Value.
    [DEBUG] 10:00:56: Hardwarewecker ausgelöst. Starte Weckvorgang.
    [DEBUG] 10:00:56: Starte sanftes wakeup-light
    [DEBUG] 10:00:57: Erhöhe die Helligkeit auf 3.5
    [DEBUG] 10:01:57: Timer gestoppt, Lampen werden ausgeschaltet.

    #20398

    sasan
    Teilnehmer

    Noch ein paar Fragen:
    1) Fängt der Wecker um die Weckzeit an langsam hochzudimmen entsprechend der eingestellten Dimm_duration oder wird Weckzeit – Dimm_duration anfangen langsam zu dimmen um dann genau zur Weckzeit die volle Helligkeit zu erreichen?

    2) Muss ich im Regelbetrieb das Debuging ausschalten? Ich habe bemerkt dass der Debug nach einigen Stunden einfriert und nichts mehr macht! Generell, nach ca. 10 Stunden funktioniert der Wecker nicht mehr. Hat jemand anderes auch das gleiche Problem?

    • Diese Antwort wurde geändert vor 3 Jahre, 2 Monate von  sasan.
    #20843
    Xardas
    Xardas
    Teilnehmer

    Guten Morgen,

    habe die Szene gestern übernommen und noch eine Frage zu diesem Szenen-Block, weil ich die Variablen auch für das SmartLight einsetze:

    Was macht dieser Block?

    Da ich die Variablen nirgends gefunden habe, würde ich mal sagen, dass die noch nichts tun… Interessant wäre vielleicht das setzen der globalen Variablen nach dem Aufstehen! Dann müsste ich natürlich auf Konflikte mit der TimeOfDay-Szene aufpassen.

    • Diese Antwort wurde geändert vor 3 Jahre, 2 Monate von Xardas Xardas.
    #21031
    Xardas
    Xardas
    Teilnehmer

    Hallo,

    habe noch einen Fehler in Zeile 111 gefunden. Diese Aussage wird niemals war, da beim ersten Teil eine Urzeit mit einen Tag verglichen werden und nach dem UND der String niemals zu einer boolschen Variable wird, also auch nie „true“ sein kann:
    if timeNow == alarmDays[i] and alarmTimes[i] then

    Ich habe das wie folgt korrigiert und nun tut das Skript auch, was es soll:
    if dayName == alarmDays[i] and timeNow == alarmTimes[i] then

    Grüße
    Markus

    #21208
    Xardas
    Xardas
    Teilnehmer

    Das wars noch nicht ganz: Noch 3 Fehler gefunden und gefixxt:
    1. alarmdays[1] kann ja auch „Weekdays“ sein… Das matcht dann nie auf auf daName

    Daher habe ich mir noch die nummer des Wochentages geholt mit:
    dayOfTheWeek = tonumber(os.date ("%w"))
    1-5 sind hier die Wochentage, was man dann auch abfragen kann in dem Check von oben
    if ((alarmDays[i] == dayName or (alarmDays[i] == "Weekdays" and dayOfTheWeek > 0 and dayOfTheWeek < 6)) and timeNow == alarmTimes[i]) then

    2. Die Prüfung, ob man Dimmer hat, mit denen man Soft-Wecken kann, löst auch ohne Dimmer aus:
    if tmptbl == nil then
    korrekt ist meiner Meinung nach:
    if tmptbl[1] == nil then

    3. Die Szene wird getriggert durch Änderungen mit dem Virtuellen Modul. Danach läuft eine Dauerschleife los und checkt die Zeit für den Alarm. Ändert man den Wert dann wieder mit dem Modul werden wieder neue INstanzen der Szenen getrigger für jede Änderung alle aber mit unterschiedlichen Weckzeiten. Da meist nur maximal 2 Instanzen defaultmäßig zugelassen sind, kommt man so nicht bis zu Weckzeit, die man mit vielen Clicks einstellt. Meine Lösung: Man muss die Globalen variablen bei jedem Durchlauf neu Abfragen, um sicher zu sein, dass eine Aktualisierung auch klappt. Dann reicht auch eine Szene.

    Vielleicht sind das nicht die besten Lösungen, aber funktionieren erstmal. Für Verbesserungsvorschläge bin ich natürlich dankbar :-)

    Gruß
    Markus

    #24488

    FIBAROWLK
    Teilnehmer

    @markus könntest Du mal so nett sein und das komplette korrigierte Script hier posten. Danke

    Grüsse aus der Hauptstadt

    Wolfgang

    #24505

    sasan
    Teilnehmer

    ja bitte unbedingt das gesamten Script posten. das ist ja genial das du das überhaupt rausgefunden hast. die meisten sind nur frustriert das es nicht klappt, können sich jedoch nicht selbst helfen

    #24514
    Xardas
    Xardas
    Teilnehmer

    Ok, mache ich heute Nachmittag/Abend. Welche Version interessiert euch denn? Habe mittlerweile eine, die auch eine Phillips Hue über ein VM analog dimmbarer Modulezum Wecken hochdimmen kann. Oder brauch ihr so was nicht?

    #24530

    boomx
    Teilnehmer

    VM = Virtuelle Maschine, VD = Virtuelles Device. Schon ein kleiner Unterschied ;)

    #24541
    Xardas
    Xardas
    Teilnehmer

    Bei mir ist VM = virtuelles Modul (also Synonym zu VD) :-P

    #24557
    Xardas
    Xardas
    Teilnehmer

    So hier die Version mit Hue Lampen.

    WICHTIG: Die VD für die Hue müssen so benannt sein, dass am Ende Hue[x] steht, z.B. Hue1, Hue2 usw.

Ansicht von 15 Beiträgen - 1 bis 15 (von insgesamt 26)

Du musst angemeldet sein, um auf dieses Thema antworten zu können.