HM-Dis-WM55

Ich mache hier mal einen neuen Thread auf für das HM-Dis-WM55 Statusdisplay.

Hier: viewtopic.php?f=11&t=202&start=10 hat Sathya mir schon gut geholfen. Irgendwie hackt es aber noch.

Wenn ich via openHAB rule ‘‘sendCommand(Status_Display_text1, “021274657374118513850A03”)’’ absetze, muss der Hex string immer zweimal an das Display geschickt werden. Beim ersten Tastendruck gibt es ein "Keine Daten empfangen. Beim zweiten Tastendruck dann der eigentliche Textstrang in Farbe und bunt mit Icon.

Bei genauerem hinsehen ist der Text der beim ersten Tastendruck gesendet wurde erst beim zweiten Tastendruck angezeigt, somit schon veraltet. Beim dritten Tastendruck dann den Text, der beim Zweiten gesendet wurde usw.

Liegt der Fehler hier wohl eher im homegar oder in openHAB oder an mir?

Das folgende Log zeigt den Ausschnitt nach dem ersten Tastendruck, VOR dem zweiten Tastendruck:

04/07/15 23:00:04.506 HomeMatic BidCoS packet received (My-HM-CFG-LAN, RSSI: 0x4F): xxxxxxxxxxxxxxx
04/07/15 23:00:04.507 Info: Calling XML RPC method "system.multicall" on server binary://192.168.42.4 and port 9123.
04/07/15 23:00:04.507 Info: Connecting to host 192.168.42.4 on port 9123...
04/07/15 23:00:04.507 Info: Connected to host 192.168.42.4 on port 9123. Client number is: 56410
04/07/15 23:00:04.507 Module HomeMatic BidCoS: Info: INSTALL_TEST on channel 2 of HomeMatic BidCoS peer 19 with serial number MEQ0022733 was set to 0x99.
04/07/15 23:00:04.508 Module HomeMatic BidCoS: Info: PRESS_SHORT on channel 2 of HomeMatic BidCoS peer 19 with serial number MEQ0022733 was set to 0x99.
04/07/15 23:00:04.566 Info: Calling XML RPC method "system.multicall" on server binary://192.168.42.4 and port 9123.
04/07/15 23:00:04.566 Info: Connecting to host 192.168.42.4 on port 9123...
04/07/15 23:00:04.566 Info: Connected to host 192.168.42.4 on port 9123. Client number is: 56411
04/07/15 23:00:04.600 RPC Server (Port 2001): Info: Connection from 127.0.0.1:45284 accepted. Client number: 56412
04/07/15 23:00:04.600 RPC Server (Port 2001): Info: Client number 56412 is calling RPC method: setValue Parameters:
(String) MEQ0022733:1
(String) SUBMIT
(String) 021274657374118513850A03
04/07/15 23:00:04.605 RPC Server (Port 2001): Info: Connection to client number 56412 closed (3).
04/07/15 23:00:07.559 RPC Server (Port 2001): Info: Connection from 127.0.0.1:45285 accepted. Client number: 56413
04/07/15 23:00:07.560 RPC Server (Port 2001): Info: Client number 56413 is calling RPC method: setValue Parameters:
(String) MEQ0022733:1
(String) SUBMIT
(String) 021274657374118513850A03
04/07/15 23:00:07.564 RPC Server (Port 2001): Info: Connection to client number 56413 closed (3).

Danke und viele Grüße

Jan

An Homegear. Gerade ausprobiert und auch gefixt :wink:. In der nächsten Version geht es. Nur: Das Setzen von “SUBMIT” muss innerhalb von 150 ms nach Paketempfang in Homegear abgeschlossen sein, sonst kann es vom Schalter nicht mehr empfangen werden. OpenHAB braucht bei dir fast 3 Sekunden zur Verarbeitung!!! Das ist viel, viel zu lang. Realisier es also besser per PHP-Skript in Homegear. Das geht flott.

Liebe Grüße

Sathya

Nicht nur an homegar :wink:

Das doppelte setzen war aufgrund eines Fehlers in der openHAB conf.

Da hatte ich in der rule:

when
	Item Status_Display_up_short received update
then

stehen, richtig ist aber:

when
	Item Status_Display_up_short received update ON
then

Dann wird der Hexstring auch nur einmal via homegear gesetzt. Das beschriebene Verhalten mit der Anzeige auf den zweiten Tastendruck bleibt davon aber unverändert. So dauert die ganze Kommunikation im homegar nur etwa 4ms wenn ich das Log richtig lese.

Nun, dann warte ich mal auf die nächste Version und teste es dann weiter.

Danke und Gruss

Jan

Gibt es schon eine Abschätzung, wann mit dieser Version zu rechnen ist ?

Danke und Gruss

Jan

Hallo Jan,

die ist schon online - oder gibt es mit der aktuellen Version immer noch Probleme? Tut mir leid, dass die Antwort so lange hat auf sich warten lassen - die letzten Tage waren etwas stressig.

Liebe Grüße

Sathya

hmm … habe noch die 0.54-7 laufen. Das ist auch laut Wiki die Aktuelle:

Current Homegear version: 0.5.24-7 (Release date: April 01, 2015)

habe daher noch nicht weitergemacht.

Musst dich nicht entschuldigen … stress hat jeder mal … ich als familienvater weiss wovon ich rede … also lass dich nicht hetzen :wink:

Gruss

Jan

Hallo Jan,

da habe ich geschlafen :unamused:. Die Änderung ist nur im 0.6er-Zweig (also den Nightlies). Im 0.5er-Zweig noch große Änderungen zu machen, ist mir zu aufwändig… Er wird sehr zeitnah auch abgelöst. 0.6 ist schon stabil, es fehlen nur noch einige Features. Das heißt, du kannst zumindest die nächsten Tage gefahrlos updaten :wink:. Wichtig: Das Homegear-Repository muss zur apt-Konfiguration hinzugefügt sein, da PHP aus dem Homegear-Repository installiert werden muss.

Liebe Grüße

Sathya

Hallo Zusammen,

ich bin die Tage auch mein erstes Mal mit dem HM-Dis-WM55 “zusammengestoßen”. Daraufhin habe ich auch einiges hier im Forum und sonst im Netz recherchiert und habe ein PHP-Script für den HM-Dis-WM55 (eigentlich auch für den HM-Dis-EP-WM55, da fehlt aber noch was) gebaut mit dem man den Display-Inhalt dynamisch und relativ unkryptisch generieren kann. Das Script unterstützt mehrere Display mit einem Run, für den Fall das man das (vermutlich nur beim EP) mal brauchen sollte…

Da ich mir denken könnte, dass dies für den einen oder anderen hilfreich sein könnte, poste ich es mal hier

<?php

/**
 * @author Andreas Fink
 * @copyright 2017
 * @abstract Funktionssammlung für HM-Dis-WM55 und HM-Dis-EP-WM55
 */

define ("DisplayStart",         "02");
define ("DisplayEnd",           "03");
define ("NextLine",             "0a");
define ("TextPrefix",           "12");
define ("ColorPrefix",          "11");
define ("SymbolPrefix",         "13");


/** Symbole 
 *  0x80 AUS
 *  0x81 EIN
 *  0x82 OFFEN
 *  0x83 geschlossen
 *  0x84 fehler
 *  0x85 alles ok
 *  0x86 information
 *  0x87 neue nachricht
 *  0x88 servicemeldung
 */
 
define ("icon_off",              "80"); 
define ("icon_on",             "81"); 
define ("icon_open",            "82"); 
define ("icon_closed",          "83"); 
define ("icon_error",           "84"); 
define ("icon_ok",              "85"); 
define ("icon_information",     "86"); 
define ("icon_message",         "87"); 
define ("icon_service",         "88"); 
define ("icon_signal_green",    "89"); 
define ("icon_signal_yellow",   "8A"); 
define ("icon_signal_red",      "8B"); 
define ("icon_no",              ""); 

/** 0x80 weiss              colour_white 
 *  0x81 rot                colour_red 
 *  0x82 orange             colour_orange 
 *  0x83 gelb               colour_yellow 
 *  0x84 grün               color_green 
 *  0x85 blau               color_blue 
 */

define ("colour_white",         "80"); 
define ("colour_red",           "81"); 
define ("colour_orange",        "82"); 
define ("colour_yellow",        "83"); 
define ("colour_green",         "84"); 
define ("colour_blue",          "85"); 

/** Zugriff auf vordefinierte Texte
 *  0x80 Textblock  1
 *  0x81 Textblock  2
 *  0x82 Textblock  3
 *  0x83 Textblock  4
 *  0x84 Textblock  5
 *  0x85 Textblock  6
 *  0x86 Textblock  7
 *  0x87 Textblock  8
 *  0x88 Textblock  9
 *  0x89 Textblock 10
 */

/** Tonfolgen (nur HM-DIS-EP-WM55)
 *   0xC0 AUS
 *   0xC1 LANG LANG
 *   0xC2 LANG KURZ
 *   0xC3 LANG KURZ KURZ
 *   0xC4 KURZ
 *   0xC5 KURZ KURZ
 *   0xC6 LANG
 */
 
/** Signale (nur HM-DIS-EP-WM55)
 *   0xF0 AUS
 *   0xF1 Rotes Blitzen
 *   0xF2 Grünes Blitzen
 *   0xF3 Orangenes Blitzen
 */

/** Test-Code
 *   $Displays = newDisplay("Boardroom");
 *   WriteHMDisplayLine(0, 1, "Dies ist", colour_red, icon_signal_yellow);
 *   WriteHMDisplayLine(0, 2, "mein Text", colour_green, icon_ok);
 *   echo returnDisplayContent(0);
 */

function newDisplay($Name = "")    
{
        if ($Name == "")
        {
            $Name = "Display";
            $Name .= count($Displays);
        }
        $newDisplay = array( array("Name"=>$Name,"ContentLine1"=>"","ContentLine2"=>"","ContentLine3"=>"","ContentLine4"=>"","ContentLine5"=>"","ContentLine6"=>"","Signal"=>"","Tone"=>""));
        return $newDisplay;
}

function addDisplay($Name = "")    
{
        global $Displays;
        $Displays = array_merge($Displays, newDisplay($Name));
}

function renameDisplay($DisplayNr, $NewName)
{
    global $Displays;
    $Displays[$DisplayNr]['Name'] = $NewName;
}

function clearHMDisplay($DisplayNr)    
{   
    global $Displays;
    $Displays[$DisplayNr]['ContentLine1'] = "";
    $Displays[$DisplayNr]['ContentLine2'] = "";
    $Displays[$DisplayNr]['ContentLine3'] = "";
    $Displays[$DisplayNr]['ContentLine4'] = "";
    $Displays[$DisplayNr]['ContentLine5'] = "";
    $Displays[$DisplayNr]['ContentLine6'] = "";
    $Displays[$DisplayNr]['Signal'] = "";
    $Displays[$DisplayNr]['Tone'] = "";
}

function returnDisplayContent($DisplayNr)
{
    global $Displays;
    $DisplayContent = DisplayStart;  //Start
    if($Displays[$DisplayNr]['ContentLine1'] != "" || $Displays[$DisplayNr]['ContentLine2'] != "" || $Displays[$DisplayNr]['ContentLine3'] != "" || $Displays[$DisplayNr]['ContentLine4'] != "" || $Displays[$DisplayNr]['ContentLine5'] != "" || $Displays[$DisplayNr]['ContentLine6'] != "")
    {
        $DisplayContent .= $Displays[$DisplayNr]['ContentLine1'];
        if($Displays[$DisplayNr]['ContentLine2'] != "" || $Displays[$DisplayNr]['ContentLine3'] != "" || $Displays[$DisplayNr]['ContentLine4'] != "" || $Displays[$DisplayNr]['ContentLine5'] != "" || $Displays[$DisplayNr]['ContentLine6'] != "")
        {
            $DisplayContent .= NextLine;
            $DisplayContent .= $Displays[$DisplayNr]['ContentLine2'];
            if($Displays[$DisplayNr]['ContentLine3'] != "" || $Displays[$DisplayNr]['ContentLine4'] != "" || $Displays[$DisplayNr]['ContentLine5'] != "" || $Displays[$DisplayNr]['ContentLine6'] != "")
            {
                $DisplayContent .= NextLine;
                $DisplayContent .= $Displays[$DisplayNr]['ContentLine3'];
                if($Displays[$DisplayNr]['ContentLine4'] != "" || $Displays[$DisplayNr]['ContentLine5'] != "" || $Displays[$DisplayNr]['ContentLine6'] != "")
                {
                    $DisplayContent .= NextLine;
                    $DisplayContent .= $Displays[$DisplayNr]['ContentLine4'];
                    if($Displays[$DisplayNr]['ContentLine5'] != "" || $Displays[$DisplayNr]['ContentLine6'] != "")
                    {
                        $DisplayContent .= NextLine;
                        $DisplayContent .= $Displays[$DisplayNr]['ContentLine5'];
                        if($Displays[$DisplayNr]['ContentLine6'] != "")
                        {
                            $DisplayContent .= NextLine;
                            $DisplayContent .= $Displays[$DisplayNr]['ContentLine6'];
                        }
                    }
                }
            }
        }
    }
    $DisplayContent .= DisplayEnd;
    return $DisplayContent;
    
}

function WriteHMDisplayLine($DisplayNr, $LineNr, $LineText, $LineColor, $LineSymbol)
{
    global $Displays;
    if ($LineNr <= 6 && $LineNr >= 1)
    {
        if ($LineText != "")
        {
            $Line = TextPrefix;
            $Line .= hex_encode($LineText);
            if ($LineColor != "")
            {
                $Line .= ColorPrefix;
                $Line .= $LineColor;
            }
            if ($LineSymbol != "")
            {
                $Line .= SymbolPrefix;
                $Line .= $LineSymbol;
            }
        } 
    }
    if ($LineNr == 1)
    {
        $Displays[$DisplayNr]['ContentLine1'] = $Line;
    }
    elseif ($LineNr == 2)
    {
        $Displays[$DisplayNr]['ContentLine2'] = $Line;
    }
    elseif ($LineNr == 3)
    {
        $Displays[$DisplayNr]['ContentLine3'] = $Line;
    }
    elseif ($LineNr == 4)
    {
        $Displays[$DisplayNr]['ContentLine4'] = $Line;
    }
    elseif ($LineNr == 5)
    {
        $Displays[$DisplayNr]['ContentLine5'] = $Line;
    }
    elseif ($LineNr == 6)
    {
        $Displays[$DisplayNr]['ContentLine6'] = $Line;
    }
    
}
 
function hex_encode ($string)    
{ 
    $umlaut =  array("Ä"   ,"Ö"   ,"Ü"   ,"ä"   ,"ö"   ,"ü"   ,"ß"   ,":"   ); 
    $hex =     array("0xc4","0xd6","0xdc","0xe4","0xf6","0xfc","0xdf","0x3a"); 
    $hex_neu = array("0x5b","0x23","0x24","0x7b","0x7c","0x7d","0x5f","0x3a"); 

    $encoded = bin2hex($string); 
          $string_array = str_split($encoded,2); 
        foreach ($string_array as $key => $wert) { 
                $string_array[$key] = "0x".$wert; 
          } 
          $return = implode("",$string_array); 
          $return = str_replace($hex, $hex_neu, $return);
          $return = str_replace("0x", "", $return);
        return $return; 
}

?>

Dieses Script ist in das folgende included und dort werden dessen Funktionen dann angesprochen:

#!/usr/bin/env php

<?php

/**
 * @author Andreas Fink
 * @copyright 2017
 * @abstract Setzen der Lichtmodi mit HM-Dis-WM55 samt Displayausgabe
 */
 
        include_once("Connect.php");
        include_once("/var/lib/homegear/scripts/HM-Dis-WM55.php");

        if($argc>=2)
        {
                $LightModeBR = $Client->send("getSystemVariable",array("LightmodeBoardroom"));
                if($argv[1] == "Boardroom1TopShort")
                {
                        if($LightModeBR >= 2)
                        {
                                $LightModeBR--;
                        }
                }
                else if ($argv[1] == "Boardroom1ButtomShort")
                {
                        if($LightModeBR <= 2)
                        {
                                $LightModeBR++;
                        }
                }
        }

        $Displays = newDisplay("Boardroom");
        WriteHMDisplayLine(0, 1, "Lichtmodus:", colour_white, icon_no);

        if($LightModeBR == 1)
        {
                WriteHMDisplayLine(0, 3, "DAUER", colour_green, icon_on);
        }
        else if($LightModeBR == 2)
        {
                WriteHMDisplayLine(0, 3, "AUTO", colour_blue, icon_service);
        }
        else if($LightModeBR == 3)
        {
                WriteHMDisplayLine(0, 3, "DAUER", colour_orange, icon_off);
        }
        else
        {
                WriteHMDisplayLine(0, 3, "UNBEKANNT", colour_red, icon_error);
        }
        $Client->send("setValue", array(57, 1, "SUBMIT", returnDisplayContent(0)));
        $Client->send("setSystemVariable",array("LightmodeBoardroom", $LightModeBR));

?>

Für Tipps, Anregungen, Optimierungen, Kritik, … bin ich immer offen! Natürlich auch für Nachfragen!

Gruß Andreas

3 Likes

Ach ja, für die, die ganz neu anfangen:

Das 2. Script wird event-getriggert von Homegear gestartet. Die entsprechenden Events erzeuge ich so:

!/usr/bin/env php
<?php
        /**** Use TCP sockets to connect to Homegear ****/
        include_once("Connect.php");

        print_r($Client->send("removeEvent", "Push Text to NEQxxxxxxx on Short Buttom"));
        print_r($Client->send("removeEvent", "Push Text to NEQxxxxxxx on Short Top"));

        print_r($Client->send("addEvent", array(
        "TYPE" => 0,
        "ID" => "Push Text to NEQxxxxxxx on Short Buttom",
        "PEERID" => 57,
        "PEERCHANNEL" => 1,
        "VARIABLE" => "PRESS_SHORT",
        "TRIGGER" => 8,
        "TRIGGERVALUE" => true,
        "EVENTMETHOD" => "runScript",
        "EVENTMETHODPARAMS" => Array("SetDisplay1.php", "Boardroom1ButtomShort")
        )));

        print_r($Client->send("addEvent", array(
        "TYPE" => 0,
        "ID" => "Push Text to NEQxxxxxxx on Short Top",
        "PEERID" => 57,
        "PEERCHANNEL" => 2,
        "VARIABLE" => "PRESS_SHORT",
        "TRIGGER" => 8,
        "TRIGGERVALUE" => true,
        "EVENTMETHOD" => "runScript",
        "EVENTMETHODPARAMS" => Array("SetDisplay1.php", "Boardroom1TopShort")
         )));

?>

Dieses Script wird dann einmalig mit PHP ausgeführt. Der Vorteil an der Event-Konfiguration über ein Script ist die Wiederholbarkeit. Solltet Ihr an dem Event was ändern wollen könnt Ihr das in Ruhe in dem Script tun, und dieses dann erneut ausführen. In dem Script werden zuerst die beiden Events mit “removeEvent” gelöscht und danach wieder nach den neuen Definitionen angelegt. Das ist gerade wenn man neu mit Events anfängt sehr hilfreich, da man so besser probieren/spielen kann und evtl. Fehler sehr leicht beheben kann.

Und aus OpenHAB, das ich für die meisten Regel-Aufgaben verwende, lese ich die Homegear-System-Variable “LightmodeBoardroom” dann aus.

Gruß Andreas

2 Likes

Danke. Ich hab gerade das Problem mit dem HM-Dis-EP. Ich schaffe es zwar alles in openHAB 2 zu lösen es ist auch recht flott, allerdings scheinen die Displays eine komische Eigenart zu haben. Wenn man zu schnell nach einem Tastendruck ein SUBMIT schickt, geht es in den Zustand STICKY_UNREACH. Ist das bei dem HM-Dis auch der Fall und hast du evtl. eine Lösung. Meine Lösung ist bisher, einfach zwei Sekunden zu warten bevor ich eine Antwort schicke. Aber das ist mir eindeutig noch zu lang.

Gruß

MIr fällt grad ein, dass es sich beim HM-Dis ja genau anders verhält. Der HM-Dis erwartet ja eine Antwort innerhalb einer bestimmten Zeit. Das Gerät wird ja durch Tastendruck aufgeweckt, schickt sein Telegramm und will dann, möglichst schnell, eine Antwort.
Das HM-Dis-EP dagegen kann immer mit neuen Displaydaten beschickt werden. Allerdings dürfen die nach einem Tastendruck nicht zu schnell kommen wie es scheint, da sonst das Funkmodul noch belegt ist. Keine Ahnung was eq3 da verzapft. Perfekt ist was anderes.

Hi Lopez1de,

Ich habe gestern mein HM-Dis-EP im Geschäft erhalten und hoffe ich komme nächste Woche dazu mich mit dem Teil zu beschäftigen. Beim HM-Dis hat man direkt aus OpenHAB keine Chance, da das SUBMIT innerhalb von 100ms nach dem Tastendruck fertig empfangen sein muss, und das senden allein selbst dauert schon 20-30ms.

Ich nehme mal an, du wartest in der OpenHAB-Regel die 2 Sekunden. Machst du das mit Thread::sleep(2000)? Hast du mal probiert dich langsam an kleinere Werte ranzutasten, bei welchem Minimalwert das Senden bzw. dann ja eher das Empfangen noch zuverlässig funktioniert. Die Werte bei dir würden mich dann auch mal interessieren, die kann ich dann mit meinen vergleichen.

Hast du dir mal das Log von Homegear (Normalerweise /var/log/homegear/homegear.log) zu der Zeit an der der Taster gedrückt und gesetzt wird (sowohl mit 2s Pause als auch ohne) angeschaut, vielleicht lässt sich da ja was daraus ableiten. Auch ein Blick ins Event-Log von OpenHAB kann nicht schaden (OH2 aus dem Repo: /var/log/openhab/events.log). Kannst du beides auch hier Posten, dann schau ich da gerne auch mal drauf.

Ich habe bisher auch alles als Rules in OpenHAB realisiert, aber mittlerweile tendiere ich mehr und mehr dazu, das mit PHP-Skripten in Homegear abzufrühstücken, zumindest solange ich in der Homematic-Welt bleibe. Die HG-Scriptengine ist schlicht viel schneller und wesentlich mächtiger, wobei OH2 da auch gut nachgelegt hat, da jetzt zumindest auch die “MASTER”-Parameter der Devices angesprochen werden können. Und ich habe auch den Eindruck das OH2 im Vergleich zu OH1 bei der Reaktionszeit besser geworden ist. Läufst du noch auf OH1 oder OH2?

Gruß Andreas

Hi Andreas,

schön einen Leidensgenossen zum Thema HM-Dis-EP zu bekommen. :wink:
Ich habe gestern folgenden Thread eröffnet. Denn leider ist es derzeit so, dass bei einem Sendefehler das komplette device hängt und auch keine Daten mehr zu und von meine HM Thermostaten kommen. Problem mit HM-Dis-EP-WM55 und STICKY_UNREACH

Hier auch mal meine display.rule. Hab grad keine Zeit alles zu erläutern, aber wir können gerne mal darüber schreiben. Der eigentlich interessante code steckt im Abschnitt //###Nachrichtenerstellung/-übertragung. Das Übertragen wird mit einem Dis_Flur_BuildMessage.sendCommand(ON) getriggert.

Script ist nur für HM-Dis-EP-WM55:

import org.openhab.model.script.actions.*

// Text (12)
// A = 41 | B = 42 | C = 43 | D = 44 | E = 45 | F = 46 | G = 47 | H = 48 | I = 49 | J = 4A | K = 4B | L = 4C | M = 4D | N = 4E | O = 4F | P = 50 | Q = 51 | R = 52 | S = 53 | T = 54 | U = 55 | V = 56 | W = 57 | X = 58 | Y = 59 | Z = 5A
// a = 61 | b = 62 | c = 63 | d = 64 | e = 65 | f = 66 | g = 67 | h = 68 | i = 69 | j = 6A | k = 6B | l = 6C | m = 6D | n = 6E | o = 6F | p = 70 | q = 71 | r = 72 | s = 73 | t = 74 | u = 75 | v = 76 | w = 77 | x = 78 | y = 79 | z = 7A
// 0 = 30 | 1 = 31 | 2 = 32 | 3 = 33 | 4 = 34 | 5 = 35 | 6 = 36 | 7 = 37 | 8 = 38 | 9 = 39 |   = 20 | ! = 21 | BS = 22 | % = 25 | & = 26 | = = 27 | ( = 28 | ) = 29 | * = 2A | + = 2B | , = 2C | - = 2D | . = 2E | / = 2F | Ä = 5B | Ö = 23 | Ü = 24 | ä = 7B | ö = 7C | ü = 7D | ß = 5F | : = 3A | ; = 3B | @ = 40 | > = 3E

// Zugriff auf vordefinierte Texte
// 0x80 Textblock  1
// 0x81 Textblock  2
// 0x82 Textblock  3
// 0x83 Textblock  4
// 0x84 Textblock  5
// 0x85 Textblock  6
// 0x86 Textblock  7
// 0x87 Textblock  8
// 0x88 Textblock  9
// 0x89 Textblock 10

// Symbole (13)
// 0x80 AUS (Lampe durchgestrichen)
// 0x81 EIN (Lampe)
// 0x82 OFFEN (Schloß offen)
// 0x83 geschlossen (Schloß geschlossen)
// 0x84 fehler	(X)
// 0x85 alles ok (Haken)
// 0x86 information
// 0x87 neue nachricht
// 0x88 servicemeldung

// Tonfolgen
// 0xC0 AUS
// 0xC1 LANG LANG
// 0xC2 LANG KURZ
// 0xC3 LANG KURZ KURZ
// 0xC4 KURZ
// 0xC5 KURZ KURZ
// 0xC6 LANG
// 0xC7
// 0xC9
// 0xCA

// Signale
// 0xF0 AUS
// 0xF1 Rotes Blitzen
// 0xF2 Grünes Blitzen
// 0xF3 Orangenes Blitzen


//###vars
var Timer dis_flur_msg_timer = null
var boolean dis_flur_pressed = false
var String dis_flur_msg = ""
var String dis_flur_msg_weather = ""

//### Rule warmup
rule "display.rules loaded Event"
when
	System started
then
	logInfo("Warmup","display.rules warmup completed")
end


//### Status aktualisieren  !!!!! NICHT VERGESSEN AUCH IN heizung.rules ANZUPASSEN, SONST KOMMT ES ZU ZU VIEL TRAFFIC !!!!!
rule "Update Display-Flur-Event"
when
	Item Presence received update or
	Item Win_Gesamt changed
then
	Dis_Flur_BuildMessage.sendCommand(ON)
end

rule "Weather_Temp_Display Event"
when
	Item Weather_Temp_Display changed
then
	val String temp = Weather_Temp_Display.state.toString
	logInfo("Weather", "Temperatur draussen: " + temp)
	dis_flur_msg_weather = "85" // "Temp: "
	var i = -1
	while ((i=i+1) < temp.length) {		
		val String t = temp.charAt(i).toString
		switch (t){
			case "0": dis_flur_msg_weather = dis_flur_msg_weather + "30"
			case "1": dis_flur_msg_weather = dis_flur_msg_weather + "31"
			case "2": dis_flur_msg_weather = dis_flur_msg_weather + "32"
			case "3": dis_flur_msg_weather = dis_flur_msg_weather + "33"
			case "4": dis_flur_msg_weather = dis_flur_msg_weather + "34"
			case "5": dis_flur_msg_weather = dis_flur_msg_weather + "35"
			case "6": dis_flur_msg_weather = dis_flur_msg_weather + "36"
			case "7": dis_flur_msg_weather = dis_flur_msg_weather + "37"
			case "8": dis_flur_msg_weather = dis_flur_msg_weather + "38"
			case "9": dis_flur_msg_weather = dis_flur_msg_weather + "39"
			case ",": dis_flur_msg_weather = dis_flur_msg_weather + "2C"
			case ".": dis_flur_msg_weather = dis_flur_msg_weather + "2E"
			case "-": dis_flur_msg_weather = dis_flur_msg_weather + "2D"
		}
	}

	logInfo("Weather", "build message is: " + dis_flur_msg_weather)
	
	Dis_Flur_BuildMessage.sendCommand(ON)
end

rule "Update_Display_Flur Event"
when
	Item Update_Display_Flur changed
then
	//Weather_Temperature.postUpdate(-10.4)
	Dis_Flur_BuildMessage.sendCommand(ON)
	//gHeizModeAuto.sendCommand(ON)
end

//### Handle SUBMIT error
rule "Handle Display Flur Submit Error"
when
	Item Dis_Flur_StickyUnreach changed to ON
then
	logInfo("Display", "Dis_Flur_StickyUnreach!") 
	//Dis_Flur_Submit.sendCommand("")
end



//### Tasten
rule "Dis_Flur_TasteUP Event"
when
	Item Dis_Flur_TasteUP received update ON
then
	//Anwesend
	dis_flur_pressed = true
	Presence.sendCommand(ON)
end

rule "Dis_Flur_TasteDOWN Event"
when
	Item Dis_Flur_TasteDOWN received update ON
then
	//Abwesend
	dis_flur_pressed = true
	Presence.sendCommand(OFF)
end


//###Nachrichtenerstellung/-übertragung
rule "Dis_Flur_BuildMessage Event"
when
	Item Dis_Flur_BuildMessage received command ON //DISABLE WITH OFF, ENABLE WITH ON
then
	logInfo("Display_Flur","building new message")
	
	var alarm = false
	var repeat = 0
	
	//Zeile 1: Presence/Anwesend
	var msg = "020A1281"	
	if(Presence.state == ON){
		msg = msg + "1385"
	} else {
		msg = msg + "1384"
	}
	
	//Zeile 2: Fenster
	msg = msg + "0A1280"
	if(Win_Gesamt.state == OPEN){
		msg = msg + "1384"
		if(Presence.state == OFF){
			alarm = true
		}
	} else {
		msg = msg + "1385"
	}
	
	//Zeile 3: Wetter
	msg = msg + "0A12" + dis_flur_msg_weather
	
	//Ton
	msg = msg + "0A0A14"
	if(alarm){
		repeat = 1
		msg = msg + "C3" 
	} else if(dis_flur_pressed){
		msg = msg + "C4" //kurzer ton
	} else {
		msg = msg + "C0" //kein ton
	}
	msg = msg + "1C"
	//Ton Wiederholungen
	msg = msg + "D" + (repeat).toString + "1D"
	
	//Abstand
	msg = msg + "E016"
	
	//Signal
	if(alarm){
		msg = msg + "F1" //rot
	} else {
		msg = msg + "F2" //grün
	}
	
	//Ende
	msg = msg + "03"
	
	Dis_Flur_SubmitFunc.sendCommand(msg)
end

rule "Dis_Flur_SubmitFunc Function"
when
	Item Dis_Flur_SubmitFunc received command
then
	logInfo("Display_Flur","new submit received: " + receivedCommand)
	dis_flur_msg = receivedCommand.toString
	if(dis_flur_msg_timer != null){
		//adjust timing here. to fast schedule results in error, because display needs some time after a keypress
		//absolut minimum delay seams to be 1 second
		logInfo("Display_Flur","new submit scheduled")
		dis_flur_msg_timer.reschedule(now.plusMillis(1500))
	}
end

rule "Dis_Flur_SubmitTimer Event"
when
	System started
then
	if(dis_flur_msg_timer == null){
		logInfo("Display_Flur","Init Dis_Flur_SubmitTimer")
		dis_flur_msg_timer = createTimer(now.plusHours(24)) [|
			if(!dis_flur_msg.isEmpty){
				logInfo("Display_Flur","submitting: " + dis_flur_msg)
				Dis_Flur_Submit.sendCommand(dis_flur_msg)
				dis_flur_msg = "" //comment this line out to resend msg after idle time
				dis_flur_pressed = false
			}
			//the following reschedule has to be done, because timer will else be destroyed 
			dis_flur_msg_timer.reschedule(now.plusHours(24)) //idle plusHours(24)
		]
	}
end

@Andreas.Fink Na? Noch keine Zeit gehabt? :slight_smile:

Hi @lopez1de,

leider tatsächlich noch nicht, bei mir ist gerade die Hölle los.

Ich habe zwar schon versucht das Teil mal an Homegear (0.7.x) anzulernen, was aber leider nicht geklappt hat weil HG scheinbar nicht auf die Pakete von Display reagiert. Aber ich habe noch keine Zeit gefunden, mich dem mal so richtig anzunehmen. Wir stehen gerade davor von unserem bisherigen Datacenter in ein neues unzuziehen und machen dabei auch einen kompletten Infrastruktur-Refresh. Und “ganz nebenbei” muss auch noch das “daily business” laufen. Da bin ich froh, wenn ich nach meist ~10h (+/- ein paar Prozent, aber meisr mehr +…) Arbeitstag keinen Computer mehr sehen muss… nicht mal von der Ferne… geschweige dem das ich in der Firma dazu komme das Display an der dortigen HG-Instanz anzulernen (wo er hin gehört)…

Aber ich irgendwann komme ich schon noch dazu, aber bisschen dauern wird es vermutlich noch.

Gruß Andreas

1 Like

Das klingt nach Stress. :smiley: Meld dich wenn du Luft hast mal wieder.

Bei mir ist das Anlernen mit Homegear (version 0.6.17-902) kein Problem. Ist die 0.7 eine beta version oder so was?

0.7 sind aktuell die Nightlies. Diese können aber in der Tat auch mal Fehler enthalten, da sie oft ungetestete Änderungen enthalten.

Viele Grüße

Sathya

Danke dafür. Habe so ein Ding gebraucht bei Ebay ersteigert, natürlich ohne vorherige Recherche, wie das funktioniert. :wink:

Ich dachte, das wäre halbwegs normal anzubinden. :frowning:

Ich glaube, derjenige, der dieses Gerät entwickelt hat, wollte nicht, dass es benutzt wird.

2 Likes

Ich habe jetzt zum ersten Mal das Display mit node-blue zum Leben erweckt…
Danke an @Andreas.Fink

Die haben sie doch nicht alle bei eq-3. Was ein Schrottgerät. Wer auch immer glaubt, so etwas zu kaufen, tut es nicht. Auf gar keinen Fall.

Die Informationen per Morsecode über Hue-Lampen mitzuteilen ist angenehmer…

Hi @job,

freut mich, dass meine Infos nach so langer Zeit noch hilfreich waren. Bei mir ist das Display aufgrund anderer Prioritäten im Schrank gelandet.

In der Tat sind die Displays nicht das pralle Leben.

Gruß Andreas