Syntaxfrage: simples IF - nur 1. Zeile wird korrekt ausgeführt

Begonnen von FFHEM, 23 Juni 2013, 17:14:54

Vorheriges Thema - Nächstes Thema

FFHEM

Hallo zusammen,
bevor ich mir meine letzten Haare noch raufe:
Kann jemand sich bitte das hier mal ansehen?
ANLAGE_STATUS ist NICHT scharf (sondern scharf_intern), ALARM_STATUS ist "bereit"
und trotzdem wird Zeile 20 richtigerweise nicht ausgeführt, wohl aber Zeilen 30 und 40!
Da ist doch eine geschweifte Klammer drum!

05  define act_on_BewegungInnen notify BewegungInnen.*:bewegung \
10  { if ("$value{ANLAGE_STATUS}" eq "scharf" && "$value{ALARM_STATUS}" ne "ALARM")\
20    { fhem("set ALARM_Melder on ;;\
30      set S2 on ;; \
40      set ALARM_STATUS ALARMS ;; \
50      ")\
60     }\
70   }


Bin schon 2 Std. am Testen, ich sehe nichts mehr...

Vielen Dank!
Friedhem
Raspberry Pi 4B, Homematic, Sonoff, Shelly, Worx, Arduino, ESP8266

grappa24

ich würd für Zeile 30 und Zeile 40 jeweils einen separaten fhem-Befehl setzen
10 {
20  fhem ("set ALARM_Melder on");
30  fhem ("set S2 on");
40  fhem ("set ALARM_STATUS ALARMS");
50}

 
FHEM 6.1, 2 x RasPi 3B+, Debian Buster; KNX, FS20, HM, HUE, Tradfri, Shellies, KLF200
Rollo-/Lichtsteuerung/-szenarien, T-Sensoren, Fensterkontakte, Heizungssteuerung, HEOS, Sprachsteuerung mit Alexa-FHEM, Netatmo, Nuki, ...

FFHEM

Prima, das war es wohl!

Obwohl es nicht logisch ist, dass das erste nicht funktionieren soll, ist fast identisch mit der FEHM-Alarmanlage im Wiki.

Du hast mir jedenfalls sehr geholfen, vielen Dank!!!!!!
Raspberry Pi 4B, Homematic, Sonoff, Shelly, Worx, Arduino, ESP8266

MisterEltako

Auch schon so probiert?

05 define act_on_BewegungInnen notify BewegungInnen.*:bewegung \
10 { if ("$value{ANLAGE_STATUS}" eq "scharf" && "$value{ALARM_STATUS}" ne "ALARM")\
20 { fhem("set ALARM_Melder on ;;;;\
30 set S2 on ;;;;\
40 set ALARM_STATUS ALARMS \
50 ")\
60 }\
70 }

MfG, MisterEltako
HMLAN-Konfigurations-Adapter, HM-Funkjalousieaktor/HM-Dimmaktor/HM-Schaltaktor f. Markenschalter, Jalousie-/Schaltaktor von Eltako, FT4 v. Eltako, TCM310

Puschel74

Hallo,

ZitatBewegungInnen.

Ist das jetzt die korrekt Schreibweise nach den österreichischen Grünen/Innen (EU-Konform)?
In Österreich musste ja dank denen auch die Bundeshymne umgeschrieben werden.

Grüße

P.S.: Scherz aber das mit der Hymne stimmt
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

FFHEM

Zitat von: Puschel74 schrieb am So, 23 Juni 2013 22:25Hallo,

ZitatBewegungInnen.

Ist das jetzt die korrekt Schreibweise nach den österreichischen Grünen/Innen (EU-Konform)?
In Österreich musste ja dank denen auch die Bundeshymne umgeschrieben werden.

Grüße

P.S.: Scherz aber das mit der Hymne stimmt

Das ist mir gar nicht aufgefallen, danke für den Hinweis! Nun betrachte ich die möglichen EinbrecherInnen ganz anders ;-)
Das Programm werde ich deswegen aber nicht umschreiben.

Mit humorigen Grüßen
Raspberry Pi 4B, Homematic, Sonoff, Shelly, Worx, Arduino, ESP8266

FFHEM

Leider war es das doch noch nicht, war etwas vorschnell.
Diese Syntax ist doch sehr gewöhnungsbedürftig.
Ich kenne mich mit C, C++, PL/SQL und diversem Kleinzeug aus, aber dies hier ist wirklich schon stark.

Probiere gerade MisterEltakos Tipp, sieht verheißungsvoll aus. Habe jetzt einmal die 4 Semikolons eingesetzt. Zumindest klappt dies hier:

## Melder für "scharf"
## also alle Melder, die innen eine Bewegung feststellen, Außenmelder werden unberücksichtigt
define act_on_BewegungInnen notify BewegungInnen.*:bewegung \
{ if ((Value("ANLAGE_STATUS") eq "scharf") && (Value("ALARM_STATUS") ne "ALARM") )\
  { fhem ("set S2 on;;;;\
           set ALARM_STATUS ALARM;;;;\
           set ALARM_Melder on;;;;\
           define ALARMIERT_scharf at +00:03:00 set ALARM_STATUS IRausgeloest;;;;")\
  }\
}


Aber dies hier wird nie ausgeführt (Anm.: ANLAGE_STATUS ist scharf_intern zu dem Zeitpunkt)


# Melder für "scharf_intern"
# also alle Melder, die außen eine Bewegung feststellen
define act_on_BewegungAussen notify BewegungAussen.*:bewegung\
{ if (Value("ANLAGE_STATUS") eq "scharf_intern") \
  { fhem ("set ALARM_STATUS ALARM;;;;\
           set S2 on;;;;\
           set ALARM_Melder on;;;;\
           define ALARMIERT_scharf_intern at +00:03:00 set ALARM_STATUS IRausgeloest;;;;")\
  }\
}

[/color]

Und das sind nur wegen der Vollständigkeit die zugehörigen Trigger:
Dieser scheint ins Leere zu laufen (obwohl BewegungAussen_Balkon jeweils auf bewegung bzw. ruhig gesetzt werden):

# Anzeige einer Bewegung außen Balkon
define BewegungAussen_Balkon dummy
attr BewegungAussen_Balkon room Alarmanlage,Übersicht,Balkon

define bewegs2 notify PIRA3:motion* {\
fhem "set BewegungAussen_Balkon bewegung";;\
fhem "define ausa at +00:05:00 set BewegungAussen_Balkon ruhig";;\
}
[/color]

Dieser hier funktioniert:

# Anzeige einer Bewegung innen Flur oben
define BewegungInnen_Flur_oben dummy
attr BewegungInnen_Flur_oben room Alarmanlage,Übersicht

define ibeweg notify PIRI1:motion* {\
fhem "set BewegungInnen_Flur_oben bewegung";;\
fhem "define aus at +00:05:00 set BewegungInnen_Flur_oben ruhig";;\
}

Kann mir jemand verraten, was hier falsch sein soll?
Vielen Dank!
Raspberry Pi 4B, Homematic, Sonoff, Shelly, Worx, Arduino, ESP8266

rudolfkoenig

So wild ist es auch nicht, man muss nur merken:
- wenn fhem die Zeile nicht sofort bei ; trennen soll, dann muss man diese doppeln (ist fhem und nicht perl geschuldet, da wir bisher noch keinen vollwertigen perl-parser einbauen wollten)
- wenn das Befehl auf mehrere Zeilen verteilt wird, dann gehoert ein \ am Ende (sonst wird es ja sofort ausgefuehrt).
Beide Regeln kann man vergessen, wenn man im FHEMWEB Detail-Ansicht der notify auf DEF klickt, um das Befehl zu bearbeiten.

Weiterhin:
- $value ist unerwuenscht, man sollte Value() verwenden
- "$value{XX}" und $value{XX} ist gleichwertig (ersteres kopiert nur die Variable einmal zu viel).

Wie ich es machen wuerde: in der FHEMWEB Befehlszeile
define act_on_BewegungInnen notify x y
eingeben, Detail von act_on_BewegungInnen aufrufen, auf DEF klicken, und hier x y ersetzen durch:

BewegungInnen.*:bewegung {
  if(Value("ANLAGE_STATUS") eq "scharf" && Value("ALARM_STATUS") ne "ALARM") {
    fhem("set ALARM_Melder,S2 on; set ALARM_STATUS ALARM");
  }
}

FFHEM

Hallo Rudolf,
vielen Dank für die Geduld!
Habe den kritischen Teil jetzt nach Deiner Anleitung in den Webeditoren bearbeitet, sieht jetzt so aus:

BewegungAussen.*:bewegung
{ if  (Value("ANLAGE_STATUS") eq "scharf_intern")
  { fhem ("set ALARM_STATUS ALARM;
           set S2,ALARM_Melder on;
           define ALARMIERT_scharf_intern at +00:03:00 set ALARM_STATUS IRausgeloest;");
  }
}

Aber, obiger Code wird nicht ausgeführt! Sprich, wenn BewegungAussen_Balkon mit bewegung da ist und der ANLAGE_STATUS auf scharf_intern steht, wird ALARM_STATUS nicht gesetzt, S2 und ALARM_Melder ebenfalls nicht.
Raspberry Pi 4B, Homematic, Sonoff, Shelly, Worx, Arduino, ESP8266

Puschel74

Hallo,

ich würde es mal so versuchen:

BewegungAussen.*:bewegung {
  Log 3,("Notify wurde angesprungen");
  if  (Value("ANLAGE_STATUS") eq "scharf_intern") {
    Log 3,("Anlage_Status ist scharf_intern");
    fhem ("set ALARM_STATUS ALARM");
    fhem ("set S2,ALARM_Melder on");
    fhem ("define ALARMIERT_scharf_intern at +00:03:00 set ALARM_STATUS IRausgeloest;");
  }
}
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

rudolfkoenig

Das Problem sieht man, wenn man im Detail-Ansicht die REGEXP-Zeile anschaut: wg. dem fruehen NL wird das Regexp mit einem \{ versehen.

Loesung: { noch in der gleichen Zeile mit Leerzeichen, wie ich das geschrieben habe (und Puschel74 ja auch). Puschels Idee mit der Log Zeile ist auch nicht falsch. Noch besser ist eine "richtige" Perl-Funktion in 99_myUtils.pm einzubauen, und nur diesen aufzurufen, da kann man \ und ;; und %% und @@ dann auch vergessen.

FFHEM

Jetzt funktioniert es!!!!!

Vielen lieben Dank an Puschel und Rudolf!!

Obwohl ich es - ehrlich gesagt - immer noch nicht ganz kapiert habe.
Heißt das, die öffnende Klammer { soll dann noch am Ende der Zeile und nicht in der neuen Zeile stehen, mit einem Leerzeichen davor?

Wenn es so ist, braucht Ihr nicht mehr extra darauf zu antworten.

Jedenfalls nochmals vielen Dank!
Friedhelm



Raspberry Pi 4B, Homematic, Sonoff, Shelly, Worx, Arduino, ESP8266