Toggle Button WebFront / iOS

Hallo zusammen,

bitte diesen Thread verschieben, falls in der falschen Gruppe.

Ich bin heute auf diesen Thread gestossen um einen sog. Toggle-Button zu definieren,
was mir im WebFront auch besser gefällt:

Toggle-Button


Flur-Licht mit klassischem An/Aus Switch
Esszimmer-Lampe mit Toggle Button

Allerdings geht unter iOS dann das einfache (und sehr praktische) On/Off nicht mehr :eek:
Bildschirmfoto 2017-09-12 um 12.28.47.png

Gibt es eine Möglichkeit die Anzeige von Objekten je nach dem zu steuern ob über iOS bzw. mobil halt
oder über’s Webfrontend zugegriffen wird?

Danke im Voraus.

Mike

Das Problem beim Toggle-Skript ist, dass es eine Integer-Variable verwendet. Versuche die Methode mal auf eine Boolean Variable anzuwenden. Dann sollte es auch in der App angenehm dargestellt werden.

:):):slight_smile:
Vielen Dank für den Hinweis, das werde ich heute Abend gleich testen

Grüsse,

Mike

Hallo @Dr. Niels,

wenn ich das auf einer Boolean Variable-Versuche, bekomme ich folgende Fehlermeldung:

Warning:  Cannot delete association for boolean types in /var/lib/symcon/scripts/32232.ips.php on line 51

Kann es sein, dass die Methode bei boolschen Werten nicht geht, da es hierbei immer TRUE und FALSE
geben muss?

Hier der Code:


<?
/**********************************************************
 *
 * Toggle-Button für Lampen
 * 1. Boolean-Variable anlegen unterhalb des Devices (z.B. Lampe)
 * 2. Variablen-Profil anlegen (TRUE, FALSE schon mal vorbelegen, Icon Power)
 * 3. Skript an Integer-Variable verknüpfen (Eigene Aktion)
 *
 **********************************************************/

 // Variablen-ID der Boolean-Variable aus 1.
 $myBooleanValID = 38086;
 // Names des Variablen-Profils aus 2.
 $myVariableProfile = "ToggleSwitch";
 // ID eines Homematic-Devices, falls dies gleich geschalten werden soll
 $myHomeMaticDevice = 14286;


if($_IPS['SENDER'] == "Execute")
{
    $value = IPS_GetVariableProfile($myVariableProfile);
	
    switch(GetValueBoolean($myBooleanValID))
    {
        case FALSE:
        toggleOn($myBooleanValID, $myVariableProfile, $myHomeMaticDevice);
        break;
        
		case true:
        toggleOff($myBooleanValID, $myVariableProfile, $myHomeMaticDevice);
        break;
    }
}

if($_IPS['SENDER'] == "WebFront")
{
   switch($_IPS['VALUE'])
    {
        case false:
          toggleOn($myBooleanValID, $myVariableProfile, $myHomeMaticDevice);
          break;
        case true:
          toggleOff($myBooleanValID, $myVariableProfile, $myHomeMaticDevice);
          break;
    }
}


function toggleOn($myBooleanValID, $myVariableProfile, $myHomeMaticDevice)
{
    // Delete VariableProfileAssociation
	IPS_SetVariableProfileAssociation($myVariableProfile, FALSE, "", "", -1);
	// Set new VariableProfileAssociation
	IPS_SetVariableProfileAssociation($myVariableProfile, TRUE, "   An   ", "", 0x00FF00);
	// Switch Bulb
	HM_WriteValueBoolean($myHomeMaticDevice, "STATE", true);
	// Set Value Boolean
 	SetValue($myBooleanValID , TRUE); 
}

function toggleOff($myBooleanValID, $myVariableProfile, $myHomeMaticDevice)
{
    // Delete VariableProfileAssociation
	IPS_SetVariableProfileAssociation($myVariableProfile, TRUE, "", "", -1);
    // Set new VariableProfileAssociation
	IPS_SetVariableProfileAssociation($myVariableProfile, FALSE, "       Aus       ", "", 0xFF0040);
	// Switch Bulb
	HM_WriteValueBoolean($myHomeMaticDevice, "STATE", false);
	// Set Value Boolean
    SetValue($myBooleanValID , FALSE); 
}

?>

Irgendwelche Ideen?

Danke und Grüsse,

Mike

Das Problem ist, dass Boolean-Profile immer zwei Assoziationen haben müssen, eine für true und eine für false. Wenn du beim „Löschen“ für den Namen, also aktuell das erste „“, stattdessen ein Leerzeichen setzt, also " " statt „“, dann wird der Name für die Assoziation ein Leerzeichen. Wenn man genau hinguckt sieht man dann immer noch ein Überbleibsel im Webfront, aber das sieht man kaum. Das wäre aber vielleicht ein Kompromiss zwischen App- und Webfront-Nutzbarkeit.

Funktioniert !

Bildschirmfoto 2017-09-14 um 19.03.31.png
Bildschirmfoto 2017-09-14 um 19.03.19.png

Allerdings kann ich über das iOS nicht mehr schalten. Wenn die Variable z.B. auf FALSE steht
und ich den Wert über das iOS ändere geht es wieder zurück.

Ideen?

Was bedeutet er geht wieder zurück? Schaltet er zuerst und schaltet dann wieder zurück, wird das Aktionsskript also zweimal ausgeführt? Oder wird es gar nicht ausgeführt?

Spontan sehe ich jetzt kein Problem. Du könntest ja mit ein paar echo-Befehlen debuggen und schauen, was beim Aufruf über die App so passiert. Ist der Programmablauf, wie du ihn dir vorstellst oder werden die Funktionen vielleicht nicht wie gewünscht ausgeführt?

Hallo,

ich könnte mir vorstellen, dass die Selektion des Senders hier vieleicht reingrätscht ? :confused:

if($_IPS['SENDER'] == "Execute")
{
    $value = IPS_GetVariableProfile($myVariableProfile);
    
    switch(GetValueBoolean($myBooleanValID))
    {
        case FALSE:
        toggleOn($myBooleanValID, $myVariableProfile, $myHomeMaticDevice);
        break;
        
        case true:
        toggleOff($myBooleanValID, $myVariableProfile, $myHomeMaticDevice);
        break;
    }
}

if($_IPS['SENDER'] == "WebFront")
{
   switch($_IPS['VALUE'])
    {
        case false:
          toggleOn($myBooleanValID, $myVariableProfile, $myHomeMaticDevice);
          break;
        case true:
          toggleOff($myBooleanValID, $myVariableProfile, $myHomeMaticDevice);
          break;
    }
}

Mit welchem $_IPS[‚SENDER‘] identifiziert sich denn das iOS-Frontend?

Danke und Grüsse,

Mike

Das war auch meine erste Idee, das sollte aber nicht der Fall sein. Sonst mach doch einfach mal ein echo $_IPS[‚SENDER‘]; an den Anfang. Dann gibt das Aktionsskript den Sender aus, wenn du es ausführst. Ähnlich kannst du dann auch prüfen, ob die richtigen cases und Funktionen abgearbeitet werden.

Hallo,

ich habe die Variable wie vorgeschlagen geloggt:

Bildschirmfoto 2017-09-15 um 19.09.42.png

Wenn ich im iOS den Schalter für den Boolschen Wert ändere Springt der Schalter
anschließend wieder zurück, eine Aktion wird nicht durchgeführt. :confused: also der
Weg in

if($_IPS['SENDER'] == "WebFront")
{
   switch($_IPS['VALUE'])
    {
        case false:
          toggleOn($myBooleanValID, $myVariableProfile, $myHomeMaticDevice);
          break;
        case true:
          toggleOff($myBooleanValID, $myVariableProfile, $myHomeMaticDevice);
          break;
    }
}

geht das Skript dann wohl nicht???

Grüsse,

Mike

Bildschirmfoto 2017-09-15 um 19.06.55.png

Probierst du sonst mal Logging-Ausgaben am Anfang von toggleOn und toggleOff? Dann kannst du prüfen, welche Funktion jetzt ausgeführt wird, oder eventuell gar keine? Schließlich kannst du auch noch direkt $_IPS[‚VALUE‘] ausgeben und dessen Inhalt prüfen.

Hallo @Dr. Niels,

ich habe die IPS_Value ausgewertet und es scheint mir so, dass die Übergabewerte des Webfront
und der iOS-Implementierung unterschiedlich sind:

Zustand der Variablen: FALSE
onClick im Webfront ergibt IPS_Value ist leer
onClick im iOS ergibt IPS_Value ist 1

if($_IPS['SENDER'] == "WebFront")
{
   echo "IPS Value='" .$_IPS['VALUE'] ."'
";
   
   if( empty( $_IPS['VALUE'] )) $_IPS['VALUE'] = 0;
   echo "IPS Value='" .$_IPS['VALUE'] ."'
";
   switch($_IPS['VALUE'])
    {
        case 0:
          toggleOn($myBooleanValID, $myVariableProfile, $myHomeMaticDevice);
          break;
		  
        case 1:
          toggleOff($myBooleanValID, $myVariableProfile, $myHomeMaticDevice);
          break;
    }
}

:confused:

Mir fehlt’s irgendwie an einem eindeutigen Entscheidungswert…

Echo funktioniert für bool Werte nicht.
Weil es dann zu einem String konvertiert wird.
Nimm mal print_r($_IPS[‚VALUE‘]) oder var_dump($_IPS[‚VALUE‘]).
Dann ist deine Prüfung mit empty ganz schlecht. Erklärung:
Eine Variable ist leer, wenn sie nicht existiert oder wenn ihr Wert gleich FALSE ist.
Somit machst du da dann eine 0 (Integer) draus.
Ähnlich ist das bei deinem Switch. Es wird dann bool (true) mal int (0) gegen Integer geprüft.
Also ganzschön Kuddelmuddel :wink:
Michael

Gerade ist mir aufgefallen, dass du im Webfront-Fall die Abfrage nicht ganz richtig machst. $_IPS[‚VALUE‘] enthält den neuen Wert, nicht den aktuellen. Im Webfront klappt das wahrscheinlich, da du hier auf den aktuellen Wert drückst und dieser somit erneut gesendet wird. In der App wird allerdings der Wert gewechselt.

Ist der Schalter beispielsweise false, dann schickt dir die App ein true. Somit wird der Schalter deaktiviert, obwohl er aktiviert werden soll. Dies könntest du, genau wie dein Problem mit dem Amazon Dashbutton aus dem anderen Thread, lösen, indem du immer den Execute-Teil ausführst, da dieser sich definitiv nach dem aktuellen Wert richtet.

Danke an alle, jetzt hab’s auch ich begriffen :rolleyes:
Wobei das unterschiedliche Handling zwischen App und Web schon etwas verwirrend ist :banghead:

Schlussendlich geht’s jetzt aber:

<?
/**********************************************************
 *
 * Toggle-Button für Lampen
 * 1. Boolean-Variable anlegen unterhalb des Devices (z.B. Lampe)
 * 2. Variablen-Profil anlegen (TRUE, FALSE schon mal vorbelegen, Icon Power)
 * 3. Skript an Integer-Variable verknüpfen (Eigene Aktion)
 *
 **********************************************************/

 // Variablen-ID der Boolean-Variable aus 1.
 $myBooleanValID = 38086;
 // Names des Variablen-Profils aus 2.
 $myVariableProfile = "ToggleSwitch";
 // ID eines Homematic-Devices, falls dies gleich geschalten werden soll
 $myHomeMaticDevice = 14286;

 $value = IPS_GetVariableProfile($myVariableProfile);
	
 switch(GetValueBoolean($myBooleanValID)){
    case false:
    toggleOn($myBooleanValID, $myVariableProfile, $myHomeMaticDevice);
    break;
    
	case true:
	toggleOff($myBooleanValID, $myVariableProfile, $myHomeMaticDevice);
    break;
 }




function toggleOn($myBooleanValID, $myVariableProfile, $myHomeMaticDevice)
{
    //IPS_LogMessage("toggleIT", "called toggleOn");
	
	// Delete VariableProfileAssociation
	IPS_SetVariableProfileAssociation($myVariableProfile, FALSE, " ", "", -1);
	// Set new VariableProfileAssociation
	IPS_SetVariableProfileAssociation($myVariableProfile, TRUE, "   An   ", "", 0x00FF00);
	// Switch Bulb
	HM_WriteValueBoolean($myHomeMaticDevice, "STATE", true);
	// Set Value Boolean
 	SetValue($myBooleanValID , TRUE); 
}

function toggleOff($myBooleanValID, $myVariableProfile, $myHomeMaticDevice)
{
    //IPS_LogMessage("toggleIT", "called toggleOff");
	
	// Delete VariableProfileAssociation
	IPS_SetVariableProfileAssociation($myVariableProfile, TRUE, " ", "", -1);
    // Set new VariableProfileAssociation
	IPS_SetVariableProfileAssociation($myVariableProfile, FALSE, "       Aus       ", "", 0xFF0040);
	// Switch Bulb
	HM_WriteValueBoolean($myHomeMaticDevice, "STATE", false);
	// Set Value Boolean
    SetValue($myBooleanValID , FALSE); 
}

?>

Danke euch,

Mike

Weil die Variablenprofile dafür auch eigentlich nicht gedacht sind.
Du nutzt jetzt einen Effekt aus, welcher zwar möglich ist, aber eigentlich wohl nicht so gedacht ist.
Wenn ich ‚ToggelButton‘ im WF nutzen würde, hätte meine Frau mich erschlagen.
Bei mir sind fast alle Anzeige-Werte auch mit Farben hinterlegt, dann wäre nicht erkennbar was steuerbar ist und was nicht.
Es fehlen dann ja die restlichen Schaltflächen.
Das hätte was auf die Nase gegeben :wink:
Michael

Wirklich unterschiedlich ist die Handhabung da nicht. Lediglich die GUIs der beiden Visualisierungen sind verschieden.

Der Unterschied ist, dass du im Webfront durch das Klicken auf einen der beiden Buttons (durch Toggle halt auf einen reduziert) den neuen Wert vorgibst. Value kann also je nach Button entweder true oder false sein. In der App hast du im Gegenzug allerdings nur den Kippschalter, welcher nicht den aktuellen Wert bestätigen kann, sondern nur wechseln kann.

@Dr. Niels

In der App hast du im Gegenzug allerdings nur den Kippschalter, welcher nicht den aktuellen Wert bestätigen kann, sondern nur wechseln kann.

Warum eigentlich?

Mich stört es seit langem schon dass man in der App nicht definiert ein oder aus schalten kann, sondern nur wechseln.

Das kann ich dir nicht genau sagen, da ich kaum etwas mit der Entwicklung der Apps zu tun habe. Ich könnte mir vorstellen, dass hier im Vergleich zum Webfront sparsamer mit dem Platz umgegangen werden sollte.

Kenne auch nur die Hälfte…Es wurde mal gefragt nach den System-Checkboxen (iOS & Android) und die meisten waren dafür bei bool. Somit keine Assoziationen mehr in den Apps bei bool und das aktuelle Verhalten.

Ich hätte auch lieber meine Assoziationen wieder :wink:

Michael