Servus!
Ich habe die Eval-Funktionen gekapselt. bei putCmd und stateCmd steht nun folgender Kontext zur Verfügung:
$hash
$name
$gadName
$state
$state ersetzt $value bei putCmd
PutCmd braucht leichte Anpassungen.
Bisher:
attr myDev putCmd $value = "Mein Prefix " . $value;
Neu:
attr myDev putCmd return "Mein Prefix " . $state;
Grüße, Andi
Danke für die Vereinheitlichung, finde das durchaus konsequenter, gerade auch im Hinblick auf sonst übliche FHEM-Konstrukte.
Somit sollte es auch künftig weniger Supportbedarf produzieren! ;-)
Hallo Andi,
kann es sein dass dadurch auch "$rdString" nicht mehr in stateCmd geht?
bekomme seit einem de rletzten Updates das hier im Log.
"$rdString" requires explicit package name (did you forget to declare "my $rdString"?) at (eval 17698) line 9.
Was kann ich stattdessen nehmen?
sG
Joe
Ja.
Es steht nur noch dieser Kontext zur Verfügung:
$hash
$name
$gadName
$state
Über hash und gadName kannst Du Dich zurück hangeln...
Hallo Andi,
Leider funktioniert das bei mir nicht durchgängig.
wenn ich in putCmd "$name" nutzen möchte, bekomme ich den Namen des IO-Devices, in mienem Fall "KNX" zurück. nicht jedoch den Namen des aktuellen Devices.
Ich habe extra FHEM komplett neu gestartet, um eventuelle Einflüsse von diesem Problem auszuschließen: https://forum.fhem.de/index.php/topic,90865.0.html
Um das zu prüfen, habe ich diese Zeile
Log3 $deviceName, 5, "KNX Eval putCmd: Name: $deviceName hashName: ". $hash->{NAME};
direkt über
$value = KNX_eval ($hash, $gadName, $value, $cmdAttr);
(bei mir aktuell zeile 1291, da ich DPT3.007 ergänzt habe!)
hinzugefügt mit dem Ergebnis:
5: KNX Eval putCmd: Name: knx.Testdevice hashName: KNX
.
Als Workaround habe ich KNX_eval um einen optionalen Parameter ergänzt
KNX_eval ($$$$;$) {
my ($hash, $gadName, $state, $evalString,$newname) = @_;
$name = $newname if $newname ne "";
Und den Aufruf in Zeile 1291 um die Übergabe des Devicenamens ergänzt.
$value = KNX_eval ($hash, $gadName, $value, $cmdAttr, $deviceName);
sG
Joe.
Anbei noch als Patch
--- /10_KNX.pm 2018-09-25 16:08:04.000000000 +0200
+++ /10_KNX.name.pm 2018-09-25 16:31:14.000000000 +0200
@@ -1284,7 +1284,7 @@
{
my $orgValue = $value;
- $value = KNX_eval ($hash, $gadName, $value, $cmdAttr);
+ $value = KNX_eval ($hash, $gadName, $value, $cmdAttr, $deviceName);
#if ($orgValue ne $value)
#try to fix: answer only, if eval was successful
@@ -1548,9 +1548,10 @@
#Private function to encode KNX-Message according DPT
#############################
sub
-KNX_eval ($$$$) {
- my ($hash, $gadName, $state, $evalString) = @_;
+KNX_eval ($$$$;$) {
+ my ($hash, $gadName, $state, $evalString,$newname) = @_;
my $name = $hash->{NAME};
+ $name = $newname if length($newname) > 1;
my $retVal = undef;
Log3 ($name, 5, "Enter eval...name: $name, gadName: $gadName, evalString: \n$evalString\n");
Ne, das nehm ich noch nicht auf. Du reichst hier redundante und nicht eindeutige Daten durch. Zudem ist Deine Analyse nicht vollständig:
Mit dem Log VOR dem Aufruf von KNX-Eval befindest Du Dich noch im falschen Kontext (frag mich jetzt bitte nicht warum, ist aber so). Den Fehler hab ich auch zuerst gemacht-
Was fördert der Logeintrag in KNX-Eval im NIO Fall?
Ich meine den:
Log3 ($name, 5, "Enter eval...name: $name, gadName: $gadName, evalString: \n$evalString\n");
Gar nichts, das ist in meinem Log nicht eingetragen, weil ich nur vom Device verbose auf 5 gesetzt habe, nicht vom TUL-Device. Da hier der Name jedoch vom TUL-Device benutzt wird, erscheint es als verbose-5 eintrag von diesem und wird mir eben nicht ausgegeben.
sG Joe
Nachtrag: Natürlich kann ich ja einfach auch das TUL-Device auf verbose 5 stellen:
Ergebnis;:
5: Enter eval...name: KNX, gadName: testGAD, evalString: [...]
KNX ist mein TUL-Device, also das falsche Device!
Dass die Daten redundant sind, mag sein. Es mag auch bestimmt eine bessere Lösung geben, aber mit meinen Perlkenntnissen habe ich nur das zustande gebracht!
Da das Ergebnis so stimmt, nutze ich im Moment diesen Patch ;-)
sG
Joe
...Grübel...
OK, ich reparier's. Da ist was anderes faul...