Homematic wired

Begonnen von Henne1977, 26 Januar 2013, 22:46:00

Vorheriges Thema - Nächstes Thema

Ralf9

#720
Hallo,

bei mir funktioniert das "press-long" jetzt. Ich habe in der "Device.pm" in der "sub getFrameInfos" einige Zeilen eingefügt.
Dies ist durch meine bescheidenen Perl Kenntnisse wahrscheinlich recht umständlich programmiert.

Edit:
In der Anlage ist das Log zu Press Short und Long.
Edit2:
Ich habe es etwas schöner geschrieben.


sub getFrameInfos($$;$$) {

my ($deviceKey, $data, $event, $dir) = @_;

my $frameType = hex( substr( $data, 0, 2));
my %retVal;
my $framt = '';
if ( $event == 3) {
$framt = 'INFO_FREQUENCY';
$event = 1;
}

my $frames = getValueFromDefinitions($deviceKey . '/frames/');

HM485::Util::HM485_Log( 'getFrameInfos frames = ' . $frames . ' event = ' . $event . ' data = ' . $data);
if ($frames) {
       
foreach my $frame (keys %{$frames}) {
   if ( $framt ne $frame) {
my $fType  = $frames->{$frame}{type};
my $fEvent = $frames->{$frame}{event} ? $frames->{$frame}{event} : 0;
my $fDir   = $frames->{$frame}{direction} ? $frames->{$frame}{direction} : 0;

                        HM485::Util::HM485_Log( 'getFrameInfo fEvent = ' . $fEvent . ' fType = ' . $fType . ' frameType= ' . $frameType . ' frame = ' . $frame);
if ($frameType == $fType &&
   (!defined($event) || $event == $fEvent) &&
   (!defined($event) || $dir eq $fDir) ) {
     
      my $keyflag = 1;
                              if ($frameType == 75) {
                                my $keyEvent = hex(substr($data,7)) & 3;
                                if ($keyEvent == 2 && $frame ne 'KEY_EVENT_SHORT') {
                                  $keyflag = 0;
                                }
                                if ($keyEvent == 3 && $frame ne 'KEY_EVENT_LONG') {
                                  $keyflag = 0;
                                }
                              }
                      HM485::Util::HM485_Log( ' keyflag = ' . $keyflag);

      if ($keyflag == 1) {
my $chField = ($frames->{$frame}{channel_field} - 9) * 2;
my $params = translateFrameDataToValue($data, $frame, $frames->{$frame}{parameter});
HM485::Util::HM485_Log( 'Device:getFrameInfos chField = ' . $chField . ' deviceKey = ' . $deviceKey . ' frameType = ' . $frameType . ' frame = ' . $frame);
foreach my $par (keys %{$params}) {
HM485::Util::HM485_Log( 'Device:getFrameInfos param = ' . $par);
if ( ref( $params->{$par}) eq 'HASH') {
my $pa   = $params->{$par};
foreach my $p (keys %{$pa}) {
HM485::Util::HM485_Log( 'Device:getFrameInfos p = ' . $p . ' value = ' . $pa->{val});
}
}
}
if (defined($params)) {
%retVal = (
ch     => sprintf ('%02d' , hex(substr($data, $chField, 2)) + 1),
params => $params, # $params->{STATE}{val} = $value
type   => $fType, # 69
event  => $frames->{$frame}{event} ? $frames->{$frame}{event} : 0,
id     => $frame # INFO_LEVEL
);
last;
        }
                             }
}
     }
}
}

return \%retVal;
}



Ich habe außerdem bei mir in der room Ansicht noch ein wenig optimiert.
Da mir "PRESS_SHORT_PRESS_SHORT 11 zu lang war, habe ich es in "Short 11" verkürzt.

Beim HMW_Sen_SC_12_DR finde ich "open" und "closed" passender. Dann verhält es sich wie bei den entsprechenden Funkmodulen.
Mit "devStateIcon open:off closed:on" können ggf die Icons angepasst werden.

Hier sind die Änderungen in der 10_HM485.pm:


sub HM485_ChannelDoUpdate($) {
my ($params)    = @_;

my $chHash    = $params->{chHash};
my $valueHash = $params->{valueHash};
my $name      = $chHash->{NAME};
my $doTrigger = $params->{doTrigger} ? 1 : 0;

my $deviceKey = uc( HM485::Device::getDeviceKeyFromHash($chHash));
# HM485::Util::HM485_Log( 'HM485_ChannelDoUpdate: name = ' . $name);
readingsBeginUpdate($chHash);
# print Dumper($valueHash);

foreach my $valueKey (keys %{$valueHash}) {
my $value = $valueHash->{$valueKey};

if (defined($value)) {
# we trigger events only if necesary
# HM485::Util::HM485_Log( 'HM485_ChannelDoUpdate: valueKey = ' . $valueKey . ' value = ' . $value . ' Alter Wert = ' . $chHash->{READINGS}{$valueKey}{VAL});
if (!defined($chHash->{READINGS}{$valueKey}{VAL}) ||
    $chHash->{READINGS}{$valueKey}{VAL} ne $value) {

if ( $valueKey eq 'STATE') {
if ( HM485::Device::isNumber($value)) {
if ( $value == 0) {
readingsBulkUpdate($chHash, $valueKey, 'off');
} else {
readingsBulkUpdate($chHash, $valueKey, 'on');
}
} else {
readingsBulkUpdate($chHash, $valueKey, lc( $value));
HM485::Util::HM485_Log( 'HM485_ChannelDoUpdate: setzen Reading1 fuer ' . $valueKey . ' auf ' . lc( $value));
}
} elsif ( $valueKey eq 'SENSOR') {
if ( HM485::Device::isNumber($value)) {
if ( $value == 0) {
readingsBulkUpdate($chHash, $valueKey, 'closed');
} else {
readingsBulkUpdate($chHash, $valueKey, 'open');
}
}
} else {
if ( $deviceKey eq 'HMW_LC_BL1_DR') {
readingsBulkUpdate( $chHash, $valueKey, int( $value));
} else {
readingsBulkUpdate( $chHash, $valueKey, $value);
}
HM485::Util::HM485_Log( 'HM485_ChannelDoUpdate: setzen Reading2 fuer ' . $valueKey . ' auf ' . lc( $value));
}

HM485::Util::logger(
HM485::LOGTAG_HM485, 4, $name . ': ' . $valueKey . ' -> ' . $value
);
# State noch aktuallisieren
HM485::Util::HM485_Log( 'HM485_ChannelDoUpdate: name = ' . $name . ' alter State = ' . $chHash->{STATE} . ' valueKey = ' . $valueKey . ' value = ' . $value);
if ( defined( $chHash->{STATE}) && $chHash->{STATE}) {
if ( $deviceKey eq 'HMW_LC_BL1_DR') {
$chHash->{STATE} = $valueKey . '_' . int( $value);
} else {
if ( $valueKey eq 'STATE') {
if ( HM485::Device::isNumber($value)) {
if ( $value == 0) {
$chHash->{STATE} = 'off';
} else {
$chHash->{STATE} = 'on';
}
} else {
$chHash->{STATE} = lc( $value);
HM485::Util::HM485_Log( 'HM485_ChannelDoUpdate: setzen STATE auf ' . lc( $value));
}
} elsif ( $valueKey eq 'SENSOR') {
if ( HM485::Device::isNumber($value)) {
if ( $value == 0) {
$chHash->{STATE} = 'closed';
} else {
$chHash->{STATE} = 'open';
}
}
} else {
if ( substr( $value,0,6) eq 'PRESS_') {
$value = lc($value);
$chHash->{STATE} = ucfirst(substr($value,6));
} else {
$chHash->{STATE} = $valueKey . '_' . $value;
}
}
}
}
}
}
}

readingsEndUpdate($chHash, $doTrigger);
}




Nun sind für mich die Module "HMW_IO_12_FM" und "HMW_Sen_SC_12_DR" voll benutzbar.

Daß beim Beenden von fhem der HM485d Server nicht mit gestoppt wird, ist für mich nicht so dringend. Ich warte ab bis Dirk dies nochmals überarbeitet hat.
Die PID wird bei mir richtig ermittlelt, ich habe es mit "ps -ef" nachgeprüft.

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

RoBra81

Zitat von: Ralf9 am 06 Januar 2015, 01:29:59
bei mir funktioniert das "press-long" jetzt. Ich habe in der "Device.pm" in der "sub getFrameInfos" einige Zeilen eingefügt.
Dies ist durch meine bescheidenen Perl Kenntnisse wahrscheinlich recht umständlich programmiert.

Vielen Dank! Ich habe das bei mir jetzt erstmal auch eingebaut (bis eine offizielle Anpassung kommt  ;)) um den WAF wieder ein bisschen zu heben. Nun bräuchte ich nur noch die Ausgänge des HMW_IO_12_Sw14_DR damit der WAF wieder gut ist (darüber schalte ich nämlich das Tablet an der Wand, das dadurch zur Zeit schwarz bleibt)...

Ronny

PS: Gern unterstütze ich die Entwicklung auch weiterhin mit Logfiles

Fred

Hallo Zusammen,

ich bin im Bereich HMW und FHEM noch newbie würde aber gerne helfen.
Dafür muss ich aber erst meine HMW Komponenten zum Laufen bringen :(

Ich habe es mit dem DIGITUS DA-70157 und dem RS485 LAN Gateway versucht.
Aber beides leider ohne Erfolg.
FHEM findet bei beiden Konfigurationen keine HMW Komponenten.
Meine CCU 1, die ich ablösen will, meldete keine Fehler und alles funktioniert ohne Probleme.

FHEM ist auf dem aktuellstem Stand.
Bei HM485 habe ich den aktuellen master Branch von https://github.com/kc-GitHub/FHEM-HM485 ausgecheckt.

Nach dem ich set HM485_LAN discovery start ausführe kommt immer nur:

2015.01.06 18:02:47 3: HM485_LAN: Alive: (7) 3030
2015.01.06 18:02:49 3: HM485_LAN: TX: (8) I[0](0,Y,F,B)(98) 00000001 -> FFFFFFFF [3] 7A(z)
2015.01.06 18:02:49 3: HM485_LAN: TX: (9) I[0](0,Y,F,B)(98) 00000001 -> FFFFFFFF [3] 7A(z)
2015.01.06 18:02:49 3: HM485_LAN: Alive: (9) 3032
2015.01.06 18:02:50 3: HM485_LAN: Alive: (8) 3031
2015.01.06 18:02:59 2: HM485_LAN: Discovery - canceled. No results found within 10 seconds!
2015.01.06 18:02:59 3: HM485_LAN: TX: (11) I[0](0,Y,F,B)(98) 00000001 -> FFFFFFFF [3] 5A(Z)
2015.01.06 18:02:59 3: HM485_LAN: TX: (12) I[0](0,Y,F,B)(98) 00000001 -> FFFFFFFF [3] 5A(Z)
2015.01.06 18:02:59 3: HM485_LAN: Alive: (12) 3032
2015.01.06 18:03:00 3: HM485_LAN: Alive: (11) 3031
2015.01.06 18:03:20 3: HM485_LAN: Alive: (13) 3030
2015.01.06 18:03:40 3: HM485_LAN: Alive: (14) 3030



Ich hoffe ich bin hier richtig und ihr könnt mir helfen.

gevoo

Hallo Ralf,

vom Prinzip her hast Du recht. Deine Anpassung ist aber nicht konform zu den Devicefiles. Ich versuche die Variante konform zu den Devicefiles zu machen. Das heißt, wenn sich die Config ändert, muß man nicht das ganze Programm umschreiben. Ich bitte Dich um einen Test und das Posten der logs.

Gruß gevoo

gevoo

Hallo Fred,

gehe ich richtig in der Annahme, daß Dein Gateway schon erkannt und geöffnet ist:
HM485_LAN State = open
Benutzt Du jetzt das HomeMatic RS485 LAN Gateway?
Poste bitte einmal von Deinem Gateway die Detailseite der Weboberfläche und den Ausschnitt aus der fhem.cfg

Gruß gevoo

RoBra81

Zitat von: gevoo am 07 Januar 2015, 20:18:01
vom Prinzip her hast Du recht. Deine Anpassung ist aber nicht konform zu den Devicefiles. Ich versuche die Variante konform zu den Devicefiles zu machen. Das heißt, wenn sich die Config ändert, muß man nicht das ganze Programm umschreiben. Ich bitte Dich um einen Test und das Posten der logs.

Hallo gevoo,

nix geht mehr...

Ronny

Ralf9

Zitat von: gevoo am 07 Januar 2015, 20:18:01
Hallo Ralf,

vom Prinzip her hast Du recht. Deine Anpassung ist aber nicht konform zu den Devicefiles. Ich versuche die Variante konform zu den Devicefiles zu machen. Das heißt, wenn sich die Config ändert, muß man nicht das ganze Programm umschreiben. Ich bitte Dich um einen Test und das Posten der logs.

Gruß gevoo

Hallo gevoo,

kann es sein, daß in der Device.pm noch ein Fehler steckt?
Es läuft nicht.

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

Fred

Hallo gevoo,

jetzt hängt gerade das HomeMatic RS485 LAN Gateway dran.

fhem.cfg:

define HM485_LAN HM485_LAN 10.10.10.69:1000
attr HM485_LAN hmwId 00000001
attr HM485_LAN room HM485


im Startup log steht folgendes:

2015.01.07 22:00:04 3: HM485_LAN device opened
2015.01.07 22:00:04 3: HM485_LAN: connected to device 10.10.10.69:1000
2015.01.07 22:00:04 3: HM485_LAN: Lan Device Information
2015.01.07 22:00:04 3: HM485_LAN: Protocol-Version: 01
2015.01.07 22:00:04 3: HM485_LAN: Interface-Type: eQ3-HMW-LGW
2015.01.07 22:00:04 3: HM485_LAN: Firmware-Version: 1.0.4
2015.01.07 22:00:04 3: HM485_LAN: Serial-Number: LEQ0123456
2015.01.07 22:00:04 3: HM485_LAN: Initialize the interface


Grüße
Fred

arestant

#728
Hallo Zusammen,

ich möchte mich gerne einbringen und beim testen unterstützen.

Ich habe den "HMW-IO-12-SW14-DR" in Verbindung mit Homematic RS485 LAN Gateway.

Auch ich kann bestätigen, dass die Relaisausgänge sich nicht ansteuern lassen.
Was ich schon mal festgestellt habe ist, dass wenn ich den Ausgang mit RAW Befehl anspreche, schaltet er wie gewünscht (nach der Anleitung in Wiki).

Logeinträge:

Versuch über Webinterface ON zu senden:
2015.01.07 23:43:52 4: HM485_LAN: TX: (56) I[1](0,F,B)(1A) 00000001 -> 000110BA [6] 73(s) 000000
nochmal das selbe:
2015.01.07 23:49:03 4: HM485_LAN: TX: (72) I[2](0,F,B)(1C) 00000001 -> 000110BA [6] 73(s) 000000

Schalten per RAW Befehl (ON)
2015.01.07 23:50:15 4: HM485_LAN: TX: (76) I[0](0,Y,F,B)(98) 00000001 -> 000110BA [6] 73(s) 000100
Schalten per RAW Befehl (OFF)
2015.01.07 23:51:12 4: HM485_LAN: TX: (79) I[0](0,Y,F,B)(98) 00000001 -> 000110BA [6] 73(s) 000000

Versuch über set <> ON zu schalten:
2015.01.07 23:58:04 4: HM485_LAN: TX: (101) I[3](0,F,B)(1E) 00000001 -> 000110BA [6] 73(s) 000000
noch mal:
2015.01.07 23:58:36 4: HM485_LAN: TX: (103) I[0](0,F,B)(18) 00000001 -> 000110BA [6] 73(s) 000000

Ich kenne mich mit dem Aufbau der Logmessage nicht gut aus, aber der Unterschied ist hier klar zu sehen.
Vor allem ist es interessant dass "HM485_LAN: TX: (101) I[3](0,F,B)(1E) 00000001 -> 000110BA [6] 73(s) 000000" dieses Byte sich unterscheidet, selbst wenn die Nachricht die selbe ist.
Bei RAW Befehl passiert es nicht.

Hoffe dass meine Information nützlich ist :)

Grüße
Paul

gevoo

Hallo Ronny, hallo Ralf,

Ihr habt recht. Hier die korrigierte Version.

Gruß gevoo

geri

hallo gevoo!

konnte keine veränderungen feststellen. anbei die logs.

gruss
Gerald
Raspberry mit COC für HM
RS485 USB für HMW

gevoo

Hallo Fred,

das sieht schon nicht schlecht aus. Wenn Du jetzt noch die Dateien aus http://forum.fhem.de/index.php/topic,10607.msg238202.html#msg238202 nimmst und in die entsprechenden Verzeichnisse kopierst und FHEM neu startest, sollte es noch besser aussehen.

Gruß gevoo

gevoo

Hallo Paul,

hast Du auch die dazu gehörigen log- Dateien?

Gruß gevoo

gevoo

Hallo Ronny, hallo Ralf,

was mir noch nicht klar ist: Warum braucht Ihr bei einem Channel vom Typ Key ein Reading? Um ein notify in Funktion zu setzem, reicht doch ein Event. Und das wird in jedem Fall vor dem Schreiben des Readings ausgelöst.

Gruß gevoo

RoBra81

Zitat von: gevoo am 08 Januar 2015, 18:19:20
was mir noch nicht klar ist: Warum braucht Ihr bei einem Channel vom Typ Key ein Reading? Um ein notify in Funktion zu setzem, reicht doch ein Event. Und das wird in jedem Fall vor dem Schreiben des Readings ausgelöst.

Ich brauche die Readings nicht, aber das Event - und das wird auch in der letzten Version nicht ausgelöst: ich habe den Taster OG.ku.WS.Tuer_1 (Kanal 05 von HMW_IO_12_Sw7_DR_JEQ0497826: 00009679_05) erst einmal kurz (Event kam) und dann mehrfach lange gedrückt und bei lange kam kein Event (Logs anbei).

Außerdem enthalten die Logs auch das von Paul beschriebene Vorgehen für den Relaisausgang HMW_IO_12_Sw14_DR_KEQ0048375_02 (0000C481_02):

set ON
set OFF
und dann on und off über RAW-Befehle.

Ronny