FHEM Forum

FHEM - Hausautomations-Systeme => KNX/EIB => Thema gestartet von: guna83 am 13 April 2016, 06:54:35

Titel: KNX, DbLog und Userreadings
Beitrag von: guna83 am 13 April 2016, 06:54:35
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
Titel: Antw:KNX, DbLog und Userreadings
Beitrag von: Andi291 am 13 April 2016, 07:45:56
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
Titel: Antw:KNX, DbLog und Userreadings
Beitrag von: guna83 am 13 April 2016, 07:59:09
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 :-( .
Titel: Antw:KNX, DbLog und Userreadings
Beitrag von: Andi291 am 13 April 2016, 10:43:27
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
Titel: Antw:KNX, DbLog und Userreadings
Beitrag von: Andi291 am 13 April 2016, 19:32:46
Hallo Guna,

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

Titel: Antw:KNX, DbLog und Userreadings
Beitrag von: guna83 am 14 April 2016, 06:57:05
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.
Titel: Antw:KNX, DbLog und Userreadings
Beitrag von: guna83 am 14 April 2016, 15:56:32
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)]);
        }
Titel: Antw:KNX, DbLog und Userreadings
Beitrag von: Andi291 am 14 April 2016, 19:57:00
Abend!

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

Anbei leicht angepasst...
Titel: Antw:KNX, DbLog und Userreadings
Beitrag von: Andi291 am 16 April 2016, 19:10:01
...und eingechecked.
Titel: Antw:KNX, DbLog und Userreadings
Beitrag von: guna83 am 16 April 2016, 19:34:53
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
Titel: Antw:KNX, DbLog und Userreadings
Beitrag von: Andi291 am 16 April 2016, 19:42:17
WAAAAAH!  >:(

Ist eingecheckt...
Titel: Antw:KNX, DbLog und Userreadings
Beitrag von: guna83 am 16 April 2016, 19:44:58
Sorry  :(