Seite 1 von 1

[V4.0 IP3] Position des Garagentors zeitabhängig

Verfasst: Do Okt 26, 2023 6:11 pm
von coolrunnings
Hallo zusammen,

ich finde endlich so langsam die Zeit meine plugins aus dem Wiregate auf den TWS zu übertragen. Mit den einfachen Dingen wie "sind noch Fenster auf?" oder "Ist irgendwo das Licht an?" bin ich auch schon durch. Jetzt hänge ich aber an der Logik für mein Garagentor.

Mein altes Plugin hatte 3 Trigger:
1. Fahrbefehl Garagentor
2. Endlage oben erreicht
3. Endlage unten erreicht.

Zusätzlich wurde nach dem Durchlauf ein trigger gestartet, der das Plugin nach 30s wieder aufgerufen hat um festzustellen, ob die Endlage erreicht wurde oder das Tor angehalten hat.

Abhängig von den 3 Parametern kann am Ausgang folgendes rauskommen:
0: oben
1: unten
2: fährt
3: steht

Der Ablauf war folgender:

Wenn "Endlage oben erreicht == 1" und "Endlage unten erreicht == 0" dann 0 (oben)
Wenn "Endlage oben erreicht == 0" und "Endlage unten erreicht == 1" dann 1 (unten)
Wenn "Endlage oben erreicht == 0" und "Endlage unten erreicht == 0" und "letzter fahrbefehlt nicht älter als 30s" dann 2 (fährt)
Wenn "Endlage oben erreicht == 0" und "Endlage unten erreicht == 0" und "letzter fahrbefehlt älter als 30s" dann 3 (steht)

Ich vermute mal, dass sich das nur mit einer Custom Logik lösen lässt. Aber ich lass mich auch gerne eines besseren belehren.
Leider stehe ich vollkommen auf dem Schlauch, wie ich das hinbekommen.
Vielleicht hat von euch jemand eine Idee.

Gruß
Michael

Re: Position des Garagentors zeitabhängig

Verfasst: Do Okt 26, 2023 10:52 pm
von blaubaerli
Hallo Michael,

herzlich wilkommen im Forum und Glückwunsch zum ersten Post.

Bitte passe doch noch den Titel deines Threads und deine Signatur entsprechend der Forenreglen (siehe blauer Kasten oben) an.

Ich würde das mit einer Custom-Logik lösen, bin aber selbst immer wieder überrascht, was unsere Logik-Spezis hier so zu zaubern wissen.

Ggf. ist es ja sinnvoll den Quellcode des Plugins hier zu posten…?

Beste Grüße
Jens

Re: Position des Garagentors zeitabhängig

Verfasst: Fr Okt 27, 2023 6:30 am
von Robosoc
Moin Michael,

Deine Frage scheint zumindest im momentanen Stand der Diskussion sehr unabhängig von der Version aber da sich der Funktionsumfang des TWS ja auch entwickelt, ist es einfach auch sinnvoll festzuhalten für welche Version die Antwort gegeben wird und die Forenregel gibt vor, dass dies bitte im Betreff zu stehen hat.

Ich gehe davon aus, dass Du nachlieferst und antworte daher schon einmal.

Ich bin recht fit in custom Logiken arbeite aber selber nur mit diesen, wenn die Aufgabe nicht durch zwei oder drei Standardlogiken gelöst werden kann (oder sie häufigiger eingesetzt werden). Beim Erstellen einer Customlogik nutzt man letzten Endes auch nur Module, die nahezu deckend mit den Standard Modulen sind und somit ist der Gedankenprozess auch sehr nah beieinander.

In deinem Fall würde ich mir als erstes eine Timerlogik wählen, um den Status zu Ermitteln ob das Tor fährt oder steht.

Hierfur (also um den richtigen Timer zu ermitteln) musst du wissen, ob Du auf eine steigende oder fallende Flanke reagierst oder ob einfach jedes True eine Fahrt auslöst, egal ob bereits eine negative Flanke stattgefunden hat.

In einer zweiten Logik ermittelt Du dann bereits den gewünschten Statuswert.
Ich würde es wahrscheinlich mit einer "Freien Formel" lösen (wenn-dann-Formel).

X1>0?3:X2+2*X3
X1 : fährt = 0, steht = 1
X2 : Position oben
X3 : Position unten

Re: Position des Garagentors zeitabhängig

Verfasst: Fr Okt 27, 2023 11:34 am
von coolrunnings
blaubaerli hat geschrieben: Do Okt 26, 2023 10:52 pm Bitte passe doch noch den Titel deines Threads und deine Signatur entsprechend der Forenreglen (siehe blauer Kasten oben) an.
Ist erledigt.
blaubaerli hat geschrieben: Do Okt 26, 2023 10:52 pm Ggf. ist es ja sinnvoll den Quellcode des Plugins hier zu posten…?
Hier mal der Teil meiner Logik, der den Status berechnet hat:

Code: Alles auswählen

sub calc_logik {

	my $val_pos_oben = knx_read($ga_pos_oben,300,"1.001");
	my $val_pos_unten = knx_read($ga_pos_unten,300,"1.001");
	my $val_logik = 4;
	
	if ( $val_pos_oben == 1 && $val_pos_unten == 0 ) {
		$val_logik = 0;
	}
	elsif ( $val_pos_oben == 0 && $val_pos_unten == 1 ) {
		$val_logik = 1;
	}
	elsif ( $val_pos_oben == 0 && $val_pos_unten == 0 ) {
		# check if cycle run
		if ( $plugin_info{$plugname.'_checkRunFinished'} == 1 ) {
			# not finished run within time limit
			$val_logik = 3;
		}
		else {
			$val_logik = 2;
		}
	}
			
	return $val_logik;

}
Robosoc hat geschrieben: Fr Okt 27, 2023 6:30 am In deinem Fall würde ich mir als erstes eine Timerlogik wählen, um den Status zu Ermitteln ob das Tor fährt oder steht.

Hierfur (also um den richtigen Timer zu ermitteln) musst du wissen, ob Du auf eine steigende oder fallende Flanke reagierst oder ob einfach jedes True eine Fahrt auslöst, egal ob bereits eine negative Flanke stattgefunden hat.
Da es nu eine GA für den Fahrbfehl gibt und der entweder 0 oder 1 sein kann, wäre es Timer7 oder Timer8.
Robosoc hat geschrieben: Fr Okt 27, 2023 6:30 am In einer zweiten Logik ermittelt Du dann bereits den gewünschten Statuswert.
Ich würde es wahrscheinlich mit einer "Freien Formel" lösen (wenn-dann-Formel).

X1>0?3:X2+2*X3
X1 : fährt = 0, steht = 1
X2 : Position oben
X3 : Position unten
Du würdest das aber beides in einer Custom Logik unterbringen?

Re: Position des Garagentors zeitabhängig

Verfasst: Fr Okt 27, 2023 12:35 pm
von Robosoc
coolrunnings hat geschrieben: Fr Okt 27, 2023 11:34 am Du würdest das aber beides in einer Custom Logik unterbringen?
Nein, ich würde auf keinen Fall eine Custom Logik daraus machen, sondern zwei einzelne Standardlogiken, die ich sinnvoll benennen und mit Tags versehen würde. Z. B. Tag: Garagentor.

Re: [V4.0 IP3] Position des Garagentors zeitabhängig

Verfasst: So Okt 29, 2023 3:38 pm
von coolrunnings
Robosoc hat geschrieben: Fr Okt 27, 2023 12:35 pm Nein, ich würde auf keinen Fall eine Custom Logik daraus machen, sondern zwei einzelne Standardlogiken, die ich sinnvoll benennen und mit Tags versehen würde. Z. B. Tag: Garagentor.
Gestern hatte ich dann endlich Zeit deine Tipps in die Tat umzusetzen. Es sind insgesamt 4 Logiken nötig gewesen (zumindest brauche ich 4 :) )

Da die Position oben/unten ein boolean ist, musste ich die beiden erstmal in einen Integer umwandeln. Dafür habe ich den Binärmultiplexer genommen.

Der Timer startet mit dem Fahrbefehlt (true oder false). Das ist momentan auch noch die einzige "unschöne" Sache. Ich kann das Tor anhalten, indem ich beim hochfahren, einmal auf runterfahren tippe (true). Wenn das Tor dann nach 30s nicht in der Endlage angekommen ist, wird auch richtigerweise "steht" ausgegeben.
Wenn ich dann aber wieder runterfahren tippe (true), startet der Timer natürlich nicht erneut, weil der Eingang ja immer noch auf true steht. Es wird also keine Fahrt angezeigt. Erst wenn das Tor dann in der Endlage unten angekommen ist, ist der Status wieder korrekt.

Bild

Für die Logik habe ich die freie Formel verwendet, allerdings in etwas abgewandelter Form:

X1>0?2:(X2==1?0:(X3==1?1:3))

Bild

Danke für eure Hilfe. Damit läuft die Logik schon mal wieder. Jetzt begebe ich mich mal an die KWL Steuerung :)