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
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
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 :-( .
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
Hallo Guna,
also weil Du es bist - bitte um Feedback :-)
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.
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)]);
}
Abend!
Also, wenn das schon so mundgerecht vorbereitet ist :-P
Anbei leicht angepasst...
...und eingechecked.
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
WAAAAAH! >:(
Ist eingecheckt...
Sorry :(