sowas wie Readings-Structure

Begonnen von VolkerGBenner, 30 April 2023, 18:24:12

Vorheriges Thema - Nächstes Thema

VolkerGBenner

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.


1x  RasPiB3+  mit RPI-RF-MOD und piccu3
1x HM-TC-IT-WM-W-EU, 1x HM-CC-RT-DN, 1xHM-SEC-SCo,
HM-LC-Sw4-DR, HM-WDS30-OT2-SM, HM-Dis-WM55, 7x HmIP-eTRV-B,

betateilchen

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";
}
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

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

TomLee

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

betateilchen

Dein Code liefert aber das falsche Ergebnis.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

Tatsache, ich hab wirklich mehrfach den ersten Beitrag nicht richtig gelesen.

Es tut aber auch net weh die Werte in dem Hash zu tauschen.

VolkerGBenner

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.
1x  RasPiB3+  mit RPI-RF-MOD und piccu3
1x HM-TC-IT-WM-W-EU, 1x HM-CC-RT-DN, 1xHM-SEC-SCo,
HM-LC-Sw4-DR, HM-WDS30-OT2-SM, HM-Dis-WM55, 7x HmIP-eTRV-B,