[GELÖST] - if von 1-variable Anzahl prüfen

Begonnen von 87insane, 06 Februar 2019, 09:35:17

Vorheriges Thema - Nächstes Thema

87insane

Guten Morgen zusammen,

ich hänge gerade an einem Projekt ein wenig. Hier geht es darum das ich gerne anhand eines Counters der mir eine Zahl ausgibt 1,2,3....ein IF Statement knüpfen möchte.
Beispiel:

if (ReadingsVal("Gerät", "Reading1-[Counter]" ,0) eq off) {
DANN mach etwas....}


Hier steht [Counter] für eine Zahl die sich immer wieder ändern kann.... Es kann eine 1 drin stehen oder eine 12 oder sonst was. Allerdings geht es nur um Integer.
Also es soll geprüft werden ob z.B. alle Readings mit dem Namen Reading1 bis Reading10 = off sind. Wenn ja dann..... Ich schaffe es immer nur eins ab zu fragen oder aber ich würde jedes einzeln in ein IF stecken. Also so:

if (ReadingsVal("Gerät", "Reading1", 0) eq off) {
DANN mach etwas....}
if (ReadingsVal("Gerät", "Reading2", 0) eq off) {
DANN mach etwas....}
if (ReadingsVal("Gerät", "Reading3", 0) eq off) {
DANN mach etwas....}
................................


Ich hoffe man Ihr versteht mich.

Danke schon mal für die Hilfe.

CoolTux

Schau mal im Netz nach Perl und Zählschleife.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Wzut

#2
das mit den ( ) Klammern und den " / ' üben wir aber noch ein bissel :)
for (my $i=1;$i<13;$i++)
{
if (ReadingsVal("Gerät","Reading".$i,"0") eq "off") { blabblub;09:42 06.02.2019  }
}

for (my $i=1;$i<=12;$i++)
{
blablub if ReadingsVal('Gerät','Reading'.$i,'0') eq 'off';
}
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

87insane

Hey und danke erst mal!

Das mit den () und / ist doch korrekt?! / habe ich hier nicht da ich nicht in FHEM unterwegs bin aktuell. Das mit den () ist doch genau wie bei dir? Hab es aber auch einmal nachbearbeitet. Ggf. hattest du da schon auf Antworten geklickt.


Der Link war gut und den habe ich auch sofort beim googlen gesehen. Super....!

Demnach müsste es ja so laufen oder?


foreach $SchleifenAnzahl (1..$ZahlDieImCounterSteht)
{
   if (ReadingsVal("Gerät", "Reading$SchleifenAnzahl" ,0) eq off) {}
}





amenomade

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

87insane

Super! Danke!

Werde das alles mal zusammen bauen und dann weiter sehen. Habe das off auch gegen "off" ersetzt.

nils_

Zitat von: 87insane am 06 Februar 2019, 09:35:17
Also es soll geprüft werden ob z.B. alle Readings mit dem Namen Reading1 bis Reading10 = off sind. Wenn ja dann.....

die anforderung passt glaube ich nicht zu den bisher geposteten beispielen....
aber ich bin auf die ergebnisse gespannt :)
viele Wege in FHEM es gibt!

87insane

Hatte probleme mit der Idee an sich.

Die schleife zählt nun hoch und sollte zb Counter = 5 sein...dann wird in eine variable immer +1 gezählt. Sollte am ende counter und die variable = 5 sein, weiß sie, alles ist Off.
Sollte es aber zb nur 4 in der variablen sein, weis ich, 1 on und 4 mal Off. Poste es am ende hier. Hab aktuell aber nur meim Handy und bin auf der arbeit. Das wird am WE zusammen gebaut.

87insane

Abend zusammen....

nun auch mal die Idee und warum der ganze Kram überhaupt sein muss....
Ich versuche eine Art - "Letzter Wecker Schaltung" zu basteln. Dies wollte ich mit Alex machen und dem Modul 37_echodevices.

Ich habe mal mein Bestes gegeben und das alles in meinem Notepad++ zusammengetippt. Ich bin mir sicher es wird noch Fehler geben aber ich habe keine Zeit mehr das jetzt sofort zu testen.
Der Trigger könnte z.B. eine Aktivierung oder Deaktivierung eines Weckers sein. Oder aber eine feste Zeit, oder beides........

Ich werde es morgen testen und auch debuggen oder aber ggf. mit Eurer Hilfe weiter sein. Poste hier anbei mal meinen Code und dann sehe ich morgen weiter.

Zur Info: Ich habe es über ein Reading gelöst. "LastAlarm" soll am Ende auch immer anzeigen wann wirklich der letzte Wecker geht. Ich selber würde darüber z.B. das SZ Rollo hoch fahren lassen.

foreach $k (1..ReadingsVal("EINE_ALEXA", "alarm_count", "0"))
{
my $alarmoff = "0";
$k = printf("%02d", $k);
my $wecker = ReadingsVal("EINE_ALEXA", "alarm_$k_originalTime" ,"0");
$wecker =~ s/:00.000$//;

if (ReadingsVal("EINE_ALEXA", "alarm_$k_status", "") eq "on" && "$wecker" > ReadingsVal("EINE_ALEXA", "LastAlarm", "0"))
{
fhem("setreading EINE_ALEXA LastAlarm $wecker")
}

elsif (ReadingsVal("EINE_ALEXA", "alarm_$k_status", "") eq "off")
{
$alarmoff = +1;
if ("$alarmoff" eq "$k") {$LastAlarm = "0"}
}
}

87insane

#9
Bis auf den Schleifenzähler, den ich noch anpassen muss, läuft es 1A :)

EDIT: Hab ein Reading angelegt, welches die Anzahl der Wecker vorhält.
Inhalt des Readings: AlarmCount {my $anz = grep( m/alarm_.._status/, ( keys %{$hash->{READINGS}} )); return $anz;} Danke @Byte09 !

(ECHO_123456:alarm_.._status:.(on|off)) {
my $k = "0";
my $alarmoff = "0";
my $schleifennr = "1";
my $lastalarmalexa = "0";

foreach $k (1..ReadingsVal("$NAME", "AlarmCount", ""))
{
$schleifennr = sprintf("%02d", $k);
my $wecker = ReadingsVal("$NAME", "alarm_".$schleifennr."_originalTime" ,"0");
$wecker =~ s/:00.000$//;

if (ReadingsVal("$NAME", "alarm_".$schleifennr."_status", "") eq "on" && "$wecker" gt "$lastalarmalexa")
{
$lastalarmalexa = $wecker;
}

elsif (ReadingsVal("$NAME", "alarm_".$schleifennr."_status", "") eq "off")
{
$alarmoff = $alarmoff + 1;

if (sprintf("%02d", $alarmoff) eq $schleifennr)
{
$lastalarmalexa = 0;
}
}
fhem("setreading $NAME LastAlarm $lastalarmalexa")
}
}