eval: Variablen nun einheitlich verfügbar - putCmd muss leicht angepasst werden

Begonnen von Andi291, 06 Juli 2018, 21:11:59

Vorheriges Thema - Nächstes Thema

Andi291

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

JoeALLb

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! ;-)
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

JoeALLb

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
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

Andi291

Ja.

Es steht nur noch dieser Kontext zur Verfügung:

$hash
$name
$gadName
$state

Über hash und gadName kannst Du Dich zurück hangeln...

JoeALLb

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.
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

JoeALLb

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");
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

Andi291

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");


JoeALLb

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
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

JoeALLb

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
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

Andi291