Problem mit ESP32 und cc1101 (Port von Jarolift)

Hallo,
ich möchte das Jarolift Rolladen Projekt von GitHub - madmartin/Jarolift_MQTT: Controlling Jarolift TDEF 433MHZ radio shutters via ESP8266 and CC1101 Transceiver Module in asynchronous mode auf einen ESP32 mit Ethernet portieren (ich habe den Olimex ESP32-POE).

Leider komme ich nur sehr sehr mühsam voran - ich bin eigentlich ein Backend-Entwickler und nicht in der Arduino und Microcontroller-Welt beheimatet.

Zunächst habe ich es mit der CC1101-Library von PanStamp, die im Ursprungsprojekt benutzt wird, versucht. Damit gibt es einen crash beim Aufruf von cc1101.setTxState():

assert failed: spinlock_acquire spinlock.h:122 (result == core_id || result == SPINLOCK_FREE)

Backtrace: 0x40083349:0x3ffc4ed0 0x40087f7d:0x3ffc4ef0 0x4008ce61:0x3ffc4f10 0x4008acdb:0x3ffc5040 0x40088dc2:0x3ffc5080 0x400d26fc:0x3ffc50c0 0x400d1e98:0x3ffc50e0 0x400d1999:0x3ffc5100 0x400d1d1d:0x3ffc5120 0x400d1508:0x3ffc5140 0x400d15d9:0x3ffc5160 0x400d1826:0x3ffc51b0 0x400d3461:0x3ffc5230

Wie kann man dem Fehler auf die Spur kommen?

Jedenfalls habe ich es danach mit der Library SmartRC-CC1101-Driver-Lib von @LSatan versucht. Es hat lange gedauert, bis ich herausgefunden dass es beim CC1101 einen asynchronen Modus gibt und dass der beim ursprünglichen Projekt verwendet wird. Also dann die Library entsprechend eingestellt und außerdem noch die Modulation auf ASK/OOK.

Ich habe parallel noch einen NodeMCU mit der Original-Library am Laufen. Dort habe ich ein paar Ausgaben hinzugefügt, damit ich sehen kann, wenn was vom CC1101 empfangen wird. Wenn ich vom ESP32 sende, sehe ich auch dass was ankommt - leider aber kann es nicht in ein gültiges Jarolift Paket dekodiert werden und die Rolläden reagieren deswegen auch nicht.

Ich habe schon mehrfach geprüft, dass vom ESP32 inhaltlich genau das gesendet wird, wie es auch in der Original-Library gesendet wird. Alle Variablen sind 100% identisch. Es liegt schlicht an dem Handling mit dem CC1101, irgendwas muss da falsch eingestellt sein.

Dann habe ich beim NodeMCU alle Register des CC1101 ausgegeben und sie im ESP32 genauso eingestellt. Damit empfange ich dann beim NodeMCU allerdings überhaupt nichts mehr :frowning:

Hier ist mal der Code, wie ich den CC1101 initialisiere:

    ELECHOUSE_cc1101.setGDO(TXPin, RXPin); // GDO0, GDO2
	ELECHOUSE_cc1101.setSpiPin(SCKPin, MISOPin, MOSIPin, CSNPin);

	ELECHOUSE_cc1101.Init();
	ELECHOUSE_cc1101.setCCMode(0);                            // set config for internal transmission mode.

	ELECHOUSE_cc1101.SpiWriteReg(CC1101_FREQ2,  CC1101_DEFVAL_FREQ2_433);
	ELECHOUSE_cc1101.SpiWriteReg(CC1101_FREQ1,  CC1101_DEFVAL_FREQ1_433);
	ELECHOUSE_cc1101.SpiWriteReg(CC1101_FREQ0,  CC1101_DEFVAL_FREQ0_433);

	ELECHOUSE_cc1101.setPA(12);                    // Set TxPower. The following settings are possible depending on the frequency band.  (-30  -20  -15  -10  -6    0    5    7    10   11   12) Default is max!

	// Modulation 2 is correct for Jarolift!
	ELECHOUSE_cc1101.setModulation(2);                        // Set modulation mode. 0 = 2-FSK, 1 = GFSK, 2 = ASK/OOK, 3 = 4-FSK, 4 = MSK.

	// Async mode is correct for Jarolift!
	ELECHOUSE_cc1101.setPktFormat(3);                         // Format of RX and TX data. 
																// 0 = Normal mode, use FIFOs for RX and TX. 
																// 1 = Synchronous serial mode, Data in on GDO0 and data out on either of the GDOx pins. 
																// 2 = Random TX mode; sends random data using PN9 generator. Used for test. Works as normal mode, setting 0 (00), in RX. 
																// 3 = Asynchronous serial mode, Data in on GDO0 and data out on either of the GDOx pins.

	ELECHOUSE_cc1101.setCrc(0);                               // 1 = CRC calculation in TX and CRC check in RX enabled. 0 = CRC disabled for TX and RX.																	
	ELECHOUSE_cc1101.setSyncMode(0);                          // Combined sync-word qualifier mode. 
																// 0 = No preamble/sync. 
																// 1 = 16 sync word bits detected. 
																// 2 = 16/16 sync word bits detected. 
																// 3 = 30/32 sync word bits detected. 
																// 4 = No preamble/sync, carrier-sense above threshold. 
																// 5 = 15/16 + carrier-sense above threshold. 
																// 6 = 16/16 + carrier-sense above threshold. 
																// 7 = 30/32 + carrier-sense above threshold.

	// Should be equivalent of cc1101.disableAddressCheck();
	ELECHOUSE_cc1101.setAdrChk(0);                            // Controls address check configuration of received packages. 
																// 0 = No address check. 
																// 1 = Address check, no broadcast. 
																// 2 = Address check and 0 (0x00) broadcast. 
																// 3 = Address check and 0 (0x00) and 255 (0xFF) broadcast.

	// set data rate, got it from dumping NodeMCU
	ELECHOUSE_cc1101.SpiWriteReg(CC1101_MDMCFG4, 0xF8);
	ELECHOUSE_cc1101.SpiWriteReg(CC1101_MDMCFG3, 0x11);

Es wäre super, wenn mir jemand Tipps geben könnte, an was sowas liegen kann. Ich bin langsam mit meinem Latein am Ende.

Danke + Gruß

Hi blissi,

ich verwende den Code von madmartin etwas abgewandelt, um zeitgesteuert die Rolläden ohne Smarthome o.ä. zu fahren.
Dazu nutze ich aber wie im Ursprungsprojekt einen 8266. Das klappt auch eine Zeit lang ganz gut, bis dann irgendein Rolladen in einem undefinierbaren Modus steht und man manuell die "Stop"-Taste drücken, oder den Zähler neu paaren muss.

  1. Du hast Dir die Jarolift-Keys besorgt?
  2. Der NodeMCU funktioniert zur Steuerung?
  3. Wenn Du den NodeMCU zum lesen verwendest, und den ESP32 zum senden, scheinen die Pakete identisch auszusehen?

Im Zweifel würde ich es mit einer anderen cc1101-Library versuchen. Es werden lt. GitHub nur ein paar Modulationen unterstützt. Kenne mich aber leider auch zu wenig in dem Thema aus.

Hi TriB,
ja ich habe bisher auch das Original im Einsatz mit einer NodeMCU. Wollte aber auf einen kabelbasierten Controller umsteigen.

Im Controller selbst sind alle Variablen identisch (pack und die disc-Werte). Das Problem ist einzig, dass ich es scheinbar nicht richtig gesendet bekomme, weil der cc1101 falsch eingestellt oder was weiß ich was ist.

Ich bin jetzt ein bedeutendes Stück weiter:
ich habe mir SignalDuino auf den ESP32 geflasht und fhem installiert und mich erstmal darin eingelesen. Nach etwas rumprobieren habe ich es jetzt geschafft, dass darüber einen Rolladen steuern kann.

Jetzt schaue ich mir die CC1101-Implementierung im SignalDuino an. Evtl. lasse ich den SignalDuino aber auch und baue das was fhem macht Client-Seitig nach, sodass ich es aus meinem Home Assistant aufrufen kann. Mal schauen.

Also ich werde jetzt den Weg gehen, fhem auf meinem NAS zu installieren und über Home Assistant zu steuern.

Den SignalDuino habe ich geforkt und speziell für meinen Olimex angepasst, sodass er per Kabel statt per Wifi angesteuert werden kann. Wen es interessiert:

Ist wie gesagt speziell für mein Gerät angepasst, aber vielleicht möchte das ja jemand auch so haben. IP-Einstellungen können in compile_config.h angepasst werden.

1 Like

ist das ein Board bei dem nur die Stromversorgung über das Ethernet-Kabel gemacht wird oder kann man mit diesem Board beim ESP32 das WLAN ausschalten und per Netzwerk-Kabel ins lokale Netzwerk einbinden?

vgs

beides, POE und du kannst über Kabel ins Netzwerk einbinden.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.