Hauptmenü

Bug im Mobile Web UI

Begonnen von buennerbernd, 26 April 2018, 10:31:06

Vorheriges Thema - Nächstes Thema

buennerbernd

Hallo,

ich habe einen Bug im Mobile Web UI gefunden. Er tritt also nur auf Port 8084 auf. Auf den Ports 8083 und 8085 läuft alles wie erwartet.
Ich schreibe gerade ein Modul das eine Funktion set state mit einer Combobox als Werteauswahl haben soll.
Der Code sieht so aus und läuft auch im normalen Browser:

sub KLF200_2_Set($$$) {
  my ($hash, $argsref, undef) = @_;

  my @a= @{$argsref};
  return "set needs at least one parameter" if(@a < 2);
 
  my $name = shift @a;
  my $cmd= shift @a;
  Debug "Set name: $name cmd: $cmd";
 
  if($cmd eq "state") {
my $value = shift @a;
readingsSingleUpdate($hash, "state", $value, 1);
my @arguments = ($hash->{productName}, "state", $value);
return IOWrite($hash, @arguments);
  }
  my $usage= "Unknown argument $cmd, choose one of";
  $usage .= " state" ;
  my $states = ReadingsVal($hash->{NAME}, "states", "");
  if(defined($states)) {
$usage .= ":" . $states;
  }
  return $usage;
}


Wenn ich den Setter im Normalen UI ausführe, tut er, was er soll.
Im Mobile UI kommt die Meldung:
Unknown argument 74, choose one of state
Dabei ist die 74 die ausgewählte Zahl aus der Combobox.

Im Mobile UI fehlt also in $argsref das cmd "state".
In meiner Verzweiflung habe ich das Command mal in "status" umbenannt und überraschenderweise funktioniert es damit auch im Mobile UI. Der Bug tritt also nur auf, wenn das Command "state" heißt und nur auf Port 8084.

Es wäre trotzdem toll, wenn dieser Fehler repariert wird, weil ich ja mit der Funktion den State manipulieren will und man da Namensgleichheit erwartet.

Gruß,
Stefan.
Modulentwickler von KLF200 und KLF200Node

rudolfkoenig

Zitatich habe einen Bug im Mobile Web UI gefunden.
Die Sache ist deutlich komplizierter.

1. Das Reading state ist in FHEM was Spezielles: es gibt den Status des Geraetes aus Sicht des Modulautors wieder. Der Benutzer kann das aendern, aber das ist eine andere Geschichte. Normalerweise setzt der Benutzer diesen Status ohne "state". Bsp. aus FS20: um eine Lampe einzuschalten verwendet man "set Lamp on" statt "set Lamp state on", weil das meiner Ansicht nach "intuitiver" ist,  auch wenn das Weglassen von state an mancher Stelle zu Verwirrung fuehrt.
2. Falls auf der FHEMWEB Detailseite ein Reading mit dem gleichen Namen wie das set Argument gefunden wird, dann wird der set Befehl von JavaScript per XHR aufgerufen, falls nicht, dann wird eine neue HTML-Seite (per form submit, die "alte" HTML Methode) angefordert.
3. Auf der Mobilseite wurde das angezeigte Reading vom JavaScript nie "gefunden".
4. Die "form-submit" Methode hat bei einem set XX state YY" das Wort state entfernt (siehe Punkt 1), und das fuehrt zu der gezeigten Fehlermeldung. Die XHR-Variante macht das nicht, deswegen klappt es damit.

D.h. das Problem tritt auch auf der Desktop-Seite auf nach einem "deletereading XX state".

- ich habe jetzt auf der mobilen Seite das Auffinden eines Readings gefixt. Als Nebeneffekt werden da ab sofort die Reading-Aenderungen auch dynamisch angezeigt (wie auf dem Desktop).
- bei der "form-submit" Methode wird bei "set XX state YY" das Wort state ab sofort nicht mehr entfernt.

Ich finde inzwischen, dass die spezielle Behandlung von Geraeten mit kleinen Bildschirm bzw. Touchpad nicht in Perl/FHEMWEB gemacht werden sollte, sondern vom Style spezifischen JavaScript, wie ich das im f18 Style gezeigt habe. Damit kann die gleiche FHEMWEB-Instanz von allen Geraeten verwendet werden, und solche Probleme treten nicht mehr auf.

buennerbernd

Danke, das funktioniert jetzt.

ZitatNormalerweise setzt der Benutzer diesen Status ohne "state".

Heißt das, ich sollte meine set-Funktion besser so schreiben, dass sie auch ohne das Command "state" zurecht kommt und in diesem Fall den state setzt?

Gruß, Stefan.
Modulentwickler von KLF200 und KLF200Node

rudolfkoenig

Wenn das in diesem Kontext intuitiv und verstaendlich ist, dann ja.