[HM-Wired] "Lange" Befehle übermitteln

Begonnen von Thorsten Pferdekaemper, 15 Juli 2015, 10:59:46

Vorheriges Thema - Nächstes Thema

Thorsten Pferdekaemper

Hi,

ich bin gerade dabei, eine Art Lampe per HMW an FHEM anzubinden. Das Ding hat momentan 20 Kanäle. (8 für weiß und je 3 für 4 RGB-Abschnitte, aber das ist erstmal egal.) Wenn ich mir ein Device-File zusammenbastle, dass einem 20-fach Dimmer entspricht, dann funktioniert das ganze auch. Allerdings muss ich dann für jeden dieser Kanäle einen eigenen Befehl absetzen ("set theLamp_03 Level 25"). Das ist aber etwas unschön da es relativ langsam ist. Wenn ich eine neue Farbe setze, dann sieht man, wie zuerst rot, dann grün, dann blau "eingestellt" wird. Wenn etwas für mehrere Segmente geändert werden soll, dann sieht man ebenfalls, dass das Ding nach und nach die Befehle empfängt.

Ist es irgendwie möglich, etwas wie

set <channel> red 25 green 30 blue 128

zu fabrizieren? Soweit ich die HMW-XMLs verstehe du das FHEM-485 coding sollte das irgendwie gehen, ich hab's aber nicht hinbekommen.

Eine Alternative wäre, wenn ich in einem Rutsch sozusagen alle 20 Kanäle (später werden es noch mehr) übermitteln könnte. Ich habe versucht, im <device>.pm-File "size" vom "param" level auf 20 zu setzen. Dann hat FHEM auch tatsächlich 20 Bytes an das Device geschickt, aber ich konnte per set-Befehl maximal die letzten 8 Byte tatsächlich auf einen Wert setzen. Hat da jemand eine Idee?

(Auf der Seite des Geräts selbst bekäme ich das hin, es geht mir nur um die Einbindung in FHEM.)

Gruß,
   Thorsten
FUIP

Ralf9

Hallo Thorsten,

eine Möglichkeit wäre, die EEPROM Adressen ab 0xF000 als virtuellen Speicher zu verwenden.
Du müsstest dann in der write EEPROM Routine im Gerät eine Abfrage auf Adressen ab 0xF000 machen und dort dann je nach Adresse und Wert die entsprechenden Aktionen auslösen.
In fhem kannst Du dann mit dem entsprechenden set raw Befehl auf eine Adresse ab 0xF000 Deine Lampen schalten.

Gruß Ralf
FHEM auf Cubietruck mit Igor-Image, SSD und  hmland + HM-CFG-USB-2,  HMUARTLGW Lan,   HM-LC-Bl1PBU-FM, HM-CC-RT-DN, HM-SEC-SC-2, HM-MOD-Re-8, HM-MOD-Em-8
HM-Wired:  HMW_IO_12_FM, HMW_Sen_SC_12_DR, Selbstbau IO-Module HBW_IO_SW
Maple-SIGNALduino, WH3080,  Hideki, Id 7

Thorsten Pferdekaemper

Zitat von: Ralf9 am 15 Juli 2015, 12:26:33
eine Möglichkeit wäre, die EEPROM Adressen ab 0xF000 als virtuellen Speicher zu verwenden.
Du müsstest dann in der write EEPROM Routine im Gerät eine Abfrage auf Adressen ab 0xF000 machen und dort dann je nach Adresse und Wert die entsprechenden Aktionen auslösen.
Das ist zwar etwas von hinten durch die Brust..., aber würde wahrscheinlich gehen.

Zitat
In fhem kannst Du dann mit dem entsprechenden set raw Befehl auf eine Adresse ab 0xF000 Deine Lampen schalten.
Ach ja, mit set raw geht das natürlich. Aber dann muss ich dem Umweg über das "virtuelle" EEPROM gar nicht gehen, sondern könnte gleich eine "normale" 's' oder 'x'-Nachricht schicken. Im Prinzip könnte ich dann auch einen komplett neuen Befehl erfinden.
Naja, alles nicht besonders schön, sollte so aber gehen.
Danke&Gruß,
   Thorsten
FUIP

hglaser

#3
hallo thorsten

kannst du einmal dein xml-file von diesem device anhängen?
wie wäre denn die da kodierung für die einzelnen farben die du schicken möchtest ?

lg harald


Thorsten Pferdekaemper

Zitat von: honk am 15 Juli 2015, 19:09:37
kannst du einmal dein xml-file von diesem device anhängen?
Ich habe dazu kein XML-File. Ich habe keine CCU laufen, da kann ich das XML eh nicht testen. Also mache ich alles direkt im <device>.pm. Ich habe mal eins, das funktioniert, hier drangehängt. Allerdings ist das nicht das mit den "langen" Befehlen, weil es das ja noch nicht gibt.
FUIP

hglaser

#5
hallo thorsten

wenn es nicht auf der ccu laufen muss, wäre es ja nicht so das Problem, wenn man aus einem "control" => "blind.level" ein sagen wir mal "control" => "rgb.level" macht. und die Werte dementsprechend anpasst.

"level" => {
"control" => "rgb.level",
"conversion" => {
"factor" => 1,
"type" => "float_integer_scale"
},
"logical" => {
"red" {
"default" => 0,
"max" => 255,
"min" => 0,
"type" => "int",
"unit" => "1"
},
"green" {
"default" => 0,
"max" => 255,
"min" => 0,
"type" => "int",
"unit" => "1"
},
"blue" {
"default" => 0,
"max" => 255,
"min" => 0,
"type" => "int",
"unit" => "1"
},
};

könnte man es so implementieren ?
Und in den frames hast du, denke ich
         "level_set" => {
"channel_field" => 10,
"direction" => "to_device",
"parameter" => {
"index" => 11.0,
"param" => "level",
"size" => 20.0,
"type" => "integer"
},
"type" => 0x78
}

gemacht ? Verstehe ich das richtig?

edit: achso hab ich jetzt überlesen, Du möchtest ja mehrere Kanäle auch noch auf einmal schalten. dann müsste man also noch die einzelnen Kanäle zusätzlich in das "level_set" an die richtige Stelle setzen:


ch1      ch2      ch3   ....    ch20
  r g b    r g b    r g b ...    r g b
00FF4FBB 0100FF00 02FFFFFF ... 14000000


hast Du das so in etwa gemeint?
ich denke das könnte man schon implementieren, stellt sich noch die Frage wie man das Schalten von mehreren Kanälen im FHEMWEB darstellen kann.

lg harald

Thorsten Pferdekaemper

Zitat von: honk am 15 Juli 2015, 19:42:16
wenn es nicht auf der ccu laufen muss, wäre es ja nicht so das Problem, wenn man aus einem "control" => "blind.level" ein sagen wir mal "control" => "rgb.level" macht. und die Werte dementsprechend anpasst.
Ich gehe davon aus, dass das momentan noch nicht geht und das, was Du schreibst, eine Idee zur Änderung des HM485-FHEM-Codings ist. Korrekt?

Zitat
"level" => {
"control" => "rgb.level",
"conversion" => {
"factor" => 1,
"type" => "float_integer_scale"
},
"logical" => {
"red" {
"default" => 0,
"max" => 255,
"min" => 0,
"type" => "int",
"unit" => "1"
},
"green" {
"default" => 0,
"max" => 255,
"min" => 0,
"type" => "int",
"unit" => "1"
},
"blue" {
"default" => 0,
"max" => 255,
"min" => 0,
"type" => "int",
"unit" => "1"
},
};

könnte man es so implementieren ?
Möglicherweise schon, aber ich fände es nicht gut, wenn nur wegen meiner Anwendung so etwas extra eingebaut wird.
Außerdem weiß ich nicht, ob das mit dem "control" so sein sollte. Inzwischen habe ich sogar "control" => "none" drinstehen. Der Vorteil ist, dass die Slider verschwinden und man tatsächlich alle Werte eingeben kann.
Ich habe im Coding gesehen, dass die möglichen Parameter vom "control" abhängig sind. Ist das gut so?

Zitat
Und in den frames hast du, denke ich
         "level_set" => {
"channel_field" => 10,
"direction" => "to_device",
"parameter" => {
"index" => 11.0,
"param" => "level",
"size" => 20.0,
"type" => "integer"
},
"type" => 0x78
}

gemacht ? Verstehe ich das richtig?
Ja, das war einer der Versuche.

Zitat
edit: achso hab ich jetzt überlesen, Du möchtest ja mehrere Kanäle auch noch auf einmal schalten. dann müsste man also noch die einzelnen Kanäle zusätzlich in das "level_set" an die richtige Stelle setzen:


ch1      ch2      ch3   ....    ch20
  r g b    r g b    r g b ...    r g b
00FF4FBB 0100FF00 02FFFFFF ... 14000000


hast Du das so in etwa gemeint?
[/code]
So in etwa, ja.

Zitat
ich denke das könnte man schon implementieren, stellt sich noch die Frage wie man das Schalten von mehreren Kanälen im FHEMWEB darstellen kann.
Das wäre mir relativ egal, so lange es irgendwie mit "set <device>/<channel>..." geht.

Das ganze ist momentan sowieso nur Brainstorming. Ich weiß momentan auch nicht so genau, wie es eigentlich sein sollte. Ich werde jetzt wahrscheinlich erstmal mit RAW-Befehlen experimentieren. Das hätte auch den Vorteil, dass ich eigene Kommandos einbauen kann. Dann bräuchte ich das mit mehreren Parametern nur noch für level_get bzw. info_level. Ich habe mal etwas wie das hier probiert:

'frames' => {
"info_level" => {
"channel_field" => 10,
"direction" => "from_device",
"event" => true,
"parameter" => {
"11.0" => {
"param" => "red",
"size" => 1.0,
"type" => "integer"
},
"12.0" => {
"param" => "green",
"size" => 1.0,
"type" => "integer"
},
"13.0" => {
"param" => "blue",
"size" => 1.0,
"type" => "integer"
}
},
"type" => 0x69
},

Das hat aber auch nicht funktioniert. Möglicherweise muss da noch irgendwas in die 'channels' Definition mit rein.

Gruß,
   Thorsten
FUIP

hglaser

hallo Thorsten

ZitatIch gehe davon aus, dass das momentan noch nicht geht und das, was Du schreibst, eine Idee zur Änderung des HM485-FHEM-Codings ist. Korrekt?
Ja
ZitatMöglicherweise schon, aber ich fände es nicht gut, wenn nur wegen meiner Anwendung so etwas extra eingebaut wird.
Nun ja auch wieder wahr. Aber ich finde deine Idee interessant und ich denke früher oder später werden sich wohl auch andere für einen RGB Dimmer interessieren.
ZitatAußerdem weiß ich nicht, ob das mit dem "control" so sein sollte. Inzwischen habe ich sogar "control" => "none" drinstehen. Der Vorteil ist, dass die Slider verschwinden und man tatsächlich alle Werte eingeben kann.
gevoo hat irgend wann mal meine Version übernommen und angepasst. Ich weiß es jetzt nicht genau, was er alles ungeschrieben hat, da ich schon länger seine Version nicht verwende, aber ursprünglich war es von Dirk denke ich so geplant, daß man die möglichen Parameter in "getAllowedSets" schreibt. Dort wären die Parameter anzupassen. Ich habe meinen HBW_CC_Vd2_T mit einem "valve.level" auch dort reingepackt. Bei mir steht z.B.
my %cmdArgs = (
'none' => "noArg",
    'blind.level' => "slider,0,1,100 on:noArg off:noArg",
    'blind.stop' => "noArg",
    'dimmer.level' => "slider,0,1,100 on:noArg off:noArg",
    'valve.level' => "slider,0,1,100",
    'button.long' => "noArg",
    'button.short' => "noArg",
    'digital_analog_output.frequency' => "slider,0,1,50000 frequency2:textField",
);

ein "none" geht natürlich auch. Aber man könnte später auch so etwas wie einen Color-Picker implementieren.
ZitatDas ganze ist momentan sowieso nur Brainstorming.
Ja, ich finde es jedenfalls interressant, auch wenn ich bis jetzt noch keine "bunten" Lampen habe.

lg Harald