Mehrere Status in ein Variablenprofil packen

Hi,

ich bin gerade dabei mein Webfront etwas zu individualisieren. Das ganze probiere ich im Rahmen meines neuen Garagentors, wovon mir der Motor diverse Status zurück gibt. Das ganze im einfachsten Fall so aus:

Das heißt ich bekomme folgendes mit:

STATUS OPEN Zustand „1“ wenn das Tor komplett geöffnet, sonst „0“ (DPT 1.002).
STATUS CLOSED Zustand „1“ wenn das Tor komplett geschlossen, sonst „0“ (DPT 1.002).
STATUS VENTING Zustand „1“ wenn das Tor die Lüftungsposition angefahren hat, sonst „0“ (DPT 1.002).
STATUS MOVING Zustand „1“ wenn Tor fährt, sonst „0“ (DPT 1.002).
STATUS MOVING UP Zustand „1“ wenn Tor aufwärts fährt (öffnet), sonst „0“ (DPT 1.002).
STATUS MOVING DOWN Zustand „1“ wenn Tor abwärts fährt (schließt), sonst „0“ (DPT 1.002).

So wie ich sie hier beschrieben habe, sind sie aktuell auch in der Webfront visualisiert.

Was ich jedoch gerne hätte wäre:

Dummy: Aktion (auf Bild oben soll das „Tor“ sein)
Instanz: Bewegung -----> Hoch / Stop / Runter / Lüftungsstellung

Dummy: Status (auf Bild oben soll „Torstatus“ sein)
Instanz: Position -----> Lüftungsstellung / Offen / Geschlossen
Instanz: Bewegung -----> Fährt hoch / Fährt runter (Tor fährt bräuchte ich zusätzlich natürlich nicht)

Nun könnte ich mir eine eigene Instanz + Variablenprofil erstellen. Dann bräuchte ich aber nach meinem Verständnis ein Aktionsskript welches mit die Status zyklisch pollt und einließt. Das fände ich jedoch nicht sehr elegant da das Skript den ganzen Tag läuft und sich die Status vielleicht ein bis zwei Mal am Tag ändern.

Da der Motor die Status aktiv sendet sobald sich das Tor in gang setzt muss es da eine andere Möglichkeit geben den Status entgegen zu nehmen und diesen an anzuzeigen.

Kann mir hier jemand helfen? Ich habe die Suche genutzt und bin etwas erstaunt ich dieses Problem noch keine vor mir hatte :confused:

Moin… du musst das Aktionsskript nicht Pollen. Du kannst das gleiche Skript als Aktions- und „Normales“-Skript mit Ereignissen nutzen.
Im Skript unterscheidest dann, ob es durch eine Webfront-Aktion oder durch ein Ereignis ausgelöst wurde.
Daher könntest auf Statusänderungen durch Ereignisse reagieren.
Schau mal in die Doku.
System-Variablen ist das Stichwort und da speziell $_lPS[‚SENDER‘] usw.

Gruß,
Peter

Gesendet von iPhone mit Tapatalk

Hab jetzt nochmal was gezeichnet, falls mein vorheriger Post schwer zu verstehen ist:

Die Status wären sogar besser, wenn hier nicht die vorgefertigten Schilder da stehen sondern vielleicht ein String der mit dem Update des Status ausgegeben wird.

Vielen Dank Peter. Genau auf sowas wollte ich raus.

Ich habe das jetzt mal so probiert, weil ich der Meinung bin das es so gehen könnte.
Ich will wissen welches Ereignis ausgelöst wurde und lese darauf die entsprechende Statusvariable und kopiere diesen Wert in meine eigene Variable mit meinem Variablenprofil.

Ich komme von Beruf her aus der C/C++ Welt mit ein bisschen C# Erfahrung und kenne mich in PHP leider noch nicht so gut aus.

Nun bekomme ich den folgenden Fehler:
Notice: Undefined index: EVENT in /var/lib/symcon/scripts/28080.ips.php on line 3

Verstehe ich nicht, da in der Doku folgendes steht: $_IPS[‚EVENT‘] ID des auslösenden Ereignisses

Sollte doch eigentlich klappen? Kann von dem erfahrenen Personal mal jemand drüber schauen? :o

<?

switch($_IPS['EVENT'])
{
	case 39318: // Ereignis ID: Status fährt hoch
	SetValueInteger(19832 /*[Garage\Torsteuerung\Aktuelle Bewegungsrichtung]*/, GetValueInteger(17522 /*Status fährt hoch*/));
	break;
	
	case 27748: // Ereignis ID: Status fährt runter
	SetValueInteger(19832 /*[Garage\Torsteuerung\Aktuelle Bewegungsrichtung]*/, GetValueInteger(41178 /*[Garage\Garage Status Fährt\Wert]*/));
	break;
	
	case 45970: // Ereignis ID: Status Lüftungsstellung
	SetValueInteger(24975 /*[Garage\Torsteuerung\Aktuelle Postion Torposition]*/, GetValueInteger(22703 /*[Garage\Garage Status Lüftungsstellung\Wert]*/));
	break;

	case 55990: // Ereignis ID: Status Tor geschlossen
	SetValueInteger(24975 /*[Garage\Torsteuerung\Aktuelle Postion Torposition]*/, GetValueInteger(51949 /*[Garage\Garage Status Tor Geschlossen\Wert]*/));
	break;
	
	case 55123: // Ereignis ID: Status Tor geöffnet
	SetValueInteger(24975 /*[Garage\Torsteuerung\Aktuelle Postion Torposition]*/, GetValueInteger(49764 /*[Garage\Garage Status Tor Offen\Wert]*/));
	break;
}

?>

Hier die IDs:

Habe das Problem gefunden: $_IPS[‚EVENT‘] existiert nicht, wenn das Skript von Hand ausgeführt wird. :banghead:

Genau:)

Zum Testen kannst du es aber setzen:D


if ($_IPS['SENDER'] == Execute){
   $_IPS['EVENT'] = 12345;
}

....

manchmal ganz nützlich.

Gruß

Burkhard

Danke für den Tipp :wink:

Kann mir jemand erklären wie ich es hinbekomme, dass anstatt der drei Buttons - Hoch Gestoppt Runter nur ein String ausgegeben wird und zwar nur der der aktuell gültig ist bzw. der stehen bleibt der zuletzt gültig war?

Variablenprofile verwenden

Ich bin dabei, mir ein Tool für die Visualisierungen zu schreiben; das wird aber immer bombastischer :banghead:

Wenn Du mit dem obigen Beispiel nicht klar kommst, könnte ich Dir Teile davon posten. Ist dann aber ein Skript, das die Profile anlegt, keine direkten Einstellungen.

Viele Grüße
Harald

Ich verstehe nicht ganz… ich hab das doch genau so gemacht wie in deinem Link. Bei mir werden jedoch immer alle möglichen angezeigt und die aktuell zutreffende leuchtet auf.

Wenn Du nur konfiguriert hast, ist die Darstellung unbestimmt. Du mußt den Wert der Variable, der das Profil zugeordnet ist, auf einen gültigen Wert setzen, z.B. so:

        SetValue ($ObjID, $integerWert);       // Gleich Tasten-Feld betätigen

Das habe ich doch gemacht. Ist den vorherigen Posts alles aufgezeigt. Ich hab ein Variablenprofil und ein Aktionsskripz erstellt. Funktioniert auch alles bis auf die von mir bemängelte Anzeige.

Habe das Bild von einem anderen Thread geklaut. Aber so wie es auf dem Bild unter „Zustand“ erscheint, so hätte ich es gerne. Ohne diese Buttons.

Wenn du nur Anzeigen willst, dann musst du das Aktionscript weglassen.

Gruß

Burkhard

Gesendet von meinem iPad mit Tapatalk

Das brauche ich doch um die Zustände: Offen Geschlossen Lüftungsstellung usw. Zu definieren. So langsam verstehe ich gar nichts mehr :smiley:

Anhand Deiner Postings kann ich nicht nachprüfen, ob die Werte, die eingestellt sind, im gültigen Bereich sind, auch nicht ob das Profil richtig erstellt ist.

Verwende doch mal zur Erstellung eines Test-Profils folgendes als Auszug aus meinem „Bombastic-Skript“:


<?php

    $ObVgrp = 'IP-Geräte';      // aktuelle Gruppe, detaillierte Einstellungen s.u.
    $ObV_Profile = 'TestProfil';  // Name des Profils der $ObV_Namen (wird immer neu erstellt).
//...

// Individuelle Daten, reichhaltig kommentiert, legen die Default-Werte fest (für den Fall, dass sie später nicht definiert werden), deshalb nicht verändern!
// Dieses Basis-Beispiel legt alle erforderlichen Werte fest, 
// die Konfigurationen im weiteren Abschnitt "Archiv und idividuellen Einstellungen" überschreiben diese oder übernehmen sie
//...
// B.1b Definition der Status (Status: lateinisch für „Zustand“, „Stellung“ oder „Lage“; Plural: Status), bzw. engl.: State, häufig anzutreffen mit falschem lateinischen Plural Stati (entlehnt der o-Deklination) statt lat. statis (richtig als Plural der u-Deklination)
$St_Namen = array ('', 'Anwesend', 'Nachtruhe', 'Unterwegs', 'Urlaub');     // Namen der möglichen Status, die Reihenfolge bleibt horizontal so
$St_Value = 0;          // 0 für linearen Wertebereich oder array mit den Werten der möglichen Status in der Reihenfolge der $St_Namen, IPS sortiert die $St_Namen leider in der Reihenfolge von $St_Value
$St_Color = 0;          // 0 oder array mit den Farben für die möglichen Status in der Reihenfolge der $St_Namen
$St_Icons = '';         // '' oder array mit den Icons für die möglichen Status in der Reihenfolge der $St_Namen
$St_Param = 0;          // 0 oder array mit den Profil-Parametern $Name = '', $Start = 0, $Step = 0, $Stop = 0, $Prefix = "", $Suffix = "" (nur gültig, wenn $St_Value = 0)
$St_NoAkt = 0;          // =1: Änderungen im WebFront sind eigentlich garnicht erlaubt und führen zu keiner Aktion der Anzeige weil nur als Anzeige vorgesehen,nur für ganze Gruppe einstellbar
//...

switch ($ObVgrp) {
    case 'IP-Geräte':
//...
        $St_Namen = array ('AUS', 'EIN');     // Namen der möglichen Status
        $St_Value = array (0, 1);       // 0 oder array mit den Werten der möglichen Status
        $St_Color = array (0xFF0000, 0x00FF00);       // Rot/Grün
        $St_Param = array ('', 0, 1, 0, '', '');       // array mit den Profil-Parametern $Name = '', $Start = 0, $Step = 0, $Stop = 0, $Prefix = "", $Suffix = "" (nur gültig, wenn $St_Value = 0)
        $St_NoAkt = 1;       // 1= Änderungen im WebFront sind nicht erlaubt und führen zu keiner Aktion
        break;


    case 'Elektro_Schalter':
 //...
        $St_Namen = array ('EIN', 'AUS');
        $St_Color = array (0xFF0000, 0x00FF00,);     // Rot/Grün
        break;

    default:        // nichts gefunden, also wird nichts angelegt 
 
}

//...


// ------------------------    
// I.6a Profil wird immer neu anlegt; nix mit if (!(IPS_VariableProfileExists($ObV_Profile)))
    @IPS_DeleteVariableProfile ($ObV_Profile);
    if (is_array ($St_Param)) {
        if ($St_Param[0] == '') {
            CreateProfile_Count ($ObV_Profile, $St_Param[1], $St_Param[2], $St_Param[3], $St_Param[4], $St_Param[5]);
        } else {
            $ObV_Profile = $St_Param[0];
        }
    } else {
        IPS_CreateVariableProfile ($ObV_Profile, 1);
    }

// I.6b 
    if (is_array ($St_Namen)) {
        foreach ($St_Namen as $i => $IdxName) {
            $Icon = '';
            if (is_array ($St_Icons))
                $Icon = $St_Icons[$i];
            $Farbe = 0;
            if (is_array ($St_Color))
                $Farbe = $St_Color[$i];
            $St_Wert = $i;
            if (is_array ($St_Value))      // $St_Value ist 0 oder array mit den Werten der möglichen Status
                $St_Wert = $St_Value[$i];
            if ($St_Namen[$i] == "") {
                @IPS_SetVariableProfileAssociation ($ObV_Profile, $St_Wert, '', '', $Farbe);  // Wenn Name und Icon leer sind, wird die Assoziation zum angegebenen Wert gelöscht
            } else {
                IPS_SetVariableProfileAssociation ($ObV_Profile, $St_Wert, $St_Namen[$i], $Icon, $Farbe);
            }
        }
        if (is_array ($St_Value))      // $St_Value ist 0 oder array mit den Werten der möglichen Status
            $St_Namen = array_combine ($St_Value, $St_Namen);    // Bereite Werte-Liste auf
        if ($St_Namen === FALSE)
            die ("Abbruch: Anzahl der Werte der möglichen Status falsch !!");
    } else {
        die ("Abbruch: Namen der möglichen Status müssen als Array angelegt werden !!");
    }

//
//---- Funktionen

/** Quelle IPSInstaller: Anlegen eines Integer Profils */
function CreateProfile_Count ($Name, $Start = 0, $Step = 0, $Stop = 0, $Prefix = "", $Suffix = "", $Icon = "") {
 
    @IPS_CreateVariableProfile ($Name, 1);
    IPS_SetVariableProfileText ($Name, $Prefix, $Suffix);
    IPS_SetVariableProfileValues ($Name, $Start, $Stop, $Step);
    IPS_SetVariableProfileDigits ($Name, 0);
    IPS_SetVariableProfileIcon ($Name, $Icon);

        echo 'Created VariableProfile ' . $Name . "
";
}

// ------------------ Ende
?>


Beim Setzen von $ObVgrp = ‚IP-Geräte‘ wird ein Button EIN/AUS auf einem Fleck erzeugt.
Bei $ObVgrp = ‚Elektro_Schalter‘ sitzen die Schaltfelder nebeneinander.

Bitte Meldung, falls irgend ein Fehler bei dem Skript-Auszug auftritt (vielleicht hab ich eine Funktion vergessen). (Uuups, ich hatte das PHP-Ende vergessen)

Viele Grüsse
Harald

Das soll jetzt nicht undankbar rüber kommen aber das ist doch nicht das was ich möchte…

Experimentier’ doch einfach mit den Farben für die möglichen Status:


//...
    case 'Kipptor':
     //...
        $St_Param = array ('', 0, 1, 0, '', '');       // 0 oder array mit den Profil-Parametern $Name = '', $Start = 0, $Step = 0, $Stop = 0, $Prefix = "", $Suffix = "" (nur gültig, wenn $St_Value = 0)
        $St_Namen = array ('ZU', 'Geht auf', 'Gestört', 'Geht zu', 'AUF');     // Namen der möglichen Status
        $St_Color = 0;       // Farben für die möglichen Status
        break;


Dann hast Du es genau "wie es auf dem Bild unter „Zustand“ ":

Name der Variable steht links neben dem Namen des Status in gleicher Farbe (weiss auf schwarz)

Wieso soll ich mit PHP Code spielen, wenn dein Vorredner der Meinung ist, dass ich das Aktionsskript weglassen soll.

Ich hab jetzt die Anzeige im Webfront, so wie ich sie haben will. Mir ist allerdings nicht klar wie ich meine Variablen „Aktuelle Torposition“ und „Aktuelle Bewegungsrichtung“ ohne Aktionsskript anpassen soll bzw. wie ich den entsprechenden Text im Webfront ausgeben kann? Meiner Meinung nach brauche ich das bei beiden Status. Ich muss es aber weglassen um auf meine gewünschte Optik zu kommen?

Hier das Variablenprofil und die zugehörigen Werte: