Readings state doppelt vorhanden

Begonnen von Superrakete, 03 Juni 2018, 08:47:36

Vorheriges Thema - Nächstes Thema

Superrakete

Hi!

Nach dem Update werden beim Neustart immer zwei state Readings angelegt. "STATE" und "state". Das STATE Reading wird danach aber nie wieder aktualisiert. Ich vermute das daher auch mein Problem mit den Userreadings aus dem anderen Thread stammt. Bitte mal prüfen.
Wenn ich fhem beende und fhem.save lösche ist beim nächsten Start nur das Reading "state" vorhanden. Nach dem nächsten Restart sind dann wieder beide da.


Gisbert

Hallo Superrakete,

dass beides vorhanden ist, hat schon seine Richtigkeit. Bitte lies mal die Einsteiger-Doku von Fhem durch.

Viele​ Grüße​ Gisbert​
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY

JoWiemann

Zitat von: Gisbert am 03 Juni 2018, 09:53:03
Hallo Superrakete,

dass beides vorhanden ist, hat schon seine Richtigkeit. Bitte lies mal die Einsteiger-Doku von Fhem durch.

Viele​ Grüße​ Gisbert​

Sorry, aber das ist so nicht richtig. Hier wird STATE als Readings generiert. Das STATE, das Du meinst, in ein Internals. Ich vermute, dass der Maintainer selber STATE setzt - was nach Entwicklerregeln nicht zulässig ist, da STATE durch state gesetzt wird, sofern das Attribut stateFormat nicht gesetzt wird - dies allerdings mit der Sub readings...Update, was dann auch nicht richtig wäre, oder er hat sich einfach verschrieben.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

Andi291

Servus!

Ist nicht der Fall. Woher STATE kommt entzieht sich meiner Kenntnis...
Ich habe lediglich an zwei Stellen ein Update auf "state" per ReadingsBulkUpdate...

Grüße, Andi

JoWiemann

Hallo Andi,

ich habe in 10_eib.pm folgendes gefunden:

in Zeile 587 ist folgender Aufruf:

my $tmp = EIB_EncodeByDatapointType($hash, $n, $lh->{STATE}, $gnr);

In EIB_EncodeByDatapointType($$$$) wird der Parameter 3 an -    my ($hash, $name, $value, $gnr) = @_; - an $value übergeben. In der Sub wird $value an verschiedenen Stellen verändert. Sofern $lh->{STATE} als Referenz übergeben wird, wird $lh->{STATE} natürlich auch verändert. Problematisch ist die Nutzung $lh->{STATE} wenn der User stateFormat nutzt.

Da ich mir nicht alles angesehen habe, könnte ich natürlich auch komplett falsch liegen.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

Andi291

Servus!

Das mag sein - 10_EIB warte ich nicht mehr.
Unter 10_KNX dürftest Du nichts finden - zumindest hätte ich dann echt schlampig gesucht :-)

Grüße, Andi

JoWiemann

Hallo Andi,

keinen Stress. Wollte nur wissen ob meine grauen Zellen mit 59 noch zu etwas taugen. Ist mein Gehirn Jogging.

Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

Superrakete

Hi!

Ich habe zur Probe mal 10_EIB.pm gelöscht. Das Problem mit dem doppelten Reading bleibt.

Superrakete

Hi!

Ich habe glaube herausgefunden wo das Problem liegt:

#In case setstate is executed, a readingsupdate is initiated
#############################
sub
KNX_State($$$$) {
my ($hash, $time, $reading, $value) = @_;
my $name = $hash->{NAME};

my $tempStr = join (", ", @_);
Log3 ($name, 5, "enter state: hash: $hash name: $name, attributes: $tempStr");

#in some cases state is submitted within value - if found, take only the stuff after state
#my @strings = split("[sS][tT][aA][tT][eE]", $val);
#$val = $strings[int(@strings) - 1];

return undef if (not (defined($value)));
return undef if (not (defined($reading)));

#remove whitespaces
$value =~ s/^\s+|\s+$//gi;
$reading =~ s/^\s+|\s+$//gi;

$reading = lc ($reading) if ($reading =~ m/[sS][tT][aA][tT][eE]/);
#$reading = $reading if ($reading =~ m/state/i);

Log3 ($name, 5, "state $name: update $reading with value: $value");

#write value and update reading
readingsSingleUpdate($hash, $reading, $value, 1);

return undef;
}


Wenn man in der Routine $reading = $reading if ($reading =~ m/state/i); wieder in $reading = lc ($reading) if ($reading =~ m/[sS][tT][aA][tT][eE]/); ändert so wie es vor dem Update war gibt es auch das doppelte STATE nicht mehr. Bitte mal prüfen.

Andi291

Ja, das mag sein.
Bereits 2017 habe ich umgestellt von manipulierenden Readings auf korrekte regular Expressions. Ich manipuliere also nichts mehr was reinkommt (in diesem Falle state), sondern ignoriere einfach die Schreibweise.

Siehe Kommentar im Sourcecode:
# ABU 20171212 migrated to case-insensitive regex

Das bedeutet aber, es frägt jemand von außen möchte das Reading STATE aktualisieren, und nicht das Reading state. - beispielsweise irgendwas mit DBLog...

Ich werde es nicht wieder zurückändern und damit Anfragen von außen maskieren / verbiegen...