• Hallo zusammen,
    ich habe zum ursprünglichen Code eine Frage.
    Ich würde gerne eine Relais per HomeKit schalten, aber auch direkt am ESP per Taster mit Statusrückmeldung in HomeKit. Dafür sind ja schon Zeilen vorgesehen (s.u.), aber ich bekomme es nicht zusammengeschrieben.
    Könnte mir jemand behilflich sein und mir hier ein Beispiel zur Verfügung stellen mit einem einfachen Taster?
    Edit: Sinniger wäre vielleicht auch ein HomeKit Button.

    Gruß
    Martin

      // Das hier kann verwendet werden, um den Status an HomeKit zurückzusenden,
      // falls ein zusätzlicher pysischer Button o.ä verwendet wird.
      
      // bool switch_is_on = true/false;
      // cha_switch_on.value.bool_value = switch_is_on;
      // homekit_characteristic_notify(&cha_switch_on, cha_switch_on.value);
    

  • Naja also wenn du den Taster / Schalter mit dem ESP einliest speicherst du den Zustand true bzw false in der Variable:

    bool switch_is_on = true/false;
    

    Und dann kannst du im nächsten Schritt den aktualisieren Status an HomeKit senden:

    cha_switch_on.value.bool_value = switch_is_on;
    homekit_characteristic_notify(&cha_switch_on, cha_switch_on.value);
    

    Oder woran scheitert es jetzt genau? Am Einlesen des Buttons? 🤔


  • @cooper Trivial geschrieben ja. Ich bin nicht so bewandert auf diesem Gebiet und erarbeite mir viel mit Beispielen. Könntest du mir eventuell so etwas mit einem Taster zur Verfügung stellen?


  • Hallo, vielen Dank für diese tolle Anleitung. Hat bei mir ebenfalls super geklappt. Leider habe ich die Situation dass das WLAN über Nacht deaktiviert wird. Nach erneuter Aktivierung des WLANs verbindet sich der D1 Mini erneut mit dem Router aber HomeKit findet keinen Client mehr. Erst nach dem Trennen der Stromversorgung und eines damit verbundenen Neustart des D1 Mini läuft die Verbindung wieder einwandfrei. Leider kenne ich mich mit der Programmierung nicht besonders gut aus und kann das Skript nicht selbst anpassen. Ist möglicherweise ein Neuladen des Skriptes nach erneuter WLAN Verbindung die Lösung?

    Über Hilfe würde ich mich sehr freuen.


  • @Denss @cooper Hallo zusammen. Top Tutorial. Funktioniert auf Anhieb! Nun würde ich genau das benötigen, was Denss beschrieben hat (Schalter geht für 2500ms an und dann von selber wieder aus). Bin aber leider absoluter Anfänger und weiß nicht, wie ich es bewerkstelligen könnte. Würde mich über eine Hilfestellung freuen.
    Danke
    Muhackl


  • moin @menuhin Ich finde es klasse das du dir die mühe gemacht hast und das skript so umgeschrieben hast das es mit mehreren Schaltern läuft .

    ich habe nur ein problem mit etwas anderes, ich wurde gerne beim ausschalten ein anderen pin ansteuern heist wenn in der app gesagt wir schalte switch 1 an geht switch 1 mit pin 1 an und mit ein delay weider aus wenn aus gesagt wir dann geht switch 1 aus und und schaltet pin 0 an und mit delay weider aus

    void cha_switch1_on_setter(const homekit_value_t value) {
    bool off = value.bool_value;
    cha_switch1_on.value.bool_value = off;
    LOG_D(“Switch: %s”,“ON”);
    digitalWrite(PIN_SWITCH1, HIGH);
    delay(5000);
    digitalWrite(PIN_SWITCH1, LOW);
    }

    cha_switch1_on.value.bool_value = off;
    LOG_D(“Switch: %s”,“OFF”);
    digitalWrite(PIN_SWITCH0, HIGH);
    delay(5000);
    digitalWrite(PIN_SWITCH0, LOW);
    }

    Theoretisch so, bloß es funktioniert nicht

    ich bin ein wenig überfragt. wäre nett wenn sie mir helfen können

  • ESP8266

    Hi @cooper , ich habe folgendes Problem. Wenn ich deinen Code ausführen möchte, bekomme ich diesen Fehlercode:

    ‘homekit_value_t’ does not name a type

    Das hier wäre nochmal der Code:

    #include <Arduino.h>
    #include <arduino_homekit_server.h>
    #include "wifi_info.h"
    
    #define LOG_D(fmt, ...)   printf_P(PSTR(fmt "\n") , ##__VA_ARGS__);
    
    void setup() {
      Serial.begin(115200);
      wifi_connect();
      homekit_storage_reset();
      my_homekit_setup();
    }
    
    void loop() {
      my_homekit_loop();
      delay(10);
    }
    
    //==============================
    // HomeKit setup and loop
    //==============================
    
    // Zugriff auf die Definitionen des Accessories in my_accessory.c
    extern "C" homekit_server_config_t config;
    extern "C" homekit_characteristic_t cha_switch_on;
    
    static uint32_t next_heap_millis = 0;
    
    #define PIN_SWITCH 15
    
    // Diese Funktion wird aufgerufen, wenn der Schalter in HomeKit betätigt wird
    void cha_switch_on_setter(const homekit_value_t value) {
      bool on = value.bool_value;
      cha_switch_on.value.bool_value = on;
      LOG_D("Switch: %s", on ? "ON" : "OFF");
      digitalWrite(PIN_SWITCH, on ? HIGH : LOW);
    }
    
    void my_homekit_setup() {
    
      
      pinMode(PIN_SWITCH, OUTPUT);
      digitalWrite(PIN_SWITCH, HIGH);
      cha_switch_on.setter = cha_switch_on_setter;
      arduino_homekit_setup(&config);
    
    
    
      // Das hier kann verwendet werden, um den Status an HomeKit zurückzusenden,
      // falls ein zusätzlicher pysischer Button o.ä verwendet wird.
      
      // bool switch_is_on = true/false;
      // cha_switch_on.value.bool_value = switch_is_on;
      // homekit_characteristic_notify(&cha_switch_on, cha_switch_on.value);
    }
    
    
    
    void my_homekit_loop() {
      arduino_homekit_loop();
      const uint32_t t = millis();
      if (t > next_heap_millis) {
        // heap-Info alle 30 Sekunden im seriellen Monitor ausgeben
        next_heap_millis = t + 30 * 1000;
        LOG_D("Free heap: %d, HomeKit clients: %d",
            ESP.getFreeHeap(), arduino_homekit_connected_clients_count());
    
      }
    }
    

  • @manfred Check mal ob die Libraries richtig installiert wurden. Der Code sollte eigentlich ohne Fehler funktionieren.

    Falls nicht kann ich das Programm nochmal probeweise bei mir auf nen D1 Mini aufspielen. 👍

  • ESP8266

    @cooper Danke. Das mit den libs werde ich dann gleich mal prüfen. Könnte es unter umständen auch daran liegen, dass es ein normaler ESP8266 und kein D1 mini ist?


  • @manfred ne habs auch schon aufm ESP-01S laufend gehabt


  • Tolles Tutorial, hat auf Anhieb gut funktioniert!!!
    Ich möchte das Relais parallel nun auch mit einem physischen Taster am ESP8266 ein und ausschalten, komme aber mit der Zeile
    "Das hier kann verwendet werden, um den Status an HomeKit zurückzusenden,falls ein zusätzlicher physischer Button o.ä verwendet wird.
    Einen Sketch für den Taster habe ich, aber ich bringe die beiden Funktionen nicht zusammen…


  • @mac65

      // Das hier kann verwendet werden, um den Status an HomeKit zurückzusenden,
      // falls ein zusätzlicher pysischer Button o.ä verwendet wird.
      
      // bool switch_is_on = true/false;
      // cha_switch_on.value.bool_value = switch_is_on;
      // homekit_characteristic_notify(&cha_switch_on, cha_switch_on.value);
    

    damit kannst du true oder false an HomeKit senden. Musst halt auskommentieren und dann den Status festlegen mit

    bool switch_is_on = true;
    // oder
    bool switch_is_on = false;
    

    anschließend Homekit benachrichtigen

     cha_switch_on.value.bool_value = switch_is_on;
     homekit_characteristic_notify(&cha_switch_on, cha_switch_on.value);
    

  • @cooper @Menuhin

    vielen vielen Dank an euch beide, vor Allem an @cooper aber auch die Modifikation von @Menuhin haben mir sehr geholfen und durch dieses “Projekt” habe ich Spaß an Arduino entwickelt, vielen Dank dafür.

    Ich habe ein Problem und einen Wunsch bei diesem Setup und hoffe ihr könnt mir helfen.

    Zum Problem: ab und an scheint das ESP8266 sich von selbst neu zu starten (ob kurzzeitig die Stromversorgung fehlt oder das WLAN-Signal neu aufgebaut wird, weiß ich nicht)

    Ich nutze den Aufbau in zwei Situation, einmal als Lichtschalter im Schlafzimmer und einmal als Türöffnerschalter.

    Beim Reboot schaltet das Relais permanent, was hier etwas suboptimal ist, nachts ist es dann taghell im Schlafzimmer und vor Allem bei dem Türöffner, der neulich die ganze Nacht das Türschloss betätigt hat ist auch Sicherheit ein Thema.

    Kann man den Code so umschrieben, dass beim Einstecken das Relais nicht permanent geschalten wird?

    Beim Türöffner habe ich einen 2000ms delay eingebaut, wodurch der Schalter eigentlich als Taster funktioniert aber beim booten schaltet das Relais trotzdem permanent

     if(cha_switch_on.value.bool_value == on){
        digitalWrite(PIN_SWITCH, HIGH);
        delay(2000); 
        digitalWrite(PIN_SWITCH, LOW); 
    

    Zum Wunsch: bei der Haustüre erkennt die Home App nicht, dass durch den delay das ganze quasi nach 2s wieder ausgeschaltet ist. Kann man den Code so umprogrammieren, dass beim “Tasten” das ganze auf “ein” und nach den 2000ms wieder auf “Off” gestellt wird?

    Ich bedanke mich vorab und verbleibe mit freundlichem Gruß 🙂


  • @gt3

    Also ich fang mal an. An sollte irgendwas nicht klappen, bitte mach ein neues Thema auf und poste da auch deinen Code.

    1. Problem

    Zum Problem: ab und an scheint das ESP8266 sich von selbst neu zu starten (ob kurzzeitig die Stromversorgung fehlt oder das WLAN-Signal neu aufgebaut wird, weiß ich nicht)

    Versuche mal das Programm mit 160Mhz hochzuladen du findest es unter den Einstellungen.

    Arduino IDE
    └─── Werkzeuge
        └─── CPU Frequency: 160 MHz
    
    1. Problem, was durch 1 eig. behoben wird und wirklich nur als Ausfallsicherheit dient

    Beim Reboot schaltet das Relais permanent, was hier etwas suboptimal ist, nachts ist es dann taghell im Schlafzimmer und vor Allem bei dem Türöffner, der neulich die ganze Nacht das Türschloss betätigt hat ist auch Sicherheit ein Thema.

    In der Datei my_accessory.c gibt es folgende Zeile:

    // format: bool; HAP section 9.70; write the .setter function to get the switch-event sent from iOS Home APP.
    homekit_characteristic_t cha_switch_on = HOMEKIT_CHARACTERISTIC_(ON, true);
    

    die kannst du auf false setzen

    homekit_characteristic_t cha_switch_on = HOMEKIT_CHARACTERISTIC_(ON, false);
    

    Das bewirkt, dass der HomeKit-Schalter standardmäßig aus ist, nicht aber das Relais. Um das Relais dem Schalter-Zustand anzupassen, muss du das Relais in my_homekit_setup() einfach auch direkt ausschalten.

    pinMode(PIN_SWITCH, OUTPUT);
    digitalWrite(PIN_SWITCH, HIGH);
    

    wird zu

    pinMode(PIN_SWITCH, OUTPUT);
    digitalWrite(PIN_SWITCH, LOW);
    

    Somit ist der Schalter immer aus aus, das Relais auch.

    1. Problemlösung steht eigentlich sogar im Code

    Kann man den Code so umprogrammieren, dass beim “Tasten” das ganze auf “ein” und nach den 2000ms wieder auf “Off” gestellt wird?

    Hier 1:1 aus dem Code

    // Das hier kann verwendet werden, um den Status an HomeKit zurückzusenden,
    // falls ein zusätzlicher pysischer Button o.ä verwendet wird.
      
    // bool switch_is_on = true/false;
    // cha_switch_on.value.bool_value = switch_is_on;
    // homekit_characteristic_notify(&cha_switch_on, cha_switch_on.value);
    

    Du musst einfach nach deinem Schalten den Status wieder zurücksenden.

    digitalWrite(PIN_SWITCH, HIGH);
    delay(2000); 
    digitalWrite(PIN_SWITCH, LOW); 
    cha_switch_on.value.bool_value = false;
    homekit_characteristic_notify(&cha_switch_on, cha_switch_on.value);
    

    Habs jetzt nicht getestet aber sollte so funktionieren. Zur drei jetzt.

    Hoffentlich konnt ich helfen. 🙂 Gruß


  • @cooper Hallo 🙂

    zunächst einmal vielen Dank für die schnelle und ausführliche Antwort.

    Der Code passt so genau, wie ich ihn haben wollte 🙏

    Vielen herzlichen Dank!

    eine kurze Nachfrage, da es mit dem Hinzufügen des Geräts gefühlt Glückssache ist, ob das neu programmierte Gerät erkannt wird oder nicht (habe es am Ende nach vielfachem Versuch mit meinem alten iPad mini mit iOS 14.4 hinbekommen): müssen hier vll. bei der my_accessory.c die ganzen Werte bei

    homekit_characteristic_t cha_name = HOMEKIT_CHARACTERISTIC_(NAME, "entrance_door");
    
    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, "entrance_door"),
                HOMEKIT_CHARACTERISTIC(MANUFACTURER, "Homekit"),
                HOMEKIT_CHARACTERISTIC(SERIAL_NUMBER, "0123456"),
                HOMEKIT_CHARACTERISTIC(MODEL, "ESP8266 D1 Mini"),
                HOMEKIT_CHARACTERISTIC(FIRMWARE_REVISION, "1.0"),
                HOMEKIT_CHARACTERISTIC(IDENTIFY, my_accessory_identify),
                NULL
    

    geändert werden? den Namen habe ich jeweils angepasst

    kann ich das (?) jeweilige D1 mini nach erfolgreichem Hinzufügen nochmals neu programmieren und das Gerät bleibt in der Hom-App vorhanden bzw. funktional?

    grundsätzlich würde ich diese Frage gar nicht erst stellen sondern einfach ausprobieren, aber da ich wie gesagt Probleme mit dem Hinzufügen hatte, gehe ich diesen Weg

    In meinem konkreten Beispiel möchte ich die Zeitverzögerung nochmals anpassen.

    An den my_accessory.c und wifi_info.h Einstellungen wird nichts geändert


  • @gt3

    void setup() {
      Serial.begin(115200);
      wifi_connect();
      homekit_storage_reset();
      my_homekit_setup();
    }
    

    wird zu

    void setup() {
      Serial.begin(115200);
      wifi_connect();
      //homekit_storage_reset();
      my_homekit_setup();
    }
    

    dann kannst du programmieren und debuggen und das pairing bleibt erhalten.
    Achte nur drauf, dass du beim upload nur den sketch updatest und nicht den Flash löscht (Standardmäßig ist das nicht der Fall wenn du nichts umgestellt hast)


  • Perfekt, vielen Dank dir 🙂


  • @gt3 sagte in ESP8266 D1 Mini Relais als HomeKit Schalter ohne Bridge - Tutorial:

    @cooper Hallo 🙂

    zunächst einmal vielen Dank für die schnelle und ausführliche Antwort.

    Der Code passt so genau, wie ich ihn haben wollte 🙏

    Vielen herzlichen Dank!

    @gt3 : Funktioniert die Anzeige im HomeKit nach automatischem Schließen des Relais wirklich?

    Ich habe alles versucht, einmal als Schalter und einmal als Schloß, aber der Schließzustand wird einfach nicht im HomeKit aktualisiert, sprich es wird noch „offen“ angezeigt, obwohl das Relais automatisch geschlossen hat.

    VG


  • @d_a_b Also wenn du jetzt vom Schloss redest, das hab auch mal versucht und da scheint es etwas anders zu sein. Konnte da auch nicht geschlossen zurück übertragen.


  • @cooper ich habe es so vergeblich versucht:
    Schloss:

    void open_lock(){
      Serial.println("Schloss öffnen"); 
      // hier beliebige Aktion einfügen
      digitalWrite(relay, HIGH);
       
      delay(3000);
      digitalWrite(relay, LOW);
      cha_lock_current_state.value.int_value = 1;
      homekit_characteristic_notify(&cha_lock_current_state, cha_lock_current_state.value);
    }
    

    Schalter:

    void cha_switch_on_setter(const homekit_value_t value) {
      bool on = value.bool_value;
      cha_switch_on.value.bool_value = on;
      LOG_D("Switch: %s", on ? "ON" : "OFF");
      //digitalWrite(PIN_SWITCH, on ? HIGH : LOW);
      digitalWrite(PIN_SWITCH, HIGH);
        delay(3000); 
      digitalWrite(PIN_SWITCH, LOW);
      bool switch_is_on = false;
      cha_switch_on.value.bool_value = switch_is_on;
      homekit_characteristic_notify(&cha_switch_on, cha_switch_on.value);  
    }
    

  • Guten Tag, danke für das ausführliche Tutorial.
    Soweit funktioniert das Ganze auch ziemlich gut bei mir, nur leider habe ich folgendes Problem:
    Nachdem ich mich erfolgreich mit dem ESP verbunden habe, kann ich das Relais auch erfolgreich schalten, wenn ich den ESP aber vom Strom trenne bzw. resette wird kein neues pairing durchgeführt.
    homekit_storage_reset(); ist auskommentiert.
    wie kann man das pairing mit einem bekannten client erneut starten?

    Gruß

Ähnliche Themen

  • 3
  • 1
  • 1
  • 1
  • 1