Fensterkontake Durchsage [gelösst]

Begonnen von 2P4u, 11 Mai 2016, 10:12:21

Vorheriges Thema - Nächstes Thema

2P4u

Hi Zusammen.
Ich habe folgendes Scenario.

5 HM Fensterkontakte
1 Key Matic
5 Sonos Lautsprecher
1 HM 6Fach Taster

Ich wollte wenn ich einen Taster an der Haustüre drücke, dass alle Fenster auf ihren Status geprüft werden.
Ist ein Fenster offen, soll dies in einem String "Durchsage" angelegt werden. Dieser String enthält so alle Fenster die noch offen sind.
Ist der String befüllt, kommt die Durchsage mit der bitte die Fenster zu schliessen und die Haustüre wird nicht abgeschlossen.
Sind alle Fenster geschlossen, wird die Türe nach 15 sec abgeschlossen, wenn die Haustüre geschlossen ist.

Nun hatte ich früher einen Code im Einsatz, der heute nicht mehr funktioniert.
Vielleicht kann mir jemand behilflich sein, diesen wieder zum laufen zu bekommen, damit ich darauf aufbauen kann.

Ich suche eine Möglichkeit, States der Kontakte in einem String zu speichern.
Hier mal den Code von früher:

tk_Haustuer:open {
    my @@fenster = ();;
    push(@@fenster, 'Bürofenster offen') if (Value("fk_Buero") eq "open");;
    push(@@fenster, 'Schlafzimmerfenster offen') if (Value("fk_Schlafzimmer") eq "open");;
    push(@@fenster, 'Küchenfenster offen') if (Value("fk_Kueche") eq "open");;
    push(@@fenster, 'Terassentür offen') if (Value("fk_Terasse") eq "open");;
    push(@@fenster, 'Badezimmerfenster offen') if (Value("fk_Bad") eq "open");;
    push(@@fenster, 'Wohnzimmerfenster offen') if (Value("CUL_FHTTK_d1cc54") eq "open");;
if (scalar(@@fenster) && (Value("tk_Haustuer") eq "open")) {
my $durchsage = 'Achtung! '.join(', ', @@fenster);;
fhem('set InfoTab ttsSay '.$durchsage);;
                fhem("set Push message $durchsage");;
                }
}


Hängt das ganze mit der FHEM 5.7 Version zusammen? Gibt es eine Anleitung, wie man die States an den String übergibt?

Danke für eure Hilfe und Grüsse

Daniel

Edit: Wurde gelösst mit folgendem Code funktioniert es prima:
Wz1_Btn02.Short.* {
    my @fenster = ();;
    push(@fenster, 'Bürofenster') if (Value("fk_Buero") eq "open");;
push(@fenster, 'Bürotür') if (Value("fk_Buero2") eq "open");;
    push(@fenster, 'Schlafzimmerfenster') if (Value("fk_Schlafzimmer") eq "open");;
    push(@fenster, 'Terassentür') if (Value("fk_Terasse") eq "open");;
    push(@fenster, 'Badezimmerfenster') if (Value("fk_Bad") eq "open");;
    push(@fenster, 'Wohnzimmerfenster') if (Value("fk_Wohnzimmer") eq "open");;
push(@fenster, ' schliessen');;
if (scalar(@fenster) && (Value("fl_Tuerschloss") eq "unlocked")) {
my $durchsage = 'Bitte erst '.join(', ', @fenster);;
fhem('set WandTabletWohnzimmer ttsMsg '.$durchsage);;
        }
else {
fhem('set WandTabletWohnzimmer ttsMsg Alle Fenster geschlossen. Haustür wird verriegelt. Alarm scharf');;
fhem("define Tuereschliessen_spaeter at +00:00:15 set fl_Tuerschloss lock");;
fhem("set Aussentuer öffnen");;
}
}
1x Ubuntu Server
1x LaCrosse Gateway für PCA301 /1x HMLAN /1x HMLGW
2x HueBridge mit Devices/ 1x Logitech Harmony Ultimate

viegener

Bevor ich jetzt den ganzen Code auf Fehler prüfe, hier schonmal der erste Schritt:

Ja, es hängt definitiv (auch ?) mit 5.7 zusammen. Die Verdoppelung von @ ist nicht mehr nötig, also alle @@ durch @ ersetzen, dann laufen lassen und wenn es Fehler gibt diese hier auch mitteilen.



Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

2P4u

Zitat von: viegener am 11 Mai 2016, 10:20:07
Bevor ich jetzt den ganzen Code auf Fehler prüfe, hier schonmal der erste Schritt:

Ja, es hängt definitiv (auch ?) mit 5.7 zusammen. Die Verdoppelung von @ ist nicht mehr nötig, also alle @@ durch @ ersetzen, dann laufen lassen und wenn es Fehler gibt diese hier auch mitteilen.

Danke für deine schnell Antwort.
Ich werde das heute Abend testen und Berichten.

Gruss Daniel
1x Ubuntu Server
1x LaCrosse Gateway für PCA301 /1x HMLAN /1x HMLGW
2x HueBridge mit Devices/ 1x Logitech Harmony Ultimate

2P4u

Ich hab das jetzt mal so angepasst das ich das mit einem Taster auslöse:

Wz2_Btn04.Short.* {
    my @fenster = ();;
    push(@fenster, 'Bürofenster offen') if (Value("fk_Buero") eq "open");;
    push(@fenster, 'Schlafzimmerfenster offen') if (Value("fk_Schlafzimmer") eq "open");;
    push(@fenster, 'Küchenfenster offen') if (Value("fk_Kueche") eq "open");;
    push(@fenster, 'Terassentür offen') if (Value("fk_Terasse") eq "open");;
    push(@fenster, 'Badezimmerfenster offen') if (Value("fk_Bad") eq "open");;
    push(@fenster, 'Wohnzimmerfenster offen') if (Value("CUL_FHTTK_d1cc54") eq "open");;
if (scalar(@fenster)) {
my $durchsage = 'Achtung! '.join(', ', @fenster);;
fhem('set InfoTab ttsSay '.$durchsage);;
                fhem("set Push message $durchsage");;
                }
}


Das läuft jetzt soweit. Danke schonmal an viegener.

Jetzt habe ich noch das Problem, dass dieser Part doppelt wiederholt wird:
if (scalar(@fenster)) {
my $durchsage = 'Achtung! '.join(', ', @fenster);;
fhem('set InfoTab ttsSay '.$durchsage);;
                fhem("set Push message $durchsage");;
                }


Kann ich das irgendwie so verhindern?

if (scalar(@fenster) && (Value("Wz2_Btn04.Short.") eq "*")) {

Oder hat hier jemand eine andere Idee?
Ausserdem muss hier jetzt noch die if abfrage erfolgen die das Türschloss schliesst oder eben nicht.

Danke für Eure Unterstützung

Daniel
1x Ubuntu Server
1x LaCrosse Gateway für PCA301 /1x HMLAN /1x HMLGW
2x HueBridge mit Devices/ 1x Logitech Harmony Ultimate

viegener

Ich denke mal es geht um ein notify device?

Am besten wäre im Eventlog zu schauen, was denn wirklich an events gesendet wird und dann den Teil Wz2_Btn04.Short.* so anzupassen, dass nur EIN event matcht, ich nehme an die Doppelausführung hängt damit zusammen, dass zwei Events kommen, die beide auf den RegExp passen.
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

RadioJames

Ich denke viegener hat absolut Recht. Ähnliche Situationen hatte ich auch schon oft. Du musst deine RegEx, auf die dein notify triggern soll, eindeutig gestalten.
Deshalb -> mit dem Event Monitor genau beobachten
There are 10 kind of people. Those who understand binary and those who don't.

2P4u

Ich habs jetzt hinbekommen.
So sieht der fertige Code nun aus:
Wz1_Btn02.Short.* {
    my @fenster = ();;
    push(@fenster, 'Bürofenster') if (Value("fk_Buero") eq "open");;
push(@fenster, 'Bürotür') if (Value("fk_Buero2") eq "open");;
    push(@fenster, 'Schlafzimmerfenster') if (Value("fk_Schlafzimmer") eq "open");;
    push(@fenster, 'Terassentür') if (Value("fk_Terasse") eq "open");;
    push(@fenster, 'Badezimmerfenster') if (Value("fk_Bad") eq "open");;
    push(@fenster, 'Wohnzimmerfenster') if (Value("fk_Wohnzimmer") eq "open");;
push(@fenster, ' schliessen');;
if (scalar(@fenster) && (Value("fl_Tuerschloss") eq "unlocked")) {
my $durchsage = 'Bitte erst '.join(', ', @fenster);;
fhem('set WandTabletWohnzimmer ttsMsg '.$durchsage);;
        }
else {
fhem('set WandTabletWohnzimmer ttsMsg Alle Fenster geschlossen. Haustür wird verriegelt. Alarm scharf');;
fhem("define Tuereschliessen_spaeter at +00:00:15 set fl_Tuerschloss lock");;
fhem("set Aussentuer öffnen");;
}
}


Hoffe, damit kan auch jemand anderes was anfangen.

Vielen Dank für die Hilfe und den Tipp mit den @@.

Grüsse Daniel
1x Ubuntu Server
1x LaCrosse Gateway für PCA301 /1x HMLAN /1x HMLGW
2x HueBridge mit Devices/ 1x Logitech Harmony Ultimate