HM-LC-Bl1-FM mit AskSinPP und STM32F103

Begonnen von Funsailor, 05 Juni 2019, 12:00:46

Vorheriges Thema - Nächstes Thema

Funsailor

Hallo Papa,
ich habe auf einem STM32F103 (STM32 Smart) Board den HM-LC-Bl1-FM realisiert. Auf dem Board ist schon ein EEProm drauf, man muss nur noch den II2C Bus mit 2 PullUPs abschließen.
Ich habe aber immer EEProm Fehlermeldungen bekommen. Auf dem II2C Decoder sah aber alles gut aus....
Um Fehler in meinem HM-LC-Bl1-FM Sketch auszuschließen, habe ich dann den HM-LC-SWX-SM Sketch genommen.
Gleiches Ergebnis... ,,ERROR EEPROM CLEAR" und ERROR EEPROM WRITE...

Ich habe dann die Debugg Anzeigen wieder aktiviert und siehe da, damit klappt es!  ???  :)

Um etwas mehr zu sehen, habe ich die Debugg Ausgabe in der Storage.h erweitert (Beispielhaft bei clearData):

  bool clearData (uint16_t addr, uint16_t size) {
//    DPRINT("clearData: ");DHEX(addr);DPRINT(" ");DDECLN(size);
    bool success = true;
    while( success == true && size > 0 ) {
      uint16_t towrite = calcBlockSize(addr, size);
      DPRINT("  clear: ");DHEX(addr);DPRINT(" ");DDECLN(towrite);
      Wire.beginTransmission(ID);
      Wire.write(addr >> 8);
      Wire.write(addr & 0xff);
      uint8_t done = 0;
      while( done < towrite ) {
        done++;
        Wire.write(0);
      }
      success = Wire.endTransmission() == 0;
      // wait for write operation finished
      if( success == true )
      {
       DPRINT("ATx EEPROM CLEAR OK RetVal: ");DHEX ((uint32_t)success);DPRINT(" ");DDECLN(success);
//        DPRINTLN("ATx EEPROM CLEAR OK");
        success = waitComplete();
      }
      else {

        DPRINT("ATx ERROR EEPROM CLEAR RetVal: ");DDECLN(success);
//        DPRINTLN("ATx ERROR EEPROM CLEAR");
      }
      size -= towrite;
      addr += towrite;
    }
//    DPRINTLN("ATx clearData done");
    return success;
  }

Damit erhalte ich folgende Ausgabe:
AskSin++ V4.0.0 (Jun  5 2019 11:20:09)
Address Space: 32 - 700
00000000
ATx Init Storage: CAFE6682
  clear: 0024 28
ATx EEPROM CLEAR OK RetVal: 00000001 1
  clear: 0040 30
ATx EEPROM CLEAR OK RetVal: 00000001 1
  clear: 005E 2
ATx EEPROM CLEAR OK RetVal: 00000001 1
  clear: 0060 30
ATx EEPROM CLEAR OK RetVal: 00000001 1
  clear: 007E 2
ATx EEPROM CLEAR OK RetVal: 00000001 1
  clear: 0080 30
ATx EEPROM CLEAR OK RetVal: 00000001 1
  clear: 009E 2
ATx EEPROM CLEAR OK RetVal: 00000001 1
  clear: 00A0 30
ATx EEPROM CLEAR OK RetVal: 00000001 1
  clear: 00BE 2

Den Rest lasse ich mal weg.

Kommentiere ich die Zeile
ZitatDPRINT("  clear: ");DHEX(addr);DPRINT(" ");DDECLN(towrite);
aus, erhalte ich diese Ausgabe:

AskSin++ V4.0.0 (Jun  5 2019 11:34:30)
Address Space: 32 - 700
00000000
ATx Init Storage: CAFE6682
ATx ERROR EEPROM CLEAR RetVal: 0
ATx EEPROM CLEAR OK RetVal: 00000001 1
ATx ERROR EEPROM CLEAR RetVal: 0
ATx EEPROM CLEAR OK RetVal: 00000001 1
ATx ERROR EEPROM CLEAR RetVal: 0
ATx EEPROM CLEAR OK RetVal: 00000001 1
ATx ERROR EEPROM CLEAR RetVal: 0
ATx EEPROM CLEAR OK RetVal: 00000001 1


Liegt da ein Timing Problem vor?

Noch eine Frage am Rand.
Die Zeile
     
Zitatsuccess = Wire.endTransmission() == 0;

ist mir nicht ganz klar. Vergleich  ohne Auswertung  ???



- Asus PN 41- mapleCul V1.24.01 - FHEMDuino - FHEM 6.2 - HUE Bridge - ESPEasy Bridge -  Milight HUB - smartVISU 3.40 -

papa

Das kann schon sein. Was ist da für ein EEProm drauf ? Wie groß sind die Pullups ?
Ich nutze für den Dimmer einen AT24C32 und habe 4,7k Pullups.

Und noch ein bisschen C-Kurs - wenn man die impliziten Klammern darum macht, wird es einfacher:
success = (Wire.endTransmission() == 0);
success wird true, wenn endTransmission() eine 0 zurück gibt.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Funsailor

Hallo Papa,
da ist ein 24C04 drauf. 32 Pages a 16 Byte
Ich habe die Initialisierung so angepasst:

#define STORAGEDRIVER at24cX<0x50 ,32,16>
und da die zweite Page auf der anderen Adresse liegt auch das probiert.
#define STORAGEDRIVER at24cX<0x50 ,16,16>

PullUp 4k7, die Flanken sind auf jeden Fall OK.  Den I2C Bus habe ich mir als erstes im Oszi angeschaut. Der Decoder zeigt ja die richtigen Daten.

Ich hatte ja geschriebn, das kein Fehler kommt, wenn ich die Zeile
    DPRINT("  clear: ");DHEX(addr);DPRINT(" ");DDECLN(towrite); 
in der "storage.h" drin lasse. Das hat mich auf die Frage nach einem Timing Problem gebracht.

Mit der Zeile:
Zitatsuccess = Wire.endTransmission() == 0;
werden einem dann aber die Fehlercodes der Funktion endTransmission() unterschlagen.

Bewusst gesehen habe ich das so zum ersten mal und in den letzten 30 Jahren hat es hier auch niemand benutzt.

- Asus PN 41- mapleCul V1.24.01 - FHEMDuino - FHEM 6.2 - HUE Bridge - ESPEasy Bridge -  Milight HUB - smartVISU 3.40 -

papa

Vielleicht funktioniert mit den Chip das waitComplete() nicht. Du kannst den Code auch einfach durch 50ms Delay austauschen.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

papa

BTW: Der EEPROM ist übrigens zu klein. Laut der Ausgabe beim Start werden mindestens 700 Byte benötigt.
Address Space: 32 - 700
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Funsailor

Hmm,  >:(
OK, dann geht das so nicht mit dem "kleinem" EEProm Schade... war halt alles OnBoard.

Habe mal hier ein Delay eingebaut, hat aber nichts gebracht. Morgen geht es weiter...

      if( success == true )
      {
       DPRINT("ATx EEPROM CLEAR OK RetVal: ");DHEX ((uint32_t)success);DPRINT(" ");DDECLN(success);
//        DPRINTLN("ATx EEPROM CLEAR OK");
        _delay_ms(50);
        success = waitComplete();
      }
      else {

        DPRINT("ATx ERROR EEPROM CLEAR RetVal: ");DDECLN(success);
//        DPRINTLN("ATx ERROR EEPROM CLEAR");
      }
- Asus PN 41- mapleCul V1.24.01 - FHEMDuino - FHEM 6.2 - HUE Bridge - ESPEasy Bridge -  Milight HUB - smartVISU 3.40 -

Funsailor

So, um das mit dem EEProm zu testen, habe ich mir mein HM-LC-Bl1-FM Sketch genommen und die Peers verkleinert (die benötigen den meisten Platz im EEProm).
Zitat#define PEERS_PER_CHANNEL 1
Mit dieser Änderung benötiget das Testprogramm nur noch 90 Bytes
ZitatAddress Space: 32 - 90
.

Allerdings liegt es nicht an der Funktion waitComplete, da kann ich Delay einbauen wie will, keine Änderung.
Nachdem ich mir dann die Rückgabewerte von endTransmission angeschaut habe (Im Fehlerfall war das immer 3 -> ENACKTRNS ) habe ich vor jedes endTransmission ein Delay von 1ms eingebaut. Jetzt gehts...  8)

...
#define WaitEEPROM 1
...
    Wire.write(d);

    #warning lahmes EEProm   
     _delay_ms(WaitEEPROM);

    success = Wire.endTransmission() == 0;
    // wait for write operation finished


Wundert mich etwas, auf der Homepage vom Roger Clark  wurde berichtet, das die EEProm Funktionen mit diesem Modul/EEProm gehen.
Aber wer weiß wo meine Module herkommen....  ::) China halt

Ich werde jetzt erstmal mit der Flash-EEProm Emulation weitermachen und mir parallel ein paar "größere + bessere" EEProms besorgen.

- Asus PN 41- mapleCul V1.24.01 - FHEMDuino - FHEM 6.2 - HUE Bridge - ESPEasy Bridge -  Milight HUB - smartVISU 3.40 -

papa

Hm - ist ja eigenartig. Man könnte folgendes in Storage.h aufnehmen

#ifdef EEPROMDELAY
  void _eeprom_delay() { _delay_ms(EEPROMDELAY); }
#else
  void _eeprom_delay() {}
#endif


Und dann vor alle endTransmission ein _eeprom_delay() einfügen.

Für den beiden lokalen taster brauchst Du aber mindestens 2 Peers/Channel. Sollte aber auch noch passen.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Funsailor

Hallo Papa,
so, die 32er EEProms sind endlich da und auf meiner Testplatine ausgetauscht.

Und siehe da, es geht auch mit der original storage.h :D 8) und 12 Peers per Channel.

Deinen Vorschlag mit dem
#define EEPROMDELAY
ist gut.
Nur irgendwo sollte man das festhalten.

So, jetzt geht es erst mal in den Urlaub, danach wird wieder weitergemacht

LG
Funsailor


- Asus PN 41- mapleCul V1.24.01 - FHEMDuino - FHEM 6.2 - HUE Bridge - ESPEasy Bridge -  Milight HUB - smartVISU 3.40 -

Funsailor

Hallo Papa,
als nächsten Schritt würde ich mir gerne einen 3 Fach Rollladen Aktor bauen.

Leider gibt es für die MultiChannelDevice nur den SwitchChannel, kann man die Klasse eins zu eins kopieren und als BlindChannel in die Blind.h einfügen?
Wenn ich mir aber die beiden Klassen anschaue, sieht das nach mehr Arbeit aus. Mt Unterstützung bekomme ich das vieleicht hin, aber um Templates habe ich bisher einen großen Bogen gemacht  :-[

Hintergrund: Ich habe seit ca 25 Jahren in mehreren Rollladenkästen 220V Relais für je 3 Rohrmotoren. Zum Betätigen benutze ich im Moment 3 Umschalter (Hoch/Aus/Runter) die auf einer der 3 Blenden der ehemaligen Gurtwickler montiert sind. Nicht schön, aber garantiert ein Unikat 8).
Das ganze habe ich im Moment 3 mal.
Vorteil: Ich kann die Ansteuerung im Kleinspannungsbereich aufbauen und zum Ansteuern der vorhandenen Relais FETs benutzen, dann passt die Mimik in einen Mauerkasten der Gurtwickler.
- Asus PN 41- mapleCul V1.24.01 - FHEMDuino - FHEM 6.2 - HUE Bridge - ESPEasy Bridge -  Milight HUB - smartVISU 3.40 -

papa

Das geht doch ganz einfach. Schau mal in HM-LC-Bl1-FM.ino Zeile 111. Dort wird das Blinddevice definiert. Die 1 im Template gibt die Anzahl der Kanäle an. Für 3 Kanäle muss es also wie folgt definiert werden:
typedef MultiChannelDevice<Hal,BlChannel,3,BlindList0> BlindType;
Jetzt müssen noch die Steuerpins je nach Kanal angepasst werden. Das kann einfach in den motorUp(), motorDown() und motorStop() Methoden im BlindChannel erfolgen. Du kannst da einfach die Kanalnummer mit number() abfragen z.B.
void motorUp () {
  digitalWrite(getDirPin(),HIGH);
  digitalWrite(getOnPin(),HIGH);
}
uint8_t getDirPin () {
  if( number() == 1 ) return DIRPIN1;
  if( number() == 2 ) return DIRPIN2;
  return DIRPIN3;
}
uint8_t getOnPin () {
  if( number() == 1 ) return ONPIN1;
  if( number() == 2 ) return ONPIN2;
  return ONPIN3;
}

Wenn Du für alle Kanäle auch noch die Taster brauchst, müssen diese noch entsprechend in initPeerings() mit den Kanälen verknüpfen.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Funsailor

Hallo Papa,
danke für deine schnelle Antwort.
Ich bin vom Projekt HM-LC-SWX-SM ausgegangen (4 Kanal Switch) und dachte ich muss das so ähnlich machen.

Ich würde auch gerne wieder Schalter benutzen um die Automatik (Zeit und Sonnensteuerung) nur bei OFF der Schalter zulassen.
Das ist mir vor allem bei der Terrassentür wichtig.
Ich habe dazu auch irgendwo etwas gelesen, finde es aber nicht mehr.. Ich habe da irgendwas mit longpoll im Kopf.
Aber prinzipiell müsste das doch gehen, oder?
- Asus PN 41- mapleCul V1.24.01 - FHEMDuino - FHEM 6.2 - HUE Bridge - ESPEasy Bridge -  Milight HUB - smartVISU 3.40 -

papa

BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Funsailor

Hallo Papa,
ich steuere die Rollladen im Moment mit Schalter an:

Nach Oben -> Auf
Mittelstellung -> Keine Funktion, Rollladen bleibt stehen
Nach Unten -> Zu

Ich möchte bei den neuen 3 Fach Rollladen Aktor so lösen, das ich die Schalter weiterhin benutzen kann.

Nach Oben -> Auf             +  Automatik aus
Mittelstellung -> Stopp     +  Automatik ein
Nach Unten -> Zu             +  Automatik aus (Terrassenrollladen: Notfallsituationen dürfen den Rollladen automatisch öffnen)

Die Schalter werden in FHEM ausgewertet, dort erfolgt dann die Unterdrückung der Automatik.

Da bei dem HM-LC-Bl1-FM ein eigener Anlerntaster vorhanden ist, wäre das Thema "reset Device" und "enter paring Mode" kein Problem.  :-\

In der Funktion check() gibt es ja den case "pressed" und "longpressed". Erst wenn der pinstate auf OFFSTATE wechselt, geht es weiter.

Der state wird nach einem "longpressed" auf "longreleased" gesetzt,  und damit wird bei einem "InternalButton" mit "longreleased"
der counter hochgezählt.

Also müsste das funktionieren.

Oder gibt es Einschränkungen die ich nicht sehe?


- Asus PN 41- mapleCul V1.24.01 - FHEMDuino - FHEM 6.2 - HUE Bridge - ESPEasy Bridge -  Milight HUB - smartVISU 3.40 -

papa

Ich habe es irgendwie immer noch nicht verstanden, was Dein Problem sein könnte ....
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Funsailor

Hallo Papa,
die meisten original Homematic Device können nur mit Taster benutzt werden da bei Dauerdruck der Pairing Modus aktiviert wird. Für mein Anwendungsfall mit den Schaltern wäre das unbrauchbar.
Das wollte ich im Vorfeld abklären.

Ich wollte das auch nicht mit dem auf meinem produktive System testen, da ich dieses (nach dem abrauchen der SSD) vor dem letztem Urlaub auf Vordermann gebracht habe.
Und das Testsystem wartet noch auf  die Fertigstellung.
Da hatten die letzten Wochen andere Arbeiten im Haus prio. Ist auch schon 30 Jahre und besteht auf ein bisschen Pflege .... Die Installationen (Wasser/Heizung/Strom) sind fast alle noch original und im Moment ist da echt der Wurm drin.
- Asus PN 41- mapleCul V1.24.01 - FHEMDuino - FHEM 6.2 - HUE Bridge - ESPEasy Bridge -  Milight HUB - smartVISU 3.40 -

Funsailor

#16
Hallo,
der dreifach Rollladenaktor wird als einfach Rollladenaktor erkannt und in FHEM eingetragen.
Um die Funktion der Schalter zu testen reicht das aus. Lasse ich den Schalter in einer Stellung wird das zwar erkannt aber es erfolgt keine Aktion, erst beim loslassen des Schalters wird der Rollladen verfahren.
Im Monitor sehe ich das:
23:52:15.760 -> jumpToTarget: 5 9
23:52:15.760 -> setDestLevel: 0
23:52:15.760 -> Switch from 05 to 04
23:52:15.760 -> Switch from 04 to 05
23:52:16.182 ->  longpressed
23:52:16.182 -> -> 0B 52 02 40 6033AF 6033AF 41 09  - 1511195
23:52:16.182 -> jumpToTarget: 5 9
23:52:16.182 -> setDestLevel: 0
23:52:16.182 -> Switch from 05 to 04
23:52:16.182 -> Switch from 04 to 05
23:52:16.552 ->  longpressed
23:52:16.552 -> -> 0B 53 02 40 6033AF 6033AF 41 09  - 1511595
23:52:16.552 -> jumpToTarget: 5 9
23:52:16.552 -> setDestLevel: 0
23:52:16.552 -> Switch from 05 to 04
23:52:16.552 -> Switch from 04 to 05
23:52:16.974 ->  longpressed
23:52:16.974 -> -> 0B 54 02 40 6033AF 6033AF 41 09  - 1511995
23:52:16.974 -> jumpToTarget: 5 9
23:52:16.974 -> setDestLevel: 0
23:52:16.974 -> Switch from 05 to 04
23:52:16.974 -> Switch from 04 to 05
23:52:17.338 ->  longpressed
23:52:17.338 -> -> 0B 55 02 40 6033AF 6033AF 41 09  - 1512395
23:52:17.384 -> jumpToTarget: 5 9
23:52:17.384 -> setDestLevel: 0
23:52:17.384 -> Switch from 05 to 04
23:52:17.384 -> Switch from 04 to 05
23:52:17.478 ->  longreleased


Gibt es eine Möglichkeit das der Rolladen dann bis zum Endanschlag fährt?

Wo besorge ich mir die Device Model Nummer für ein eigenes Device?
Die zugehörigen XML Beschreibung muss ich dann auch noch anpassen. ???

Edit:
Die Schaltern muss ich dann so machen wie jp112sdl im Beispiel:
https://github.com/jp112sdl/Beispiel_AskSinPP/blob/master/examples/HM-SCI-3-FM/HM-SCI-3-FM.ino

Als ersten Schritt habe ich den Sketch HM-SCI-3-FM auf den STM32 angepasst (ohne LowPower da ich kein Batterie System habe)
Der läuft schon mal durch. Da ich mal wieder auf Achse bin, kann ich das leider erst am Montag in FHEM testen.

Der nächste Schritt wird die Implemetierung der Schalter in den HM-LC-BL3-FM Sketch sein....

Wo ich im Moment keinen Fahrplan habe ist bei der FHEM Anpassung.
Ich habe mal gelesen das Papa auf einen Thread verwiesen hat wie die PL Datei anzupassen ist, ich finde den aber nicht mehr. Wahrscheinlich benutze ich die falschen Suchparameter...
Kann mir da bitte jemand auf die Sprünge helfen?



- Asus PN 41- mapleCul V1.24.01 - FHEMDuino - FHEM 6.2 - HUE Bridge - ESPEasy Bridge -  Milight HUB - smartVISU 3.40 -

papa

Mach doch erst mal die Schalter mit einem Kanal - dann sehen wir weiter.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Funsailor

#18
Hallo Papa,
wie kann ich die Schalterstellung (open/closed) im HM-SCI-3-FM auslesen? Den HM-SCI-3-FM Sketch läuft bei mir, ich sehe in FHEM auch die Open/Closed Messages, und suche nun die richtige Funktion um die Schalterstellung im Sketch auszulesen.
Als erstes wollte ich mir die Schalter Stellung über den Monitor ausgeben, die wird ja später benötigt...

Ich habe zwar in der Klasse ThreeStateGenericChannel die Funktion readPin gesehe, aber ich komme da nicht an die Funktion ran....
- Asus PN 41- mapleCul V1.24.01 - FHEMDuino - FHEM 6.2 - HUE Bridge - ESPEasy Bridge -  Milight HUB - smartVISU 3.40 -

papa

ThreeStateChannel::status() gibt den aktuellen Status zurück.
Der Status ergibt sich aus den Zuständen der 2 Pins und wird aus der posmap[PIN2<<1 | PIN1] ausgelesen.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Funsailor

Hallo Papa,
ich wollte nur einen kurzen Zwischenstatus abgeben.

Hiermit bekomme ich die Zustände meiner Schalter:

PinStatePA2 = sdev.channel(1).status();    //(PA2)
PinStatePA2 = sdev.channel(2).status();    //(PA3)

Danke für den Hinweis.

Zitat
Werden  die Eingänge statisch abgefragt oder wieder mit den EXTI Interrupts?
Ich Frage wegen der Eigenschaft der STM32 Controller. Diese lassen ja nur einen EXTI Interrupt pro Pinnummer zu.
Für Mitleser die die STM32 Controller nicht so genau kennen:
Es gibt nur einen EXTI0 Interrupt der auf die Px0 Pins (PA0 PB0 PC0 PD0 PE0 PF0 PG0) wirkt.
Man kann also nur einen der aufgelisteten PinPorts als Eingänge benutzen.

Melde mich nach dem Urlaub wieder
- Asus PN 41- mapleCul V1.24.01 - FHEMDuino - FHEM 6.2 - HUE Bridge - ESPEasy Bridge -  Milight HUB - smartVISU 3.40 -

Funsailor

#21
Hallo Papa,
ich muss gestehen, das ich jetzt nicht so recht weiterkomme... Ich habe versucht die "ThreeStateChannel" (aus dem Sketch HM-LC-Bl3-FM-SCI) in den HM-LC-BL1-FM Sketch einzubauen.... Ist eigentlich nur ein Versuch ohne zu wissen wo ich genau ansetzen muss.. :-[

Ich habe mal meinen Versuch (den mit den wenigsten Fehler) angehängt...  :-\

Eigentlich wollte ich schon verstehen was ich mache, aber da habe ich noch viel Arbeit vor mir.
Kannst du mal darüber sehen ohne gleich in Ohnmacht zu fallen ... ich bin da im Moment nur am rumprobieren.

LG
Michael
- Asus PN 41- mapleCul V1.24.01 - FHEMDuino - FHEM 6.2 - HUE Bridge - ESPEasy Bridge -  Milight HUB - smartVISU 3.40 -

papa

Ich habe ehrlicherweise mittlerweile schon wieder vergessen, worum es ging.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Funsailor

#23
Hallo Papa,
die Rollos mit Schalter anstatt Taster ansteuern...
- Asus PN 41- mapleCul V1.24.01 - FHEMDuino - FHEM 6.2 - HUE Bridge - ESPEasy Bridge -  Milight HUB - smartVISU 3.40 -

papa

#24
Hm - dein Code wird so nicht gehen. Du brauchst ein MixedChannelDevice mt 3 Blind-Channels und 3 ThreeState-Channels (0 - Down-Schalter, 50 - kein Schalter, 100 Up-Schalter). Schau Dir mal das HM-SEN-MDIR-WM55.ino an. Das hat auch unterschiedliche Channeltypen.
Den ThreeState kannst Du im HM-SEC-RHS ansehen. Dort werden auch zwei Pins genutzt, um 3 Zustände abzubilden.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Funsailor

Hallo Papa,
danke für deine Hinweise, werde ich mir mal ansehen.....

- Asus PN 41- mapleCul V1.24.01 - FHEMDuino - FHEM 6.2 - HUE Bridge - ESPEasy Bridge -  Milight HUB - smartVISU 3.40 -