FHEM Forum

FHEM => Sonstiges => Thema gestartet von: VolkerGBenner am 30 April 2023, 18:24:12

Titel: sowas wie Readings-Structure
Beitrag von: VolkerGBenner am 30 April 2023, 18:24:12
Moin,
also :-)
Ich habe in einem Device 4 userreadings die alle nach dem Schema FB_XXX ,FB_YYY... benannt sind und nur die Werte "ja" oder "nein" enthalten können. Jetzt möchte ich ein weiteres userreading (ähnlich einer Structure) anlegen, das "ja" ist, wenn alle FB_.* gleich "nein" sind, ansonsten auf "nein" steht, wenn mindestens eines der FB_.*-Readings auf "ja" steht.
Ich habe das erstamal einfach mit  "if-else" und "&&" ReadingsVal()s erledigt, bin mir aber irgendwie sicher, dass das auch eleganter geht, mir fehlen nur die passenden Zauberworte.


Titel: Aw: sowas wie Readings-Structure
Beitrag von: betateilchen am 30 April 2023, 19:17:46
Das ist doch einfache Mathematik mit 0 und 1?
Du musst nur die Werte der readings aufaddieren und einen entsprechenden Rückgabewert liefern.

defmod d_dummy dummy

setstate d_dummy 2023-04-30 19:13:42 r1 Nein
setstate d_dummy 2023-04-30 19:13:49 r2 Nein
setstate d_dummy 2023-04-30 19:14:28 r3 Ja
setstate d_dummy 2023-04-30 19:14:05 r4 Nein

sub c_dummy {
  my %val = ("Ja",1,"Nein",0 );
  my $result = 0;
  $result += $val{ReadingsVal('d_dummy',"r1","")};
  return "Nein" if $result;
  $result += $val{ReadingsVal('d_dummy',"r2","")};
  return "Nein" if $result;
  $result += $val{ReadingsVal('d_dummy',"r3","")};
  return "Nein" if $result;
  $result += $val{ReadingsVal('d_dummy',"r4","")};
  return "Nein" if $result;
  return "Ja";
}
Titel: Aw: sowas wie Readings-Structure
Beitrag von: betateilchen am 30 April 2023, 19:22:49
Zitat von: VolkerGBenner am 30 April 2023, 18:24:12wenn mindestens eines der FB_.*-Readings auf "ja" steht.

Da die readings ja innerhalb FHEM selbst im device hash stehen, könntest Du natürlich eine loop über die readings bauen. Aber bei nur vier readings lohnt sich der Aufwand meiner Meinung nach nicht.
Titel: Aw: sowas wie Readings-Structure
Beitrag von: TomLee am 30 April 2023, 19:36:18
ZitatDa die readings ja innerhalb FHEM selbst im device hash stehen, könntest Du natürlich eine loop über die readings bauen.

Beispiel dazu wie ich als Perl-DAU das angehen würde:

defmod Demos dummy
attr Demos room Test
attr Demos userReadings result:FB_.* {\
my $v ;;\
my @ar;;\
for my $a ( keys %{$defs{$name}->{READINGS}} ) {\
push @ar, ReadingsVal($name,$a,'nein') if ($a =~ 'FB_');;\
} \
(@ar== grep { $_ eq 'ja' } @ar) ? 'ja' : 'nein';;}

setstate Demos 2023-04-30 19:17:50 FB_XXX ja
setstate Demos 2023-04-30 19:32:36 FB_YYY nein
setstate Demos 2023-04-30 19:08:22 FB_ZZZ ja
setstate Demos 2023-04-30 19:32:36 result nein
Titel: Aw: sowas wie Readings-Structure
Beitrag von: TomLee am 30 April 2023, 20:30:53
Hatte den ersten Beitrag von Betateilchen nicht gelesen/übersehen.

Über einen Hash numerische Werte zu erhalten, um damit rechnen zu können find ich besser gelöst, wie über meine Array-Variante, der Gedanke hat mir gefehlt.

defmod Demos dummy
attr Demos userReadings result:FB_.* {\
my %val = ("ja",0,"nein",1 );;\
my $v = 0;;\
for my $a ( keys %{$defs{$name}->{READINGS}} ) {\
$v += $val{ReadingsVal($name,$a,'')} if ($a =~ 'FB_');;\
} \
return "nein" if $v;;\
return "ja";;}

setstate Demos 2023-04-30 19:17:50 FB_XXX ja
setstate Demos 2023-04-30 20:25:05 FB_YYY ja
setstate Demos 2023-04-30 20:24:51 FB_ZZZ ja
setstate Demos 2023-04-30 20:25:05 result ja
Titel: Aw: sowas wie Readings-Structure
Beitrag von: betateilchen am 30 April 2023, 20:34:42
Dein Code liefert aber das falsche Ergebnis.
Titel: Aw: sowas wie Readings-Structure
Beitrag von: TomLee am 30 April 2023, 20:50:03
Tatsache, ich hab wirklich mehrfach den ersten Beitrag nicht richtig gelesen.

Es tut aber auch net weh die Werte in dem Hash zu tauschen.
Titel: Aw: sowas wie Readings-Structure
Beitrag von: VolkerGBenner am 01 Mai 2023, 10:57:33
Vielen Dank für eure Denk-Zeit.

Hashes ist wohl das Zauberwort das mir fehlte. Hab die bisher gekonnt ignoriert  :-[  O:-) , mir aber jetzt mal zur genaueren Kenntnis gebracht. Sind ja wohl ein sehr zentraler Bestandteil von Perl.

Ich denke damit komme ich weiter.