Intertechno ITR-1500 mit Arduino anlernen?

Hallo zusammen,

da ich vermute, dass die Intertechno-Steckdosen im deutschsprachigen Raum verbreiteter sind, hier nochmal (https://forum.arduino.cc/index.php?topic=715911.0) auf deutsch…

Ich habe mir kürzlich eine ITR-1500 Funksteckdose von Intertechno besorgt, die ich gerne als “Rauchmelder löst aus”-Abschaltung für meinen 3D-Drucker (in einem Gehäuse) nutzen möchte.
Der Teil mit dem Rauchmelder funktioniert, auch eine ältere Steckdose von Intertechno habe ich schon ansteuern können, das Funkmodul (ein Standard 433 MHz-Modul, kein CC1101 oder so) funktioniert also auch.
Allerdings würde ich gerne die ITR-1500 nutzen, da hier mit (lt. Hersteller) 67 Mio. Kombinationen doch eher unwahrscheinlich sein sollte, dass der Nachbar versehentlich den Druck abbricht :slight_smile:

Die ITR-1500 habe ich nun versucht mit der RC-Switch-Bibliothek anzulernen (habe keine FB dazu), dazu habe ich mich am FHEM-Tutorial orientiert: Intertechno Code Berechnung – FHEMWiki
Die Dosen haben einen 32-Bit-Code, dieser fängt an mit 26 bit Dosen-spezifischem Code, dann 2 bit für die Aktion (An/Aus/Alle An/Alle Aus) und 4 bit für die Tastengruppe der Fernbedienung.
Wenn man “An” in den ersten 5 s nach dem Anstecken der Dose sendet, so werden der Dosen-spezifische und der Tastengruppen-Code angelernt.

Ich habe das mit folgendem Code (ohne “Drumherum”) versucht:

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();

void setup() {
  mySwitch.setProtocol(3, 250);//Use Protocol V3 with 250 microseconds pulselength
  mySwitch.enableTransmit(A0); //this was a soldering error, did work before with another socket on the pin
}

void loop() {
  mySwitch.send(0b01010010101011101000000110010011, 32);last 6 bits: "01" for on, "0011" for button group 4
}

Leider war das nicht von Erfolg gekrönt, da ich danach (nach dem Ausführen des Codes in den ersten 5s nach Anstecken der Dose) mit dem obigen Code, angepasst auf das An-/Ausschalten der Dose, keine Schaltvorgänge auslösen konnte.

Hintergrund zu Protokoll V3 und 250 µs Pulslänge: die Dosen brauchen das wohl, siehe hier:

Habe es aber auch mit dem Default (Protokoll 1) und ohne Ändern der Pulslänge (mit Protokoll V3) getestet (ebenfalls erfolglos).

Hat hier jemand eine Idee oder kann mir sagen, wie das funktioniert? Muss man das vielleicht besonders oft senden oder so?

Spontan fällt mir auf, daß in der Tabelle "0 0 Ein Gerät einschalten" und im Gegensatz dazu "01 (Kommando ON)" beim Beispiel steht. Hast Du also schon mal "00" beim Anlernen probiert?

Frage an die Experten: Ist die lange Binärkonstante automatisch "unsigned long"?

agmue:
Spontan fällt mir auf, daß in der Tabelle "0 0 Ein Gerät einschalten" und im Gegensatz dazu "01 (Kommando ON)" beim Beispiel steht. Hast Du also schon mal "00" beim Anlernen probiert?

Gute Idee!
Habe es nun nochmal auf beide Arten probiert - leider ändert das nichts...kriege die Dose immer noch nicht angelernt.

wno158:
Frage an die Experten: Ist die lange Binärkonstante automatisch "unsigned long"?

Aus der RCSwitch.h:

void send(unsigned long code, unsigned int length);
void send(const char* sCodeWord);

Sobald man zwei Werte übergibt wird also die obige Variante der überladenen Funktion verwendet und es wird als unsigned long erkannt. Also sollten eigentlich alle 32 Bits auch "ankommen".
Sicherheitshalber habe ich auch nochmal meine Elektronik überprüft und nochmal versucht die ältere Dose anzusteuern, das funktioniert nach wie vor.
Langsam bin ich mit meinem Latein am Ende....

Hallo zusammen,

teilweiser Fortschritt: Ich habe heute erfolgreich mittels FHEM zwei ITR-1500 anlernen können. Die Dosen funktionieren also auf jeden Fall und der gewählte Code ist nicht 100% Mist/wird ignoriert/....
Leider kann ich die Dosen mit dem gleichen Code über den Arduino nicht mal ansteuern, es lag als nicht nur am Anlernen.
Ich werde die Tage mal versuchen, dem Arduino einen 433 MHz-Empfänger zu spendieren und lauschen, was FHEM da genau sendet.
Ich hoffe, es liegt nicht irgendwie an Big/Little Endian oder so...

LG

Hallo zusammen,

manchmal kommt es in 2020 eben doch NOCH unschöner als man es sich ausmalt :slight_smile:
Mit sämtlichen RC-Switch-ReceiveDemos lässt sich nämlich nullkommanix mitschreiben von dem, was das FHEM schickt. Wenn ich für die Intertechno-kompatiblen Pollin-Funksteckdosen (die mit Dip-Switches) einen Code schicke, der auf RC-Switch-Protokoll 1 (statt 3) basiert, so kann ich diesen empfangen. Der wird als 24 statt 32 bit Code aufgeführt. Keine Ahnung ob da was an der Implementierung nicht stimmt.
Irgendwie obskur, aber langsam verstehe ich wieso die Dosen sich nicht ansprechen lassen wollen...

Ich habe kurzerhand mal mit micros() in der Hauptschleife des Programms die Zeit und den Status des Empfänger-Pins ausgegeben, irgendwas kommt da schon an, aber so richtig viel kriegt man da nicht ausgelesen, da ohne Interrupts natürlich die Auflösung grottig ist...

Hallo zusammen,

ich habe nun die Lösung gefunden, sie lag darin, eine andere Library zu verwenden:
https://github.com/greendog/433mhzforarduino
Damit konnte ich auf anhieb empfangen und senden, es war also ein reines Softwareproblem. Die günstigen Standardempfänger/-sender für 433 MHz sind völlig ausreichend.
An dieser Stelle noch einmal vielen Dank an agmue, der mir für meine Versuche kostenlos eine Fernbedienung für diesen Typ Steckdose überlassen hat!

Falls jemand ebenfalls seinen 3D-Drucker/… mittels günstigem Rauchmelder (die meisten funktionieren, da hier der gleiche Chip vorhanden ist, ich habe einen Smartwares RM250 verwendet) automatisch bei Melder-Alarm (inkl. Test-Taster) abschalten möchte hier der Code:

#include <NewRemoteTransmitter.h>

#define TRANSMITPIN A0 //Pin für 433 MHz-Sender; A0 weil Lötfehler
#define MELDERPIN 2 //Pin für Rauchmeder - Smartwares RM250: TP7 unter Schirmungsblech mit Spannungsteiler aus 150k+120k( 9V*150k/(150k+120k) = 5 V)  geht an diesen Pin. Masse im Melder hat gut sichtbare Testpunkte.

//Pin JUMPER_SRC wird später auf 5 V geschalten, damit der Jumper auf Pin JUMPER nutzbar ist
#define JUMPER_SRC 4
#define JUMPER 3

#define LEDPIN 13

#define OUTLET_ADDR 1234567
#define OUTLET_UNIT 10

NewRemoteTransmitter transmitter(OUTLET_ADDR, TRANSMITPIN, 260, 3);//Adresse, Pin mit Sender, µs Pulsdauer, "3" entspricht 2^3=8 Wiederholungen

int state = 0;

volatile bool alarm_triggered = false;

void setup() {
  //Jumperpins vorbereiten - 3 und 4 werden genutzt, 4 wird low gesetzt und 3 gelesen. Wenn 3 low ist (Pulldown wird durch Jumper auf 0 V runtergezogen):
  //Jumper gesetzt --> Anlernen Dose aktiv schalten --> Anschalten ohne Wartezeit, sonst mit 7s.
  pinMode(JUMPER_SRC, OUTPUT);//JUMPER_SRC "scharfschalten"
  digitalWrite(JUMPER_SRC, false);//Low, damit Pullup gegen 0 V gezogen wird wenn Jumper aktiv
  pinMode(JUMPER, INPUT_PULLUP);//Input mit aktiviertem Pullup, sodass der Jumper 0V-Pegel erzeugt.


  //Melder Testen - Melder piept kurz zweimal wenn dieser Code durchläuft = Kabel korrekt verbunden.
  /*Auskommentiert, da mit diesem Code der Interrupt später aus unbekannten Gründen nicht funktioniert. 
  Komisch, da ab hier grundsätzlich der MELDERPIN immer low ist bis der Rauchmelder das ändert. 
  Der Interrupt wird auch erst attached, nachdem MELDERPIN wieder INPUT ist und false geschrieben wurde.*/
  /*pinMode(MELDERPIN, OUTPUT);
    digitalWrite(MELDERPIN, true);
    delay(300);
    digitalWrite(MELDERPIN, false);*/

  //Deaktiviere Pullup, setze Melderpin als Input
  pinMode(MELDERPIN, INPUT);
  digitalWrite(MELDERPIN, false);

  //LEDPIN als Output zur Indikator, ob gerade die Dose an sein sollte.
  pinMode(LEDPIN, OUTPUT);
  digitalWrite(LEDPIN, false);//LED aus

  //TRANSMITPIN wird als Output gesetzt
  pinMode(TRANSMITPIN, OUTPUT);
}

void loop() {
  switch (state) {
    case 0:
      //Dose wird einmalig eingeschaltet - bei Intertechno ITR-1500 löst das innerhalb 5 s die Einspeicherung des Codes aus --> Bedingte Wartezeit und Clear mit off wenn Jumper gesetzt
      if (!digitalRead(JUMPER)) {
        transmitter.sendGroup(false);//ITR-1500 "all off" - dient zum Löschen aller vorherigen Konfigurationen der Dose.
        delay(1000);
      }
      else {
        delay(7000);
      }

      //In jedem Fall wird angeschaltet (auch ohne Anlernen) - nur Wartezeit und Clear-Befehl sind mit Jumper unterschiedlich.
      transmitter.sendUnit(OUTLET_UNIT, true);//ITR-1500 on
      digitalWrite(LEDPIN, true);

      //Interrupt reagiert auf steigende Flank an Melderpin und löst alarm() aus
      attachInterrupt(digitalPinToInterrupt(MELDERPIN), alarm, RISING);

      state = 10;
      break;

    //Auf Aufruf der ISR "alarm()" warten. Wenn ausgeloest --> Aufruf und alarm_triggered wird TRUE --> nächster State
    case 10:
      if ( alarm_triggered == true) {
        state = 20;
      }
      break;

    //In diesem State verbleiben und immer wieder OFF-Signal senden
    case 20:
      transmitter.sendUnit(OUTLET_UNIT, false);//ITR-1500 off
      digitalWrite(LEDPIN, false);
      delay(1000);
      break;
  }

}

//ISR bei Melder-Alarm
void alarm() {
  alarm_triggered = true; //Nur festhalten, dass der Alarm ausgelöst hat, wenn der Interrupt die ISR aufruft.
}

Schönen letzten Feiertag und guten Rutsch,
Timo