Skip to content

Microcontroller

267 Topics 4.5k Posts

NEWS

  • Hichi-Lesekopf liefert nicht alle Objekte über MQTT

    Moved
    69
    2
    0 Votes
    69 Posts
    5k Views
    D
    @homoran sagte in Hichi-Lesekopf liefert nicht alle Objekte über MQTT: Man kann den IR Lesekopf auch gut mit hterm testen um ein Fehlerquelle auzuschließen. Warum nicht, damit kenne ich mich aus. Sonoff ist nicht Sonoff https://sonoff.tech , das muß ich erst mal verstehen. Sorry für das Kapern.
  • Erledigt. Zweiten Slider für Shuttertilt?

    4
    0 Votes
    4 Posts
    300 Views
    Y
    Ich hab den 2. Slider hin bekommen mitttels Berry Script, dies ist unter gespeichert unter shuttertilt_ui.be und wird über die autoexec.be gestartet mit load('shuttertilt_ui.be'). Es muss SetOption94 1 über die Konsole aufgerufen werden, das Tasmota beim start die autoexec.be startet. Das Skript shuttertilt_ui.be: import webserver var tiltValue = 0 # --- Funktion: Tilt-Wert aktualisieren --- def updateTilt() var res res = tasmota.cmd("ShutterTilt") if (res == nil) || (res == "") || (res == "0") || (res == "off") || (res == "error") tiltValue = 0 else # Versuch, Zahl zu konvertieren var n n = int(res) if n == nil tiltValue = 100 else tiltValue = n end end end # --- Klasse für WebUI --- class ShutterTiltUI def web_add_main_button() updateTilt() var html html = "<hr><h3>Shutter Tilt</h3>" html = html + "<form action='' method='get'>" html = html + "<input type='range' min='0' max='100' value=" + str(tiltValue) html = html + " oninput='tiltval.innerText=this.value'" html = html + " onchange='la(\"&m_tilt=\"+this.value)'>" html = html + " <span id='tiltval'>" + str(tiltValue) + "</span>%" html = html + "</form>" webserver.content_send(html) end def web_sensor() if webserver.has_arg("m_tilt") var val val = int(webserver.arg("m_tilt")) tasmota.cmd("ShutterTilt " + str(val)) print("ShutterTilt gesetzt auf " + str(val)) end end end # --- Treiber registrieren --- var ui ui = ShutterTiltUI() tasmota.add_driver(ui) updateTilt() Nur wird der Shuttertilt beim aufrufen der Seite nicht aktualisiert, und steht bei bei 100%. Das reicht mir, da ich das Rollo vom PC aus bediene wenn die Sonne mich zu sehr blendet. Das Rollo ist bei mir sonst offen. Hoffe das hilft jemanden der über den PC das Rollo bedienen möchte.
  • Tasmota erstellt MQTT Topics?

    Moved
    10
    1
    0 Votes
    10 Posts
    503 Views
    haselchenH
    Das hilft sicher nicht bei WLAN Problemen... Dann wirst Du gesehen haben, dass seine Antwort vor meiner kam ;)
  • MQTT-Client: Datenpunkte, die der Client lesen soll

    Moved
    1
    0 Votes
    1 Posts
    151 Views
    No one has replied
  • AI on the edge - esp32 oder ESP32-MB

    Moved
    40
    0 Votes
    40 Posts
    2k Views
    MartinPM
    @dojodojo sagte in AI on the edge - esp32 oder ESP32-MB: @martinp sagte in AI on the edge - esp32 oder ESP32-MB: da muss man keinen Taster-Voodo Im musste bei meiner ESP32-Cam mit ESP32-Cam-MB keine Tasten drücken. Stimmt, über Dioden ist über DTR und RTS des USB-Seriell Chips auf dem Board die Ansteuerung auch möglich https://cat-one.net/2021/05/20/schematic-of-esp32-cam-mb/
  • Texas Instr. CC2531 (Zigbee) mit DS18B20 Temperatursensor

    19
    2
    0 Votes
    19 Posts
    1k Views
    skvarelS
    @asgothian sagte in Texas Instr. CC2531 (Zigbee) mit DS18B20 Temperatursensor: Da kenne ich die Converter. Wenn jemand die Converter kennt, dann du :) Da haben wir beide so einige schöne Stunden mit verbracht!
  • [Gelöst] ESP32S mit DS18B20 Temp-Sensor

    51
    2
    0 Votes
    51 Posts
    7k Views
    D
    @homoran ok, beim nächsten mal Das nächste mal ist heute: https://forum.iobroker.net/topic/82268/esp-auf-cc2531-zigbee-protokoll-ds18b20-temperatursensor
  • 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
    144 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
    4k 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
    187 Views
    No one has replied
  • 2 LED-Stripes mit 1x8266 unabhängig über MQTT

    Moved
    2
    0 Votes
    2 Posts
    170 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
    234 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
    294 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
    681 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
    871 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
    422 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 :)

495

Online

32.6k

Users

82.1k

Topics

1.3m

Posts