FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: StefanStrobel am 22 November 2022, 18:11:28

Titel: Prüfung auf $hash->{STATE} in der readyFn vs. stateFormat
Beitrag von: StefanStrobel 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
Titel: Antw:Prüfung auf $hash->{STATE} in der readyFn vs. stateFormat
Beitrag von: JoWiemann 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
Titel: Antw:Prüfung auf $hash->{STATE} in der readyFn vs. stateFormat
Beitrag von: rudolfkoenig 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.