Autor Thema: Prüfung auf $hash->{STATE} in der readyFn vs. stateFormat  (Gelesen 196 mal)

Offline StefanStrobel

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1839
Prüfung auf $hash->{STATE} in der readyFn vs. stateFormat
« am: 22 November 2022, 18:11:28 »
Hallo,

ich bin gerade über ein Problem beim reopen von Verbindungen in der readyFn gestolpert.
Vor einem Aufruf von DevIo_OpenDev o.ä. prüfe ich noch ob das Internal STATE auch auf disconnected steht.
In meinen Modulen sieht das meist so aus:
sub ReadyFn {
    my $hash = shift;
    my $name = $hash->{NAME};
   
    if($hash->{STATE} eq "disconnected") { 
        ...
        DoOpen($hash, 1);                           
        return;                                     # a return value triggers direct read for win
    }
    # This is relevant for windows/USB only
    my $po = $hash->{USBDev};
    if ($po) {
        my ($BlockingFlags, $InBytes, $OutBytes, $ErrorFlags) = $po->status;
        return ($InBytes>0);                        # tell fhem.pl to read when we return
    }
    return;

ähnlich steht es auch im Wiki unter http://www.fhemwiki.de/wiki/DevelopmentModuleIntro#X_Ready
sub X_Ready($)
{
my ($hash) = @_;
     
# Versuch eines Verbindungsaufbaus, sofern die Verbindung beendet ist.
return DevIo_OpenDev($hash, 1, undef ) if ( $hash->{STATE} eq "disconnected" );
        ...

Jetzt hat ein Anwender von ArduCounter sein stateFormat z.B. auf "State: [$name:state]" gesetzt und aus irgendeinem Grund ist bei ihm STATE nicht mehr disconnected sondern "State: disconnected".
Damit bleibt die Verbindung zu.
siehe https://forum.fhem.de/index.php/topic,19285.735.html

Da ich diese Abfrage in der readyFn gefühlt schon immer so gemacht habe, keine Probleme berichtet wurden und es auch im Wiki (und in anderen Modulen) so drinsteht, frage ich mich ob es einfach Unsinn ist, in der readyFn das Internal STATE abzufragen oder ob das schon sinnvoll ist und statt dessen irgend etwas anderes im Zusammenhang mit stateFormat schief läuft.

Hat jemand eine Idee?

Gruss / Thanx
   Stefan

Offline JoWiemann

  • Tester
  • Hero Member
  • ****
  • Beiträge: 3374
Antw:Prüfung auf $hash->{STATE} in der readyFn vs. stateFormat
« Antwort #1 am: 22 November 2022, 19:35:07 »
Hallo Stefan,

eigentlich gehört STATE dem User, der dies über stateFormat beliebig verändern kann. Für Deine Prüfung sollte eigentlich das Internal Reading state verwendet werden.

STATE selber wird immer nur dann durch das interne Reading state gesetzt, wenn stateFormat nicht definiert ist. Soll dafür sorgen, dass etwas vernünftiges im FhemWeb angezeigt wird.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 25818
Antw:Prüfung auf $hash->{STATE} in der readyFn vs. stateFormat
« Antwort #2 am: 22 November 2022, 19:38:13 »
Das Problem wurde hier behandelt:

https://forum.fhem.de/index.php?topic=29764
https://forum.fhem.de/index.php?topic=120940

Das Modul sollte auf DevIo_getState($hash) eq "disconnected" pruefen, und   $hash->{devioNoSTATE} = 1 setzen.

 

decade-submarginal