Advertisement
billwolf

Mysensors HA Switch

Sep 21st, 2019
602
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.19 KB | None | 0 0
  1. /*
  2. Klasa porządkująca kod w przypadku użycia wielu włączników.
  3.  
  4. Version: 1.0.  Beta !!!!!!
  5.  
  6. Uwagi:
  7.  
  8.  
  9. 1. Musisz użyć fizycznie włącznika, żeby był 'widziany' przez HA. !!!!!!
  10. 2. Przy każdym ponownym uruchomieniu Arduino, do serwera wysyłana jest informacja 'przedstawiająca' bramkę Mysensors.
  11.    Na obeną chwile jest to zrobione specjalnie, ponieważ kod jest w fazie testów.
  12. 3. Poniżej przykład dodania bramki do HA:
  13.    
  14. mysensors:
  15.   gateways:
  16.     - device: '/dev/serial/by-id/usb-Arduino__www.arduino.cc__0042_55832343538351304042-if00'
  17.       persistence_file: 'mysensors.json'
  18.  
  19.  
  20. 4. U mnie działa. :)
  21.  
  22. */
  23.  
  24. #include <Arduino.h>
  25.  
  26. // Enable debug prints to serial monitor
  27. #define MY_DEBUG
  28.  
  29. // Enable serial gateway
  30. #define MY_GATEWAY_SERIAL
  31.  
  32. #include <SPI.h>
  33. #include <MySensors.h>
  34. #include <Bounce2.h>
  35.  
  36. #define RELAY_ON 1  // GPIO value to write to turn on attached relay
  37. #define RELAY_OFF 0 // GPIO value to write to turn off attached relay
  38.  
  39. /*
  40. Klasa która porządkuje kod w przypadku użycia wielu wlączników
  41. */
  42. class Wlacznik
  43. {
  44. private:
  45. public:
  46.   uint8_t ID;         // id obiektu - każda wartosc musi być inna !!!!!!
  47.   uint8_t RELAY_PIN;  // pin przekaznika
  48.   uint8_t BUTTON_PIN; // pin przycisku
  49.   uint8_t ON;         // stan na wyjsciu przekaznika gdy wlaczony
  50.   uint8_t OFF;        // stan na wyjsciu przekaznika gdy wylaczony
  51.   MyMessage msg;      // obiekt wysylajacy informacje o zdarzeniu do serwera HA
  52.   Bounce debouncer;
  53.   bool initialValueSent = false;
  54.   Wlacznik(uint8_t id, uint8_t relay_pin, uint8_t button_pin, uint8_t on, uint8_t off);
  55.   Wlacznik();
  56.   void setup_();
  57.   void present_();
  58.   void loop_();
  59.   void debouncerUpdated();
  60.   void checkMessage(MyMessage message);
  61. };
  62.  
  63. Wlacznik::Wlacznik(uint8_t id, uint8_t relay_pin, uint8_t button_pin, uint8_t on, uint8_t off)
  64. {
  65.   ID = id;
  66.   RELAY_PIN = relay_pin;
  67.   BUTTON_PIN = button_pin;
  68.   ON = on;
  69.   OFF = off;
  70.   pinMode(RELAY_PIN, OUTPUT);
  71.   digitalWrite(RELAY_PIN, loadState(ID) ? ON : OFF); // przywraca poprzedni zapisany stan przekaznika w przypadku zaniku napiecia lub restartu
  72.   debouncer = Bounce();
  73.   msg = MyMessage(ID, V_STATUS);
  74. }
  75. Wlacznik::Wlacznik()
  76. {
  77. }
  78. void Wlacznik::setup_()
  79. {
  80.   pinMode(BUTTON_PIN, INPUT_PULLUP);
  81.   debouncer.attach(BUTTON_PIN);
  82.   debouncer.interval(10);
  83. }
  84. void Wlacznik::present_()
  85. {
  86.   present(ID, S_BINARY);
  87.   send(msg.set(loadState(ID))); // wysyłam do serwera aktualny stan przekaźnika
  88. }
  89.  
  90. void Wlacznik::loop_()
  91. {
  92.   if (debouncer.update())
  93.   {
  94.     debouncerUpdated();
  95.   }
  96. }
  97. void Wlacznik::debouncerUpdated()
  98. {
  99.   if (debouncer.read() == LOW)
  100.   {
  101.     saveState(ID, !loadState(ID));
  102.     digitalWrite(RELAY_PIN, loadState(ID) ? ON : OFF);
  103.     send(msg.set(loadState(ID)));
  104.   }
  105. }
  106.  
  107. void Wlacznik::checkMessage(MyMessage message)
  108. {
  109.   if (message.sensor == ID)
  110.   {
  111.     digitalWrite(RELAY_PIN, message.getBool() ? ON : OFF);
  112.     // Store state in eeprom
  113.     saveState(message.sensor, message.getBool());
  114.     send(msg.set(message.getBool() ? RELAY_ON : RELAY_OFF));
  115.   }
  116. }
  117.  
  118. //--------------------------------------------------------------------------------------------------------------------------------------------
  119. //Tutaj dodajemy urządzenia
  120. //--------------------------------------------------------------------------------------------------------------------------------------------
  121.  
  122. // Włączniki
  123. Wlacznik w1; //  Włącznik 1 - analogicznie kolejne
  124.  
  125. void before()
  126. {
  127.  // (id, pin przekaźnika, pin przycisku,stan przekażnika przy włączeniu, stan przekażnika przy wyłączeniu)
  128.   w1 = Wlacznik(1, 31, A1, RELAY_ON, RELAY_OFF); //  //  Włącznik 1 - analogiknie kolejne
  129. }
  130.  
  131. void setup()
  132. {
  133.   delay(1000);
  134.   w1.setup_(); //  Włącznik 1 - analogicznie kolejne
  135. }
  136. void presentation()
  137. {
  138.   // Send the sketch version information to the gateway and Controller
  139.   sendSketchInfo("MySensors_Ard1_HA", "1.0"); // Dla każdej kolejnej bramki inna nazwa !!!
  140.   w1.present_();                              //  Włącznik 1 - analogicznie kolejne
  141. }
  142.  
  143. void loop()
  144. {
  145.   w1.loop_(); //  Włącznik 1 - analogicznie kolejne
  146. }
  147.  
  148. void receive(const MyMessage &message)
  149. {
  150.   w1.checkMessage(message); //  Włącznik 1 - analogicznie kolejne
  151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement