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
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.
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!
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.
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
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
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.
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
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});