[Patch] PUT: wenn putCMD kein Ergebnis liefert, sollte Reading zurückgegeben

Begonnen von JoeALLb, 29 August 2018, 09:45:05

Vorheriges Thema - Nächstes Thema

JoeALLb

Hallo,

wenn putCmd den Wert nicht ändert
sollte der Inhalt des Readings als Wert als Fallback zurückgegeben werden.
Ansonsten müsste im Moment für jede einzelne GAD ein Eintrag in putCmd erstellt werden,
wenn nicht das alte Verhalten mit anwnserreading verwendet wird. Für viele

Wenn man diese Zeilen ab Zeile #1294 im Modul einfügt, wird
dieser Fall abgedeckt.

EDIT: Neuer Patch im nächsten Post:
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 der Patch in überarbeiteter Form.
Er verhindert auch, dass das Reading bei JEDER get-Anfrage aktualisiert wird.
Die Prüfung auf "$orgValue ne $value" hat immer zugeschlagen da $value ohne
answerreading immer undef ist. Somit wurde das Reading jedes mal neu geschrieben, was jedoch nicht korrekt ist.

diff -Naur org/10_KNX.pm 10_KNX.pm

--- org/10_KNX.pm       2018-08-19 14:45:19.000000000 +0200
+++ 10_KNX.pm   2018-08-29 10:36:04.520942115 +0200
@@ -1275,20 +1276,29 @@
                                }
                        }

+                       #mid priority read
+                        if (length($value )< 1){
+                          $value = ReadingsVal($deviceName, $gadName, undef) ;
+                          Log3 ($deviceName, 5, "reading current value to compare if putCmd changes it");
+                       }
+
                        #high priority - eval
                        ###
                        my $cmdAttr = AttrVal($deviceName, "putCmd", undef);
                        if (defined ($cmdAttr) and !($cmdAttr eq ""))
                        {
                                my $orgValue = $value;
-
                                $value = KNX_eval ($hash, $gadName, $value, $cmdAttr);

                                if ($orgValue ne $value)
                                {
-                                       Log3 ($deviceName, 5, "parse device hash (r): $deviceHash name: $deviceName - put replaced via command $cmdAttr - value: $value");
+                                       Log3 ($deviceName, 5, "parse device hash (r): $deviceHash name: $deviceName - put replaced via command $cmdAttr - value: $value org: $orgValue");
                                        readingsSingleUpdate($deviceHash, $putString, $value,1);
-                               }
+                               }
+                                else {
+                                        Log3 ($deviceName, 5, "putCmd did not set a value, no update needed. Current value is: $value");
+                                }
+
                        }
                        ###/
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

Interessanter Ansatz...Sicher mit dem undef? Was genau steht denn zu den fraglichen Zeitpunkten in orgValue, bzw. value?

JoeALLb

value wird knapp drüber mit undef initialisiert.
Danach kommt nur der Block wo der alte Modus "answerReading" abgefragt wird.

Wird das nicht genutzt, ist value also immer noch undef.

Danach kommt der puCmd-Block. Wird dort nichts gesetzt, bleibt value undef.

Darum wäre das mit dieser Lösung so "durchgängig". Jedoch wußte ich zu dem Zeitpunkt diese
Definition aus dem anderenThread noch nicht:
Zitat von: Andi291 am 29 August 2018, 16:00:43
Implementiert ist folgendes:

Set: kann empfangen, kann antworten, kann "set", kann nicht "get"
Get: kann empfangen, kann antworten, kann "get", kann nicht "set"
Listenonly: kann empfangen, kann nicht antworten, kann nicht "get", kann nicht "set"

Schreibe ich bei Gelegenheit so in die Doku.

Wenn Du keine Antwort vom Device haben willst, muss putCmd für dieses Reading "undef" sein.

Meiner Meinung nach braucht es also noch eine Option die regelt, ob Antworten erlaubt sind oder nicht....
Denn dass Set,Get,Listenonly in der Definition, "Put" jedoch über das Attribut putCmd als Perlcode geregelt werden muss, ist nicht ganz durchgängig...


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

Spätestens hier dürfte aber nicht mehr "undef" drinstehen, maximal "ERROR".

$value = KNX_eval ($hash, $gadName, $value, $cmdAttr);

Kannst da nochmal schauen?

Probier mal den Anhang, bitte.

JoeALLb

Servus, sorry, brauchte eine Weile zum Testen.
Funktioniert nicht vollständig.
Bei einer Leseanfrage wird jetzt das Reading nicht mehr aktualisiert, aber bei Temperaturdevices wird jetzt die falsche Temperatur "0" gesendet,
wenn putCmd kein Ergebnis liefert.

Hier ein verbose 5 dazu-

5: parse: process message, device-name: knx.Device, rd-name: temp-return, gadCode: 01243, model: dpt9.001
5: received hash (r): HASH(0x559a57f87cf8) name: knx.Device, GET
5: encode value: ERROR, gadName: temp-return
5: encode model: dpt9.001, code: dpt9, value: ERROR
5: encode model: dpt9.001, code: dpt9, value: ERROR, numval: 0, hexval: 000000
5: received, send answer hash: HASH(0x559a57f87cf8) name: knx.Device, GET: 000000, READING: temp-return
5: parse: process message, device-name: knx.Device, rd-name: temp-return, gadCode: 01243, model: dpt9.001
5: received hash (r): HASH(0x559a57f87cf8) name: knx.Device, GET
5: encode value: ERROR, gadName: temp-return
5: encode model: dpt9.001, code: dpt9, value: ERROR
5: encode model: dpt9.001, code: dpt9, value: ERROR, numval: 0, hexval: 000000
5: received, send answer hash: HASH(0x559a57f87cf8) name: knx.Device, GET: 000000, READING: temp-return


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

Wird immer komischer.


Kannst Du bitte:

#if ($orgValue ne $value)
#try to fix: answer only, if eval was successful
if (($orgValue ne $value) and ($value !~ m/ERROR/i))


durch

if ($orgValue ne $value)
#try to fix: answer only, if eval was successful
#if (($orgValue ne $value) and ($value !~ m/ERROR/i))


ersetzen und nochmal probieren?

JoeALLb

Hallo Andi,

ich kann das heute nach einem FHEM Restart nicht mehr reproduzieren! Das es also komisch ist, kann ich bestätigen!
Ich vermute, dass dies mit einem, der anderen heute gemeldeten Punkte zusammenhängt und zu einer Kreuzreaktion gekommen ist,
denn in meiner Installation wird im Moment viel gearbeitet, ein "defmod" kommt daher häufig vor!

Für mich funktioniert im Moment die Version, so wie sie oben angehängt ist, für das Thema hier!
Ich würde die Version so einchecken!

Danke,

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