Prüfung auf $hash->{STATE} in der readyFn vs. stateFormat

Begonnen von StefanStrobel, 22 November 2022, 18:11:28

Vorheriges Thema - Nächstes Thema

StefanStrobel

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

JoWiemann

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

rudolfkoenig

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.