Hallo zusammen,
ich lese hier schon eine Zeit lang mit und habe auch schon verschiedene OpenKnx Geräte im Einsatz. An dieser Stelle einmal vielen Dank an alle die OpenKnx zu dem gemacht haben und machen was es heute ist. Es ist überaus beeindruckend was ihr hier geschaffen habt und wie viel Zeit ihr hier investiert! 👍
Aktuell bin ich dabei eine eigene Applikation / Firmware auf Basis von OpenKNX zu entwickeln, um unsere Hoval Lüftungsanlage an den KNX-Bus zu bekommen. Das Hoval CAN Protocol habe ich mittlerweile weitgehend verstanden und auch schon den Grundstock implementiert, um das ganze auf den Bus zu bekommen. Die ersten Werte werden bereits erfolgreich übertragen. Wenn das ganze einmal weiter gediehen ist und die initialen Bugs weg sind, werde ich das ganze auch veröffentlichen und hier im Forum mal vorstellen.
Nun zu meinem Anliegen / Problem. Ich verwende unter anderem einen DPT vom Typ 7.007 (Zeit in Stunden) um die aktuelle Restzeit des Wartungszählers auf den Bus zu bekommen. Dabei stoße ich auf ein paar Hürden und frage mich, ob die Knx Implementierung an der Stelle fehlerhaft ist, oder ich zu Blöd dafür bin 😉. Ich komme aus der Java Welt und mein C++ Wissen ist teilweise begrenzt.
Mein Problem, ist das, "egal" wie ich den Wert übergebe auf dem Bus immer eine 0 ankommt.
Im ersten Schritt hatte ich es naiv so versucht:
Dann hatte ich mir valueToBusValueTimePeriod in dptconvert.cpp angeschaut und gesehn das hier ein tm struct verwendet wird. Also verschieden Varianten damit versucht:
Ich habe dann in valueToBusValueTimePeriod Log Ausgaben hinzugefügt und festgestellt das timeSinceEpoch (hier https://github.com/OpenKNX/knx/blob/...nvert.cpp#L997) in allen Fällen negativ ist - in den meisten von mir getesten Fällen um 3600 gegenüber meinem Wert.
Ich habe es jetzt aktuell so am laufen und bekomme korrekte Werte auf den Bus
Sinnvoll erscheint mir das allerdings nicht.
Die Frage ist für mich erstmal, ist die Implementierung von valueToBusValueTimePeriod überhaupt korrekt / sinnvoll. Für mich erscheint es wenig sinnhaft hier ein tm struct zu verwenden. Am Ende des Tages soll ja kein Zeitpunkt übertragen werden sondern nur ein Zeitraum. Ich würde hier also ein einfaches uint16_t erwarten. Aber möglicherweise liegt das auch an meinem fehlenden Verständnis
Falls das wirklich so beabsichtigt ist stellt sich mir die Frage was ist der Sinn dahinter und wie kann das ganze korrekt verwendet werden.
Beste Grüße
ich lese hier schon eine Zeit lang mit und habe auch schon verschiedene OpenKnx Geräte im Einsatz. An dieser Stelle einmal vielen Dank an alle die OpenKnx zu dem gemacht haben und machen was es heute ist. Es ist überaus beeindruckend was ihr hier geschaffen habt und wie viel Zeit ihr hier investiert! 👍
Aktuell bin ich dabei eine eigene Applikation / Firmware auf Basis von OpenKNX zu entwickeln, um unsere Hoval Lüftungsanlage an den KNX-Bus zu bekommen. Das Hoval CAN Protocol habe ich mittlerweile weitgehend verstanden und auch schon den Grundstock implementiert, um das ganze auf den Bus zu bekommen. Die ersten Werte werden bereits erfolgreich übertragen. Wenn das ganze einmal weiter gediehen ist und die initialen Bugs weg sind, werde ich das ganze auch veröffentlichen und hier im Forum mal vorstellen.
Nun zu meinem Anliegen / Problem. Ich verwende unter anderem einen DPT vom Typ 7.007 (Zeit in Stunden) um die aktuelle Restzeit des Wartungszählers auf den Bus zu bekommen. Dabei stoße ich auf ein paar Hürden und frage mich, ob die Knx Implementierung an der Stelle fehlerhaft ist, oder ich zu Blöd dafür bin 😉. Ich komme aus der Java Welt und mein C++ Wissen ist teilweise begrenzt.
Mein Problem, ist das, "egal" wie ich den Wert übergebe auf dem Bus immer eine 0 ankommt.
Im ersten Schritt hatte ich es naiv so versucht:
Code:
GroupObject &groupObject = knx.getGroupObject(comObject); KNXValue value = KNXValue((uint16_t)5); groupObject.value(value, DPT_TimePeriodHrs);
Code:
tm time = {0};
time.tm_hour = 5;
KNXValue value = KNXValue(time)
groupObject.value(value, DPT_TimePeriodHrs);
...
gmtime_r(0, &time);
time.tm_hour = 5;
...
localtime_r(0, &time);
time.tm_hour = 5;
...
time_t hrs = 5;
gmtime_r(&hrs, &time);
...
localtime_r(&hrs, &time);
...
Diverse weitere Varianten...
Ich habe es jetzt aktuell so am laufen und bekomme korrekte Werte auf den Bus
Code:
time_t hrs = 5 + 3600; // Offset von 3600s / 1h tm time; gmtime_r(&hrs, &time); KNXValue value = KNXValue(time); groupObject.value(value, DPT_TimePeriodHrs);
Die Frage ist für mich erstmal, ist die Implementierung von valueToBusValueTimePeriod überhaupt korrekt / sinnvoll. Für mich erscheint es wenig sinnhaft hier ein tm struct zu verwenden. Am Ende des Tages soll ja kein Zeitpunkt übertragen werden sondern nur ein Zeitraum. Ich würde hier also ein einfaches uint16_t erwarten. Aber möglicherweise liegt das auch an meinem fehlenden Verständnis
Falls das wirklich so beabsichtigt ist stellt sich mir die Frage was ist der Sinn dahinter und wie kann das ganze korrekt verwendet werden.
Beste Grüße


Kommentar