Getrennte Rückmeldungen und Ansteuerung vom Tor kombinieren

Hallo,
Ich möchte um Hilfe bitten, ich habe ein ähnliches Problem. Ich habe ein Tor, das auch über eine Statusrückmeldung verfügt.
Ich habe folgende Ein- und Ausgänge:
Ausgaben:
1- Eröffnung
2-Abschluss

Eingänge:
3-Offener Status (ja-nein)
4-geschlossener Zustand (ja-nein)

Ich möchte hierfür einen Button erstellen, der Öffnen/Schließen und die jeweilige Position anzeigt.

Kommt das Signal schon zu Symcon? Sprich: Ist der Ausgang des Tores schon mit einem Sensor oder Kontakt verbunden (z.B. digital Input), den man in Symcon auslesen kann?
Das ist der erste Schritt. Damit geht dann in Symcon schon fast alles automatisch. Höchstens eine Variable (boolean) muss dann noch für jeden Ausgang des Tores angelegt werden.

ja, in Symcon ist schon alles enthalten!

Wenn alles schon in Symcon da ist, dann müsste es doch schon Variablen geben?

Wenn ich es richtig verstehe, möchtest du einen Button erstellen, mit dem du das Tor öffnen/schließen kannst und ein Button soll dir den aktuell Zustand (offen/geschlossen) anzeigen?
Dann müsstest du den vorhandenen Variablen nur noch das Profil ~switch geben und ein Aktionsskript (die für den Botton öffnen/schließen).

Ja, vier Stück, wenn ich seinen ersten Beitrag richtig deute,

Nicht zwei, sondern einen :slight_smile:
Also Status und Steuerung in einem.

Kochrezept:

  • Variable Typ bool anlegen, passendes Profil / Darstellung auswählen oder erstellen.
  • Aktionsskript bei der erstellen bool Variable erstellen:
$myState = 45645; // selbst angelegte bool Variable 
if ($_IPS['SENDER']=='Variable'){ // ausgelöstes Ereigniss
    if ($_IPS['VARIABLE'] == 11111) // ID für Variable Zustand auf
    {
        SetValue($myState, true);
    }
    if ($_IPS['VARIABLE'] == 22222) // ID für Variable Zustand zu
    {
        SetValue($myState, false);
    }
} else {
    if ($_IPS['VALUE'])
    {
        RequestAction(33333 ,true); // ID der Variable Tor öffnen 
    } else {
        RequestAction(44444 ,true); // ID der Variable Tor schließen 
    }
}
  • Ausgelöstes Ereignis erstellen. Auslösende Variable 3-Offener Status (ja-nein) bei bestimmter. Wert ja. Ziel: Das Aktionsksript
  • Ausgelöstes Ereignis erstellen. Auslösende Variable 4-geschlossener Status (ja-nein) bei bestimmter. Wert ja. Ziel: Das Aktionsksript

Leider kann man bei den ausgelösten Ereignissen keine Variable setzen, wenn diese eine Aktionsskript hat, sondern nur schalten (@Dr.Niels hier braucht man also das Setzen und nicht das schalten :wink: ).
Darum klappt folgendes NICHT:

  • Variable Typ bool anlegen, passendes Profil / Darstellung auswählen oder erstellen.
  • Ausgelöstes Ereignis erstellen. Auslösende Variable 3-Offener Status (ja-nein) bei bestimmter. Wert ja. Ziel: Die eben angelegte Variable und setzen auf Wert (offen).
  • Ausgelöstes Ereignis erstellen. Auslösende Variable 4-geschlossener Status (ja-nein) bei bestimmter. Wert ja. Ziel: Die eben angelegte Variable und setzen auf Wert (geschlossen).
  • Aktionsskript bei der erstellen bool Variable erstellen:
if ($_IPS['VALUE'])
{
    RequestAction(12345 ,true); // Ausgang 1 schalten
} else {
    RequestAction(54321 ,true); // Ausgang 2 schalten
}

Ja, das denke ich.
Wenn sich das Tor bewegt und die Endlage „offen“ noch nicht erreicht hat, darf weder die Taste „offener Zustand“ noch die Taste „geschlossener Zustand“ „leuchten“.

Das ist natürlich mit einer einer bool Variable unmöglich.
Dann musst du eine Integer Variable benutzen. Aber auch hier solltest du dann wirklich drei Zustände abbilden. Offen / fährt / geschlossen.
Michael

Danke, das ist ok, allerdings ändert sich der Wert nicht (je nachdem ob es im geschlossenen oder offenen Zustand ist, was man ja auch aus anderen Variablen abfragen könnte)

Das ist die einzig elegante Lösung für alles, was in einer idealen Welt vielleicht irgendwie binär wäre (auf/zu) aber in der Realität auch auf der Kippe stehen kann. Alle theoretisch möglichen Variablenzustände müssen einbezogen bzw. abgebildet werden. Auch die der Aktoren. Wenn du bei diesen nicht direkt sehen kannst ob sie fahren, weil sie nur über kurze Impulse angesteuert werden, dann muss die Fahrtzeit gemessen und einbezogen werden: Ist ein Motor in den letzten n Sekunden angetriggert worden, wird davon ausgegangen dass er gerade fährt. Und ein vernünftig konstruierter Antrieb wird natürlich technisch nur in die zuletzt getriggerte Richtung fahren können und nicht gegen sich selbst arbeiten.

Und natürlich auch einbeziehen: Störungsmeldungen. Verbindungsprobleme mit Aktor/Sensor.

Am Ende wirst du eine Integer-Variable haben mit einer Vielzahl an Zuständen und die Komplexität wird vielleicht erstmal nervig sein. Aber wenn du mal irgendwann wirklich ein Problem mit dem Tor hast und nicht direkt daneben stehst wirst du froh sein, das ganze vernünftig und nicht halbherzig eingebunden zu haben!

Ich nutze die Ausgänge tatsächlich, indem ich sie 1 Sekunde lang drücke.
Das Tor verfügt über zwei separate Relais:

  1. Eröffnung 2. Schließung
    Auch eingangsseitig sind zwei Relais vorhanden:
    1 Relais: Ist es geschlossen, ist das Relais aktiviert, ist es offen, ist das Relais deaktiviert.
    2 Relais: Wenn das Tor vollständig geöffnet ist, wird das Relais aktiviert, wenn es beginnt, sich zu schließen, wird das Relais deaktiviert.
    Ich füge auch noch ein Bild bei:

Mein Problem ist, dass ich die Eingabewerte für das neu erstellte Profil nicht kenne, egal ob ich das mit true-false mache oder mit einer Integervariable.

Dies definierst du selbst. Das Variablenprofil für die Integer-Variable, die später den Torzustand beschreiben soll, bekommt von dir Assoziationen zugewiesen. Also jeweils eine Zahl, die einem bestimmten Gesamtzustand entspricht. Beispiel:

  • -1 = Fehler (Ungültiger Zustand, bspw. beide Kontakte true, oder auch Steuerinterface nicht erreichbar…)
  • 0 = Tor ist geschlossen (Motoren fahren nicht, Geschlossen==true)
  • 1 = Tor wird geöffnet (Motor öffnen fährt, Offen noch false)
  • 2 = Tor ist geöffnet (Motoren fahren nicht, Offen==true)
  • 3 = Tor wird geschlossen (Motor schließen fährt, Geschlossen noch false)
  • 4 = Torzustand unbekannt (Motoren fahren nicht, Geschlossen und Offen beide false)

Geht natürlich immer noch detaillierter. Beispielsweise kannst du unterschiedliche Fehler unterschiedlich anzeigen. Bei mir hat sich durchgesetzt, dass ich für Fehlerzustände negative Zahlen nehme, für den „häufigsten“ die 0, alles andere dann aufwärts gezählt.

Das ist aber alles Geschmackssache. Und fürs Ansteuern des Tors nimmst du dann eine andere Variable, die wiederum Assoziationen hat wie Auf/Stop/Zu. Bei mir hänge ich diese immer unterhalb der Zustandsvariable, so wird das im Webfront zusammenhängend angezeigt.

Ja, danke, das ist genau das, was ich tun möchte, aber mir sind nur 3 „Ganzzahl“-Variablen eingefallen:
1- Tor ist geschlossen (17310==false, 41529==true)
2 - Tor in Bewegung (17310==false, 41529==false)
3 - Tor ist offen (17310==true, 41529==false)
Obwohl ich nicht sicher bin, ob ich Punkt 2 integrieren würde.
So sieht mein Code derzeit aus:
Ja, danke, das ist genau das, was ich tun möchte, aber mir sind nur 3 „Ganzzahl“-Variablen eingefallen:
1- Tor ist geschlossen (17310==false, 41529==true)
2 - Tor in Bewegung (17310==false, 41529==false)
3 - Tor ist offen (17310==true, 41529==false)
Obwohl ich nicht sicher bin, ob ich Punkt 2 integrieren würde.
So sieht mein Code derzeit aus:

<?php $myState = 59819; if ($_IPS['SENDER']=='Variable'){ if ($_IPS['VARIABLE'] == 17310) { SetValueInteger($myState, 1); } if ($_IPS['VARIABLE'] == 41529) { SetValueInteger($myState, 3); } } else { if ($_IPS['VALUE']) { RequestAction(35960 ,true); } else { RequestAction(17477 ,true); } } ?>

Ich würde das mal etwas anders strukturieren glaube ich:

  • zunächst alle Zustände per GetValue holen und in Variablen schreiben, bspw. $contact_closed = GetValue(17310) usw.
  • per if alle zu erwartenden Zustände durchgehen und dann einen „Statuscode“ zuweisen also bspw. if($contact_closed && !$motor_closing && !$motor_opening) { $result = 1; } und dann jeweils mit else if() alle weiteren „definierten“ Status.
  • ungültige Zustände per else abfangen
  • am Ende das den resultierenden Statuscode in die Variable schreiben.

Welches Ereignis das Skript gerade aufruft musst du dann gar nicht unterscheiden.

Und wie gesagt, wenn du irgendwo sehen kannst ob bspw der Relaisaktor/das IO-Interface, welches das Tor ansteuert bzw. die Kontakte abfragt, auch wirklich erreichbar ist, denn würde ich dies sogar noch vor den sonstigen if-Fällen einmal abfangen. Denn wenn das Interface tot ist oder die Verbindung gestört dann weißt du nicht wie der Zustand ist und solltest es auch nicht so aussehen lassen.

Dies sind meine Erfahrungen aus vielen Jahren Einbindungen von Türen, Toren, Fenstern und anderen Geräten. Je weiter du von deinem Tor weg bist desto wichtiger ist es dass du wirklich siehst, was da abgeht und nicht bloß hoffst dass es funktioniert. :wink:

1 „Gefällt mir“