Ab SOFORT: Neue Version 3.4.2 für TWS 3500
Jetzt mit Registrierung und vielen Verbesserungen: viewtopic.php?f=8&t=3595


Neue Insider Version RC5 / 5.1 zur 3.x für alle anderen Timberwolf Server
Jetzt mit Registrierung & Lizenzen und vielen Verbesserungen: viewtopic.php?f=8&t=3595

[DISKUSSION] Diskussion zu ZSU-Baustein

Informationen und Diskussionen über Logik-Engine und Logik-Editor
Forumsregeln
  • Denke bitte an aussagekräftige Titel und gebe dort auch die [Firmware] an. Wenn ETS oder CometVisu beteiligt sind, dann auch deren Version
  • Bitte mache vollständige Angaben zu Deinem Server, dessen ID und dem Online-Status in Deiner Signatur. Hilfreich ist oft auch die Beschreibung der angeschlossener Hardware sowie die verwendeten Protokolle
  • Beschreibe Dein Projekt und Dein Problem bitte vollständig. Achte bitte darauf, dass auf Screenshots die Statusleiste sichtbar ist
  • Bitte sei stets freundlich und wohlwollend, bleibe beim Thema und unterschreibe mit deinem Vornamen. Bitte lese alle Regeln, die Du hier findest: https://wiki.timberwolf.io/Forenregeln

Ersteller
Robert_Mini
Reactions:
Beiträge: 3127
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 813 Mal
Danksagung erhalten: 1577 Mal

Diskussion zu ZSU-Baustein

#1

Beitrag 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
Zuletzt geändert von Robert_Mini am Mi Dez 16, 2020 10:42 pm, insgesamt 1-mal geändert.
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / Wiregate-Fan

Ersteller
Robert_Mini
Reactions:
Beiträge: 3127
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 813 Mal
Danksagung erhalten: 1577 Mal

#2

Beitrag von Robert_Mini »

Kurzer Zwischenstand - die Logik schaltet schon korrekt ein...
Robert
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / Wiregate-Fan

Ersteller
Robert_Mini
Reactions:
Beiträge: 3127
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 813 Mal
Danksagung erhalten: 1577 Mal

#3

Beitrag 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
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / Wiregate-Fan

Ersteller
Robert_Mini
Reactions:
Beiträge: 3127
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 813 Mal
Danksagung erhalten: 1577 Mal

#4

Beitrag 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"]
    ]
}
Zuletzt geändert von Robert_Mini am Mi Dez 16, 2020 10:36 pm, insgesamt 1-mal geändert.
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / Wiregate-Fan

Ersteller
Robert_Mini
Reactions:
Beiträge: 3127
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 813 Mal
Danksagung erhalten: 1577 Mal

#5

Beitrag 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
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / Wiregate-Fan

Robosoc
Reactions:
Beiträge: 1593
Registriert: Di Okt 09, 2018 9:26 am
Hat sich bedankt: 544 Mal
Danksagung erhalten: 625 Mal

#6

Beitrag 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.
VG, Sven - TWS 950Q ID:335 & 291, VPN offen, Reboot OK

Robosoc
Reactions:
Beiträge: 1593
Registriert: Di Okt 09, 2018 9:26 am
Hat sich bedankt: 544 Mal
Danksagung erhalten: 625 Mal

#7

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

VG, Sven - TWS 950Q ID:335 & 291, VPN offen, Reboot OK
Benutzeravatar

Eraser
Reactions:
Beiträge: 593
Registriert: So Aug 12, 2018 1:51 pm
Wohnort: Amstetten, Österreich
Hat sich bedankt: 176 Mal
Danksagung erhalten: 253 Mal

#8

Beitrag von Eraser »

Das ZSU-Baustein-Duell hat begonnen... :lol:
mfg
Wolfgang

Timberwolf 2500 #151 / VPN offen / Reboot nach Rücksprache
+ PBM #938

gbglace
Reactions:
Beiträge: 2561
Registriert: So Aug 12, 2018 10:20 am
Hat sich bedankt: 857 Mal
Danksagung erhalten: 1000 Mal

#9

Beitrag von gbglace »

Na dann mal sehen was die Elabnet-Stefans dann noch draus machen können.
Grüße
Göran

-- --Timberwolf 2600 Velvet Red-- -- TWS #225 / VPN aktiv / Reboot OK

paralan
Reactions:
Beiträge: 212
Registriert: Mi Sep 05, 2018 11:49 pm
Hat sich bedankt: 213 Mal
Danksagung erhalten: 99 Mal

#10

Beitrag von paralan »

Hallo Robert,

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

TWS 2600 ID:190; VPN offen; Reboot nach Absprache, da Beschattung über Logikeditor aktiv!
Antworten

Zurück zu „Logikengine & Logik-Editor“