Readings werden zwischen verschiedenen Geräten kopiert

Begonnen von rr2000, 27 Mai 2014, 11:16:16

Vorheriges Thema - Nächstes Thema

Joachim

Moin Rudi,

Entschuldigung angenommen.
Ich versuche gerade, das ganze auf einem zweiten System nach zustellen, da ich mein Produktivsystem nicht zerlegen will, und als Vergleich behalten möchte. Sowie ich das geschafft habe, poste ich die fhem.cfg.

@rr2000,
wie komme ich an den hash-Eintrag?

Gruß Joachim
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

rr2000

Also mein Debug-Code in SHC_Dev_Parse() sieht so aus:


  my $r = $rhash->{READINGS};
  foreach my $c (sort keys %{$r}) {
    my $rd = $r->{$c};
    foreach my $cc (sort keys %{$rd}) {
      my $rrd = $rd->{$cc};
      print "$rname $c: $rd -> $cc: $rrd\n";
    }
  }


damit erhalte ich nach einem frischen Start von fhem (rm log/*) folgende Debugausgaben.


SHC_Dev_20 brightness: HASH(0x1e93930) -> TIME: 2014-05-27 15:10:46
SHC_Dev_20 brightness: HASH(0x1e93930) -> VAL: 42
SHC_Dev_20 state: HASH(0x1e93870) -> TIME: 2014-05-27 15:11:04
SHC_Dev_20 state: HASH(0x1e93870) -> VAL: T: 25.3 Baro: 946.46 B: 42
SHC_Dev_20 temperature: HASH(0x1e93630) -> TIME: 2014-05-27 15:11:04
SHC_Dev_20 temperature: HASH(0x1e93630) -> VAL: 25.3
SHC_Dev_23 brightness: HASH(0x1e95230) -> TIME: 2014-05-27 15:11:02
SHC_Dev_23 brightness: HASH(0x1e95230) -> VAL: 65
SHC_Dev_23 humidity: HASH(0x1e939f0) -> TIME: 2014-05-27 15:10:54
SHC_Dev_23 humidity: HASH(0x1e939f0) -> VAL: 48.9
SHC_Dev_23 state: HASH(0x1e937e0) -> TIME: 2014-05-27 15:11:02
SHC_Dev_23 state: HASH(0x1e937e0) -> VAL: T: 24.49 H: 48.9 B: 65
SHC_Dev_23 temperature: HASH(0x1e8dd50) -> TIME: 2014-05-27 15:10:54
SHC_Dev_23 temperature: HASH(0x1e8dd50) -> VAL: 24.49


Alles in Ordnung. Danach stoppe ich fhem mit "shutdown". Und schaue mir log/fhem.save an.


setstate SHC_Dev_20 T: 25.3 Baro: 946.46 B: 42
setstate SHC_Dev_20 2014-05-27 15:11:04 barometric_pressure 946.46
setstate SHC_Dev_20 2014-05-27 15:11:10 brightness 42
setstate SHC_Dev_20 2014-05-27 15:11:26 distance 0   <==== Fehler
setstate SHC_Dev_20 2014-05-27 15:11:26 humidity 0   <==== Fehler
setstate SHC_Dev_20 2014-05-27 15:11:10 state T: 25.3 Baro: 946.46 B: 42
setstate SHC_Dev_20 2014-05-27 15:11:04 temperature 25.3
setstate SHC_Dev_23 T: 24.42 H: 49.1 B: 65
setstate SHC_Dev_23 2014-05-27 15:11:26 barometric_pressure 0   <==== Fehler
setstate SHC_Dev_23 2014-05-27 15:11:02 brightness 65
setstate SHC_Dev_23 2014-05-27 15:11:26 distance 0   <==== Fehler
setstate SHC_Dev_23 2014-05-27 15:11:21 humidity 49.1
setstate SHC_Dev_23 2014-05-27 15:11:21 state T: 24.42 H: 49.1 B: 65
setstate SHC_Dev_23 2014-05-27 15:11:21 temperature 24.42
setstate SHC_PS_40_notify_on active


Ab hier wird der Fehler sichtbar. Die Default-Werte werden in WriteStatefile() in fhem.save geschrieben

my $rd = $r->{$c};
if(!defined($rd->{TIME})) {
    Log 4, "WriteStatefile $d $c: Missing TIME, using current time";
    $rd->{TIME} = TimeNow();
}

if(!defined($rd->{VAL})) {
    Log 4, "WriteStatefile $d $c: Missing VAL, setting it to 0";
    $rd->{VAL} = 0;
}


rr2000

Noch klarer kann man es sehen, wenn man auch alle Hash-Einträge ausgibt:

 
  my $r = $rhash->{READINGS};
  foreach my $c (sort keys %{$r}) {
    my $rd = $r->{$c};
    print "$rname $c: $rd\n";   # Print also empty entries <=====
    foreach my $cc (sort keys %{$rd}) {
      my $rrd = $rd->{$cc};
      print "$rname $c: $rd -> $cc: $rrd\n";
    }
  }


dann tauchen die Einträge sofort nach einem frischen Start (rm log/* && ./fhem.pl fhem.cfg) auf, als Readings ohne {VAL} und {TIME}:


SHC_Dev_20 barometric_pressure: HASH(0x30a1518)
SHC_Dev_20 barometric_pressure: HASH(0x30a1518) -> TIME: 2014-05-27 15:31:43
SHC_Dev_20 barometric_pressure: HASH(0x30a1518) -> VAL: 946.48
SHC_Dev_20 brightness: HASH(0x30a8e98)
SHC_Dev_20 distance: HASH(0x30a8ec8)       <===== Fehler **************************************
SHC_Dev_20 humidity: HASH(0x30a8e68)       <===== Fehler **************************************
SHC_Dev_20 state: HASH(0x30a8ef8)
SHC_Dev_20 state: HASH(0x30a8ef8) -> TIME: 2014-05-27 15:31:43
SHC_Dev_20 state: HASH(0x30a8ef8) -> VAL: T: 24.85 Baro: 946.48
SHC_Dev_20 temperature: HASH(0x30a1440)
SHC_Dev_20 temperature: HASH(0x30a1440) -> TIME: 2014-05-27 15:31:43
SHC_Dev_20 temperature: HASH(0x30a1440) -> VAL: 24.85

Joachim

#18
@ rr2000,
hast Du zufällig dewpoint bei Dir am laufen?
oder
userReadings, die auf ein anderes Device mappen?

@ Rudi,
hier die Minimal fhem.cfg, mit der sich das Problem nachstellen lässt:

attr global autoload_undefined_devices 1
attr global logfile ./log/fhem-%Y-%m.log
attr global modpath .
attr global motd none
attr global mseclog 1
attr global statefile ./log/fhem.save
attr global updateInBackground 1
attr global userattr DbLogExclude devStateIcon devStateStyle icon sortby webCmd widgetOverride
attr global verbose 3
define telnetPort telnet 7072 global

define WEB FHEMWEB 8083 global
attr WEB menuEntries rereadcfg,cmd=rereadcfg,restart,cmd=shutdown restart,update,cmd=update,updatecheck,cmd=update+check,updateforce,cmd=update+force

# Fake FileLog entry, to access the fhem log from FHEMWEB
define Logfile FileLog ./log/fhem-%Y-%m.log fakelog

define eventTypes eventTypes ./log/eventTypes.txt

##############################################################################################

define dew_all dewpoint dewpoint .* Temperatur Feuchte dewpoint

##############################################################################################

define onewire OWX /dev/ttyUSB0
attr onewire room OWX

define OWX_01_2C5987150000 OWID 01 2C5987150000
attr OWX_01_2C5987150000 IODev onewire
attr OWX_01_2C5987150000 model DS2401
attr OWX_01_2C5987150000 room OWX
attr OWX_01_2C5987150000 stateFormat {ReadingsVal($name,"present",0) ? "present" : "not present"}

#############################################################################################

define TS_Bad OWTHERM DS18B20 4638BA030000 300
attr TS_Bad IODev onewire
attr TS_Bad model DS1822
attr TS_Bad room Bad
attr TS_Bad stateFormat {( int (ReadingsVal("TS_Bad","temperature",0) * 10 + 0.5 ) / 10)." °C"}
attr TS_Bad tempHigh 25
attr TS_Bad tempLow 0
attr TS_Bad userReadings Temperatur {( int (ReadingsVal("TS_Bad","temperature",0) * 10 + 0.5 ) / 10)}

define FS_Bad OWMULTI DS2438 362E27010000 300
attr FS_Bad IODev onewire
attr FS_Bad event-min-interval Temperatur:600,Feuchte:600,V:600,VAD:600
attr FS_Bad event-on-change-reading Temperatur,Feuchte,V,VAD
attr FS_Bad icon tropfen
attr FS_Bad model DS2438
attr FS_Bad room Bad
attr FS_Bad stateFormat {sprintf("T: %.1f H: %.1f D: %.1f",ReadingsVal("FS_Bad","Temperatur",0), ReadingsVal("FS_Bad","Feuchte",0), ReadingsVal("FS_Bad","dewpoint",0))}
attr FS_Bad userReadings VAD {(ReadingsVal("FS_Bad","voltage",0) * 1000 + 0.5) / 1000 },V {(ReadingsVal("FS_Bad","VDD",0) * 1000 + 0.5) / 1000 },Temperatur { ReadingsVal("TS_Bad","Temperatur",0) },Feuchte:V { int((((((ReadingsVal("FS_Bad","VAD",0)) + 0.0)/(ReadingsVal("FS_Bad","V",0)) - 0.1515) / 0.00636) / (1.0546 - 0.00216 * (ReadingsVal("FS_Bad","Temperatur",0)))) * 10 + 0.5 ) / 10 }



Bei Entfernen von dewpoint, oder dem Entfernen der userReadings, die auf ein anderes Device mappen verschwindet das Problem.
FHEM mit update force von heute.
So, kann jetzt nicht mehr weitertesten, muss gleich zur Arbeit.

Gruß Joachim
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

rudolfkoenig

Zitatdann tauchen die Einträge sofort nach einem frischen Start (rm log/* && ./fhem.pl fhem.cfg) auf, als Readings ohne {VAL} und {TIME}:

Damit kann man was anfangen:
- Wo ist fhem.state gespeichert?
- kannst du bitte folgende Funkion

sub
CheckR($)
{
  my $txt = shift;
  Log 1, "CheckR $txt";
  foreach my $d (sort keys %defs) {
    next if(!$defs{$d}{READINGS} || $defs{$d}{READINGSCHECKED});
    foreach my $r (sort keys %{$defs{$d}{READINGS}}) {
      if(!defined($defs{$d}{READINGS}{$r}{VAL}) ||
         !defined($defs{$d}{READINGS}{$r}{TIME})) {
        Log 1, "*** $d -> $r: $defs{$d}{READINGS}{$r} at $txt";
        Log 1, "    K:".join(",",sort keys %{$defs{$d}{READINGS}{$r}});
      }
      $defs{$d}{READINGSCHECKED} = 1;
    }
  }
}

in fhem.pl einbauen, und es z.Bsp. aus fhem.pl/CommandDefine mit
CheckR("DEF $def")
aufrufen?
Habs gerade beim testen mit fhem.cfg.demo gesehen, dass GUEST ein aehnliches Problem hat, die Ursache ist eine unvorsichtige Pruefung per
defined( $hash->{READINGS}{state}{VAL} )
in GUEST_Set, was ein leeres $hash->{READINGS}{state} anlegt, falls sie noch nicht existiert. Sowas vermute ich auch in eurem Fall.

rudolfkoenig

@Joachim: da ich kein OneWire habe, hilft mir das erstmal nicht, ich habe es jetzt zwar kurz getestet, ich sehe aber keine Probleme, abgesehen von den tausenden Meldungen, die bestaetigen, dass ich kein OneWire habe.

Joachim

@ Rudi,

mal sehen, vielleicht bekomme ich in der Nachtschicht was OneWire freies gebastelt.

Gruß Joachim
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

rr2000

Zitat von: rudolfkoenig am 27 Mai 2014, 16:18:05
Damit kann man was anfangen:
- Wo ist fhem.state gespeichert?
- kannst du bitte folgende Funkion
in fhem.pl einbauen, und es z.Bsp. aus fhem.pl/CommandDefine mit
CheckR("DEF $def")
aufrufen?
Wie genau?

Zitat von: rudolfkoenig am 27 Mai 2014, 16:18:05
Habs gerade beim testen mit fhem.cfg.demo gesehen, dass GUEST ein aehnliches Problem hat, die Ursache ist eine unvorsichtige Pruefung per
defined( $hash->{READINGS}{state}{VAL} )
in GUEST_Set, was ein leeres $hash->{READINGS}{state} anlegt, falls sie noch nicht existiert. Sowas vermute ich auch in eurem Fall.

Stimmt, das ist bei mir der Fall!

   if (defined($rhash->{READINGS}{$state_format_arr->[$i]}{VAL})) {


Ich werds noch testen. Danke für die Hilfe!

Gruß,
Stefan

rr2000

#23
OK, wenn man es richtig macht funktioniert es auch.

      if ((defined($rhash->{READINGS}{$state_format_arr->[$i]})
         && defined($rhash->{READINGS}{$state_format_arr->[$i]}{VAL}))) {


Nochmals danke und bitte verzeih mir den Hochmut den Fehler in der fhem.pl vermutet zu haben  ;)

Gruß,
Stefan

Joachim

Moin Rudi,

Ich entschuldige mich ersteinmal, dass ich die fhem.pl in Verdacht hatte, es kann auch die 98_dewpoint.pm sein, womit der Ball dann bei mir liegt.

Zum nachstellen reicht folgende fhem.cfg:

attr global autoload_undefined_devices 1
attr global logfile ./log/fhem-%Y-%m.log
attr global modpath .

attr global mseclog 1
attr global statefile ./log/fhem.save
attr global updateInBackground 1
attr global userattr DbLogExclude devStateIcon devStateStyle icon sortby webCmd widgetOverride
attr global verbose 3
define telnetPort telnet 7072 global

define WEB FHEMWEB 8083 global

# Fake FileLog entry, to access the fhem log from FHEMWEB

#define autocreate autocreate
#attr autocreate filelog ./log/%NAME-%Y.log

define eventTypes eventTypes ./log/eventTypes.txt

###################################################################################################

define dew_all dewpoint dewpoint .* temperature humidity dewpoint

define alive dummy
attr alive room Alive
attr alive setList 0 1
attr alive userReadings temperature { ReadingsVal("alive","state",0) }

define at_alive at +*00:01:00 {if ("$value{alive}" == 0) {fhem("set alive 1")} else {fhem("set alive 0")}}
attr at_alive room Alive

####################################################################################################


nach einem Save config gibt es dann ein Phantom Reading "humidity"
mich wundert, dass das noch keinem aufgefallen ist.

Gruß Joachim
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

Joachim

Moin Rudi,

konntest Du das Phantom Reading nachstellen?

Gruß Joachim
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

rudolfkoenig

Habs nicht probiert, fuer dewpoint fuehle ich mich nicht zustendig.

Joachim

Dass Du nicht für dewpoint zuständig bist, weiß ich.

Die Fragen sind:
1. Tritt das ganze nur bei mir auf?
2. Da es bei mir nur bei Save config, rereadconfig und restart auftritt, und die Einbindung in FHEM ja deutlich von normalen Modulen abweicht, wo liegt der Fehler? Dewpoint selber schreibt nicht in die fhem.save, und solange die nicht durch FHEM bedient wird, taucht das Phantom Reading nicht auf.

Gruß Joachim
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232

rudolfkoenig

1. Nein, ich konnte es auch nachstellen.
2. Vermutlich in dewpoint.pm, da habe ich solche Zeilen gesehen:
if (defined($dev->{READINGS}{$hum_name}{VAL}) && defined($dev->{READINGS}{$temp_name}{TIME})) {
die das beschriebene Effekt haben. Ich empfehle ReadingsVal/ReadingsTimestamp, die das Problem vermeiden.

Willi (Maintainer von dewpoint) hat unlaengst geschrieben, dass er das Modul an Olaf/Joachim :) abgeben will, das ist aber laut Maintainer.txt wohl noch nicht geschehen. Trotzdem sollte man eine neue Diskussion mit passenden Titel im passenden Bereich (Automatisierung) oeffnen.

Joachim

Moin Rudi,
Danke für die Rückmeldung.
Du hast Recht, dass ich das Modul von Willi übernehme, bin nur noch nicht dazugekommen, das in der Maintainers.txt zu ändern.
Werde mich jetzt mal mit Deinen Informationen auf die Suche machen, und den Fehler beseitigen.

Gruß Joachim
FHEM aktuellste Version auf FB 7570 und 7390 mit Zebradem Toolbox Freetz
FHEM auf Raspberry
1-Wire mit LinkUSBi und Rs-Pi ds2482-800  1-Wire-9 Board; Max mit Cube, HMLAN
div. 1-Wire Sensoren; MAX-Thermostaten; Homematic-Komponenten, Zehnder KWL über RS-232