Seite 1 von 6

Diskussion zu ZSU-Baustein

Verfasst: Di Dez 15, 2020 8:49 am
von Robert_Mini
Hallo Markus!

Abgetrennt von hier: viewtopic.php?f=24&t=2516

Danke übrigens für den Denkanstoß!
Ich werde damit kurzfristig eine Custom Logik für eine ZSU erstellen. Da ist dann die Berechnung der Weckzeit integriert + Eingang h/min für Ein und Aus, Sperreingang.

Lg
Robert

Re: Zeit in Unix Zeit umrechnen

Verfasst: Di Dez 15, 2020 9:27 pm
von Robert_Mini
Kurzer Zwischenstand - die Logik schaltet schon korrekt ein...
Robert

Re: Zeit in Unix Zeit umrechnen

Verfasst: Di Dez 15, 2020 10:53 pm
von Robert_Mini
Kleiner Teaser, weil ich mich grad selbst drüber freue. Bin noch am Initialisieren nach Speichern/Reboot, dann gibt's bald eine ZSU.
lg
Robert
ZSU_Vorschau.png

Re: Zeitfenster V1.2 (17.08.2020)

Verfasst: Mi Dez 16, 2020 10:35 pm
von Robert_Mini
Hallo Sven! Hallo Markus!

Ich hab gestern befürchte ich das gleiche nochmal umgesetzt.
Das Problem der Einschaltzeit/Ausschaltzeit Reihenfolge habe ich gerade noch gelöst.

Das Modul nutzt die Wakeup Funktion, das macht vieles deutlich einfacher (Sein Ausgang ist im Prinzip ein Comperator auf UTime, aber mit integriertem Timer, der zu diesem Zeitpunkt dann triggert).

Außerdem habe ich das Verhalten soweit erweitert, dass sofort beim Speichern oder Reboot die Weckzeiten gesetzt werden.
Über die Sendeoptionen ist ein Senden bei Änderung 1x EIN, 1x AUS (mit c) oder zyklisch (ct) mit zusätzlichem Trigger (die Standardlösung am +).

Auch ein Enable hab ich integriert. Sekunden fehlen noch.

Das Prinzip ist etwas anders und ich nutze mehr die verfügbaren Module, wo ihr selbst per clocksignal einen Trigger erzeugt.
Schaut euch das mal an, ob wir hier eine gemeinsame Lösung draus machen können, denn am Ende sind die beiden Lösungen am Ausgang gleichwertig. Der Baustein schaltet zu exakten Sekunde.

Kurz zur Funktion: Beim Speichern wird letztes Mitternacht berechnet, ab dann wird jeweils Mitternacht per Cron gespeichert. Die Weckzeit wird dann mit UTime Mitternacht + h*3600 + min*60 berechnet.

Den Rest erledigt Wakeup.

lg
Robert

Code: Alles auswählen

/**===========================================================
Kommentar
============================================================*/
{
    "Level":[
        ["$I_hour_on","integer",0],
		["$I_min_on","integer",0],
		["$I_hour_off","integer",0],
		["$I_min_off","integer",0],
		["$I_Enable","bool",false],
		//
		["$Output_on","bool",true], 
		["$Output_off","bool",false], 
		//
		["$Utime","integer",0],
		["$Utime_Midnight1","integer",0],
		["$Utime_Midnight2","integer",0],
		["$Utime_on","integer",0],
		["$Utime_off","integer",0],
		["$Utime_Ref","integer",0],
		["$Utime_temp","integer",0],
		["$Utime_hour","integer",0],
		["$Utime_min","integer",0],
		["$Utime_sec","integer",0],
		//
		["$Set_Utime_Midnight","bool",false],
		["$Set_on","bool",false],
		["$Set_off","bool",false],
		["$SetCase1","bool",false],
		["$SetCase2","bool",false],
		["$Set","bool",false],
		["$Wake_on","bool",false],
		["$Wake_off","bool",false],
		["$Wake_on_Last","bool",false],
		["$Wake_off_Last","bool",false],
		["$Wake_on_Trigger","bool",false],
		["$Wake_off_Trigger","bool",false],
		
		// Init nach Reboot
		["$Enable","bool",false],
		["$State","bool",false],
		["$StateOut","bool",false],
		["$Delay","float",5.0],
		["$TimerStatus","bool",false],
		
		["$SelectCase","bool",false],
		
		["$Konst1","integer",1],
		["$Konst0","integer",0],
		["$Konst60","integer",60],
		["$Konst3600","integer",3600],
		["$Konst1_","float",1.0],
		["$Konst0_","float",0.0],
		["$KonstTrue","bool",true],
		["$KonstFalse","bool",false],
		["$Cron_Midnight","string","0 0 0 * * *"]
    ],
    "Module":[
		["Localtime",0,"$Utime","$Utime_sec","$Utime_min","$Utime_hour",0,0,0,0,0,0],
		["Latch","$StateOut","$State","$KonstTrue",0],
		// Logik beim speichern bzw. Reboot Aufrufen 
		["Clocksignal","-$State",0,"$Delay"],

		["Latch","$Utime","$Utime_Ref","-$State",0],
		// und Utime_Midnight2 initialisieren (State=0)
		["Polynomial", "$Utime_hour", "$Utime_temp",["$Utime_Ref", "-$Konst3600"]],	
		["Polynomial", "$Utime_min", "$Utime_temp",["$Utime_temp", "-$Konst60"]],	
		["Polynomial", "$Utime_sec", "$Utime_Midnight2",["$Utime_temp", "-$Konst1"]],	
		["Latch","$Utime_Midnight2","$Utime_Midnight1","-$State",0],
		// State nach Start auf 1 setzen
		["Latch","$KonstTrue","$StateOut","-$State",0],
		
		// Zeit übernehmen, wenn Cron getriggert hat
		["Cron","$KonstTrue","$Set_Utime_Midnight",0,"$Cron_Midnight"],
		["Latch","$Utime","$Utime_Midnight1","$Set_Utime_Midnight",0],
		
		// Weckzeit ON berechnen
		["Polynomial", "$I_hour_on", "$Utime_temp",["$Utime_Midnight1", "$Konst3600"]],	
		["Polynomial", "$I_min_on", "$Utime_on",["$Utime_temp", "$Konst60"]],	
		// Weckzeit OFF berechnen
		["Polynomial", "$I_hour_off", "$Utime_temp",["$Utime_Midnight1", "$Konst3600"]],	
		["Polynomial", "$I_min_off", "$Utime_off",["$Utime_temp", "$Konst60"]],	
		
		// Wecker auswertern => Liefert dauerhaft true, wenn t>t_wecker
		["Wakeup","$Utime_on","$Wake_on"],
		["Wakeup","$Utime_off","$Wake_off"],
		
		// Ein/Aus berechnen abhängig davon ob EIN vor AUS oder AUS vor EIN
		["Comparator", "$Utime_on", "$SelectCase", "$Utime_off"],

		["And" , ["$Wake_on","$Wake_off","$SelectCase","$I_Enable"], "$SetCase1"],
		["And" , ["$Wake_on","-$Wake_off","-$SelectCase","$I_Enable"], "$SetCase2"],
		["Multiplexer",["$SetCase1","$SetCase2"],"$Set","-$SelectCase"]
		
    ],
    "Input":[
		["Einschalten Stunde","Input","$I_hour_on","c"],
		["Einschalten Minute","Input","$I_min_on","c"],
		["Ausschalten Stunde","Input","$I_hour_off","c"],
		["Ausschalten Minute","Input","$I_min_off","c"],
		["Enable","Input","$I_Enable","c"]
    ],
    "Output":[
        ["Einschalten","Output","$Set","c"],
//      ["Einschalten","Output","$Output_on","x"]
//		["Ausschalten","Output","$Output_off","x"],
	    ["Debug Utime_Midnight1","","$Utime_Midnight1","a"]
    ]
}

Re: Diskussion zu ZSU-Baustein

Verfasst: Mi Dez 16, 2020 10:47 pm
von Robert_Mini
Ich habe den Baustein praktisch fertig. Allerdings habe ich den Absatz oben mit getrenntem Ausgang für EIN/AUS aufgegeben.

Daher hier die Frage - braucht das jemand: EIN auf GA1, AUS auf GA2 wie ich das im Bild oben hatte (bei einer GA verbindet man auf beide Ausgänge das gleiche Objekt)? Ich sehe eigentlich selbst keine Notwendigkeit mehr... :angry-banghead: :angry-banghead: :angry-banghead:

Ansonsten bleibt im Prinzip die gleiche Logik wie "Zeitfenster V1.2" hier: viewtopic.php?f=65&t=2348 mit etwas optimierten Modulen und "einfacher".

Danke für eure Hinweise.

Robert

Re: Zeitfenster V1.2 (17.08.2020)

Verfasst: Do Dez 17, 2020 6:55 am
von Robosoc
Ui, krass Robert. Wieso habe ich das Gefühl, dass Dein Tag immer mehr Stunden hat :-)

Hattest Du den Baustein neu entworfen, weil Du Dich nicht an diesen erinnert hattest oder weil Dir daran was nicht gefiel und wenn Letzteres, was gefiel Dir nicht? Icch hatte den Eindruck, dass der Zeitfensterbasutein V1.2 z.B. auch nach einem Speichern oder Reboot funktionierte...
Auch für das Thema Schalten über Mitternach hinweg, war mir jetzt heut morgen eine Lösung eingefallen, die ich gleich mal realisiere. Wenn ich es richtig verstehe, machst Du es untern Strich ähnlich, nämlich mit einer Abfrage und Negierung des Ausgangs, oder?

Ich tue mich gerade noch etwas schwer jedes Modul und jeden Parameter nachzuvollziehen in Deinem Code, aber ich habe ihn einfach mal getestet. Folgendes ist mir aufgefallen:
Der Ausgang sollte glaube ich eher auf das Verhalten t oder ct umgestellt werden damit man auch zyklisch triggern kann.
Wenn ich einen Trigger1-Eingang definiere, scheint dieser dennoch erst nach dem ersten Auslösen (als dem ersten mal True auf dem Ausgang) aktiv zu sein... das verstehe ich gerade noch nicht.

Re: Zeitfenster V1.2 (17.08.2020)

Verfasst: Do Dez 17, 2020 7:26 am
von Robosoc
So habe jetzt mal den Zeitfensterbaustein in V1.3 umgesetzt mit Erkennung, ob der gesetzte Zeitraum über Mitternacht geht:

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]
  ]
}


Re: Zeitfenster V1.3 (17.12.2020)

Verfasst: Do Dez 17, 2020 8:36 am
von Eraser
Das ZSU-Baustein-Duell hat begonnen... :lol:

Re: Zeitfenster V1.3 (17.12.2020)

Verfasst: Do Dez 17, 2020 9:00 am
von gbglace
Na dann mal sehen was die Elabnet-Stefans dann noch draus machen können.

Re: Diskussion zu ZSU-Baustein

Verfasst: Do Dez 17, 2020 9:16 am
von paralan
Hallo Robert,

mir würde ein Ausgang für Ein/Aus schon reichen. Der Baustein macht vieles einfacher und flexibler!! :clap: