Ankündigung

Einklappen
Keine Ankündigung bisher.

Suche Hilfe bei einem Logik-Problem - Alarmanlage

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Suche Hilfe bei einem Logik-Problem - Alarmanlage

    Hallo,

    ich beschreibe mal meine Idee und danach meine Wissenslücken.
    Meine Idee ist es eine Alarmanlage zu bauen. Hierzu möchte ich aktuell nur meine Fensterkontakte, den Haustürkontackt und einen Taster nutzen. Ich weiß natürlich, dass Tür-/Fensterkontakte keinen wirklichen Einbruchsschutz bieten. Präsenzmelder sollen demnächst noch ergänzt werden. die Kabel liegen bereits in der Decke - Geld ist aber alle

    Meine Probleme:
    1. Wie kann ich in einer Rule alle Fensterkontakte auf ein Update prüfen ohne alle per && in einer If-Abfrage aufführen zu müssen? Kann ich ganze Gruppen auf einen "Change" prüfen?
    2. Wenn der Türkotakt auf CLOSE steht und zusätzlich noch der Taster "A" ein ON sendet soll die Alarmanlage scharf sein. Ab dem Zeitpunkt soll also der "Change" aus Punkt 1 eine Aktion auslösen (z.B. alle Lichter Blinken). Wie merke ich mir für meine Rule, dass die Alarmanlage scharf ist?
    3. Wie zeige ich mir den Status der Alarmanlage in der Sitemap an? Wie kann ich Werte allgemein aus einer Rule an die Sitemap übergeben?
    4. Kann ich das "Gira Relais-Modul für Gira Rauchwarnmelder Dual Q" so ansteuern, dass die Rauchmelder alle piepen?
    5. Welche Ideen habt Ihr für einen Alarm? (Ich kann aktuell leider keine Stereoanlage ansprechen).

    Hier noch mein erster Regelansatz:
    Code:
    rule Alarm
    when
        Item GruppeALLContacts received update
    then
        if((Contact_Haustuer == CLOSE) && (Switch_Alarm_Taster == ON)){
             sendMail("da@xxxxxxx.de", ALARM, "Haus wird leergeräumt!")
             (1..50).forEach [
                  sendCommand(gLichtALL, ON)
                  Thread::sleep(2000)
                  sendCommand(gLichtALL, OFF)
                  Thread::sleep(2000)
             ]
        }
    Vielen Dank
    Zuletzt geändert von edvtalker; 22.03.2016, 14:07.

    #2
    Hi,

    ich nehme mal an, du hast KNX.

    zu 1.: Das würde ich mit einer KNX-Gruppe lösen. Alle Kontakte in die Gruppe und die Gruppe in openHAB auswerten.
    zu 2. und 3.: Siehe hier: https://knx-user-forum.de/forum/supp...b-m%C3%B6glich, insbesondere ab Post #4

    zu 4.: Soweit ich weiss, nein. Alternativlösung mit EI-Rauchmeldern auch im genannten Link (Post #14)
    zu 5.: Alarmsirene /-hupe, alternativ Rauchmelder pfeifen lassen, NotifyMyAndroid, etc

    Gruß,
    thoern
    Zuletzt geändert von thoern; 21.03.2016, 14:42.

    Kommentar


      #3
      Zu 1: das Snippet für die Rule sieht ungefähr so aus:
      Code:
      GruppeALLContacts?.members.forEach(item|if(item.state==OPEN) logInfo("meine Rule","{} Kontakt offen!",item.name))
      würde für jedes item aus GruppeALLContacts eine Logzeile ausgeben, sofern der Status OPEN ist.
      Du kannst auch einen Filter auf die Gruppe anwenden, dann sind gleich nur die Elemente in der Auflistung, die der Gruppe angehören und deren Status OPEN ist (such mal hier im Forum mit Stichwort filter, oder eventuell auch im englischen Forum).

      2. Scharfstellen der Alarmanlage:
      Code:
      rule "scharf stellen"
      when
          Item A received command ON
      then
          if (Contact_Haustuer.state == CLOSED) {
              AlarmON.sendCommand(ON)
              logInfo("scharf stellen","Alarm scharf geschaltet!")
          }
      end
      Du triggerst also auf den Schalter, der die Anlage scharf stellen soll. Wenn der Trigger auslöst, schaust Du nach dem Status der Tür.
      Den Zustand der Alarmanlage merkst Du Dir in einem Switch Item:
      Code:
      Switch AlarmON "Alarm scharf [%s]" <siren>
      3. das kannst Du auf der UI anzeigen, und zwar ohne Schaltelement:
      Code:
      Text item=AlarmON
      5. Benachrichtigung über eMail oder twitter auf das Handy, im Haus Licht blinken lassen wäre ohne zusätzliche Hardware möglich. Falls Du RGB-Leuchten einsetzt, könntest Du die in Rot blinken lassen, was auch immer Dir einfällt.

      Kommentar


        #4
        Danke für Deine schnelle Antwort. Damit bin ich der Sache schon näher. Ein Update:

        zu 1.: Ja ich nutze KNX. Hinter der Gruppe "gFenstOnly" stecken alle Fensterkontakte. Hier der entsprechende Code mit zwei weiteren Fragen:
        Code:
        rule "Alarmanlage"
        when
            Item gFenstOnly received update && [U]// das funktioniert - öffne ich irgendein Fenster, wird hier ein 'update' erkannt.[/U]
            Item Alarm_schalten.state == ON [U]// das funktioniert nicht - obwohl ich über die app das switchitem "Alarm_schalten" eingeschaltet habe. Wie bekomme ich hier den Status?[/U]
        then
            var String Titel = "Alarmanlage"
            var String Text = "Fensterstatus hat sich geändert!" [U]//hier würde ich gerne genaues ausgeben - wie kann man Beispielsweise das entsprechende Fenster welches jetzt offen ist hier ausgeben?[/U]
            sendMail("xx@xx.de", Titel, Text)
            notifyMyAndroid(Titel, Text)
        end
        Danke!

        Kommentar


          #5
          Ups - da haben sich die Antworten überschnitten. @udo1toni: Danke auch an Dich für die ausführliche Antwort. Also kann ich in einer Rule nicht direkt den aktuellen Status von Switchitems abfragen? Ich muss beim "switchen" das "update" annehmen und in eine Variable schreiben? So dass ich es dann später abfragen kann?

          Also quasi so?:

          Code:
          //Speichern des Alarmknopfstatus
          rule "Save Event Alaram Taster"
          when
              Item Alarm_schalten received command ON
          then
              var String AlarmTaster = ON
          end
          
          
          //Speichern des Haustürstatus
          rule "Save Tuer Event"
          when
              Item Contact_Haustuer received update CLOSED
          then
              if (AlarmTaster.state == ON) {
                  var String Alram1 = ON
                 
              }
              var String AlarmHaustuer = Close
          end
          
          //Einen Alarm auslösen
          rule "Alarmanlage"
          when
              Item gFenstOnly received update && // das funktioniert - öffne ich irgendein Fenster, wird hier ein 'update' erkannt.
              Alarm1.state == ON // das funktioniert nicht - obwohl ich über die app das switchitem "Alarm_schalten" eingeschaltet habe. Wie bekomme ich hier den Status?
          then
              var String Titel = "Alarmanlage"
              var String Text = "Fensterstatus hat sich geändert!" //hier würde ich gerne genaues ausgeben - wie kann man Beispielsweise das entsprechende Fenster welches jetzt offen ist hier ausgeben?
              sendMail("xx@xx.de", Titel, Text)
              notifyMyAndroid(Titel, Text)
          end

          Kommentar


            #6
            Code:
            Item gFenstOnly received update && [U]// das funktioniert - öffne ich irgendein Fenster, wird hier ein 'update' erkannt.[/U]
            Das funktioniert zwar, ist aber trotzdem fehlerhaft.
            Code:
            Item Alarm_schalten.state == ON [U]// das funktioniert nicht - obwohl ich über die app das switchitem "Alarm_schalten" eingeschaltet habe. Wie bekomme ich hier den Status?[/U]
            Ein && gibt es in der when-clause nicht. In der when-clause geht nur ein OR als Verknüpfung. Der Grund hierfür ist ganz einfach, wenn man sich überlegt, was in der when-clause drin steht, nämlich ein Ereignis, welches die Rule triggert. Wenn ich nun also eine Und-Verknüpfung einfügen könnte, müssten zwei oder gar noch mehr Ereignisse zeitgleich eintreten (und damit ist wirklich exakt derselbe Zeitpunkt gemeint - selbst eine Abweichung von einer Millisekunde gilt nicht).
            Macht aber nichts, in meinem Vorpost hab ich ja gezeigt, wie es richtig geht - Auf das Ereignis triggern, anschließend im then-Teil mit if den Status berücksichtigen.
            Zitat von edvtalker Beitrag anzeigen
            Ich muss beim "switchen" das "update" annehmen und in eine Variable schreiben?
            Bei einer Gruppe musst Du auf jeden Fall mit received update arbeiten. Der Grund hierfür ist klar - Stell Dir vor, Du hast eine Gruppe mit zwei membern A und B, beide vom Typ Contact. Ausgangssituation ist, dass beide Items CLOSED sind, also ist die Gruppe auch CLOSED. A nun auf OPEN wechselt, wechselt die Gruppe meinetwegen auch auf OPEN. Wenn B auch noch auf OPEN wechselt, kann die Gruppe keinen Change mehr ausführen, ein Update geht aber noch. Umgekehrt ist ja auch nicht klar, soll die Gruppe dann auf CLOSED wechseln, wenn B weiterhin OPEN ist, aber A auf CLOSED wechselt?
            Code:
            rule "Alarm ausgelöst"
            when
                Item gFensterOnly received update
            then
                if (Alarm1.state == ON) {
                    val String Titel = "Alarmanlage"
                    var String Text = "Fensterstatus hat sich geändert!\r\r"
                    gFensterOnly.members.filter(s|s.state == OPEN).forEach(i | Text = Text + i.name + " offen!\r" )
                    sendMail("xx@xx.de", Titel, Text)
                    notifyMyAndroid(Titel, Text)
               }
            end
            Wobei der Code jetzt so aus dem Kopf ist, da sind bestimmt noch mehrere Fehler drin Aber ich denke, es ist klar, wie es gedacht ist. Die Mail sollte dann so aussehen:
            Code:
            Fensterstatus hat sich geändert!
            
            Fenster_1 offen!
            Fenster_5 offen!
            Fenster_7 offen!
            Vorausgesetzt, die Items Fenster_1, Fenster_5 und Fenster_7 gehören alle zur Gruppe gFensterOnly und zwei davon sind geöffnet, während das dritte gerade geöffnet wird.
            Zuletzt geändert von udo1toni; 21.03.2016, 21:07.

            Kommentar


              #7
              Vielen Dank! Unten meine aktuelle Lösung - falls es jemanden interessiert. Ist zwar noch nicht perfekt und ich brauche auch dringend mindestens einen Präsenzmelder für das EG - aber das Grundgerüst ist fertig.
              Übrigens: Bei den untereinander verbundenen Gira Rauchwarnmelder Dual Q muss man nur irgendwo ein potentialfreies Relais zwischen hängen, dann kann man die alle Pipen lassen als Alarm.
              Code:
              //Speichern des Alarmknopfstatus
              var String AlarmTaster
              
              rule "Save Event Alaram Taster"
              when
                  Item Alarm_schalten received command ON or
                  Item Zentral_AUS received command ON
              then
                  AlarmTaster = 'ALARMAN'
                  logInfo("ALARM", AlarmTaster)
                  var String Text = ""
                  gFenstOnly.members.filter(s | s.state == OPEN).forEach(i | Text = Text + i.name + " offen!\r" )
                  sendMail('xx@xx.de', 'Es sind noch Fenster offen!', Text)
              end
              
              rule "Clear Event Alaram Taster"
              when
                  Item Alarm_schalten received command OFF or
                  Item Zentral_EIN received command ON
              then
                  AlarmTaster = 'AUS'
                  logInfo('ALARM', AlarmTaster)
              end
              
              
              //Einen Alarm auslösen Fenster
              rule "Alarmanlage Fenster"
              when
                  Item gFenstOnly received update
              then
                  if((FK_Haustuer.state == CLOSED) && (AlarmTaster == 'ALARMAN')){
                      logInfo('ALARM', 'ALARM AN!!!!')
                      var String Text = ""
                      gFenstOnly.members.filter(s|s.state == OPEN).forEach(i | Text = Text + i.name + " offen!\r" )
                      sendMail('xx@xx.de', 'Alarmanlage meldet Einbruch!!!', Text)
                      //notifyMyAndroid(Titel, Text)
                  }
              end
              
              //Einen Alarm auslösen Tuer
              rule "Alarmanlage Tuer"
              when
                  Item FK_Haustuer received update OPEN
              then
                  Thread::sleep(60000)
                  if(AlarmTaster == 'ALARMAN'){
                      var i = 0
                      while((AlarmTaster == 'ALARMAN') && (i < 30)){
                          i = i + 1
                          sendMail('xx@xx.de', 'Alarmanlage - Zeit abgelaufen für Alarm aus!!!', 'Die Tuer wurde geöffnet aber die Alarmanlage wurde nicht innerhalb von ' + i + ' Minuten deaktiviert!')
                          //notifyMyAndroid(Titel, Text)
                          Thread::sleep(60000)
                      }
                  }
              end
              Zuletzt geändert von edvtalker; 22.03.2016, 10:25.

              Kommentar


                #8
                Zitat von edvtalker Beitrag anzeigen
                Übrigens: Bei den untereinander verbundenen Gira Rauchwarnmelder Dual Q muss man nur irgendwo ein potentialfreies Relais zwischen hängen, dann kann man die alle Pipen lassen als Alarm.
                Gehen die dann auch wieder aus, sobald das Relais wieder in Ruhestellung ist? Und sind die Brandmelder anschließendwieder einsatzbereit?

                Thread::sleep() kann man zwar machen, es ist aber günstiger, mittels createTimer() ein Event zu erzeugen. Wenn in der Zwischenzeit der Alarm ausgeschaltet wurde, kann dieser Timer dort auch gecancelt werden.

                Wenn ich das Ganze in Gedanken richtig durchspiele, passiert folgendes: Wenn Du das Haus verlässt, musst Du die Haustür öffnen. Entweder, Du schaltest vorher den Alarm scharf, oder wenn die Tür bereits geöffnet ist. In beiden Fällen löst die Rule aus, nach 60 Sekunden bekommst Du 30 Minuten lang regelmäßig Alarmmeldungen. Der einzige Weg, das zu verhindern ist, die Tür zu öffnen, mindestens 60 Sekunden zu warten und erst dann den Alarm scharf zu stellen. Besser wäre also
                1. Ein Timeout nach dem Schärfen der Anlage, der Dir erlaubt, das Haus zu verlassen, ohne dass der Alarm auslöst und
                2. Eine Alarmschleife, die über ein TimerEvent läuft und somit keinen eigenen Thread erzeugt.

                Weiterhin ist die Frage, warum Du den Zustand der Alarmanlage in einer Variablen sicherst, statt ein Item dafür anzulegen. Items müssen nicht unbedingt an ein Binding gekopppelt sein, erfüllen also die gleiche Funktion wie eine entsprechende Variable, nur mit mehr Komfort

                Kommentar


                  #9
                  Hi,

                  leider habe ich Deine Antwort jetzt erst gelesen...
                  Ob die Gira-Melder wieder ausgehen - muss ich noch testen. Ich habe die immer noch nicht angeschraubt geschweige denn verbunden...
                  Deine Logik ist gut - aber Du weißt ja auch nicht, dass die Tür erst als geschlossen gilt, wenn diese Abgeschlossen wird Der Türkontakt ist in der Türfalle verbaut.

                  Das mit dem item wäre super. Ich bekomme den Status aber irgenwie nicht ausgelesen.

                  items
                  Code:
                  Switch Alarm_schalten "Alarmanlage" <alarm> (Szenen)
                  sitemap
                  Code:
                  Switch item=Alarm_schalten
                  rules
                  Code:
                  rule "Save Event Alaram Taster"
                  when
                      Item Alarm_schalten changed to ON or
                      Item Zentral_AUS received command OFF
                  then
                      StateA=Alarm_schalten.state
                      logInfo("ALARM-1", StateA)
                  end
                  log
                  Code:
                  Error during the execution of rule 'Save Event Alaram Taster': org.eclipse.xtext.util.PolymorphicDispatcher$NoSuchMethodException: Couldn't find method ''_assignValue'' for objects [JvmVoid:  (eProxyURI: Alarm.rules#xtextLink_::0.2.0.2.0.0::0::/1), <null> StateA <XMemberFeatureCallImplCustom>, ON, org.eclipse.xtext.xbase.interpreter.impl.DefaultEvaluationContext@1ceef1b, org.eclipse.xtext.util.CancelIndicator$1@9614ab]
                  Zuletzt geändert von edvtalker; 30.03.2016, 06:43.

                  Kommentar


                    #10
                    logInfo kann keine States ausgeben - wohl aber Strings. Die Zeile muss also etwas aufgehübscht so aussehen:
                    Code:
                     logInfo("ALARM-1","Alarm_schalten = {}",Alarm_schalten.state.toString)
                    Natürlich kannst Du wahlweise auch eine Variable oder Konstante definieren, das ist aber unnötig, wenn Du nicht vorhast, den Wert noch irgendwie zu ändern, ohne dass das Einfluss auf das Item haben soll.

                    Kommentar


                      #11
                      Nochmal Danke!!!
                      Ich habe schon wieder eine Frage. Ich habe nämlich ein Henne-Ei-Problem...

                      Code:
                      rule "Save Event Alaram Taster"
                      when
                          Item Alarm_schalten [COLOR=#FF0000]changed to ON[/COLOR] or
                          Item Zentral_AUS received command OFF
                      then
                          logInfo("ALARM-1","Alarm_schalten = {}",Alarm_schalten.state.toString)
                          [COLOR=#FF0000]postUpdate(Alarm_schalten, ON)[/COLOR]
                      end
                      Wenn Zentral_AUS der Auslöser für die Regel ist, soll das Switch-Item auch auf ON gesetzt werden, damit es in der App angezeigt wird. Allerdings rennt bei postUpdate(Alarm_schalten, ON) wieder die Schleife... Wie kann ich ein ITEM updaten ohne das das Update von einer Regel erkannt wird?

                      Kommentar


                        #12
                        Gar nicht Du kannst aber auf received commmand ON triggern lassen, postUpdate ist ja kein Command.

                        Kommentar

                        Lädt...
                        X