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.
Schau mal im Netz nach Perl und Zählschleife.
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';
}
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) {}
}
"off"
oder 'off'
stattoff
Super! Danke!
Werde das alles mal zusammen bauen und dann weiter sehen. Habe das off auch gegen "off" ersetzt.
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 :)
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.
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"}
}
}
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")
}
}