Ich habe übrigens mal ein Klassendiagramm der wichtigsten Klassen erstellt. Da kann man sehen welche Klasse welche anderen nutzt: https://knx.readthedocs.io/en/latest...sdiagramm.html
Ankündigung
Einklappen
Keine Ankündigung bisher.
ESP8266 KNX mit ETS
Einklappen
X
-
"U_FRAMESTATE_IND" kommt nur im 8bit Uart Mode, sollte also passen
Zitat von thesing Beitrag anzeigenFrames die jemand anderes mit der gleichen Geräteadresse wie man selbst hat empfängt, sollen aber weiter gegeben werden.
Hab gestern noch mit einem eigenen Datalinklayer angefangen, wird aber noch ne Zeit dauern da ich vermutlich erst übernächste Woche wieder zum programmieren komme
Kommentar
-
Es sollte in einer normalen Installation nicht vorkommen. Wenn man allerdings zwei Geräten die gleiche PA gibt hat man den Fall. ETS kann das über PID_DEVICE_CONTROL (PID = 14) abfragen (3_5_1) In 2.7 und 3_3_2 würde es auch stehen. Die richtige Information dazu findet sich in der Norm EN 50090-4-2:2004 4.3.6 L_Service_Information service. Ich bin wahrscheinlich der einzige, der sich Urlaub nimmt, um in die Universitätsbibliothek nach den Normen zu schauen.
Ob das wirklich ausgewertet wird weiß ich nicht.
Kommentar
-
Vermutlich wird es so, dass Du der einzige bist. Meine Hochachtung hast Du jedenfalls. Bringt Dich und das Projekt zwar nicht weiter, aber ich finde es eine super super Leistung. An dieser Stelle einmal Danke für Deine aufgewendete Zeit. Leider fehlt sie mir im Moment, mich aktiv mit diesem/Deinem Projekt hier zu beschäftigen, aber ich lese und verfolge es fleißig mit.
Kommentar
-
Hi Thomas,
ich wollte mal wieder Feedback geben, auch wenn es länger gedacht hat, als ich dachte. Ich habe ja mein Projekt auf die neuen DPT umgestellt und teste. Unter anderem auch Deinen neuen "Restart"-Befehl.
Zu den DPT: Ich bin mir wirklich nicht sicher, ob ich das korrekt mache, da mir nicht wirklich klar ist, wann man diese "mehrkomponentigen" DPT braucht. Ich konnte erfolgreich DPT 1, 5, 5.001 schreiben, DPT 2 und 6 aber nicht. DPT 2 schreibt bei einer 3 (Priority On) eine 2 auf den Bus (Priority Off), DPT 6 schreibt für jede negative Zahl eine 0 auf den Bus. Mehr DPTs habe ich noch nicht getestet, das kommt noch. Kann ich irgendwas prüfen bzw. was bräuchtest Du, damit ich Dich bei der Korrektur unterstützen kann?
Hier noch eine Anmerkung: Ich komme auch mit dem "RAW"-Ansatz
Code:uint8_t *valueRef = Ko.valueRef(); *valueRef = value; Ko.objectWritten();
Zum Restart-Befehl:
Deine neue Methode sendet wirklich ein Restart auf den Bus, aber eben nur dieses Telegramm:
Code:[TABLE] [TR] [TD]#[/TD] [TD]Time[/TD] [TD]Service[/TD] [TD]Flags[/TD] [TD]Prio[/TD] [TD]Source Address[/TD] [TD]Source Name[/TD] [TD]Destination Address[/TD] [TD]Destination Name[/TD] [TD]Rout[/TD] [TD]Type[/TD] [TD]DPT[/TD] [TD]Info[/TD] [/TR] [TR] [TD]435[/TD] [TD]06/07/2019 17:21:42,165[/TD] [TD]from bus[/TD] [TD] [/TD] [TD]Low[/TD] [TD]0.0.3[/TD] [TD]Lokikmodul[/TD] [TD]0.0.3[/TD] [TD]Lokikmodul[/TD] [TD]6[/TD] [TD]Restart[/TD] [TD] [/TD] [TD] [/TD] [/TR] [/TABLE]
Das funktioniert nicht. Wenn ich das gleiche mit der ETS mache, sieht das bei einem IP-Gerät so aus:
Code:[TABLE] [TR] [TD]#[/TD] [TD]Time[/TD] [TD]Service[/TD] [TD]Flags[/TD] [TD]Prio[/TD] [TD]Source Address[/TD] [TD]Source Name[/TD] [TD]Destination Address[/TD] [TD]Destination Name[/TD] [TD]Rout[/TD] [TD]Type[/TD] [TD]DPT[/TD] [TD]Info[/TD] [/TR] [TR] [TD]419[/TD] [TD]06/07/2019 17:20:24,246[/TD] [TD]from bus[/TD] [TD] [/TD] [TD]System[/TD] [TD]0.0.1[/TD] [TD]-[/TD] [TD]0.0.3[/TD] [TD]Lokikmodul[/TD] [TD]6[/TD] [TD]T_Connect[/TD] [TD] [/TD] [TD] [/TD] [/TR] [TR] [TD]420[/TD] [TD]06/07/2019 17:20:24,267[/TD] [TD]from bus[/TD] [TD] [/TD] [TD]System[/TD] [TD]0.0.1[/TD] [TD]-[/TD] [TD]0.0.3[/TD] [TD]Lokikmodul[/TD] [TD]6[/TD] [TD]DeviceDescriptorRead (S=0)[/TD] [TD] [/TD] [TD]DescriptorType=0[/TD] [/TR] [TR] [TD]421[/TD] [TD]06/07/2019 17:20:24,272[/TD] [TD]from bus[/TD] [TD] [/TD] [TD]System[/TD] [TD]0.0.3[/TD] [TD]Lokikmodul[/TD] [TD]0.0.1[/TD] [TD]-[/TD] [TD]6[/TD] [TD]T_ACK (S=0)[/TD] [TD] [/TD] [TD] [/TD] [/TR] [TR] [TD]422[/TD] [TD]06/07/2019 17:20:24,292[/TD] [TD]from bus[/TD] [TD] [/TD] [TD]System[/TD] [TD]0.0.3[/TD] [TD]Lokikmodul[/TD] [TD]0.0.1[/TD] [TD]-[/TD] [TD]6[/TD] [TD]DeviceDescriptorResponse (S=0)[/TD] [TD] [/TD] [TD]DescriptorType=0, DescriptorData=57 B0[/TD] [/TR] [TR] [TD]423[/TD] [TD]06/07/2019 17:20:24,292[/TD] [TD]from bus[/TD] [TD] [/TD] [TD]System[/TD] [TD]0.0.1[/TD] [TD]-[/TD] [TD]0.0.3[/TD] [TD]Lokikmodul[/TD] [TD]6[/TD] [TD]T_ACK (S=0)[/TD] [TD] [/TD] [TD] [/TD] [/TR] [TR] [TD]424[/TD] [TD]06/07/2019 17:20:24,360[/TD] [TD]from bus[/TD] [TD] [/TD] [TD]System[/TD] [TD]0.0.1[/TD] [TD]-[/TD] [TD]0.0.3[/TD] [TD]Lokikmodul[/TD] [TD]6[/TD] [TD]PropertyValueRead (S=1)[/TD] [TD] [/TD] [TD]ObjectIndex=0, PropertyId=56, Count=1, StartIndex=1[/TD] [/TR] [TR] [TD]425[/TD] [TD]06/07/2019 17:20:24,362[/TD] [TD]from bus[/TD] [TD] [/TD] [TD]System[/TD] [TD]0.0.3[/TD] [TD]Lokikmodul[/TD] [TD]0.0.1[/TD] [TD]-[/TD] [TD]6[/TD] [TD]T_ACK (S=1)[/TD] [TD] [/TD] [TD] [/TD] [/TR] [TR] [TD]426[/TD] [TD]06/07/2019 17:20:24,383[/TD] [TD]from bus[/TD] [TD] [/TD] [TD]System[/TD] [TD]0.0.3[/TD] [TD]Lokikmodul[/TD] [TD]0.0.1[/TD] [TD]-[/TD] [TD]6[/TD] [TD]PropertyValueResponse (S=1)[/TD] [TD] [/TD] [TD]ObjectIndex=0, PropertyId=56, Count=1, StartIndex=1, Data=00 0F[/TD] [/TR] [TR] [TD]427[/TD] [TD]06/07/2019 17:20:24,383[/TD] [TD]from bus[/TD] [TD] [/TD] [TD]System[/TD] [TD]0.0.1[/TD] [TD]-[/TD] [TD]0.0.3[/TD] [TD]Lokikmodul[/TD] [TD]6[/TD] [TD]T_ACK (S=1)[/TD] [TD] [/TD] [TD] [/TD] [/TR] [TR] [TD]428[/TD] [TD]06/07/2019 17:20:24,405[/TD] [TD]from bus[/TD] [TD] [/TD] [TD]System[/TD] [TD]0.0.1[/TD] [TD]-[/TD] [TD]0.0.3[/TD] [TD]Lokikmodul[/TD] [TD]6[/TD] [TD]Restart (S=2)[/TD] [TD] [/TD] [TD] [/TD] [/TR] [TR] [TD]429[/TD] [TD]06/07/2019 17:20:24,423[/TD] [TD]from bus[/TD] [TD] [/TD] [TD]System[/TD] [TD]0.0.3[/TD] [TD]Lokikmodul[/TD] [TD]0.0.1[/TD] [TD]-[/TD] [TD]6[/TD] [TD]T_ACK (S=2)[/TD] [TD] [/TD] [TD] [/TD] [/TR] [TR] [TD]430[/TD] [TD]06/07/2019 17:20:24,426[/TD] [TD]from bus[/TD] [TD] [/TD] [TD]System[/TD] [TD]0.0.1[/TD] [TD]-[/TD] [TD]0.0.3[/TD] [TD]Lokikmodul[/TD] [TD]6[/TD] [TD]T_Disconnect[/TD] [TD] [/TD] [TD] [/TD] [/TR] [/TABLE]
Code:# Zeit Dienst Flags Prio Quelladresse Quell-Beschreibung Zieladresse Zielname Rout Typ DPT Info 42974 06.07.2019 17:24:04,225 zum Bus System 0.0.0 - 1.0.63 Rauchmelder (10mA) 5 T_Connect 42975 06.07.2019 17:24:04,262 zum Bus System 0.0.0 - 1.0.63 Rauchmelder (10mA) 5 DeviceDescriptorRead (S=0) DescriptorType=0 42976 06.07.2019 17:24:04,305 vom Bus System 1.0.63 Rauchmelder EG: 0.0.0 - 5 T_ACK (S=0) 42977 06.07.2019 17:24:04,337 vom Bus System 1.0.63 Rauchmelder EG: 0.0.0 - 5 DeviceDescriptorResponse (S=0) DescriptorType=0, DescriptorData=00 12 42978 06.07.2019 17:24:04,346 zum Bus System 0.0.0 - 1.0.63 Rauchmelder (10mA) 5 T_ACK (S=0) 42979 06.07.2019 17:24:04,615 zum Bus System 0.0.0 - 1.0.63 Rauchmelder (10mA) 5 Neustarten (S=1) 42980 06.07.2019 17:24:04,663 zum Bus System 0.0.0 - 1.0.63 Rauchmelder (10mA) 5 T_Disconnect
Vielen Dank und viele Grüße,
Waldemar
Kommentar
-
bei mir sendet der BME680-Sketch mit dem aktuellen Code vom git immer noch nur Gruppentelegramme mit Wert = 0
Das sollte doch noch passen oder?
Code:goRawTemperature.value(iaqSensor.rawTemperature); goPressure.value(iaqSensor.pressure); goRawHumidity.value(iaqSensor.rawHumidity); goGasResistance.value(iaqSensor.gasResistance); goIaqEstimate.value(iaqSensor.iaq); goIaqAccurace.value(iaqSensor.iaqAccuracy); goTemperature.value(iaqSensor.temperature); goHumidity.value(iaqSensor.humidity); goCo2Ppm.value(iaqSensor.co2Equivalent);
Kommentar
-
Hi Thomas,
DPT 7 und 8 klappen, bei DPT 9 gibt es Probleme (hier konkret 9.001). Der Wert 1.23°C wird als 0°C ausgegeben. Ich habe das mal bis zu der Routine debugged:
Code:void float16ToPayload(uint8_t* payload, int payload_length, int index, double value, uint16_t mask) { bool wasNegative = false; if (value < 0) { wasNegative = true; value *= -1; } value *= 100.0; unsigned short exponent = ceil(log2(value) - 11.0); short mantissa = roundf(value / (1 << exponent)); if (wasNegative) mantissa *= -1; signed16ToPayload(payload, payload_length, index, mantissa, mask); unsigned8ToPayload(payload, payload_length, index, exponent << 3, 0x78 & (mask >> 8)); }
Ich habe auch mal 12345.67 ausgeben wollen, die kam als 12349.44 raus...
Hier komme ich auch nicht wirklich weiter, da ich nicht weiß, wie ich einen Float-Wert direkt ins KO schreiben soll. Ich versuch es aber weiter. Das komische ist, dass mit Deinem alten Ansatz, als Du noch DPT9 als integer transportiert hast (intern multipliziert mit 100), hat das schreiben funktioniert.
Gruß, Waldemar
Kommentar
-
Hi Thomas,
sorry, bin eben am Testen... DPT 16 geht auch noch nicht, allerdings weißt Du das:
Code:int valueToBusValueString(const KNXValue& value, uint8_t* payload, int payload_length, const Dpt& datatype) { //TODO return false; }
P.S.: Zum Abschluss: DPT 17 und 232 funktionieren. Das wären erstmal alle, die ich schreiben will. Morgen kommen dann die, die ich lesen will, dran.
Kommentar
-
jorues Das BME-Beispiel ist derzeit scheinbar kaputt. Ich muss mir das mal anschauen.
@mumpf: So viel auf einmal
- restart: Das ist nicht soo einfach. Du musst erste eine mit TransportLayer.connectRequest eine Verbindung zum Ziel aufmachen. Die steht sobald das ApplicationLayer::connectConfirm kommt. Danach kannst du den restartRequest schicken. Bisher ist der der Stack noch nicht so ganz darauf vorbereitet. Ich muss mal schauen wie man das ansynchrone Zeug in C++ am besten macht.
- DPT9: kannst du mal schauen ob es klappt wenn du die 11 nur abziehst, wenn >= 11 ? Die Auflösung ist halt nur 16 Bit das sind Differenzen normal. Ggf. kannst du schauen wie ETS den Wert beim Senden kodiert. Wenn wir das Telegramm gleich füllen sind wir so gut wie es geht. Gibt es nicht auch einen 4 Byte-Gleitkommazahl DPT? Der ist ggf. besser wenn die Werte genauer sein sollen.
- zu den anderen DPT: Ich habe den Code auch nur geklaut und bin da so schlau wie du. Ich bin da für jeglichen Patch dankbar. Vielleicht sollte man wirklich erstmal für alle implementierten DPT und auch deren Komponenten ein enum machen.
Kommentar
-
Hi Thomas,
bitte mein Feedback nicht als negative Kritik verstehen, ich versuche nur die Sachen, die mir auffallen, gleich zu melden, bevor ich sie vergesse. Und da ich mein Logikmodul mit den DPT 1,2,5,6,7,8,9,16,17 und 232 betreiben möchte, habe ich die jetzt alle mal am laufenden Projekt durchgetestet. Ich finde es auch nicht schlimm, dass da potentiell viel zusammen kommt, denn wie Du es schreibst, Du hast das für Dich gemacht und für Deine Fälle läuft es ja.
Ich hab ja auch ein schlechtes Gewissen, dass ich keine Patches liefere, aber mein C/C++ ist nicht wirklich präsentationsfähig, und ich verstehe in großen Teilen nicht wirklich, was bei Dir abgeht. Dagegen sind die Sachen, die ich mache, echt Kindergarten. Aber ich könnte mal für den Anfang versuchen, den DPT 9 komplett zu debuggen, vielleicht bekomme ich das ja hin...
Weitere Erkenntnisse zum DPT 9: Die Werte werden korrekt empfangen, aber falsch gesendet. Hab nur mal eine Art Echo gebaut, ein KO, dass einen DPT 9 empfängt, und dann ein KO, das diesen Wert direkt wieder raus sendet. Und dann zur Kontrolle noch ein KO, dass den Wert*100 auch als Integer aussendet, so kann man sehen, was empfangen wurde (natürlich dann nur auf 2 Nachkommastellen genau). Der DPT 9 wird von -400 bis 400 recht genau gesendet, außerhalb dieses Intervalls gibt es immer größere Abweichungen, innerhalb des Intervalls stimmt alles bis auf das Intervall -10.25 bis 10.25. Alle Zahlen von -10.24 bis 10.24 werden als 0 gesendet.
Das mit der 4-Byte-Gleitkommazahl ist eine nette Idee, aber wenn ich an mein Logikmodul denke, dann muss ich ja einen passenden DPT anbieten, um das Ergebnis der Logik weiterverarbeiten zu können. Und viele prominente Eingänge sind DPT 9 (Temperatur, Lux, mA, ...)
Die anderen DPT schaue ich mal, wie ich zumindest Feedback geben kann, vielleicht auch was korrigieren.
Und zum reset: Ich weiß leider nicht genug über die Kommunikation, aber ich könnte schon versuchen, die Befehle nacheinander zu schicken und zwischendurch auf ein Ergebnis prüfen, es muss aus meiner Sicht nicht eine Methode sein. Ich bräuchte nur eine Idee, wie ich da überhaupt dran gehe, gerne auch erstmal low-level, ohne einen Stack-Umbau, wenn Du eine Chance siehst, dass es gehen könnte. Allerdings gebe ich zu, dass ich nicht weiß, wovon ich hier rede... Ich habe nur mein Logikmodul so asynchron wie möglich programmiert, um nichts zu blockieren...
Gruß, Waldemar
Kommentar
-
@mumpf: Ich habe das nicht als Kritik aufgefasst. Alles Ok. Und ich selbst habe noch kein Geräte mit dem Stack dauerhaft in BetriebIn dem Sinn ist er aktuelle eher ein Projekt für andere.
Die verschiedenen DPTs sind eingentlich IMO ein guter Einstiegspunkt für Patches. Man braucht den gesamten Stack nicht verstehen und muss sich "nur" die KNX_Encode_Value und KNX_Decode_Value in dptconvert.cpp hangeln muss. Der alte Code für Dpt9 ist übirgens noch da:
https://github.com/thelsing/knx/blob...oint_types.cpp
Kommentar
-
Hallo,
ich habe mein Problem mit dem einfrieren/hängen bei Applikationsübertragung auf dem SAMD weiter getestet. Es scheint wohl ein Problem mit der Speicherplatzgröße zu sein.
Wie viele Bytes verbrauchen die Parameter? Genausoviel wie die auch groß sind?
Wie viel wird je Gruppenadresse benötigt?
Verwendet sonnst noch jemand den SAMD21 Mikrocontroller?
Ich habe nur mit der Anzahl/Größe der Gruppenadressen Probleme. Parameter konnte ich genug verwenden.
Könnte das bitte jemand prüfen/testen?
Ich habe im Anhang mal die 2 Test Produktdatenbanken.Angehängte Dateien
Kommentar
Kommentar