Skip to content

Microcontroller

261 Topics 4.4k Posts

NEWS

  • Iobroker, MQTT und Servo Motor

    Moved blockly template
    26
    0 Votes
    26 Posts
    1k Views
    D
    Danke allen für die Klärung.
  • Taster ansteuern mit ESPeasy

    2
    1
    0 Votes
    2 Posts
    136 Views
    S
    @michisa86888 Mal zwei Bilder für dich: [image: 1758391737289-img_20250920_200830.jpg] [image: 1758391744003-img_20250920_200844.jpg] Gerne weitere Fragen wenn nötig.
  • ( gelöst ) ESP Wassersensor BLE-YC01 MQTT

    Moved
    22
    1
    0 Votes
    22 Posts
    1k Views
    P
    @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
  • Schaltproblem mit Sonoff TX Ultimate

    Moved
    37
    0 Votes
    37 Posts
    3k Views
    S
    Nochmal zusammengefasst: zuerst setzt man das Template. Für einen 1Ch {"NAME":"TX Ultimate 1","GPIO":[0,0,7808,0,7840,3872,0,0,0,1376,0,7776,0,0,224,3232,0,480,3200,0,0,0,3840,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1,"CMND":"Backlog Pixels 28"} 2Ch {"NAME":"TX Ultimate 2","GPIO":[0,0,7808,0,7840,3872,0,0,0,1376,0,7776,0,225,224,3232,0,480,3200,0,0,0,3840,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1,"CMND":"Backlog Pixels 28"} 3Ch {"NAME":"TX Ultimate 3","GPIO":[0,0,7808,0,7840,3872,0,0,0,1376,0,7776,0,225,224,3232,0,480,3200,0,0,0,3840,226,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1,"CMND":"Backlog Pixels 28"} 4Ch {"NAME":"TX Ultimate 4","GPIO":[0,0,7808,0,7840,3872,0,0,0,1376,0,7776,0,225,224,3232,0,480,3200,227,0,0,3840,226,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1,"CMND":"Backlog Pixels 28"} Danach erstelle ich unter Werkzeuge -> Dateisystem verwalten eine Datei mit dem Namen txultimate.be mit folgendem Inhalt: class TXUltimate : Driver static header = bytes('AA55') var ser # create serial port object # intialize the serial port, if unspecified Tx/Rx are GPIO 16/17 def init(tx, rx) if !tx tx = 19 end if !rx rx = 22 end self.ser = serial(rx, tx, 115200, serial.SERIAL_8N1) tasmota.add_driver(self) end def split_55(b) var ret = [] var s = size(b) var i = s-2 # start from last-1 while i > 0 if b[i] == 0xAA && b[i+1] == 0x55 ret.push(b[i..s-1]) # push last msg to list b = b[(0..i-1)] # write the rest back to b end i -= 1 end ret.push(b) return ret end def crc16(data, poly) if !poly poly = 0x1021 end # CRC-16/CCITT-FALSE HASHING ALGORITHM var crc = 0xFFFF for i:0..size(data)-1 crc = crc ^ data[i] << 8 for j:0..7 if crc & 0x8000 crc = (crc << 1) ^ poly else crc = crc << 1 end end end return crc & 0xFFFF end def encode(payload) var msg_crc = self.crc16(bytes(payload)) # calc crc var b = bytes('AA55') # add header b += bytes(payload) # add payload b.add(msg_crc, -2) # add calculated crc 2 bytes, big endian return b end # send a string payload (needs to be a valid json string) def send(payload) print("TXU: Sent =", payload) var payload_bin = self.encode(payload) self.ser.write(payload_bin) log("TXU: Sent = " + str(payload_bin), 2) end # read serial port def every_50ms() if self.ser.available() > 0 var msg = self.ser.read() # read bytes from serial as bytes import string if size(msg) > 0 # print("TXU: Raw =", msg) if msg[0..1] == self.header var lst = self.split_55(msg) for i:0..size(lst)-1 msg = lst[i] print(msg) var event = "" var params = "" if msg[3] == 0x02 # 02 signifies a touch event # print('Touch event') if msg[4] == 0x01 # data lenght 1 is a press if msg[5] < 0x0B event = "Short" params = ',"Channel":' + str(msg[5]) print('Short press zone:', msg[5]) elif msg[5] == 0x0B event = "Multi" print('Multi press') elif msg[5] > 0x0B event = "Long" params = ',"Channel":' + str(msg[5]-16) print('Long press zone:', msg[5]) end elif msg[4] == 0x02 # data length 3 is a release event = "Touch" params = ',"Channel":' + str(msg[6]) print('Touch event:', msg[5], 'pos:', msg[6]) if msg[5] != 0x00 event = "Dash" params = ',"From":' + str(msg[6]) + ',"To":' + str(msg[5]) print('Mini swipe channel', msg[5], '->', msg[6]) end elif msg[4] == 0x03 # data lenght 1 is a swipe if msg[5] == 0x0C event = "Swipe right" params = ',"From":' + str(msg[6]) + ',"To":' + str(msg[7]) print('Swipe left-right', msg[6], '->', msg[7]) elif msg[5] == 0x0D event = "Swipe left" params = ',"From":' + str(msg[6]) + ',"To":' + str(msg[7]) print('Swipe right-left', msg[6], '->', msg[7]) end end var jm = string.format("{\"TXUltimate\":{\"Action\":\"%s\"%s}}",event,params) tasmota.publish_result(jm, "RESULT") end end end end end end end txu=TXUltimate() und damit diese Datei auch beim Start geladen wird, noch eine weitere Datei mit dem Namen autoexec.be mit dem Inhalt load("txultimate.be") Dann geht es weiter mit den Rules. Ich lasse ganz bewusst Rule1 von dieser Seite weg, da sie bei mir ziemliches Chaos verursacht. Bei Mehrchannelschaltern werden z.b. die Channel wild durcheinander geschaltet. Außerdem habe ich bei mir das Backlight per Script geschaltet. Es schaltet sich abends an und morgens aus. Das funktioniert mit der Rule auch nicht, da es sich dann bei jedem Tastendruck an- bzw ausschaltet. Damit der Touch die Relais schaltet, benutze ich folgende Rule von @Dieter_P rule2 On TXultimate#Action$!Touch do break rule2 + On TXUltimate#Channel=1 do power1 toggle endon rule2 + On TXUltimate#Channel=<xxx> do power1 toggle endon rule2 + On TXUltimate#Channel=5 do power2 toggle endon rule2 + On TXUltimate#Channel=<xxx> do power2 toggle endon rule2 + On TXUltimate#Channel=10 do power3 toggle endon rule2 + On TXUltimate#Channel=<xxx> do power3 toggle endon Hier im Beispiel für einen 3Ch-Schalter. Wobei ich aber nicht einfach die Channel übernehme, sondern sie selber austeste. Da man sowieso in der Konsole ist, muss man hier nur auf das Touch an der gewünschten Stelle drücken und die Konsole gibt den Channel aus. Den übernehme ich dann in die Rule, hier gekennzeichnet mit dem <xxx>. Das wars eigentlich auch schon. Der Schalter sollte nun funktionieren.
  • ESPHome & AtomS3 Lite GPIO35 Konflikt?

    esphome esp32s3 atoms3lite
    1
    0 Votes
    1 Posts
    156 Views
    No one has replied
  • 2 LED-Stripes mit 1x8266 unabhängig über MQTT

    Moved
    2
    0 Votes
    2 Posts
    169 Views
    S
    So, ich habe das mal aufgedröselt... [image: 1754574805531-tasmota1.jpg] [image: 1754574805562-tasmota2.jpg] Das sind die Einstellungen in Tasmota [image: 1754574805507-iob2.jpg] [image: 1754574805385-iob1.jpg] Das ganze meldet sich ähnlich wie meine RGB- Stripes aber mit der Bedienung komme ich nicht zurecht. Power1 hängt mit Red zusammen (LED-Stripe1) Power2 hängt mit Green zusammen (LED-Stripe2): Wenn beide leuchten lässt sich die Helligkeit regeln. Wenn ich jetzt im ersten Bild die Helligkeit Green auf 50% setze geht Power2 automatisch auf On mit dem WErt von Green, weil sich scheinbar Color ändert. Ich habe eigentlich nur Setoption68 auf 1 gesetzt. Muss ich noch etwas ändern? Help, I'm Lost... oder funktioniert das so nicht... Jürgen
  • Hichi Lesekopf Kaskade funktioniert nicht wie erwartet.

    Moved
    2
    1
    0 Votes
    2 Posts
    218 Views
    Jörg MenkeJ
    @jörg-menke Nach Aufspielen einer neuen Firmware die mir von Hichi bereitgestellt worden ist, läuft es jetzt. Problem gelöst mit Version 14.6.02. Danke Hichi!
  • Zigbee Smartmeter Reader mit ESP32-C6

    3
    3 Votes
    3 Posts
    236 Views
    C
    @asgothian die README war an der Stelle mit dem Bild veraltet. In dem Konverter steht aktuell die online Quelle für das Bild (als Verweis auf das Repo), wodurch das Kopieren ganz entfällt.
  • Zigbee Konverter für ESP32-C6

    13
    0 Votes
    13 Posts
    654 Views
    AsgothianA
    @clausmuus sagte in Zigbee Konverter für ESP32-C6: @asgothian Ich werde das in den nächsten Tagen testen. Die Namensgebung (ESP32-c6.js) ist allerdings nicht so günstig, da der Converter ja nur für die electrical_measurement_ac passt. Besser wäre also z.B. ESP32-c6-electrical-measurement-ac.js Alternatiev könnte der Converter aber auch nach und nach für die anderen Beispiele erweitert werden, was wohl die schönere Lösung wäre. So war das geplant - damit nicht zu viele einzelne Dateien dazu geladen werden.
  • ESP32 als Wifi Access Point?

    9
    0 Votes
    9 Posts
    671 Views
    MartinPM
    @dieter_p kein altes Smartphone in der Schublade? Ich weiß aber nicht, ob die Access Points, die Android aufspannt Verbindungen unter den Clients erlauben
  • Wie einen Schall Alarmgeber über ESP/Tasmota realisieren?

    Moved
    5
    0 Votes
    5 Posts
    388 Views
    hg6806H
    @wildbill Danke für den Tipp. Ich hatte Tasmota Basic genommen und Switch_n Mit Generic wird auch jetzt ein Switch in ioBroker generiert, jedoch steht er immer auf true. Wenn ich jetzt bei dem Sensor die Sensibilität voll auftrehe, müsste ich ja ständig low also false haben. Das einzige was zuckt ist "Power". Aber nur wenn ich die Sensabilität verstelle, nicht bei Schall. Vielleicht ist bei einem Schallsensor auch eine andere Einstellung notwendig.
  • ESP8266 und CC1101 für 433 MHz ?

    Moved
    12
    0 Votes
    12 Posts
    2k Views
    CodierknechtC
    @alex-8 Ich habe mir mal einen der für Tasmota empfohlenen Transceiver besorgt (SRX882/STX882) und habe den auf 'nem Breadboard fliegend verdrahtet. Funzt perfekt. Ich habe dann kurzerhand den STX882 "huckepack" auf eine bereits verbastelte Sonoff-Bridge gesetzt und mit GPIO14 verbunden. Funktioniert einwandfrei. Die Bridge liefert quasi nur noch die Basis (Gehäuse, MCU, Stromversorgung). Senden tut der kleine STX882.
  • A02 Ultraschallsensor an D1 Mini ESP8266

    28
    1
    0 Votes
    28 Posts
    2k Views
    haselchenH
    @bananajoe @bahnuhr Also, Kinderkriegen ist einfacher. Gestern Mittag war alles tutti, ESP32 mit Tasmota bespielt, Jumperkabel verbunden , im Carport verbaut. Dann fing es an. Keine WLAN Verbindung mehr. Egal was ich auch gemacht habe. Das Teil blieb nicht erreichbar. Also eine Alternative gesucht. ESPEasy gefunden. Naja, Easy ist dann doch gelogen in dem Namen :) Hab, wegen der WLAN Reichweite diesmal einen ESP8266 genommen. Ein Drama da ESPEasy (die richtige Version) draufzubekommen. Nun gut. Irgendwann gegen Mitternacht hatte ich es dann. Also ins Carport, verbinden. Da der Platz da fummelig ist, ist dann natürlich die USB Buchse abgebrochen. Also laut: Schei.... geschrien Dann wieder den ESP32 rausgekramt, da ESPEasy drauf. Auch da war es ne Kunst die richtige Version zu treffen. Mittlerweile war es 1Uhr und es funktionierte einfach nicht. Immer Distance 0,00 cm. Pennen gegangen. Eben nochmal alles von vorne. Neue Jumperkabel, neue GPIO Belegung. [image: 1749289352674-4f906cbb-e1e2-4251-a464-8590311d4611-grafik.png] Ich melde Vollzug um 11:42Uhr. Diese Verbindung lasse ich da hängen, bis das Carport weggefault ist :)
  • ESP32-C6 Zigbee Support external converter Bitte um Hilfe

    Moved
    40
    1
    0 Votes
    40 Posts
    4k Views
    AsgothianA
    @jens-g deine Entscheidung. Allerdings merkt sich der Adapter durchaus den “Namen” des Gerätes - nicht aber die ID, die für die Ansteuerung verantwortlich ist. Das mit dem Posten der Info Anzeige (nach deinen Änderungen) war ernst gemeint. Das was du als externen Konverter von mir bekommen hattest war dürneine Lampe, nicht für einen Sensor. A.
  • Hörmann HCPBridge Sensoren

    1
    0 Votes
    1 Posts
    220 Views
    No one has replied
  • JK-BMS über RS485 mit ESPHome auslesen

    Moved jk-bms esphome arduino iobroker
    94
    0 Votes
    94 Posts
    20k Views
    D
    @homoran said in JK-BMS über RS485 mit ESPHome auslesen: Punkt 1: Da muss jemand die Energie und das Können haben den BT Verkehr mitzuschneiden und das Kennwort auszulesen. Nö, wenn jemand weiß dass es ein JK BMS ist kann er ohne ein Passwort sämltliche Einstellungen nach Belieben verstellen. Alles was er braucht ist die öffentlich bekannte MAC Adresse und den hier besprochenen Github-Inhalt auf einem ESP32. Zum Glück lässt sich BLE ja im BMS deaktivieren und alles auch über UART-TTL Anbindung per Kabel nutzen.
  • AI on the edge flashen

    Moved
    16
    2
    0 Votes
    16 Posts
    1k Views
    Ben1983B
    @blockmove Muss ich mal versuchen, wenn ich genug zeit finde
  • Stromzähler mit Kauf/Verkauf Option in iobroker.

    Moved
    13
    0 Votes
    13 Posts
    967 Views
    andre1deA
    @ullij said in Stromzähler mit Kauf/Verkauf Option in iobroker.: @andre1de sagte in Stromzähler mit Kauf/Verkauf Option in iobroker.: Mein oben beschriebenes Problem konnte ich übrigens durch den Vergleich mit früheren Daten lösen. Wenn die Werte für Bezug und Einspeisung aktualisiert bzw. geändert werden geht das auch damit...zumindest grob im Rahmen der zeitlichen Auflösung. Mit Hilfe der aktuellen Leistung geht es halt etwas präziser. die Variante von mir war OBIS, vielleicht funktioniert ja auch die Version mit SML ... good luck Nein, deine Code funktioniert nicht, aber wie gesagt, ich kriege problemlos meine Hauptwerte. Und ich habe noch im Forum von tasmota gefragt, ob schon neu Code gibt.
  • Iskra MT631 via Tasmota

    iskra mt631 tasmota
    42
    0 Votes
    42 Posts
    4k Views
    M
    @homoran ok danke euch
  • Sonoff-Adapter findet einen Wert vom Device nicht

    Moved
    9
    2
    0 Votes
    9 Posts
    794 Views
    T
    @mcu said in Sonoff-Adapter findet einen Wert vom Device nicht: Ich bin da nicht mehr im Thema, aber die Idee wäre den Wert vom Attribut "Range" der vom Adapter nicht abgefangen wird, umzusetzen auf einen definierten Wert (vom Adapter) . Danke, das hat funktioniert! __ @jan1 said in Sonoff-Adapter findet einen Wert vom Device nicht: @topsurfer Erstelle den DP manuell und schau ob er vom Adapter befüllt wird. Habe ich bei einem fehlenden DP im Shuttermodus auch so gelöst und da funktioniert es. Probiert, aber der Wert bleibt immer 0 (auch ESP restart, Bodenfeuchte geändert, ...) Hab den DP vom Typ "Zahl" angelegt { "common": { "name": "Range", "desc": "Manuell erzeugt", "role": "state", "type": "number", "read": true, "write": true, "def": 0 }, "type": "state", "native": {}, "from": "system.adapter.admin.0", "user": "system.user.admin", "ts": 1746117283884, "_id": "sonoff.0.Zisterne #e11.Range", "acl": { "object": 1636, "state": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" } } [image: 1746118535190-2025-05-01_185334.png]

791

Online

32.5k

Users

81.6k

Topics

1.3m

Posts