Fernsteuerung für Südwind Ambientika wireless+ (vmtl. auch Advanced)

Begonnen von cafe88, 20 Februar 2022, 18:55:02

Vorheriges Thema - Nächstes Thema

cafe88

Hi alle lieben Forenmenschen da draußen!

Zu allererst: Das hier ist mein erster Thread, also verhaut mich bitte nicht gleich zu dolle ja? ;)

Ich hatte vor ein paar Wochen schonmal nach dezentralen Lüftungsanlagen geschaut und war etwas überrascht, dass man entweder nur "dumme" Anlagen ohne Smart-Home-Anbindung bekommen kann, oder aber man kommt als Privatperson nicht an die Anlagen ran (blumartin ist so ein Fall)...

Außerdem sind die alle schweineteuer und eigentlich ist das jetzt nicht so eine unglaublich präzise, moderne oder komplizierte Technik da drin, daher habe ich mich dann quasi "auf gut Glück" für die Südwind Ambientika wireless+ entschieden, da ich außerdem keine Lust hatte nachträglich überall Buskabel zu legen in einer Zeit wo man ja eigentlich eh gut genug vernetzt sein kann.

Also habe ich gestern bei mir zwei von den im Titel genannten Anlagen eingebaut und war erstmal etwas enttäuscht von der Lautstärke des Automatik-Modus, da dort der Lüfter immer auf Stufe 2 von 3 läuft.
Dann kam der Beschluss, dass ich die Anlagen ausschalte, wenn die Luftfeuchtigkeit niedrig ist und überhaupt nur sonst anmache. Ggf dann auch noch im manuellen Modus Stufe 1 oder im Nachtbetrieb (Dann hört man die wirklich fast garnicht mehr).
Aber wie das anstellen? Ich war davon ausgegangen, dass die Fernbedienung, die enthalten ist, relative Codes je Taste sendet, aber dann bin auf diesen Test hier aufmerksam geworden: https://www.hausbauen24.eu/dezentrale-lueftungsanlage-test-ambientika-wireless/
Dort schreibt der jenige welcher, dass er das über die Infrarot-Codes fernsteuert, also schien das ja doch nicht so relativ zu sein ;)

Ich hatte noch einen IR-Blaster mit Tasmota drauf rumfliegen, also habe ich mir den mal geschnappt und siehe da, die Hashes der IR-Codes die die Fernbedienung sendet sind tatsächlich absolut je Modus/Lüftstärke/usw.
Warum Hashes? Weil Südwind kein Standard-IR-Protokoll spricht und man deswegen von Tasmota-IR erstmal nur den Hash des Protokolls bekommt.

Um das Senden und Empfangen von Raw-Codes zu ermöglichen braucht man dort (in Tasmota) das Kommando
SetOption58 1

Dann bekommt man so lustige Raw-Codes wie diesen hier: +9015-4650+555-1780C-675+560-670FdCeCdCdCeFeC-1760+580hIeFhIeFeCdCeFeFeCeFeCeChIeCdCdCdChIdCdCeFhI

Die kann man dann mit
IRsend3 0,+9015-4650+555-1780C-675+560-670FdCeCdCdCeFeC-1760+580hIeFhIeFeCdCeFeFeCeFeCeChIeCdCdCdChIdCdCeFhI
wieder senden.
Die 3 im IRsend bedeutet, dass der Befehl dreimal wiederholt wird (sinnvoll bei IR, weil doch immer mal ein Fehler auftritt oder was einem Bit im wahrsten Sinne des Wortes "im Weg steht").

Daraufhin habe ich MQTT aktiviert und der IR-Blaster ist nun so bei mir eingebunden:

defmod ambientika_remote MQTT2_DEVICE mqtt2
attr ambientika_remote event-on-change-reading .*
attr ambientika_remote icon IR
attr ambientika_remote model tasmota_ir
attr ambientika_remote readingList tele/IR_Blaster/INFO.:.* { $EVENT =~ m,^..Info[1-3]..(.+).$, ?  json2nameValue($1,'',$JSONMAP) : json2nameValue($EVENT,'',$JSONMAP) }\
  tele/IR_Blaster/RESULT:.* { $EVENT =~ m,..IrReceived....Protocol...([A-Za-z0-9]+)...Bits..([\d]+)..Data...([A-Za-z0-9]+)..., ? {"$1_$2"=>$3} : json2nameValue($EVENT) }
attr ambientika_remote setList irsend:textField cmnd/IR_Blaster/IRsend3 "$EVTPART1"\
  mode:auto,surveillance,manual,night,boost {$EVTPART1 eq 'auto' ? 'cmnd/IR_Blaster/IRsend3 0,+8990-4650+555-1780C-675Ce+560-1760+580eCgHgHeFeFdCgHeCdCeCeFdCeCeFeCgHeCgHeCeCgHgHgHeCg+575eCdCgH' : ($EVTPART1 eq 'surveillance' ? 'cmnd/IR_Blaster/IRsend3 0,+9015-4630+580-1760C-675+560e+555-1780GeGhGdCeGeFdCdCeGhGeGeFhGhGeGeGdCeGd+575eGeGeGdChGeFdCeGhGhG' : ($EVTPART1 eq 'manual' ? 'cmnd/IR_Blaster/IRsend3 0,+8990-4630+580-1785+555-675+560fE-1760CfEhChCfEfEhCdEfGhCfEfG-1780EfGiEfEiEfGiEfEfEh+575fEhCfEiEfGiEhC' : ($EVTPART1 eq 'night' ? 'cmnd/IR_Blaster/IRsend3 0,++8995-4630+580-1760C-675+555eFdCeF-1780FgFeFeFdCdCe+560gFeFeFgHgFdCdCgFeHeHd+575eFeHeFeHeFgHgFeFgH' : ($EVTPART1 eq 'boost' ? 'cmnd/IR_Blaster/IRsend3 0,+8995-4650+555-1780C-680C-675+560-1760+580fChIdCfCfCdCh+575fGhJfCfChIfCfCfChIfCfChIfChJhIdCf+605-1710JdCfChI' : ''))))}\
  humidity:40,60,75 {$EVTPART1 eq '40' ? 'cmnd/IR_Blaster/IRsend3 0,+8990-4650+555-1765+575-675CfC-1780CfC-1760+580-1785CfCfCjCjCfCjCf+560-670CjCfCjCfChIfCfCgCfCjCfCjCfCjChIfCjC' : ($EVTPART1 eq '60' ? 'cmnd/IR_Blaster/IRsend3 0,+9020-4630+580-1760C-675+555eF-1785Fe+560d+575gFeFeHgFgFeFgF-680FeFdCdIgFeFdCeFeFdIeFeFeFdCeHdCdCeFdC' : ($EVTPART1 eq '75' ? 'cmnd/IR_Blaster/IRsend3 0,+8995-4630+580-1760C-675+555-680F-1785FeFhFdCeFeFdCd+575eFdCe+560eJ-1770+570eFgFdIdIeFeFdCeFhFdCeFeFdCdCeFdC' : ''))}\
  fanspeed:low,medium,high {$EVTPART1 eq 'low' ? 'cmnd/IR_Blaster/IRsend3 0,+8995-4650+555-1760+580-675CfC-1780CfC-1785CgCfCfCdEdEfCgCfCfCgCfCfCgCdEfCgChCfCgChCf+560fIdEfCfCgC' : ($EVTPART1 eq 'medium' ? 'cmnd/IR_Blaster/IRsend3 0,+8990-4630+580-1780+555-680E-675E-1760+575gEhChCgEgEdEhCgEhCgEgEdEdEgEdE-1785EgEhId+560gEgEdEgEgEdEgKgEdE' : ($EVTPART1 eq 'high' ? 'cmnd/IR_Blaster/IRsend3 0,+9015-4630+580-1780+555-675EfEdEf+560dE-1760CfEfEdEdEfGdEfGfE-1785EfEhCdEdGfEhChCfEdEf+605-625EfGdEfEfEdE' : ''))}\
  airflow:intake,exhaust,masterslave,slavemaster {$EVTPART1 eq 'intake' ? 'cmnd/IR_Blaster/IRsend3 0,+9015-4650+555-1780C-675+560eFdCeC-1760+580dCeCeC-1755HdCeCdCeCeCgHdCeCgHdCeCdCeCeF-670Cg+575eCeCdCeCdCgH' : ($EVTPART1 eq 'exhaust' ? 'cmnd/IR_Blaster/IRsend3 0,+8990-4645+560-1760+580-675+555fG-1780GfGdEdEfGfGdEhGfGdEfGfCdEfG-670GdEhCfChGfGfChGhGfGfGdEfGhGdE' : ($EVTPART1 eq 'masterslave' ? 'cmnd/IR_Blaster/IRsend3 0,+8995-4650+555-1760+580-675+560fC-1785CfG-1780CdEfGfCiGiGfCdEfCfCdEfCiCiCdEfGiCfGfGiCfGfCfCdEfCiChC' : ($EVTPART1 eq 'slavemaster' ? 'cmnd/IR_Blaster/IRsend3 0,+8990-4630+575-1780+555-675E-670+560dEfE-1760+580iJfHfEiJiJfHdEfHfEiJdEdE-1755JdHfEdHgHfHfHfEfHfEdEfEdEdE' : '')))}\
  resetfilter:noArg cmnd/IR_Blaster/IRsend3 0,+9015-4650+555-1780C-675+560-670FdCeCdCdCeFeC-1760+580hIeFhIeFeCdCeFeFeCeFeCeChIeCdCdCdChIdCdCeFhI
attr ambientika_remote stateFormat IrReceived_Data


Und voila, man kann wirklich alles wundervoll fernbedienen 8)
Falls ich demnächst nochmal Zeit habe, versuche ich, die 868MHz Schnittstelle anzuzapfen, damit ich auch eine Rückmeldung bekomme, was die Geräte so tun :)

Weiß zufällig jemand, wie man in SetList mehrere Zeilen Perl-Code verwenden kann? Ich habe mir eben einen abgebrochen dabei das hinbekommen zu wollen und hab auch aufs verrecken kein Beispiel für sowas gefunden.
Der Interpreter meckert immer über ne fehlende schließende geschweifte Klammer...

Alles in allem bin ich aber erstmal zufrieden so ;)

Wenn ihr noch Vorschläge zur Verbesserung habt: gern her damit :)

Euer Martin

siricy

Hallo Martin,
sehr cooler Beitrag  8)
Das werde ich auch ausprobieren.
Bist du mit der 868MHz Schnittstelle weiter?
VG
Icy

FabHH

Das verwendete Infrarot-Protokoll ist NEC 8bit

Folgend sind alle verfügbaren IR-Kommandos gelistet - Alle funktionieren. Diese können ganz einfach mit einem Arduino oder einem ESP + IR Transmitter den Master steuern.
Unten findet ihr auch meinen Arduino code, den ich zum testen genutzt habe. Schaltet auf Lüfter Stufe 3, bei gedrücktem Knopf.

Ich werde mir auch die Funksignale anschauen aber je nach Aufwand, werde ich das ggf. auch lieber mit IR implementieren.

Ich hoffe es hilft jemandem weiter.


Filetype: IR signals file
Version: 1
#
name: Automatic
type: parsed
protocol: NEC
address: 69 00 00 00
command: 28 00 00 00
#
name: Survillance
type: parsed
protocol: NEC
address: 69 00 00 00
command: 29 00 00 00
#
name: Manual
type: parsed
protocol: NEC
address: 69 00 00 00
command: 2A 00 00 00
#
name: 40percent
type: parsed
protocol: NEC
address: 69 00 00 00
command: 4A 00 00 00
#
name: 60percent
type: parsed
protocol: NEC
address: 69 00 00 00
command: 4B 00 00 00
#
name: 70percent
type: parsed
protocol: NEC
address: 69 00 00 00
command: 4C 00 00 00
#
name: Speed1
type: parsed
protocol: NEC
address: 69 00 00 00
command: 6C 00 00 00
#
name: Speed2
type: parsed
protocol: NEC
address: 69 00 00 00
command: 6D 00 00 00
#
name: Speed3
type: parsed
protocol: NEC
address: 69 00 00 00
command: 6E 00 00 00
#
name: SleepMode
type: parsed
protocol: NEC
address: 69 00 00 00
command: 4F 00 00 00
#
name: ExtractMode
type: parsed
protocol: NEC
address: 69 00 00 00
command: 2C 00 00 00
#
name: IntakeMode
type: parsed
protocol: NEC
address: 69 00 00 00
command: 2D 00 00 00
#
name: MasterSlaveExtract
type: parsed
protocol: NEC
address: 69 00 00 00
command: 2E 00 00 00
#
name: SlaveMasterExtract
type: parsed
protocol: NEC
address: 69 00 00 00
command: 2F 00 00 00
#
name: 20minExtractBurst
type: parsed
protocol: NEC
address: 69 00 00 00
command: 48 00 00 00
#
name: ResetFilter
type: parsed
protocol: NEC
address: 69 00 00 00
command: 40 00 00 00


#include <Arduino.h>
#include "TinyIRSender.hpp"

#define IR_SEND_PIN         3
#define BUTTON_PIN          4

void setup() {
    pinMode(LED_BUILTIN, OUTPUT);

    Serial.begin(115200);

    // Just to know which program is running on my Arduino
    Serial.println(F("START " __FILE__ " from " __DATE__ "\r\nUsing library version " VERSION_TINYIR));
    Serial.print(F("Send IR signals at pin "));
    Serial.println(IR_SEND_PIN);
}

// Set up the data to be sent.
uint8_t sAddress = 0x69;
uint8_t sCommand = 0x6E;
uint8_t sRepeats = 0;

void loop() {
  if(digitalRead (BUTTON_PIN) == HIGH){
    // Print current send values
    Serial.println();
    Serial.print(F("Send now:"));
    Serial.print(F(" command=0x"));
    Serial.print(sCommand, HEX);
    Serial.print(F(" repeats="));
    Serial.print(sRepeats);
    Serial.println();
    Serial.println(F("Send NEC with 8 bit address"));
    Serial.flush();
    sendNEC(IR_SEND_PIN, sAddress, sCommand, sRepeats);
    sRepeats++;
    // clip repeats at 4
    if (sRepeats > 4) {
        sRepeats = 4;
    }

    delay(1000);  // delay must be greater than 5 ms (RECORD_GAP_MICROS), otherwise the receiver sees it as one long signal
  }else{

  }
}