Forum: Haus & Smart Home KNX mit ATMEGA: Aufwand groß?


von Martin M. (martin69)


Lesenswert?

Hallo,

ich habe eine Klimaanlage, für die es ein KNX EIB Interface gibt 
(ME-AC-KNX-1-V2). Ich möchte die Klimaanlage mit meiner Haussteuerung 
bedienen.

Ich möchte hierzu ein Interface machen, das Schnittstelle zwischen 
meinem Hausbus und dem KNX EIB Interface ist. Die Realisierung soll z.B. 
mit einem ATMEGA 168 oder ATMEGA 128 erfolgen. Für KNX gibt es ja 
entsprechende Transceiver for KNX Twisted Pair Networks wie z.B. der 
NCN5120 von ON. Der hat RxD und TxD, die man mit dem Controller 
verbinden kann.

Ich denke hardwaremäßig hält sich der Aufwand in Grenzen. Aber der 
Softwareaufwand? Von Fa. Intensis gibt es eine Beschreibung zu dem KNX 
EIB Interface (hier sind Data type ID usw. angegeben). Kann das absolut 
nicht einschätzen, was da für ein Aufwand dahinter steckt. Hat jemand 
schon Erfahrungen mit KNX?

Gruß
Martin

: Verschoben durch User
von KNXProfi (Gast)


Lesenswert?

Hi Martin,

ich habe das bei mir schon gemacht.
Läuft seit 2006 (Hausbau) problemlos ohne Aussetzer.

Ist im Grunde genommen schon trivial, der Aufwand, einzelne Geräte 
anzusteuern, ist sehr gering. Aufwendiger wird das natürlich in einem 
Gesamtkonzept.

Bei mir ist die "Grundinstallation" des Hauses mit handelsüblichen 
KNX-Komponenten ausgeführt, also Taster, Aktoren, Bewegungs- und 
Präsenzmelder, Sensoren, etc., damit alles für den Fall des Falles von 
einem Dorf-Elektriker repariert werden kann (damit die Freundin nicht im 
dunklen Haus sitzt, wenn mal was defekt ist und ich mal auf 
Geschäftsreise bin...).
Für die Komfortfunktionen, Verknüpfungen sowie die Anbindung an die 
Außenwelt - Ethernet und GSM - habe ich damals einen kleinen 
Steuerrechner auf Cortex-M3-Basis (Luminary, heute Texas Instruments) 
gebaut. Dieser hängt zum einen am Ethernet, zum anderen am KNX. Die 
GUI-Logik für die Programmierung neuer Funktionen und Verknüpfungen 
läuft auf einer VM auf meinem Virtualisierungshost. Dieser überträgt 
dann Änderungen, welche ich per Browser machen kann, auf diesen 
Steuerrechner. Ebenso speichert die VM sämtliche Aktivitäten in einer 
PostgreSQL-Datenbank zur weiteren Auswertung.
Die Schnittstelle zum KNX habe ich über die SIM-KNX von Tapko gemacht:
http://www.tapko.de/SIM-KNX?&L=1
Für damals knapp 80,-€ eine prima Sache. Der Anschluß an den Cortex 
erfolgt über den UART. Die SIM-KNX kommuniziert über ein simples 
Klartext-Protokoll.
Man muss sich also anfangs nur die einen interessierenden Parameter der 
vorhandenen Geräte heraussuchen und schon kann man senden, die 
Gruppenadressen sind ja bekannt. Für das Empfangen gilt das Gleiche.

Wenn Du es Dir besonders einfach machen willst, kannst Du ja einfach den 
Busverkehr mitschneiden. Dann ersparst Du Dir sogar das Zusammensetzen 
der einzelnen Datenpakete. Ich konnte damals schon am ersten Tag 
sämtliche Lampen ein- und ausschalten sowie dimmen und auch die Rolläden 
und Jalousien verfahren.

Viel Spaß damit.
Grüße, Andreas

von Martin M. (martin69)


Lesenswert?

Hallo Andreas,

das SIM-KNX sieht sehr interessant aus. Ich habe noch etwas 
Verständnisprobleme mit dem KNX-Protokoll. Woher weiß ich z.B. die 
Adressen der Komponenten? Sind die aufgedruckt (wie z.B. bei 
Enocean-Komponenten)?

Busverkehr mitschneiden geht nicht, denn ich hätte dann ja nur das 
Interface ME-AC-KNX-1-V2 und das SIM-KNX. Weitere KNX-Komponenten hätte 
ich nicht.

Und was muß ich da genau senden z.B. zum Einschalten der Klimaanlage 
gibt es folgendes Objekt:

Object #:     0
Name:         On/Off [1bit]
Function:     1-On, 0-Off
Description:  This object is used to Start (On) and Stop (Off) the AC 
unit
Access type:  Read/Write
Data type ID: 1.001

Das 0 bzw. 1 für Ein- und Ausschalten ist schon klar, aber muß ich die 
Objektnummer oder die Data Type ID übergeben?

Gruß
Martin

von k.nix (Gast)


Lesenswert?

EIB ist aus den 80'ern, also schon recht alt. Daher ist das alles auch 
recht einfach. Infos gibt es bei den üblichen Verdächtigen wie Freebus 
und Selfbus.

Als Einstieg mit Atmel würde ich mir mal folgendes ansehen.

https://bitbucket.org/dka/arduino-tpuart

Ist aber mit TP-UART, wobei der NCN5120 im westentlichen dazu kompatibel 
ist.

von Martin M. (martin69)


Lesenswert?

Benötigt man zwingend die Software ETS, um die Adressen zu vergeben? 
Oder geht das auch anders?

: Bearbeitet durch User
von Chris T. (chris0086)


Lesenswert?

Du brauchst die ETS

von ObjectServer (Gast)


Lesenswert?

Hi!

Alternativ wäre evtl. auch das hier was für Dich:
http://www.weinzierl.de/index.php/de/alles-knx1/knx-module/knx-baos-modul-820

Der Vorteil ist, dass Du hier auch schon einen ObjectServer eingebaut 
hast.
Dann kann Dein AVR per UART direkt mit den Datenpunkten des ObjectServer 
sprechen.

Du hast dann praktisch gar nicht mehr wirklich was mit KNX zu tun.
Hier ist das Protokoll für den ObjectServer beschrieben:
http://weinzierl.de/download/products/870/KnxBAOS_Protocol.pdf

von Jörg S. (joerg-s)


Lesenswert?


von Uwe (Gast)


Lesenswert?

Hallo Martin,
Ja du brauchst zum programmieren der Gruppenadressen die ETS Software.
Da geht aber auch die Demo Version, die kann glaub ich max. 5 Geräte.
Zusätzlich brauchst du noch einen KNX-USB Adapter zum programmieren und 
ein KNX-Netzteil mit Drossel, auch nicht ganz billig.
KNX ist halt ein Bussystem und für eine Punkt zu Punkt Verbindung evtl. 
etwas oversized.
Gibts keine Möglichkeit die Daten direkt an der Klimaanlage abzugreifen?
Vielleicht hat darüber hier einer nähere Infos.

von ObjectServer (Gast)


Lesenswert?

Ich hatte damals den eCampus besucht und dadurch eine kostenlose ETS 
Lite Lizenz (max. 20 Geräte) bekommen:
http://wbt4.knx.org/

Ich weiß allerdings nicht, ob das mit der kostenlosen Lite-Lizenz noch 
aktuell ist.

von Jörg S. (joerg-s)


Lesenswert?

Uwe schrieb:
> ..und ein KNX-Netzteil mit Drossel, auch nicht ganz billig.
Kann man durch einen Widerstand emulieren, wenn nur ein paar Geräte am 
Bus hängen:
Beitrag "KNX Drossel Infos"




>Ich weiß allerdings nicht, ob das mit der kostenlosen Lite-Lizenz noch
>aktuell ist.
Hab ich vor einem 3/4 Jahr noch gemacht...

: Bearbeitet durch User
von Martin M. (martin69)


Lesenswert?

Uwe schrieb:
> KNX ist halt ein Bussystem und für eine Punkt zu Punkt Verbindung evtl.
> etwas oversized.
> Gibts keine Möglichkeit die Daten direkt an der Klimaanlage abzugreifen?
> Vielleicht hat darüber hier einer nähere Infos.

Für die Klimaanlage gibt es diverse Module, z.B. die Schnittstelle 
MAC-397IF-E. Externes Ein-/Ausschalten ist laut Doku kein Problem, 
ebenso Betriebszustand Ein-/Aus. Die Auswahl Solltemperatur und 
Betriebsart scheint nur per DIP-Schalter zu gehen (es gibt hierfür 
anscheinend keine Klemme). Bin noch am Klären mit Mitsubishi, ob man den 
DIP-Schalter eventuell "anzapfen" kann. Macht aber nur Sinn, wenn dieser 
zyklisch und nicht nur nach dem Netzreset ausgewertet wird. In wie weit 
ich da von Mitsubishi noch Detailinfos erhalte, muß ich abwarten. Meine 
Fragen müßten sicherlich an die Entwicklungsabteilung weiter geleitet 
werden, da zu speziell, und denen wird der Aufwand für die Beantwortung 
zu groß sein....

von Max G. (l0wside) Benutzerseite


Lesenswert?

Martin M. schrieb:

> Ich denke hardwaremäßig hält sich der Aufwand in Grenzen. Aber der
> Softwareaufwand? Von Fa. Intensis gibt es eine Beschreibung zu dem KNX
> EIB Interface (hier sind Data type ID usw. angegeben). Kann das absolut
> nicht einschätzen, was da für ein Aufwand dahinter steckt. Hat jemand
> schon Erfahrungen mit KNX?

Ich habe zu Fuß den KNX-Stack auf MSP430 implementiert, Aufwand im 
dreistelligen Stundenbereich. Für Detaillösungen geht es aber sicher 
auch schlanker. Ich nehme an, das war nicht ganz, was dir vorschwebte.

Schau mal nach RPi und ROT-Extension (-> Google). Darauf dann ein eibd, 
dazu ein KNX-Netzteil mit Drossel aus der Bucht. Fertig.

www.knx-user-forum.de ist auch hilfreich.

Max

von Franz (Gast)


Lesenswert?

Hallo Max,

hast du den Stack in C oder C++ implementiert und hast du die Sourcen 
irgendwo im Netz? Würde mich interessieren wie du das gelöst hast...

von Max G. (l0wside) Benutzerseite


Lesenswert?

Der Stack ist in reinem C, allerdings sind die einzelnen Layer streng 
gekapselt. C++ wäre mir lieber gewesen, war mir für eine portable 
uC-Bibliothek aber zu riskant.

Der Code ist nicht im Netz, Grund siehe hier: 
http://www.juraforum.de/forum/urheberrecht/closed-standard-open-source-461062

Max

von Franz (Gast)


Lesenswert?

alles klar, mir geht es jedoch nicht speziell um diesen knx stack 
sondern um stack implementierung im allgemeinen in C (osi layer) wo eben 
die layer streng getrennt sind (kein durchgreifen ect.) genau wie du es 
beschreibst.
Mir ist leider nicht ganz klar wie man das ralisiert, vielleicht 
könntest du nur einen layer und dessen services veröffentlichen damit 
ich prinzipiell sehe wie so etwas aussieht (gerne können die 
spezifischen teile unkenntlich gemacht sein...)
bin da schon lange auf der suche aber finde dazu nicht wirklich was 
passendes und wenn dann meist in C++, mir wäre damit sehr geholfen :)

von Max G. (l0wside) Benutzerseite


Lesenswert?

Ach so, kein Problem. Ich habe es so realisiert:

Jeder Layer hat seine eigenes C- und H-File.

Im H-File sind die Services, die er den darüber liegenden Layern 
anbietet, deklariert. Diese sind alle vom Typ void, die Antwort kommt 
asynchron per Callback, die über Funktionszeiger realisiert sind.

Außerdem hat jeder Layer noch ein void Layer_setCB(). Das sieht z.B. so 
aus:
1
void(*L4_Data_con)(address_t addr, status_t status) = 0;
2
void (*L4_Data_ind)(address_t addr, class_t cl, sdu_t *sdu) = 0;
3
4
void L4_setCB_Data(void(*L4_Data_con_)(address_t addr, status_t status),
5
    void (*L4_Data_ind_)(address_t addr, class_t cl, sdu_t *sdu)) {
6
  L4_Data_con = L4_Data_con_;
7
  L4_Data_ind = L4_Data_ind_;  
8
}

Der darüber liegende Layer definiert dann:
1
void on_Data_con(address_t addr, status_t status) {
2
  ...
3
}
4
5
void on_Data_ind(address_t addr, class_t cl, sdu_t *sdu) {
6
  ...
7
}

und ruft in seiner Initialisierungsroutine dann 
L4_setCB_Data(on_Data_con, on_Data_ind) auf.

In Layer 4 kann ich nun, wenn ich dem darüber liegenden Layer etwas 
mitteilen will, einfach
1
if (L4_Data_ind != 0) {
2
  L4_Data_ind(addr,cl,sdu);
3
}
aufrufen.

Das ist zwar sehr modular, weil man problemlos einen Layer durch eine 
andere Implementierung ersetzen kann.
Leider ist der Speicherbedarf auf dem Stack nicht ohne, weil jeder 
Aufruf erst mal Layer für Layer die Callbacks aufruft. Wenn dann noch 
eine Antwort Layer für Layer sich wieder abwärt wühlt, hast du 
2*Layerzahl gestapelte Funktionsaufrufe auf dem Stack. Effizient ist das 
nicht.

Beim nächsten Mal würde ich eher den Präprozessor quälen: bei Empfang 
eines Pakets Byte für Byte einen mittels Präprozessor aus den 
verschiedenen Layer-Headern zusammengebauten Baum traversieren und (so 
weit irgendwie möglich) vom Physical Layer dann direkt die eigentliche 
Applikation aufrufen. Das ist dann deutlich effizienter.

Max

Nachtrag: In C++ würde ich es eher so realisieren:

Layer 4:
1
class Layer4 {
2
public:
3
  (Services für Layer 5)
4
5
private:
6
  Layer4CB cb;
7
}
8
9
public abstract class Layer4CB {
10
  (Callbacks von Layer 4 nach Layer 5)
11
}

Layer 5:
1
class Layer5 : Layer4CB {
2
  (Services für Layer 6)
3
4
private:
5
  Layer4 *layer4;
6
}
7
8
public Layer5::Layer5() {
9
  layer4 = new Layer4();
10
  layer4->cb = this;
11
}

Das ist kein valides C++, aber die Idee wird hoffentlich klar: jeder 
Layer hat eine Klasse und zusätzlich eine abstrakte Callback-Klasse, die 
vom Layer darüber implementiert wird.

Max

: Bearbeitet durch User
von Franz (Gast)


Lesenswert?

hui danke für diese infos, so hab ich das noch gar nie betrachtet.... 
wenn ich das richtig verstehe wird beim Empfang über die cb rauf bis zur 
letzten schicht von oben herab runter gearbeitet und die daten werden 
von der entsprechenden application quasi abgeholt....
von oben nach unten, also beim Senden gehts direkt von schicht zu 
schicht?

von Max G. (l0wside) Benutzerseite


Lesenswert?

Exakt. Physical ruft den CB von datalink auf, datalink den CB von 
network, ... bis irgendwann application(7) den CB der eigentlichen 
Anwendung aufruft.

In der Regel wird die Anwendung dann im gleichen Kontext die Antwort 
auswürfeln und gleich senden, d.h. dieser Aufwand landet auch noch auf 
dem Stack.

Von obenn nach unten (also Anwendung->physical) wird einfach ganz normal 
aufgerufen.

Max

: Bearbeitet durch User
von Franz (Gast)


Lesenswert?

könnte man statdessen nicht einfach die layer entkapseln, also das sie 
nicht ineinander verschachtelt aufgerufen werden sondern jeder layer 
einzeln und somit seinen stack bereich wieder freigibt bevor der nächste 
startet? die etscheidung welcher service in dem darüberliegenden layer 
ausgeführt werden soll müsste dann natürlich dort anhand des pdu des 
vorangegangenen layers zuerst getroffen werden.
So hab ich das eigentlich bis jetzt immer im kopf gehabt, problem dabei 
ist das jeder layer quasi die inqueue pollen muss und ab layer 3 bekommt 
man dadurch je anzahl an ports, adressen, etc. entsprechend viele und es 
wird eine richtung bevorzugt da die reihenfolge halt fix vorgegeben ist 
wenn man kein os verwendet wo die layer in einzelne parallele tasks 
gepackt werden.
probleme über probleme :) leider hab ich noch nirgends literatur zu dem 
thema gefunden.....

von Max G. (l0wside) Benutzerseite


Lesenswert?

Der Ansatz ist auch ganz nett und würde das Stackproblem lösen. Willst 
du eine Queue für alles verwenden oder jeweils eine eigene Queue 
zwischen zwei Layern?

Performancemäßig dürfte der Ansatz aber noch schlechter sein, weil der 
Hintergrundtask an jedem Layer einmal vorbeikommen muss. Außerdem musst 
du dann in jedem Layer die Daten erst aus der Queue herauskopieren, 
verarbeiten und wieder in die Queue stellen. Das bedeutet vor allem 
zusätzliche Laufzeit wegen viel Kopiererei.

Es wäre aber mal definitiv was anderes. Du musst eben dich einmal 
entscheiden, was deine Designprioritäten sind: Speicherverbrauch, 
Laufzeit, Portabilität, Kapselung der Layer. Ist ein bisschen wie "fast, 
cheap, good - choose any two of them".

Die fixe Reihenfolge würde mir keine Sorgen machen. Stelle doch alles in 
eine gemeinsame Queue, unabhängig vom Layer. Am Anfang jedes Datensatzes 
kodierst du, welcher Layer das bearbeiten soll. Fertig.

Max

: Bearbeitet durch User
von Florian V. (florianv)


Lesenswert?

Max G. schrieb:
> Der Code ist nicht im Netz, Grund siehe hier:
> http://www.juraforum.de/forum/urheberrecht/closed-standard-open-source-461062
>
Die Antwort dort finde ich sehr merkwürdig. Wenn das Verfahren 
patentiert ist, dann sind die Patente öffentlich einsehbar. Das ist 
schon mal kein Argument gegen eine Veröffentlichung einer eigenen 
Implementierung. Weiterhin betreffen Patente Privatleute nicht, solange 
mit dem Werk kein Gewinn erzielt werden soll.

Denk' mal an die ganzen Open-Source mp3-Implementierungen. mp3 ist ein 
patentiertes Verfahren! Für die kommerzielle Nutzung muss/musste ganz 
real Geld bezahlt werden (bis das Patent abgelaufen ist). Das ist der 
Grund, warum viele Player im Linux-Bereich darauf angewiesen sind/waren, 
dass sich der Nutzer die Bibliotheken parallel runterläd und übersetzt. 
Problematisch wird es dann, wenn solche Open-Source Umsetzungen auf 
einmal im gewerblichen Umfeld eingesetzt werden.

Was evtl. problematisch sein könnte ist, wenn in der eigenen 
Implementierung fremde Hersteller-IDs verwendet werden, um z.B. in der 
ETS erkannt zu werden. Mit dem Problem kann man aber auch kreativ 
umgehen, siehe z.B. 
http://ixo-jtag.sourceforge.net/archive/ixo_de_usb_jtag.html

von Max G. (l0wside) Benutzerseite


Lesenswert?

Hallo Florian,

meine Sorge sind nicht die Patente, sondern der Urheberrechtsschutz. 
§53(1) 1. Satz lautet:
Zulässig sind einzelne Vervielfältigungen eines Werkes durch eine 
natürliche Person zum privaten Gebrauch auf beliebigen Trägern, sofern 
sie weder unmittelbar noch mittelbar Erwerbszwecken dienen, soweit nicht 
zur Vervielfältigung eine offensichtlich rechtswidrig hergestellte oder 
öffentlich zugänglich gemachte Vorlage verwendet wird.

Die Quelle ist eher dubios.


Der Sourcecode ist nach meiner (völlig unmaßgeblichen, IANAL) 
Einschätzung eine Ableitung aus einem bestehenden Werk, damit wäre §23 
UrhG einschlägig.

Auf der anderen Seite bestimmt §69a(1):
"Ideen und Grundsätze, die einem Element eines Computerprogramms 
zugrunde liegen, einschließlich der den Schnittstellen zugrundeliegenden 
Ideen und Grundsätze, sind nicht geschützt."

Darauf könnte man sich berufen, der Standard beschreibt schließlich nur 
Ideen und Grundsätze, nicht die Implementierung.


Insgesamt ist mir das aber zu heiß.

Max

von Horst (Gast)


Lesenswert?

Was ist mit dem eibd, der ist doch auch open source!?

von Max G. (l0wside) Benutzerseite


Lesenswert?

Ja, aber da steht die TU Wien dahinter. Und die ist Scientific Partner:
http://www.knx.org/knx-en/community/scientific-partners/list/index.php?q=country_id=202

Max

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.