relais.ino 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. void relaisToggle(byte relaisnr) {
  2. if (relais_state[relaisnr]) {
  3. relaisOff(relaisnr);
  4. }
  5. else {
  6. relaisOn(relaisnr);
  7. }
  8. }
  9. void relaisOn(byte relaisnr) {
  10. switchRelais(relaisnr, true);
  11. //relais_setState[relaisnr] = true;
  12. }
  13. void relaisOff(byte relaisnr) {
  14. switchRelais(relaisnr, false);
  15. //relais_setState[relaisnr] = false;
  16. }
  17. //void handleRelaisSwitching() {
  18. // // this must be called from loop()
  19. // // switches relais to values set in relais_setState[relaisnr] if != relais_state[relaisnr]
  20. // // 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
  21. // for (int i=0; i < sizeof(relais_setState); i++) {
  22. // if( relais_setState[i] != relais_state[i] ) {
  23. // bool toState;
  24. // if (relais_setState[i] == 1) toState = true;
  25. // else toState = false;
  26. // switchRelais(i, toState);
  27. // }
  28. // }
  29. //}
  30. void switchRelais(byte relaisnr, bool onoff) {
  31. lastSwitchTime[relaisnr] = millis();
  32. bool toState;
  33. if ( onoff ) toState = RELAISONSTATE;
  34. else toState = !RELAISONSTATE;
  35. digitalWrite(relais_pins[relaisnr], toState);
  36. relais_state[relaisnr] = onoff;
  37. Serial.print("Relais ");
  38. Serial.print(relaisnr + 1);
  39. Serial.print(" ");
  40. char* stateName;
  41. if (onoff) stateName = "ON";
  42. else stateName = "OFF";
  43. Serial.println(stateName);
  44. char tmp_topic_out[50];
  45. sprintf(tmp_topic_out, "%s/%d", mqtt_topic_out, relaisnr + 1);
  46. mqttclient.publish(tmp_topic_out, stateName);
  47. if (updateDomoticz[relaisnr]) {
  48. int idx = domoticzIdx[relaisnr];
  49. byte nvalue;
  50. if ( onoff ) nvalue = 1;
  51. else nvalue = 0;
  52. char domoticzJson[40];
  53. sprintf(domoticzJson, "{\"idx\":%d,\"nvalue\":%d}", idx, nvalue);
  54. mqttclient.publish(DOMOTICZ_IN_TOPIC, domoticzJson);
  55. Serial.print("sent idx=");
  56. Serial.print(idx);
  57. Serial.print(", nvalue=");
  58. Serial.print(nvalue);
  59. Serial.print(" to ");
  60. Serial.println(DOMOTICZ_IN_TOPIC);
  61. }
  62. }
  63. void relais_handleImpulseTimeout() {
  64. for (int i = 0; i < RELAIS_COUNT; i++) {
  65. if (relais_impulse[i] > 0) {
  66. if (relais_state[i] == true && (millis() - lastSwitchTime[i]) > relais_impulse[i]) {
  67. Serial.print("Relais ");
  68. Serial.print(i + 1);
  69. Serial.println(" impulse timeout reached");
  70. relaisOff(i);
  71. }
  72. }
  73. }
  74. }