Neues Modul - Versionsnummer bei reload

Begonnen von cotecmania, 21 November 2016, 14:46:12

Vorheriges Thema - Nächstes Thema

cotecmania

Hi,

ich verstehe es noch nicht ganz.
Wenn ich z.B. $hash->{VERSION} = "0.95"; fest in der Initialize-Funktion am Ende setze, wird es bei reload nicht uebernommen. (Initialize wird aber definitiv durchlaufen)
Wenn ich dort ein Attribut hinzufuegen, ist es danach sofort vorhanden. Das verstehe ich eben nicht.
sub LevelJET_Initialize($) {
    my ($hash) = @_;
    Log3 $hash->{NAME}, 1, "$hash->{TYPE} $hash->{NAME}->*** Funktion Initialize ***";

require $attr{global}{modpath} . '/FHEM/DevIo.pm';

       $hash->{SetFn}      = 'LevelJET_Set';
$hash->{ReadFn} = 'LevelJET_Read';
$hash->{ReadyFn} = 'LevelJET_Ready';
$hash->{DefFn} = 'LevelJET_Define';
$hash->{UndefFn} = 'LevelJET_Undef';
$hash->{AttrFn}     = 'LevelJET_Attr';
$hash->{AttrList} = 'PollingRate';
$hash->{VERSION} = $VERSION;
}


CoolTux hat dieselbe Anweisung immer 2 mal drin. Im Initialize UND im Define. Warum das bei ihm funktioniert ist mir noch nicht klar. Doppelt finde ich aber nicht gut.

Zitat von: rudolfkoenig am 21 November 2016, 17:31:14
Information, was man auch sonst zur Verfuegung hat, zu duplizieren.
$hash wird weiter aufgeblaeht.
Benutzer interessiert es nicht.
CommandDefine/CommandReload/etc muss erweitert werden.
Die Argumente ziehen nicht wirklich  ;)
Es gibt genuegend Parameter die den Benutzer noch weniger interessieren wie (FD), DeviceName (sogar doppelt wie im DEF)  ...
Dass es einmalige Arbeit ist ist mir klar. Das ist immer so.
Mit dem aufblähen des Hash geb ich Dir Recht, aber ich fände es extrem gewinnbringend !

Jedes Programm im Internet hat eine eindeutige Versionsnummer und die steht meist ganz vorne auf jeder GUI oder zumindest im Info-Dialog für jeden Benutzer zugänglich.

Wäre schön wenn die Version als Internal umgesetzt werden könnte.

Andernfalls sollte mir nochmals jemand erklären, wie ich es schaffe das in meinem Modul im Initialize richtig einzubauen bzw. was fehlt  :-[ ...

Gruss
Joe
FHEM auf RaspberryPI B (buster)
2xCUL868 für MAX/Slow_RF, HM-LAN, JeeLink
MAX!/HM-Thermostate, FS20/HM-Rolladenschalter, FS20-EM, LevelJet-Ölstandsmessung, PCA301, IT, KM271, IPCAM, FireTAB10 FTUI

CoolTux

Zitat von: cotecmania am 21 November 2016, 19:21:00
Hi,

ich verstehe es noch nicht ganz.
Wenn ich z.B. $hash->{VERSION} = "0.95"; fest in der Initialize-Funktion am Ende setze, wird es bei reload nicht uebernommen. (Initialize wird aber definitiv durchlaufen)
Wenn ich dort ein Attribut hinzufuegen, ist es danach sofort vorhanden. Das verstehe ich eben nicht.
sub LevelJET_Initialize($) {
    my ($hash) = @_;
    Log3 $hash->{NAME}, 1, "$hash->{TYPE} $hash->{NAME}->*** Funktion Initialize ***";

require $attr{global}{modpath} . '/FHEM/DevIo.pm';

       $hash->{SetFn}      = 'LevelJET_Set';
$hash->{ReadFn} = 'LevelJET_Read';
$hash->{ReadyFn} = 'LevelJET_Ready';
$hash->{DefFn} = 'LevelJET_Define';
$hash->{UndefFn} = 'LevelJET_Undef';
$hash->{AttrFn}     = 'LevelJET_Attr';
$hash->{AttrList} = 'PollingRate';
$hash->{VERSION} = $VERSION;
}


CoolTux hat dieselbe Anweisung immer 2 mal drin. Im Initialize UND im Define. Warum das bei ihm funktioniert ist mir noch nicht klar. Doppelt finde ich aber nicht gut.

Du hast ja auch mein Beispiel gar nicht übernommen. Meine Initialize sieht jedenfalls anders aus wie Deine. Wo ist deine foreach Schleife über alle Devices Seines Types?
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

marvin78

@cotecmania: Gegen tatsächlich für alle sinnvolle Änderungen habe ich nichts. Sehr wohl aber gegen Redundanz und bei denen nur aus einer bestimmten Sichtweise ein Sinn vorhanden ist. Es gibt schon version. Das wird auch seit Jahren für den Support verwendet. Wenige Module haben bisher eine eigene (redundante) Versionsanzeige und beim "Cross-Support" würde ich mich nicht darauf verlassen.

Grundsätzlich habe ich aber nichts gegen Neuerungen, für die nicht andere, als die, die sie sich wünschen, arbeiten müssen. ;)

Ein reload-Event fände ich allerdings schon interessant :)

cotecmania

sub LevelJET_Initialize($)
{
    my ($hash) = @_;
    Log3 $hash->{NAME}, 1, "$hash->{TYPE} $hash->{NAME}->*** Funktion Initialize ***";

require $attr{global}{modpath} . '/FHEM/DevIo.pm';

    $hash->{SetFn}      = 'LevelJET_Set';
$hash->{ReadFn} = 'LevelJET_Read';
$hash->{ReadyFn} = 'LevelJET_Ready';
$hash->{DefFn} = 'LevelJET_Define';
$hash->{UndefFn} = 'LevelJET_Undef';
$hash->{AttrFn}     = 'LevelJET_Attr';

foreach my $d(sort keys %{$modules{LevelJET}{defptr}})
{
  my $hash = $modules{LevelJET}{defptr}{$d};
  $hash->{VERSION} = $VERSION;
    }

# $hash->{VERSION}    = $VERSION;

}


So gehts aber auch nicht. Eben getestet. oder hab ich was falsch übernommen ?
Hier muss man aber von Hand den eigenen Modulnamen eintragen, oder ?

Habs Gespeichert->reload->device neu in FHEM angezeigt

Im AMAD-Modul gehts, also muss noch was anderes fehlen ausserhalb Initialize ...

Gruss
Joe
FHEM auf RaspberryPI B (buster)
2xCUL868 für MAX/Slow_RF, HM-LAN, JeeLink
MAX!/HM-Thermostate, FS20/HM-Rolladenschalter, FS20-EM, LevelJet-Ölstandsmessung, PCA301, IT, KM271, IPCAM, FireTAB10 FTUI

CoolTux

Ja und zwar die Zeile im Define die ist das Ah und Oh und muss mindestens einmal ausgeführt werden.

$modules{AMAD}{defptr}{$hash->{HOST}} = $hash;
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

cotecmania

Zitat von: marvin78 am 21 November 2016, 19:51:37
@cotecmania: Gegen tatsächlich für alle sinnvolle Änderungen habe ich nichts. Sehr wohl aber gegen Redundanz und bei denen nur aus einer bestimmten Sichtweise ein Sinn vorhanden ist. Es gibt schon version. Das wird auch seit Jahren für den Support verwendet. Wenige Module haben bisher eine eigene (redundante) Versionsanzeige und beim "Cross-Support" würde ich mich nicht darauf verlassen.

Grundsätzlich habe ich aber nichts gegen Neuerungen, für die nicht andere, als die, die sie sich wünschen, arbeiten müssen. ;)

Ein reload-Event fände ich allerdings schon interessant :)

Nunja. Sichtweisen sind nun mal unterschiedlich  ;)
Und dass nicht jeder, der sich was wünscht, dies auch in FHEM einbauen kann ist auch klar. Deshalb wirds ja hier diskutiert.
Wenn ich einen Patch hätte, würde ich ihn glatt zur Verfügung stellen  :o

Die selbe Diskussion hatten wir beim AT-Befehl auch und der execNow-Erweiterung, die ich vorgeschlagen hatte.
Die hat Rudi dann, Gott sei Dank, eingebaut. Danke nochmals dafür. Ich benutze die ständig  ;)

Gruss
Joe
FHEM auf RaspberryPI B (buster)
2xCUL868 für MAX/Slow_RF, HM-LAN, JeeLink
MAX!/HM-Thermostate, FS20/HM-Rolladenschalter, FS20-EM, LevelJet-Ölstandsmessung, PCA301, IT, KM271, IPCAM, FireTAB10 FTUI

cotecmania

Zitat von: CoolTux am 21 November 2016, 19:59:58
Ja und zwar die Zeile im Define die ist das Ah und Oh und muss mindestens einmal ausgeführt werden.

$modules{AMAD}{defptr}{$hash->{HOST}} = $hash;

AMAD durch LevelJET ersetzt und HOST durch DeviceName.
Dann musste ich aber noch einmal die define-Funktion durchlaufen. Jetzt gehts.
    $modules{LevelJET}{defptr}{$hash->{DeviceName}} = $hash;
DeviceName -> /dev/serial/by-id/usb-FTDI_USB_Serial_Converter_FT9JQDYQ-if00-port0@19200

Ziemlich undurchsichtig für mich. Bin kein PERL-Kenner, komme aus der C-Welt.
Das "harte" Kodieren des Modulnamens im Initialize ist auch nicht gerade schön

Trotzdem mal Danke für deine Geduld ...
FHEM auf RaspberryPI B (buster)
2xCUL868 für MAX/Slow_RF, HM-LAN, JeeLink
MAX!/HM-Thermostate, FS20/HM-Rolladenschalter, FS20-EM, LevelJet-Ölstandsmessung, PCA301, IT, KM271, IPCAM, FireTAB10 FTUI

CoolTux

Hast Du es denn nun hinbekommen?

Du brauchst eine schleife über alle keys aus %defs. $defs{key} ist jeweils der $hash eines definierten devices. du schaust nach ob es von deinem TYPE ist. wenn ja änderst du was du brauchst. Das machst Du im LevelJET_Initialize.

Vorher musst Du defptr natürlich im Define noch setzen. Das habe ich Dir zwei Post vorher ja geschrieben.
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

CoolTux

Nimm nicht unbedingt den Devicenamen. Hast du noch eine andere Einmaligkeit als Internal?
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

cotecmania

Zitat von: CoolTux am 21 November 2016, 20:24:21
Nimm nicht unbedingt den Devicenamen. Hast du noch eine andere Einmaligkeit als Internal?

Ja es geht, wie oben geschrieben.
Leider hab ich sonst keine "Einmaligkeit". Der LevelJET liefert auch keine ...
Mein DeviceName ist eindeutig da "echter" FTDI, aber Du hast recht, bei einem "normalen" ttyUSBx kanns evtl Probleme geben bei reboot ...

Also keine universelle Lösung, wenn es keine eindeutige ID etc. gibt, oder ?

Gruss
Joe
FHEM auf RaspberryPI B (buster)
2xCUL868 für MAX/Slow_RF, HM-LAN, JeeLink
MAX!/HM-Thermostate, FS20/HM-Rolladenschalter, FS20-EM, LevelJet-Ölstandsmessung, PCA301, IT, KM271, IPCAM, FireTAB10 FTUI

CoolTux

Korrekt. Aber du kannst ja eine zur Not machen. Wäre nicht fein aber würde das Problem erschlagen.  ;D
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