Problem mit putCMD bei dpt5.001

Begonnen von Hanjo, 09 April 2019, 21:29:13

Vorheriges Thema - Nächstes Thema

Hanjo

Hallo,

folgendes Szenario: ich habe zwei Gruppen

  • 12/6/41:dpt1.001:Mode:nosuffix
  • 12/7/41:dpt5.001:Position:nosuffix
Die Werte können über den Bus abgefragt werden, also habe ich folgenden putCmd definiert:
{
return ReadingsVal($name,"Mode",0) if ($gadName =~ /Mode/);
return ReadingsVal($name,"Position",0) if ($gadName =~ /Position/);
}

Beim Mode funktioniert auch alles so wie es soll, aber bei der Position klappt es nicht. Setze ich in FHEM den Wert von Position auf z.B. 70, wird mir als Wert dort schön brav "70 %" im Reading angezeigt. Außerdem wird $B2 | 70% auf den Bus geschrieben, so wie ich es erwarte. Lese ich nun aber den Wert über den Bus, erhalte ich die Rückmeldung $46 | 27%. Hier scheint also die Umwandlung Hex<->Dec nicht zu klappen. FHEM zeigt mir allerdings weiterhin 70% an.

Gibt es für dpt5 einen Trick?

Danke & Gruß

EIB-Fan

#1
Hallo Hanjo,

ich gehe davon aus, dass dein Gerät auf dpt5.004 in der ETS programmiert ist

dpt 5.001 100%
dpt 5.004 255%

Gruß Jens

Hanjo

Hallo Jens,

habe ich überprüft: in der ETS ist es ebenfalls dpt5.001. Der Wert ist ja auch korrekt wenn ich den normalen "set" Befehl in FHEM verwende.

Gruß
Hanjo

Hanjo

Ok, ich habe mir mal den Quelltext angeschaut. Wird ein "putCmd" ausgeführt triggert dies die Funktion KNX_encodeByDpt, die wiederum KNX_limit triggert und hier wird looks_like_number verwendet. Das Problem ist nun das "70 %" hier nicht "true" zurück liefert und deswegen wird auch nicht von 100 auf 255 hochskaliert und somit der falsche Hex-Wert gesendet.

Versucht man das ganze einfach mit "70" (ohne das %) wird auch der richtige Werte auf den Bus gesendet, nämlich B2.

Ich würde vorschlagen analog zu der Funktion ReadingsNum die Einheiten einfach abzuschneiden. Dafür muss man nur folgende Zeile vor die Zeile mit looks_like_number einfügen:
$value = ($value =~ /(-?\d+(\.\d+)?)/ ? $1 : "");

Und schon funktioniert es.

Grüße
Hanjo

JoeALLb

#4
Und was ist, wenn ich Text ausgeben möchte!
Die richtige lösung wäre doch, ReadingsNum in der putCmd zu verwenden, oder?

Edit: also

{
return ReadingsNum($name,"Mode",0) if ($gadName =~ /Mode/);
return ReadingsNum($name,"Position",0) if ($gadName =~ /Position/);
}


oder sogar
{
return ReadingsNum($name,$gadName,0) if ($gadName =~ /(Mode|Position)/);
}
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

Hanjo

Das war auch mein erster Gedanke, führt aber dazu, dass das Reading in FHEM auch aktualisiert wird, da "70" nicht das gleiche ist wie "70 %", dann hat man ein Event, das Event triggered die DOIFs, etc.

Auf Text sollte mein Vorschlag keine Änderung haben, da in dem Fall (keine Zahl) einfach der Originalwert zurückgegeben wird, siehe 10_KNX.pm. Ein Problem sehe ich höchstens wenn ein Text zurückgegeben werden soll, der eine Zahl enthält. Man könnte das ganze entschärfen, indem man nur am Anfang des Strings nach der Zahl sucht, also
$value = ($value =~ /^(-?\d+(\.\d+)?)/ ? $1 : "");

Danke für die Zusammenfassung, die Variabel $gadName hatte ich an dieser Stelle nicht auf dem Schirm.

Gruß
Hanjo