Ungewöhnliches Verhalten einer Variablen mit Assoziationen

Hallo Leute,

ich beobachte ein ungewöhnliches Verhalten einer Variablen mit Assoziationen.

Erstellt wird sie im Modul mit:

$this->RegisterProfileFloat("IPS2AcerP5530.DigitalZoom", "TV", "", "", -0.1, 2.1, 0, 1);
		IPS_SetVariableProfileAssociation("IPS2AcerP5530.DigitalZoom", -0.1, "-", "TV", -1);
		IPS_SetVariableProfileAssociation("IPS2AcerP5530.DigitalZoom", 0, "%.1f", "TV", 0x00FF00);
		IPS_SetVariableProfileAssociation("IPS2AcerP5530.DigitalZoom", 2.1, "+", "TV", -1);

Im Webfront funktionieren diese auch erwartungsgemäß und ohne Probleme, nur seit einer für mich nicht mehr nachvollziehbaren Zeit nicht mehr in der iOS-App.

Jemand eine Idee?

Joachim

Setzt die Schrittweite auf 0.
Macht bei diesen Assoziationen auch keinen Sinn.
Michael

Hallo Michael,

die aufgerufene Funktion wäre:

private function RegisterProfileFloat($Name, $Icon, $Prefix, $Suffix, $MinValue, $MaxValue, $StepSize, $Digits)
	{
	        if (!IPS_VariableProfileExists($Name))
	        {
	            IPS_CreateVariableProfile($Name, 2);
	        }
	        else
	        {
	            $profile = IPS_GetVariableProfile($Name);
	            if ($profile['ProfileType'] != 2)
	                throw new Exception("Variable profile type does not match for profile " . $Name);
	        }
	        IPS_SetVariableProfileIcon($Name, $Icon);
	        IPS_SetVariableProfileText($Name, $Prefix, $Suffix);
	        IPS_SetVariableProfileValues($Name, $MinValue, $MaxValue, $StepSize);
	        IPS_SetVariableProfileDigits($Name, $Digits);
	}
}

Danach ist die Schrittweite schon 0, oder meinst Du etwas anderes?

Joachim

Stimmt, nicht gesehen.
Auch das die mittlere Assoziationen den Wert enthält übersehen.
Und was ist das Problem?
Das so ein Hack mit den Profilen (links und rechts +/- Tasten) nicht unbedingt funktioniert, weil so nicht gedacht, ist hoffentlich bekannt.
Michael

…das Gerät lässt nicht zu, dass man den Zielwert direkt setzt, ich kann nur zum Ist-Wert 0.1 addieren bzw. subtrahieren. Von daher ist das jetzt erst einmal nicht anders möglich.

Aussergewöhnlich ist hier vielleicht, dass ich im mittleren Feld den aktuellen Wert anzeigen lasse. Diese spart mir eine weitere Zeile im Webfront.

Im Webfront funktioniert es auch wie es soll. In der iOS-App passiert einfach gar nichts - als wenn keine Aktion ausgelöst wird. Es gibt keine Fehlermeldungen.
Definitiv hat es irgendwann einmal aus der iOS-App funktioniert, kann aber nicht sagen zum welchem Zeitpunkt es dann nicht mehr ging.

Ich stelle diese Verhalten (bisher) auch nur bei dieser Variablen fest.

Joachim

…was noch auffällig ist in der iOS-App:
Im Menü ist der aktuelle Wert (mittleres Feld) korrekt mit 0.9 angeben. Wähle ich diese Variable aus, geht die App ja in das Untermenü dass die Assoziationen anzeigt, dort habe ich dann zur Auswahl „-“, 0.0 (und nicht 0.9!) und „+“…

Hilft das?

Joachim

…ich habe die fragliche Variable jetzt einmal „manuell“ erstellt. Auch dann wird sie in der iOS-App nich korrekt angezeigt, wohl aber im Webfront. Jemand jetzt eine Idee?

Joachim

Die Apps können dieses Konstrukt nicht, da die Liste sich nicht „on the fly“ aktualisiert. (Außerdem ist es doof, weil man immer in die Liste rein geht und dann raus-springt)

paresy

Hallo Paresy,

ja, das mit dem „Rausspringen“ ist wirklich blöd…gibt es dazu etwas besseres zur Umsetzung in der App?

Funktioniert hat es aber auch über die iOS-App definitiv mal (gemeint ist jetzt die Funktion an sich). Vom Code her funktioniert es aus dem Webfront ja auch…[emoji848]
Wie komme ich dem auf die Schliche?

Joachim

Das geht dennoch.
Du hast ja den alten Wert und bekommst durch die Aktion den neuen Wert.
Die Differenz ist dann wie viele + oder - Kommandos du absetzen musst.
Dann funktioniert auch ein ganz normales Profil und z.b. auch der Circle Slider.
Michael

Ich bin mir sehr sicher, dass es nie ging :slight_smile:

Dieses Konzept (eher Trick) kommt ursprünglich vom Entenzähler von Horst und schon damals war es ein WebFront only Hilfsmittel :slight_smile:

paresy

Hallo Paresy,

das die Felder mit „dynamischen Inhalt“ (2. Assoziation) in der iOS-App so nicht funktionieren (und noch nie funktioniert haben) habe ich aus Deiner Begründung verstanden.

Was mir noch nicht einleuchtet, ist warum das erste und dritte Assoziation noch nie funktioniert haben sollen, das leuchtet mir technisch nicht ein und würde ich auch vehement bestreiten…:wink:

Vom Sachverhalt her wird doch für die erste und dritte Assoziation völlig korrekt aus dem normalen Webfront die RequestAction-Funktion des Moduls aufgerufen und kommt dann irgendwann bei

case "DigitalZoom":
						SetValueFloat($this->GetIDForIdent($Ident), $Value);
						If ($Value == -0.1) {
							$this->SetcURLData("zom1=zom1");
						}
						elseIf ($Value == 2.1) {
							$this->SetcURLData("zom2=zom2");
						}
					break;

an und ich sehe das die Funktion korrekt ausgeführt wird.

Was ist der technische Grund, warum das aus der iOS-App für die erste und dritte Assoziation (die zweite wird sowieso ignoriert) nicht
funktionieren sollte (bzw. noch nie funktioniert hat)?

@Michael: Die Idee von Dir werde ich mal prüfen, ist aber nicht so ganz trivial, weil es mit Frage der Sichtbarkeit des OSD zu tun hat…sollte aber irgendwie umsetzbar sein.

Joachim

Nachtrag: Habe mal ein SendDebug für die RequestAction-Funktion eingebaut, jetzt wird mir klar warum es nicht funktionieren kann:
18.06.2020, 21:07:09 | RequestAction | Ident: DigitalZoom Wert: -0,10000000149012
Aus der erwarteten -0.1 ist -0,10000000149012 geworden!

…wie ist meine Feststellung denn einzuschätzen? Tritt das nur bei mir so auf? Als Work-Around könnte ich die von der App kommenden Float-Werte auf „kürzen“, dann sollte das passen, fühlt sich aber irgendwie nicht richtig an…

Joachim

Nicht kürzen sondern runden, bevor man einen Vergleich durchführt.
Das Thema wirst du bei Float immer haben. Darum wird auch meistens auf größer/kleiner geprüft und nicht auf gleich.
Michael

…wenn dem so ist, wäre ein Hinweis in der Doku vielleicht angebracht.
Sieht ja im Moment so aus, als ob das eher ein Problem aus der App heraus ist, aus dem Webfront habe ich bisher dieses Problem nicht feststellen können.
Aber: Wieder etwas gelernt![emoji6]

Joachim

…immer wieder muss ich zwischendurch an diesen Sachverhalt denken. Ich frage mich wie es dazu kommt, das wenn ich eine -0.1 bei „Click“ sende am Ende in IPS eine -0,10000000149012 ankommen kann.

Ist das vielleicht darin begründet, dass das iOS ein 64-Bit-System ist und auf dem Raspberry Pi mit 32-Bit gearbeitet wird?
Könnte es sein, dass z.B. Float-Messwerte im iOS anders angezeigt werden weil es diesen Sachverhalt gibt?

Joachim

Das liegt an der Kodierung von Fließkommazahlen. Schau mal hier: IEEE 754 – Wikipedia

Die Kodierung ist immer ungenau und deswegen gibt es immer ein nettes „Epsilon“ wenn man Float Werte vergleicht.

paresy

Moin,

da war paresy schneller als ich :slight_smile: Wenn du im Forum nach Epsilon suchst wirst du zahlreiche Hinweise auf den Umgang mit Float Variablen finden :wink:

Gruß
Hans

…vielen Dank für die Rückmeldungen. Ich hatte davon noch nie vorher etwas gehört!

Seit über zehn Jahren dabei, aber man lernt immer wieder etwas dazu.

Wie an anderen Stelle vorgeschlagen gibt es verschiedene Möglichkeiten das zu umgehen:

  • auf die relevanten Nachkommastellen runden (habe ich jetzt hier so gemacht)
  • den Wert in der Assoziation mit einen geeigneten Faktor zum Integer-Wert machen und nur wenn nötig und ganz zum Schluß wieder in einen Float-Wert wandeln
  • mit der Differenz vom erwarteten und faktischen Wert arbeiten

  • Gibt für jeden Fall sicherlich einen besten Weg.

Joachim

Moin Joachim,

dieses Problem hat ja nichts mit IPS zu tun sondern ist ein prinzipielles Problem, welches auch schon vor 40 und länger die Programmierer beschäftigt hat :wink: Möglicherweise ist der Unterschied nur der, dass die älteren Entwickler wissen und von Anfang an der Fokus u. a. auf diesem Thema lag - also auch bei uralten Sprachen wie z. B. FORTRAN IV und ähnlich :smiley:

Gruß
Hans