Beiträge von eich

    Falls du die Tasmota Rules meinst, ja das ginge. Falls du diese nicht meinst, übergehe meine folgenden Erklärungen bitte!

    Ich kenne diese Sonoff Geräte nicht, kann speziell dazu somit keine Aussage tätigen.


    Ich würde bei häufigen Änderungen statt der mem- die var-Variablen einsetzen, weil für erstere der nichtflüchtige Speicher verwendet wird, der weniger Schreibzugriffe als der RAM verträgt. Falls die Änderungen relativ selten sind und du insbesondere bei Stromausfall den letzten Zustand brauchst, sind die mem-Variablen angemessen.


    Verfahren:

    Immer wenn auf den entsprechenden Ausgang etwas geschrieben wird, kann der Ausgabewert in eine Variable kopiert werden.

    Code
    1. on power1#state do var1 %value% endon

    Setze anstelle von power1 den von dir gewünschten Ausgang ein! var1 kannst du durch jede andere Variable (auch mem) ersetzen. Mit power1#state wird jeder Schreibzugriff auf den Ausgang erfasst. Somit wird dieser Ausgabewert in var1 gespeichert und kann per %var1% an anderer Stelle genutzt werden.

    %...% ist der Wertoperator, %value% ist der Parameterwert zum Trigger, hier also der Ausgabewert an power1. Ein Ausdruck %power1% ist nach meinen Erfahrungen in den Tasmota Rules nicht definiert.

    Was soll "delay10" bewirken?

    delay 10 (mit Leerzeichen) kenne ich. Dies würde 1s verzögern, weil der Parameter hinter delay die Anzahl an 100ms angibt.

    Wenn überhaupt, kann nur deine zweite Variante wie beabsichtigt funktionieren, falls du dort "delay 100" einsetzt.


    Leerzeichen (white spaces) sind oft, aber nicht immer, notwendig. Manchmal können sie auch weggelassen werden:

    on power3#state=OFF do backlog delay 100;power3 ON endon


    ;)


    Vielleicht ist diese Stelle auch eine geeignete Anregung für dich. Ich würde delay vermeiden, wenn möglich:

    https://tasmota.github.io/docs…e-delayed-auto-off-switch

    Na bitte.

    Das passt doch zu meinen Erklärungen - und es ist durchaus erträglich.

    An einer einzigen Stelle mal in einer solch kleinen Firmware D1 statt Relais zu verwenden, ist tolerierbar.

    Sogar meine Kommentare sind im Quellcode. Das ist gut, damit du verstehend nachsehen kannst, wenn mal noch eine Änderung angestrebt ist.

    Servo ist auch nicht zweckentfremdet, da du das Relais per digitalWrite(...) steuerst.

    Es freut mich, dass du zufrieden bist. Ich bin es letztlich auch. :)

    Ich kenne halt LED als Light Emitting Diode, Halbleiterbauelement mit Sperrschicht und zur Wellenlänge passende Dotierungen (Verunreinigungen).

    Den ganzen Farbschnickschnack habe ich nicht und konsumiere nicht an der Front.

    Unterschiedliche LED, mal von den Farben abgesehen, kann ich mir nur vorstellen im Zusammenhang mit der Schaltelektronik.

    Damit habe ich keine Erfahrungen. Trotzdem interessiert es mich.

    Wie verhalten sich die Feuchtigkeitswerte, wenn du die Relais sukzessive ausschaltest?

    Da 1 Wire genutzt wird, ist ein Pullup Resistor erforderlich. Den hast du hoffentlich eingebaut.

    Evtl. wäre der entsprechende Schaltplan(auszug) nützlich.

    Wenn du genauso sicher wie bei einer Lampe erkennen willst, ob das Tor offen oder zu ist, musst du entweder

    • hingehen und nachsehen ;-) oder
    • Endschalter abfragen

    Die Endschalter müssten elektronisch sicher mit je einem Eingang des µC Boards verbunden werden. Du kannst selbstverständlich auch einen zusätzlichen µC am Tor einbauen, der die Tor-Zustände überwacht und diese per WLAN Kommunikation mitteilt.

    Um Obiges elektronisch sicher zu bewerkstelligen, sind Kenntnisse über die Endschalter-Beschaltung erforderlich. Da kann ich nicht mit Erfahrung aufwarten, weil ich solchen Komfort nicht besitze. :D

    Nur für den Fall, dass es zu aufwändig wäre, die Endschalter anzuzapfen, sind zwei zusätzliche Endschalter/Lichtschranken als Sensoren denkbar. Wenn du dann noch relativ sicher erfassen willst, ob das Tor gerade auf- oder zufährt, sind ein oder zwei weitere solcher Schalter nützlich, mit denen die Fahrtrichtung des Tors recht sicher ermittelt werden kann. Ohne solche (zusätzlichen) Schalter ist alles Interpretationssache per Software - und das kann auch mal schiefgehen.

    Im Ernst, Abzweigdosen einsparende Installationen sind echter Bullshit.

    Wenn es eine Mietwohnung ist, siehe Hinweise Helfinger und Athen2004.

    Falls es dein Haus ist, solltest du sukzessive Abzweigdosen einbauen!

    Oft ist die Infrastruktur entscheidend für die Servicefreundlichkeit. ;-)

    Wenn du absolut keine Ahnung von den Programmiersprachen C bzw. C++ hast, ist es etwas gewagt, ein solches Programm für deine Zwecke anzupassen.

    Prinzipiell sind deine notierten Zeilen geeignet, die du einzufügen hast, aber

    • In Zeile 5 ist im Topic (Der Text zwischen den Anführungszeichen) ein Verdreher - Realis -> Ralais. So kann es nicht funktionieren. Bitte korrigieren!
    • Die Zeilen 5 bis 8 müssen innerhalb MQTTCallback stehen, was sie vermutlich auch tun.
    • Zeile 12 muss innerhalb reconnect stehen, ...

    "Innerhalb" bedeutet: an passenden Stellen zwischen der ersten geschweiften Klammer auf nach dem Funktionsnamen (hier MQTTCallback und reconnect) und der schließenden geschweiften Klammer am Ende der jeweiligen Funktion.


    Ich kenne die Klasse Servo nicht. ServoObject1 bis ServoObject3 sind jedenfalls 3 verschiedene Objekte dieser Klasse. Diese Klasse verfügt über mindestens zwei Methoden, attach und write.

    • attach ordnet dem jeweiligen Servo Objekt einen Ausgang des µC (Mikrocontroller) zu.
    • write dürfte einen Wert seriell über den zugeordneten Ausgang an die Servo Elektronik ausgeben. Dieser Wert ist hier eine Ganzzahl (Typ int) und stellt offensichtlich den Zielwinkel dar.

    Zum schalten eines Relais ist ein solches Objekt nicht vorgesehen und vermutlich auch nicht geeignet. Welche "Anweisungen" zur Verfügung stehen, findest du unter https://www.arduino.cc/reference/en. Für deine Zwecke sind pinMode() und digitalWrite() zweckmäßig/erforderlich. Hierfür suchst du dir einen noch freien Ausgang deines µC Boards aus, analysierst das zu schaltende Relais und schließt es passend an den ausgesuchten Ausgang an. Dazu braucht man zwei Leitungen. Die zweite Leitung ist, je nach Relaisschaltung, entweder mit Masse (GND) oder mit Vcc (+5V oder +3,3V) zu verbinden.


    Für die Pflegbarkeit "deines" Programms ist es zweckmäßig, einen Bezeichner für den Ausgang zu deinem Relais zu definieren, bspw. per

    #define Relais 5 oder als Konstante const int Relais = 5; Beides führt dazu, dass im weiteren Quelltext Relais statt 5 verwendet werden kann.


    Die Funktion setup() wird immer nur einmal nach einem Neustart des µC abgearbeitet. Darin werden einmalige Initialisierungen untergebracht. Das ist hier der Aufruf von pinMode(Relais, OUTPUT), wobei Relais die zuvor definierte Pinnummer des Ausgangs zum schalten des Relais ist. OUTPUT stellt den Pin auf Ausgabe.

    Nun sind noch die Aktivitäten des Subscribers (client) zum schalten des Relais zu erweitern. Dazu ist die Ausgabeanweisung digitalWrite(Pinnummer, HIGH) oder digitalWrite(Pinnummer, LOW) in MQTTCallback einzubauen - am besten statt HIGH und LOW die Payload verwendend, bspw. so:

    Code
    1. if(strcmp(topic, "ServoControl/Relais/OnOff") == 0) // prüft, ob das MQTT Topic ServoControl/Relais/OnOff lautet.
    2. {
    3. digitalWrite(Relais, angle); // Hierfür muss die MQTT Payload entweder "0" oder "1" sein, damit es so funktioniert.
    4. }

    Es ist nicht schön, hier als Payload-Wert Variable angle zu verwenden, weil ein Relais nicht per Winkelwert geschaltet wird. Ich würde statt angle die Benennung value oder Payload nehmen.

    Die MQTT Nachricht muss lauten:

    Topic = ServoControl/Relais/OnOff, Payload = 0 zum ausschalten oder 1 zum einschalten.


    Dies ist die kürzest mögliche Variante. Es geht besser und letztlich flexibler, wenn in MQTTCallback zuerst an Hand des Topic geprüft wird, ob die Payload ein Winkelwert für die Servos oder ein Wahrheitswert für das Relais ist. Damit verschone ich dich aber besser jetzt. ;-)


    Noch etwas sehr wichtiges:

    Damit die Kommunikation per MQTT gelingt, braucht es irgendwo einen MQTT Broker als zentralen Kommunikationsserver. Die Daten (IP Adresse und Portnummer) dieses Servers sind hier einzutragen:

    Code
    1. const char* mqtt_server = "XXX"; // <- IP Adresse des Brokers
    2. const int mqtt_port = XXX; // <- Portnummer, Standard ist 1883

    Ich weiß nicht, ob ioBroker eine Art MQTT Broker Plugin nutzt, ich verwende weder ioBroker noch FHEM noch openHAB. Ich arbeite "bodenständig" mit Mosquitto (MQTT Broker) und NodeRED auf einem Raspberry Pi 3, der 24/7 läuft.


    Falls du den gesamten Quellcode von mir haben möchtest, gegen Gebühr von 1234,56 € :P, dann musst du dich noch einmal entsprechend äußern. Allerdings gehören zum endgültig lauffähigen Programm noch die genaue Kenntnis deiner Schaltung und die MQTT Daten deines Netzwerks.

    Wer eine schnelle und billige Lösung will, muss mit Folgeproblemen rechnen. ;-)

    Ich will ja keine neue Lampe kaufen. Da ich aber etwas von Elektronik verstehe, könnte ich prinzipiell eine Zusatzschaltung entwerfen/finden, durch welche die LEDs in der Lampe gedimmt werden könnten. Ich habe aber genügend zeitraubende Projekte mit höherer Priorität.

    Dimmbare Transformatoren kenne ich nur als Stelltrafos, wo man den Abgriff mechanisch einstellt. Ein Trafo, dessen Eingangswechselspannung (abrupt, wie bspw. bei Phasenanschnitt) geschaltet wird, verhält sich wie eine Zündspule und strahlt beim schalten zusätzlich Funkwellen aus (Störungen). So etwas würde ich bestimmt nicht umsetzen. :S

    Nun ja, vermutlich ist die Lampe ohne Eingriff nicht dimmbar. Aber jede LED ist prinzipiell per PWM dimmbar. Auch lese ich, dass es Dimmer für 230V Anschluss LED Leuchten geben soll, was mir schwerfällt zu glauben. Man kann so manches lesen, was unter Umständen wenig Fundament hat.

    Deshalb frage ich mich, was die 230V Wechselspannung damit zu tun hat. Nach deiner Aussage nichts. Dann muss aber die Steuerung bereits eine passende Elektronik in der Leuchte als Gegenstelle haben.

    Das ist der Anlass meiner Frage. Ich kann mich auf den langen Weg machen und die Lampe demontieren, die Elektrik analysieren und evtl. Zusatzelektronik fertig kaufen oder selbst zusammenlöten, um diese einzubauen. Zugleich weiß ich aber, dass es sicher Verfahren gibt, welche ich nicht kenne. Deshalb wäre es einfacher für mich, etwas darüber zu verstehen und auf dieser Grundlage nach fertigen Schaltungen zu suchen.


    Kurz: Mit meiner Frage geht es mir weniger um eine schnellstmögliche Umsetzung meines Wollens als vielmehr darum, etwas zu verstehen.

    Auch wenn dieses Topic schon älter ist, versuche ich mal meine Frage dort anzukoppeln:

    Ich würde bspw. gerne eine 230V LED Deckenleuchte dimmbar machen, per PWM. Klar, die 230V Wechselspannung sind vor den LED in Niedrig-Gleichspannung konvertiert.

    Die PWM Helligkeitssteuerung für LED kenne ich schon lange, nur habe ich keine Vorstellung von der Elektronik, die eine solche Steuerung über einen 230V Anschluss hinkriegen kann. Die Netzfrequenz ist mit 50Hz ist viel zu niedrig als eine (flimmerfeie) Schwingungspaketsteuerung nutzen zu können.

    Hat da jemand einen Hinweis für mich aus der Elektronik Ecke?

    Hmm, auch ein normales Relais braucht zum schalten Strom, nur bistabile nicht. Es fragt sich also, ob diese Lösung zweckmäßig ist.

    Ansonsten...

    Hast du den Code selbst zusammengestellt, kennst ihn also genau?


    Spendiere einfach in reconnect() einen weiteren Subscriber und baue die Abarbeitung der Nachricht in MQTTCallback() ein!


    Btw. wenn du zwischen den if Anweisungen jeweils noch ein else spendierst, sollte die Abarbeitung im Mittel etwas schneller erfolgen, weil dann nicht zwingend alle Stringvergleiche abgearbeitet werden. Ich würde eh ein Datenfeld aus Topic-String und Funktionszeiger zusammenstellen und statt der if eine kleine Schleife bauen. Mehr Datenstruktur, weniger (übersichtlichere) Ablaufstruktur. ;-) Das ist aber für dein Anliegen unwesentlich.