Arbeit der "Master Kit" -Module im OpenHAB Home Automation Control System. Teil 3: Echtzeituhr

    Fortsetzung der Arbeit der Module des Master Kits im OpenHAB-Hausautomationsleitsystem (ab hier und hier ).
    Dieser kurze Artikel begann mit einer Frage an mich selbst: Wenn ich in meinem Landhaus kein permanent verbundenes Internet habe, woher erhält OpenHAB dann seine Zeit- und Datumsinformationen?



    Sofort fielen mir Geräte der Echtzeituhrklasse (RTC) ein, und ich entschied mich für das wenig bekannte MK8900- Modul mit USB-Anschluss. Es war die Fähigkeit, es einfach an einen USB-Port anzuschließen, die mir am attraktivsten erschien, im Gegensatz zu der Notwendigkeit, mit Arduino klug zu sein.

    Die Bequemlichkeit einer USB-Verbindung stimmte mit dem Plan für das Mastering der seriellen Bindung in OpenHAB überein. Das Modul verfügt über einen Temperatursensor, einen Thermostat und die Fähigkeit, einige Beine des Mikrocontrollers (GPIO) zu bewegen, aber heute ist dies nicht die Hauptsache. Ich habe mich intensiv mit der Entwicklung der Fähigkeit befasst, Geräte über den COM-Port anzuschließen.

    Ich werde weitermachen und sagen, dass ich beim Mastering Folgendes gelernt habe:

    - das Gerät zu steuern und eine Antwort von ihm zu erhalten;
    - Es reicht aus, einfach die Uhrzeit, das Datum und die Temperatur aus der Antwortleitung zu ziehen.
    - Zeigen Sie diese Werte in den entsprechenden Feldern an

    Als Erstes sollten Sie die Datei org.openhab.binding.serial-1.7.1.jar im Ordner C: \ OpenHab \ addons ablegen. Auf diese Weise sparen Sie mehrere Stunden, um herauszufinden, warum nichts funktioniert (ein bitterer Witz). Verbinden Sie anschließend das Modul mit dem Computer und sehen Sie im Geräte-Manager der Windows-Systemsteuerung die gleichzeitig gebildete Portnummer. Ich habe eine Glückszahl COM5. Wenn Ihr Computer das Gerät nicht erkennt, müssen Sie den Silicon Labs CP210x USB-zu-UART-Treiber für Ihr Betriebssystem installieren.

    In .sitemap habe ich auch in der .cfg-Konfiguration nichts gemacht. Zusätze erschienen nur in den Dateien testdrive.items und testdrive.rules.

    Der Bildschirm für die Testkonfiguration sah folgendermaßen aus :



    Wenn Sie den Abschnitt „Echtzeituhr“ aufrufen, handelt es sich bei dem Bild um solche



    DateienSie können die Testkonfiguration auf der Registerkarte Download vornehmen .

    Details:
    In .items habe ich einige Zeilen hinzugefügt, die eine neue Gruppe für die Uhr in meiner Benutzeroberfläche und mehrere Elemente erstellt haben:

    Gruppe RTC (Alle) // Seite für die MK8900-Echtzeituhr erstellen

    DateTime Date_RTC “Date : [% 1 $ tA,% 1 $ td.% 1 $ tm.% 1 $ tY] “(RTC)
    DateTime Time_RTC„ Time: [% tR] “(RTC)
    Number MK8900_T„ Aktuelle Temperatur: [% .1f ° C] ”(RTC)
    -Schalter Get_Time“ Request Time ”(RTC)
    -String Serial_string“ Befehls- / Antwortmodul: [% s] ”(RTC) {serial =“ COM5 ”}

    Hier ist der komplexe String: “ Date: [% 1 $ tA,% 1 $ td.% 1 $ tm.% 1 $ tY] “ legt nur das Datumsausgabeformat fest : Wochentag, Tag.Monat.Jahr. Und dieser: "Zeit: [% tR]"zeigt die Zeit an. Die aufmerksamsten werden bemerken, dass die über das Internet empfangene Zeit anders angezeigt wird “Moskau-Zeit: [% tT]” . Ich habe speziell den Buchstaben T durch R im Format des Ausdrucks [% tR] ersetzt, da "T" Sekunden anzeigt und "R" eine Ausgabe ohne Sekunden generiert. Dies ist, was ich brauche, da das MK8900-Modul keine Informationen über Sekunden ausgibt.
    Der Rest sind normale Elemente, aber beachten Sie, dass Serial_string eine Bindungseinstellung
    {serial = ”COM5”} hat.Es stellte sich heraus, dass dies für den Austausch über USB ausreicht. Es ist dieses Linienelement, das Befehle an das Modul sendet und eine Antwort von ihm erhält. Sie können es nicht in der Benutzeroberfläche anzeigen, aber ich habe den Prozess des Informationsaustauschs mit der Uhr aus Gründen der Übersichtlichkeit verlassen. Die Werte aller anderen Felder werden als Ergebnis der Regeln gefüllt (aktualisiert) .Die

    erste Regel ist einfach: Sie müssen Informationen vom Modul anfordern. Der einfachste Weg, dies zu tun, ist der Befehl! GetA

    rule "Get_Time ON",
    wenn
    Item Get_Time den Befehl empfängt,
    dann
    if (receiveCommand == ON) Serial_string.sendCommand ("! GetA \ r")
    end

    In diesem Beispiel fordere ich Informationen "manuell" mit dem Element "Switch Get_Time" an und erhalte eine Antwort im Format:! 14: 5608.10.15 + 2718 Es ist zu erkennen, dass die Zeile Uhrzeit, Datum, aktuelle Temperatur und sogar die Thermostateinstellung enthält (18) wir benutzen es jetzt nicht.
    Die zweite Regel ist die Antwort und zeigt die Informationen in die entsprechenden Felder zu analysieren, sieht es wie folgt aus :

    Regel «MK8900 Sendet zu Openhab»
    die , wenn
    Artikel geändert Serial_string
    die dann
    msg = Serial_string.state.toString.trim
    var time_rtc String = „“

    die if (msg.contains ( ":")) {
    time_rtc = "20" + (msg.mid (12,2)) + "-" + (msg.mid (9,2)) + "-" + (msg.mid (6,2) )) + "T" + msg.mid (1,5) + ": 00"
    println ("time_rtc --->

    postUpdate (Date_RTC, time_rtc)
    postUpdate (MK8900_T, msg.mid (14.3))
    }
    end


    Warnung! Stellen Sie sicher, dass Sie die msg-Variable global deklarieren. Platzieren Sie dazu den String Var String msg = "" am Anfang der RULES-Datei zwischen den Importblöcken ... und der ersten Regelregel ... Denken Sie daran, dies zu tun.
    Das Interessanteste ist nun, dass diese Zeile die Antwort des Moduls
    abfängt : msg = Serial_string.state.toString.trim Entschlüsselt den Status des Serial_string-Elements im String-Typ und entfernt unbedeutende Leerzeichen davor. Die Bedingung if (msg.contains (":")) (wenn die Antwort einen Doppelpunkt enthält, dann) verwende ich, um sicherzustellen, dass nur die Antwort des Moduls zur Verarbeitung gelangt, und nicht die Befehle selbst.
    Nach der ersten Antwort des Moduls erhalten wir msg =! 14: 5608.10.15 + 2718Wir können diese Zeile nicht sofort für die Verarbeitung verwenden, da ein Feld vom Typ DateTime ein Format dieser Art versteht: 2015-10-08T16: 41: 00 . Ich habe im OpenHAB-Monitor die Aufzeichnungen über die Aktualisierung von Datum und Uhrzeit über das Netzwerk ausspioniert.



    Wenn Sie die Zeile! 14: 5608.10.15 + 2718 in eine Zeile des Formats 2015-10-08T16: 41: 00 konvertieren, kann ich mit hoher Wahrscheinlichkeit Informationen in meinen Echtzeituhrfeldern anzeigen. Verwenden Sie dazu nur für diese Regel eine andere leere Variable, die bereits lokal ist: var String time_rtc = "". Dann beginne ich, das benötigte Datumsformat folgendermaßen zu erfassen :

    time_rtc = "20" + (msg.mid (12,2)) + "-" + (msg.mid (9,2)) + "-" + (msg.mid (6,2)) + "T" + msg.mid (1,5) + ": 00"

    Die Logik für die Konstruktion dieses Ausdrucks ist folgende: Ich benötige ein Jahr in Form von „2015“, also setze ich 20 in Anführungszeichen, was bedeutet, dass genau 20 in den Endwert fallen. Dann nehme ich schon die Information aus der Antwort des Moduls (msg.mid (12,2)), was bedeutet, ab dem 12. Platz ein Segment von 2 Zeichen zu nehmen. Der Countdown beginnt bei Null, an unserer Stelle haben wir "!". Dies ist 15 und insgesamt wird es 2015 sein. Dann füge ich einen Bindestrich und 2 Ziffern hinzu, beginnend mit dem 9. Platz (dies ist der Monat), wieder einen Bindestrich, 2 Ziffern der Zahl usw. bis du die Leitung bekommst, die ich brauche.
    Übrigens hat es sich als sehr praktisch für das Debuggen erwiesen, die folgende Zeile im Code der Regel zu verwenden: println ("time_rtc --->" + time_rtc) Dann sehen Sie auf dem Monitor das Ergebnis, das Sie erhalten. Siehe die Zeile --->?



    Es bleibt nur die Aktualisierung der Informationen in den Feldern, die ich brauche:

    postUpdate (Time_RTC, time_rtc)
    postUpdate (Date_RTC, time_rtc)
    postUpdate (MK8900_T, msg.mid (14.3))


    Ich aktualisiere den Temperatureintrag und ziehe sofort die benötigten Zeichen heraus. Es stimmt, es liegt ein Problem mit der Anzeige des Pluszeichens vor. Aber lass dies deine Herausforderung sein. Die zweite Aufgabe könnte eine automatische Erfassung der Stunden in einem bestimmten Zeitraum sein. Ich denke, dies ist nicht die schwierigste Regel, wenn man das behandelte Material berücksichtigt.
    Viel Glück!

    Jetzt auch beliebt: