Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. perladd

    NEWS

    • Monatsrückblick – September 2025

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

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

    P
    • Profile
    • Following 0
    • Followers 1
    • Topics 23
    • Posts 192
    • Best 1
    • Groups 2

    perladd

    @perladd

    Starter

    0
    Reputation
    30
    Profile views
    192
    Posts
    1
    Followers
    0
    Following
    Joined Last Online

    perladd Follow
    Pro Starter

    Best posts made by perladd

    • ( gelöst )Balkonkraftwerk Stromüberschuß Klimaanlage

      Hallo Leute,
      ich bin ganz neu in dieser Welt und habe natürlich eine Frage, weil ich mit dem Vis noch nicht ganz klar komme.
      Meine erste Aufgabe möchte ich damit realisieren, wenn man Balkonkraftwerk einen Stromüberschuss produziert, was ich zur Zeit auch in meiner Discovergy App sehen kann ( z.B. -300W ), dann soll meine Mitsubishi Klimaanlage eingeschaltet werden ( diese ist ebenfalls mit der MelCloud verbunden ). Die passenden Adapter habe ich bereits installiert. Achso, die Klima sollte natürlich nicht direkt wieder ausgehen, wenn der Stromverbrauch wieder ins Plus geht, da sollte evtl eine Zeit von 2 Minuten drin sin. Die Klima muss ja auch erst hochfahren und fährt dann wieder zurück. Ich hoffe mir kann jemand helfen.

      VG
      Thomas

      posted in Automatisierung
      P
      perladd

    Latest posts made by perladd

    • RE: ( gelöst ) ESP Wassersensor BLE-YC01 MQTT

      @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

      posted in Microcontroller
      P
      perladd
    • RE: ( gelöst ) ESP Wassersensor BLE-YC01 MQTT

      @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"
      }
      }

      posted in Microcontroller
      P
      perladd
    • RE: ( gelöst ) ESP Wassersensor BLE-YC01 MQTT

      @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"
      }
      }

      posted in Microcontroller
      P
      perladd
    • RE: ( gelöst ) ESP Wassersensor BLE-YC01 MQTT

      @homoran

      FFA1FE5AFEBFFFFFFF77FFBEFF7DFD0AFAE821FE26FFBEFFFFFFFFFF51

      meinst du die Zeile, die wollte ich so auslesen

      posted in Microcontroller
      P
      perladd
    • RE: ( gelöst ) ESP Wassersensor BLE-YC01 MQTT

      @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 🙂

      posted in Microcontroller
      P
      perladd
    • RE: ( gelöst ) ESP Wassersensor BLE-YC01 MQTT

      @homoran

      wo soll ich es denn sonst her bekommen

      was muss denn bei der id rein

      posted in Microcontroller
      P
      perladd
    • RE: ( gelöst ) ESP Wassersensor BLE-YC01 MQTT

      @homoran

      sorry war zu schnell, siehe oben noch einmal

      "Cannot parse "mqtt.4.tele.Pool_Wassertester_": SyntaxError: Unexpected token 'm', "mqtt.4.tel"... is not valid JSON"

      posted in Microcontroller
      P
      perladd
    • RE: ( gelöst ) ESP Wassersensor BLE-YC01 MQTT

      @homoran

      Hallo,

      ich bekomme folgende Fehlermeldung beim ausführen

      Cannot parse "mqtt.4.tele.Pool_Wassertester_": SyntaxError: Unexpected token 'm', "mqtt.4.tel"... is not valid JSON

      3a475172-e0c0-45d8-bcd2-0684c5b26af6-image.png

      so sieht das Blockly aus

      posted in Microcontroller
      P
      perladd
    • RE: ( gelöst ) ESP Wassersensor BLE-YC01 MQTT

      @homoran

      Hallo zusammen,

      ich bin immer noch an meinem Wassersensor am basteln und glaube der Sache ein bisschen näher gekommen zu sein 🙂

      Ich habe unter meinem MQTT einen Datenpunkt, entschuldigt wenn ich mich falsch ausdrücke. Davon habe ich einen Wert der sieht folgendermaßen aus

      7e01bed5-6e7b-4b20-87a4-e3faf3efc5dd-image.png

      Ich müsste jetzt aber in einem neuen Datenpunkt, nur die Zeile 9 geschrieben bekommen, wie bekomme ich das hin?

      Für eure Hilfe wäre ich wie immer sehr dankbar

      VG
      Thomas

      posted in Microcontroller
      P
      perladd
    • RE: Poolsensor BLE-YC01

      @bug77

      Hallo,

      dann hast du keine direkte Verbindung ESP und IOBroker. Bist also nur über umwege über HA an die Werte gekommen

      VG
      Thomas

      posted in Einbindung von Geräten
      P
      perladd
    Community
    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
    The ioBroker Community 2014-2023
    logo