Ankündigung

Einklappen
Keine Ankündigung bisher.

ESP8266 KNX mit ETS

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • thesing
    antwortet
    Dann probier doch mal die Zeile auf:
    Code:
        if (_memoryReference == 0 || address < _memoryReference)
            _memoryReference = address;
    zu ändern.

    Einen Kommentar schreiben:


  • SebastianObi
    antwortet
    Funktioniert bei mir nicht, wenn ich dies auskommentiere kommt die Fehlermeldung noch früher.

    Einen Kommentar schreiben:


  • thesing
    antwortet
    Ich habe eine Idee woran es liegen könnte. Du kannst als Workaround Die beiden Zeilen
    Code:
        if (_memoryReference == 0)
            _memoryReference = address;
    in uint8_t* Platform::allocMemory(size_t size) auskommentieren.

    Ich muss mir mal überlegen wie ich das grundlegende Problem richtig löse.

    Einen Kommentar schreiben:


  • henfri
    antwortet
    Hallo,

    ja genau, davon spreche ich doch. Was dachtest du denn, wovon ich sprach?
    thesing sprach oben, dass mittlerweile alles auf Github veröffentlicht ist und ich meine, ich hätte kürzlich auch alles von der Github Seite geladen und erfolgreich kompiliert

    Gruß,
    Hendrik

    Einen Kommentar schreiben:


  • SebastianObi
    antwortet
    Zitat von thesing Beitrag anzeigen
    Das klingt stark nach nicht initialisierten Speicher. Ich habe jetzt hinzugefügt, dass die Daten vom GroupObject mit 0 initialisiert werden. Kannst du bitte testen ob damit der Problem behoben ist?
    Hallo,

    danke. Dies hat das Problem mit DPT 1 gelöst.

    Jetzt habe ich nur noch ein anderes Phänomen. Sobald ich mehr Parameter und Gruppenadressen verwendet bekomme ich des öfteren die Fehlermeldung "Adress is not valid 5294967289". Obwohl die Produktdatenbank und das C++ Programm 100% tig schon mal funktioniert hatte. Dann habe ich es einen Tag später probiert und dann ging es plötzlich ohne Fehler. Jetzt hänge ich wieder da, wo es reproduzierbar nicht mehr funktioniert. Wie kann ich dies weiter analysieren? Im Anhang habe ich mal die Daten vom ETS Monitor angehängt.

    VG Sebastian
    Angehängte Dateien

    Einen Kommentar schreiben:


  • jorues
    antwortet
    Zitat von henfri Beitrag anzeigen
    Ja, habe ich hier auch dokumentiert.

    Open Source und Closed Source Part passten nicht zusammen.
    Ich habe den Thread nochmal überflogen, aber habe nichts zum entsprechenden Behebung bzw. dass das Problem behoben wurde gefunden. Vielleicht habe ich auch „Tomaten auf den Augen“...

    Handelt es sich nur um ein Problem mit der BSEC-Lib?

    Einen Kommentar schreiben:


  • henfri
    antwortet
    Ja, habe ich hier auch dokumentiert.

    Open Source und Closed Source Part passten nicht zusammen.

    Einen Kommentar schreiben:


  • jorues
    antwortet
    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

    Einen Kommentar schreiben:


  • thesing
    antwortet
    Das klingt stark nach nicht initialisierten Speicher. Ich habe jetzt hinzugefügt, dass die Daten vom GroupObject mit 0 initialisiert werden. Kannst du bitte testen ob damit der Problem behoben ist?

    Einen Kommentar schreiben:


  • SebastianObi
    antwortet
    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
    Hat jemand anders auch solche Probleme? Komischerweise hatte es mit DPT 1,1 einmal funktioniert. Dann hatte ich die Applikation mit der ETS neu übertragen und dann war es immer wieder fehlerhaft.

    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.

    Einen Kommentar schreiben:


  • thesing
    antwortet
    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.

    Einen Kommentar schreiben:


  • SebastianObi
    antwortet
    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);
    Ist das so OK?

    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
    }
    Bitte um Hilfe. Danke

    VG Sebastian
    Zuletzt geändert von SebastianObi; 26.06.2019, 15:41.

    Einen Kommentar schreiben:


  • mumpf
    antwortet
    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

    Einen Kommentar schreiben:


  • thesing
    antwortet
    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.

    Einen Kommentar schreiben:


  • mumpf
    antwortet
    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

    Einen Kommentar schreiben:

Lädt...
X