Seite 1 von 3

Zeitfenster V1.3 (17.12.2020)

Verfasst: Do Aug 13, 2020 12:42 pm
von Ide71
Hallo zusammen,

ich habe bei der Jalousie-Steuerung die Herausforderung gehabt, dass ich einen Logikbaustein vermisst habe, der mir in einem definierten Zeitintervall TRUE liefert (z.B. von 8 bis 22 Uhr), außerhalb des Zeitfenster aber FALSE.

Beispiel für eine Anwendung: Ich will die Jalousiesteuerung helligkeitsabhängig machen, vor 8 Uhr sollen die Jalousien aber nicht hochfahren, auch wenn es draußen schon hell ist.

Hierfür habe ich folgende CustomLogik programmiert, die ich gerne zur Verfügung stelle. Feedback und Verbesserungsvorschläge sind willkommen.
Nach dem Speichern müssen erst noch alle Eingänge auf Parameter umgestellt werden, das geht leider (bisher) nicht per default (siehe auch hier).

Hier die Quellcode:

Code: Alles auswählen


/**
 * Zeitfenster
 * Der Logikbaustein sendet TRUE, wenn die aktelle Uhrzeit zwischen den beiden angegebenen Zeiten liegt.
 * Davor und danach wird FALSE gesendet.
 * Über Zyklus [s] kann gesteuert werden, wie oft die Prüfung stattfindet und der Ausgangswert ggfs.
 * aktualisiert wird.
 * 
 * Nutzungsrechts: Der Schöpfer dieser Custom Logik überträgt die Nutzungsrechte gemäß der TOLL 
 * ("Timberwolf Open Logikblock License") die unter https://wrgt.news/TOLL zum Download zur Verfügung steht."
 * 
 * Erstellt am 12.08.2020 von Markus Großmann
 * 
 * ChangeLog:
 * V1.3 (17.12.2020): Baustein funktioniert auch, wenn das Zeitfenster über Mitternacht definiert ist, also wenn VON-Zeit > BIS-Zeit (edit Robosoc)
 * V1.2 (13.08.2020): optionaler zyklischer Sendetakt, output parameter t statt c (edit Robosoc)
 * V1.1 (13.08.2020): Ausgang wird nun sekundengenau geschaltet
 * V1.0 (13.08.2020): Initial Release
 */

{
  "_Meta": { // Optional
    "Description": "Zeitfenster",
    "Version": "1.2",
    "Icon": "" // format: "data:image/svg+xml;base64,ENCODED_FILE"
  },
  "Input": [
      ["Stunde von","Stunde von", "$h_from", "c"],
      ["Minute von","Minute von", "$m_from", "c"],
      ["Sekunde von","Sekunde von", "$s_from", "c"],
      ["Stunde bis","Stunde bis", "$h_to", "c"],
      ["Minute bis","Minute bis", "$m_to", "c"],
      ["Sekunde bis","Sekunde bis", "$s_to", "c"],
      ["Zyklischer Sendeinterval", "optionaler Sendetakt in Sekunden, 0 = deaktiv: Ausgang wird nur bei Änderung gesendet, bei Wert > 0 wird der Ausgang zyklisch entrechend gesendet","$interval","c"]
  ],
  "Output": [
      ["Ausgang","Wenn aktuelle Zeit im Zeitfenster, ausgang = 1, sonst 0", "$CurrIsInInterval", "t"]
  ],
  "Level": [
      ["$ltime","integer", 0],
      ["$h_from","integer", 0],
      ["$m_from","integer", 0],
      ["$s_from","integer", 0],
      ["$h_to","integer", 0],
      ["$m_to","integer", 0],
      ["$s_to","integer", 0],
      ["$h_curr","integer", 0],
      ["$m_curr","integer", 0],
      ["$s_curr","integer", 0],
      ["$TimeFrom","integer",0],
      ["$TimeTo","integer",0],
	  ["$TimeBufferNeg","integer",0],
      ["$TimeCurrent","integer",0],
      ["$CurrIsAfterFrom","bool", false],
      ["$CurrIsAfterTo","bool", false],
      ["$CurrIsInInterval","bool", false],
      ["$Const1","integer",1],
      ["$Const60","integer",60],
      ["$Const86400", "integer", 86400],
      ["$Period","integer",60],
      ["$ConstTRUE","bool", true],
      ["$SecondsTillFrom","integer",0],
      ["$SecondsTillTo","integer",0],
      ["$SecondsTillNext","integer",1],
      ["$SecondsTillFrom_GT_Zero", "bool", false],
      ["$SecondsTillTo_GT_Zero", "bool", false],
      ["$From_GT_To", "bool", false],
      ["$interval", "integer", 0],
	  ["$Negieren", "bool", false]
  ],
  "Module": [
      // Aktuelle Uhrzeit
      ["Localtime",0,"$ltime","$s_curr","$m_curr","$h_curr",0,0,0,0,0,0],
      ["Polynomial", "$Const60", "$TimeCurrent", ["$s_curr","$m_curr","$h_curr"]],
      // Zeit Von in Sekunden
      ["Polynomial", "$Const60", "$TimeFrom", ["$s_from","$m_from","$h_from"]],
      // Zeit Bis in Sekunden
      ["Polynomial", "$Const60", "$TimeTo", ["$s_to","$m_to","$h_to"]],
	  // Prüfen, ob TimeFrom > TimeTo, sonst tauschen und Ausgang negieren
	  ["Comparator", "$TimeFrom" , "$Negieren" , "$TimeTo" ],
	  ["Latch","$TimeTo","$TimeBufferNeg","$Negieren",0],
	  ["Latch","$TimeFrom","$TimeTo","$Negieren",0],
	  ["Latch","$TimeBufferNeg","$TimeFrom","$Negieren",0],
      // Wie lange noch bis Zeit von?
      ["Polynomial", "$Const1", "$SecondsTillFrom", ["$TimeFrom", "-$TimeCurrent"]],
      ["Comparator", "$Const1", "$SecondsTillFrom_GT_Zero", "$SecondsTillFrom"],
      ["Polynomial", "$SecondsTillFrom_GT_Zero", "$SecondsTillFrom", ["$SecondsTillFrom", "$Const86400"]],
      // Wie lange noch bis Zeit bis?
      ["Polynomial", "$Const1", "$SecondsTillTo", ["$TimeTo", "-$TimeCurrent"]],
      ["Comparator", "$Const1", "$SecondsTillTo_GT_Zero", "$SecondsTillTo"],
      ["Polynomial", "$SecondsTillTo_GT_Zero", "$SecondsTillTo", ["$SecondsTillTo", "$Const86400"]],
      // Was ist früher?
      ["Comparator", "$SecondsTillFrom" , "$From_GT_To" , "$SecondsTillTo" ],
      ["Multiplexer", ["$SecondsTillFrom", "$SecondsTillTo"],"$SecondsTillNext", "$From_GT_To"],
      // Timer setzen
      ["Clocksignal","$ConstTRUE",0,"$SecondsTillNext"],
      // zyklischer Sendetimer
      ["Clocksignal","$ConstTRUE",0,"$interval"],
      // Ergebniswert berechnen
      ["Comparator", "$TimeFrom" , "$CurrIsAfterFrom" , "$TimeCurrent" ],
      ["Comparator", "$TimeTo" , "$CurrIsAfterTo" , "$TimeCurrent" ],
      ["And", ["-$CurrIsAfterFrom", "$CurrIsAfterTo"], "$CurrIsInInterval"],
	  ["Latch","-$CurrIsInInterval","$CurrIsInInterval","$Negieren",0]
  ]
}

Und so sieht das ganze dann aus:
Zeitfenster_V1_1.png
Viel Spaß damit.

Gruß
Markus

Re: Zeitfenster V1.0 (13.08.2020)

Verfasst: Do Aug 13, 2020 1:16 pm
von Robosoc
Vielen Dank! Also eine Art Tag - Nacht Umschaltung. mit Einstellbaren Zeitfenstern.

Das habe ich bei mir mit einem "Timer 1" Standardbaustein gelöst, nur als Alternativvorschlag:
Anmerkung 2020-08-13 131504.jpg
Kann aber gut sein, dass ich darauf nicht selber gekommen bin und es von irgendwem hier im Forum übernommen habe.

Re: Zeitfenster V1.0 (13.08.2020)

Verfasst: Do Aug 13, 2020 1:31 pm
von Ide71
Stimmt, das ist auch eine mögliche Lösung. Was mir an meiner besser gefällt: Der Ausgang stimmt sofort, wenn man sie das erste mal anlegt oder die Parameter ändert. Und man muss nix rechnen. ;)

Re: Zeitfenster V1.0 (13.08.2020)

Verfasst: Do Aug 13, 2020 1:34 pm
von Robosoc
:handgestures-thumbupright:
Ja auf jeden Fall ist das erste Argument ein riesen Vorteil.

Re: Zeitfenster V1.0 (13.08.2020)

Verfasst: Do Aug 13, 2020 2:01 pm
von Robert_Mini
Das fehlt sicher in optimierter Form noch als Standardbaustein. Hatte bis jetzt keinen Bedarf, aber aus meiner Sicht gibt es 2 Anforderungen, wobei Eure Lösungen nur jeweils eine davon erfüllen.
Ist aber auch Jammern auf hohem Niveau:
1) Zustand soll sofort stimmen
2) Schalten soll zum exakten Zeitpunkt erfolgen

Der 2. Punkt hat mit bei den Plugins am WG immer gefehlt und ist am TWS wirklich genial!

So richtig hab ich auch grad keinen Lösungsansatz, aber ich werde mal nachdenken...

Lg
Robert

Re: Zeitfenster V1.0 (13.08.2020)

Verfasst: Do Aug 13, 2020 2:05 pm
von Ide71
Der 2. Punkt geht mir auch schon durch den Kopf. Hab auch schon eine Idee, wie ich das umsetzen möchte. Muss es nur noch tun...

Re: Zeitfenster V1.0 (13.08.2020)

Verfasst: Do Aug 13, 2020 2:18 pm
von Robosoc
Robert_Mini hat geschrieben: Do Aug 13, 2020 2:01 pm
2) Schalten soll zum exakten Zeitpunkt erfolgen
Sehr gut gesehen, das war mir noch nicht aufgefallen, wollte den Baustein von ide71 eigentlich schon übernehmen.

Wolfgang hat hier viewtopic.php?f=24&t=2173&p=24005&hilit=cron#p24005 schonmal einen Lösungsansatz gebracht, der aber ohne Parameter in der Logikzellendarstellung auskommem muss verwendet.

Da ich meinen Timer1-Baustein im Persistenzmodus laufen lassen, scheint mir das aber die einfachste Lösung zu bleiben und in den allermeisten Fällen eine ausreichend gute Lösung darzustellen, die auch genau schaltet. Man könnte Sie noch um einen Trigger erweitern, so dass z.B. mal alle 15 Minuten der Ausgang gesendet wird...

Re: Zeitfenster V1.1 (13.08.2020)

Verfasst: Do Aug 13, 2020 4:45 pm
von Ide71
In der neuen Version 1.1 wird nun der Ausgang sekundengenau gesetzt, der Trigger ist nicht mehr notwendig. Wäre schön, wenn das noch jemand verifizieren könnte. ;)

Re: Zeitfenster V1.1 (13.08.2020)

Verfasst: Do Aug 13, 2020 4:59 pm
von Ide71
Jetzt bin ich selber etwas ratlos. Die Logik funktioniert bei mir manchmal, manchmal wird sie aber nicht ein einziges Mal getriggert. Ich kann es aber nicht reproduzieren. Hat jemand eine Idee, oder ist das ein Bug?

Update: Ich hab jetzt mal den Dienst von der Logik Engine neu gestartet, jetzt passt alles. Die scheint sich also bei mir irgendwie aufgehängt zu haben...

Re: Zeitfenster V1.1 (13.08.2020)

Verfasst: Do Aug 13, 2020 9:47 pm
von Robosoc
:think: Ich schau mir das mal mit an. Beim ersten durchlesen des Codes habe ich keinen Fehler direkt erkannt. Aber bei mir speichert die Logik gleich mit error....das deutet meist auf einen Fehler in einem Levelnamen hin.... :think: zumindest mache ich den Fehler sehr häufig.