Mal eine blöde Frage: Warum VS Code und nicht Visual Studio?
Ankündigung
Einklappen
Keine Ankündigung bisher.
ESP8266 KNX mit ETS
Einklappen
X
-
Zitat von thesing Beitrag anzeigenWarum VS Code und nicht Visual Studio?
dafür gibt es keinen wirklich "harten" Grund, aber viele kleinere "weiche":- Gewöhnung: Ich mache fast alles, was zu editieren ist, mit VS Code (JSON, XML, C#, jeztzt C/C++, YAML, normale Textdateien, etc...)
- Lightweight: Der Editor ist schnell da und mir gefällt das Extension-Konzept
- Remote: Das neu verfügbare Remote-Editing finde ich richtig gelungen! Der Editor läuft unter Windows, das Projekt ist auf der WSL unter Debian und man hat exakt die selbe "Experience" wie beim lokalen editieren
- Gute und einfache Git Anbindung.
- Ich habe VisualGDB nicht wirklich verstanden (hatte die Testlizenz) und dann ist meine Testzeit wegen des Unfalls zu 50% verfallen.
- Ich wollte wissen, ob ich es auch kostenfrei mit debugging unter Linux hin bekomme. Dass es geklappt hat, liegt sicherlich auch an Deinem erstklassigen Projektaufbau mit cmake, sauberer Verzeichnisstruktur usw. Hier wirklich
- Mit VS Code kann ich dann auch die Arduino IDE ersetzen
- Bei Visual Studio passiert vieles "unter der Hand", häufig verstehe ich nicht (bzw. erst viel später), was wo wie parametriert/generiert wurde. Bei VS Code muss man zwar mehr manuell machen, aber dadurch blicke ich eher, was passiert. Gibt mir dann das Gefühl, dass ich besser analysieren kann, wenn mal was nicht läuft.
Das mit den VS Code Files (Push-Request) mache ich erst, wenn alles funktioniert, auch Arduino, also realistisch gesehen erst, wenn ich wieder zu Hause bin.
Gruß, Waldemar
Kommentar
-
Hallo,
henfri Du kannst beim BME also das erste mal programmieren, und danach nicht mehr, oder geht schon das erste mal nicht?
Zum Sonoff: hab ich bei mir nicht nochmal getestet. Da aber jemand ein Issue dazu auf Github eröffnet und wieder geschlossen hat, vermute ich, dass es geht.
Gruß,
Hendrik
Kommentar
-
@henfri: ich hab mir mal einen neuen S20 bestellt. Der alte reagiert nicht mehr auf Kontaktversuche. Hab ich wahrscheinlich mal VCC mit GND vertauscht. Den BME werde ich mir mal als nächstes nochmal im Detail anschauen und dabei gleich eine KO für Lüftung mit Schwellwerten einbauen. Dann kann ich das auch mal für mehr als zur Visualisierung nutzen.
Kommentar
-
Hi Thomas,
ich hab mal ne Frage und hoffe, dass sie nicht zu unsinnig ist... ist eher so, dass Du ja einen ganzen KNX-Stack implementiert hast und somit für mich zu den "Wissenden" gehörst...
Über die ETS kann man ja an jedes Gerät ein "Gerät zurücksetzen" senden. Siehst Du die Möglichkeit, so was auch über Deinen Stack zu senden? Also ein anderes Gerät zurücksetzen? Und falls ja - ist es aufwändig, so ein Kommando abzusetzen?
Hintergrund: Ich habe sporadisch (selten) Geräte, die anfangen, Unsinn zu machen. Ein PM, der plötzlich keine Präsenz meldet, auf dem Lichtkanal aber normal arbeitet, ein Klimaanlagen-Gateway, dass auf jegliche Temperaturvorgabe mit dem Status "Solltemperatur = 30°C" antwortet etc. All diese Probleme sind mit einem "Gerät zurücksetzen" zu beheben und man kann die Symptome in Regeln packen. Und da ich gerade an einem Logikmodul arbeite, würde es mich sehr interessieren, ob und wie ich ein "Gerät zurücksetzen" als Ergebnis einer Logik realisieren kann. Also eine Art "watchdog". Ich habe bisher noch kein Produkt außer der ETS gefunden, das das kann.
Gruß, Waldemar
Kommentar
-
Ich habe dir mal schnell eine Methode dafür gebastelt. Siehe https://github.com/thelsing/knx/comm...9913fcaf2452be
Ob es funktioniert kann ich nicht sagen. Sollte es aber.
Kommentar
-
Wow, danke! Ich brauche wohl noch ein/zwei Tage, bis ich meine Engine wieder zum laufen gebracht habe, aber dann teste ich das sofort - ist ja der Hammer.
Feedback kommt dann,
Danke nochmal!
Gruß, Waldemar
Kommentar
-
Hallo Thomas,
ich verwenden deine Stack schon etwas länger mit eine SAMD21. Ich habe nun die Library durch die aktuelle Version ersetzt und habe ein paar Probleme.
Ich verwende die wie beschrieben um Werte zu senden. DPT 1 und DTP3 werden allerdings in einem falschen Format gesendet (werden im Busmonitor der ETS angezeigt).
Ich mache dies folgendermaßen als Beispiel:
knx.getGroupObject(1).dataPointType(Dpt(1, 1));
knx.getGroupObject(2).dataPointType(Dpt(3, 7));
knx.getGroupObject(3).dataPointType(Dpt(5, 5));
knx.getGroupObject(1).value(true);
knx.getGroupObject(1).value(false);
uint8_t value_send;
value_send = 9;
knx.getGroupObject(2).value(value_send);
value_send = 8;
knx.getGroupObject(2).value(value_send);
Ich bin jetzt nicht so der Programmierprofi
Ich habe mal versucht den Fehler zu finden. Es gibt wohl Probleme bei der DPT Konvertierung.
Wenn ich folgendes anpasse funktioniert es wie gewünscht:
src\knx\dptconvert.cpp
int valueToBusValueStepControl(const KNXValue& value, uint8_t* payload, int payload_length, const Dpt& datatype)
{
switch (datatype.index)
{
case 0:
//bitToPayload(payload, payload_length, 4, value); //sebastian
unsigned8ToPayload(payload, payload_length, 0, (uint64_t)value, 0xFF); //sebastian
break;
case 1:
{
if ((int64_t)value < INT64_C(0) || (int64_t)value > INT64_C(7))
return false;
unsigned8ToPayload(payload, payload_length, 0, (uint64_t)value, 0x07);
}
break;
default:
return false;
}
void bitToPayload(uint8_t* payload, int payload_length, int index, bool value)
{
//payload[index / 8] = (payload[index / 8] & ~(1 << (7 - (index % 8)))) | (value ? (1 << (7 - (index % 8))) : 0); //sebastian
payload[index / 8] = (value ? (1 << (7 - (index % 8))) : 0); //sebastian
}
void unsigned8ToPayload(uint8_t* payload, int payload_length, int index, uint8_t value, uint8_t mask)
{
ENSURE_PAYLOAD(index + 1);
//payload[index] = (payload[index] & ~mask) | (value & mask); //sebastian
payload[index] = (value & mask); //sebastian
}
VG SebastianZuletzt geändert von SebastianObi; 26.06.2019, 15:41.
Kommentar
-
Ich muss mir das noch im Detail anschauen. Die bitToPayLoad und unsigned8ToPayload Funktionen sollten an sich richtig sein. Die bitToPayload-Funktion soll nur das ein Bit ändern un die anderen Bits im Byte nicht anfassen. Gleiches gilt für unsigned8ToPayload. Dort sollen nur die Bits geändert werden, die durch mask angegeben werden.
Bei mehrteiligen Datenpunkttypen wie Stepcontrol muss du die einzelnen Komponenten getrennt setzen (und lesen):
knx.getGroupObject(2).valueNoSend(1, DPT(3,7,0));
knx.getGroupObject(2).value(7, DPT(3,7,1));
Das ist sicher nicht die bestmögliche Lösung.
Alternativ kann man mit
valueRef = knx.getGroupObject(2).valueRef();
*valueRef = 8;
knx.getGroupObject(2).objectWritten();
Den ganzen Datenpunkttyp-Code umgehen.
Wahrscheinlich sollte man die DPT-Klasse durch Enums ablösen. Dann könnte man die Komponenten auch richtig benennen. Oder man erzeugt wie die ganzen mehrteiligen Datenpunkttypen eigene structs und fügt die zum KnxValue hinzu. Ich bin da derzeit unschlüssig.
Man könnte auch eine Dpt3_7-Klasse bauen mit Methoden assignToGroupObject und readFromGroupObject die dann jeweils die Komponenten lesen und schreiben.Zuletzt geändert von thesing; 28.06.2019, 09:24.
Kommentar
-
Hallo,
danke für die Infos.
Ich verwende jetzt deine original Library mit
valueRef = knx.getGroupObject(2).valueRef();
*valueRef = 8;
knx.getGroupObject(2).objectWritten();
so funktioniert DPT 1,1 und 3,7 ohne Probleme. Alle anderen von mir verwendeten DPTs funktionieren ohne Probleme.
Ich habe nochmal ein paar Tests gemacht.
Das Problem ist, dass in "bitToPayload" und "unsigned8ToPayload" in der variable "payload[index]" schon Daten/Werte vorhanden sind welche nicht zu der aktuellen Gruppenadresse gehören welche gerade gesetzt/gesendet werden soll. Somit werden da dann falsche Werte entstehen.
Test 1:
knx.getGroupObject(1).dataPointType(Dpt(1, 1));
knx.getGroupObject(1).value(false);
-> ETS: $30 | Aus
oder
-> ETS: $20 | Aus
Test 2:
knx.getGroupObject(1).dataPointType(Dpt(1, 1));
knx.getGroupObject(1).value(true);
-> ETS: $31 | Ein
oder
-> ETS: $21 | Ein
Test 3:
uint8_t value2 = 9;
knx.getGroupObject(2).dataPointType(Dpt(3, 7));
knx.getGroupObject(2).value(value2);
-> ETS: $1C | Erhöhen, 12%
Test 4:
uint8_t value2 = 8;
knx.getGroupObject(2).dataPointType(Dpt(3, 7));
knx.getGroupObject(2).value(value2);
-> ETS: $1C | Erhöhen, 12%
Test 5 OK:
uint8_t value3 = 25;
knx.getGroupObject(3).dataPointType(Dpt(5, 5));
knx.getGroupObject(3).value(value3);
-> ETS: $19 | 25
Test 6 OK:
uint8_t value3 = 243;
knx.getGroupObject(3).dataPointType(Dpt(5, 5));
knx.getGroupObject(3).value(value3);
-> ETS: $F3 | 243
Test 7 OK:
float value4 = 22.5;
knx.getGroupObject(4).dataPointType(Dpt(9, 1));
knx.getGroupObject(4).value(value4);
-> ETS: $0c 65 | 22,5
Test 8 OK:
float value4 = 10.5;
knx.getGroupObject(4).dataPointType(Dpt(9, 1));
knx.getGroupObject(4).value(value4);
-> ETS: $04 1a | 10,5
An den Funktionen "void bitToPayload" und "void unsigned8ToPayload" habe ich jetzt nichts geändert, da die auch für andere Datenentypen verwendet werden und man sich diese sonnst zerschießt.
Ich habe jetzt eine Stufe vorher bei den gezielten Datentypen das so angepasst, dass es für mich OK ist:
valueToBusValueBinary:
//bitToPayload(payload, payload_length, 7, value);
payload[7 / 8] = (value ? (1 << (7 - (7 % 8))) : 0);
valueToBusValueStepControl:
//bitToPayload(payload, payload_length, 4, value);
payload[0] = ((uint64_t)value & 0xFF);Zuletzt geändert von SebastianObi; 28.06.2019, 17:11.
Kommentar
-
henfri: bist du mittlerweile mit dem „Adress is not valid 4294967221“ Problem beim BME Sketch weitergekommen.
Wollte eigentlich nichts mehr dran machen, habe aber doch nicht die Finger von lassen können und habe auf die aktuellen Libs aktualisiert.
Bin aber dann auch gleich an den Punkt mit dem Adress not valid gekommen. Habe jetzt noch nicht detailliert untersucht woran es liegen kann.
Grüße und Danke
Johannes
Kommentar
-
Zitat von henfri Beitrag anzeigenJa, habe ich hier auch dokumentiert.
Open Source und Closed Source Part passten nicht zusammen.
Handelt es sich nur um ein Problem mit der BSEC-Lib?
Kommentar
Kommentar