Touchpanel-fähige Applikationen

Hallo,

ich habe mich jetzt ein paar Monate lang rumgeschlagen damit, wie ich am besten so viel wie möglich Funktionen mit so wenig viel möglich Aufwand in ein Projekt reinpacken kann.
Ich habe es aufgegeben, zuviel „Design“ reinzupacken und so habe ich mich vor allen der Funktionalität zugeschrieben.
Es müssen vor allem Wurschtelfinger auf den 8" Schirm passen, ohne direkt 5 Tasten miteinander zu drücken (man denke nur an die Casio Uhren mit Rechenmaschine )
Was ich vor allen zeigen will ist, wie man Tabs effektiv einsetzen kann, ohne die Tabs selbst zu steuern, sondern über Variablen in IPS selbst, die man dann mit den Tabs verknüpft. Diese werden dann über Skripts gesteuert und über Buttons getriggert. Klingt barbarisch, ist es aber nicht.
Den Finetuning am spartanischen Design werde ich später vornehmen.
Der Schwerpunkt hier liegt mehr darauf, Beispiele zu geben, wie man in ein 8" Display Funktionalität reinbringt.

Das erst Beispiel: Das Hauptmenü. Keine Tabs zu sehen, dennoch vollgepackt damit. Alle Buttons triggern das gleiche Skript, dass dann den ensprechenden Button am IPSSYMID erkennt und darauf hin in den entsprechenden Tab springt. Es gibt auch noch viel zu tun. Ich bin bei weitem ncht fertig.

Das Menu, das alle FHT und FS20 Funktionen beinhaltet, jeweils für einen Raum. Wiederum Tabs IN Tabs, wobei auf jeder Seite immer wieder die Sprungfunktion (Button) zur höher gelegenen Ebene gegeben ist.

Linke Seite FHT Funktionen: Alle Pfeile sind auch Tasten, mit denen man den neuen gewünschten Wert (wird innerhalb der Quadrat-Buttons angezeigt) wählen kann und einfach per ‚Transmit‘ (grossen Button) einfach an den FHT übermitteln kann
Das Pulldown Menü kann man so gross machen, indem man einfach die Schriftgrösse verstellt.
(Anmerkung: Hier hätte ich mir anders farbige Balken gewünscht)

Rechte Seite das FS20 Menü: Rollädensteuerung rauf/runter. Die Lampen haben jeweils Pfeiltasten wenn es Dimmer sind, und Ein/Aus Tasten wenn konventioneller Schalter. Alle Tasten und LED’s sind eben extra gross wegen dem Wurschtelfinger-Faktor.
Die ‚0‘ neben den Tasten geben den Dimmer Wert zurück.
Alle Elemente reagieren natürlich auch, wenn ein Taster im Raum gedrückt wird, so dass ich immer sehen kann, wo Licht brennt oder ein anderer Verbraucher an ist. Das war schon ein grosser Aufwand, alle Schalter mit in IPS zu übernehmen.

Das ganze Program in IPS ist auch total modular geschrieben worden (kleine Gewohnheiten meiner industriellen SPS Programierung an grossen Anlagen), sodass wenn ein Raum hinzukommt, ich einfach nur die jeweiligen Module beifüge, die Globalen Variablen für den Raum anpasse, und schon läuft es wieder.

Hier dann noch meine Wetterstation. Regen fehlt noch, da noch keine Zeit gehabt:

Das mit dem Mond ist kein schwarzer Kasten, sondern das Photo ändert jeden Tag, je nachdem der Mond sichtbar wird. Im Moment eben nur die untere linke Ecke.

Für alle anderen Rubriken, gleiche Vorgehensweise. Immer Tabs, nur mit einem simplen Trick unsichtbar gemacht (so einfach, dass es mir lange nicht einfallen war)

Ich würde mir gerne welche Kommentare anhören, sicherlich auch Verbesserungsvorschläge.
Nochmals, Designtechnisch dürfte es vielen nicht gefallen, da ich Funktionalität vorgezogen habe um das Projekt nicht zuviel ‚aufzublasen‘. Hier und da werde ich vielleicht noch was verändern, aber das wars dann auch !

mfG Franz

Hallo Franz,

wie kann ich denn per Script ein Tab anspringen?

Doc

Hier ist die Vorgehensweise für ein einfaches Beispiel:

[ul]

  1. Eine Integer Variable erstellen mit z.B. dem Namen TAB-CONTROL
  2. Ein Skript erstellen, dass du auch z.B. TAB-CONTROL nennst
  3. Im Designer nun ein Button, kann aber auch ein Bildchen sein, erstellen. Dieses Objekt muss du ‚OnClick‘ verlinken mit dem Skript TAB-CONTROL
  4. Weiterhin muss du dem Objekt ein IPSSYMID vergeben. Einfaches Beispiel wäre „JUMP_TAB_2“
  5. Weiterhin musst du ein Tab-Form im Designer erstellen mit mindestens 2 Tabs, wobei dieser Button sich eben auf dem 1. Tab befindet. (Tabs fangen immer mit 0 an, also 0,1,2,3,…) Dann muss du in den Eigenschaften dieses Tab-Form mit der Tab-Index und OnChange Funktion mit der TAB-CONTROl Variable verknüpfen.
  6. Im Skript muss du dann die Abfrage eben machen, dass wenn eben diese IPS_COMPONENT ‚JUMP_TAB_2‘ auftritt, eben die Integer Variable TAB-CONTROL auf den Wert ‚1‘ gesetzt wird.( Was ja Tab 2 dann wäre)[/ul]

Hier ein Auszug aus einem Meiner Skripte:

if ($IPS_SENDER == "Designer")
    {
     switch ($IPS_COMPONENT)
             {
              case "CONTROL_PARENT"    : SetValueInteger("TAB_ROOM_CONTROL", 1);
                                         break;

              case "CONTROL_KID3"      : SetValueInteger("TAB_ROOM_CONTROL", 2);
                                         break;

              case "CONTROL_COMP"      : SetValueInteger("TAB_ROOM_CONTROL", 3);
                                         break;
                                         
              case "CONTROL_BATH1"     : SetValueInteger("TAB_ROOM_CONTROL", 4);
                                         break;
                                         
              case "CONTROL_BATH2"     : SetValueInteger("TAB_ROOM_CONTROL", 5);
                                         break;
                                         
              case "CONTROL_KID1"      : SetValueInteger("TAB_ROOM_CONTROL", 6);
                                         break;

.....

Ich hoffe, ich konnte mich genügend ausdrücken, da ich das jetzt in aller schnelle geschrieben habe !

mfG franz

Hi Guy…

Bei meinem Weibchen haste grad echt Eindruck hinterlassen. Schöne Arbeit. Danke fürs posten.

Toni

Das freut mich zu hören. Meine Frau mag dieses Projekt auch am liebsten, da übersichtlich und eben funktionell. Alles andere zuvor, was ich gemacht habe wär eher ‚Männer-Sache‘ .

Nur, wie du sehen konntest, das Haupt-Menü ist noch recht leer. Es werden noch Sachen hinzukommen, wie Email, Bewegungsmelder-Alarm, Gas/Rauch Melder Warnungen, ‚Raum Berichte‘, wie wann wurde Temperatur verändert, manuel, oder auto, Lampe wann angeschaltet, usw. Klingt ein wenig wie ‚Big Brother‘ , nee?

…naja, mal sehen. Mit diesem Prinzip mit der Tab-Steuerung sind (quasi) keine Grenzen gesetzt!

mfG Franz

…Hut ab!!!..

wenn es bei mir erst soweit ist…:cool:

Hallo Franz,

danke für die ausführliche Anleitung. Bis Punkt 5 war das ja soweit klar, das man den TabIndex per Script ändern kann war mir jedoch neu.
Man lernt halt nie aus.

Danke und Gruß,
Doc

@guyabano
Sag mir doch mal bitte wie du die Tabs unsichtbar gemacht hast.

Einfach ein Rechteck drüber legen, das die gleiche Farbe hat wie der Hintergrund.
Ausserdem müssen deine Tabs auf 1x1 Grösse stehen, sonst sind sie nicht klein genug

mfG Franz

Super, danke.

Gruß,
Björn

Hallo guyabano,

woher, bzw. wie hast Du die Bargraphen erstellt. Sind das vorgefertigte Teile?

Gruß
Fabian

<nachobenschieb>

Hi guyabano, hast die Frage sicherlich übersehen… :smiley:

Gruß
Fabian

Hallo,
habe nach Anleitung von „guyabano“
die Einrichtung für TAB’s über Button steuern durchgeführt.

Soweit so gut. Ich denke bis zum Skript habe ich alles richtig gemacht, da ich über die manuelle Variablen-Verstellung das Fenster (TAB) sich ändert.
Selbst über Timer wechselt das TAB.

Nur beim Betätigen des Buttons im Designer tut sich nichts.
Beim Scripausführen (Execute) kommt eine Fehlermeldung.

(<br />
<b>Parse error</b>: parse error, unexpected $end in <b>C:\Programme\IP-Symcon\scripts.currentscript</b> on line <b>17</b><br />)

Bitte nich schmunzeln;)
Mit php habe ich nicht viel am Hut.

Mein Script sieht so aus:

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : TAB-Control.ips.php
Trigger  : 
Interval : 
*/
if ($IPS_SENDER == "Designer")
    {
     switch ($IPS_COMPONENT)
             {
              case "Bad"    : SetValueInteger("Test", 1);
                                         break;
?>

Hoffe die Angaben reichen aus um vieleicht mir eine kleine Hilfe zu geben was an dem Skript fehlt oder falsch ist.
Ist natürlich nur ein Anfang des Skripts das noch von mir erweitert wird.

Viele Grüße
dinin

Anleitung von guyabano:

  1. Eine Integer Variable erstellen mit z.B. dem Namen TAB-CONTROL
  2. Ein Skript erstellen, dass du auch z.B. TAB-CONTROL nennst
  3. Im Designer nun ein Button, kann aber auch ein Bildchen sein, erstellen. Dieses Objekt muss du ‚OnClick‘ verlinken mit dem Skript TAB-CONTROL
  4. Weiterhin muss du dem Objekt ein IPSSYMID vergeben. Einfaches Beispiel wäre „JUMP_TAB_2“
  5. Weiterhin musst du ein Tab-Form im Designer erstellen mit mindestens 2 Tabs, wobei dieser Button sich eben auf dem 1. Tab befindet. (Tabs fangen immer mit 0 an, also 0,1,2,3,…) Dann muss du in den Eigenschaften dieses Tab-Form mit der Tab-Index und OnChange Funktion mit der TAB-CONTROl Variable verknüpfen.
  6. Im Skript muss du dann die Abfrage eben machen, dass wenn eben diese IPS_COMPONENT ‚JUMP_TAB_2‘ auftritt, eben die Integer Variable TAB-CONTROL auf den Wert ‚1‘ gesetzt wird.( Was ja Tab 2 dann wäre)
if ($IPS_SENDER == "Designer")
    {
     switch ($IPS_COMPONENT)
             {
              case "CONTROL_PARENT"    : SetValueInteger("TAB_ROOM_CONTROL", 1);
                                         break;

              case "CONTROL_KID3"      : SetValueInteger("TAB_ROOM_CONTROL", 2);
                                         break;

              case "CONTROL_COMP"      : SetValueInteger("TAB_ROOM_CONTROL", 3);
                                         break;
                                         
              case "CONTROL_BATH1"     : SetValueInteger("TAB_ROOM_CONTROL", 4);
                                         break;
                                         
              case "CONTROL_BATH2"     : SetValueInteger("TAB_ROOM_CONTROL", 5);
                                         break;
                                         
              case "CONTROL_KID1"      : SetValueInteger("TAB_ROOM_CONTROL", 6);
                                         break;

Bin zwar nicht der Fachmann, aber wenn ich das richtig sehe fehlen die }} Klammern am ende.

Hallo
guyabano, oder andere,

hier hackt es bei mir noch.

Bitte um Hilfe:confused:

  1. Im Skript muss du dann die Abfrage eben machen, dass wenn eben diese IPS_COMPONENT ‚JUMP_TAB_2‘ auftritt, eben die Integer Variable TAB-CONTROL auf den Wert ‚1‘ gesetzt wird.( Was ja Tab 2 dann wäre)

PHP-Code:

if ($IPS_SENDER == "Designer")
    {
     switch ($IPS_COMPONENT)
             {
              case "CONTROL_PARENT"    : SetValueInteger("TAB_ROOM_CONTROL", 1);
                                         break;

              case "CONTROL_KID3"      : SetValueInteger("TAB_ROOM_CONTROL", 2);
                                         break;

              case "CONTROL_COMP"      : SetValueInteger("TAB_ROOM_CONTROL", 3);
                                         break;
                                         
              case "CONTROL_BATH1"     : SetValueInteger("TAB_ROOM_CONTROL", 4);
                                         break;
                                         
              case "CONTROL_BATH2"     : SetValueInteger("TAB_ROOM_CONTROL", 5);
                                         break;
                                         
              case "CONTROL_KID1"      : SetValueInteger("TAB_ROOM_CONTROL", 6);
                                    break;

Habe mal mein Projekt mit angehangen.

Vieleicht hilft’s was.

Grüße
dinin

Beitrag bearbeiten/löschen

Hallo,

du musst im Designer im Objekt-Fenster den jeweiligen Switch-Punkt vom Skript eingeben. Das geschieht unter IPSYMID. Das hast du ja soweit gemacht, wie ich sehe.
Nur, dass musst du auch so im Skript eingeben,

z.b.

switch ($IPS_COMPONENT)
{
case ‚Home‘ : SetValueInteger(„Variable“, 1);
break;

        case 'Bad'   : SetValueInteger("Variable", 2);
                           break;

        usw...

Natürlich muss du das TabControl-Feld auch mit dieser Variable verknüpfen, damit diese auch auf die Änderung dieser Variable reagiert.

Anhang: Au ja, du darfst am Ende die } nicht vergesessen, sonst wird es nicht gehen !

mfG Franz

Hallo guyabno,

sorry das ich mich so dus… anstelle, aber irgendwie fällt der Groschen bzw Cent nicht:eek:

Nach mehrmaligen testen mache ich wahrscheinlich immer den selben Fehler.

Zu deiner Anmerkung hier:

switch ($IPS_COMPONENT)
{
case 'Home' : SetValueInteger("Variable", 1);
case ist meine Button Bez.        "VARIABLE "ist das meine Tab Bezeichnung, oder muss ich die in IP noch anlegen
break; 

case 'Bad' : SetValueInteger("Variable", 2);
break;

Komisch das bei einer manuellen Ineger verstellung das Fenster anspricht.

Es schein so als ob keine Funktion auf das Button betätigen erfolgt.

Muss im Bild Anhang noch eine Einstellung erfolgen?

Sorry nochmal wenn ich nerve;)

Gruß
dinin

Ich beziehe mich jetzt auf dein Bild:

Der Ansatz im Skript ist ok. Nur du musst jetzt die ‚Properties‘ vom TabSheet im Designer jetzt anpassen. Du musst da ‚OnChange‘ Variable ‚Test‘ eingeben, sonst wird der Designer ja nicht auf die Variable ‚Test‘ hin ändern, oder zumindest die Seite, die du haben wolltest, anzeigen !

Beispiel:

In deinem Designer Fenster, muss du erst auf dein Reiter-Feld klikken (2), dann im Objektinspector (1) musst du bei IPSYMCON eben angeben, mit was du die Reiter (Tabsheets) steuern willst. Hier musst du ihm sagen: 'Reagiere auf ein Wechsel der Variable ‚Test‘. Also im Feld die Variable ‚Test‘ auswählen (3), und auf ‚OnChange‘ belassen.

Dann müsste es eigentlich klappen !

mfG Franz

Suppi!

Bin jetzt einen ganzen Schritt weiter;)

Habe nun ein Pagecontrol mit zwei Tabs (Home, Bad) zum Testen erstellt.

Auf dem Home Tab habe ich ein „Bad“ Button der mich auch auf den „Bad“ Tab bringt. Soweit, so gewollt.

Nun möchte ich über ein „Home“ Button wieder zurück auf das „Home“ Tab.

Geht aber noch nicht.

Bei deiner Erkärung hast du mir folgendes vermittelt:

Nur du musst jetzt die ‚Properties‘ vom TabSheet im Designer jetzt anpassen. Du musst da ‚OnChange‘ Variable ‚Test‘ eingeben, sonst wird der Designer ja nicht auf die Variable ‚Test‘ hin ändern, oder zumindest die Seite, die du haben wolltest, anzeigen !

dem TabSheet kann ich aber keine „Properties“ zuweißen. Es ist leer und kann nichts eintragen.

Den Sinn verstehe ich schon, das man die „Sprungmarke“ wie Home oder Bad dem Tab zuweisen muss.

Hast Du noch einen Tip für mich parat?

Bild 3 zeigt TabSheet Properties,

Bild 4 zeigt PageControl Propertie womit ich bis jetzt zumindest auf das „Bad“ Tab wechseln kann, aber nicht wie gewollt zurück über das „Home“ Button.

Vieleicht kannst Du mir nochmal helfen, wäre echt nett:rolleyes:

Gruß dinin

Hallo dinin,

ich empfehle Dir die Download-Version der Designer-Doku aufmerksam zu lesen.

Dort wirst Du feststellen, dass das TabSheet nicht aufgeführt ist. Einfach deshalb, weil es, wie Du inzwischen selbst festgestellt hast, kein eigenständiges Tool ist und daher keine Properties und keine Events aufweist.
Das eigentliche Tool trägt den Namen PageControl. Du hast bereits zwei TabSheets in Deinem PageControl angelegt (Home und Bad). Diese sind an den beiden Tabs (Karteikartenreiter) zu erkennen. Jedes dieser Tabs ist ein vollwertiger Button. Ein Klick auf das jeweilige Tab führt Dich direkt in das zugehörige TabSheet.

Wozu willst Du eine Funktionalität implementieren, die von Haus aus bereits enthalten ist?
Es gibt keine Notwendigkeit diese Funktionalität durch einen extra eingeführten Button zu zu realisieren. Es ist bereits alles vorhanden.

Um zwischen den einzelnen Seiten (den TabSheets) eines PageControl zu wechseln, brauchst Du nur auf das zugehörige Tab zu klicken. Genau zu diesem Zweck sind sie da.

Gruß
HJH