Auf Alter von Readings im Dummy triggern. Syntax?

Begonnen von Frank_Huber, 11 August 2017, 09:14:19

Vorheriges Thema - Nächstes Thema

Frank_Huber

Moin,

Ich habe einen dummy wo alle Temperaturen vom Gebäude (4 Instanzen) einlaufen.
Jetzt möchte ich wenn eines der Readings älter als 10 Minuten ist eine Benachrichtigung erhalten.

Das ist mein jetzige Stand:
defmod DOIF_Whatchdog_Temp DOIF ([Temperaturen:.*:sec] > 660) ((set TelegramBot message Temperatur $EVENT scheint offline zu sein, bitte prüfen!))
attr DOIF_Whatchdog_Temp do always


Was er jetzt aber macht ist bei jedem Event von jedem Reading triggern. also 14 Auslösungen alle 5 Minuten.
Wo kann denn hier mein Fehler stecken? stehe gerade auf dem schlauch.

Danke & Grüße
Frank

tiwo85

Gibt es dafür nicht das Modul Watchdog?

Gesendet von meinem VKY-L09 mit Tapatalk


Frank_Huber

damit habe ich es nicht geschafft alles in einen unterzubekommen.
und wollte es vermeiden 14 einzelne Whatchdogs anzulegen.

in einem anderen DOIF funktuioniert das:
and [IT_00FF0F0FFF:state:sec] > 120
daher dachte ich ich kann den Weg gehen.

Per

Statt Watchdogs geht auch do resetwait 600, aber auch da bräuchtest du 14 DOIF. Wäre nur interessant, wenn du eh für jeden Sensor eins hättest, welches du erweitern könntest.
Problem ist, dass [xxx:yyy:sec] nur bei "== 0" ein Event erzeugt.
Dass dein
Zitat von: Frank_Huber am 11 August 2017, 09:30:05and [IT_00FF0F0FFF:state:sec] > 120
funktioniert, ist "Zufall", weil eigentlich ist es ein
and [?IT_00FF0F0FFF:state:sec] > 120.
Du könntest einen Timer machen und regelmäßig mit
[#"Temperaturen:.*:sec" > 120]
(#)
eine Liste erzeugen.

amenomade

@Per: da bin ich mir nicht sicher. Wenn das so wäre, hätte das Beispiel im CommandRef kein Sinn:
ZitatAnwendungsbeispiel: Licht soll angehen, wenn der Status des Bewegungsmelders in den letzten fünf Sekunden upgedatet wurde.

define di_lamp DOIF ([BM:state:sec] < 5) (set lamp on-for-timer 300)
attr di_lamp do always

Bei HM-Bewegungsmelder werden periodisch Readings aktualisiert, dadurch wird das Modul getrigger, auch wenn keine Bewegung stattgefunden hat. Der Status bleibt dabei auf "motion". Mit der obigen Abfrage lässt sich feststellen, ob der Status aufgrund einer Bewegung tatsächlich upgedatet wurde.

@Frank_Huber: ein "list Temperaturen" wäre interessant.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

MadMax-FHEM

Hallo Frank,

evtl. statt dem DOIF ein notify und dann eine sub in myUtils aufrufen, wo du dann die Zeiten der Readings prüfst 'ReadingsAge' und dann entsprechend eine Meldung schickst...

Statt dem notify geht auch ein at, welches dann zyklisch die Sub aufruft...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Frank_Huber

Zitat von: MadMax-FHEM am 11 August 2017, 11:55:42
evtl. statt dem DOIF ein notify und dann eine sub in myUtils aufrufen, wo du dann die Zeiten der Readings prüfst 'ReadingsAge' und dann entsprechend eine Meldung schickst...
Statt dem notify geht auch ein at, welches dann zyklisch die Sub aufruft...
Das übersteigt dann meine Möglichkeiten. ;)

Zitat von: amenomade am 11 August 2017, 11:44:40
@Frank_Huber: ein "list Temperaturen" wäre interessant.
Internals:
   NAME       Temperaturen
   NR         236
   STATE      ???
   TYPE       dummy
   Helper:
     DBLOG:
       OG_absFeuchte:
         logdb:
           TIME       1502448120.69115
           VALUE      10.3
   READINGS:
     2017-08-11 12:41:39   DG_Ost          21.9375
     2017-08-11 12:41:42   EG_Bad          19.625
     2017-08-11 12:41:48   EG_Garderobe    20.6875
     2017-08-11 12:41:51   EG_Gast         20.75
     2017-08-11 12:41:56   EG_Kammer       21
     2017-08-11 12:42:01   EG_Kueche       21.9375
     2017-08-11 12:42:05   EG_Ofen         21.6875
     2017-08-11 12:42:09   EG_Wohn         21
     2017-08-11 12:41:32   OG_Bad          21.3125
     2017-08-11 12:41:46   OG_Flur_Ost     21.3125
     2017-08-11 12:41:49   OG_Flur_West    21
     2017-08-11 12:42:04   OG_Johanna      21.6875
     2017-08-11 12:42:11   OG_Luisa        21.8125
     2017-08-11 12:42:23   OG_Schlafzimmer 20.5
     2017-08-11 12:42:00   OG_absFeuchte   10.3
Attributes:
   DbLogExclude EG_Gast,EG_Kammer,EG_Garderobe,EG_Bad,EG_Kueche,EG_Ofen,EG_Wohn,OG_Bad,OG_Flur_Ost,OG_Flur_West,OG_Johanna,OG_Luisa,OG_Schlafzimmer,DG_Ost
   DbLogInclude OG_absFeuchte
   readingList EG_Gast EG_Kammer EG_Garderobe EG_Bad EG_Kueche EG_Ofen EG_Wohn OG_Bad OG_Flur_Ost OG_Flur_West OG_Johanna OG_Luisa OG_Schlafzimmer OG_absFeuchte DG_Ost
   room       Temp / Feucht
   setList    EG_Gast EG_Kammer EG_Garderobe EG_Bad EG_Kueche EG_Ofen EG_Wohn OG_Bad OG_Flur_Ost OG_Flur_West OG_Johanna OG_Luisa OG_Schlafzimmer OG_absFeuchte DG_Ost


Zitat von: Per am 11 August 2017, 11:08:27
Problem ist, dass [xxx:yyy:sec] nur bei "== 0" ein Event erzeugt.
Das erklärt das fehlerbild.

Zitat von: Per am 11 August 2017, 11:08:27
Dass deinfunktioniert, ist "Zufall", weil eigentlich ist es ein
and [?IT_00FF0F0FFF:state:sec] > 120.
Mag sein, in dem Einsatzfall dort würde das so auch reichen.

Zitat von: Per am 11 August 2017, 11:08:27
Du könntest einen Timer machen und regelmäßig mit
[#"Temperaturen:.*:sec" > 120]
(#)
eine Liste erzeugen.
Das werd ich mir mal anschauen! Danke.

Per

Zitat von: Per am 11 August 2017, 11:08:27Problem ist, dass [xxx:yyy:sec] nur bei "== 0" ein Event erzeugt.
Eingentlich stimmt das nicht ganz, in Wirklichkeit ist :sec gleich 0, wenn der passende Event erzeugt wird (und es eine Änderung gab).

Zitat von: amenomade am 11 August 2017, 11:44:40@Per: da bin ich mir nicht sicher. Wenn das so wäre, hätte das Beispiel im CommandRef kein Sinn:
Hier wird ein Event erzeugt, ohne dass es eine Zustandänderung gibt, deshalb wird :sec größer. Sozusagen ein (im Sensor befindlicher) Timer.

Du hast aber dass Problem, dass du das Ausbleiben des Eventes prüfen willst. Also musst du dir einen Timer erstellen und in diesem das Alter der einzelnen (oder halt aggregiert -> #) state abfragen und entsprechend handeln.

Beta-User

Vielleicht hilft Dir das weiter (modifiziert bzw. geklaut von https://forum.fhem.de/index.php/topic,34482.msg268826.html#msg268826, keine Syntaxprüfung):

define Temperaturueberwachung_Melder notify .*Temperaturen:.* { fhem "defmod - temporary $NAME_ReceivedTimer at +00:06:60 { fhem 'set TelegramBot message Temperatur $NAME scheint offline zu sein, bitte prüfen!' } }"
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

amenomade

Hier wird ein Event erzeugt, ohne dass es eine Zustandänderung gibt, deshalb wird :sec größer. Sozusagen ein (im Sensor befindlicher) Timer.

Du hast aber dass Problem, dass du das Ausbleiben des Eventes prüfen willst. Also musst du dir einen Timer erstellen und in diesem das Alter der einzelnen (oder halt aggregiert -> #) state abfragen und entsprechend handeln.
[/quote]
@Per: Stimmt.

@Frank: Warum dann mit :sec arbeiten, und nicht mit wait und do resetwait? Da ist dafür gemeint. Ich würde so probieren:

([Temperaturen:.*])
     (set TelegramBot message Temperatur $EVENT scheint offline zu sein, bitte prüfen!)
attr _Whatchdog_Temp wait 660
attr _Whatchdog_Temp  do resetwait
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Brockmann

Ich bin mir nicht sicher, ob sich dieses Problem mit einem DOIF "elegant" lösen lässt. Und Du willst ja eigentlich auch nicht die Temperaturen überwachen, sondern die Sensoren, welche diese Temperaturen liefern (oder?).
Vielleicht schaust Du Dir mal das monitoring-Modul an, das ist genau für solche Aufgaben gedacht.
https://fhem.de/commandref_DE.html#monitoring

Frank_Huber

Doch, es geht um die Temperaturen. Diese werden per RFHEM von anderen Instanzen da reingeschrieben. Manchmal bleibt dies aber hängen. Das will ich damit erkennen.
Die Hänger passieren z. B. wenn beim Wert schreiben kurz das Netzwerk weg ist. Ab dem Moment hängt dann irgendwas beim sendenden FHEM. Die entsprechenden devices werden dann auch nicht mehr geloggt.

Deswegen ist das erkennen und Handeln können der erste Schritt.
Im zweiten step werd ich meine Testumgebung um einen zweiten RasPi erweitern und die Wurzel des Bösen suchen.

Gesendet von meinem S3_32 mit Tapatalk


Frank_Huber

@amenomade, werde ich ausprobieren, danke!

Gesendet von meinem S3_32 mit Tapatalk


amenomade

ZitatIch bin mir nicht sicher, ob sich dieses Problem mit einem DOIF "elegant" lösen lässt. Und Du willst ja eigentlich auch nicht die Temperaturen überwachen, sondern die Sensoren, welche diese Temperaturen liefern (oder?).

Deswegen ([Temperaturen:.*])
     (set TelegramBot message Temperatur $EVENT scheint offline zu sein, bitte prüfen!)


und nicht
([Temperaturen])
     (set TelegramBot message Temperatur $EVENT scheint offline zu sein, bitte prüfen!)


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

Per

Zitat von: Brockmann am 12 August 2017, 08:50:26Ich bin mir nicht sicher, ob sich dieses Problem mit einem DOIF "elegant" lösen lässt.

Zitat von: Per am 11 August 2017, 11:08:27aber auch da bräuchtest du 14 DOIF
Also nicht wirklich "elegant"...

Ellert

#15
vielleicht klappt es mit DOIF und at

defmod DOIF_Whatchdog_Temp DOIF ([Temperaturen]) ((defmod Temperaruren["^Temperaturen$:":"(.*)?:\s"] at {time+600} set TelegramBot message Temperatur $EVENT scheint offline zu sein, bitte prüfen!))
attr DOIF_Whatchdog_Temp do always

Ich habs nicht probiert, die Idee dahinter ist, dass für jedes Temperaturreading ein at innerhalb von 600 s mit einer neuen Auslösezeit aktualisiert wird. Und wenn nicht, wird die Nachricht abgesetzt. Das klappt aber nur, wenn im Befehlsteil noch einmal das Event ausgewertet werden kann. Der jeweilige Name des at sollte dann Temperaruren<Reading> lauten.

Per

Das funktioniert schon, nur hast du auch hier 14, wenn auch automatisch erstellte, at.

Ellert

Zitat von: Per am 14 August 2017, 16:13:39
Das funktioniert schon, nur hast du auch hier 14, wenn auch automatisch erstellte, at.
Dann würde es wohl auch mit benannten sleep-Befehlen klappen, im Prinzip ist es doch gleich, wer einen Timer setzt DOIF, at oder sleep.

((sleep 600 Temperaruren["^Temperaturen$:":"(.*)?:\s"] quiet;set TelegramBot message Temperatur $EVENT scheint offline zu sein, bitte prüfen!))

Frank_Huber

Zitat von: Ellert am 14 August 2017, 18:05:25
Dann würde es wohl auch mit benannten sleep-Befehlen klappen, im Prinzip ist es doch gleich, wer einen Timer setzt DOIF, at oder sleep.

((sleep 600 Temperaruren["^Temperaturen$:":"(.*)?:\s"] quiet;set TelegramBot message Temperatur $EVENT scheint offline zu sein, bitte prüfen!))

So, kann heute wieder etwas testen...
Ich vermute DOIF wird nicht wirklich funktionieren weil ja die 14 verschiedenen readings jeweils den vorigen Befehl innerhalb vom Wait überschreiben.
Es sei denn ich mach 14 DOIF Pfade. Und da fänd ich den notify mit at sinnvoller. zudem ich da dann auch mit EVTPART0$ arbeiten kann.

Frank_Huber

Zitatdefmod Temperaruren["^Temperaturen$:":"(.*)?:\s"] at {time+600} set TelegramBot message Temperatur OG_Schlafzimmer: 22.125 scheint offline zu sein, bitte prüfen!:
Invalid characters in name (not A-Za-z0-9._): Temperaruren["^Temperaturen$:":"(.*)?:\s"]

schade, scheint so nicht zu gehen. oder ist da noch was mit den Klammern falsch?

Frank_Huber

So, DOIF mit 14 Pfaden, jetzt meckert er den define vom at an. {time+600}

Zitatdefmod Whatchdog_T_DG_Ost at {time+600} set TelegramBot message Temperatursensor DG_Ost scheint offline zu sein, bitte prüfen!:
the function "time+600" must return a timespec and not 1502785019.

AxelSchweiss

Ich habe das mit dem DeviceMonitor Modul gemacht.

define DeviceCheck DeviceMonitor

define DeviceTotAlarm notify .*health_state:.*dead.* { { DebianMail('XXX@XXX.de','FHEM-Sensor-Ausfall',' Sensor - '.$NAME.' - ist ausgefallen!') ;; } }

und dann bei jedem Device diese Attribut gesetzt:
attr BZ.Temperatur device_timeout 30
Wobei BZ.Temperatur ein LaCrosse Sensor ist.

Funktioniert seit Jahren einwandfrei.

Frank_Huber

Zitat von: AxelSchweiss am 15 August 2017, 10:23:16
Ich habe das mit dem DeviceMonitor Modul gemacht.

define DeviceCheck DeviceMonitor

define DeviceTotAlarm notify .*health_state:.*dead.* { { DebianMail('XXX@XXX.de','FHEM-Sensor-Ausfall',' Sensor - '.$NAME.' - ist ausgefallen!') ;; } }

und dann bei jedem Device diese Attribut gesetzt:
attr BZ.Temperatur device_timeout 30
Wobei BZ.Temperatur ein LaCrosse Sensor ist.

Funktioniert seit Jahren einwandfrei.

"Problem" bei mir ist dass es EIN device ist und ich die Readings überwachen will.
Denke das DOIF mit 14 Pfaden wird die Lösung sein. muss nur die timespec richtig hinbekommen.

amenomade

#23
(übrigens: meine Lösung mit DOIF geht nicht, da immer nur ein Timer für das ganze DOIF gesetzt wird.)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Frank_Huber

Zitat von: amenomade am 15 August 2017, 10:28:58
(übrigens: meine Lösung mit DOIF geht nicht, da immer nur einen Timer für das ganze DOIF gesetzt wird.)

Ja, deswegen 14 Pfade im DOIF mit jeweils einem "defmod at"

nils_

kannst du nicht _ein_ DOIF bauen was jede minute nachguckt ob deine readings zu alt sind?
(evtl. habe ich nur die ganze problemstellung noch nicht durchblickt, dann sorry für die nachfrage!)



define DOIF_Watchdog_Temp DOIF ([+:01] and [?Temperaturen:.*:sec] > 600) ((set TelegramBot message Temperatur $EVENT scheint offline zu sein, bitte prüfen!))
viele Wege in FHEM es gibt!

amenomade

#26
Getestete Lösung: ein "at", der regelmässig die ReadingsAge prüft:

+*00:00:10 {
  my $hash = $defs{"Temperaturen"};
  foreach my $key (keys %{$hash->{READINGS}}){
    if (ReadingsAge("Temperaturen",$key,0) > 30)
      {Log3 "Temperaturen",1,"$key antwortet nicht mehr"};
  }
}


Je 10 Sekunden prüfen, ob die Readings mehr als 30 Sekunden verältet sind.

EDIT: die Idee von nils_ ist auch interessant. Muss man aber testen.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Per

Zitat von: nils_ am 15 August 2017, 10:53:26[?Temperaturen:.*:sec] > 600
Ich sehe hier eher die Aggregatsfunktion # am Zug. $EVENT ergibt hier nämlich nichts Sinnvolles, weil der Timer das Event lievert, nicht der Sensor, der wird nur abgefragt.

Achja: siehe hier!

Frank_Huber

Zitat von: amenomade am 15 August 2017, 11:39:12
Getestete Lösung: ein "at", der regelmässig die ReadingsAge prüft:

+*00:00:10 {
  my $hash = $defs{"Temperaturen"};
  foreach my $key (keys %{$hash->{READINGS}}){
    if (ReadingsAge("Temperaturen",$key,0) > 30)
      {Log3 "Temperaturen",1,"$key antwortet nicht mehr"};
  }
}


Je 10 Sekunden prüfen, ob die Readings mehr als 30 Sekunden verältet sind.

EDIT: die Idee von nils_ ist auch interessant. Muss man aber testen.

DANKE!!!!!

genau was ich gesucht habe. das funktioniert super! :)

Bei der Idee von Nils dürfte aber auch $EVENT nichts vernünftiges liefern oder?

Ellert

Zitat von: Frank_Huber am 15 August 2017, 10:15:20
So, DOIF mit 14 Pfaden, jetzt meckert er den define vom at an. {time+600}
Dann müsstest Du time+600 noch in HH:MM:SS umwandeln siehe http://search.cpan.org/~dexter/POSIX-strftime-GNU-0.02/lib/POSIX/strftime/GNU.pm

Frank_Huber

Zitat von: Ellert am 15 August 2017, 13:21:21
Dann müsstest Du time+600 noch in HH:MM:SS umwandeln siehe http://search.cpan.org/~dexter/POSIX-strftime-GNU-0.02/lib/POSIX/strftime/GNU.pm

*LOL* als ob och das hinkriegen würde. ;-)

Habs mittlerweile über den at Vorschlag von amenomade gelöst.
Zitat von: amenomade am 15 August 2017, 11:39:12
Getestete Lösung: ein "at", der regelmässig die ReadingsAge prüft:

nils_

Zitat von: Frank_Huber am 15 August 2017, 12:45:56
Bei der Idee von Nils dürfte aber auch $EVENT nichts vernünftiges liefern oder?

war ja auch nur ne idee.
hat Per aber auch schon erwähnt.

vielleicht geht ja sowas  :o
define DOIF_Watchdog_Temp DOIF ([+:01] and [?Temperaturen:.*:sec] > 600) ((set TelegramBot message Temperatur [@Temperaturen:.*]  scheint offline zu sein, bitte prüfen!))
ich bin immer noch am DOIF lernen!!


aber da du ja eine funktionierende lösung hast, ist ja alles gut :D

viele Wege in FHEM es gibt!

Ellert

#32
Zitat von: Frank_Huber am 15 August 2017, 09:09:48
So, kann heute wieder etwas testen...
Ich vermute DOIF wird nicht wirklich funktionieren weil ja die 14 verschiedenen readings jeweils den vorigen Befehl innerhalb vom Wait überschreiben.
Es sei denn ich mach 14 DOIF Pfade. Und da fänd ich den notify mit at sinnvoller. zudem ich da dann auch mit EVTPART0$ arbeiten kann.
Nein, es sind benannte sleep-Befehle, die werden nur überschrieben, wenn sie mit ihrem Namen erneut gesetzt werden.
["^Temperaturen$:":"(.*)?:\s"] ist genauer als $EVTPART0, der Inhalt von $EVTPART0 schliesst mit einem Doppelpunkt ab, den müsstest Du wieder herausfiltern, dann kannst Du auch gleich das Reading aus dem Event herausfiltern.

Ellert

Zitat von: Frank_Huber am 15 August 2017, 13:24:08
*LOL* als ob och das hinkriegen würde. ;-)

Habs mittlerweile über den at Vorschlag von amenomade gelöst.
Ich wollte die Antwort nicht schuldig bleiben.

Frank_Huber

Zitat von: Ellert am 15 August 2017, 13:31:10
Nein, es sind benannte sleep-Befehle, die werden nur überschrieben, wenn sie mit ihrem Namen erneut gesetzt werden.
["^Temperaturen$:":"(.*)?:\s"] ist genauer als $EVTPART0, der Inhalt von $EVTPART0 mit einem Doppelpunkt ab, den müsstest Du wieder herausfiltern, dann kannst Du auch gleich das Reading aus dem Event herausfiltern.

ah, OK. nur gab es da ne Fehlermeldung:
Zitatdefmod Temperaruren["^Temperaturen$:":"(.*)?:\s"] at {time+600} set TelegramBot message Temperatur OG_Schlafzimmer: 22.125 scheint offline zu sein, bitte prüfen!:
Invalid characters in name (not A-Za-z0-9._): Temperaruren["^Temperaturen$:":"(.*)?:\s"]

Frank_Huber

Zitat von: Ellert am 15 August 2017, 13:32:38
Ich wollte die Antwort nicht schuldig bleiben.
finde ich auch gut. So ist die Antwort im Thema. :)

Ellert

#36
Zitat von: Frank_Huber am 15 August 2017, 13:33:11
ah, OK. nur gab es da ne Fehlermeldung:
Dann funktioniert die Ausgabeformatierung hinsichtlich des Triggers im Befehlsteil nicht so, wie ich gedacht hatte, schade eigentlich. Das hatte ich ja vorausgesetzt.

Mit einem Notify und $EVTPART0 müsste es auch klappen. Das wäre etwas eleganter als alle 10 s zu pollen.

Temperaturen:.* {fhem "sleep 600 $NAME".chop($EVENTPART0). " quiet;set TelegramBot message Temperatur $EVENT scheint offline zu sein, bitte prüfen!"}
Ungetestet, Syntax nicht geprüft.