FHEM Forum

FHEM - Hausautomations-Systeme => KNX/EIB => Thema gestartet von: JoeALLb am 29 August 2018, 09:45:05

Titel: [Patch] PUT: wenn putCMD kein Ergebnis liefert, sollte Reading zurückgegeben
Beitrag von: JoeALLb am 29 August 2018, 09:45:05
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
Titel: Antw:[Patch] PUT: wenn putCMD kein Ergebnis liefert, sollte Reading zurückgegeben
Beitrag von: JoeALLb am 29 August 2018, 10:43:01
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");
+                                }
+
                        }
                        ###/
Titel: Antw:[Patch] PUT: wenn putCMD kein Ergebnis liefert, sollte Reading zurückgegeben
Beitrag von: Andi291 am 29 August 2018, 17:17:06
Interessanter Ansatz...Sicher mit dem undef? Was genau steht denn zu den fraglichen Zeitpunkten in orgValue, bzw. value?
Titel: Antw:[Patch] PUT: wenn putCMD kein Ergebnis liefert, sollte Reading zurückgegeben
Beitrag von: JoeALLb am 30 August 2018, 09:57:39
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
Titel: Antw:[Patch] PUT: wenn putCMD kein Ergebnis liefert, sollte Reading zurückgegeben
Beitrag von: Andi291 am 30 August 2018, 19:30:08
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.
Titel: Antw:[Patch] PUT: wenn putCMD kein Ergebnis liefert, sollte Reading zurückgegeben
Beitrag von: JoeALLb am 04 September 2018, 14:01:46
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
Titel: Antw:[Patch] PUT: wenn putCMD kein Ergebnis liefert, sollte Reading zurückgegeben
Beitrag von: Andi291 am 04 September 2018, 20:44:52
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?
Titel: Antw:[Patch] PUT: wenn putCMD kein Ergebnis liefert, sollte Reading zurückgegeben
Beitrag von: JoeALLb am 05 September 2018, 10:08:52
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