Acebutton and homekit nodemcu esp8266

hi all,

i am using this code and acebutton to get update on homekit from button pressed and released

how i can add same condition with more buttons for green and yellow led?

/*
 * switch.ino
 *
 *  Created on: 2020-05-15
 *      Author: Mixiaoxiao (Wang Bin)
 *  Modified on: 2021-05-17
 *      Modifier: Josh Spicer <hello@joshspicer.com>
 */

#include <Arduino.h>
#include <arduino_homekit_server.h>
#include "wifi_info.h"
#include <AceButton.h>
        using namespace ace_button;
        const uint8_t PIN1 = 13;
        ButtonConfig buttonConfig;
        AceButton button(&buttonConfig, PIN1);
       int lock_state;
       

#define LOG_D(fmt, ...)   printf_P(PSTR(fmt "\n") , ##__VA_ARGS__);

void setup() {
  Serial.begin(115200);
  wifi_connect(); // in wifi_info.h
  //homekit_storage_reset(); // to remove the previous HomeKit pairing storage when you first run this new HomeKit example
  my_homekit_setup();
  delay(20);
  pinMode(PIN1, INPUT_PULLUP);
  button.setEventHandler(handleEvent);
  
  
}

void loop() {
  

  my_homekit_loop();
  button.check();
  delay(10);
}
//==============================
// HomeKit setup and loop
//==============================

// access your HomeKit characteristics defined in my_accessory.c
extern "C" homekit_server_config_t config;

extern "C" homekit_characteristic_t red_led;
extern "C" homekit_characteristic_t green_led;
extern "C" homekit_characteristic_t yellow_led;

static uint32_t next_heap_millis = 0;

#define PIN_SWITCH D3
#define LED_RED D2
#define LED_YELLOW D4
#define LED_GREEN 5


//Called when the switch value is changed by iOS Home APP
void green_led_setter(const homekit_value_t value) {
  bool on = value.bool_value;
  green_led.value.bool_value = on;  //sync the value
  LOG_D("Green Switch: %s", on ? "ON" : "OFF");
  digitalWrite(LED_GREEN, on ? HIGH : LOW);
}

//Called when the switch value is changed by iOS Home APP
void red_led_setter(const homekit_value_t value) {
  bool on = value.bool_value;
  red_led.value.bool_value = on;  //sync the value
  LOG_D("Red Switch: %s", on ? "ON" : "OFF");
  digitalWrite(LED_RED, on ? HIGH : LOW);
}

//Called when the switch value is changed by iOS Home APP
void yellow_led_setter(const homekit_value_t value) {
  bool on = value.bool_value;
  yellow_led.value.bool_value = on;  //sync the value
  LOG_D("Yellow Switch: %s", on ? "ON" : "OFF");
  digitalWrite(LED_YELLOW, on ? HIGH : LOW);
}


void my_homekit_setup() {
  pinMode(PIN_SWITCH, OUTPUT);
  digitalWrite(PIN_SWITCH, HIGH);

  pinMode(LED_YELLOW, OUTPUT);
  pinMode(LED_RED, OUTPUT);
  pinMode(LED_GREEN, OUTPUT);

  red_led.setter = red_led_setter;
  yellow_led.setter = yellow_led_setter;
  green_led.setter = green_led_setter;
  arduino_homekit_setup(&config);
}

void my_homekit_loop() {
  arduino_homekit_loop();
  const uint32_t t = millis();
  if (t > next_heap_millis) {
    // show heap info every 5 seconds
    next_heap_millis = t + 5 * 1000;
    LOG_D("Free heap: %d, HomeKit clients: %d",
        ESP.getFreeHeap(), arduino_homekit_connected_clients_count());

  }


  
}
void handleEvent(AceButton* button, uint8_t eventType,
    uint8_t /* buttonState */) {
  switch (eventType) {
    case AceButton::kEventPressed:
      if(lock_state==0){
        red_led.value.bool_value = true;
        bool on = red_led.value.bool_value;
        Serial.println("LED:ON(Force)");
        digitalWrite(LED_RED, LOW);
        homekit_characteristic_notify(&red_led, red_led.value);
        lock_state = 1;
        }
      break;
       
    case AceButton::kEventReleased:
      if(lock_state==1){
        red_led.value.bool_value = false;
        bool on = !red_led.value.bool_value;
        Serial.println("LED:OFF(Force)");
        digitalWrite(LED_RED, HIGH);
        homekit_characteristic_notify(&red_led, red_led.value);
        lock_state = 0;
      }
      break;
      
  }
}

i tried like this but buttons are updating only green led homekit

/*
 * switch.ino
 *
 *  Created on: 2020-05-15
 *      Author: Mixiaoxiao (Wang Bin)
 *  Modified on: 2021-05-17
 *      Modifier: Josh Spicer <hello@joshspicer.com>
 */

#include <Arduino.h>
#include <arduino_homekit_server.h>
#include "wifi_info.h"
#include <AceButton.h>
        using namespace ace_button;
        const uint8_t PIN1 = 13;
        ButtonConfig buttonConfig;
        AceButton button(&buttonConfig, PIN1);
       void handleEvent(AceButton*, uint8_t, uint8_t);
       int lock_state;
        const uint8_t PIN2 = 14;
        AceButton button2(&buttonConfig, PIN2);
       void handleEvent2(AceButton*, uint8_t, uint8_t);
       int lock_state2;
       

#define LOG_D(fmt, ...)   printf_P(PSTR(fmt "\n") , ##__VA_ARGS__);

void setup() {
  Serial.begin(115200);
  wifi_connect(); // in wifi_info.h
  //homekit_storage_reset(); // to remove the previous HomeKit pairing storage when you first run this new HomeKit example
  my_homekit_setup();
  delay(20);
  pinMode(PIN1, INPUT_PULLUP);
  button.setEventHandler(handleEvent);
  pinMode(PIN2, INPUT_PULLUP);
  button2.setEventHandler(handleEvent2);
  
  
}

void loop() {
  

  my_homekit_loop();
  button.check();
  button2.check(); //ADD THIS.
	delay(10);
}
//==============================
// HomeKit setup and loop
//==============================

// access your HomeKit characteristics defined in my_accessory.c
extern "C" homekit_server_config_t config;

extern "C" homekit_characteristic_t red_led;
extern "C" homekit_characteristic_t green_led;
extern "C" homekit_characteristic_t yellow_led;

static uint32_t next_heap_millis = 0;

#define PIN_SWITCH D3
#define LED_RED D2
#define LED_YELLOW D4
#define LED_GREEN 5


//Called when the switch value is changed by iOS Home APP
void green_led_setter(const homekit_value_t value) {
  bool on = value.bool_value;
  green_led.value.bool_value = on;  //sync the value
  LOG_D("Green Switch: %s", on ? "ON" : "OFF");
  digitalWrite(LED_GREEN, on ? HIGH : LOW);
}

//Called when the switch value is changed by iOS Home APP
void red_led_setter(const homekit_value_t value) {
  bool on = value.bool_value;
  red_led.value.bool_value = on;  //sync the value
  LOG_D("Red Switch: %s", on ? "ON" : "OFF");
  digitalWrite(LED_RED, on ? HIGH : LOW);
}

//Called when the switch value is changed by iOS Home APP
void yellow_led_setter(const homekit_value_t value) {
  bool on = value.bool_value;
  yellow_led.value.bool_value = on;  //sync the value
  LOG_D("Yellow Switch: %s", on ? "ON" : "OFF");
  digitalWrite(LED_YELLOW, on ? HIGH : LOW);
}


void my_homekit_setup() {
  pinMode(PIN_SWITCH, OUTPUT);
  digitalWrite(PIN_SWITCH, HIGH);

  pinMode(LED_YELLOW, OUTPUT);
  pinMode(LED_RED, OUTPUT);
  pinMode(LED_GREEN, OUTPUT);

  red_led.setter = red_led_setter;
  yellow_led.setter = yellow_led_setter;
  green_led.setter = green_led_setter;
  arduino_homekit_setup(&config);
}

void my_homekit_loop() {
  arduino_homekit_loop();
  const uint32_t t = millis();
  if (t > next_heap_millis) {
    // show heap info every 5 seconds
    next_heap_millis = t + 5 * 1000;
    LOG_D("Free heap: %d, HomeKit clients: %d",
        ESP.getFreeHeap(), arduino_homekit_connected_clients_count());

  }


  
}
void handleEvent(AceButton* button, uint8_t eventType,
    uint8_t /* buttonState */) {
  switch (eventType) {
    case AceButton::kEventPressed:
      if(lock_state==0){
        red_led.value.bool_value = true;
        bool on = red_led.value.bool_value;
        Serial.println("LED:ON(Force)");
        digitalWrite(LED_RED, LOW);
        homekit_characteristic_notify(&red_led, red_led.value);
        lock_state = 1;
        }
      break;
       
    case AceButton::kEventReleased:
      if(lock_state==1){
        red_led.value.bool_value = false;
        bool on = !red_led.value.bool_value;
        Serial.println("LED:OFF(Force)");
        digitalWrite(LED_RED, HIGH);
        homekit_characteristic_notify(&red_led, red_led.value);
        lock_state = 0;
      }
      break;
      
  }
}
void handleEvent2(AceButton* button2, uint8_t eventType,
    uint8_t /* buttonState */) {
  switch (eventType) {
        case AceButton::kEventPressed:
        if(lock_state2==0){
        green_led.value.bool_value = true;
        bool on = green_led.value.bool_value;
        Serial.println("LED:ON(Force)");
        digitalWrite(LED_GREEN, LOW);
        homekit_characteristic_notify(&green_led, green_led.value);
        lock_state2 = 1;
        }
        break;

        case AceButton::kEventReleased:
        if(lock_state2==1){
        green_led.value.bool_value = false;
        bool on = !green_led.value.bool_value;
        Serial.println("LED:OFF(Force)");
        digitalWrite(LED_GREEN, HIGH);
        homekit_characteristic_notify(&green_led, green_led.value);
        lock_state2 = 0;
      }

      }}

Where's your code from my_accessory.c?

i can share, but homekit is working fine and i was able to add one physical button with red led and its working fine with homekit..

my concern is how i can add second ace button to green led?
i am trying but something going wrong in my coding as above, when i press any button only red or only green respond in homekit.

please guide me correct way of code to add second acebutton to above code.

rather than repeat yourself ... you'll get more help if you respond to questions

ok, here you go:

/*
 * my_accessory.c
 * Defines the accessory in C  using the Macro in characteristics.h
 *
 *  Created on: 2020-05-15
 *      Author: Mixiaoxiao (Wang Bin)
 *   Modified on: 2021-05-17
 *      Modifier: Josh Spicer <hello@joshspicer.com>
 */

#include <homekit/homekit.h>
#include <homekit/characteristics.h>

void my_accessory_identify(homekit_value_t _value) {
  printf("accessory identify\n");
}

homekit_characteristic_t green_led = HOMEKIT_CHARACTERISTIC_(ON, false);
homekit_characteristic_t yellow_led = HOMEKIT_CHARACTERISTIC_(ON, false);
homekit_characteristic_t red_led = HOMEKIT_CHARACTERISTIC_(ON, false);


homekit_accessory_t *accessories[] = {
    HOMEKIT_ACCESSORY(.id=1, .category=homekit_accessory_category_switch, .services=(homekit_service_t*[]) {
        HOMEKIT_SERVICE(ACCESSORY_INFORMATION, .characteristics=(homekit_characteristic_t*[]) {
            HOMEKIT_CHARACTERISTIC(NAME, "SMART-Switch"),
            HOMEKIT_CHARACTERISTIC(MANUFACTURER, "ESP HomeKit"),
            HOMEKIT_CHARACTERISTIC(SERIAL_NUMBER, "SP290833"),
            HOMEKIT_CHARACTERISTIC(MODEL, "SMART-LIGHT"),
            HOMEKIT_CHARACTERISTIC(FIRMWARE_REVISION, "1.0"),
            HOMEKIT_CHARACTERISTIC(IDENTIFY, my_accessory_identify),
            NULL
        }),
        HOMEKIT_SERVICE(SWITCH, .characteristics=(homekit_characteristic_t*[]) {
            &green_led,
            HOMEKIT_CHARACTERISTIC(NAME, "Green LED"),
            NULL
        }),
        HOMEKIT_SERVICE(SWITCH, .characteristics=(homekit_characteristic_t*[]) {
            &yellow_led,
            HOMEKIT_CHARACTERISTIC(NAME, "Yellow LED"),
            NULL
        }),
        HOMEKIT_SERVICE(SWITCH, .characteristics=(homekit_characteristic_t*[]) {
            &red_led,
            HOMEKIT_CHARACTERISTIC(NAME, "Red LED"),
            NULL
        }),
        NULL
    }),
    NULL
};

homekit_server_config_t config = {
    .accessories = accessories,
    .password = "111-11-111"
};

no one?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.