Variable uhrzeitbasierte Zeitschaltung
Verfasst: 28. Aug 2020 20:01
Aus dem Problem heraus das Zeitsteuerungen via Cron nicht variabel sind und somit zeitliche Anpassungen nur in den Rule direkt anzupassen sind ist folgendes Projekt entstanden:
Grundlage sind Items, die einen def. Zeitwert/Uhrzeit bzw. ein Zeitintervall/Minuten wieder spiegeln (hier: alle 30min)
Items:
In einer Rule werden alle 30min die aktuellen Stunden u. Minutenwerte abgefragt und das entsprechende Item wird anhand des Item-Namens für 2 Sekunden eingeschaltet.
Rule:
Für statische Cron-Rules kann nun als Trigger das entsprechende Item (trgZeit_xxxx od. trigMin_xx) mit "changed to ON" benutzt werden.
Bsp. Täglich um 6:00:00
Alt: Time cron "0 0 6 * * ?"
--> Neu: Item trgZeit_0600 changed to ON
Oder
Jede volle Stunde
Alt: Time cron "0 0 0/1 * * ?"
--> Neu: Item trgMin_00 changed to ON
Die dynamische Cron-Rule wird anhand des folgenden Beispiels (Abschaltung „Fernseher-Kinderzimmer“) erklärt.
Neben dem Item für den Fernseher (TM_KZ1_Fernseher) wird ein Dummy Item (Selection) benötigt
Item:
und in der Sitemap mit den Selektionsparametern angelegt.
Sitemap:
Über die entsprechende Geräte-Rule wird nun über die Gruppe (OD) der Zeit-Items getriggert und der gespeicherte Zeitwert aus „DY_ZeitTrigger“ mit dem eingestellten Selektionsparameter „DY_KZ1_Fernseher_Profil“ verglichen und das entsprechende Command ausgeführt.
Rule:
Ich hoffe das dieses Projekt dem ein oder anderen helfen kann.
Anregungen bzw. Verbesserrungen werden dankend angenommen!
An dieser Stelle möchte ich mich auch bei Udo1Toni bedanken.
Ohne seine zahllosen Hilfen u. Erklärungen in diesem Forum wäre die Umsetzung dieses Projekts für mich nicht möglich gewesen.
DANKE !!!
Grundlage sind Items, die einen def. Zeitwert/Uhrzeit bzw. ein Zeitintervall/Minuten wieder spiegeln (hier: alle 30min)
Items:
Code: Alles auswählen
Group:Switch:OR(ON,OFF) grpZeit
// Periodisch
Switch trgMin_30 (grpZeit) // alle 30min
Switch trgMin_00 (grpZeit) // alle 60min (volle Stunde)
// Uhrzeit
Switch trgZeit_0000 (grpZeit)
Switch trgZeit_0030 (grpZeit)
Switch trgZeit_0100 (grpZeit)
Switch trgZeit_0130 (grpZeit)
Switch trgZeit_0200 (grpZeit)
…
Rule:
Code: Alles auswählen
var Number varStd = null
var Number varMin = null
var zeitItem = null
var minItem = null
rule "Cron-Trigger"
when
// alle 30 Minuten
Time cron "0 0/30 * * * ?"
then
val String valRuleName = "Cron-Trigger"
// Variablen für akt. Std/Min
varStd = (now.getHourOfDay)
varMin = (now.getMinuteOfHour)
// Item mit Std. u. Min Wert (Format: HHMM)
DY_ZeitTrigger.postUpdate(String::format("%02d",varStd) + String::format("%02d",varMin))
// Auswahl des entsprechenden Items
// Uhrzeit
var zeitItem = grpZeit.members.filter[i|i.name == ("trgZeit_" + String::format("%02d",varStd) + String::format("%02d",varMin))].head
// Periodisch
var minItem = grpZeit.members.filter[i|i.name == ("trgMin_" + String::format("%02d",varMin))].head
// kurzes Einschalten des entsprechenden Items (nach 2 Sek wieder auf OFF)
zeitItem.postUpdate(ON)
minItem.postUpdate(ON)
Thread::sleep(2000)
zeitItem.postUpdate(OFF)
minItem.postUpdate(OFF)
end
Bsp. Täglich um 6:00:00
Alt: Time cron "0 0 6 * * ?"
--> Neu: Item trgZeit_0600 changed to ON
Oder
Jede volle Stunde
Alt: Time cron "0 0 0/1 * * ?"
--> Neu: Item trgMin_00 changed to ON
Die dynamische Cron-Rule wird anhand des folgenden Beispiels (Abschaltung „Fernseher-Kinderzimmer“) erklärt.
Neben dem Item für den Fernseher (TM_KZ1_Fernseher) wird ein Dummy Item (Selection) benötigt
Item:
Code: Alles auswählen
// Selektionswert aus Auswahlfeld
String DY_KZ1_Fernseher_Profil </code>
Sitemap:
Code: Alles auswählen
Selection item=DY_KZ1_Fernseher_Profil
label="Zeitsteuerung Marvin-TV"
mappings=[ 2100="21:00 Uhr", 2130="21:30 Uhr ", 2200="22:00 Uhr ", 2230="22:30 Uhr ", 2300="23:00 Uhr ", 2330="23:30 Uhr ", 0000="0:00 Uhr ", 0030="0:30 Uhr ", 9999="Aus"]
icon="time"
Rule:
Code: Alles auswählen
rule "Zeitsteuerung MarvinTV" // Zeiteinstellung MarvinTV - Anzeige auf Sitemap
when
Item grpZeit changed to ON
then
// Verzögerung da zeitgleich das Item "DY_ZeitTrigger" geschrieben wird
Thread::sleep(5000)
// Überprüfung ob der Trigger-Wert und der Selektions-Wert übereinstimmen
if (DY_ZeitTrigger.state == DY_KZ1_Fernseher_Profil.state) {
// Ausschaltbefehl
TM_KZ1_Fernseher.sendCommand(OFF)
}
end
Anregungen bzw. Verbesserrungen werden dankend angenommen!
An dieser Stelle möchte ich mich auch bei Udo1Toni bedanken.
Ohne seine zahllosen Hilfen u. Erklärungen in diesem Forum wäre die Umsetzung dieses Projekts für mich nicht möglich gewesen.
DANKE !!!