├── .gitattributes └── Internet___Manual_using_Apple_Home_Siri ├── wifi_info.h ├── my_accessory.c └── Internet___Manual_using_Apple_Home_Siri.ino /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /Internet___Manual_using_Apple_Home_Siri/wifi_info.h: -------------------------------------------------------------------------------- 1 | /* 2 | * wifi_info.h 3 | * 4 | * Created on: 2020-05-15 5 | * Author: Mixiaoxiao (Wang Bin) 6 | */ 7 | 8 | #ifndef WIFI_INFO_H_ 9 | #define WIFI_INFO_H_ 10 | 11 | #if defined(ESP8266) 12 | #include 13 | #elif defined(ESP32) 14 | #include 15 | #endif 16 | 17 | const char *ssid = "SSID"; 18 | const char *password = "PASS"; 19 | 20 | void wifi_connect() { 21 | WiFi.persistent(false); 22 | WiFi.mode(WIFI_STA); 23 | WiFi.setAutoReconnect(true); 24 | WiFi.begin(ssid, password); 25 | Serial.println("WiFi connecting..."); 26 | while (!WiFi.isConnected()) { 27 | delay(100); 28 | Serial.print("."); 29 | } 30 | Serial.print("\n"); 31 | Serial.printf("WiFi connected, IP: %s\n", WiFi.localIP().toString().c_str()); 32 | } 33 | 34 | #endif /* WIFI_INFO_H_ */ 35 | -------------------------------------------------------------------------------- /Internet___Manual_using_Apple_Home_Siri/my_accessory.c: -------------------------------------------------------------------------------- 1 | /* 2 | * my_accessory.c 3 | * Define the accessory in C language using the Macro in characteristics.h 4 | * 5 | * Created on: 2020-05-15 6 | * Author: Mixiaoxiao (Wang Bin) 7 | */ 8 | 9 | #include 10 | #include 11 | 12 | void my_accessory_identify(homekit_value_t _value) { 13 | printf("accessory identify\n"); 14 | } 15 | 16 | // Switch (HAP section 8.38) 17 | // required: ON 18 | // optional: NAME 19 | 20 | // format: bool; HAP section 9.70; write the .setter function to get the switch-event sent from iOS Home APP. 21 | homekit_characteristic_t cha_switch1_on = HOMEKIT_CHARACTERISTIC_(ON, false); 22 | homekit_characteristic_t cha_switch2_on = HOMEKIT_CHARACTERISTIC_(ON, false); 23 | homekit_characteristic_t cha_switch3_on = HOMEKIT_CHARACTERISTIC_(ON, false); 24 | homekit_characteristic_t cha_switch4_on = HOMEKIT_CHARACTERISTIC_(ON, false); 25 | 26 | // format: string; HAP section 9.62; max length 64 27 | homekit_characteristic_t cha_name = HOMEKIT_CHARACTERISTIC_(NAME, "4ch Internet & Manual"); 28 | 29 | homekit_accessory_t *accessories[] = { 30 | 31 | HOMEKIT_ACCESSORY(.id=1, .category=homekit_accessory_category_switch, .services=(homekit_service_t*[]) { 32 | HOMEKIT_SERVICE(ACCESSORY_INFORMATION, .characteristics=(homekit_characteristic_t*[]) { 33 | HOMEKIT_CHARACTERISTIC(NAME, "Switch1"), 34 | HOMEKIT_CHARACTERISTIC(MANUFACTURER, "techiesms"), 35 | HOMEKIT_CHARACTERISTIC(SERIAL_NUMBER, "0123456"), 36 | HOMEKIT_CHARACTERISTIC(MODEL, "4ch Internet & Manual"), 37 | HOMEKIT_CHARACTERISTIC(FIRMWARE_REVISION, "1.0"), 38 | HOMEKIT_CHARACTERISTIC(IDENTIFY, my_accessory_identify), 39 | NULL 40 | }), 41 | HOMEKIT_SERVICE(SWITCH, .primary=true, .characteristics=(homekit_characteristic_t*[]){ 42 | &cha_switch1_on, 43 | &cha_name, 44 | NULL 45 | }), 46 | NULL 47 | }), 48 | 49 | 50 | 51 | HOMEKIT_ACCESSORY(.id=2, .category=homekit_accessory_category_switch, .services=(homekit_service_t*[]) { 52 | HOMEKIT_SERVICE(ACCESSORY_INFORMATION, .characteristics=(homekit_characteristic_t*[]) { 53 | HOMEKIT_CHARACTERISTIC(NAME, "Switch2"), 54 | HOMEKIT_CHARACTERISTIC(MANUFACTURER, "techiesms"), 55 | HOMEKIT_CHARACTERISTIC(SERIAL_NUMBER, "0123456"), 56 | HOMEKIT_CHARACTERISTIC(MODEL, "4ch Internet & Manual"), 57 | HOMEKIT_CHARACTERISTIC(FIRMWARE_REVISION, "1.0"), 58 | HOMEKIT_CHARACTERISTIC(IDENTIFY, my_accessory_identify), 59 | NULL 60 | }), 61 | HOMEKIT_SERVICE(SWITCH, .primary=true, .characteristics=(homekit_characteristic_t*[]){ 62 | &cha_switch2_on, 63 | &cha_name, 64 | NULL 65 | }), 66 | NULL 67 | }), 68 | 69 | 70 | 71 | HOMEKIT_ACCESSORY(.id=3, .category=homekit_accessory_category_switch, .services=(homekit_service_t*[]) { 72 | HOMEKIT_SERVICE(ACCESSORY_INFORMATION, .characteristics=(homekit_characteristic_t*[]) { 73 | HOMEKIT_CHARACTERISTIC(NAME, "Switch3"), 74 | HOMEKIT_CHARACTERISTIC(MANUFACTURER, "techiesms"), 75 | HOMEKIT_CHARACTERISTIC(SERIAL_NUMBER, "0123456"), 76 | HOMEKIT_CHARACTERISTIC(MODEL, "4ch Internet & Manual"), 77 | HOMEKIT_CHARACTERISTIC(FIRMWARE_REVISION, "1.0"), 78 | HOMEKIT_CHARACTERISTIC(IDENTIFY, my_accessory_identify), 79 | NULL 80 | }), 81 | HOMEKIT_SERVICE(SWITCH, .primary=true, .characteristics=(homekit_characteristic_t*[]){ 82 | &cha_switch3_on, 83 | &cha_name, 84 | NULL 85 | }), 86 | NULL 87 | }), 88 | 89 | 90 | HOMEKIT_ACCESSORY(.id=4, .category=homekit_accessory_category_switch, .services=(homekit_service_t*[]) { 91 | HOMEKIT_SERVICE(ACCESSORY_INFORMATION, .characteristics=(homekit_characteristic_t*[]) { 92 | HOMEKIT_CHARACTERISTIC(NAME, "Switch4"), 93 | HOMEKIT_CHARACTERISTIC(MANUFACTURER, "techiesms"), 94 | HOMEKIT_CHARACTERISTIC(SERIAL_NUMBER, "0123456"), 95 | HOMEKIT_CHARACTERISTIC(MODEL, "4ch Internet & Manual"), 96 | HOMEKIT_CHARACTERISTIC(FIRMWARE_REVISION, "1.0"), 97 | HOMEKIT_CHARACTERISTIC(IDENTIFY, my_accessory_identify), 98 | NULL 99 | }), 100 | HOMEKIT_SERVICE(SWITCH, .primary=true, .characteristics=(homekit_characteristic_t*[]){ 101 | &cha_switch4_on, 102 | &cha_name, 103 | NULL 104 | }), 105 | NULL 106 | }), 107 | 108 | NULL 109 | }; 110 | 111 | homekit_server_config_t config = { 112 | .accessories = accessories, 113 | .password = "111-11-111" 114 | }; 115 | -------------------------------------------------------------------------------- /Internet___Manual_using_Apple_Home_Siri/Internet___Manual_using_Apple_Home_Siri.ino: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Internet & Manual Home Automation with Apple Home and Siri 4 | 5 | Original Code created by Mixiaoxiao (Wang Bin) and edited to work with manual switches by Sachin Soni (techiesms) 6 | 7 | To watch out full tutorial video, head on to my YouTube channel 8 | https://www.YouTube.com/techiesms 9 | 10 | 11 | techiesms 12 | explore | learn | share 13 | 14 | */ 15 | 16 | #include 17 | #include 18 | #include "wifi_info.h" 19 | 20 | #define LOG_D(fmt, ...) printf_P(PSTR(fmt "\n") , ##__VA_ARGS__); 21 | 22 | // Switches & Relay Pin definition 23 | #define S1 32 24 | #define R1 15 25 | 26 | #define S2 35 27 | #define R2 2 28 | 29 | #define S3 34 30 | #define R3 4 31 | 32 | #define S4 39 33 | #define R4 22 34 | 35 | #define DEBUG_SW 0 36 | 37 | int switch_ON_Flag1_previous_I = 0; 38 | int switch_ON_Flag2_previous_I = 0; 39 | int switch_ON_Flag3_previous_I = 0; 40 | int switch_ON_Flag4_previous_I = 0; 41 | 42 | 43 | void setup() { 44 | Serial.begin(115200); 45 | wifi_connect(); // in wifi_info.h 46 | //homekit_storage_reset(); // to remove the previous HomeKit pairing storage when you first run this new HomeKit example 47 | my_homekit_setup(); 48 | } 49 | 50 | void loop() { 51 | my_homekit_loop(); 52 | delay(10); 53 | } 54 | 55 | //============================== 56 | // HomeKit setup and loop 57 | //============================== 58 | 59 | // access your HomeKit characteristics defined in my_accessory.c 60 | extern "C" homekit_server_config_t config; 61 | extern "C" homekit_characteristic_t cha_switch1_on; 62 | extern "C" homekit_characteristic_t cha_switch2_on; 63 | extern "C" homekit_characteristic_t cha_switch3_on; 64 | extern "C" homekit_characteristic_t cha_switch4_on; 65 | 66 | static uint32_t next_heap_millis = 0; 67 | 68 | //Called when the switch value is changed by iOS Home APP 69 | void cha_switch1_on_setter(const homekit_value_t value) { 70 | bool on = value.bool_value; 71 | cha_switch1_on.value.bool_value = on; //sync the value 72 | LOG_D("Switch: %s", on ? "ON" : "OFF"); 73 | digitalWrite(R1, on ? LOW : HIGH); 74 | } 75 | 76 | //Called when the switch value is changed by iOS Home APP 77 | void cha_switch2_on_setter(const homekit_value_t value) { 78 | bool on = value.bool_value; 79 | cha_switch2_on.value.bool_value = on; //sync the value 80 | LOG_D("Switch: %s", on ? "ON" : "OFF"); 81 | digitalWrite(R2, on ? LOW : HIGH); 82 | } 83 | 84 | //Called when the switch value is changed by iOS Home APP 85 | void cha_switch3_on_setter(const homekit_value_t value) { 86 | bool on = value.bool_value; 87 | cha_switch3_on.value.bool_value = on; //sync the value 88 | LOG_D("Switch: %s", on ? "ON" : "OFF"); 89 | digitalWrite(R3, on ? LOW : HIGH); 90 | } 91 | 92 | //Called when the switch value is changed by iOS Home APP 93 | void cha_switch4_on_setter(const homekit_value_t value) { 94 | bool on = value.bool_value; 95 | cha_switch4_on.value.bool_value = on; //sync the value 96 | LOG_D("Switch: %s", on ? "ON" : "OFF"); 97 | digitalWrite(R4, on ? LOW : HIGH); 98 | } 99 | 100 | void my_homekit_setup() 101 | { 102 | pinMode(S1, INPUT); 103 | pinMode(R1, OUTPUT); 104 | 105 | pinMode(S2, INPUT); 106 | pinMode(R2, OUTPUT); 107 | 108 | pinMode(S3, INPUT); 109 | pinMode(R3, OUTPUT); 110 | 111 | pinMode(S4, INPUT); 112 | pinMode(R4, OUTPUT); 113 | 114 | //Add the .setter function to get the switch-event sent from iOS Home APP. 115 | //The .setter should be added before arduino_homekit_setup. 116 | //HomeKit sever uses the .setter_ex internally, see homekit_accessories_init function. 117 | //Maybe this is a legacy design issue in the original esp-homekit library, 118 | //and I have no reason to modify this "feature". 119 | cha_switch1_on.setter = cha_switch1_on_setter; 120 | cha_switch2_on.setter = cha_switch2_on_setter; 121 | cha_switch3_on.setter = cha_switch3_on_setter; 122 | cha_switch4_on.setter = cha_switch4_on_setter; 123 | 124 | arduino_homekit_setup(&config); 125 | 126 | 127 | } 128 | 129 | 130 | void my_homekit_loop() { 131 | arduino_homekit_loop(); 132 | switch_feedback_function(); 133 | const uint32_t t = millis(); 134 | if (t > next_heap_millis) { 135 | // show heap info every 5 seconds 136 | next_heap_millis = t + 5 * 1000; 137 | LOG_D("Free heap: %d, HomeKit clients: %d", 138 | ESP.getFreeHeap(), arduino_homekit_connected_clients_count()); 139 | 140 | } 141 | 142 | } 143 | 144 | void switch_feedback_function() 145 | { 146 | 147 | if (digitalRead(S1) == LOW) 148 | { 149 | if (switch_ON_Flag1_previous_I == 0 ) 150 | { 151 | digitalWrite(R1, LOW); 152 | if (DEBUG_SW) Serial.println("Relay1- ON"); 153 | //report the switch value to HomeKit if it is changed (e.g. by a physical button) 154 | bool switch1_is_on = 1; 155 | cha_switch1_on.value.bool_value = switch1_is_on; 156 | homekit_characteristic_notify(&cha_switch1_on, cha_switch1_on.value); 157 | switch_ON_Flag1_previous_I = 1; 158 | } 159 | if (DEBUG_SW) Serial.println("Switch1 -ON"); 160 | 161 | } 162 | if (digitalRead(S1) == HIGH ) 163 | { 164 | if (switch_ON_Flag1_previous_I == 1) 165 | { 166 | digitalWrite(R1, HIGH); 167 | if (DEBUG_SW) Serial.println("Relay1 OFF"); 168 | //report the switch value to HomeKit if it is changed (e.g. by a physical button) 169 | bool switch1_is_on = 0; 170 | cha_switch1_on.value.bool_value = switch1_is_on; 171 | homekit_characteristic_notify(&cha_switch1_on, cha_switch1_on.value); 172 | 173 | switch_ON_Flag1_previous_I = 0; 174 | } 175 | if (DEBUG_SW)Serial.println("Switch1 OFF"); 176 | } 177 | 178 | 179 | if (digitalRead(S2) == LOW) 180 | { 181 | if (switch_ON_Flag2_previous_I == 0 ) 182 | { 183 | digitalWrite(R2, LOW); 184 | if (DEBUG_SW) Serial.println("Relay2- ON"); 185 | //report the switch value to HomeKit if it is changed (e.g. by a physical button) 186 | bool switch2_is_on = 1; 187 | cha_switch2_on.value.bool_value = switch2_is_on; 188 | homekit_characteristic_notify(&cha_switch2_on, cha_switch2_on.value); 189 | switch_ON_Flag2_previous_I = 1; 190 | } 191 | if (DEBUG_SW) Serial.println("Switch2 -ON"); 192 | 193 | } 194 | if (digitalRead(S2) == HIGH ) 195 | { 196 | if (switch_ON_Flag2_previous_I == 1) 197 | { 198 | digitalWrite(R2, HIGH); 199 | if (DEBUG_SW) Serial.println("Relay2 OFF"); 200 | //report the switch value to HomeKit if it is changed (e.g. by a physical button) 201 | bool switch2_is_on = 0; 202 | cha_switch2_on.value.bool_value = switch2_is_on; 203 | homekit_characteristic_notify(&cha_switch2_on, cha_switch2_on.value); 204 | switch_ON_Flag2_previous_I = 0; 205 | } 206 | if (DEBUG_SW)Serial.println("Switch2 OFF"); 207 | //delay(200); 208 | } 209 | 210 | if (digitalRead(S3) == LOW) 211 | { 212 | if (switch_ON_Flag3_previous_I == 0 ) 213 | { 214 | digitalWrite(R3, LOW); 215 | if (DEBUG_SW) Serial.println("Relay3- ON"); 216 | //report the switch value to HomeKit if it is changed (e.g. by a physical button) 217 | bool switch3_is_on = 1; 218 | cha_switch3_on.value.bool_value = switch3_is_on; 219 | homekit_characteristic_notify(&cha_switch3_on, cha_switch3_on.value); 220 | switch_ON_Flag3_previous_I = 1; 221 | } 222 | if (DEBUG_SW) Serial.println("Switch3 -ON"); 223 | 224 | } 225 | if (digitalRead(S3) == HIGH ) 226 | { 227 | if (switch_ON_Flag3_previous_I == 1) 228 | { 229 | digitalWrite(R3, HIGH); 230 | if (DEBUG_SW) Serial.println("Relay3 OFF"); 231 | //report the switch value to HomeKit if it is changed (e.g. by a physical button) 232 | bool switch3_is_on = 0; 233 | cha_switch3_on.value.bool_value = switch3_is_on; 234 | homekit_characteristic_notify(&cha_switch3_on, cha_switch3_on.value); 235 | switch_ON_Flag3_previous_I = 0; 236 | } 237 | if (DEBUG_SW)Serial.println("Switch3 OFF"); 238 | //delay(200); 239 | } 240 | 241 | if (digitalRead(S4) == LOW) 242 | { 243 | if (switch_ON_Flag4_previous_I == 0 ) 244 | { 245 | digitalWrite(R4, LOW); 246 | if (DEBUG_SW) Serial.println("Relay4- ON"); 247 | //report the switch value to HomeKit if it is changed (e.g. by a physical button) 248 | bool switch4_is_on = 1; 249 | cha_switch4_on.value.bool_value = switch4_is_on; 250 | homekit_characteristic_notify(&cha_switch4_on, cha_switch4_on.value); 251 | switch_ON_Flag4_previous_I = 1; 252 | } 253 | if (DEBUG_SW) Serial.println("Switch4 -ON"); 254 | 255 | } 256 | if (digitalRead(S4) == HIGH ) 257 | { 258 | if (switch_ON_Flag4_previous_I == 1) 259 | { 260 | digitalWrite(R4, HIGH); 261 | if (DEBUG_SW) Serial.println("Relay4 OFF"); 262 | //report the switch value to HomeKit if it is changed (e.g. by a physical button) 263 | bool switch4_is_on = 0; 264 | cha_switch4_on.value.bool_value = switch4_is_on; 265 | homekit_characteristic_notify(&cha_switch4_on, cha_switch4_on.value); 266 | switch_ON_Flag4_previous_I = 0; 267 | } 268 | if (DEBUG_SW)Serial.println("Switch4 OFF"); 269 | //delay(200); 270 | } 271 | 272 | } 273 | --------------------------------------------------------------------------------