FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Maxl am 11 September 2023, 20:33:50

Titel: DOIF Abfrage
Beitrag von: Maxl am 11 September 2023, 20:33:50
Hallo,

leider bin ich nicht so firm in Perl, seit dem Update verlangt die "motion" Abfrage das "on (to nanoCUL)"
wie kann man ganz einfach in Perl eine beinhaltet StringAbfrage mit nur dem "on" bewerkstellingen.
Ich habe
my $substring = "s1.domain.example";
    if ($mystring =~ /\Q$substring\E/) {
   print qq("$mystring" contains "$substring"\n);
}

gefunden, aber wie baut man dies in den FHEM Befehl ein?

define Licht_an_Haustuer DOIF (([Bewegungsmelder_EG:motion] eq "on (to nanoCUL)" and [Bewegungsmelder_EG:brightness] < 68) or \
                              [MQTT2_shelly4pro_4D114C:input0] eq "1" or [MQTT2_shelly4pro_4D114C:input2] eq "1") \
                              (set MQTT2_shelly4pro_4D114C relay0 on)
Titel: Aw: DOIF Abfrage
Beitrag von: Torxgewinde am 11 September 2023, 22:00:28
So ganz generell in Perl wäre es so:

my $bla = "on (to nanoCul)";

if ($bla =~ /on/) {
    # Code to execute if "on" is found in $bla
    print "The string contains 'on'\n";
} else {
    # Code to execute if "on" is not found in $bla
    print "The string does not contain 'on'\n";
}


Probier mal folgenes DOIF:
define Licht_an_Haustuer DOIF (([Bewegungsmelder_EG:motion] =~ /on/ and [Bewegungsmelder_EG:brightness] < 68) or \
                              [MQTT2_shelly4pro_4D114C:input0] eq "1" or [MQTT2_shelly4pro_4D114C:input2] eq "1") \
                              (set MQTT2_shelly4pro_4D114C relay0 on)

Mit einem Dummy kann man es ausprobieren:
defmod Licht_an_Haustuer DOIF ( [Bewegungsmelder_EG:motion] =~ /on/  and [Bewegungsmelder_EG:brightness] < 68 )\
{ Log(1,"Fall #1") }\
DOELSE\
{ Log(1,"Fall #2") }
attr Licht_an_Haustuer room Test

setstate Licht_an_Haustuer cmd_2
setstate Licht_an_Haustuer 2023-09-11 22:10:34 Device Bewegungsmelder_EG
setstate Licht_an_Haustuer 2023-09-11 22:10:34 cmd 2
setstate Licht_an_Haustuer 2023-09-11 22:10:34 cmd_event Bewegungsmelder_EG
setstate Licht_an_Haustuer 2023-09-11 22:10:34 cmd_nr 2
setstate Licht_an_Haustuer 2023-09-11 22:10:34 e_Bewegungsmelder_EG_motion off (to nanoCul)
setstate Licht_an_Haustuer 2023-09-11 22:10:03 mode enabled
setstate Licht_an_Haustuer 2023-09-11 22:10:34 state cmd_2


defmod Bewegungsmelder_EG dummy
attr Bewegungsmelder_EG readingList motion brightness
attr Bewegungsmelder_EG room Test
attr Bewegungsmelder_EG setList motion brightness

setstate Bewegungsmelder_EG 2023-09-11 22:06:48 brightness 60
setstate Bewegungsmelder_EG 2023-09-11 22:10:34 motion off (to nanoCul)
setstate Bewegungsmelder_EG 2023-09-11 22:04:46 wert 123
Titel: Aw: DOIF Abfrage
Beitrag von: Maxl am 12 September 2023, 20:33:06
Danke hat funktioniert, dann noch eine kurze Frage, wie verneint man die Abfrage, also das "on" sollte nicht enthalten sein?
Habe     unless($string =~ /hello/)  gefunden, aber das mag er irgendwie nicht

define Licht_an_Haustuer DOIF (([Bewegungsmelder_EG:motion] =~ /on/ and [Bewegungsmelder_EG:brightness] < 68) or \
                              [MQTT2_shelly4pro_4D114C:input0] eq "1" or [MQTT2_shelly4pro_4D114C:input2] eq "1") \
                              (set MQTT2_shelly4pro_4D114C relay0 on)
Titel: Aw: DOIF Abfrage
Beitrag von: Torxgewinde am 13 September 2023, 07:25:57
Hallo,
FHEM ist in Perl programmiert und bedient sich an dieser Stelle der Operatoren. Was du vermutlich nutzen willst ist dann !~ anstelle von =~. Bitte beachte, dass die Suche nach "Hello" andere Ergebnisse liefert als die Suche nach "wenn on gefunden --> false, falls on nicht gefunden --> true".

Vorher: Falls on gefunden --> 1 (true), 0 (false) wenn nicht gefunden
Negiert: Falls on gefunden --> 0 (false), 1 (true) wenn nicht gefunden
Suche nach hello: Falls hello gefunden --> 1 (true), 0 (false) wenn hello nicht gefunden - hier ist keine Aussage über on im String enthalten, außer die Werte vom Sensor sind dann in ihren Möglichkeiten beschränkt.

Zum Ausprobieren: jdoodle.com/ia/Mp7 (http://jdoodle.com/ia/Mp7)
my @examples = (
    "on (to nanoCUL)",
    "off (to nanoCUL)",
    "Hello, World!",
    "Goodbye, World!",
);

# Überprüfen der Beispiele
foreach my $example (@examples) {
    my $contains_on = ($example =~ /on/);
    my $does_not_contain_on = !($example =~ /on/);
    my $contains_hello = ($example =~ /hello/i);
    my $does_not_contain_hello = !($example =~ /hello/i);
   
    print "Beispiel: \"$example\"\n";
    print "Enthält 'on': " . ($contains_on ? "Ja" : "Nein") . "\n";
    print "Enthält nicht 'on': " . ($does_not_contain_on ? "Ja" : "Nein") . "\n";
    print "Enthält 'hello': " . ($contains_hello ? "Ja" : "Nein") . "\n";
    print "Enthält nicht 'hello': " . ($does_not_contain_hello ? "Ja" : "Nein") . "\n\n";
}

Ausgabe ist dann sowas:
Beispiel: "on (to nanoCUL)"
Enthält 'on': Ja
Enthält nicht 'on': Nein
Enthält 'hello': Nein
Enthält nicht 'hello': Ja

Beispiel: "off (to nanoCUL)"
Enthält 'on': Nein
Enthält nicht 'on': Ja
Enthält 'hello': Nein
Enthält nicht 'hello': Ja

Beispiel: "Hello, World!"
Enthält 'on': Nein
Enthält nicht 'on': Ja
Enthält 'hello': Ja
Enthält nicht 'hello': Nein

Beispiel: "Goodbye, World!"
Enthält 'on': Nein
Enthält nicht 'on': Ja
Enthält 'hello': Nein
Enthält nicht 'hello': Ja