1
0
Fork 0

Compare commits

..

15 commits
main ... main

Author SHA1 Message Date
subDesTagesMitExtraKaese
ac2694fb41 add SMCI33 documentation 2025-06-18 20:48:48 +02:00
subDesTagesMitExtraKaese
fe9a254ce7 update readme 2025-06-15 05:58:11 +02:00
subDesTagesMitExtraKaese
341f4f767c fix relay config 2025-06-15 05:41:23 +02:00
subDesTagesMitExtraKaese
23b3e5e7b0 add number slider for RPM control 2025-06-15 05:30:18 +02:00
subDesTagesMitExtraKaese
6e18761d9f adept to sonoff TH device 2025-06-15 04:20:17 +02:00
subDesTagesMitExtraKaese
f623398284 update platform syntax 2025-03-03 11:41:13 +01:00
8c823c7c88 README.md aktualisiert
Fix typos
2024-07-29 22:19:44 +02:00
4464b618df Merge pull request 'feat/MultisyncX401S' () from timo/netz39-ir-blaster:feat/MultisyncX401S into main
Reviewed-on: 
2024-07-29 18:23:18 +02:00
Timo Herrmann
89e51e4c0a Update README.md 2024-07-29 17:36:33 +02:00
Timo Herrmann
52f48b9ebb Add pin cracking script 2024-07-29 17:35:31 +02:00
Timo Herrmann
dfe341c5ff Add newline 2024-07-29 17:34:53 +02:00
Timo Herrmann
0c475afc43 Add config for receiver 2024-07-29 17:34:33 +02:00
Timo Herrmann
d678d95bdf Add IR-codes for MultisyncX401S 2024-07-29 17:33:45 +02:00
7224b75cfe config.yaml aktualisiert 2024-07-25 19:33:49 +02:00
98fe97d3d9 README.md aktualisiert 2024-07-25 19:25:39 +02:00
5 changed files with 299 additions and 11 deletions

Binary file not shown.

View file

@ -1,6 +1,6 @@
# IR Blaster # Disco-Kugel und IR Blaster
http://ir-blaster.n39.eu http://lounge-ir-disco.n39.eu
## Installation und Flashen ## Installation und Flashen
@ -11,19 +11,80 @@ http://ir-blaster.n39.eu
``` ```
2. esphome installieren 2. esphome installieren
```bash ```bash
pip installv esphome pip install esphome
``` ```
3. `secrets.yaml` anlegen: 3. `secrets.yaml` anlegen:
```yaml ```yaml
WifiPassword: "changeme" WifiPassword: "changeme"
OtaPassword: "chamgeme" OtaPassword: "changeme"
``` ```
4. config hochladen 4. config hochladen
```bash ```bash
esphome run config.yaml esphome run config.yaml
``` ```
## Codes bearbeiten ## Disco-Kugel
Jeder Befehl muss mit `#*` anfangen. Das spricht alle Steuerungen im Bus an.
Außerdem muss jeder Befehl mit `\r` enden. Eingestellte Boudrate sind 9600-8-N-1.
### Setup
Folgende Befehle konfigurieren halbwegs sicheres Verhalten der Steuerung.
Da dies ein Industrieprodukt ist kann sie so viel mehr, vorallem schneller, als wir das jemals bräuchten für die Discokugel. Es ist zu empfehlen diese Befehle vor jeder Drehzahländerung zu schicken, jedoch nicht zum stoppen. Zum Stoppen reicht es `#*S1` zu senden.
- Rampenart ':ramp_mode' auf 2 - Jerk-free
- Phasenstrom 'i' auf 25, ca. 0.5A
- Phasenstrom im Stillstand 'r' auf 0 - 0A
- Positionierart 'p' auf 5 - Drehzahlmodus
- Minimalfrequenz 'u' auf 10
- Maximalfrequenz 'o' auf wie schnell die kugel drehen soll
- Beschleunigungsrampe 'b' auf 1
- Bremsrampe 'B' auf 1
- Drehrichtung 'd' auf 0 oder 1
- Wiederholungen 'W' auf 0 - unendlich
- Folgesatz 'N' auf 0, kein folgesatz
- 'A' motor starten
- 'S1' motor mit bremsrampe entschleunigen
Weitere Infos können der Herstellerdoku entnommen werden. [Befehlsreferenz](./Programmierhandbuch_V2.6.pdf) | [Technische / Elektrische Referenz](./SMCI33_Technisches_Handbuch_V2.1.pdf)
### Befehle zum Verändern der Drehzahl
`{}` Platzhalter für `[Steps / s]`
Steuerung hat 16 Microsteps eingestellt, Motoren haben 200 Vollsteps pro Umdrehung.
Umrechnung Drehzahl zu Steps / s.
```
d = 1 / min
{} = (d / 60) * 200 * 16
```
{} Darf kein Komma enthalten beim Befehl absenden
```
#*:ramp_mode2
#*i25
#*r0
#*p5
#*u10
#*o{}
#*b1
#*B1
#*W0
#*N0
#*A
```
### Kugel anhalten
`#*S1` senden
## IR-Blaster
### Codes bearbeiten
1. Debug-Konsole öffnen (http://ir-blaster.n39.eu oder USB Serial) 1. Debug-Konsole öffnen (http://ir-blaster.n39.eu oder USB Serial)
@ -38,3 +99,15 @@ http://ir-blaster.n39.eu
* Lauter (0x2FD58A7) * Lauter (0x2FD58A7)
* Leiser (0x2FD7887) * Leiser (0x2FD7887)
* On/Off (0x2FD48B7) * On/Off (0x2FD48B7)
### Multisync X401S
* Taste 0
* Taste 1
* Taste 2
* Taste 3
* Taste 4
* Taste 5
* Taste 6
* Taste 7
* Taste 8
* Taste 9

Binary file not shown.

View file

@ -1,7 +1,9 @@
esphome: esphome:
name: ir-blaster name: lounge-ir-disco
platform: ESP8266
board: d1_mini # https://devices.esphome.io/devices/Sonoff-TH10
esp8266:
board: esp01_1m
wifi: wifi:
networks: networks:
@ -38,6 +40,43 @@ time:
- ptbtime2.ptb.de - ptbtime2.ptb.de
- ptbtime3.ptb.de - ptbtime3.ptb.de
# === Sonoff config ===
binary_sensor:
- platform: gpio
pin:
number: GPIO0
mode: INPUT_PULLUP
inverted: True
name: "Button"
on_press:
- switch.toggle: relay
output:
- platform: esp8266_pwm
id: blue_led
pin:
number: GPIO13
inverted: True
switch:
- platform: gpio
name: "Kugel Power"
restore_mode: RESTORE_DEFAULT_OFF
pin: GPIO12
id: relay
on_turn_on:
then:
- delay: 3s # Wait for controller to boot
- script.execute: apply_kugel_rpm
light:
- platform: monochromatic
name: "Blue LED"
restore_mode: RESTORE_DEFAULT_OFF
output: blue_led
# ===== IR config =====
button: button:
- platform: template - platform: template
name: Casio Power Button name: Casio Power Button
@ -57,18 +96,181 @@ button:
on_press: on_press:
- remote_transmitter.transmit_pronto: - remote_transmitter.transmit_pronto:
data: "0000 006D 0018 0000 002E 0013 002E 0013 000E 0034 002D 0013 002E 0013 000E 0034 000D 0034 000D 0034 000D 0034 000D 0034 000D 0034 002E 0117 002E 0013 002E 0013 000E 0034 002E 0013 002E 0013 000E 0034 000D 0034 000D 0034 000D 0034 000D 0034 000D 0034 002E 0181 06C3" data: "0000 006D 0018 0000 002E 0013 002E 0013 000E 0034 002D 0013 002E 0013 000E 0034 000D 0034 000D 0034 000D 0034 000D 0034 000D 0034 002E 0117 002E 0013 002E 0013 000E 0034 002E 0013 002E 0013 000E 0034 000D 0034 000D 0034 000D 0034 000D 0034 000D 0034 002E 0181 06C3"
- platform: template
name: "MultisyncX401S Taste 0"
on_press:
- remote_transmitter.transmit_raw:
code: [7910, -4019, 448, -546, 449, -545, 448, -1540, 448, -545, 449, -1540, 448, -1540, 449, -1540, 453, -1534, 448, -4030, 456, -537, 451, -1536, 450, -545, 449, -545, 450, -1538, 449, -547, 447, -546, 448, -545, 450]
repeat:
times: 5
wait_time: 16ms
carrier_frequency: 38kHz
- platform: template
name: "MultisyncX401S Taste 1"
on_press:
- remote_transmitter.transmit_raw:
code: [7903, -4024, 453, -542, 450, -521, 470, -1545, 443, -547, 448, -1538, 450, -1539, 449, -1543, 445, -1539, 448, -4030, 447, -551, 444, -544, 449, -545, 449, -1541, 447, -547, 447, -547, 447, -545, 449, -546, 451]
repeat:
times: 5
wait_time: 16ms
carrier_frequency: 38kHz
- platform: template
name: "MultisyncX401S Taste 2"
on_press:
- remote_transmitter.transmit_raw:
code: [7901, -4024, 454, -546, 445, -543, 449, -1539, 449, -527, 469, -1537, 451, -1538, 448, -1545, 443, -1542, 445, -4029, 448, -1540, 448, -546, 449, -544, 450, -1539, 453, -541, 451, -542, 449, -546, 450, -543, 450]
repeat:
times: 5
wait_time: 16ms
carrier_frequency: 38kHz
- platform: template
name: "MultisyncX401S Taste 3"
on_press:
- remote_transmitter.transmit_raw:
code: [7957, -3970, 502, -493, 501, -493, 502, -1491, 500, -494, 497, -1491, 496, -1487, 501, -1486, 511, -1477, 500, -3977, 501, -493, 502, -1487, 503, -490, 501, -1487, 501, -494, 500, -492, 502, -493, 501, -493, 501]
repeat:
times: 5
wait_time: 16ms
carrier_frequency: 38kHz
- platform: template
name: "MultisyncX401S Taste 4"
on_press:
- remote_transmitter.transmit_raw:
code: [7905, -4023, 475, -522, 445, -547, 447, -1540, 448, -546, 448, -1541, 447, -1541, 472, -1516, 472, -1518, 445, -4028, 449, -1540, 474, -1514, 448, -546, 448, -1545, 469, -520, 476, -517, 449, -546, 448, -546, 472]
repeat:
times: 5
wait_time: 16ms
carrier_frequency: 38kHz
- platform: template
name: "MultisyncX401S Taste 5"
on_press:
- remote_transmitter.transmit_raw:
code: [7901, -4021, 473, -520, 449, -545, 474, -1514, 449, -546, 451, -1537, 453, -1534, 454, -1535, 448, -1540, 448, -4028, 449, -546, 448, -545, 449, -1539, 449, -1539, 449, -545, 449, -545, 449, -546, 448, -545, 449]
repeat:
times: 5
wait_time: 16ms
carrier_frequency: 38kHz
- platform: template
name: "MultisyncX401S Taste 6"
on_press:
- remote_transmitter.transmit_raw:
code: [7903, -4024, 450, -544, 449, -544, 477, -1512, 451, -545, 473, -1513, 449, -1538, 451, -1538, 450, -1538, 449, -4027, 451, -1538, 449, -545, 452, -1536, 472, -1515, 449, -546, 455, -538, 449, -545, 450, -545, 450]
repeat:
times: 5
wait_time: 16ms
carrier_frequency: 38kHz
- platform: template
name: "MultisyncX401S Taste 7"
on_press:
- remote_transmitter.transmit_raw:
code: [7903, -4024, 448, -546, 448, -549, 446, -1543, 444, -546, 448, -1540, 448, -1540, 448, -1543, 451, -1538, 444, -4028, 449, -545, 453, -1541, 444, -1539, 448, -1541, 447, -531, 463, -546, 448, -545, 449, -546, 453]
repeat:
times: 5
wait_time: 16ms
carrier_frequency: 38kHz
- platform: template
name: "MultisyncX401S Taste 8"
on_press:
- remote_transmitter.transmit_raw:
code: [7904, -4024, 448, -546, 449, -547, 446, -1539, 449, -546, 448, -1544, 446, -1539, 447, -1540, 449, -1540, 447, -4031, 450, -1540, 444, -1540, 448, -1539, 449, -1540, 448, -547, 447, -547, 448, -544, 449, -545, 449]
repeat:
times: 5
wait_time: 16ms
carrier_frequency: 38kHz
- platform: template
name: "MultisyncX401S Taste 9"
on_press:
- remote_transmitter.transmit_raw:
code: [7904, -4024, 449, -545, 448, -545, 450, -1540, 447, -546, 449, -1539, 448, -1547, 442, -1539, 448, -1540, 526, -3951, 448, -546, 448, -548, 446, -545, 449, -546, 448, -1541, 449, -547, 445, -549, 445, -545, 450]
repeat:
times: 5
wait_time: 16ms
carrier_frequency: 38kHz
remote_receiver: remote_receiver:
pin: pin:
number: GPIO2 number: GPIO2
inverted: True inverted: True
mode: INPUT_PULLUP
dump: all dump: all
# Change to dump: all to see all protocols, use dump: raw to see raw codes
remote_transmitter: remote_transmitter:
pin: GPIO04 pin: GPIO04
# Infrared remotes use a 50% carrier signal # Infrared remotes use a 50% carrier signal
carrier_duty_percent: 50% carrier_duty_percent: 50%
# === Disco config ====
globals:
- id: current_rpm
type: float
initial_value: '0.0'
number:
- platform: template
name: "Kugel Geschwindigkeit (RPM)"
id: kugel_rpm
min_value: -10
max_value: 10
step: 0.02
lambda: |-
return id(current_rpm);
set_action:
then:
- lambda: |-
id(current_rpm) = x;
id(kugel_rpm).publish_state(x);
- script.execute: apply_kugel_rpm
script:
- id: apply_kugel_rpm
mode: restart
then:
- lambda: |-
float rpm = id(current_rpm);
if (fabs(rpm) < 0.02) {
// Stop if near zero
id(uart_1).write_str("#*S1\r\n");
return;
}
// Calculate speed in steps/s (absolute value), determine direction
int steps_per_sec = (fabs(rpm) / 60.0) * 200 * 16;
int direction = rpm >= 0 ? 0 : 1; // 0 = forward, 1 = backward
char speed_cmd[16];
snprintf(speed_cmd, sizeof(speed_cmd), "#*o%d\r\n", steps_per_sec);
char dir_cmd[10];
snprintf(dir_cmd, sizeof(dir_cmd), "#*d%d\r\n", direction);
id(uart_1).write_str("#*:ramp_mode2\r\n"); // Rampenart ':ramp_mode' auf 2 - Jerk-free
id(uart_1).write_str("#*i25\r\n"); // Phasenstrom 'i' auf 25, ca. 0.5A
id(uart_1).write_str("#*r0\r\n"); // Phasenstrom im Stillstand 'r' auf 0 - 0A
id(uart_1).write_str("#*p5\r\n"); // Positionierart 'p' auf 5 - Drehzahlmodus
id(uart_1).write_str("#*u10\r\n"); // Minimalfrequenz 'u' auf 10
id(uart_1).write_str(speed_cmd); // Maximalfrequenz 'o' auf wie schnell die kugel drehen soll
id(uart_1).write_str("#*b1\r\n"); // Beschleunigungsrampe 'b' auf 1
id(uart_1).write_str("#*B1\r\n"); // Bremsrampe 'B' auf 1
id(uart_1).write_str(dir_cmd); // Drehrichtung 'd' auf 0 oder 1
id(uart_1).write_str("#*W0\r\n"); // Wiederholungen 'W' auf 0 - unendlich
id(uart_1).write_str("#*N0\r\n"); // Folgesatz 'N' auf 0, kein folgesatz
id(uart_1).write_str("#*A\r\n"); // 'A' motor starten
uart:
id: uart_1
tx_pin: GPIO1
rx_pin: GPIO3
baud_rate: 9600
debug:
direction: BOTH
dummy_receiver: false
after:
delimiter: "\n"
sensor: sensor:
# Extra sensor to keep track of plug uptime # Extra sensor to keep track of plug uptime
- platform: uptime - platform: uptime

View file

@ -0,0 +1,13 @@
import requests
import time
from tqdm import tqdm
url = "http://ir-blaster.n39.eu/button/multisyncx401s_taste_%s/press"
for i in tqdm(range(0000, 10000)):
num_str = f"{i:04d}"
print(f"Sending: {num_str}")
for digit in num_str:
requests.post(url % digit)
time.sleep(0.35)
time.sleep(0.35)