[closed] autocreate: bug oder Verständnisproblem?

Begonnen von erwin, 23 Januar 2021, 10:22:24

Vorheriges Thema - Nächstes Thema

erwin

Hi,
angeregt durch die aktuelle Diskussion im developer forum versuch ich autocreate für ein Modul (lt. wiki) zu nutzen:

Meine Vorgaben: Es soll ein dev angelegt werden, aber KEIN FileLog und KEIN SVG (weil ich DbLog / Grafana nutze...) . Ausserdem soll das device ein attr disabled 1 bekommen, weil es nach autocreate (ohne zus. parameter durch den user) nicht nutzbar ist.
Das gilt aber nur für EINE type. Alle anderen Dev-Typen sollen lt. Vorgaben in den autocreate Attrs behandelt werden.
list autocreate:
Internals:
   .FhemMetaInternals 1
   FUUID      5c439eb4-f33f-0e08-e4bb-6cf3a0b68cc8bc2f
   FVERSION   98_autocreate.pm:0.230060/2020-10-22
   NAME       autocreate
   NOTIFYDEV  global
   NR         14
   NTFY_ORDER 50-autocreate
   STATE      active
   TYPE       autocreate
   received:
Attributes:
   autocreateThreshold .*:3:30
   device_room autocreate
   filelog    filelog %L/autocreate-%Y-W%W.log
   ignoreTypes (FHT|EIB|SVG).*
   room       Global
   weblink_room autocreate

in der init-funktrion:
        $hash->{AutoCreate} = {"KNX_.*"  => { ATTR => "disable:1",
                FILTER => "%NAME",
                autocreateThreshold => "2:10",
                noAutocreatedFilelog => 1 } }; # autocreate devices will be disabled & create no FileLog


Das Problem: sobald das attr filelog in autocreate definiert ist wird keinAttribut (aus der Modul-Init) durch autocreate angelegt. Im Wiki ist das jedenfalls anders beschrieben .

Ein Blick in die autocreate.pm bestätigt das:
da gibts ein next if ...noAutocreateFileLog bevor die Attribute aus der Init verarbeitet werden.

Fix bisher: noAutocreateFileLog aus der init löschen und deleteattr autocreate filelog.
das deleteattr autocreate filelog betrifft dann allerdings alle devices, was nicht unbedingt gewünscht ist...
l.g. erwin

update: danke Rudolf, gelöst - Wiki ist in diesem Punkt falsch! Richtig ist:
$hash->{noAutocreatedFilelog} = 1; in der init_Fn 
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

rudolfkoenig

Ich habe autocreate.pm geaendert, hoffe es passt so.

ZitatMeine Vorgaben: Es soll ein dev angelegt werden, aber KEIN FileLog und KEIN SVG (weil ich DbLog / Grafana nutze...)
Diese Begruendung ist nicht tragbar fuer allgemein verfuegbare Module. Wenn ein Benutzer fuer Instanzen eines Moduls kein FileLog/etc haben will, fuer andere aber schon, dann kann man mehrere autocreate Instanzen anlegen, ignoreRegexp und die anderen Attribute entsprechend setzen. Und das Negieren mit regexp kennenlernen :)

Ich gehe davon aus, dass in diesem Fall sich um ein privates Modul handelt.

erwin

Hi Rudolf,

.. wenn ich auf die Idee mit mehreren autocreate instanzen gekommen wär   ;D, dann hätt ich das mit der negierten regex auch geschafft....
und genaugenommen wär das Problem dann gar nicht aufgetreten...

Ich schau mir den fix morgen an.
danke jedenfalls!
l.g. erwin 

PS: Die Begründung ist m.E. sehr wohl tragbar, weil das Device nach autocreate nicht funktionieren kann, weil ein entscheidender Parameter fehlt, der nur durch den User manuell hinzugefügt werden kann. Deshalb ja die urprüngliche Idee, das device auf disabled zu setzen. Die bisherige Variante war: den TYPE vom autocreate auszuschließen!
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

rudolfkoenig

Mir ging bei "nicht tragbar" darum: "weil ich DbLog / Grafana nutze, setze ich im Modul-Code noAutocreateFileLog". Damit sind die, die gerne FileLog haetten, raus.

erwin

Ok verstanden, ich hab die "Vorgaben" schlecht begründet, keinesfalls sollen FileLog/SVG nutzer ausgeschlossen werden, die Idee dahinter war vielmehr, daß für ein disabled device FileLog/SVG keinen Sinn macht, bzw. es für diese TYPE bereits bestehende FileLog defs gibt, die auf den autocreate namen matchen. Worst case muß der user den FileLog manuell anlegen.
Sorry erwin
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

erwin

Hi Rudolf,

geht noch nicht.... weil: $fl nie undef werden kann
ich hab jetzt mal versuchweise so abgeändert (Zeilen mit ### markiert)
      my $fl = replace_wildcards($hash, AttrVal($me, "filelog", ""));
###      $fl = undef if($modules{$hash->{TYPE}}{noAutocreatedFilelog} );
      my $flname = "FileLog_$name";
      delete($defs{$flname}) if($fl); # If we are re-creating it with createlog.
      my ($gplot, $filter, $devattr) = ("", $name, "");

      my $fp = $modules{$hash->{TYPE}}{AutoCreate};
      $fp = \%flogpar if(!$fp);

      my $disablefl = 0; ###

      foreach my $k (keys %{$fp}) {
        next if($name  !~ m/^$k$/);
        $gplot = $fp->{$k}{GPLOT};
        $filter = replace_wildcards($hash, $fp->{$k}{FILTER});
        $devattr = $fp->{$k}{ATTR};
        $disablefl = $fp->{$k}{noAutocreatedFilelog}; ###new
        last;
      }

      if ( ($fl) && !($disablefl)) {    ###changed
        $cmd = "$flname FileLog $fl $filter";

das scheint in allen variationen zu funktionieren
l.g. erwin
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

rudolfkoenig

Zitatgeht noch nicht.... weil: $fl nie undef werden kann
Vermutlich bist du der Ansicht bist, dass noAutocreatedFilelog Teil von $modules{XX}{AutoCreate} ist.
BIs jetzt ist das nicht der Fall, bei den 8 Modulen, die es setzen, wird sie direkt in $modules{XX} gesetzt.

D.h. dein Patch muesste gleichzeitig mit Anpassung dieser Module erfolgen, damit die Benutzer nicht ueberrascht werdem.

erwin

Wenn ich das wiki richtig interpertiere: (DevelopmentModuleIntro) & die Tabelle darunter
sub X_Initialize($)
{
my ($hash) = @_;

...

$hash->{AutoCreate} = {"X_.*"  => { ATTR   => "event-on-change-reading:.* event-min-interval:.*:300",
                                    FILTER => "%NAME",
                                    GPLOT  => "temp4hum4:Temp/Hum,",
                                    autocreateThreshold => "2:140"
  }
                      };
   
}

sollte es so sein,
gibt mir bitte einen Hinweis, welches Modul ich als sample nehmen kann, evtl. ist ja das wiki falsch / verwirrend!
l.g. erwin
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

rudolfkoenig

Wiki ist zwar nett, aber mAn massgebend sind die Quellen:

% grep noAutocreatedFilelog FHEM/*.pm
FHEM/10_EnOcean.pm:  $hash->{noAutocreatedFilelog} = 1;
FHEM/10_NeuronPin.pm: $hash->{noAutocreatedFilelog} = 1;
FHEM/16_CUL_RFR.pm:  $hash->{noAutocreatedFilelog} = 1;
FHEM/16_STACKABLE.pm:  $hash->{noAutocreatedFilelog} = 1;
FHEM/16_STACKABLE_CC.pm:  $hash->{noAutocreatedFilelog} = 1;
FHEM/36_EleroDrive.pm:  $hash->{noAutocreatedFilelog} = 1;
FHEM/36_EleroSwitch.pm:  $hash->{noAutocreatedFilelog} = 1;
FHEM/53_GHoma.pm:  $hash->{noAutocreatedFilelog} = 1; # kein Filelog bei Autocreate anlegen
FHEM/98_autocreate.pm:      $fl = undef if($modules{$hash->{TYPE}}{noAutocreatedFilelog});