KNX, DbLog und Userreadings

Begonnen von guna83, 13 April 2016, 06:54:35

Vorheriges Thema - Nächstes Thema

guna83

Hallo,

ich habe mittlerweile alles (über 300 Devices  :o ) von EIB auf KNX umgestellt. An sich läuft das echt super, vielen Dank an den Modulentwickler hierfür! Manche Devices muss ich noch "zusammenfassen" - z.B. die x verschiedenen Alarme der Rauchmelder...

Ein kleines Problem habe ich aber noch mit den Userreadings:
Diese werden als "state" geloggt, statt als entsprechendes Reading. Habe z.B. zwei Feuchtesensoren bei denen ich den Taupunkt berechne. Statt Reading "Taupunkt" Value "Wert" wird dann Reading "state", Value "Taupunkt: Wert" ins DbLog geschrieben. Beholfen habe ich mir erstmal mit einer Ergänzung meiner Userreadings in 10_KNX.pm und entsprechendes exclude fürs Update hiervon => gibt es hier irgendeine schönere Lösung oder liegt das einfach an dem Aufbau von LogDb und müsste dort behandelt werden?

Viele Grüße
Guna
1x Intel(R) Atom(TM) with FHEM@2.4GHz, CUNX/KS300, CUNO/Max, KNXD, FTUI 2.2
1x RasPi 2 mit 7" Touch-Display für FTUI

Andi291

Hallo Guna,

was genau meinst Du mit den userreadings? Die Readings der einzelnen GAD (welche ich im direkten Zugriff habe) werden sauber in der DBLog abgelegt.
Poste doch bitte mal ein Beispiel - dann schau ich drüber.

Grüße, Andi

guna83

Kein Problem:

define Umwelt.Feuchte.Wohnen KNX 6/6/10:dpt9 tul
attr Umwelt.Feuchte.Wohnen alias Wohnen
attr Umwelt.Feuchte.Wohnen userReadings Taupunkt {my $dp;; my ($temperature,undef) = split(/ /, ReadingsVal("Temp.EG.Wohnzimmer","state",0));; my ($humidity,undef) =  split(/ /, ReadingsVal("Umwelt.Feuchte.Wohnen","state",0));; my $A = 17.2694;; my $B = ($temperature > 0) ? 237.3 : 265.5;; my $es = 610.78 * exp( $A * $temperature / ($temperature + $B) );; my $e = $humidity/ 100 * $es;; if ($e == 0) { Log 1, "Error: dewpoint() e==0: temp=$temperature, hum=$humidity";; return 0;; } my $e1 = $e / 610.78;; my $f = log( $e1 ) / $A;; my $f1 = 1 - $f;; if ($f1 == 0) { Log 1, "Error: dewpoint() (1-f)==0: temp=$temperature, hum=$humidity";; return 0;; } $dp = $B * $f / $f1 ;;} , temperature { Value("Temp.EG.Wohnzimmer");; }


Um die Userreadings die ich verwende sowie durch das Modul STATISTICS ergänzte Readings sauber in die Datenbank zu bekommen, habe ich Dein Modul 10_KNX in Zeile 635 wie folgt angepasst:
if ($strings[0] =~ m/([sg]etG\d+:)|(sender:)|(.*-[sg]et:.*)|temperature|Taupunkt|statState|Stufe/)
Das ist aber ja leider keine allgemeingültige Anpassung :-( .
1x Intel(R) Atom(TM) with FHEM@2.4GHz, CUNX/KS300, CUNO/Max, KNXD, FTUI 2.2
1x RasPi 2 mit 7" Touch-Display für FTUI

Andi291

Richtig - und genau deshalb würd ich davon Abstand nehmen. Ich weiß aktuell nicht, wie ich die Userreadings aufsplitten könnte. Gibt es Erfahrungen mit einem Modul, wo das funktioniert?

Grüße, Andi

Andi291

Hallo Guna,

also weil Du es bist - bitte um Feedback :-)


guna83

Wow, danke! Baue ich nachher gerne mal ein und gebe Rückmeldung :-D.
Leider weiß ich nicht wie das in anderen Modulen behandelt wird. Zumindest habe ich kein entsprechendes im Einsatz.
1x Intel(R) Atom(TM) with FHEM@2.4GHz, CUNX/KS300, CUNO/Max, KNXD, FTUI 2.2
1x RasPi 2 mit 7" Touch-Display für FTUI

guna83

Hallo Andi,

bei den Userreadings hat das geklappt wie gewünscht. Jetzt habe ich nur noch Probleme mit den Readings vom Modul STATISTICS, diese erzeugen z.B. bei einem meiner Sensoren für die Luftfeuchtigkeit ein reading "statStateTendency" mit dem Wert "1h: -21.12 2h: -48.96 3h: -78.08". Bei dem angepassten Modul von Dir stimmt dann der Readingsname, als Wert wird aber "1h:" und als Einheit "-21.12" genommen.

Ich habe Dein Modul etwas ergänzt, dann kommt es auch mit so aufgebauten Readings aus:
#numeric value?
        if ($strings[$startIndex] =~ /^[+-]?\d*[.,]?\d+/)
        {
                $value = $strings[$startIndex];
                if ( (defined ($strings[$startIndex + 1])) && !($strings[$startIndex+1] =~ /^[+-]?\d*[.,]?\d+/) ) {
                        $unit = $strings[$startIndex + 1] if (defined ($strings[$startIndex + 1]));
                } else {
                        $value = join(" ", @strings[$startIndex..(int(@strings) - 1)]);
                }
        }
        #string or raw
        else
        {
                $value = join(" ", @strings[$startIndex..(int(@strings) - 1)]);
        }
1x Intel(R) Atom(TM) with FHEM@2.4GHz, CUNX/KS300, CUNO/Max, KNXD, FTUI 2.2
1x RasPi 2 mit 7" Touch-Display für FTUI

Andi291

Abend!

Also, wenn das schon so mundgerecht vorbereitet ist :-P

Anbei leicht angepasst...

Andi291


guna83

Hallo Andi,

sorry für die späte Antwort. Eine kleine Modifikation in Zeile 662 habe ich noch vorgenommen:
if ($strings[$startIndex] =~ /^[+-]?\d*[.,]?\d+$/)

Somit wird erkannt, wenn es sich nicht ausschließlich um eine Zahl handelt.
Ohne wurde aus "statStateTendency | 1h: +0.54 2h: +0.60 3h: +1.12 6h" nur "statStateTendency | 1h:".

Viele Grüße
Guna
1x Intel(R) Atom(TM) with FHEM@2.4GHz, CUNX/KS300, CUNO/Max, KNXD, FTUI 2.2
1x RasPi 2 mit 7" Touch-Display für FTUI

Andi291

WAAAAAH!  >:(

Ist eingecheckt...

guna83

1x Intel(R) Atom(TM) with FHEM@2.4GHz, CUNX/KS300, CUNO/Max, KNXD, FTUI 2.2
1x RasPi 2 mit 7" Touch-Display für FTUI