Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Umfassendes Alarmanlagen-Skript

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.9k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.3k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.5k

Umfassendes Alarmanlagen-Skript

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
javascriptsecurity
145 Beiträge 27 Kommentatoren 32.4k Aufrufe 52 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • andreaskosA andreaskos

    @kilasat
    Du kannst auch einfach die Bezeichnung der Aufzählungen im Skript ändern auf: "alarmanlage_aussenhaut" usw. mit Kleinbuchstaben, dann geht's auch.
    Ich sollte diese Standard-Einstellungen vielleicht von vornherein in Kleinschreibung im Skript angeben, wenn das eine Stolperfalle ist.

    T Offline
    T Offline
    Tirador
    schrieb am zuletzt editiert von
    #71

    @andreaskos said in Umfassendes Alarmanlagen-Skript:

    @kilasat
    Du kannst auch einfach die Bezeichnung der Aufzählungen im Skript ändern auf: "alarmanlage_aussenhaut" usw. mit Kleinbuchstaben, dann geht's auch.
    Ich sollte diese Standard-Einstellungen vielleicht von vornherein in Kleinschreibung im Skript angeben, wenn das eine Stolperfalle ist.

    Noch genialer wäre es wenn die Aufzählungen durch das Skript generiert werden könnten. Ich habe keine Ahnung ob es dafür eine Funktion gibt.

    andreaskosA 1 Antwort Letzte Antwort
    2
    • andreaskosA andreaskos

      @kilasat
      Du kannst auch einfach die Bezeichnung der Aufzählungen im Skript ändern auf: "alarmanlage_aussenhaut" usw. mit Kleinbuchstaben, dann geht's auch.
      Ich sollte diese Standard-Einstellungen vielleicht von vornherein in Kleinschreibung im Skript angeben, wenn das eine Stolperfalle ist.

      K Offline
      K Offline
      kilasat
      schrieb am zuletzt editiert von kilasat
      #72

      @andreaskos

      ja jetzt verstehe ich es. Der Name der Funktion ist ja in Gross aber die ID ist immer noch klein. Das ist wirklich unglücklich.

      Scheint nun zu funktionieren. Danke an alle.

      1 Antwort Letzte Antwort
      0
      • D Offline
        D Offline
        dodi666
        schrieb am zuletzt editiert von
        #73

        @andreaskos
        Vielen Dank für das tolle Skript. Meine Alarmanlage läuft derzeit in Homematic und ich werde die Logik durch dein Skript ablösen. Bei mir ist es derzeit so, dass ich die Alarmanlage aktiviere und dann 5 Minuten Zeit habe die Wohnung zu verlassen. Mit dem Schließen der Wohnungstüre wird dann die Alarmanlage scharf geschaltet. Wenn ich innerhalb der 5 Minuten die Wohnung nicht verlassen habe, deaktiviert die Alarmanlage sich wieder von selbst. Ist das eine Funktionalität, welche interessant wäre im Skript umzusetzen? Wenn nicht, würde ich diesen Mechanismus "drum herum" bauen.

        Grüße
        Sascha

        1 Antwort Letzte Antwort
        1
        • T Tirador

          @andreaskos said in Umfassendes Alarmanlagen-Skript:

          @kilasat
          Du kannst auch einfach die Bezeichnung der Aufzählungen im Skript ändern auf: "alarmanlage_aussenhaut" usw. mit Kleinbuchstaben, dann geht's auch.
          Ich sollte diese Standard-Einstellungen vielleicht von vornherein in Kleinschreibung im Skript angeben, wenn das eine Stolperfalle ist.

          Noch genialer wäre es wenn die Aufzählungen durch das Skript generiert werden könnten. Ich habe keine Ahnung ob es dafür eine Funktion gibt.

          andreaskosA Offline
          andreaskosA Offline
          andreaskos
          schrieb am zuletzt editiert von andreaskos
          #74

          Grüß euch!

          @Tirador said in Umfassendes Alarmanlagen-Skript:

          @andreaskos said in Umfassendes Alarmanlagen-Skript:

          @kilasat
          Du kannst auch einfach die Bezeichnung der Aufzählungen im Skript ändern auf: "alarmanlage_aussenhaut" usw. mit Kleinbuchstaben, dann geht's auch.
          Ich sollte diese Standard-Einstellungen vielleicht von vornherein in Kleinschreibung im Skript angeben, wenn das eine Stolperfalle ist.

          Noch genialer wäre es wenn die Aufzählungen durch das Skript generiert werden könnten. Ich habe keine Ahnung ob es dafür eine Funktion gibt.

          Die Aufzählungen könnten schon durch das Skript selbst angelegt werden. Befüllen kann man sie dann über die Admin-Oberfläche ganz normal. Aber möglicherweise möchte man schon vorhandene Aufzählungen nutzen? Ich weiß nicht, ob das für alle allgmein so nutzbar wäre. Da weise ich lieber in den Kommentaren noch stärker drauf hin und mache die Bezeichner standardmäßig mit Kleinbuchstaben, denk ich.

          @dodi666

          Mit dem Schließen der Wohnungstüre wird dann die Alarmanlage scharf geschaltet. Wenn ich innerhalb der 5 Minuten die Wohnung nicht verlassen habe, deaktiviert die Alarmanlage sich wieder von selbst.

          Das ist schon eine eher spezielle Funktion - aber zugegeben, eine coole! Ich würde es aber der Einfachheit halber bei der Basisfunktion der Alarmanlage belassen. Solche Dinge kann man ja eh mit den vorhandenen Datenpunkten gut lösen mit "drum herum"-Skripts, Blocklys oder Szenen. Aber vielen Dank für den Input!

          LG Andreas

          1 Antwort Letzte Antwort
          0
          • radicalreelR Offline
            radicalreelR Offline
            radicalreel
            schrieb am zuletzt editiert von
            #75

            Moin moin,

            das klingt sehr gut... gibts irgendeine Chance das in Blockly einzufügen? Ich habe die andere Programmierung nicht drauf :cry: .

            1 Antwort Letzte Antwort
            0
            • andreaskosA Offline
              andreaskosA Offline
              andreaskos
              schrieb am zuletzt editiert von andreaskos
              #76

              @radicalreel
              Du brauchst Blockly eh nicht dafür. Leg ein neues Javascript an, wähle aber bei der Auswahl nicht Blockly, sondern eben Javascript.
              Dann kopiere einfach das ganze Skript vom ersten Post in diesem Thread hinein in den Editor und scroll ein wenig nach unten.
              Alle Zeilen, die mit // beginnen, sind nur Kommentare und erklären ein paar Dinge.
              Dort, wo die Einstellungen zu machen sind, besserst du die Einträge einfach auf deine eigenen Anforderungen aus.
              Ich meine damit, diese Zeilen, immer nach dem = kannst du deine Änderungen machen:

              // EINSTELLUNGEN
              const entryDelay =                30;         // Eingangsverzögerung in Sekunden (sollte maximal 60s sein)
              const exitDelay =                 30;         // Ausgangsverzögerung in Sekunden (sollte maximal 60s sein)
              const alarmDurationAcoustical =  180;         // Dauer des akkustischen Alarms in Sekunden (ACHTUNG: in Ö sind maximal 180s erlaubt!)
              const alarmDurationOptical =      -1;         // Dauer des optischen Alarm in Sekunden, -1 für unendlich
               
              // TEXTE FÜR SCHALTZUSTAND
              // Diese Text geben Auskunft über den Zustand der Anlage.
              // Sie werden in den Datenpunkt "javascript.X.Output.StatusText" geschrieben.
              const textStatusInactive =        "unscharf";
              const textStatusActiveInternal =  "scharf intern";
              const textStatusActiveExternal =  "scharf extern";
              const textActiveExternalDelayed = "scharf extern verzögert";
              const textEntryDelayActive =      "Eingangsverzögerung aktiv";
              const textExitDelayActive =       "Ausgangsverzögerung aktiv";
               
              // TEXTE FÜR ALARMIERUNG UND FEHLER
              // Diese Text geben im unscharfen Zustand der Anlage Auskunft über die Bereitschaft
              // zum Scharfschalten (nur möglich, wenn alle Melder geschlossen - in Ruhe - sind) und
              // Fehler bei der Scharfschaltung bzw. bei scharfer Anlage über den Zustand Frieden oder Alarm.
              // Sie werden in den Datenpunkt "javascript.X.Output.AlarmText" geschrieben.
              const textAlarmInactive =         "Alles OK";
              const textAlarmActive =           "Alarm!!";
              const textReady =                 "Bereit";
              const textNotReady =              "Nicht bereit";
              const textError =                 "Fehler bei der Scharfschaltung";
              


              Irgendwann kommt dann die Zeile mit "DO NOT CHANGE ANYTHING BELOW THIS LINE" oder so ählich. Wenn du die erreicht hast, dann hast du's geschafft. Du brauchst das Script nur noch zu starten. Dann nochmal stoppen, dann beim zweiten Mal kannst du's laufen lassen. (Beim ersten Mal werden nämlich alle Datenpunkte angelegt, da können noch Warnings oder Fehler im Log auftauchen. Die sind beim zweiten Mal weg.)
              Die erzeugten Datenpunkte kannst du dann mit Blockly verarbeiten wie du magst.

              Du muss natürlich auch die Aufzählungen wie ein paar Posts vorher besprochen anlegen und dabei auf die Groß-/Kleinschreibung achten!

              LG Andreas

              1 Antwort Letzte Antwort
              1
              • andreaskosA Offline
                andreaskosA Offline
                andreaskos
                schrieb am zuletzt editiert von
                #77

                Nur zur Info: hab im Skript die Aufzählungs-IDs auf Kleinbuchstaben geändert, um dieses Hindernis auszuschalten:

                • alarmanlage_aussenhaut
                • alarmanlage_innenraum
                • alarmanlage_verzoegert

                LG Andreas

                W 1 Antwort Letzte Antwort
                1
                • andreaskosA andreaskos

                  Nur zur Info: hab im Skript die Aufzählungs-IDs auf Kleinbuchstaben geändert, um dieses Hindernis auszuschalten:

                  • alarmanlage_aussenhaut
                  • alarmanlage_innenraum
                  • alarmanlage_verzoegert

                  LG Andreas

                  W Offline
                  W Offline
                  watcherkb
                  schrieb am zuletzt editiert von watcherkb
                  #78

                  @andreaskos hi, ich bekomme lauter warn-Einträge in dem Log:
                  edit: ok jetzt weiß ich warum. Melder waren nicht im Ruhe-Modus.

                  javascript.0	2020-06-24 17:48:24.965	info	(25167) script.js.common.1Überwachung.Alarmanlage: registered 21 subscriptions and 0 schedules
                  javascript.0	2020-06-24 17:48:24.965	warn	(25167) Object "zigbee.0" does not exist
                  javascript.0	2020-06-24 17:48:24.964	warn	(25167) Object "zigbee.0" does not exist
                  javascript.0	2020-06-24 17:48:24.964	warn	(25167) Object "zigbee.0" does not exist
                  javascript.0	2020-06-24 17:48:24.905	info	(25167) script.js.common.1Überwachung.Alarmanlage: Alarmsystem started.
                  javascript.0	2020-06-24 17:48:24.904	info	(25167) Start javascript script.js.common.1Überwachung.Alarmanlage
                  javascript.0	2020-06-24 17:48:24.815	info	(25167) Stop script script.js.common.1Überwachung.Alarmanlage
                  
                  
                  

                  CC2538+CC2592 PA-Zigbee-Funkmodul

                  1 Antwort Letzte Antwort
                  0
                  • sigi234S sigi234

                    @Homer-J sagte in Umfassendes Alarmanlagen-Skript:

                    @sigi234 gib es mal klein ein.

                    Jupp läuft

                    S Offline
                    S Offline
                    sruhsam
                    schrieb am zuletzt editiert von
                    #79

                    @sigi234
                    Hallo Siggi, bin den ganzen Tag auf der Suche nach einer Lösung einer PIN-Eingabe mir iobroker.alarm zusammen.
                    Ist eigentlich ja ganz einfach, mann muss ja nur den Zahl/Code in den Datenpunkt alarm.0.use.toggle_passwort schreiben, hierzu die einzelnen Ziffen sammeln und wenn fertig als Zahl in den DP schreiben, aber ich bekomme es nicht hin. Habe auch schon mehrere scripts zur PIN Eingabe getestet, aber immer ohne Erfolg. Sehe vermutlich den Wald vor lauter Bäume nicht.....
                    Kannst du mir Bitte helfen, und mir den View oder das Widget des Nummenblocks als auch das dazugehörige Script bereitstellen ... damit ich da weiterkomme .......
                    Ich Bedanke mich schon mal im Voraus und hoffe dass du Zeit hast .
                    Grüße aus dem Aichtal
                    Stephan

                    sigi234S 1 Antwort Letzte Antwort
                    0
                    • S sruhsam

                      @sigi234
                      Hallo Siggi, bin den ganzen Tag auf der Suche nach einer Lösung einer PIN-Eingabe mir iobroker.alarm zusammen.
                      Ist eigentlich ja ganz einfach, mann muss ja nur den Zahl/Code in den Datenpunkt alarm.0.use.toggle_passwort schreiben, hierzu die einzelnen Ziffen sammeln und wenn fertig als Zahl in den DP schreiben, aber ich bekomme es nicht hin. Habe auch schon mehrere scripts zur PIN Eingabe getestet, aber immer ohne Erfolg. Sehe vermutlich den Wald vor lauter Bäume nicht.....
                      Kannst du mir Bitte helfen, und mir den View oder das Widget des Nummenblocks als auch das dazugehörige Script bereitstellen ... damit ich da weiterkomme .......
                      Ich Bedanke mich schon mal im Voraus und hoffe dass du Zeit hast .
                      Grüße aus dem Aichtal
                      Stephan

                      sigi234S Online
                      sigi234S Online
                      sigi234
                      Forum Testing Most Active
                      schrieb am zuletzt editiert von
                      #80

                      @sruhsam

                      https://forum.iobroker.net/topic/28717/vis-von-sigi234

                      Suche die Alarmanlage View

                      Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
                      Immer Daten sichern!

                      S 1 Antwort Letzte Antwort
                      0
                      • andreaskosA andreaskos

                        Liebe Community!

                        Kurzfassung
                        Hier stelle ich ein Skript für eine Alarmanlage vor. Einfach die Einstellungen im Skript anpassen und über die erzeugten Datenpunkte (default unter javascript.0.Alarmanlage) steuern.

                        LG Andreas

                        Langfassung


                        Beruflich benutze ich immer wieder mal ioBroker als Smart Home Systemintegrator. Wir errichten mit meiner Firma aber auch ganz normale Alarmanlagen. Hier müssen es (hauptsächlich aus Gründen der Förderung oder Versicherung) oftmals Anlagen sein mit VSÖ-Plakette. Das bedeutet, dass diese nach der ÖNORM-R2 errichtet werden müssen und die verwendeten Komponenten ein Zertfikat benötigen.
                        In anderen Fällen - speziell wenn wir das BUS-System KNX verwenden - kommt ein eigenes Sicherheitsmodul von ABB zum Einsatz, das die Alarmanlagen-Funktion abbildet.
                        Ich habe mir schon oft gedacht, dass mit ioBroker doch auch eine schöne Alarmanlagen-Funktion umsetzbar wäre. Natürlich, es ist nicht so eine stabile Lösung und schon gar keine zertifizierbare, aber immerhin: in meinen Augen ist eine solche Alarmanlage immer noch besser als gar keine. Ich habe deshalb beschlossen - nur so für mich zum Spaß - einmal eine "echte" Alarmanlage mit ioBroker Javascript nachzubilden. Ich hab die Funktion des ABB-Sicherheitsmoduls als Inspiration genommen und die grundlegenden Funktionen übernommen.
                        Bei der Überwachung der Einbruchsmelder erfolgt keine separate Überwachung auf Sabotage. Dies ist in der Ausführung Privat Standard in Österreich laut R2 nicht nötig. In Deutschland ist es denke ich recht ähnlich, da wir ja auch die gleichen Produkte einsetzen, die es ja auch für D gibt, z.B. Jablotron oder Telenot.
                        Hier möchte ich das Ergebnis zeigen.

                        Aufbau
                        Die Alarmanlage besteht aus folgenden Komponenten:

                        • Schaltstellen für scharf/unscharf Schaltung
                        • Alarmgeber
                        • Einbruchsmelder

                        Außer den Einbruchsmeldern werden alle Punkte NUR als Datenpunkte angelegt, über die eine weitere Interaktion erfolgen kann. Hierfür bietet ioBroker ja zahlreiche Möglichkeiten wie die Einbindung in eine Visualisierung, die Verwendung in Scripts, Szenen, Blocklys und so weiter.
                        Für die Einbruchsmelder werden States aus ioBroker verwendet, die true beim Auslösen sind und false in Ruhe (wenn sie geschlossen sind). Die Namen der Melder sollten sinnvoll vergeben sein, gegebenenfalls daher die name-Attribute der Objekte in ioBroker noch anpassen. Die Melder müssen in Aufzählungen (ENUMs) in ioBroker eingefügt werden. Per default (kann in den Experteneinstellungen im Skript geändert werden) sind das die folgenden Aufzählungen:

                        • alarmanlage_aussenhaut
                          In dieser Aufzählung befinden sich alle Melder der äußeren Hülle, die überwacht werden soll. Hier gehören Öffnungskontakte, Glasbruchsensoren, Riegelschaltkontakt, etc. hinein.
                        • alarmanlage_innenraum
                          Hier werden die Melder für die Innenraum-Überwachung zusammengefasst. Das sind im wesentlichen Bewegungsmelder, Näherungssensoren, eventuell auch ganz normale Taster (z.B. für Licht etc.).
                        • alarmanlage_verzoegert
                          Melder, welche für einen Eingang benötigt werden, der bei Auslösung zu einem verzögerten Alarm führt. Damit kann durch der überwachte Bereich durch die Eingangstür betreten werden und danach (innerhalb der Eingangsverzögerung) unscharf gestellt werden.

                        Funktion: scharf/unscharf Schalten
                        Grundsätzlich kann die Alarmanlage extern oder intern scharf geschaltet werden. Extern bedeutet, dass sich der Bediener selbst extern aufhält und somit alle verfügbaren Melder verwendet werden.
                        Intern bedeutet, dass sich der Bediener intern aufhält und somit nur die Melder zur Überwachung der Außenhaut verwendet werden.
                        Die Scharfschaltung für Extern kann auch verzögert erfolgen. Dabei läuft eine Ausgangsverzögerungszeit ab nach dem Schaltbefehl. Nach dem Ende der Verzögerungszeit erfolgt erst die tatsächliche Scharfschaltung.

                        Das bedeutet also, dass Melder in Außenhaut oder Innenraum eingeteilt werden. Zusätzlich können Melder aus diesen Gruppen auch als verzögert gelten. Diese drei Gruppen von Meldern müssen in den entsprechenden Aufzählungen enthalten sein.

                        ACHTUNG: Scharf (egal, ob extern oder intern) kann nur geschaltet werden, wenn sich alle Melder in Ruhe befinden, also geschlossen sind! Sollte das nicht der Fall sein, so ist die Anlage nicht bereit zur Scharfschaltung. Dies wird in einem eigenen Ready-Datenpunkt angezeigt, sowie im AlarmText.
                        Sollte eine Scharfschaltung eingehen, obwohl die Anlage nicht bereit ist, so wird ein Fehler bei der Scharfschaltung durch den Error-Datenpunkt und wieder einem entsprechenden AlarmText angezegt.
                        Das kann auch dazu führen, dass bei verzögertem scharf Schalten ein Fehler bei der Scharfschaltung auftritt, den man unter Umständen nicht mehr bemerkt, weil man schon das Haus verlassen hat. Das muss man wissen oder sich einen Hinweis darauf erzeugen, zB durch ein Skript, etwa das Versenden einer Telegram-Meldung im Fehlerfall.

                        Funktion: Alarm geben
                        Bei scharf gestellter Anlage wird bei Auslösung eines Melders geprüft, welcher Schaltzustand vorherrscht (intern/extern) und welchen Meldergruppen der auslösende Melder zuzuordnen ist. Davon abhängig wird Alarm ausgelöst oder die Eingangsverzögerung gestartet. Nach dieser erfolgt die Alarmierung, sofern nicht zwischenzeitlich unscharf geschaltet wird.

                        Bei den Alarmgebern werden drei Datenpunkte angeboten:
                        Der AlarmAccoustical ist der akustische Alarm, dieser darf in Ö übrigens 3 Minuten nicht übersteigen. Die Werte bei den Einstellungen werden in Sekunden eingegeben, also maximal 180 Sekunden (keine eingebaute Beschränkung im Skript).
                        Der AlarmOptical ist der optische Alarm. Dieser darf so lange dauern, wie gewünscht. Soll er ewig antehen bis zum nächsten unscharf, dann kann die Zahl -1 für die Dauer verwendet werden.
                        Der ganz normale Alarm Datenpunkt steht immer auf true, wenn ein Alarm ausgelöst wurde bis zum nächsten unscharf.

                        Bedienung oder Verwendung der Input-Datenpunkte
                        Über die States im Unterpunkt Input kann die Anlage scharf/unscharf geschaltet werden.
                        Mit dem Wert true auf den Datenpunkten erfolgt der Schaltbefehl unmittelbar oder verzögert im Falle von SwitchExternalDelayed.
                        Mit dem Wert false wird immer sofort auf unscharf geschaltet.

                        Mit unscharf erfolgt auch immer ein Reset der Anlage, d.h. alle Alarme werden beendet und der Status- und Alarmtext entsprechend angepasst.

                        Es kann nicht von einem Scharf-Zustand auf einen anderen Scharf-Zustand gewechselt werden, es muss immer dazwischen unscharf geschaltet werden, ansonsten wird ein "Fehler bei der Scharfschaltung" geworfen.

                        Unter "Input" ist ein eigener Knoten namens "IgnoreOpen" zu finden. Unterhalb diesem können per Flag die einzelnen Melder inaktiv geschaltet werden.
                        true = von der Überwachung ausgenommen
                        false = wird mitüberwacht

                        ACHTUNG
                        Die Einstellung der IgnoreOpen-Flags wird (derzeit) nicht automatisch zurück gesetzt, etwa beim Scharf-Schalten. Das bedeutet, man muss selbst drauf achten, dass ein Melder nicht ewig auf Inaktiv bleibt, weil man vergessen hat das Flag wieder auf true zu stellen.

                        Verwendung der Output-Datenpunkte
                        Über die Output-Datenpunkte können die Alarmgeber angesteuert werden (z.B. über ein zusätliches Script oder Blockly). Es gibt auch eine Menge an weiteren Datenpunkten, die für zusätzliche Funktionen oder Anzeigen in Visualisierungen nützlich sein können. Hier eine Auflistung mit kurzer Erklärung:

                        • Active: Schaltzustand der Anlage insgesamt, true=scharf, false=unscharf. [boolean]
                        • ActiveInternal: Anlage intern scharf [boolean]
                        • ActiveExternal: Anlage extern scharf [boolean]
                        • ActiveNumber: gibt Auskunft über den tatsächlichen Zustand mit den Ziffern:
                          0 ... unscharf
                          1 ... intern scharf
                          2 ... extern scharf
                          3 ... Eingangsverzögerung aktiv
                          4 ... Ausgangsverzögerung aktiv
                        • Alarm: true=Alarm ausgelöst, false=kein Alarm [boolean]
                        • AlarmAccoustical: Akustischer Alarm aktiv [boolean]
                        • AlarmOptical: Optischer Alarm aktiv [boolean]
                        • Ready: Anlage bereit zur Scharfschaltung [boolean]
                        • EntryDelayActive: Eintrittsverzögerung aktiv [boolean]
                        • ExitDelayActive: Ausgangsverzögerung aktiv [boolean]
                        • AlarmingDetector: Name des auslösenden Melders [string]
                        • AlarmingDetectorJSON: Name und alle weiteren verfügbaren Eigenschaften des auslösenden Melderobjektes und dessen Parent- und ParentsParent-Objekt im JSON-Format. [string]
                        • OpenDetectors: Namen aller offenen Melder [string]
                        • OpenDetectorsJSON: JSON-String wie beim AlarmingDetector mit Liste aller offenen Melder [string]
                        • OpenDetectorsOuterSkingJSON: JSON-String wie beim AlarmingDetector mit Liste aller offenen Melder der Außenhaut [string]
                        • OpenDetectorsIndoorJSON: JSON-String wie beim AlarmingDetector mit Liste aller offenen Melder des Innenraums [string]
                        • StatusText: Gibt Auskunft über Schaltzustand und aktive Verzögerungen [string]
                        • AlarmText: Gibt Auskunft über Alarmzustand und Bereitschaft oder Fehler bei der Scharfschaltung [string]
                        • OpenDetectorsIgnoreOpen Liste der offenen Melder mit gesetztem IgnoreOpen-Flag. Diese Melder kommen nicht in die Liste der ganz regulär offenen Melder. Diesen Datenpunkt könnte man verwenden, um sich zu warnen, wenn zum Zeitpunkt des Scharf-Schaltens (oder ein paar Millisekunden später) hier Text enthalten ist.

                        Die Texte, die in den Text-Datenpunkten verwendet werden, können in den Einstellungen im Skript angepasst werden.

                        Das Skript

                        /*
                        ########################################################################################################################
                        # ALARMSYSTEM
                        #
                        # Das Skript bildet eine einfache Alarmanlage nach mit der Schaltmöglichkeit
                        # für intern und extern.
                        # Datenpunkte für Inputs und Outputs werden angelegt.
                        # Nähere Beschreibung siehe im ioBroker-Forum unter
                        # https://forum.iobroker.net/topic/32885/umfassendes-alarmanlagen-skript
                        # Änderungshistorie:
                        # 2020-05-01    Andreas Kos     Erstellt
                        # 2020-05-02    Andreas Kos     Schaltwunsch mit Number-Datenpunkt Input.SwitchNumber (Idee von @Homer.J.)
                        #                               Schaltstatus mit Number-Datenpunkt Output.ActiveNumber (Idee von @Homer.J.)
                        # 2020-05-03    Andreas Kos     Korrekturen, u.a. für Melderauswertung (chage: "ne") & AlarmText
                        # 2020-05-04    Andreas Kos     - Melder werden aus den Functions (Aufzählungen, enums) dafür geholt. Auch beim Unscharf-
                        #                                 schalten, dadurch ist kein Neustarten des Skripts notwendig bei
                        #                                 Änderungen an diesen Aufzählungen.
                        #                               - Eine Schaltung von einem scharf-Zustand auf einen anderen
                        #                                 wird verhindert. ZB von scharf intern auf scharf extern.
                        #                                 Es muss immer unscharf dazwischen geschaltet werden.
                        # 2020-05-09    Andreas Kos     Zusätzliche Objekte mit JSON-Strings für:
                        #                               - den auslösenden Melder
                        #                               - alle offenen Melder
                        #                               - alle offenen Melder der Außenhaut
                        #                               - alle offenen Melder des Innenraums
                        #                               Die JSON-String beinhalten das auslösende Objekt, sowie (falls vorhanden)
                        #                               das Parent und das ParentsParent-Objekt mit allen in ioBroker verfügbaren Eigenschaften.
                        #                               Kleinere Verbesserungen, z.B. bezüglich setzen der AlarmTexte.
                        # 2020-05-12    Andreas Kos     Setzen des Datenpunkts idReady zur Bereitschaftsanzeige neu gemacht.
                        # 2021-06-13    Andreas Kos     Einbau der Funktion zum Ausnehmen einzelner Melder der Aussenhülle
                        #                               von der Melder-Überwachung. Soll zum Kippen von Fenstern dienen u.ä.
                        # 2022-03-20    Andreas Kos	Verbesserung beim Laden der Parents- und Parentsparents-Objekte und
                        #                               Umbau auf aktuellen Javascript-Adapter mit Ack-Flags bei createState und setState
                        # 2022-12-02    Andreas Kos     Korrektur beim Prüfen der IgnoreOpen-Flags.
                        # 2022-12-18    Andreas kos     Korrektur beim Anlegen der States, sodass ein Neustart des Scripts eine weitere
                        #                               Funktion der Anlage garantiert, auch, wenn diese zuvor im Zustand "scharf" war.
                        ########################################################################################################################
                        */
                        
                        // EINBRUCHSMELDER
                        // Jeder Melder muss ein State sein, der bei Auslösung true liefert und in Ruhe (geschlossen) false.
                        // Die Melder sind in Arrays zusammengefasst, d.h. sie müssen jeweils mit Beistrich voneinander getrennt werden.
                        // Die Namen der Melder sollten gut gepflegt sein für eine sinnvolle Verwendung (Attribut name bei den Objekten)
                        
                        // Melder der Außenhaut
                        // Dies können Öffnungskontakte sein von Fenster und Türen in den Außenmauern des Objekts.
                        // EINGABE: In der Aufzählung "alarmanlage_aussenhaut" die States einfügen.
                        
                        // Melder des Innenraums
                        // Dies können Bewegungsmelder sein aus dem Inneren.
                        // EINGABE: In der Aufzählung "alarmanlage_innenraum" die States einfügen.
                        
                        // Verzögerte Melder
                        // Diese kommen in den Gruppen oben auch vor. Sie bewirken eine Aktivierung der Eingangsverzögerung
                        // bei scharf geschalteter Anlage und erlauben während der Ausgangsverzögerung nach dem
                        // Scharfschalten das Haus zu verlassen.
                        // EINGABE: In der Aufzählung "alarmanlage_verzoegert" die States einfügen.
                        
                        
                        // EINSTELLUNGEN
                        const entryDelay =                30;         // Eingangsverzögerung in Sekunden (sollte maximal 60s sein)
                        const exitDelay =                 30;         // Ausgangsverzögerung in Sekunden (sollte maximal 60s sein)
                        const alarmDurationAccoustical =  180;         // Dauer des akkustischen Alarms in Sekunden (ACHTUNG: in Ö sind maximal 180s erlaubt!)
                        const alarmDurationOptical =      -1;         // Dauer des optischen Alarm in Sekunden, -1 für unendlich
                        
                        // TEXTE FÜR SCHALTZUSTAND
                        // Diese Text geben Auskunft über den Zustand der Anlage.
                        // Sie werden in den Datenpunkt "javascript.X.Output.StatusText" geschrieben.
                        const textStatusInactive =        "unscharf";
                        const textStatusActiveInternal =  "scharf intern";
                        const textStatusActiveExternal =  "scharf extern";
                        const textActiveExternalDelayed = "scharf extern verzögert";
                        const textEntryDelayActive =      "Eingangsverzögerung aktiv";
                        const textExitDelayActive =       "Ausgangsverzögerung aktiv";
                        
                        // TEXTE FÜR ALARMIERUNG UND FEHLER
                        // Diese Text geben im unscharfen Zustand der Anlage Auskunft über die Bereitschaft
                        // zum Scharfschalten (nur möglich, wenn alle Melder geschlossen - in Ruhe - sind) und
                        // Fehler bei der Scharfschaltung bzw. bei scharfer Anlage über den Zustand Frieden oder Alarm.
                        // Sie werden in den Datenpunkt "javascript.X.Output.AlarmText" geschrieben.
                        const textAlarmInactive =         "Alles OK";
                        const textAlarmActive =           "Alarm!!";
                        const textReady =                 "Bereit";
                        const textNotReady =              "Nicht bereit";
                        const textError =                 "Fehler bei der Scharfschaltung";
                        
                        // EXPERTEN-EINSTELLUNGEN
                        const pathToCreatedStates = "Alarmanlage";    // Beispiel: States werden erzeugt unter javascript.X.Alarmanlage
                        const seperator = ", ";                       // Trenn-String, der zwischen den Meldernamen verwendet wird, im Datenpunkt "OpenDetectors"
                        const loglevel = 3;                           // 0 bis 3. 0 ist AUS, 3 ist maximales Logging
                                                                    // Empfehlung für Nachvollziehbarkeit aller Handlungen ist 2 (Ereignisliste)
                        const functionOuterSkin = "alarmanlage_aussenhaut";
                        const functionIndoor = "alarmanlage_innenraum";
                        const functionDelayedDetectors = "alarmanlage_verzoegert";
                        
                        
                        /*
                        ###############################################################################
                                            DO NOT CHANGE ANYTHING BELOW THIS LINE
                                                 AB HIER NICHTS MEHR ÄNDERN
                        ###############################################################################
                        */
                         
                        // ===============================================================================
                        // Variablen
                        // ===============================================================================
                         
                        // Arrays für die Melder
                        var detectorsOuterSkin = [];
                        var detectorsIndoor = [];
                        var detectorsDelayed = [];
                         
                        // Array für die IgnoreOpen-Melder (beinhaltet nur Flags).
                        // Das Array ist inital deckungsgleich mit detectorsOuterSkin, da diese
                        // nur aus dieser Function kommen können.
                        // Dieses Array ist 2-Dimensional: [Melder-ID, IgnoreOpen-Zustands-ID]
                        var detectorsIgnoreOpen = [];
                         
                        // Javascript-Instanz mit der das Alarmanlagen-Skript ausgeführt wird
                        var javascriptInstance = instance;
                         
                        // States, die erzeugt werden für Status-Ausgaben
                        var idActive = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Output.Active";
                        var idActiveExternal = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Output.ActiveExternal";
                        var idActiveInternal = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Output.ActiveInternal";
                        var idActiveNumber = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Output.ActiveNumber";
                        var idAlarm = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Output.Alarm";
                        var idAlarmAccoustical = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Output.AlarmAccoustical";
                        var idAlarmOptical = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Output.AlarmOptical";
                        var idReady = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Output.Ready";
                        var idEntryDelayActive = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Output.EntryDelayActive";
                        var idExitDelayActive = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Output.ExitDelayActive";
                        var idAlarmingDetector = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Output.AlarmingDetector";
                        var idAlarmingDetectorJSON = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Output.AlarmingDetectorJSON";
                        var idOpenDetectors = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Output.OpenDetectors";
                        var idOpenDetectorsJSON = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Output.OpenDetectorsJSON";
                        var idOpenDetectorsOuterSkinJSON = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Output.OpenDetectorsOuterSkinJSON";
                        var idOpenDetectorsIndoorJSON = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Output.OpenDetectorsIndoorJSON";
                        var idOpenDetectorsWithIgnoreOpenFlagSet = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Output.OpenDetectorsIgnoreOpen";
                         
                        var idStatusText = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Output.StatusText";
                        var idAlarmText = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Output.AlarmText";
                        var idError = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Output.Error";
                         
                        // States, die erzeugt werden für Eingaben
                        var idSwitchExternal = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Input.SwitchExternal";
                        var idSwitchInternal = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Input.SwitchInternal";
                        var idSwitchExternalDelayed = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Input.SwitchExternalDelayed";
                        var idSwitchNumber = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Input.SwitchNumber";
                         
                        // Sonstige globale Variablen, die gebraucht werden
                        var timerExitDelay = null;
                        var timerTexts = null;
                         
                        // ===============================================================================
                        // Precode
                        // ===============================================================================
                         
                        // Logging
                        if (loglevel >= 1) log ("Alarmsystem started.");
                         
                        getAllDetectors();
                         
                        // States erzeugen
                        myCreateState(idActive, "boolean", false, "Switch Status Total", false, "info.status");
                        myCreateState(idActiveExternal, "boolean", false, "Switch Status External", false, "info.status");
                        myCreateState(idActiveInternal, "boolean", false, "Switch Status Internal", false, "info.status");
                        myCreateState(idAlarm, "boolean", false, "Alarm Status", false, "sensor.alarm");
                        myCreateState(idAlarmAccoustical, "boolean", false, "Accoustical Alarm Status", false, "sensor.alarm");
                        myCreateState(idAlarmOptical, "boolean", false, "Optical Alarm Status", false, "sensor.alarm");
                        myCreateState(idReady, "boolean", false, "Alarmsystem Ready", false, "info.status");
                        myCreateState(idError, "boolean", false, "Error Switching Active", false, "info.status");
                        myCreateState(idEntryDelayActive, "boolean", false, "Entry Delay Active Status", false, "info.status");
                        myCreateState(idExitDelayActive, "boolean", false, "Exit Delay Active Status", false, "info.status");
                        myCreateState(idAlarmingDetector, "string", "", "Alarming Detector", false, "text");
                        myCreateState(idAlarmingDetectorJSON, "string", "", "Alarming Detector JSON", false, "json");
                        myCreateState(idOpenDetectors, "string", "", "Open Detectors", false, "info.name");
                        myCreateState(idOpenDetectorsJSON, "string", "", "Open Detectors JSON", false, "json");
                        myCreateState(idOpenDetectorsOuterSkinJSON, "string", "", "Open Detectors Outer Skin JSON", false, "json");
                        myCreateState(idOpenDetectorsIndoorJSON, "string", "", "Open Detectors Indoor JSON", false, "json");
                        myCreateState(idOpenDetectorsWithIgnoreOpenFlagSet, "string", "", "Open Detectors with IgnoreOpen-Flag set", false, "text");
                        myCreateState(idStatusText, "string", "", "Status Text", false, "text");
                        myCreateState(idAlarmText, "string", "", "Alarm Text", false, "text");
                        myCreateState(idSwitchExternal, "boolean", false, "Enable Surveillance External", true, "switch");
                        myCreateState(idSwitchInternal, "boolean", false, "Enable Surveillance Internal", true, "switch");
                        myCreateState(idSwitchExternalDelayed, "boolean", false, "Enable Surveillance External Delayed", true, "switch");
                         
                        myCreateMultiState (idActiveNumber, "number", 0, "Switch Status Number", false, 0, 4,"0:"+textStatusInactive+"; 1:"+textStatusActiveInternal+"; 2:"+textStatusActiveExternal+"; 3:"+textExitDelayActive+"; 4:"+textEntryDelayActive);
                        myCreateMultiState (idSwitchNumber, "number", 0, "Switch by Number", true, 0, 3, "0:"+textStatusInactive+"; 1:"+textStatusActiveInternal+" ; 2:"+textStatusActiveExternal+" ; 3:"+textActiveExternalDelayed);
                         
                        // Erzeugen der Datenpunkte für die IgnoreOpen-Einstellung
                        myCreateIgnoreOpenDPs();
                         
                        // Melder nach dem Starten checken
                        checkDetectors(detectorsOuterSkin.concat(detectorsIndoor));
                         
                        // ===============================================================================
                        // ON-Subscribtions
                        // ===============================================================================
                         
                        // Auf Schaltstellen EXTERN verzögert reagieren (schalten EIN/AUS)
                        on ({id: idSwitchExternalDelayed, change: "any"}, function(obj){
                            if (loglevel >= 3) log ("Switching External Delayed, Value: " + getState(obj.id).val);
                            if (getState(obj.id).val) { // Einschalten, scharf extern VERZÖGERT
                                if (loglevel >= 2) log ("Switching required: Delayed External Active");
                                    if (getState(idActive).val) {
                                        if (loglevel >= 3) log ("Alarmsystem already active, switch to inactive first!");
                                        setState(idError, true, true);
                                    } else {
                                        setState(idExitDelayActive, true, true);
                                        if (timerExitDelay) clearTimeout(timerExitDelay);
                                        timerExitDelay = setTimeout(switchActiveExternal, exitDelay * 1000);
                                    }
                            }
                            else { // Ausschalten, unscharf SOFORT
                                if (loglevel >= 2) log ("Switching required: Inactive");
                                switchInactive();
                            }
                        });
                         
                        // Auf Schaltstellen EXTERN sofort reagieren (schalten EIN/AUS)
                        on ({id: idSwitchExternal, change: "any"}, function(obj){
                            if (loglevel >= 3) log ("Switching External Immediately, Value: " + getState(obj.id).val);
                            if (getState(obj.id).val) { // Einschalten, scharf extern
                                if (loglevel >= 2) log ("Switching required: External Active");
                                if (getState(idActive).val) {
                                    if (loglevel >= 3) log ("Alarmsystem already active, switch to inactive first!");
                                    setState(idError, true, true);
                                } else {
                                    switchActiveExternal();
                                }
                            }
                            else { // Ausschalten, unscharf
                                if (loglevel >= 2) log ("Switching required: Inactive");
                                switchInactive();
                            }
                        });
                         
                        // Auf Schaltstellen INTERN sofort reagieren (schalten EIN/AUS)
                        on ({id: idSwitchInternal, change: "any"}, function(obj){
                            if (loglevel >= 3) log ("Switching Internal, Value: " + getState(obj.id).val);
                            if (getState(obj.id).val) { // Einschalten, scharf intern
                                if (loglevel >= 2) log ("Switching required: Internal Active");
                                if (getState(idActive).val) {
                                    if (loglevel >= 3) log ("Alarmsystem already active, switch to inactive first!");
                                    setState(idError, true, true);
                                } else {
                                    switchActiveInternal();
                                }
                            }
                            else { // Ausschalten, unscharf
                                switchInactive();
                                if (loglevel >= 2) log ("Switching required: Inactive");
                            }
                        });
                         
                        // Auf Schaltstelle mit Datenpunkt SwitchNumber reagieren
                        // Folgende Reaktionen:
                        //      0 ... unscharf schalten
                        //      1 ... scharf intern schalten
                        //      2 ... scharf extern schalten
                        //      3 ... verzögert scharf extern schalten
                        on ({id: idSwitchNumber, change: "any"}, function(obj){
                            if (loglevel >= 3) log ("Switching Number, Value: " + obj.state.val);
                            switch (obj.state.val) {
                                case 0:
                                    if (loglevel >= 2) log ("Switching required: Inactive");
                                    switchInactive();
                                    break;
                                case 1:
                                    if (loglevel >= 2) log ("Switching required: Internal Active");
                                    if (getState(idActive).val) {
                                        if (loglevel >= 3) log ("Alarmsystem already active, switch to inactive first!");
                                        setState(idError, true, true);
                                    } else {
                                        switchActiveInternal();
                                    }
                                    break;
                                case 2:
                                    if (loglevel >= 2) log ("Switching required: External Active");
                                    if (getState(idActive).val) {
                                        if (loglevel >= 3) log ("Alarmsystem already active, switch to inactive first!");
                                        setState(idError, true, true);
                                    } else {
                                        switchActiveExternal();
                                    }
                                    break;
                                case 3:
                                    if (loglevel >= 2) log ("Switching required: Delayed External Active");
                                    if (getState(idActive).val) {
                                        if (loglevel >= 3) log ("Alarmsystem already active, switch to inactive first!");
                                        setState(idError, true, true);
                                    } else {
                                        setState(idExitDelayActive, true, true);
                                        if (timerExitDelay) clearTimeout(timerExitDelay);
                                        timerExitDelay = setTimeout(switchActiveExternal, exitDelay * 1000);
                                    }
                                    break;
                                default:
                                    if (loglevel >= 3) log ("idSwitchNumber has unknown number!");
                            }
                        });
                         
                        // Auf Fehler bei der Scharfschaltung reagieren
                        on ({id: idError, val: true, change: "any"}, function(obj){
                            if (loglevel >= 1) log ("Error when switching to active.");
                            setState(idAlarmText, textError, true);
                        });
                         
                        // Auf Eingangsverzögerung reagieren
                        on({id: idEntryDelayActive, val: true, change: "ne"}, function (obj) {
                            if (loglevel >= 2) log ("Entry Delay is active (" + entryDelay + " seconds)");
                            setState(idStatusText, textEntryDelayActive, true);
                            setStateDelayed(idAlarmAccoustical, true, true, entryDelay * 1000, true);
                            setStateDelayed(idAlarmOptical, true, true, entryDelay * 1000, true);
                        });
                         
                        // Auf Ausgangsverzögerung reagieren
                        on({id: idExitDelayActive, val: true, change: "ne"}, function (obj) {
                            if (loglevel >= 2) log ("Exit Delay is active (" + exitDelay + " seconds)");
                            setState(idStatusText, textExitDelayActive, true);
                        });
                         
                        // Auf Akustischen Alarm reagieren
                        on ({id: idAlarmAccoustical, val: true, change: "ne"}, function(obj){
                            if (loglevel >= 1) log ("ALARM is active!");
                            setState(idEntryDelayActive, false, true);
                            setState(idAlarmText, textAlarmActive, true);
                            setState(idAlarm, true, true);
                            setStateDelayed(idAlarmAccoustical, false, true, alarmDurationAccoustical * 1000, true);
                            if (getState(idActiveExternal).val) setState(idStatusText, textStatusActiveExternal, true);
                            if (getState(idActiveInternal).val) setState(idStatusText, textStatusActiveInternal, true);
                        });
                         
                        // Auf Optischen Alarm reagieren
                        on ({id: idAlarmOptical, val: true, change: "ne"}, function(obj){
                            if (alarmDurationOptical >= 0)
                                setStateDelayed(idAlarmOptical, false, true, alarmDurationOptical * 1000, true);
                        });
                         
                        // Melderauswertung
                        on( {id: detectorsOuterSkin.concat(detectorsIndoor), change: "ne"}, function(obj){
                            detectorSurveillance(obj);
                        });
                         
                        // Status in Active.Number schreiben
                        on ({id: [idActiveInternal, idActiveExternal, idEntryDelayActive, idExitDelayActive], change: "ne"}, function(obj){
                            if (loglevel >= 3) log ("on for writing ActiveNumber, Trigger: " + obj.id);
                            setActiveNumber();
                        });
                         
                        // Texte korrekt setzen
                        on ({id: [idAlarm, idActive, idOpenDetectors], change: "any"}, function (obj) {
                            // Das Timeout ggf. abbrechen
                            if (timerTexts) clearTimeout(timerTexts);  
                            // Nach einem Timeout den Check anfangen
                            timerTexts = setTimeout(setTexts, 200);
                        });
                         
                         
                         
                        // ===============================================================================
                        // Funktionen
                        // ===============================================================================
                        // Funktion     checkIfIgnoreOpenFlagSet
                        // =====================================
                        // Parameter:       Prüft, ob das IgnoreOpen-Flag für einen Melder gesetzt ist.
                        // Übergabewert:    Melder-ID
                        // Rückgabewert:    Flag-Zustand
                        function checkIfIgnoreOpenFlagSet(id){
                            var i=0;
                            while (i<detectorsIgnoreOpen.length){
                                if ( detectorsIgnoreOpen[i][0] == id )
                                    if (getState(detectorsIgnoreOpen[i][1]).val)
                                        return true;
                                i++;
                            }
                            return false;
                        }
                         
                        // Function setTexts
                        // =================
                        // Parameter:       keiner
                        // Funktion:        Abhängig von den Zuständen scharf/unscharf und
                        //                  Alarm / Kein Alarm werden Texte für
                        //                  den AlarmText richtig gesetzt. Auch der Datenpunkt idReady wird hier gesetzt.
                        // Rückgabewert:    keiner
                        function setTexts(){    
                            var textListOfDetectors = getState(idOpenDetectors).val;
                            if (textListOfDetectors.length > 0) {
                                if (!getState(idActive).val)
                                    // Offene Melder gefunden und unscharf
                                    setState(idAlarmText, textNotReady, true);
                                    setState(idReady, false, true);
                                return false;
                            } else {
                                if (getState(idActive).val && !getState(idAlarm).val)
                                    // kein offener Melder gefunden und scharf und kein Alarm
                                    setState(idAlarmText, textAlarmInactive, true);
                                else if (!getState(idActive).val)
                                    // kein offener Melder gefunden und unscharf
                                    setState(idAlarmText, textReady, true);
                                    setState(idReady, true, true);
                                return true;
                            }
                        }
                         
                        // Function getAllDetectors
                        // ========================
                        // Parameter:       keiner
                        // Funktion:        Über die Funktion getDetectorsFromFunction werden
                        //                  alle Melder von den Functions geholt und in die
                        //                  globalen Variablen dafür geschrieben.
                        // Rückgabewert:    keiner
                        function getAllDetectors(){
                            var i=0;
                            detectorsOuterSkin = getDetectorsFromFunction(functionOuterSkin);
                            detectorsIgnoreOpen = [];
                            while (i<detectorsOuterSkin.length) {
                                detectorsIgnoreOpen.push([detectorsOuterSkin[i++]]);
                            }
                            addIgnoreOpenFlags();
                            detectorsIndoor = getDetectorsFromFunction(functionIndoor);
                            detectorsDelayed = getDetectorsFromFunction(functionDelayedDetectors);
                        }
                         
                        // Function getDetectorsFromFunction
                        // =================================
                        // Parameter:       functionString
                        //                  Name der Function, in der die Melder enthalen sind.
                        // Funktion:        Alle Teilnehmer der übergebenen Function werden
                        //                  in ein Array geschrieben.
                        // Rückgabewert:    Array der Melder-IDs
                        function getDetectorsFromFunction( functionString ) {
                            if (loglevel >= 3) log ("Function getDetectorsFromFunction");
                            var detectors = [];
                            $('state(functions='+functionString+')').each(function(id, i) {
                                detectors.push(id);
                                if (loglevel >= 3) log ("This detector was added to surveillance from function "+functionString+": " + id);
                            });
                            return detectors;
                        }
                         
                        // Function detectorSurveillance
                        // =============================
                        // Parameter:       obj
                        //                  Objekt des auslösenden Melders
                        // Funktion:        Abhängig vom Schaltzustand werden die Melder überprüft.
                        //                  Bei unscharf wird nur die Liste der offenen Melder und die
                        //                  Bereitschaft der Anlage zum Scharfschalten gepfelgt.
                        //                  Bei scharf geschalteter Anlage ist es anders:
                        //                  Es wird geprüft, ob der auslösende Melder in den Außenhaut- oder
                        //                  Innenraum-Meldern enthalten ist und ob dieser ein verzögerter Melder ist.
                        //                  Abhängig davon wird entweder sofort oder verzögert Alarm ausgelöst.
                        // Rückgabewert:    keiner
                        function detectorSurveillance (obj) {
                            var active = getState(idActive).val;
                            var activeExternal = getState(idActiveExternal).val;
                            var activeInternal = getState(idActiveInternal).val;
                            var ready;
                            var ignoreOpenSet;
                            
                            if (loglevel >= 2) log ("Surveillance of detectors started, triggering detector: " + obj.common.name);
                         
                            // Alle offenen Melder feststellen
                            ready = checkDetectors(detectorsOuterSkin.concat(detectorsIndoor));
                         
                            // Auslösenden Melder schreiben
                            setState(idAlarmingDetector, obj.common.name, true);
                            setState(idAlarmingDetectorJSON, JSON.stringify(  getDetectorObject(obj.id)  ), true);
                         
                            // Prüfen, wie der der Schaltzustand ist
                            // bei unscharf
                            if (!active) {
                                if (loglevel >= 2) log ("Alarmsystem is Inactive");
                            }
                            // bei scharf intern
                            if (activeInternal) {
                                if (loglevel >= 2) log ("Alarmsystem is Internal Active");
                                if (detectorsOuterSkin.indexOf(obj.id) != -1) {
                                    if (loglevel >= 3) log ("Detector is part of Outer Skin");
                                    if (detectorsDelayed.indexOf(obj.id) != -1) {
                                        if (loglevel >= 3) log ("Detector is part of Delayed Detectors");
                                        if(!getState(idAlarm).val) setState(idEntryDelayActive, true, true);
                                        else {
                                            if (loglevel >= 3) log ("EntryDelay was already active, alarming now");
                                            setState(idAlarmAccoustical, true, true);
                                            setState(idAlarmOptical, true, true);
                                        }
                                    } else {
                                        if (loglevel >= 3) log ("Detector is not delayed");
                                        setState(idAlarmAccoustical, true, true);
                                        setState(idAlarmOptical, true, true);
                                    }
                                }
                            }
                            // bei scharf extern
                            if (activeExternal) {
                                if (loglevel >= 2) log ("Alarmsystem is External Active");
                                // Prüfen, ob er der Melder das IgnoreOpen-Flag gesetzt hat.
                                ignoreOpenSet = checkIfIgnoreOpenFlagSet(obj.id);
                                if (loglevel >= 2) log ("Detector has IgnoreOpen-Flag set true!");
                                if (ignoreOpenSet)  return;
                                if (detectorsOuterSkin.concat(detectorsIndoor).indexOf(obj.id) != -1) {
                                    if (loglevel >= 3) log ("Detector is part of Outer Skin or Indoor");
                                    if (detectorsDelayed.indexOf(obj.id) != -1) {
                                        if (loglevel >= 3) log ("Detector is part of Delayed Detectors");
                                        if(!getState(idAlarm).val) setState(idEntryDelayActive, true, true);
                                        else {
                                            if (loglevel >= 3) log ("EntryDelay was already active, alarming now");
                                            setState(idAlarmAccoustical, true, true);
                                            setState(idAlarmOptical, true, true);
                                        }
                                    } else {
                                        if (loglevel >= 3) log ("Detector is not delayed");
                                        if (loglevel >= 2) log ("System is ALARMING now!");
                                        setState(idAlarmAccoustical, true, true);
                                        setState(idAlarmOptical, true, true);
                                    }
                                }
                            }
                        }
                         
                        // Function myCreateState
                        // =======================
                        // Parameter:       id      ... id des neu anzulegenden Datenpunkts
                        //                  typ     ... typ des anzulegenden Datenpunkts ("boolean", "string", "number", etc.)
                        //                  val     ... Wert, den der Datenpunkt nach dem Anlegen haben soll
                        //                  descr   ... Name als String
                        //                  writeaccess Schreibrechte true oder false
                        // Funktion:        Mit der Funktion createState wird der neue Datenpunkt mit den übergebenen
                        //                  Parametern angelegt.
                        // Rückgabewert:    keiner
                        function myCreateState(id, typ, val, descr, writeaccess, role) {
                            if (loglevel >= 3) log ("Function myCreateState for " + id);
                            if (!existsState(id)){
                                createState(
                                    id, 
                                    val,
                                    {
                                        read: !writeaccess, 
                                        write: writeaccess, 
                                        name: descr,
                                        type: typ,
                                        def: val,
                                        role: role ? role : "state"
                                    },
                                    function() {
                                        setState(id, val, true);
                                        if (loglevel >= 3) log ("ID " + id + " sucessfully created.");
                                    }
                                );
                            } else {
                                if (loglevel >= 3) log ("ID " + id + " already existed.");
                            }
                        }
                         
                        // Function myCreateMultiState
                        // ===========================
                        // Parameter:       id      ... id des neu anzulegenden Datenpunkts
                        //                  typ     ... typ des anzulegenden Datenpunkts ("boolean", "string", "number", etc.)
                        //                  val     ... Wert, den der Datenpunkt nach dem Anlegen haben soll
                        //                  descr   ... Name als String
                        //                  min     ... Minimalwert
                        //                  max     ... Maximalwert
                        //                  list    ... Liste mit Werten und Bezeichnern im Format "0:Text0; 1:Text1; 2:Text2"
                        //                  writeaccess Schreibrechte true oder false
                        // Funktion:        Mit der Funktion createState wird der neue Datenpunkt mit den übergebenen
                        //                  Parametern angelegt.
                        // Rückgabewert:    keiner
                        function myCreateMultiState(id, typ, val, descr, writeaccess, minimum, maximum, list, role) {
                            if (loglevel >= 3) log ("Function myCreateMultiState for " + id);
                            if (!existsState(id)){
                                createState(id, val, {  read: true, 
                                                    write: writeaccess, 
                                                    name: descr,
                                                    type: typ,
                                                    def: val,
                                                    min: minimum, 
                                                    max: maximum, 
                                                    states: list,
                                                    role: role ? role : "state"
                                });
                            } else {
                                if (loglevel >= 3) log ("ID " + id + " already existed.");
                            }
                        }
                        
                        // Funktion myCreateIgnoreOpenDPs
                        // ==============================
                        // Parameter:       Keine
                        // Funktion:        Erzeugt die Datenpunkte für die Ignoge-Open-Melder.
                        //                  Dafür werden die Namen aus dem detectorsOuterSkin-Array geholt.
                        //                  Die IDs der Ignore-Open Datenpunkte für jeden Melder werden auch in
                        //                  das Array detectorsIgnoreOpen geschrieben. Dieses wird damit 3-Dimensional.
                        // Rückgabewert:    Keiner.
                        function myCreateIgnoreOpenDPs(){
                            var detectorName;
                            var idBase = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Input.IgnoreOpen.";
                            var i=0;
                            while (i<detectorsOuterSkin.length) {
                                detectorName = getObject(detectorsOuterSkin[i]).common.name.replace(/\./g,"_");
                                myCreateState(idBase + detectorName, "boolean", false, "Ignore Open for " + detectorName, true, "switch");
                                detectorsIgnoreOpen[i].push(idBase + detectorName);
                                i++;
                            }
                        }
                        
                        // Funktion addIgnoreOpenFlags
                        // ==============================
                        // Parameter:       Keine
                        // Funktion:        Fügt dem Array für die Ignore-Open Datenpunkte die Flags hinzu.
                        // Rückgabewert:    Keiner.
                        function addIgnoreOpenFlags(){
                            var detectorName;
                            var idBase = "javascript." + javascriptInstance + "." + pathToCreatedStates + ".Input.IgnoreOpen.";
                            var i=0;
                            while (i<detectorsOuterSkin.length) {
                                detectorName = getObject(detectorsOuterSkin[i]).common.name.replace(/\./g,"_");
                                detectorsIgnoreOpen[i].push(idBase + detectorName);
                                i++;
                            }
                        }
                        
                        // Function switchActiveExternal
                        // =============================
                        // Parameter:       keiner
                        // Funktion:        Nach Prüfung auf Bereitschaft zum externen Scharfschalten, wird 
                        //                  scharf geschaltet oder ein Fehler angezeigt.
                        // Rückgabewert:    keiner
                        function switchActiveExternal () {
                            if (loglevel >= 3) log ("Function switchActiveExternal");
                            setState(idExitDelayActive, false, true);
                            var ok = checkDetectors(detectorsOuterSkin.concat(detectorsIndoor));
                            if (ok) {
                                setState(idActiveExternal, true, true);
                                setState(idActive, true, true);
                                setState(idStatusText, textStatusActiveExternal, true);
                                setState(idAlarmText, textAlarmInactive, true);
                                setState(idAlarmingDetector,"", true);
                                setState(idError, false, true);
                                if (loglevel >= 2) log ("Switched to External Active");
                            } else {
                                if (loglevel >= 2) log ("NOT ready to switch to External Active!");
                                setState(idError, true, true);
                            }
                        }
                         
                        // Function switchActiveInternal
                        // =============================
                        // Parameter:       keiner
                        // Funktion:        Nach Prüfung auf Bereitschaft zum internen Scharfschalten, wird 
                        //                  scharf geschaltet oder ein Fehler angezeigt.
                        // Rückgabewert:    keiner
                        function switchActiveInternal () {
                            if (loglevel >= 3) log ("Function switchActiveInternal");
                            var ok = checkDetectors(detectorsOuterSkin);
                            if (ok) {
                                setState(idActiveInternal, true, true);
                                setState(idActive, true, true);
                                setState(idStatusText, textStatusActiveInternal, true);
                                setState(idAlarmText, textAlarmInactive, true);
                                setState(idAlarmingDetector,"", true);
                                setState(idError, false, true);
                                if (loglevel >= 2) log ("Switched to Internal Active");
                            } else {
                                if (loglevel >= 2) log ("NOT ready to switch to Internal Active!");
                                setState(idError, true, true);
                            }
                        ;}
                         
                        // Function switchInactive
                        // =============================
                        // Parameter:       keiner
                        // Funktion:        Es wird unscharf geschaltet und die ganze Anlage resetiert.
                        // Rückgabewert:    keiner
                        function switchInactive () {
                            if (loglevel >= 3) log ("Function switchInactive");
                            if (timerExitDelay) clearTimeout(timerExitDelay);
                            setState(idEntryDelayActive, false, true);
                            setState(idExitDelayActive, false, true);
                            setState(idActiveExternal, false, true);
                            setState(idActiveInternal, false, true);
                            setState(idActive, false, true);
                            setState(idError, false, true);
                            clearStateDelayed(idAlarmAccoustical);
                            clearStateDelayed(idAlarmOptical);
                            setState(idAlarmAccoustical, false, true);
                            setState(idAlarmOptical, false, true);
                            setState(idAlarm, false, true);
                            setState(idAlarmText, textAlarmInactive, true);
                            setState(idStatusText, textStatusInactive, true);
                            checkDetectors(detectorsOuterSkin.concat(detectorsIndoor));
                            if (loglevel >= 2) log ("Switched to Inactive");
                            getAllDetectors();
                        }
                         
                        // Function setActiveNumber
                        // =======================
                        // Parameter:       keine
                        // Funktion:        Prüft ob intern scharf, extern scharf oder unscharf ist und
                        //                  ob jeweils Eingangs- oder Ausgangsverzögerung aktiv ist.
                        //                  Abhängig davon wird der Datenpunt "Output.ActiveNumber"
                        //                  wie folgt gesetzt:
                        //                    0 ... unscharf
                        //                    1 ... intern scharf
                        //                    2 ... extern scharf
                        //                    3 ... Eingangsverzögerung aktiv
                        //                    4 ... Ausgangsverzögerung aktiv
                        // Rückgabewert:    keiner
                        function setActiveNumber () {
                            if (loglevel >= 3) log ("Function setActiveNumber");
                            var internal = getState(idActiveInternal).val;
                            var external = getState(idActiveExternal).val;
                            var entry = getState(idEntryDelayActive).val;
                            var exit = getState(idExitDelayActive).val;
                            if (!external && !internal) {
                                if (exit)
                                    setState(idActiveNumber, 4, true);
                                else
                                    setState(idActiveNumber, 0, true);
                            }
                            if (internal) setState(idActiveNumber, 1, true);
                            if (external){
                                if (entry)
                                    setState(idActiveNumber, 3, true);
                                else
                                    setState(idActiveNumber, 2, true);
                            }
                        }
                         
                        // Function checkDetectors
                        // =======================
                        // Parameter:       detectors
                        //                  Array mit Melder-IDs
                        // Funktion:        Alle Melder aus dem Array werden geprüft und alle offenen
                        //                  Melder werden in einen Datenpunkt geschrieben als String.
                        //                  Das Trennzeichen zwischen den Meldernamen ist die globale
                        //                  Variable "seperator".
                        // Rückgabewert:    true, wenn alle Melder in Ruhe sind
                        //                  false, wenn ein oder mehr Melder ausgelöst sind
                        function checkDetectors ( detectors ) {
                            if (loglevel >= 3) log ("Function checkDetectors");
                            var i=0;
                            var textListOfDetectors="";
                            var textListOfDetectorsIgnoreOpen="";
                            var objOpenDetectors = {
                                title: "All open detectors",
                                zone: null,
                                listOfDetectors:    []
                            };
                            var objOpenDetectorsOuterSkin = {
                                title: "Open detectors outer skin",
                                zone: functionOuterSkin,
                                listOfDetectors:    []
                            };
                            var objOpenDetectorsIndoor = {
                                title: "Open detectors indoor",
                                zone: functionIndoor,
                                listOfDetectors:    []
                            };
                            while(i < detectors.length) {
                                if (getState(detectors[i]).val) {
                                    if (checkIfIgnoreOpenFlagSet(detectors[i])) {
                                        if (textListOfDetectorsIgnoreOpen.length > 0) textListOfDetectorsIgnoreOpen += seperator;
                                        textListOfDetectorsIgnoreOpen += getObject(detectors[i]).common.name;
                                    }
                                    else {
                                        if (textListOfDetectors.length > 0) textListOfDetectors += seperator;
                                        textListOfDetectors += getObject(detectors[i]).common.name;
                                    }
                                    var detObj = getDetectorObject(detectors[i]);
                                    objOpenDetectors.listOfDetectors.push(detObj);
                                    if (detectorsOuterSkin.indexOf(detectors[i]) != -1) objOpenDetectorsOuterSkin.listOfDetectors.push(detObj);
                                    if (detectorsIndoor.indexOf(detectors[i]) != -1) objOpenDetectorsIndoor.listOfDetectors.push(detObj);
                                }
                                i++;
                            }
                            if (loglevel >= 3) log ("Open Detectors found: " + (textListOfDetectors.length ? textListOfDetectors : "none"));
                            
                            // Datenpunkte schreiben
                            setState(idOpenDetectors, textListOfDetectors, true);
                            setState(idOpenDetectorsWithIgnoreOpenFlagSet, textListOfDetectorsIgnoreOpen, true);
                            setState(idOpenDetectorsJSON, JSON.stringify(objOpenDetectors), true);
                            setState(idOpenDetectorsOuterSkinJSON, JSON.stringify(objOpenDetectorsOuterSkin), true);
                            setState(idOpenDetectorsIndoorJSON, JSON.stringify(objOpenDetectorsIndoor), true);
                         
                            if (textListOfDetectors.length > 0) {
                                return false;
                            } else {
                                return true;
                            }
                        }
                         
                        // Function getDetectorObject
                        // ==========================
                        // Parameter:       id
                        //                  id eines Melder-States
                        // Funktion:        Vom Melder mit der id wird das Objekt über getObjekt(id) geholt,
                        //                  sowie von seinem Parent und ParentsParent.
                        //                  Alle Objekte kommen in ein großes Objekt und werden zurück gegeben.
                        // Rückgabewert:    Das Objekt des Melders samt Parent und ParentsParent (sofern es welche gibt)
                        function getDetectorObject (id) {
                            if (loglevel >= 3) log ("Function getDetectorObject for id: " + id);
                            // ioBroker Parent-Datenpunkt (z.B. Kanal), kann auch null sein (zB bei KNX)
                            var idParent = id.substr(0, id.lastIndexOf("."));
                            // ioBroker ParentsParent-Datenpunkt (z.B. Gerät), kann auch null sein (zB bei KNX)
                            var idParentsParent = idParent.substr(0, idParent.lastIndexOf("."));
                         
                            // Objekte dazu holen (falls es welche gibt)
                            var obj    = getObject(id);
                            var objParent = null;
                            if ($('state[id=' + idParent + '$]').length > 0) {
                        
                                objParent = getObject(idParent);
                            }
                            var objParentsParent = null;
                            if ($('state[id=' + idParentsParent + '$]').length > 0) {
                                objParentsParent = getObject(idParentsParent);
                            }
                         
                            // Alle Objekte in ein großes Objekt sammeln
                            var detectorsObj = {
                                id:             id,
                                self:           obj,
                                parent:         objParent,
                                parentsparent:  objParentsParent
                            };
                         
                            // Rückgeben
                            return detectorsObj;
                        }
                        

                        Änderungshistorie

                        • 2020-05-01, Erstellung
                        • 2020-05-02, Number-Datenpunkte für Ein- und Ausgabe des Schaltzustands (Idee von @Homer.J.)
                        • 2020-05-03, Korrekturen, u.a. für Melderauswertung (chage: "ne") & Status-Text
                        • 2020-05-04, Melder werden aus den Functions (Aufzählungen, enums) dafür geholt. Auch beim Unscharf-schalten, dadurch ist kein Neustarten des Skripts notwendig bei Änderungen an diesen Aufzählungen.
                          Eine Schaltung von einem scharf-Zustand auf einen anderen wird verhindert. ZB von scharf intern auf scharf extern. Es muss immer unscharf dazwischen geschaltet werden.
                        • 2020-05-09, Zusätzliche Objekte mit JSON-Strings für:
                          _ den auslösenden Melder
                          _ alle offenen Melder
                          _ alle offenen Melder der Außenhaut
                          _ alle offenen Melder des Innenraums
                          Die JSON-String beinhalten das auslösende Objekt, sowie (falls vorhanden) das Parent und das ParentsParent-Objekt mit allen in ioBroker verfügbaren Eigenschaften.
                          Außerdem kleinere Verbesserungen, z.B. bezüglich setzen der AlarmTexte.
                        • 2020-05-12 Andreas Kos Setzen des Datenpunkts idReady zur Bereitschaftsanzeige neu gemacht.
                        • 2021-06-13 Andreas Kos Einbau der Funktion zum Ausnehmen einzelner Melder der Aussenhülle von der Melder-Überwachung. Soll zum Kippen von Fenstern dienen u.ä.
                        • 2022-03-20 Andreas Kos Verbesserung beim Laden der Parents- und Parentsparents-Objekte und Umbau auf aktuellen Javascript-Adapter mit Ack-Flags bei createState und setState
                        • 2022-12-02 Andreas Kos Korrektur beim Prüfen der IgnoreOpen-Flags.
                        • 2022-12-18 Andreas kos Korrektur beim Anlegen der States, sodass ein Neustart des Scripts eine weitere Funktion der Anlage garantiert, auch, wenn diese zuvor im Zustand "scharf" war.
                        sigi234S Online
                        sigi234S Online
                        sigi234
                        Forum Testing Most Active
                        schrieb am zuletzt editiert von sigi234
                        #81

                        @andreaskos

                        Hallo, habe mal unten verlinkt zu meinen Beitrag, weis nicht ob du auch in den Adapter integriert bist?
                        Machst du noch was an deinen Skript?
                        Pin Code ist ja von Dir.

                        Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
                        Immer Daten sichern!

                        1 Antwort Letzte Antwort
                        0
                        • sigi234S sigi234

                          @sruhsam

                          https://forum.iobroker.net/topic/28717/vis-von-sigi234

                          Suche die Alarmanlage View

                          S Offline
                          S Offline
                          sruhsam
                          schrieb am zuletzt editiert von
                          #82

                          @sigi234
                          Hallo, hab ich gemacht, View geladen. Dann habe ich wie beschrieben das Blockly-Script importieren wollen und bekomm folgenden Fehler beim Importieren:
                          TypeError: Unknown block type: telegram

                          sigi234S 1 Antwort Letzte Antwort
                          0
                          • S sruhsam

                            @sigi234
                            Hallo, hab ich gemacht, View geladen. Dann habe ich wie beschrieben das Blockly-Script importieren wollen und bekomm folgenden Fehler beim Importieren:
                            TypeError: Unknown block type: telegram

                            sigi234S Online
                            sigi234S Online
                            sigi234
                            Forum Testing Most Active
                            schrieb am zuletzt editiert von sigi234
                            #83

                            @sruhsam sagte in fUmfassendes Alarmanlagen-Skript:

                            TypeError: Unknown block type: telegram

                            Musst du installieren! Dann einfach Instanz deaktivieren.

                            Screenshot (307).png

                            Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
                            Immer Daten sichern!

                            W 1 Antwort Letzte Antwort
                            0
                            • sigi234S sigi234

                              @sruhsam sagte in fUmfassendes Alarmanlagen-Skript:

                              TypeError: Unknown block type: telegram

                              Musst du installieren! Dann einfach Instanz deaktivieren.

                              Screenshot (307).png

                              W Offline
                              W Offline
                              wykat
                              schrieb am zuletzt editiert von
                              #84

                              Hi,

                              brauch jetzt mal hilfe, komme einfach nicht weiter mit (kenne mir leider auch noch beschrankt mit Javascript aus).

                              Mein probleem is das keine sensoren erkannt werden;

                              // Arrays für die Melder
                              var detectorsOuterSkin = [
                              'hm-rpc.2.xxxxxx.1.STATE'/State/,
                              'zwave2.0.Node_008.Binary_Sensor.tamper'/Node 008 Binary Sensor tamper/
                              ];
                              console.log("detectorsOuterSkin: " + detectorsOuterSkin);
                              Das log gibt:
                              javascript.0 (2816) script.js.common.Test_alarm: detectors: OuterSkinhm-rpc.2.xxxxxx.1.STATE,zwave2.0.Node_008.Binary_Sensor.tamper

                              Aber beim einlesen passiert nichts:
                              function getAllDetectors(){
                              detectorsOuterSkin = getDetectorsFromFunction(functionOuterSkin);
                              console.log("detectorsOuterSkin: " + detectorsOuterSkin);
                              Das log gibt dann:
                              javascript.0 (2816) script.js.common.Test_alarm: detectorsOuterSkin:
                              Ich kann die alarmanlage aktivieren (in objects), aber erkennt auch keine tur offnen obwohl ich hm-rpc.2.xxxxxx.1.STATE auch gelogged hab und gibt eindeutig 0 (geschlossen) und 1 aus. Hab auch uber eine variabele auf true/false versucht, funktioniert auch nicht.

                              W 1 Antwort Letzte Antwort
                              0
                              • W wykat

                                Hi,

                                brauch jetzt mal hilfe, komme einfach nicht weiter mit (kenne mir leider auch noch beschrankt mit Javascript aus).

                                Mein probleem is das keine sensoren erkannt werden;

                                // Arrays für die Melder
                                var detectorsOuterSkin = [
                                'hm-rpc.2.xxxxxx.1.STATE'/State/,
                                'zwave2.0.Node_008.Binary_Sensor.tamper'/Node 008 Binary Sensor tamper/
                                ];
                                console.log("detectorsOuterSkin: " + detectorsOuterSkin);
                                Das log gibt:
                                javascript.0 (2816) script.js.common.Test_alarm: detectors: OuterSkinhm-rpc.2.xxxxxx.1.STATE,zwave2.0.Node_008.Binary_Sensor.tamper

                                Aber beim einlesen passiert nichts:
                                function getAllDetectors(){
                                detectorsOuterSkin = getDetectorsFromFunction(functionOuterSkin);
                                console.log("detectorsOuterSkin: " + detectorsOuterSkin);
                                Das log gibt dann:
                                javascript.0 (2816) script.js.common.Test_alarm: detectorsOuterSkin:
                                Ich kann die alarmanlage aktivieren (in objects), aber erkennt auch keine tur offnen obwohl ich hm-rpc.2.xxxxxx.1.STATE auch gelogged hab und gibt eindeutig 0 (geschlossen) und 1 aus. Hab auch uber eine variabele auf true/false versucht, funktioniert auch nicht.

                                W Offline
                                W Offline
                                wykat
                                schrieb am zuletzt editiert von
                                #85

                                Weiss nicht welche taste aber bericht wurde schon versand....

                                Wass mache ich da falsch und wie kann ich die JSON datapoints verwenden?

                                thx,

                                W 1 Antwort Letzte Antwort
                                0
                                • W wykat

                                  Weiss nicht welche taste aber bericht wurde schon versand....

                                  Wass mache ich da falsch und wie kann ich die JSON datapoints verwenden?

                                  thx,

                                  W Offline
                                  W Offline
                                  wykat
                                  schrieb am zuletzt editiert von
                                  #86

                                  Hier mal die screenshots:
                                  63f34cf2-b042-4bdb-9c1c-e280f5a2922e-image.png

                                  7cac544e-7a88-4eb4-a17a-4fb8b7c3d1c5-image.png

                                  6a31e942-bc2a-4959-92b7-1ccab4811cde-image.png

                                  Homer.J.H 1 Antwort Letzte Antwort
                                  0
                                  • W wykat

                                    Hier mal die screenshots:
                                    63f34cf2-b042-4bdb-9c1c-e280f5a2922e-image.png

                                    7cac544e-7a88-4eb4-a17a-4fb8b7c3d1c5-image.png

                                    6a31e942-bc2a-4959-92b7-1ccab4811cde-image.png

                                    Homer.J.H Offline
                                    Homer.J.H Offline
                                    Homer.J.
                                    schrieb am zuletzt editiert von
                                    #87

                                    @wykat bei Array kommt nichts rein schau mal in Zeile 77-79 die musst du bei Aufzählungen als Funktion angelegt haben. Und achte auf Groß-und Kleinschreibung.

                                    W 1 Antwort Letzte Antwort
                                    0
                                    • Homer.J.H Homer.J.

                                      @wykat bei Array kommt nichts rein schau mal in Zeile 77-79 die musst du bei Aufzählungen als Funktion angelegt haben. Und achte auf Groß-und Kleinschreibung.

                                      W Offline
                                      W Offline
                                      wykat
                                      schrieb am zuletzt editiert von
                                      #88

                                      @Homer-J said in Umfassendes Alarmanlagen-Skript:

                                      @wykat bei Array kommt nichts rein schau mal in Zeile 77-79 die musst du bei Aufzählungen als Funktion angelegt haben. Und achte auf Groß-und Kleinschreibung.

                                      Muss da irgendwie auf der leitung stehen. Meinst du zeilen 85 - 87 im original script (hatte das auch mal versucht)? Gibt's irgendwo ein beispiel? Hatte zuerst das hier aus diesem thread verwendet, das sollte aber falsch sein.

                                      4f106df1-658e-403e-b0fa-d8df8bcd9707-image.png

                                      Danke.

                                      Homer.J.H 1 Antwort Letzte Antwort
                                      0
                                      • W wykat

                                        @Homer-J said in Umfassendes Alarmanlagen-Skript:

                                        @wykat bei Array kommt nichts rein schau mal in Zeile 77-79 die musst du bei Aufzählungen als Funktion angelegt haben. Und achte auf Groß-und Kleinschreibung.

                                        Muss da irgendwie auf der leitung stehen. Meinst du zeilen 85 - 87 im original script (hatte das auch mal versucht)? Gibt's irgendwo ein beispiel? Hatte zuerst das hier aus diesem thread verwendet, das sollte aber falsch sein.

                                        4f106df1-658e-403e-b0fa-d8df8bcd9707-image.png

                                        Danke.

                                        Homer.J.H Offline
                                        Homer.J.H Offline
                                        Homer.J.
                                        schrieb am zuletzt editiert von
                                        #89

                                        @wykat bei dir sind es die Punkte 85-87 die musst du unter Aufzählung erstellen und deine jeweiligen Sensoren reinpacken.
                                        Hier https://forum.iobroker.net/topic/31657/test-adapter-alarm-1-1-x gibt es aber auch einen leicht zu konfigurierenten Adapter.

                                        W 1 Antwort Letzte Antwort
                                        0
                                        • Homer.J.H Homer.J.

                                          @wykat bei dir sind es die Punkte 85-87 die musst du unter Aufzählung erstellen und deine jeweiligen Sensoren reinpacken.
                                          Hier https://forum.iobroker.net/topic/31657/test-adapter-alarm-1-1-x gibt es aber auch einen leicht zu konfigurierenten Adapter.

                                          W Offline
                                          W Offline
                                          wykat
                                          schrieb am zuletzt editiert von
                                          #90

                                          @Homer-J danke, denk hab's verstanden;
                                          Das script wird nicht mehr angepasst, aber sensoren werden unter Aufzahlungen (heist bei mir in English ENUM).
                                          Zuerst war diese option bei mir nicht eingeblendet (ENUM), jetzt ist es da
                                          Konnte auch unter functions das ENUM 'alarmanlage_aussenhat' erstellen, nur fehlt mir das '+' um etwas zu zufugen. Irgend etwas fehlt da noch. Kann's nur loschen oder andern, nicht editieren.

                                          c4c3a735-fca2-42b9-83b2-65de650f6e66-image.png

                                          Homer.J.H 1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          773

                                          Online

                                          32.5k

                                          Benutzer

                                          81.6k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe