Variable uhrzeitbasierte Zeitschaltung

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Heavy-Dee
Beiträge: 143
Registriert: 18. Jan 2018 16:38
Answers: 0

Variable uhrzeitbasierte Zeitschaltung

Beitrag von Heavy-Dee »

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:

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) 
…
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:

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
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:

Code: Alles auswählen

// Selektionswert aus Auswahlfeld
String DY_KZ1_Fernseher_Profil </code>
und in der Sitemap mit den Selektionsparametern angelegt.

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"
Ü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:

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
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 !!!
openHab4 (v. 4.1.0) Docker auf Synology DS920+ :!:

Heavy-Dee
Beiträge: 143
Registriert: 18. Jan 2018 16:38
Answers: 0

Re: Variable uhrzeitbasierte Zeitschaltung

Beitrag von Heavy-Dee »

Habe noch einen Fehler :!: gefunden.
Jetzt sollte es passen !
openHab4 (v. 4.1.0) Docker auf Synology DS920+ :!:

Benutzeravatar
udo1toni
Beiträge: 15249
Registriert: 11. Apr 2018 18:05
Answers: 243
Wohnort: Darmstadt

Re: Variable uhrzeitbasierte Zeitschaltung

Beitrag von udo1toni »

Hm. Ich will ja nicht nörgeln... Ich sehe ehrlich gesagt nicht, wo der Vorteil sein soll. Letztlich wird die "dynamische" Rule halbstündlich getriggert (und zwar sogar jeweils zweimal!) und anschließend prüft die Rule intern, ob die gewünschten Bedingungen erfüllt sind.
Die "statische" Rule wird nun künstlich über ein Item getriggert, welches aber selbst über die entsprechende Rule gesetzt wurde. Wo ist da der Vorteil? Du kannst hier den Zeitpunkt ja nicht ohne Eingriff in den Code ändern, also ist nichts gewonnen.

Es gibt etliche Codebeispiele von Timern, welche über die UI konfigurierbar sind (Stunden/Minuten über Items setzen), aber fast allen gemein ist (so wie bei Deinem Code auch), dass die Rules letztlich zyklisch prüfen, ob die Bedingung erfüllt ist.

Es gab auch mal ein Projekt, welches Timer für diesen Zweck nutzte. das heißt, einmal täglich und bei Änderung der Stunden/Minutenitems wird der Timer gesetzt. Diese Rules werden dann tatsächlich nur zum gewünschten Zeitpunkt ausgeführt, aber sind dennoch über Items flexibel steuerbar.

Aber auch das ist mit vergleichsweise viel Aufwand verbunden - es gibt ja auch das gcal Binding und das caldav Binding, beide sind dazu in der Lage, zu festgelegten Zeiten Aktionen auszulösen. Beide Varianten bieten eine UI über die man die Termine ändern kann. Natürlich geht das dann nicht über die Basic UI oder HABpanel. Aber ich möchte an dieser Stelle wieder darauf hinweisen, dass man eine Schraube zwar auch mit einem Hammer in die Wand bekommt, ein Schraubendreher aber das bessere Werkzeug für die Aufgabe ist.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten