PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Misterhouse EIB5 Außentemperatur



a20gate
22.10.07, 11:32
Moin,
ich habe scheinbar ein Problem mit Temperaturen unter 0°C. Die Außentemperatur habe ich als EIB5 angelegt. Unter 0°C kommt konstant folgender Wert: -1.84467440737095e+17.

21/10/2007 20:03:56 -1.84467440737095e+17 set_by=1.1.101target=$Aussentemperatur
21/10/2007 19:58:56 -1.84467440737095e+17 set_by=1.1.101target=$Aussentemperatur
21/10/2007 19:53:56 -1.84467440737095e+17 set_by=1.1.101target=$Aussentemperatur
21/10/2007 19:48:56 -1.84467440737095e+17 set_by=1.1.101target=$Aussentemperatur
21/10/2007 19:43:55 -1.84467440737095e+17 set_by=1.1.101target=$Aussentemperatur
21/10/2007 19:18:55 0.2 set_by=1.1.101target=$Aussentemperatur
21/10/2007 19:08:55 -1.84467440737095e+17 set_by=1.1.101target=$Aussentemperatur
21/10/2007 19:03:55 -1.84467440737095e+17 set_by=1.1.101target=$Aussentemperatur
21/10/2007 18:58:55 -1.84467440737095e+17 set_by=1.1.101target=$Aussentemperatur
21/10/2007 18:53:55 0.2 set_by=1.1.101target=$Aussentemperatur
21/10/2007 18:48:54 -1.84467440737095e+17 set_by=1.1.101target=$Aussentemperatur
21/10/2007 18:38:54 -1.84467440737095e+17 set_by=1.1.101target=$Aussentemperatur
21/10/2007 18:33:54 0.2 set_by=1.1.101target=$Aussentemperatur
21/10/2007 18:28:54 0.4 set_by=1.1.101target=$Aussentemperatur


Irgendwelche Ideen?

Gruß
Sven

RaK
22.10.07, 20:53
Berechnet wird der Wert in mh/lib/EIB_Items.pm in der Klasse EIB5 und deren Prozedur decode mit folgendem Code Sniplet:


my $sign = $data[1] & 0x80;
my $exp = ($data[1] & 0x78) >> 3;
my $mant = (($data[1] & 0x7) << 8) | $data[2];

$mant = -~($mant - 1) if $sign != 0;
$res = (1 << $exp) * 0.01 * $mant;Wenn mir jemand mal nen Link schickt wo das genaue Format von EIS5 erklaert ist, dann kann ich das mal checken.

Evt. sieht es ja auch jemand sofort ;).

Mike
23.10.07, 09:28
@RaK: Das Code Snippet sieht ganz ok aus. Die Beschreibung der EIS-Typen findet man in 3_7_1_Interworking Standards.pdf der EIB-Spezifikation Volume 3. Das gab's früher mal zum Download bei der EIBA.

@a20gate: Was hast du denn für einen Messwertaufnehmer. Kann es sein das der nur bis 0°C spezifiziert ist? Kannst du mal mit vbusmonitor1 o.ä. die Bus-Kommunikation für die Übertragung negativer Werte aufzeichnen?

Grüße
Mike

a20gate
23.10.07, 12:10
@Mike

Der Messwert kommt von einer Theben Wetterstation und wird auf einem Berker IQ korrekt angezeigt. Ich habe allerdings noch keinen Monitor mitlaufen lassen, da ich im Moment keinen Zugriff auf das System habe...

Gruß
Sven

RaK
23.10.07, 16:27
Ich debugge gerade den code. Für Werte unter 0 Grad komme ich auf "unsinnige" Werte, wenn ich das mit dem EIB Konverter von Tapko (http://www.google.de/url?sa=t&ct=res&cd=1&url=http%3A%2F%2Fwww.tapko.de%2Ftapko_main%2Fde%2F tools%2Fknx_converter.shtml&ei=__UdR9_8KImOxAHTw5GEDg&usg=AFQjCNGqXL_ItNqrL2zJgMKmhsmTgQABSg&sig2=gBVjNZ56818G8HJezwIHBg) vergleiche. Ich checke das und melde mich sobald ich was habe. Ich probiere das diese Woche hinzubekommen. LG

S. De Bruyne
23.10.07, 16:53
It's only a new name and a new approach to the same thing.
But, the Interworking for KNX (and EIB) can still be downloaded, following this link:
http://www.knx.org/fileadmin/downloads/03%20-%20KNX%20Standard/KNX%20Standard%20Public%20Documents/KNX%20interworking%20;%20Datapoint%20types.pdf

a20gate
23.10.07, 17:00
Nun das Coding bei Tapco sieht auch anders aus...


function Eis52Value(eis5)
{
value = eis5 & 0x07ff;
if ((eis5 & 0x08000) != 0)
{
value |= 0xfffff800;
value = -value;
}
value <<= ((eis5 & 0x07800) >> 11);
if ((eis5 & 0x08000) != 0)
value = -value;

return value;
}

function Value2Eis5(value)
{
eis5 = 0;
exponent = 0;

if (value < 0)
{
eis5 = 0x08000;
value = -value;
}
while (value > 0x07ff)
{
value >>= 1;
exponent++;
}
if (eis5 != 0)
value = - value;

eis5 |= value & 0x7ff;
eis5 |= (exponent << 11) & 0x07800;
return eis5 & 0x0ffff;
}

RaK
24.10.07, 18:35
Hast du mittlerweile einen Log von vbusmonitor? Mich wuerde interessieren was da wirklich ueber den Bus geht.

Der Code von Tapco verwirrt mich erst mal. Mein nächster Versuch wäre den Tapco Code zu implementieren und zu schauen was bei dir ueber den Bus geht. Ich habe leider noch keine Temperaturen <0 Grad ;).

LG

Mike
24.10.07, 18:51
Im Misterhouse kannst du direkt über den Web-Browser einen Wert losschicken und gleich wieder empfangen. Bei positiven Werten steht dann genau der Wert da, der auch gesetzt wurde. Bei negativen Werten kommt Schrott. Der Wert der dabei auf den Bus gesendet wird, wird von Tapko korrekt interpretiert.

Bei mir sieht das Setzen so aus:
http://..../mh/bin/SET;&html_list(group=$Weather)?$Aussentemp_Nord=-3.33
Weather und Aussentemp_Nord sind von mir definierte Gruppen/Objekte.

a20gate
24.10.07, 19:48
HIch habe leider noch keine Temperaturen <0 Grad ;). Jep ist leider zu warm :mad:

Könnt ihr eigentlich mit der ETS auf den Bus während der eibd läuft? Klappt bei mir nicht - sonst könnte man einfach mit der ETS was negatives senden?

@Mike
Dem Aufruf über misterhouse würd ich nicht trauen, der verbummelt vielleicht gleich zwei mal den Wert!?

Gruß
Sven

Mike
24.10.07, 20:34
Doch doch, dem Senden kann man vertrauen. Ich hatte den Wert den Misterhouse auf den Bus sendet mit Tapko geprüft. Das war ok.

Mike

Mike
24.10.07, 20:59
Das Problem für die falschen Werte kommt daher, da bei der 2er-Komplementbildung in Perl mit 32Bit gearbeitet wird, aber eigentlich ja nur die 11Bit gemeint sind. Ein Ausmaskieren der störenden Bits behebt dann das Problem.

In lib/EIB_Items.pm muss in der (schon oben gezeigten) Dekodierungsfunktion die Zeile:

$mant = -~($mant - 1) if $sign != 0; durch


$mant = -(~($mant - 1) & 0x7ff) if $sign != 0; ersetzt werden. Dann geht's.

Mike

RaK
24.10.07, 21:26
Das ist der Vorteil von OpenSource! Super.

Schickst du den Bugfix an die Mailingliste, oder soll cih das machen?

LG

Mike
24.10.07, 21:57
Ich schicke den Bugfix morgen los. Wobei ich Patches immer direkt an Mattr Williams schicke ...

Mike

Sallyvan
25.10.07, 18:25
Hallo,

Keine Ahnung auf welchem Stand die EIB_Items.pl sein müsste, aber kann es sein dass in der Orginalen (09/09/2005) die encode-Rountine für den EIS-Typ 5 fehlt. Mein MH sendet nämlich keinerlei EIS5-Werte auf den Bus, bei EIS6 funktioniert es aber.

Gruß

RaK
25.10.07, 20:23
Ich meine das ist so. Ich weiss nicht wer die geschrieben hat (war ich das?) ;). Ich meine ja, weil ich die Aussentemperatur übers Netz lese und von MH auf den Bus schicke. Dargestellt wird sie dann auf dem TS2+.


sub encode {
my ($self, $state) = @_;
my $data;

my $sign = ($state <0 ? 0x8000 : 0);
my $exp = 0;
my $mant = 0;

$mant = int($state * 100.0);
while (abs($mant) > 2047) {
$mant = $mant >> 1;
$exp++;
}

$data = $sign | ($exp << 11) | ($mant & 0x07ff);

return([0, $data >> 8, $data & 0xff]);
}

Sallyvan
25.10.07, 21:37
Perfekt! :respekt:

Endlich kann meine Frau sehen, wieviel Anrufe Ihr während ihrer Shopping-Tour entgangen sind.:D

Danke

a20gate
05.11.07, 12:17
$mant = -(~($mant - 1) & 0x7ff) if $sign != 0;

Hm, ich habe den Code entsprechend geändert, aber bei negativen Werten kommt noch immer das Falsche:
-1.84467440737095e+17

Funktioniert das bei euch?

Gruß
Sven

Sallyvan
05.11.07, 23:53
Ja, sieht bei mir ähnlich aus.

Ich erhalte auch Rundungsfehler. Wenn ich den Wert 125 senden will, wird 124.96 gesendet.



Hat schon jemand die 2.104 Version ausprobiert.
Wie es aussieht haben ja eine Reihe von Ralf's Änderungen Einzug gefunden. Also, Empfehlenswert ???

a20gate
06.11.07, 14:38
Moin,
ich hab eben nochmal einen kleinen Test gemacht...

1) Wetterstation sendet negativen Wert -> mh zeigt -1.84467440737095e+17 an
2) /mh/bin/SET;&html_list(group=$Wetter)?$Aussentemperatur=-3,33 -> mh zeigt -3.3 an

Gruß
Sven

Mike
06.11.07, 15:06
@Sallyvan
In jedem Fall sollte auf 2.104 aktualisiert werden. Immerhin sind da einige neue EIB Items hinzugekommen und auch ein paar Bugs gefixt.

@a20gate
Kannst du ermitteln, was auf dem Bus gesendet wird, wenn mh den falschen Wert anzeigt? Also mit vbusmonitor1 mal den Traffic mitschneiden ...

Mike

RaK
06.11.07, 20:56
2) /mh/bin/SET;&html_list(group=$Wetter)?$Aussentemperatur=-3,33 -> mh zeigt -3.3 an


Das heisst ja nur,dass MH sowohl beim codieren und decodieren den gleichen Fehler macht ;).

Sorry, ich kann das gerade nicht testen, bin ausser haus diese Woche.

Mike
06.11.07, 23:36
Ich kann das Problem nicht nachvollziehen. Ich habe mit -125.04, -6.6 und -0.4 getestet. Bei diesen Werten funktioniert es. Die Werte werden von ausserhalb, also zur Sicherheit ohne MH-Enkoder, gesendet.

Rundungsfehler sind ganz normal. Es sind ja nur 2 Bytes und damit lassen sich nicht alle Werte exakt darstellen.

Habt ihr mal die 2.104 ausprobiert? Dort ist die Änderung schon enthalten.

Gibt es noch jemand, bei dem es auch nicht funktioniert und der mal das Bus-Telegram dazu aufzeichnen kann?

Mike

a20gate
10.11.07, 10:30
So diese Nacht wars mal wieder kalt...

vbusmonitor1:

LPDU: BC 11 65 2E 01 E3 00 80 00 0A 71 :L_Data low from 1.1.101 to 5/6/1 hops: 06 T_DATA_XXX_REQ A_GroupValue_Write 00 0A
LPDU: BC 11 65 2E 01 E3 00 80 00 00 7B :L_Data low from 1.1.101 to 5/6/1 hops: 06 T_DATA_XXX_REQ A_GroupValue_Write 00 00
LPDU: BC 11 65 2E 01 E3 00 80 87 F6 0A :L_Data low from 1.1.101 to 5/6/1 hops: 06 T_DATA_XXX_REQ A_GroupValue_Write 87 F6
mh:

09/11/2007 21:07:33 EIB write from 1.1.101 to 5/6/1:: "0.1"
09/11/2007 21:12:33 EIB write from 1.1.101 to 5/6/1:: "0"
09/11/2007 21:17:33 EIB write from 1.1.101 to 5/6/1:: "-1.84467440737095e+17"
Tapco:
0.1
0
-0.1

Gruß
Sven

Mike
10.11.07, 12:40
Bei mir kommt:


2007-11-10 11:27:04 -0.1 set_by=0.0.0target=$Aussentemp_Nord
2007-11-10 11:26:59 0.1 set_by=0.0.0target=$Aussentemp_Nord
die 0° Meldung erscheint komischerweise nicht im Log (wenn man im Browser auf den Temperaturwert klickt).

Da steckt irgendwo der Wurm drin. Kannst du mir die ganze lib/EIB_Items.pm mal als PN schicken? Dann sehe ich mir das mal an. Vielleicht hast du dich irgendwo vereditiert :).

Alternativ versuche doch mal die Zeile richtig schrottig zu machen, um zu sehen ob du die richtige Datei geändert hast. Z.B. indem du einfach schreibst:
$mant = 0;. Dann sollte immer 0 rauskommen. Wenn was anderes herauskommt, dann warst du in der falschen Datei. Oder hol dir die EIB_Items.pm aus dem misterhouse-2.104 Paket.

Testen kannst du dann mit:


groupwrite ip:localhost 5/6/1 87 f6
dann sollte -0.1 ankommen.

Mike

a20gate
10.11.07, 13:13
Super Tipp: "$mant = 0;", das war mal wieder ein Eigentor... ich habe noch eine EIB_Items.pm unter mh-local/code.

Danke für die Geduld ;)

Gruß
Sven

commander
12.02.08, 15:51
Hallo Ihr Lieben,
ich hoffe ich poste hier im richtigen Thread...
ich will meinen Stromzähler (2byte, Zählwert) an mh übermitteln um dann die daten weiter in capti darzustellen.
Hierzu habe ich den stromzähler als EIB5 Item definiert.
Hier kommen jedoch nur werte mit komma raus. z.B. 45.21. (denke der EIB5 Typ ist nur für Temperaturen usw.)

Da ich mit mit der EIB Materie nicht so gut auskenne, habe ich ein wenig recherchiert und denke der Datentyp ist in der EIB_Item.pm noch nicht definiert.

Im KNX Dokument Interworking Datapoint types habe ich den richtigen gefunden.

Kapitel 9
2-octet unsigned value (nennt sich dann wohl EIS 10 unsigned Typ)

Kann jemand netterweise, diesen für mich in die EIB_Item.pm hineinprogrammieren?

Danke in Vorraus.

@Mike ich wohne in Deiner Nähe (Neuwied), hast Du mal Lust auf ein Treffen?

RaK
12.02.08, 15:55
Stehe bald vor dem gleichen Problem ,den ich habe mir einen neuen Binaereingang in der Bucht geschossen.

Wenn das noch nicht geht, dann gibt es bald eine Lösung ;).

Wenn es schnell gehen muss, dann empfehle ich eine Anfrage in der MH Mailingliste unter
http://www.nabble.com/Misterhouse---User-f14394.html

LG

commander
12.02.08, 16:11
@RaK
dringend ist es nicht. Ist halt nur für die Statistik um den Stromverbrauch zu sehen.

Würde mich freuen, wenn Du den EIS Typen implementieren könntest!

danke für den Tipp mit der mailingliste (bin da schon seit 2002 drin :-))

THANKS


Stehe bald vor dem gleichen Problem ,den ich habe mir einen neuen Binaereingang in der Bucht geschossen.

Wenn das noch nicht geht, dann gibt es bald eine Lösung ;).

Wenn es schnell gehen muss, dann empfehle ich eine Anfrage in der MH Mailingliste unter
http://www.nabble.com/Misterhouse---User-f14394.html

LG

RaK
12.02.08, 22:45
@commander:
Probier mal folgendes in EIB_Items.pm hinzuzufuegen (ne Sicherheitskopie ist nie ne schlechte Idee!) und sende aus der ETS mal einen EIB10 Wert. Erst mal einen positiven und später einen negativen.

@all: Kann mir einer der den EIB Standard kennt mal erklären wie ich auf dem Bus unterscheide, ob es sich um einen signed oder unsigned Wert handelt. In der Interworking Standards.pdf finde ich dazu nichts. DOrt ist unter EIS10 beides definiert.

In MH muesste er mit den paar Zeile ankommen. Teste das mit ein paar print_log zeilen.

Obs funktioniert kann ich erstmal nicht garantieren ;). Hab keinen EIB10 Aktor und keine ETS parat, oder kann man nen TS2+ so konfigurieren, dass er bei Tastendruck auf eine Wippe einen festen EIB10 Wert sendet?



# EIB10_Item: 16-bit signed integer

package EIB10_Item;

@EIB10_Item::ISA = ('EIB_Item');

sub eis_type {
return '10';
}

sub decode {
my ($self, @data) = @_;
my $res;

unless ($#data == 2) {
&main::print_log("Not EIS type 10 data received for $self->{groupaddr}: \[@data\]") if $main::config_parms{eib_errata} >= 2;
return;
}
my $sign = $data[1] & 0x80;
my $res = (($data[1] & 0x7f) << 8) | $data[2];
$res = -(~($res - 1) & 0x7fff) if $sign != 0;

&main::print_log("EIS10 for $self->{groupaddr}: >$res<");
return $res;
}

commander
13.02.08, 10:21
@Rak
habe den Code eingefügt und jetzt kommen "vernünftige Werte".

Ich bin nicht im Haus und kann erst heute Abend vergleichen ob die ETS im Gruppenbusmonitor die gleichen Zahlen darstellt.

Ich habe mal versucht über Browser einen negativen Wert zu senden, das funktioniert jedoch nicht (ich probier es heute abend mit der ETS)

http://nglux:8080/bin/SET;&html_list(group=$messwerte)?$stromzaehler=-50

Hier die stats von mh im browser als Bsp:
Stromzaehler states
13/02/2008 09:15:52 30023 set_by=1.1.55target=$stromzaehler
13/02/2008 09:15:46 -50 set_by=web [192.168.1.12]target=$stromzaehler
13/02/2008 09:15:38 30022 set_by=1.1.55target=$stromzaehler
13/02/2008 09:15:25 30021 set_by=1.1.55target=$stromzaehler
13/02/2008 09:15:12 30020 set_by=1.1.55target=$stromzaehler
13/02/2008 09:15:00 30019 set_by=1.1.55target=$stromzaehler
13/02/2008 09:14:47 30018 set_by=1.1.55target=$stromzaehler
13/02/2008 09:14:34 30017 set_by=1.1.55target=$stromzaehler
13/02/2008 09:14:20 30016 set_by=1.1.55target=$stromzaehler
13/02/2008 09:14:07 30015 set_by=1.1.55target=$stromzaehler

Hut AB! Finde echt toll das Du Dir netterweise die Zeit genommen hast

Grüsse

RaK
13.02.08, 10:43
Senden aus MH raus geht nicht auf den Bus, da die entsprechende Routine noch nicht geschrieben ist!

Bisher habe ich nur decode geschrieben (vom Bus zu MH). encode muss ich noch schreiben. Wollte nur erstmal testen ob das so funktioniert.

Teste das mal mit den negativen Werten aus der ETS heraus. Ich bin zuversichtlich, dass das funktioniert.

Und soviel Arbeit ist das nicht gewesen. Waren ja nur drei neue Zeilen und ein wenig Copy&Paste. Der Rest (Variablen anlegen usw.) ist recht clever über objektorientierte Klassen gelöst.

Wenn das funktioniert aus der ETS, dann mache ich mich an das Senden aus MH.

LG

commander
13.02.08, 10:45
nochmals danke
ich werde es heute abend testen

grüsse

commander
13.02.08, 13:22
@rak
ich bin gerade zuhause und habe über die ets versucht den datentyp 7.001 2byte zähler ohne vorzeichen zu senden (eine negative zahl: -50)
doch die ets lässt dies nicht zu und sagt bitte wert zwischen 0-65535 einzugeben.

wenn ich einen anderen datentyp wähle: 2byte und dann -50 sende passiert was:
der gruppenmonitor der ets zeigt mir dann CE 00 | -2621,44 an

mh zeigt im log an:
13/02/2008 12:20:48 EIB write from 1.1.30 to 0/1/8 : "2"
13/02/2008 12:20:49 EIS10 for 0/6/3: >-12800<


hoffe diese Infos helfen Dir
grüsse

commander
13.02.08, 13:28
zur info,
ich verwende für den stromzähler eine

berker Universallschnittstelle 4-fach

mit der Funktion Binäreingang und dieser zählt die Impulse des S0-Ausgangs meines Stromzählers mit den werten 0-65535

RaK
13.02.08, 14:46
Wenn dein Aktor nur 16bit unsigned int sendet, dann implementieren wir das doch auch so ;).



# EIB10_Item: 16-bit unsigned integer

package EIB10_Item;

@EIB10_Item::ISA = ('EIB_Item');

sub eis_type {
return '10';
}

sub decode {
my ($self, @data) = @_;
my $res;

unless ($#data == 2) {
&main::print_log("Not EIS type 10 data received for $self->{groupaddr}: \[@data\]") if $main::config_parms{eib_errata} >= 2;
return;
}
my $res = ($data[1] << 8) | $data[2];

&main::print_log("EIS10 for $self->{groupaddr}: >$res<");
return $res;
}

Der encode Part kommt entweder heute abend, oder nächste Woche. Bin ab morgen auf einer Schulung.

Aber den Wert vom Bus kannst du schon mal in MH auswerten. Das ist doch schon mal was. Ich freue mich auf das Stromverbrauchspostprozessing Code Sniplet, dass du jetzt schreibst ;). Halt mich im Loop.

LG

RaK
13.02.08, 22:20
sub encode {
my ($self, $state) = @_;

return([0, ($state & 0xff00) >> 8, $state & 0xff]);
}


Damit sollte auch das Senden aus MH heraus funktionieren. Teste es mal und berichte ob es klappt.

That's it. Have Fun.

commander
14.02.08, 14:01
Ich schaue heute abend mit der ets im gruppenmonitor bus ob da die zahl gesendet wird.
danke

@Rak, ich habe leider keine Zeit für ein "Code" Snippelt für mh um den Stromverbrauch anzuzeigen, bzw bin leider nicht fitt im perl programmieren...

Was ich bis jetzt gemacht habe ist, das ich mhsend missbrauche um die Daten an cacti weiterzugeben und lasse mir dort den stromverbrauch anzeigen.

werde später mal posten, wie ich das gemacht habe...
grüsse

commander
15.02.08, 20:56
Hi RaK,
senden geht auch.
Dann kannst Du den Code bitte der mh Mailingliste zur Verfügung stellen
Grüsse





sub encode {
my ($self, $state) = @_;

return([0, ($state & 0xff00) >> 8, $state & 0xff]);
}
Damit sollte auch das Senden aus MH heraus funktionieren. Teste es mal und berichte ob es klappt.

That's it. Have Fun.

spiderp2351
20.12.08, 14:06
Habe über Linux und eidb usw. eine Zimmertemparatur wert wie folgt:

0C29 = 21.3 Grad laut http://www.tapko.de/index.php/Tools/31/0/

Habe im Misterhouse die Funktion gefunden

Datei EIB_Items.pm

sub decode {
my ($self, @data) = @_;
my $res;

unless ($#data == 2) {
&main: print_log("Not EIS type 5 data received for $self->{groupaddr}: \[@data\]") if $main::config_parms{eib_errata} >= 2;
return;
}
my $sign = $data[1] & 0x80;
my $exp = ($data[1] & 0x78) >> 3;
my $mant = (($data[1] & 0x7) << 8) | $data[2];

$mant = -(~($mant - 1) & 0x7ff) if $sign != 0;
$res = (1 << $exp) * 0.01 * $mant;
return $res;
}


Meine Frage was steht denn in $data[1] und $data[2] in Bezug auf meinen Wert 0C29 oder kann ich das garn nicht so rechnen ? Ich nehme an, wenn die @data richtig befüllt wurde steht dann in $res = 21.3 oder ?

Bitte um kurze Hilfe. Danke