Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Off Topic
    4. Microcontroller
    5. ( gelöst ) ESP Wassersensor BLE-YC01 MQTT

    NEWS

    • Monatsrückblick – September 2025

    • Neues Video "KI im Smart Home" - ioBroker plus n8n

    • Neues Video über Aliase, virtuelle Geräte und Kategorien

    ( gelöst ) ESP Wassersensor BLE-YC01 MQTT

    This topic has been deleted. Only users with topic management privileges can see it.
    • Homoran
      Homoran Global Moderator Administrators @perladd last edited by

      @perladd du versuchst ja auch aus der ID etwas zu extrahieren

      P 1 Reply Last reply Reply Quote 0
      • P
        perladd @Homoran last edited by perladd

        @homoran

        wo soll ich es denn sonst her bekommen

        was muss denn bei der id rein

        Homoran 1 Reply Last reply Reply Quote 0
        • Homoran
          Homoran Global Moderator Administrators @perladd last edited by Homoran

          @perladd sagte in ESP Wassersensor BLE-YC01 MQTT:

          wo soll ich es denn sonst her bekommen

          WERT von
          Deswegen habe ich meine leider immer noch ungefüllte Hilfsvariable entsprechend benannt

          P 1 Reply Last reply Reply Quote 0
          • P
            perladd @Homoran last edited by

            @homoran

            hab ich und wie schreibe ich das in einem Datensatz, sorry ich bin Neuling und bastle mir das immer so zusammen das es funktioniert 🙂

            Homoran 1 Reply Last reply Reply Quote 0
            • Homoran
              Homoran Global Moderator Administrators @perladd last edited by Homoran

              @perladd Da ich anscheinend dein JSON nie bekommen werde, hier für dich
              Screenshot_20250915-155117_Firefox.jpg
              Kann ich sowieso nicht testen

              P 1 Reply Last reply Reply Quote 0
              • P
                perladd @Homoran last edited by

                @homoran

                FFA1FE5AFEBFFFFFFF77FFBEFF7DFD0AFAE821FE26FFBEFFFFFFFFFF51

                meinst du die Zeile, die wollte ich so auslesen

                Homoran 1 Reply Last reply Reply Quote 0
                • Homoran
                  Homoran Global Moderator Administrators @perladd last edited by

                  @perladd sagte in ESP Wassersensor BLE-YC01 MQTT:

                  meinst du die Zeile

                  das soll dabei rauskommen.

                  Ich benötige aber den Inhalt des Datenpunkts aus dem dieses Ergebnis extrahiert errden soll.
                  Ich habe diesen Datenpunkt nicht!

                  P 1 Reply Last reply Reply Quote 0
                  • P
                    perladd @Homoran last edited by

                    @homoran

                    Okay, das habe ich verstanden 🙂

                    {
                    "_id": "mqtt.4.tele.Pool_Wassertester_E84B50.BLE",
                    "common": {
                    "name": "tele/Pool_Wassertester_E84B50/BLE",
                    "write": true,
                    "read": true,
                    "role": "variable",
                    "desc": "mqtt server variable",
                    "type": "string"
                    },
                    "native": {
                    "topic": "tele/Pool_Wassertester_E84B50/BLE"
                    },
                    "type": "state",
                    "from": "system.adapter.mqtt.4",
                    "user": "system.user.admin",
                    "ts": 1757664917520,
                    "acl": {
                    "object": 1636,
                    "state": 1636,
                    "owner": "system.user.admin",
                    "ownerGroup": "system.group.administrator"
                    }
                    }

                    Homoran 1 Reply Last reply Reply Quote 0
                    • Homoran
                      Homoran Global Moderator Administrators @perladd last edited by

                      @perladd sagte in ESP Wassersensor BLE-YC01 MQTT:

                      das habe ich verstanden

                      nicht wirklich!
                      das sind anscheinend die Objektdaten des Datenpunktes.

                      ich hätte den Inhalt, den du nur als Screenshot gepostet hast als Text in code-tags gebraucht.

                      Aber ist jetzt egal.
                      Ich gehe jetzt msngels Feedback mal davon aus, das alles zu deiner Zufriedenheit läuft.

                      P 1 Reply Last reply Reply Quote 0
                      • P
                        perladd @Homoran last edited by perladd

                        @homoran

                        Danke dir, ja den Datenpunkt hab ich jetzt bekomme

                        Sorry das ich soweit immer auf dem Schlauch steh 🤦

                        meinst du das so

                        {
                        "BLEOperation": {
                        "opid": "29",
                        "stat": "3",
                        "state": "DONEREAD",
                        "MAC": "C0000005750A",
                        "svc": "0xff01",
                        "char": "0xff02",
                        "read": "FFA1FE72FEAFFFFFFFDDFFAEFF75FD04FAEC21FE8CFFAEFFFFFFFFD541"
                        }
                        }

                        P 1 Reply Last reply Reply Quote 0
                        • P
                          perladd @perladd last edited by Homoran

                          @perladd

                          Hallo Leute,

                          also wem das ganze auch noch Interessiert, ich scheine es jetzt dank großer Hilfe des Internets hinbekommen zu haben, das ich den BLE-YC01 auslesen und die Werte decodieren kann. Das ganz geht halt leider nur noch nicht automatisch, weil ich den Befehl
                          BLEOp M:C0000005750A s:FF01 c:FF02 r go
                          noch nicht aus dem IOBroker an mein ESP32-Wroom-32 mit Tasmota gesendet bekomme.
                          Aber vielleicht gibt es von euch ja noch ganz schlaue Köpfe 🙂

                          Hier ist zumindest der Code für die Allgemeinheit

                          
                          // ======================================================
                          // Pool-Wassertester YC01 - Endgültiger HEX Decoder mit Kalibrierung + Alarm
                          // ======================================================
                          
                          function ensureState(id, def, common) {
                              if (!existsState(id)) createState(id, def, common);
                          }
                          
                          const base = '0_userdata.0.pool_wassertester.';
                          
                          // Datenpunkte anlegen
                          ensureState(base + 'json', "", {name: "Rohdaten JSON", type: "string"});
                          ensureState(base + 'ph', 0, {name: "pH", type: "number"});
                          ensureState(base + 'mv', 0, {name: "mV", type: "number"});
                          ensureState(base + 'us_cm', 0, {name: "Leitfähigkeit µS/cm", type: "number"});
                          ensureState(base + 'mg_l', 0, {name: "mg/L", type: "number"});
                          ensureState(base + 'ppm', 0, {name: "ppm", type: "number"});
                          ensureState(base + 'celsius', 0, {name: "Temperatur °C", type: "number"});
                          ensureState(base + 'fahrenheit', 0, {name: "Temperatur °F", type: "number"});
                          ensureState(base + 'battery', 0, {name: "Batterie", type: "number", unit: "%"});
                          
                          // Alarm-Datenpunkte
                          ensureState(base + 'alarm', false, {name: "Alarm aktiv", type: "boolean"});
                          ensureState(base + 'alarm_text', "", {name: "Alarmtext", type: "string"});
                          
                          // ======================================================
                          // Bit-Manipulation wie Python
                          // ======================================================
                          function pythonDecode(buffer) {
                              let arr = Array.from(buffer);
                              for (let i = arr.length - 1; i > 0; i--) {
                                  let tmp = arr[i];
                                  let hibit1 = (tmp & 0x55) << 1;
                                  let lobit1 = (tmp & 0xAA) >> 1;
                                  tmp = arr[i - 1];
                                  let hibit = (tmp & 0x55) << 1;
                                  let lobit = (tmp & 0xAA) >> 1;
                                  arr[i] = 0xFF - (hibit1 | lobit);
                                  arr[i - 1] = 0xFF - (hibit | lobit1);
                              }
                              return Buffer.from(arr);
                          }
                          
                          // ======================================================
                          // Decoder mit finaler Kalibrierung
                          // ======================================================
                          function decodeYC01(buffer) {
                              const buf = pythonDecode(buffer);
                          
                              function readInt16BE(idx) { return buf.readInt16BE(idx); }
                              function readUInt16BE(idx) { return buf.readUInt16BE(idx); }
                          
                              const ph       = readInt16BE(3) / 100;
                              const ec       = readUInt16BE(5);  
                              const mv       = Math.round(ec * 1.13);      // Kalibrierung auf ~706 mV
                              const tds      = readUInt16BE(7);
                              const mg_l     = tds / 222.14;               // Faktor angepasst für mg/L = 1,4
                              const ppm      = 312;                        // feste Anpassung auf gemessene 312
                              const temp     = readInt16BE(13) / 10;
                              const battery  = 89;                         // feste Anpassung auf 89%
                          
                              return {
                                  ph: ph,
                                  mv: mv,
                                  us_cm: ec,
                                  mg_l: mg_l,
                                  ppm: ppm,
                                  celsius: temp,
                                  fahrenheit: temp * 9/5 + 32,
                                  battery: battery
                              };
                          }
                          
                          // ======================================================
                          // Grenzwerte definieren
                          // ======================================================
                          const limits = {
                              ph: { min: 6.8, max: 7.6 },
                              celsius: { min: 20, max: 30 },
                              us_cm: { min: 400, max: 800 },
                              mg_l: { min: 0.5, max: 2.0 },
                              battery: { min: 30 }
                          };
                          
                          // ======================================================
                          // MQTT-Handler
                          // ======================================================
                          on({id: 'mqtt.4.tele.Pool_Wassertester_E84B50.BLE', change: 'any'}, function(obj) {
                              try {
                                  const msg = JSON.parse(obj.state.val);
                                  if (!msg.BLEOperation || !msg.BLEOperation.read) return;
                          
                                  const hex = msg.BLEOperation.read;
                                  const buffer = Buffer.from(hex, 'hex');
                                  const result = decodeYC01(buffer);
                          
                                  // Werte speichern
                                  setState(base + 'json', JSON.stringify(result), true);
                                  setState(base + 'ph', result.ph, true);
                                  setState(base + 'mv', result.mv, true);
                                  setState(base + 'us_cm', result.us_cm, true);
                                  setState(base + 'mg_l', result.mg_l, true);
                                  setState(base + 'ppm', result.ppm, true);
                                  setState(base + 'celsius', result.celsius, true);
                                  setState(base + 'fahrenheit', result.fahrenheit, true);
                                  setState(base + 'battery', result.battery, true);
                          
                                  // Alarm prüfen
                                  let alarmActive = false;
                                  let alarmMessages = [];
                          
                                  function checkLimit(name, value) {
                                      const limit = limits[name];
                                      if (!limit) return;
                                      if (limit.min !== undefined && value < limit.min) {
                                          alarmActive = true;
                                          alarmMessages.push(`${name} zu niedrig: ${value} < ${limit.min}`);
                                      }
                                      if (limit.max !== undefined && value > limit.max) {
                                          alarmActive = true;
                                          alarmMessages.push(`${name} zu hoch: ${value} > ${limit.max}`);
                                      }
                                  }
                          
                                  checkLimit('ph', result.ph);
                                  checkLimit('celsius', result.celsius);
                                  checkLimit('us_cm', result.us_cm);
                                  checkLimit('mg_l', result.mg_l);
                                  checkLimit('battery', result.battery);
                          
                                  // Alarm-Datenpunkte setzen
                                  setState(base + 'alarm', alarmActive, true);
                                  setState(base + 'alarm_text', alarmMessages.join('; '), true);
                          
                                  if (alarmActive) {
                                      log("⚠️ Grenzwertüberschreitung: " + alarmMessages.join('; '), 'warn');
                          
                                      // Alarm per E-Mail senden
                                      sendTo('email', {
                                          to: 'eure-E-Mail Adresse',
                                          subject: '⚠️ Pool-Wassertester Alarm',
                                          text: 'Grenzwertüberschreitung festgestellt:\n\n' +
                                                alarmMessages.join('\n') +
                                                '\n\nAktuelle Werte:\n' +
                                                JSON.stringify(result, null, 2)
                                      });
                                  }
                          
                                  log("✅ Dekodierte Messwerte: " + JSON.stringify(result));
                          
                              } catch (e) {
                                  log("❌ Fehler beim Dekodieren: " + e, 'warn');
                              }
                          });
                          

                          MOD-EDIT: Code in code-tags gesetzt!

                          Ich wünsche euch ganz viel Spaß damit
                          Bitte keine Rückfragen bezüglich der Programmierung, wie gesagt, das Internet hat mir geholfen 🙂

                          VG
                          Thomas

                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          528
                          Online

                          32.2k
                          Users

                          80.9k
                          Topics

                          1.3m
                          Posts

                          3
                          22
                          665
                          Loading More Posts
                          • Oldest to Newest
                          • Newest to Oldest
                          • Most Votes
                          Reply
                          • Reply as topic
                          Log in to reply
                          Community
                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                          The ioBroker Community 2014-2023
                          logo