Skip to content

Microcontroller

266 Themen 4.5k Beiträge

NEWS

  • Erledigt. Zweiten Slider für Shuttertilt?

    4
    0 Stimmen
    4 Beiträge
    299 Aufrufe
    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?

    Verschoben
    10
    1
    0 Stimmen
    10 Beiträge
    500 Aufrufe
    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

    Verschoben
    1
    0 Stimmen
    1 Beiträge
    147 Aufrufe
    Niemand hat geantwortet
  • AI on the edge - esp32 oder ESP32-MB

    Verschoben
    40
    0 Stimmen
    40 Beiträge
    2k Aufrufe
    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 Stimmen
    19 Beiträge
    1k Aufrufe
    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 Stimmen
    51 Beiträge
    7k Aufrufe
    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

    Verschoben blockly template
    26
    0 Stimmen
    26 Beiträge
    1k Aufrufe
    D
    Danke allen für die Klärung.
  • Taster ansteuern mit ESPeasy

    2
    1
    0 Stimmen
    2 Beiträge
    141 Aufrufe
    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

    Verschoben
    22
    1
    0 Stimmen
    22 Beiträge
    1k Aufrufe
    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

    Verschoben
    37
    0 Stimmen
    37 Beiträge
    4k Aufrufe
    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 Stimmen
    1 Beiträge
    180 Aufrufe
    Niemand hat geantwortet
  • 2 LED-Stripes mit 1x8266 unabhängig über MQTT

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    170 Aufrufe
    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.

    Verschoben
    2
    1
    0 Stimmen
    2 Beiträge
    230 Aufrufe
    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 Stimmen
    3 Beiträge
    285 Aufrufe
    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 Stimmen
    13 Beiträge
    676 Aufrufe
    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 Stimmen
    9 Beiträge
    850 Aufrufe
    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?

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    413 Aufrufe
    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 ?

    Verschoben
    12
    0 Stimmen
    12 Beiträge
    2k Aufrufe
    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 Stimmen
    28 Beiträge
    2k Aufrufe
    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

    Verschoben
    40
    1
    0 Stimmen
    40 Beiträge
    4k Aufrufe
    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.

673

Online

32.6k

Benutzer

82.0k

Themen

1.3m

Beiträge