Olympia Protect Status abfragen (MySensors)

Begonnen von Meister_Petz, 23 Januar 2015, 09:55:00

Vorheriges Thema - Nächstes Thema

Meister_Petz

Moin,

angeregt von diesem Blogeintrag, hab ich wieder mal ein bisschen gebastelt:

Die Idee:
Ein MySensors Sensor mit 2 Fotowiderständen, soll den Status der Alarmanlage anhand einer blinkenden LED und eines blinkenden Displays an FHEM übertragen.
Zustände:
Alarmanlage deaktiviert                  : LED aus - Display aus
Alarmanlage aktiviert                     : LED blinkt - Display aus
Alarmanlage Scharfstellverzögerung: LED blinkt - Display blinkt
Alarmanlage Auslöseverzögerung    : LED blinkt - Display blinkt

Blinken wird erkannt, wenn sich zwei aufeinanderfolgende Werte eines Fotowiderstands um einen bestimmten Wert unterscheiden.

Der Code:
      /* Small sketch to determine the State of a Olympia Protect Alarmsystem
      0. When UNARMED   : LED off - DISPLAY off
      1. When ARMED     : LED blinks
      2. When ACTIVATING: LED blinks - DISPLAY blinks (check if before State was ARMED)
      3. When TRIGGERED : LED blinks - DISPLAY blinks (check if before State was ARMED)
      */
     
      #include <MySensor.h>
      #include <SPI.h>
      #define CHILD_ID 3
      MySensor gw;
      MyMessage msg(CHILD_ID,V_TRIPPED);
     
      const int phCell1Pin = 0; // Photocell 1 on PIN 0 - Display
      const int phCell2Pin = 1; // Photocell 2 on PIN 1 - LED
      const int phCell1Sensitivity = 100; // sets the minimum difference between two readings to determine blinking of Display
      const int phCell2Sensitivity = 100; // sets the minimum difference between two readings to determine blinking of LED
      long int sleepTime = 7000; // 7 Sec. between Reading Cycles
      long int armingTime = 30; // milliSeconds set until arming is done
     
     
      int DisplayState = 0;
      int LEDState = 0;
      int AlarmSystemState = 4; // (0 = Off, 1 = On, 2 = Activating, 3 = Triggered)
      int AlarmSystemStateOld = 0;
      int myRound1[10] = {0,0,0,0,0,0,0,0,0,0}; // Array to store Readings
      int myRound2[10] = {0,0,0,0,0,0,0,0,0,0}; // Array to store Readings
      int goSleep = 0;
      int i = 0;
      int i1 = 0;
      int i2 = 0;
      long int i3 = 0;
     
      void setup(void) {
        gw.begin();
        gw.present(CHILD_ID, S_DOOR);
      }
       
      void loop(void) {
           if (i < 10){ // 10 Readings
             myRound1[i] = analogRead(phCell1Pin); // read Photosensor Display
             //Serial.print("Display PhCell:"); Serial.println(myRound1[i]);
             myRound2[i] = analogRead(phCell2Pin); // read Photosensor Display
             //Serial.print("LED     PhCell:"); Serial.println(myRound2[i]);
             
             if (i > 0){ // compare 2 following readings
               // Display
               if ((myRound1[i] - myRound1[i-1]) > phCell1Sensitivity){i1++;}
               if ((myRound1[i-1] - myRound1[i]) > phCell1Sensitivity){i1++;}
               // LED
               if ((myRound2[i] - myRound2[i-1]) > phCell2Sensitivity){i2++;}
               if ((myRound2[i-1] - myRound2[i]) > phCell2Sensitivity){i2++;}
             }
             i++;
             
           } else {
             
             // Display
             if (i1 > 2){ // if there are more than 3 Readings which are assumed blinks - set DisplayState to blink
               DisplayState = 1; //Serial.println("Display blinkt - State 1");
             } else {
               DisplayState = 0; // Serial.println("Display dunkel - State 0");
             }
             
             //LED
             if (i2 > 2){ // if there are more than 3 Readings which are assumed blinks - set LEDState to blink
               LEDState = 1; //Serial.println("LED blinkt - State 1");
             } else {
               LEDState = 0; // Serial.println("LED dunkel - State 0");
             }
     
             goSleep = 1; // now transmit if necessary and wait before starting again
             // Reset
             i = 0;
             i1 = 0;
             i2 = 0;
             int myRound1[10] = {0,0,0,0,0,0,0,0,0,0};
             int myRound2[10] = {0,0,0,0,0,0,0,0,0,0};
           }
     
           // send to Sleep
           if (goSleep == 1){
             if (DisplayState == 0 && LEDState == 0){
               AlarmSystemState = 0; // OFF
             } else if (DisplayState == 0 && LEDState == 1){
               AlarmSystemState = 1; // ON
             } else if (DisplayState == 1 && LEDState == 1 && AlarmSystemStateOld == 0){
               AlarmSystemState = 2; // Actviating
             } else if (DisplayState == 1 && LEDState == 1 && AlarmSystemStateOld == 1){
               AlarmSystemState = 3; // TRIGGERED
             } else {
              AlarmSystemState = AlarmSystemStateOld;
             }
             
     
             // Send State change to Gateway
             Serial.print("AlarmSystemState Änderung:");Serial.println(AlarmSystemState);
             gw.send(msg.set(AlarmSystemState));
             
             if (AlarmSystemState == 2){ // Delay until Arming is done before next read
               i3 = (armingTime * 1000) + 10000;
               Serial.print("wait until activated: ");Serial.println(i3);
               delay(i3);
               i3 = 0;
             }
             
             AlarmSystemStateOld = AlarmSystemState;
             delay(sleepTime);
             goSleep = 0;
           } else {
             delay(575);
           }
      }
[/size]

Und so siehts aus: Nicht hübsch, aber wir sind ja noch in der Testphase
(http://www.services4u.de/forumfiles/Arduino-Olympia-Protect-Status.JPG)
- Die Fotowiderstände sind mit doppelseitigem Aufgeklebt
- auf das doppelseitige Klebeband wiederum Alufolie, damit das Licht nicht von Außen gelesen wird
- Strom kommt vom Netzteil der Alarmanlage

Das ist der Eintrag in der FHEM.cfg:
#------------------------------------------------------#
# Alarmanlage Status Gerät                             #
#------------------------------------------------------#
define OPStatusDevice MYSENSORS_DEVICE 101
attr OPStatusDevice IODev MSGateway
attr OPStatusDevice mapReading_tripped3 3 tripped 0:AUS tripped 1:AKTIV tripped 2:ACTIVATING tripped 3:AUSGELOEST
attr OPStatusDevice mode node
attr OPStatusDevice requestAck 1
attr OPStatusDevice version 1.4.1

#------------------------------------------------------#
# Alarmanlage Status Anzeiger                          #
#------------------------------------------------------#
define OP_Status dummy
attr OP_Status room Alarmanlage
attr OP_Status alias 1_Zustand
attr OP_Status setList AUS AKTIV ACTIVATING AUSGELOEST
attr OP_Status event-on-change-reading state
define OP_StatusNot0 notify OPStatusDevice:.*tripped3:.AUS set OP_Status AUS
define OP_StatusNot1 notify OPStatusDevice:.*tripped3:.AKTIV set OP_Status AKTIV
define OP_StatusNot2 notify OPStatusDevice:.*tripped3:.ACTIVATING set OP_Status ACTIVATING
define OP_StatusNot3 notify OPStatusDevice:.*tripped3:.AUSGELOEST set OP_Status AUSGELOEST
define Push_OP_Status0 notify OP_Status:.* set pushmsg msg 'Alarmanlage' '$EVENT'



Alles wie immer ohne Gewähr!

Viel Spaß

murat23

#1
Moin,

glückwunsch. Das hätte ich mit meiner auch machen sollen, stattdessen habe ich mich an dem UART Anschluss (Unter der Batterieabdeckung) versucht und bin gescheitert. Die Basisstation arbeitet noch, aber das Display zeigt nach dem starten nichts mehr an  :(

Seltsam das keiner den UART Anschluss bemerkt hat, steht sogar drauf das es einer ist. ???

Meister_Petz

Zitat von: murat23 am 23 Januar 2015, 15:51:57
...stattdessen habe ich mich an dem UART Anschluss (Unter der Batterieabdeckung) versucht und bin gescheitert. Die Basisstation arbeitet noch, aber das Display zeigt nach dem starten nichts mehr an  :(

Seltsam das keiner den UART Anschluss bemerkt hat, steht sogar drauf das es einer ist. ???

Dein Beitrag motiviert jetzt aber auch nicht gerade diesen Anschluß zu testen ;-)