relais.ino 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. void allRelaisOn() {
  2. for ( int i = 0; i < 3; i++) {
  3. relaisOn(i);
  4. }
  5. }
  6. void allRelaisOff() {
  7. for ( int i = 0; i < 3; i++) {
  8. relaisOff(i);
  9. }
  10. }
  11. void relaisToggle(byte relaisnr) {
  12. if (relais_state[relaisnr]) {
  13. relaisOff(relaisnr);
  14. }
  15. else {
  16. relaisOn(relaisnr);
  17. }
  18. }
  19. void relaisOn(byte relaisnr) {
  20. if (relais_enabled[relaisnr]) switchRelais(relaisnr, true);
  21. }
  22. void relaisOff(byte relaisnr) {
  23. if (relais_enabled[relaisnr]) switchRelais(relaisnr, false);
  24. }
  25. //void handleRelaisSwitching() {
  26. // // this must be called from loop()
  27. // // switches relais to values set in relais_setState[relaisnr] if != relais_state[relaisnr]
  28. // // otherwise the operation with all the status and mqtt messages would take too long and block mqtt callback if it is the source for the switch command
  29. // for (int i=0; i < sizeof(relais_setState); i++) {
  30. // if( relais_setState[i] != relais_state[i] ) {
  31. // bool toState;
  32. // if (relais_setState[i] == 1) toState = true;
  33. // else toState = false;
  34. // switchRelais(i, toState);
  35. // }
  36. // }
  37. //}
  38. void switchRelais(byte relaisnr, bool onoff) {
  39. lastSwitchTime[relaisnr] = millis();
  40. bool toState, ledToState;
  41. if ( onoff ) toState = RELAISONSTATE;
  42. else toState = !RELAISONSTATE;
  43. if (relais_invert[relaisnr]) toState = !toState;
  44. digitalWrite(relais_pins[relaisnr], toState);
  45. relais_state[relaisnr] = onoff;
  46. // status LED if enabled
  47. if (led_enabled[relaisnr]) {
  48. if ( onoff ) ledToState = LEDONSTATE;
  49. else ledToState = !LEDONSTATE;
  50. if (led_invert[relaisnr]) ledToState = !ledToState;
  51. digitalWrite(leds_pins[relaisnr], ledToState);
  52. }
  53. Serial.print("Relais ");
  54. Serial.print(relaisnr + 1);
  55. Serial.print(" ");
  56. char* stateName;
  57. if (onoff) stateName = "ON";
  58. else stateName = "OFF";
  59. Serial.println(stateName);
  60. char tmp_topic_out[50];
  61. sprintf(tmp_topic_out, "%s/%d", mqtt_topic_out, relaisnr + 1);
  62. mqttclient.publish(tmp_topic_out, stateName, mqtt_outRetain);
  63. if (updateDomoticz[relaisnr]) {
  64. int idx = domoticzIdx[relaisnr];
  65. byte nvalue;
  66. if ( onoff ) nvalue = 1;
  67. else nvalue = 0;
  68. char domoticzJson[40];
  69. sprintf(domoticzJson, "{\"idx\":%d,\"nvalue\":%d}", idx, nvalue);
  70. mqttclient.publish(DOMOTICZ_IN_TOPIC, domoticzJson);
  71. Serial.print("sent idx=");
  72. Serial.print(idx);
  73. Serial.print(", nvalue=");
  74. Serial.print(nvalue);
  75. Serial.print(" to ");
  76. Serial.println(DOMOTICZ_IN_TOPIC);
  77. }
  78. }
  79. void relais_handleImpulseTimeout() {
  80. for (int i = 0; i < RELAIS_COUNT; i++) {
  81. if (relais_impulse[i] > 0 && relais_enabled[i]) {
  82. if (relais_state[i] == true && (millis() - lastSwitchTime[i]) > ( relais_impulse[i] * 100 ) ) {
  83. Serial.print("Relais ");
  84. Serial.print(i + 1);
  85. Serial.println(" impulse timeout reached");
  86. relaisOff(i);
  87. }
  88. }
  89. }
  90. }