defptr wird nicht gelöscht

Begonnen von torte, 21 Dezember 2017, 12:42:17

Vorheriges Thema - Nächstes Thema

torte

Hallo zusammen,

ich bin ja noch neu in der Modulentwicklung und komme da jetzt nicht mehr weiter bzw. kann ich mir den Fehler nicht erklären.

Bei meinem XiaomiSmartHome Modul wird beim löschen eines logischen Devices der defptr nicht gelöscht.

hier ist meine SUB

sub XiaomiSmartHome_Device_Undef($)
{
my ($hash, $arg) = @_;
my $name = $hash->{NAME};
my $iodev = $hash->{IODev}->{NAME};
RemoveInternalTimer($hash);
delete($modules{XiaomiSmartHome_Device}{defptr}{$hash->{SID}});
    Log3 $name, 4, "$iodev: DEV_Undef> $name - device deleted";
    return undef;

}


Das Device ist zwar gelöscht, wenn man aber das selbe device wieder anlegen lassen will sagt die Parse Funktion das es den defptr schon gibt.
Hab mit einer foreach Schleife mal nachgeschaut, es gibt wirklich noch den defptr von dem gelöschten Device.
Hat einer von euch eine Idee was ich da falsch mache?

Danke Grüße
Torte

Markus Bloch

Eine Idee habe ich nicht. Füg doch mal ein paar Debugmeldungen ein, damit man sieht was in $hash->{SID} steht und ob evtl. $modules{XiaomiSmartHome_Device}{defptr}{$hash->{SID}} definiert ist und was da so drin steht, etc.

Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

torte

Danke, hatte ich schon versucht versteh es aber nicht.  :(

sub XiaomiSmartHome_Device_Undef($)
{
my ($hash, $arg) = @_;
my $name = $hash->{NAME};
my $iodev = $hash->{IODev}->{NAME};
my $sid = $hash->{SID};
RemoveInternalTimer($hash);
Log3 $name, 1, "$iodev: DEV_Undef> ". $hash->{SID} . " > " . $modules{XiaomiSmartHome_Device}{defptr}{$hash->{SID}} . " > " . $sid ." > " . $modules{XiaomiSmartHome_Device}{defptr}{$sid};
delete ($modules{XiaomiSmartHome_Device}{defptr}{$sid});
    Log3 $name, 1, "$iodev: DEV_Undef> $name - device deleted ";
    return undef;

}


im Log beim löschen.

2017.12.21 13:43:27.869 1: MIGATE1: DEV_Undef> 158d0001d78973 > HASH(0x5126f98) > 158d0001d78973 > HASH(0x5126f98)
2017.12.21 13:43:27.870 1: MIGATE1: DEV_Undef> XMI.TEST - device deleted



Hier jetzt mal vom Read wenn er das Device neu anlegen will mit der foreach schleife, dort sieht man das es den defptr noch gibt.
somit denkt die parse Funktion das device gibt es schon und legt es via autocreate nicht an.


2017.12.21 13:44:23.320 1: MIGATE2: Read>
2017.12.21 13:44:23.321 1: MIGATE2: Read> 158d00015af7ad
2017.12.21 13:44:23.321 1: MIGATE2: Read> 158d0001873c01
2017.12.21 13:44:23.322 1: MIGATE2: Read> 158d0001548eb7
2017.12.21 13:44:23.322 1: MIGATE2: Read> 158d0001535d8e
2017.12.21 13:44:23.322 1: MIGATE2: Read> 158d0001210b05
2017.12.21 13:44:23.323 1: MIGATE2: Read> 158d00012d68f0
2017.12.21 13:44:23.323 1: MIGATE2: Read> 158d00015af75e
2017.12.21 13:44:23.323 1: MIGATE2: Read> 158d00015af7dc
2017.12.21 13:44:23.324 1: MIGATE2: Read> 158d0001584540
2017.12.21 13:44:23.324 1: MIGATE2: Read> 158d00010f8934
2017.12.21 13:44:23.324 1: MIGATE2: Read> 158d0001873d24
2017.12.21 13:44:23.325 1: MIGATE2: Read> 158d00015a8909
2017.12.21 13:44:23.325 1: MIGATE2: Read> 158d0001dad675
2017.12.21 13:44:23.325 1: MIGATE2: Read> 158d00011c2f7c
2017.12.21 13:44:23.326 1: MIGATE2: Read> 158d000116e293
2017.12.21 13:44:23.326 1: MIGATE2: Read> 158d00012aedd5
2017.12.21 13:44:23.326 1: MIGATE2: Read> 158d0001548f5f
2017.12.21 13:44:23.327 1: MIGATE2: Read> 158d00011919bd
2017.12.21 13:44:23.327 1: MIGATE2: Read> 158d0001130089
2017.12.21 13:44:23.327 1: MIGATE2: Read> 158d0001ab42d2
2017.12.21 13:44:23.328 1: MIGATE2: Read> 158d00011888e9
2017.12.21 13:44:23.328 1: MIGATE2: Read> 158d0001573fd0
2017.12.21 13:44:23.328 1: MIGATE2: Read> 158d0001d78973   <- dies hier
2017.12.21 13:44:23.329 1: MIGATE2: Read> 158d0001583318
2017.12.21 13:44:23.329 1: MIGATE2: Read> 158d0001584481
2017.12.21 13:44:23.329 1: MIGATE2: Read> 158d0001583caa
2017.12.21 13:44:23.330 1: MIGATE2: Read> 158d0001ab386b
2017.12.21 13:44:23.330 1: MIGATE2: Read> 158d0001597b3e
2017.12.21 13:44:23.330 1: MIGATE2: Read> Dispatch {"cmd":"read_ack","model":"sensor_wleak.aq1","sid":"158d0001d78973","short_id":62565,"data":"{\"voltage\":3155}"}
2017.12.21 13:44:23.332 1: MIGATE2: DEV_Parse>[b] IS DEFINED[/b] sensor_wleak.aq1 : 158d0001d78973 HASH(0x5933458)



Das einzige was mir gerade auffällt das es unterschiedliche Modulinstanzen vom Gateway sind (es gibt 2 mal das physische Gerät). Das sollte doch aber egal sein den defptr gibt es doch global nur einmal.

Danke
Grüße
Torte



Markus Bloch

Wie ist denn der Rückgabewert von delete(). Daran kann man erkennen ob tatsächlich gelöscht wurde und wenn ja, was gelöscht wurde.
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

CoolTux

Und zeig Mal bitte Deine Define Funktion
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

torte

Der Rückgabewert ist der Hash von dem Device, muss das so?


Hier mein define

sub XiaomiSmartHome_Device_Define($$) {
my ($hash, $def) = @_;
my ($name, $modul, $sid, $type, $iodev) = split("[ \t]+", $def);
  $hash->{TYPE} = $modul;
$hash->{MODEL} = $type;
$hash->{SID} = $sid;
$hash->{NAME} = $name;
$hash->{VERSION}  = $version;
$hash->{STATE} = 'initialized';
$modules{XiaomiSmartHome_Device}{defptr}{$sid} = $hash;
AssignIoPort($hash,$iodev);
my $room = $attr{$iodev}{room};

if(defined($hash->{IODev}->{NAME})) {
        my $IOname = $hash->{IODev}->{NAME};
Log3 $name, 4, $IOname . ": DEV_Define> " .$name. ": " . $type . " I/O device is " . $hash->{IODev}->{NAME};
      } else {
           Log3 $name, 1, "$name DEV_Define> $type - no I/O device";
    }
    $iodev = $hash->{IODev}->{NAME};
       
    my $d = $modules{XiaomiSmartHome_Device}{defptr}{$name};
   
    return "XiaomiSmartHome device $hash->{SID} on XiaomiSmartHome $iodev already defined as $d->{NAME}." if( defined($d) && $d->{IODev} == $hash->{IODev} && $d->{NAME} ne $name );

    Log3 $name, 4, $iodev . ": DEV_Define> " . $name . ": defined as ". $hash->{MODEL};
    $attr{$name}{room} = $room if( !defined( $attr{$name}{room} ) );
    if( $type =~ /motion/) {
$attr{$name}{devStateIcon}  = 'motion:motion_detector@red off:motion_detector@green no_motion:motion_detector@green' if( !defined( $attr{$name}{devStateIcon} ) );
}
elsif ( $type =~ /magnet/) {
$attr{$name}{devStateIcon}  = 'open:fts_door_open@red close:fts_door@green' if( !defined( $attr{$name}{devStateIcon} ) );
}
elsif ( $type eq 'sensor_ht') {
$attr{$name}{stateFormat}  = 'temperature °C, humidity %' if( !defined( $attr{$name}{stateFormat} ) );
}
    elsif ( $type eq 'weather.v1') {
$attr{$name}{stateFormat}  = 'temperature °C, humidity %, pressure kPa' if( !defined( $attr{$name}{stateFormat} ) );
}

if( $init_done ) {
InternalTimer(gettimeofday() + 2, "XiaomiSmartHome_Device_updateSReading", $hash, 0 );
Log3 $name, 4, $iodev . ": DEV_Define> " . $name . " Init Done set InternalTimer for Update";
}
return undef;


danke für eure hilfe!

CoolTux


my $d = $modules{XiaomiSmartHome_Device}{defptr}{$name};


Entweder $name oder $ssid
Entscheide Dich  ;)
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

torte

mhhh

den defptr setzt ich doch hier (paar zeilen höher)

$modules{XiaomiSmartHome_Device}{defptr}{$sid} = $hash;


hab das aber dort was du gefunden hast jetzt auch geändert in SID Fehler bleibt. Ich Blicks einfach nicht. :-\

CoolTux

Sorry mein Fehler. Handydisplay ist einfach zu klein.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

torte

hab jetzt die Parse Funktion so geändert:

if ($modules{XiaomiSmartHome_Device}{defptr}{$sid}{IODev}->{NAME})
{
my $hash = $modules{XiaomiSmartHome_Device}{defptr}{$sid}->{IODev};


Ich verstehe aber nicht warum es zu diesem Problem, an der Stelle kommt, hab bestimmt schon öfters, beim testen mal einen Sensor gelöscht und dieses
Problem hatte ich noch nie. Habe immer noch das Gefühl das beim Delete was schief läuft.