Gefunden: IO-Homecontrol-Lösung mit ESP32/SX1276

Begonnen von plin, 17 Februar 2026, 16:10:27

Vorheriges Thema - Nächstes Thema

dieter114

#15
Zitat von: dieter114 am 11 November 2026, 12:23:57Wobei der Code für "STOP" noch nicht geht.
Ich versuche mal die Variante von plin.
Geht leider auch nicht.
Notfalls kann ich damit leben, ein Stop wird bei Dachfenster selten gebraucht.
@plin weist Du wo hier der Fehler liegt?
Liebe Grüße WDS

RPi II+III+V,OWX, HM Zisterne, MAPLESDuino(adv), ESPEasy, Tasmota, MQTT2Server, WU-Upload, TabletUI, Poolsteuerung fhem, Fronius, BYD Solaranlage

plin

Zitat von: dieter114 am 11 November 2026, 12:29:05
Zitat von: dieter114 am 11 November 2026, 12:23:57Wobei der Code für "STOP" noch nicht geht.
Ich versuche mal die Variante von plin.
Geht leider auch nicht.
Notfalls kann ich damit leben, ein Stop wird bei Dachfenster selten gebraucht.
@plin weist Du wo hier der Fehler liegt?

Keine Ahnung. Bei mir funktioniert STOP. Im Zweifelsfall den Autor fragen: https://github.com/laberning/home_io_control/issues
FHEM1 (Main) Raspi4 mit CUL, Homematic, SDUINO 433/OOK, zentrale Steuerung
FHEM2 (Keller) x86 mit CUL/hmland, IP-basierte Module
FHEM3 (Erdgeschoss) Raspi2 mit SDUINO 868/GFSK
FHEM4 (Hausanschlussraum), USV und OBIS-Modul
FHEM5 (Docker) mit FHEM2FHEM, InfluxDB

plin

#17
Ich habe mittels Claude einige Ergänzungen eingebaut:
- Debug-Details
- Infos auf dem OLED Display

io-homecontrol.yaml
# BETRIEB: Covers mit Status per MQTT an FHEM (MQTT2_SERVER / MQTT2_CLIENT)
#   esphome run io-homecontrol.yaml
# Topics z. B.: io-homecontrol/cover/velux_fenster_1/state | /position | /command | /position/command

packages:
  base: !include common/base.yaml

mqtt:
  broker: !secret mqtt_broker
  username: !secret mqtt_user
  password: !secret mqtt_password
  topic_prefix: io-homecontrol
  discovery: false

# Letzten per MQTT empfangenen Cover-Befehl fürs Display merken ("<device> <command>")
esphome:
  on_boot:
    priority: 600
    then:
      - lambda: |-
          auto handler = [](const std::string &topic, const std::string &payload) {
            // topic: io-homecontrol/cover/<device>/command  oder  .../<device>/position/command
            const std::string key = "/cover/";
            auto start = topic.find(key);
            if (start == std::string::npos) return;
            start += key.size();
            auto end = topic.find('/', start);
            std::string device = topic.substr(start, end - start);
            bool is_pos = topic.find("/position/command") != std::string::npos;
            id(last_mqtt_cmd) = device + " " + (is_pos ? "pos " + payload : payload);
          };
          mqtt::global_mqtt_client->subscribe("io-homecontrol/cover/+/command", handler);
          mqtt::global_mqtt_client->subscribe("io-homecontrol/cover/+/position/command", handler);


      # Diagnose-Sensoren der Covers (RSSI, Last Contact, Exchange Failures, Last Commanded By, ...)
      # nach io-homecontrol/diag/<object_id> spiegeln – die Komponente legt dafür selbst keine MQTT-Topics an.
      - lambda: |-
          for (auto *s : App.get_sensors()) {
            if (s->get_entity_category() != ENTITY_CATEGORY_DIAGNOSTIC) continue;
            char oid[OBJECT_ID_MAX_LEN];
            StringRef ref = s->get_object_id_to(oid);
            if (ref.empty()) continue;
            std::string topic = std::string("io-homecontrol/diag/") + ref.c_str();
            s->add_on_state_callback([topic, s](float value) {
              if (std::isnan(value) || !mqtt::global_mqtt_client->is_connected()) return;
              char buf[VALUE_ACCURACY_MAX_LEN];
              value_accuracy_to_buf(buf, value, s->get_accuracy_decimals());
              mqtt::global_mqtt_client->publish(topic, std::string(buf), 0, true);
            });
          }
          for (auto *t : App.get_text_sensors()) {
            if (t->get_entity_category() != ENTITY_CATEGORY_DIAGNOSTIC) continue;
            char oid[OBJECT_ID_MAX_LEN];
            StringRef ref = t->get_object_id_to(oid);
            if (ref.empty()) continue;
            std::string topic = std::string("io-homecontrol/diag/") + ref.c_str();
            t->add_on_state_callback([topic](const std::string &value) {
              if (!mqtt::global_mqtt_client->is_connected()) return;
              mqtt::global_mqtt_client->publish(topic, value, 0, true);
            });
          }

Ergänzung am Anfang von common/base.yaml
# Gemeinsame Basis für Einrichtung und Betrieb (per packages: eingebunden)

packages:
  display: !include display.yaml

<snip>

common/display.yaml
# OLED-Anzeige des LILYGO TTGO LoRa32 V2.1 (SSD1306 128x64, I²C an GPIO21/22)
i2c:
  sda: 21
  scl: 22

font:
  - file: "gfonts://Roboto"
    id: font_small
    size: 12

text_sensor:
  - platform: wifi_info
    ip_address:
      id: ip_addr

sensor:
  - platform: wifi_signal
    id: wifi_rssi
    update_interval: 30s

globals:
  - id: last_mqtt_cmd                # wird in io-homecontrol.yaml per MQTT befüllt
    type: std::string
    restore_value: false
    initial_value: '"-"'

display:
  - platform: ssd1306_i2c
    model: "SSD1306 128x64"
    address: 0x3C
    update_interval: 2s
    lambda: |-
      it.printf(0, 0, id(font_small), "IP %s", id(ip_addr).state.c_str());
      if (id(wifi_rssi).has_state())
        it.printf(0, 16, id(font_small), "WLAN %.0f dBm", id(wifi_rssi).state);
      #ifdef USE_MQTT
      it.printf(0, 32, id(font_small), "MQTT %s",
                mqtt::global_mqtt_client->is_connected() ? "verbunden" : "getrennt");
      it.print(0, 48, id(font_small), id(last_mqtt_cmd).c_str());
      #else
      it.print(0, 32, id(font_small), "Setup-Modus (Web)");
      #endif

In der letzten Zeile des OLED Displays steht dann der letzte Empfange Befehl. Da sollte "STOP" zu sehen sein.

Für die Infos zum Device muss die readingList um
io-homecontrol/diag/og_az_.*:.* { $TOPIC =~ m{diag/og_az_(.*)$}; { "diag_$1" => $EVENT } }ergänzt werden.
FHEM1 (Main) Raspi4 mit CUL, Homematic, SDUINO 433/OOK, zentrale Steuerung
FHEM2 (Keller) x86 mit CUL/hmland, IP-basierte Module
FHEM3 (Erdgeschoss) Raspi2 mit SDUINO 868/GFSK
FHEM4 (Hausanschlussraum), USV und OBIS-Modul
FHEM5 (Docker) mit FHEM2FHEM, InfluxDB