Hallo Zusammen,
ich habe vor meinen Hausbus auf Basis von UDP Broadcasts aufzubauen.
Somit benötige ich keine zentrale Instanz und kann trotzdem sehr leicht
die MediaPCs, Handys und Tablets mit einbinden. Für die Mikrocontroller
gesteuerten Aktoren wird es dann ein Gateway geben, das die UDP Pakete
transparent auf einen Mikrocontroller freundlichen Bus weiterreicht
(RS485 oder was auch immer) und auch umgekehrt.
Hat das hier schon mal jemand realisiert? Oder gibt es evtl. gute Gründe
die gegen ein solches Vorhaben sprechen?
Vielen Dank schon mal für das Feedback
Philipp
Gründe dagegen:
UDP: Geht ein Paket verloren ist es weg - kein retransmit etc
--> TCP unterstützt das, jedoch sollte ein Multicast nicht so einfach
sein wie bei UDP
Ethernet braucht viel Strom, wenn es nur wenige Schnittstellen
Ethernet->RS 485 sind, dann problemlos (wenn TCP verwendet wird, gibt es
das quasi schon fertig: AVR NET IO+Ethersex+Y-Port)
So nun angemeldet :)
Vielen Dank für den Kommentar.
Zu Punkt 1: Auf UDP geht das Paket zwar verloren, aber ebenso auf dem
RS485. Das heißt das Hausbusprotokoll selbst muss für die
Datensicherheit sorgen. Ich benutze UDP also quasi wie den
physikalischen Layer bei RS485 (wird wohl eher etwas mit CAN
Transceivern direkt am UART werden).
Zudem habe ich bei TCP wieder eine Punkt zu Punkt Verbindung, bei der
ich so etwas wie die IP Adresse des Gegenüber kennen muss und ich kann
es auch nicht auf RS485 oder anderen Layern ohne weiteres Abbilden.
Zum Stromverbrauch: Aus diesem Grund noch die anderen physikalischen
Layer. Also RS485 und höchstwahrscheinlich auch RFM12. Es sind also nur
Ethernetknoten angeschlossen, die ohnehin schon existieren. Also die
Media PCs, Handy, Tablet und Notebooks. Dazu kommt nur ein Raspberry Pi
der die Brücke realisiert.
So ist es dann möglich, dass zB das Tablet direkt die "Ich bin fertig"
Nachricht der Waschmaschine empfangen kann, obwohl diese über ein RFM12
Modul gesendet wurde. Der Pi hat es empfangen und den kompletten Inhalt
des Pakets einfach über UDP gebroadcastet. Er muss dazu nichts von einer
Washmaschine wissen, eigentlich sogar nicht mal das Hausbus-Protokoll
können. Somit spielt sich das eigentliche Hausbus Protokoll nur im
Payload der einzelnen Layer ab. Wichtig ist nur, dass die Pakete der
unterschiedlichen Layer die kompletten Daten transportieren können.
Sollte der Pi mal ausfallen, könnte man entsprechende Interfaces (z.B.
RFM12) ans Notebook stecken und keiner im Bus würde merken, dass die
Brücke nun woanders läuft.
Viele Grüße
Philipp
Philipp schrieb:> Für die Mikrocontroller> gesteuerten Aktoren wird es dann ein Gateway geben, das die UDP Pakete> transparent auf einen Mikrocontroller freundlichen Bus weiterreicht
Meine Mikrocontroller können direkt ans Ethernet angeschlossen werden.
Das teuerste an der Geschichte, die Du da siehst, ist die
Ethernetbuchse. Die andere Buchse ist für den ICD3. Die Größe des Moduls
wurde durch den DIL64-Sockel bestimmt, es geht also noch kleiner. IOs
sind mehr als genug vorhanden, und die gängigen Internetprotokolle auch.
Das wäre die Alternative.
fchk
Schau Dir mal Ethersex und ZBus an. Das ist im Grunde IP über RS485.
Damit kannst Du massenweise Geräte per TCP/IP (also sowohl TCP als auch
UDP) erreichen, ohne überall Ethernetkabel zu verlegen und überall
Ethernet-Übertrager, PHYs etc. zu verbauen.
Funktioniert bei mir problemlos mit kleinen und großen Atmegas. Halt nur
keine Geschwindigkeitsrekorde, aber das ist im Hausbus-Bereich ja normal
nicht nötig.
@Frank K.: Dein Board sieht richtig chic aus. Damit würde ich ja gerne
mal bisschen rumspielen. Hast du das zufällig schon mal irgendwo
"veröffentlich" oder bleibt das Layout und der Quellcode in deiner
Schublade?
Gruß tu
Schau Dir das hier an, gleicher Chip, nur eben noch etwas mehr drumrum.
https://www.olimex.com/Products/PIC/Proto/PIC-P67J60/
Der Controller hat praktisch alles erforderliche eingebaut, Du musst nur
noch die Ethernetbuchse, 25 MHz Quarz und 3.3V und einige R,L,C
anschließen. Einfacher, kleiner und billiger gehts nicht.
Die Software gibts bei Microchip, da brauchst Du gar nicht mehr viel
selber machen.
http://www.microchip.com/MAL
fchk
@Frank: Wie sieht es denn mit dem Energiebedarf Deines Moduls aus? Ich
war von Ethernet für die kleinen Knoten abgerückt, weil ich gesehen habe
wie viel Strom mein AVR-NET-IO benötigt.
@Gerd: Danke für den Hinweis, ich werde mal rüberschauen, aber ich
denke, dass ich an meinen Hausbus eher andere Anforderungen habe als
sich problemlos mit TCP realisieren lassen. Möchte zB einfach in den Bus
fragen können, wer alles hier im Wohnzimmer ist (also an Modulen). Oder
ich möchte, dass alle Lampen eines bestimmten Raums ausgeschaltet werden
ohne mir darüber Gedanken machen zu müssen wie viele Lampen es dort gibt
und welche Adressen diese haben. Ich habe vor es eher wie auf einem CAN
Bus (also mit Events) zu realisieren, anstatt Punkt zu Punkt
Verbindungen mit TCP aufzubauen.
Generell ging es mir hier im Thread auch weniger über den physical
layer. Das gibt es ja schon in vielen anderen Threads und bei mir steht
da eigentlich schon fest, dass mindestens RFM12 Funk dazukommen soll.
Wenn Franks Lösung energiesparend ist, dann ist es auch sehr
interessant, aber das ändert an dem eigentlichen Bus ja nicht wirklich
was. Viel eher als die Hardware würde mich interessieren wie Eure
Busprotokolle so aufgebaut sind.
Viele Grüße
Philipp
Philipp C. schrieb:> @Frank: Wie sieht es denn mit dem Energiebedarf Deines Moduls aus? Ich> war von Ethernet für die kleinen Knoten abgerückt, weil ich gesehen habe> wie viel Strom mein AVR-NET-IO benötigt.
Ganz wenig ist das nicht, leider. Ich habe mal 0.6W gemessen, wobei 90%
für den Ethernet PHY draufgingen. Das wird beim AVR-NET-IO wohl ähnlich
sein, wobei dort die Leistungsaufnahme wegen 5V-Technik noch etwas höher
sein dürfte.
Bei mir spielt das aber keine so große Rolle, so viele Knoten habe ich
nicht.
fchk
Hmm, das ist wirklich ne Menge. Der ganze Raspberry Pi braucht im Idle
keine 2W (380mA@5V) und da habe ich einen ganzen Linux Server.
Wobei irgendwelche China Dimmer mit Fernbedienung wahrscheinlich auch
nicht weniger brauchen als Deine Module, wenn die auf die Fernbedienung
warten.
Wie realisierst Du bei Dir die Kommunikation? Sprichst Du einzelne
Knoten direkt per IP an und baust eine TCP Verbindung auf? Und hast Du
da dann ein spezielles Protokoll um die Funktionen der einzelnen Knoten
zu nutzen oder ist das universell gehalten?
Viele Grüße
Philipp
Moin Philipp,
es geht dir doch vielmehr um die Adressierung, oder? Ich würde
behaupten, dass das eine Aufgabe vom Network-Layer ist. UDP befindet
sich ja einen Layer darüber, also im Transport-Layer.
Wie wäre es, wenn du dich einfach bei ein paar Ideen von IPv6 bedienst?
Dort gibt es keinen Broadcast mehr an alle, sondern nur noch Multicast.
Jeder Node hätte somit einerseits eine feste Adresse und zusätzlich noch
n Multicast-Adressen. Bspw. eine Multicast-Adresse für alle Lampen im
Haus, eine für alle Lampen im Wohnzimmer, eine für alle Lampen in der
Küche, ... usw. Somit kann man beliebig viele Gruppen von Aktoren
bilden, die sich auch überschneiden können.
Ein Lichtschalter könnte dann das Signal "Schalte dich aus" an entweder
die jeweilige feste Adresse senden, oder eben an eine Multicast-Adresse.
Als Absender wird dann die feste IPv6 des Schalters genutzt. Somit kann
man den Ursprung der Nachricht auch jederzeit zurückverfolgen.
Ein Abfragen von Sensoren ist dann ebenfalls möglich: Entweder per
Unicast oder wieder durch eine Multicastgruppe. Somit könnte man mit
einer einzigen Nachricht bspw. alle Temperaturen in allen Räumen
einsammeln. (Entsprechend kommen auf eine Anfrage mehrere Antworten
rein. Jeweils eine von einer immer klar identifizierbaren
Absender-Adresse.)
Ein Discovery von allen angeschlossenen Nodes kann man ebenfalls darüber
realisieren.
Ob du die Datagramme nun via UDP überträgst oder über was anderes, ist
deine Sache. UDP hat sowas wie Checksummen - das könnte vielleicht ganz
praktisch sein, damit du deine automatische Kaffeemaschine nicht wegen
eines gekippten Bits auf eine falsche Uhrzeit programmierst und
wohlmöglich der Morgenkaffee entweder schon kalt oder noch gar nicht
fertig ist ;)
Im Physical Layer kannst du irgendein shared Medium nutzen, was dir die
Nachrichten überträgt. Wie du letztlich nun Kollisionen verhinderst oder
detektierst liegt an der verwendeten Technik. Wenn du CAN benutzt,
könntest du sogar QoS umsetzen! Denn das erste Feld ist das
Versions-Feld (bei allen Frames gleich) und das zweite die Traffic
Class. Somit tritt dabei erst der der Traffic Class der erste
Unterschied zwischen den Frames auf. Ich kenne mich mit CAN kaum aus,
aber ich meine, dass sich gewissen Bits durchsetzen, richtig?
Wenn du Probleme mit der Last auf dem Bus bekommen solltest, könntest du
sogar Routing bzw. Subnetting betreiben. Du müsstest dann nur beachten,
die Multicasts jeweils entsprechend zu propagieren. (Die Profis machen
das übrigens mit dem Protokoll IGMP ... damit meldet man
"Multicastbedarf" für ein Subnet beim Router an.)
Der Ansatz mit IPv6 hätte auch den Vorteil, dass du recht leicht Router
zwischen deinem CAN und deinem Ethernet / WLAN bauen kannst und damit
auch per Tablet steuern kannst. (von iPads / iPhones weiß ich, dass sie
standardmäßig - auch wenns nirgends in der Einstellungen zu finden ist -
auch IPv6 mitmachen sofern ein Router im Netz ist, der advertised wird.)
Das wären nun meine Gedanken zu deinem Vorhaben. Derzeit bin ich dabei
IPv6 auf die kleinen AVRs zu bringen - jedoch ruht dieses Projekt wegen
absoluten Zeitmangel seit Monaten. Es ist aber schon mal um einiges
einfacher zu portieren als IPv4, da im Gegensatz zu v4 keine Checksummen
über den Header mehr in den Frames drin sind. (Muss also irgendwie auf
PHY-Layer gesichert werden ...) Ebenso kann man der Übermittlungsstrecke
verklickern, dass man bitte keine fragmentierten Pakete haben will. Sehr
praktisch, da man das bei v4 noch immer irgendwie bedenken sollte (Habe
ich aber nie gemacht ;)).
Wenn du magst halte ich dich ein wenig über meinen IPv6-Stack auf dem
laufenden. Was ich bisher habe, möchte ich lieber noch nicht
veröffentlichen. Einerseits grottig dokumentiert, andererseits buggy.
Zum Debuggen habe ich mir kürzlich ein Switch mit Port-Mirroring
bestellt - hoffentlich finde ich dann heraus, was das Problem ist.
Ich hoffe, das war für dich irgendwie teilweise brauchbar und ich habe
jetzt nicht absolut an deinem Problem vorbei gesponnen.
Grüße
Jürgen
Philipp C. schrieb:> Wie realisierst Du bei Dir die Kommunikation? Sprichst Du einzelne> Knoten direkt per IP an und baust eine TCP Verbindung auf? Und hast Du> da dann ein spezielles Protokoll um die Funktionen der einzelnen Knoten> zu nutzen oder ist das universell gehalten?
Ich gehe da mit einem Browser drauf und schalte die Sachen, die ich
brauche. Daher brauchte ich mir auch keine Gedanken über irgendwelche
Busprotokolle zu machen.
fchk
@Jürgen: Ja das klingt genau nach dem was ich mir vorgestellt habe :).
Ich betrachte UDP wie gesagt einfach nur als einen Ersatz für den Draht,
bzw. die Luft die ich auf den anderen phys. Layern habe. Möchte mich
also gar nicht auf irgendwas von UDP verlassen, weil ich es nicht
überall habe.
Mit CAN habe ich einiges an Erfahrung. Im Prinzip sehr schön, nur wenn
man rein Eventbasiert bleibt, dann sind einige Dinge umständlich
abzubilden und der Haupt KO-Grund sind die max. 8Byte Payload. (Ja ich
weiß man könnte Pakete zusammenbauen, habe auch mal einen Bootloader im
Auto über CAN realsiert, aber schön ist das nicht). Daher werden es CAN
Transceiver am UART. So kann ich im Gegensatz zu RS485 sicher
Kollisionen erkennen und habe trotzdem die Vorteile der differenziellen
Übertragung. Außerdem habe ich noch etliche CAN Transceiver rumliegen.
Das spart den CAN Controller und ich kann mehr Payload transportieren.
Der Ansatz mit der Adressierung über diverse Multicast Adressen gefällt
mir ganz gut. Ich hatte erst überlegt, die Adressen so aufzubauen, dass
sie ungefähr so aussehen wie <RAUM><ModulID> und wenn die ModulID auf
0x00 ist, dann ist es halt ein Broadcast an alle Module des Raums. Aber
damit lässt sich dann wieder nur schwer "alle Lichter des Raums"
abbilden. Mit deinem Ansatz könnte man dann mit seiner Unicast Adresse
Antworten und hätte beim "Lichter Discover" auch gleich alle Knoten
gefunden. Bleibt nur noch die Frage, wie ein Broadcast (naja, eigentlich
Multicast) an alle Lichter des Wohnzimmers aussieht? Dieser darf ja
nicht alle Lichter des Hauses treffen und auch nicht alle Module des
Wohnzimmers.
Oder wäre ein Dimmermodul im Wohnzimmer nach Deinem Ansatz dann einfach
in alle diesen Gruppen:
- Wohnzimmer
- Licht
- Wohnzimmerlicht
?
Das können dann ne ganze Menge Gruppen werden und man müsste vorher
wissen was man wohl mal zusammenfassen will.
Viele Grüße
Philipp
Ich mache das komplett über Broadcasts. Die Module müssen sich dann
rausfischen, welche Info für sie ist und welche nicht.
Jedes Modul im Wohnzimmer weis dann z. B. das es auf "Wohnzimmerlicht
an" reagieren muss, eines weis dann eben auch, dass es zusätzlich auf
"Deckenleuchte-Wohnzimmer an" reagieren muss.
Ausserdem wird zum Beispiel die Aussentemperatur regelmässig als
Broadcast versendet. Alle Module kennen die dann, und die
Heizungsregelungsbausteine können die dann verwenden. Eigentlich ähnlich
wie bei CAN.
Gruss
Axel
Ja, ich bin mehr und mehr davon angetan es auch so zu machen.
@Axel: Wie sieht denn bei Dir das weitere Protokoll so aus? Muss ein
Client, der mit einem Knoten spricht für jeden neuen Knoten erweitert
werden oder gibt es "Felder" die eine Bezeichnung und einen Wert haben
können?
Ich hätte das Protokoll gerne möglichst flexibel und würde ungern
jedesmal den Client anfassen, wenn ein Knoten mit neuen Funktionen
dazukommt.
Viele Grüße
Philipp
Philipp C. schrieb:> Mit CAN habe ich einiges an Erfahrung. Im Prinzip sehr schön, nur wenn> man rein Eventbasiert bleibt, dann sind einige Dinge umständlich> abzubilden und der Haupt KO-Grund sind die max. 8Byte Payload. (Ja ich> weiß man könnte Pakete zusammenbauen, habe auch mal einen Bootloader im> Auto über CAN realsiert, aber schön ist das nicht). Daher werden es CAN> Transceiver am UART. So kann ich im Gegensatz zu RS485 sicher> Kollisionen erkennen und habe trotzdem die Vorteile der differenziellen> Übertragung. Außerdem habe ich noch etliche CAN Transceiver rumliegen.> Das spart den CAN Controller und ich kann mehr Payload transportieren.
8Byte Payload sind nicht sehr viel. Da kannst du gerade mal eine halbe
IPv6-Adresse unterbringen :D
Du kannst dir das Protokoll natürlich designen, wie du möchtest: Kürzere
Adressen bspw. Nur wenn du mit einen echten IPv6-Teilnehmern aus dem
Ethernet sprechen möchtest, muss dein Router eine Umsetzung zwischen dem
IPv6 light (ich nenns mal so) und IPv6 machen.
Ich hatte mal über ein Bus-System nachgedacht, dass CAN recht nahe
kommt. Als NIC hatte ich mir ein kleines, günstiges, nicht-flüchtiges
FPGA vorgestellt. Das kann dann auch gleich den IPv6-Stack mitmachen und
den dahinter geschaltete µC nur in dem Fall aufwecken, wenn tatsächlich
Daten für ihn vorliegen. Ebenso kann es auf der anderen Seite des Stacks
die Kollisionskontrolle usw. machen. Ggf. sogar noch eine
Manchester-Codierung dazupacken - dann klappt es auch ganz gut mit der
Taktrückgewinnung. PLLs sind ja Standard auf FPGAs ...
Ich bin mir nur nicht ganz sicher, wie ich den Bus-Zugang hinbekomme.
Entweder mit zwei RS485-Transceivern (einer im Modus "Senden" und einer
im Modus "Empfangen") oder ich baue selber etwas mit OpAmps und
Schmitt-Triggern. Kollisionen könnte ich dadurch erkennen, dass ich
sende und gleichzeitig den Bus abhöre und das gesendete mit dem
abgehörtem vergleiche.
Aber das sind alles nur Gedankenspielereien. Natürlich mal wieder wo
anders abgeguckt: Ethernet (also das 10MBit-Zeug) hat mir Manchester
übertragen.
(Abgesehen davon steigt mir mein Vermieter unters Dach, wenn ich seine
Wohnung komplett umkremple und den Bus hier reinziehe ^^)
Wie löst CAN denn die Kollisionsdetektion bzw. die Kollisionsvermeidung?
Oder ist die Baud-Rate so niedrig, dass ein Sendesymbol sich vollständig
auf dem Bus ausbreiten kann, bevor das nächste kommt?
> Der Ansatz mit der Adressierung über diverse Multicast Adressen gefällt> mir ganz gut. Ich hatte erst überlegt, die Adressen so aufzubauen, dass> sie ungefähr so aussehen wie <RAUM><ModulID> und wenn die ModulID auf> 0x00 ist, dann ist es halt ein Broadcast an alle Module des Raums. Aber> damit lässt sich dann wieder nur schwer "alle Lichter des Raums"> abbilden. Mit deinem Ansatz könnte man dann mit seiner Unicast Adresse> Antworten und hätte beim "Lichter Discover" auch gleich alle Knoten> gefunden. Bleibt nur noch die Frage, wie ein Broadcast (naja, eigentlich> Multicast) an alle Lichter des Wohnzimmers aussieht? Dieser darf ja> nicht alle Lichter des Hauses treffen und auch nicht alle Module des> Wohnzimmers.>> Oder wäre ein Dimmermodul im Wohnzimmer nach Deinem Ansatz dann einfach> in alle diesen Gruppen:> - Wohnzimmer> - Licht> - Wohnzimmerlicht> ?> Das können dann ne ganze Menge Gruppen werden und man müsste vorher> wissen was man wohl mal zusammenfassen will.
Genau. So würde ich es anstellen. Macht ja nichts, wenn ein Node in
mehreren Multicast-Gruppen ist. In deiner Auflistung würde ich auf jeden
Fall noch eine Gruppe "Alle" einbauen.
Grüße
Jürgen
IPv6 werde ich definitiv nicht auf dem Hausbus implementieren und auch
keine Umsetzung zwischen verschiedenen Layern machen. Die Bridge soll so
dumm wie möglich sein. Die packt einfach das Paket vom RFM12/Kabel aus
und kippt den kompletten Payload (der Hausbusadressen usw enthält)
stumpf auf UDP und umgedreht. Das heißt die Bridge weiß nix von einem
Protokoll, die kennt nur Pakete mit einer Payload. Kollisionsdomänen
kann ich einfach mit solchen Bridges trennen, die einfach Pakete von
einem Bus auf den anderen Schaufeln.
Das Problem bei RS485 ist, dass man nicht zuverlässig Kollisionen
erkennen kann, weil der Pegel bei den meisten Transceivern in beide
"Richtungen" getrieben wird. Das heißt nebenan mitzuhören bringt Dir
nicht viel, wenn der andere Sender hochohmiger (weiter weg) als Dein
Sender ist. Der Vorteil von CAN Transceivern ist, dass sie einen
dominanten und einen rezessiven Pegel haben und so der dominante siegt,
auch wenn er weiter weg liegt. Ob bei 10Base2 neben Manchester auch ein
rezessiver Pegel die CD realisiert hat weiß ich nicht, würde ich aber
vermuten. Ein weiterer Vorteil der CAN Transceiver ist, dass Du sie
nicht umschalten musst. Du benötigst nur einen einen Transceiver und
kannst RX und TX direkt mit dem UART verbinden, aber das wird jetzt OT
:). Hier sollte es ja ums Protokoll gehen, die physical Layer wurden ja
schon in 1000 anderen Threads diskutiert.
Nachdem nun also jede Node eine eindeutige Unicast Adresse bekommt mit
der auch die Antworten versehen werden und zusätzliche diverse Gruppen
ist noch die Frage wie der Rest eines solchen Paketes aussehen sollte.
Realisiert man es so, dass es diverse Key-Value Paare gibt die abgefragt
werden können? Und man die Node nach ihren Keys fragen kann? Dazu würde
man dann noch Wertebereiche benötigen. Und evtl. verschiedene
Datentypen. Oder fängt man den Wertebereich einfach in der Node ab?
Schön wäre natürlich, wenn der Key "Helligkeit" des Dimmers meinem
Tablet verrät, dass er Werte zwischen 0 und 255 erwartet, damit das
Tablet den Schiebebalken korrekt darstellen kann.
Viele Grüße
Philipp
So die Idee ist ist nun auf Subadressen usw. zu verzichten. Jede
Funktion hat eine Unicastadresse egal ob es 10 Funktionen auf einem
Controller gibt oder nur eine. Von außen sieht es dann halt aus wie 10
Nodes.
Nach einiger Überlegung und diversen Anregungen von außen, hier nun eine
erste Idee zum Paketaufbau:
<Unicast oder Gruppenadresse> <- hier reicht 1 Bit
<Empfängeradresse Unicast bzw. Gruppe>
<Absenderadresse (immer eine Unicast Adresse)>
<Typ der Nachricht. zB. GET_NAME>
[<Datentyp (double; int; string)>]
[<DATA>]
Hierbei sollten dann folgende Nachrichtentypen implementiert werden:
GET_NAME
Fordert den Namen eines Moduls an. Ein Modul ist nicht zwangsläufig ein
Controller. Ein Controller kann hierbei mehrere Module beinhalten und
somit auch mehrere Unicast Adressen besitzen
NAME
Antwort auf ein GET_NAME. Kann beim Einschalten an die Gruppe "Alle"
gesendet werden oder gezielt auf eine Unicast Adresse die GET_NAME
angefordert hat. Datentyp ist String.
GET_RANGE
Anfrage nach dem erlaubten Bereich der Node.
RANGE
Antwort auf GET_RANGE. Über den Datentyp ist festgelegt welchen Datentyp
die Node erwartet. Es werden MIN und MAX Wert hintereinander gesendet.
Sollte der Datentyp String sein, so wird nur ein Wert gesendet, der der
maximalen Länge entspricht
GET_VALUE
Fordert den aktuellen Wert an
VALUE
Sendet den aktuellen Wert inklusive Datentyp
SET_VALUE
Setzt die Value auf den übertragenen Wert. Diese Nachricht wird
automatisch mit einem VALUE Paket beantwortet. Die Value Grenzen werden
dabei von der Node eingehalten.
ACK
Wird als Empfangsbestätigung gesendet, wenn direkt an eine Unicast
Adresse gesendet wurde. Multicast Sendungen sind so allerdings nicht
gesichert, was aber auch nicht notwendig sein sollte.
Ein Szenario könnte also folgendes sein:
M steht hierbei für Multicast, U für Unicast.
Ich schalte das Tablet ein und möchte die Temperatur in einem Raum
ändern.
<M><an alle Heizungen><Tablet><GET_NAME>
<U><Tablet><Wohnzimmerheizung><NAME><string><"Wohnzimmer Heizung">
<U><Wohnzimmerheizung><Tablet><ACK>
<U><Tablet><Esszimmerheizung><NAME><string><"Esszimmer Heizung">
<U><Esszimmerheizung><Tablet><ACK>
... usw
Danach kennt das Tablet alle Heizungen und man könnte nun wieder einen
Multicast senden und alle auf die Spartemperatur fahren lassen oder aber
einer einzelnen Heizung einen Unicast mit <SET_VALUE> senden. Um das
fehlende ACK beim Muticast auszumerzen könnte man einen Multicast mit
GET_VALUE senden und kontrollieren ob es auch alle gemacht haben. Analog
würde man bei Licht usw. verfahren.
Viele Grüße
Philipp
IMHO verstrickst du dich da in Details,
obwohl das ganze Konzept eher (naja) ... ist..
was soll das bringen? "Hoch intelligente", ("halb")dezentrale Aktoren,
(noch dazu als Beispiel Wohnzimmer, wo doch der Heizungsverteiler ganz
wo anders ist..;-)
Moin Robert,
ich kann Deinen Kommentar nicht so ganz deuten. Warum nur "halb"
dezentral? Ist doch komplett unabhängig von einer Zentrale. Das Ganze
war nur ein Beispiel, aber in diesem Beispiel Heizungsthermostate wie
ein HR20 und die sind genau da wo man es warm haben möchte. Und eine
besondere Intelligenz der Aktoren ist so auch nicht notwendig.
Ich würde mich sehr über Kritik freuen (darum ist es hier drin) nur
sollte diese dann auch konstruktiv sein.
deshalb "halb" dezentral, weil du nicht jede Lampe und Taster mit einem
eigenen Kabel anfahren kannst (ich meine man könnte schon, aber dann
hättest 5 Switches mit je 24 port s im Keller ?? ..
du hast also eher "kleine Unterverteiler" in jedem Raum.. also mehrere
"zentralen" ...
>Ist doch komplett unabhängig von einer Zentrale.
im EFH wird das etwas überschätzt, finde ich..
(die "zentrale", sei es eine SPS oder sonst was) einfach 2mal zu kaufen,
ein paar meter kabel mehr, ist meist billiger, als alles dezentral zu
machen)
wenn dein (peo) switch defekt ist, geht auch GARNICHTS mehr..
Wieso Switches? Wenn überhaupt einen AVR mit entweder CAN Transceiver
oder eben RFM12. Und wie oben schon geschrieben sagt ja niemand, dass
ein Controller (meinetwegen auch ne SPS) nicht virtuell mehr als eine
Node darstellen kann. Es ist also reine Auslegungssache ob das Ganze nur
halbzentral ist, weil man es gerne direkt in die Unterverteilung baut
oder wirklich jede Lampe einen Controller bekommt. Und bei RFM12 oder
einem CAN artigen Bus hat man auch keinen Switch als single point of
failure.
Das Ganze hat doch genau gar nichts mit dem Protokoll zu tun?
>Wieso Switches?
naja, deshalb:
> Hausbus auf Ethernet
(es gibt ja inzwischen tatsächlich TASTER auf Ethernet Basis, die sind
richtig interessant, aber das ist ein anderes thema...)
du willst also eher: mehrere Bussystem-abschnitte mit Ethernet verbinden
so wie man es bei KNX auch machen kann?
du willst also nicht nur ein eigenes Bussystem erfinden (can-basiert
oder was auch immer)
an dem hier eh noch JEDER gescheitert ist
sondern diese auch noch mittels Ethernet verbinden ....
>Das Ganze hat doch genau gar nichts mit dem Protokoll zu tun?
nein, eh nicht, weil MEINE MEINUNG: das Protokoll dein kleinstes Problem
ist..
Ich gebe zu, die Überschrift ist etwas verwirrende. Aber das war meine
Ursprungsfrage.
Um es noch einmal zusammenzufasssen: UDP ist nur ein Ersatz für das CAN
(oder was auch immer) Kabel und wird nur für ohnehin bestehende
"Computer" verwendet die ohnehin Ethernet haben.
Ich habe in der Vergangenheit schon einige Bussysteme umgesetzt und das
nicht nur Privat. Den größten Ärger hat dabei immer ein, nicht von
vornherein, zuende gedachtes Protokoll beschert. Daher liegt mein Fokus
hier komplett auf dem Protokoll. Und so wie es gerade angedacht ist
lässt es sich auf so ziemlich jedem Bus umsetzen.
@Robert: lies bitte einfach den Thread, dann hättest Du Dir alle Deine
bisherigen Kommentare sparen können.
Philipp C. schrieb:> Die Bridge soll so> dumm wie möglich sein. Die packt einfach das Paket vom RFM12/Kabel aus> und kippt den kompletten Payload (der Hausbusadressen usw enthält)> stumpf auf UDP und umgedreht. Das heißt die Bridge weiß nix von einem> Protokoll, die kennt nur Pakete mit einer Payload.
Ich habs gelesen,
inzwischen sogar ein 2. mal...
dein "Konzept" hast du zwischendurch schon 3 mal über den Haufen
geworfen, wie soll man da noch durchblicken... (dein "Beispiel" mit dem
Tablet ist sowieso kurios..)
es erschließt sich mir inzwischen überhaupt nicht mehr, was du überhaupt
willst..
z.b.
>Oder>ich möchte, dass alle Lampen eines bestimmten Raums ausgeschaltet werden>ohne mir darüber Gedanken machen zu müssen wie viele Lampen es dort gibt>und welche Adressen diese haben.
(abgesehen davon, dass sich mir der Grund für diesen Wunsch nicht
erschießt)
hier sprichst du z.b. noch davon, dass du DESHALB! UDP broadcasts
"brauchst" usw.
von deinem Anfangsposting ist genau NIX übrig geblieben..
Wo wurde hier denn etwas über den Haufen geworden? Es wurde bisher nur
verfeinert. Ich habe auch nirgendwo von der Notwendigkeit von UDP
Broadcasts gesprochen.
Warum man dieses oder jenes gerne hätte muss bei einem Hausbus glaube
ich wirklich nicht gerechtfertigt werden. Schließlich geht es ja auch
alles ohne einen Bus. Aber zu dem Beispiel mit dem Wohnzimmerlicht: Ich
möchte einfach, dass wenn wir abends das Wohnzimmer verlassen, auf einen
Schlag alles ausmachen können. Also die ganzen Schnickschnacklichter
meiner Frau, die Lampe an der Couch usw. Zudem ist es einfach die gleich
Funktion wie zB alle Heizkörper eines Raums (ja ich habe mehrere Räume
mit mehr als einem Heizkörper) auf die Spartemperatur bzw. auf die
Komforttemperatur zu stellen. Oder eben das Ganze Haus, wenn es in den
Urlaub geht.
Also nochmal als Fazit an dieser Stelle:
- UDP soll (wie von vornerein gesagt) nur die Komponenten vernetzen, die
ohnehin einen Ethernetzugang haben. Um z.B. den aktuellen Film zu
pausieren und die Meldung "Waschmaschine ist fertig" einblenden zu
können. Außerdem würde ich gerne mit dem Handy oder Tablet (WLAN) die
Heizung verstellen können.
- Alles weitere an Modulen, also zB die eigentlichen Aktoren hängen
entweder über ein CAN artiges Netz oder über RFM12 am Bus.
- Als Schnittstelle dient ein Raspberry Pi der die Pakete von einem
physical Layer ins andere Übersetzt. Fällt dieser aus, so ist lediglich
das Netz vom Ethernet getrennt. Lichtschalter und Lampen sind weiterhin
auf der CAN Basis verbunden.
Soweit zur Hardwareseite. Jetzt stellte sich die Frage, was man
sinnvollerweise auf dem Bus sprechen sollte um möglichst einfach die
genannten Wünsche zu realisieren. Da kam von Jürgen die Idee das Ganze
an IPv6 anzulehnen und anstatt von Masken auf den Adressen einfach
mehrere Multicastadressen einzurichten.
Eine mögliche Ausprägung davon habe ich dann versucht in dem Tablet
Beispiel darzustellen. Wenn daran etwas unklar ist oder zu weit ab von
der Realität wäre ich da für Hinweise nach wie vor sehr dankbar.
Achja. Hier noch mal der Ursprungsbeitrag von dem "NIX" übrig ist:
Philipp schrieb:> Hallo Zusammen,>> ich habe vor meinen Hausbus auf Basis von UDP Broadcasts aufzubauen.> Somit benötige ich keine zentrale Instanz und kann trotzdem sehr leicht> die MediaPCs, Handys und Tablets mit einbinden. Für die Mikrocontroller
Wie erwähnt Anbindung für Handy MediaPC usw...
> gesteuerten Aktoren wird es dann ein Gateway geben, das die UDP Pakete> transparent auf einen Mikrocontroller freundlichen Bus weiterreicht> (RS485 oder was auch immer) und auch umgekehrt.
Der Mikrocontrollerfreundliche Bus hat sich zu CAN Transceivern am UART
entwickelt. Da seh ich nun auch nicht so den Bruch mit "RS485 oder was
auch immer"
>> Hat das hier schon mal jemand realisiert? Oder gibt es evtl. gute Gründe> die gegen ein solches Vorhaben sprechen?>> Vielen Dank schon mal für das Feedback> Philipp
loxone macht vom prinzip genau das alles, was du willst...
(ausser dass "CAN artiges Netz" eben ein "KNX artiges Netz" ist)
RFM12 u.U. per rs232 umsetzer anschließbar, weiß ich aber nicht..
schnittstelle zum LAN gibt es nur eine
die ganze logik ist also am server, und muss nicht am Tablet/PC/sonstige
clients "neu erfunden" werden
kommuniziert wird z.b. über WebSockets (mit dem Brower/ oder App)
http (imho auch Rest interface)
Protokoll/Möglichkeiten kannst dir auf der WebSIte anschauen..
vielleicht kannst die da ein paar ideen holen..
oder:
>Ich habe in der Vergangenheit schon einige Bussysteme umgesetzt
vielleicht nimmst dieses mal einfach einProfessionelles, damit dann
nicht noch eines auf deiner liste von "nachher hat es dann doch nicht
gepasst" dazukommt...
Bin gerade dabei mir KNX anzusehen.
Es gibt übrigens kein einziges auf dieser Liste. Es war nur ärgerlich
teilweise wieder Hand an Dinge anlegen zu müssen die fertig gewesen sein
könnten, wenn man es gleich komplett durchgedacht hätte. Klar ist der
Hausbus etwas wo es wirklich fertige Dinge gibt (im Gegensatz zu den
anderen Geschichten), aber bei diesen ganzen Bastelprojekten ist ja
meist auch weniger der fertige Hausbus das Ziel des ganzen, als viel
eher die Freude am Basteln.
So aber nun wirklich genug des Trollfütterns
Hallo,
soweit ich das verstehe habe ich habe seit zwei Jahren einen Hausbus
über CAN mit Ethernet-Backbone (UDP) im produktiven Einsatz, der
ziemlich genau Deinen Vorstellungen entspricht. Am Anfang habe ich
NetIOs für die Gateways benutzt, inzwischen verwende ich
Carambola-Boards. Seit kurzem ist das System bei einem Kollegen in einem
zweiten Haus im Einsatz.
Wenn es Dich interessiert, findet sich unter
https://github.com/maveric00/HomeCANtrol (fast) das ganze System. Fast
deswegen, weil ich noch nicht dazu gekommen bin, das Layout vom neuen
Gateway sowie die notwendigen Änderungen an OpenWRT einzustellen (werde
ich aber vermutlich im Laufe der Woche nachholen). Auch ist die
Dokumentation sicherlich verbesserungsfähig ;-).
Adressierung des Protokolls ist an KNX angelegt (Linien- und
Knotenadressen), auch ist die Verkabelung des Systems von KNX abgeschaut
(zentrale Aktoren, dezentrale Schalter/Sensoren mit KNX-Leitung als Bus
verbunden). Ein Umstellen auf KNX ist also ohne Neuverkabelung, wohl
aber mit den (hohen) Kosten der KNX-Komponenten möglich (falls man
einmal nicht mehr in der Lage sein sollte, das System weiter zu warten).
Die Gateways haben jeder WLAN, 2 Ethernet-Ports, 2 CAN-Busse, 1*RS232
und 1*RS485; das ganze in einem 2TE Hutschienengehäuse. Auf einem der
Gateways läuft auch eine Steuersoftware, die eine Steuerung über
Web-Browser oder über Telnet-Kommandos bereitstellt und Makros sowie
zeitgesteuerte Abläufe ermöglicht; auch kann das System durch diese
Software konfiguriert werden. Die Konfiguration erfolgt über eine
XML-Datei.
An Automatisierungskomponenten steht ein 10* Relaisaktor im 6TE
Hutschienengehäuse (ausgelegt auf jeweils 16A/250V), 1 Sensorboard (6
Ein/Ausgänge mit unterschiedlichen Beschaltungsmöglichkeiten) sowie 1
LED-Treiberboard (für 6*20mA RGB + 1*500mA RGBW) zur Verfügung; ein
Sensorboard mit 10 einfachen Ein/Ausgängen kommt demnächst hinzu.
Ganz fertig und fehlerfrei ist das System noch nicht (wann ist das eine
Selbstbaulösung schon ;-) ), aber inzwischen ist es soweit, dass es
(auch für meine technik-scheue Frau) zufriedenstellend funktioniert.
Schöne Grüße,
Martin
Hallo in die Runde,
ich beschäftige mich seit längerem mit Heimautomatisiserung und diversen
Bussystmen (ca.12Jahre) .Man sollte Meiner Meinung nach alles was
möglich ist, mit Ethernet (TCP/UDP) verbinden. Meist ist mit Ethernet
keine neue Verkabelung nötig (das ist nicht zu unterschätzen!) und wenn
doch mal kein Kabel liegt geht das auch mit WLAN!
Ansonsten wird wahrscheinlich keine Heimautomatisiserung (wie auch immer
geartet) mit nur einem physischen Medium auskommen. Somit brauch man
immer irgendwelche Wandler zwischen den Protokollen
(Infraro, Funksteckdosen - Stichwort FS20/HomeMatic/Temperatursensoren,
Serielle Kommiunikation, Internetanbindung, KNX,...)
Im Endeffekt läuft es immer! auf das PROTOKOLL hinaus (wie von Philipp
geschrieben). Der Ansatz mit der Kommunikation mit dem Tablet scheint
mir vielversprechend.
Wichtig und nicht zu unterschätzen ist auch, dass alle Komponenten
autark laufen können. ALso keine Abhängigkeiten von einem zentralen
Server.
Idealerweise kann man einen Konten vom Netz nehmen und alles andere
läuft "normal" weiter. So können später auch Funktionalitäten neu
dazugebaut werden ohne alles andere umzuprogrammieren.
Fertig wird so ein System ja nie (maveric00)
Beste Grüße
full
www.full-it-service.de
Philipp C. schrieb:> Wie sieht es denn mit dem Energiebedarf Deines Moduls aus? Ich> war von Ethernet für die kleinen Knoten abgerückt, weil ich gesehen habe> wie viel Strom mein AVR-NET-IO benötigt.AVR-NET-IO ist sicher kein gutes Beispiel für effizente Energienutzung.
Schau dich auch mal bei WIZNET um
z.B. ein WIZ820io (W5200) kann man an jeden Micro mit SPI anbinden.
Hat Powerdown funktion und sonst ca. 100mA bei 3.3V !!
(ein Raspi kann zum Thema Energieverbrauch dagegen auch nicht mithalten)
Und zusätzlich:
In order to reduce power consumption of the system, W5200 provides WOL
(Wake
on LAN) and power down mode. To wake up during WOL, W5200 should be
received magic
packet, which is the Raw Ethernet packet.
Es gibt aber auch noch andere Ethernet chips bei Wiznet.
Hallo,
ich sehe Ethernet hier eher als Brücke zwischen den Medien. Für jeden
Knoten Ethernet halte ich für zu Energieintensiv. Aber das bleibt ja am
Ende jedem selbst überlassen.
Bisher war der Gedanke ja alles komplett transparent auf alle Medien zu
geben, damit man sich nicht darum kümmern muss, welcher Knoten welche
Nachricht wirklich braucht und wie diese dorthin kommt.
Nun habe ich kürzlich einen dieser neueren Drehstromzähler mit IR
Schnittstelle bekommen. Dieser sendet ca. alle 2s die aktuellen
Leistungen auf allen drei Zweigen. Das ist natürlich für den Hausbus
sehr interessant, aber verursacht das nicht evtl. schon zuviel Traffic
für RFM12? (1% Duty). Das wären alle 2s je ein Paket mit dem
Zählerstand, eins mit L1 Leistung, eins mit L2 und noch eins mit L3. Das
Ganze bei einer geringen Baudrate macht dann recht viel Sendezeit.
Man könnte nun natürlich sagen, dass man einfach alle Leistungen in ein
Paket packt, damit spart man sich den ganzen Adressoverhead, aber das
bricht dann ja mit dem bisherigen Protokollüberlegungen.
Hat jemand eine Idee wie man damit am besten umgeht?
Viele Grüße
Philipp
Nehmen wir mal an, du sendest aller 2 sec ein Paket
und das senden selbst dauert 200ms (was sicher großzügig gerechnet ist)
Ergibt sich: (60min*60sec) = 3600sec/100 = 36sec.
Damit darfst du 36 sec innerhalb einer Stunde senden.
Bei 200msec/Paket sind das also 36000msec/200msec pro Pakete = 180Pakete
Somit kannst du 180 Pakete pro Stunde senden.
--------------------
Unabhängig davon würde ich das nicht so machen.
Du musst ja den Zähler irgendwie ans Ethernet bringen.
Somit brauchst du hier eine Brigde (Controller).
Nun macht es Sinn, dass der Controller selbst die Daten konsolidiert
und sagen wir mal aller 5min gesammelt ins Netzt stellt.
Alternativ könnte man das auch so machen, dass der Controller die Daten
überhaupt nicht
Broadcasted, sondern sich (analog deiner beschriebenen Methode mit dem
Tablet)
nur zu erkennen gibt.
Braucht nun eine andere Komponente diese Daten (also zB dein Tablet um
das anzuzeigen),
so kann sie die Daten beim Controller jederzeit abfragen.
Somit ist der Traffic minimiert.
Prinzipiell denke ich, sollte das so konzipiert sein, das immer aktiv
nach Daten gefragt werden muss.
Außer! es ist zeitkritisch oder ein Konten zeigt einen Fehler oder Alarm
an!
Beste Grüße
full
PS: Klingt alles total spannend, du solltest aber den Aufwand nicht
unterschätzen! sowas zu implementieren.
Denke bitte auch an die Fehlerscenarios, also Spannungsausfall,
oder Konten fällt aus oder liefert fehlerhafte Daten.
Die Daten sollten somit immer validiert werden.
zB: habe ich vor einer Minute 22C gemessen können es jetzt nicht -20C
sein!
Hallo,
sobald mal wieder Zeit ist würde ich mal abklären ob ich wirklich alle
2s die Daten brauche. Wenn es nur um den Zählerstand geht, dann hast Du
natürlich recht und das Broadcasten alle 2s ist sinnlos. Wobei ich mir
hier eigentlich nur sorgen mache, dass ich mit dem 1% Duty irgendwann
nicht mehr auskommen. Auf dem Ethernet würde das ja nicht stören, wenn
da nebenher alle 2s die Daten langkommen.
Ich habe aber die Hoffnung in den Leistungsmustern der drei Phasen z.B.
erkennen zu können ob die Waschmaschine fertig ist, man das Bügeleisen
vergessen hat usw. Die Auswertung dessen würde dann aber wohl einfacher
auf dem Raspberry Pi laufen damit bräuchte er aber permanent diese
Daten. Naja, mal den Zähler loggen während man wäscht (einmal Nachts und
einmal mit Personen im Haushalt die "stören") und dann gucken ob es das
nächste Großprojekt wird da Muster zu erkennen oder ob es realistisch
ist. Hat sich damit schon mal jemand hier beschäftigt?
Viele Grüße und vielen Dank für die rege Beteiligung
Philipp