Seite 1 von 2

HM-LC-Bl1-FM externes setzen der Position

Verfasst: 19.08.2019, 18:01
von Horbi
Hallo Zusammen,

suche mir gerade einen Wolf und komme nicht weiter. Ich würde gerne einen Rolladenaktor zur Steuerung eines Garagentorantriebs nutzen.
Der Sketch basiert derzeit ja auf einer Timersteuerung für das Öffnen und Schliessen.
Am Garagentorantrieb habe ich Endschalter, für offen als auch zu.
Zusätzlich könnte ich eine Positionsbestimmung des Tors über Drehgeber, etc bauen.
Wie kann ich im Sketch zur Laufzeit den Timer beim öffnen/schliessen übersteuern?
Ein

Code: Alles auswählen

 sdev.channel(1).updateLevel(200);
setzt mir zwar den Level sofort, aber beendet nicht den Timer.
Ich bräuchte also eine Möglichkeit direkt auf die StateMachine einzuwirken...

Viele Grüße
Horst

Re: HM-LC-Bl1-FM externes setzen der Position

Verfasst: 19.08.2019, 19:45
von papa
Puh - das ist so nicht vorgesehen. Du könntest versuchen mit switchState() den Timer zu stoppen. Dazu musst Du eine Methode im BlChannel machen, die dann Zugriff auf den aktuellen Status in der "state" Variablen hat.

Code: Alles auswählen

void stopTimer () {
  if( state == AS_CM_JT_RAMPON ) {
    switchState(AS_CM_JT_RAMPON,AS_CM_JT_ON,0);
  }
  if( state == AS_CM_JT_RAMPOFF ) {
    switchState(AS_CM_JT_RAMPOFF,AS_CM_JT_OFF,0);
  }
}
Musst Du mal probieren, ob das klappt.

Re: HM-LC-Bl1-FM externes setzen der Position

Verfasst: 20.08.2019, 15:56
von Horbi
Danke, war ein guter Hinweis. Habe es jetzt so gelöst und scheint zu funktionieren:

Code: Alles auswählen

	case KEY_OPENED_PIN:
		DPRINTLN(F("KEY_OPENED "));
		sdev.channel(1).stop();
		sdev.channel(1).updateLevel(200);
		break;
Habe aber noch ein Problem. Ich würde gerne den Stromverbrauch zum jeweiligen Level messen und speichern (damit ich merke ob irgendwas den Motor blockiert). Also ein Array mit Level in 10'er Schritten von 0 bis 200 - bräuchte dafür aber einen trigger. Jetzt habe ich in der Blind.h das gefunden - trigger scheint alle 100ms aufgerufen zu werden:

Code: Alles auswählen

class BlindStateMachine : public StateMachine<BlindPeerList> {

  class LevelUpdate : public Alarm {
    BlindStateMachine&  sm;
    uint16_t  done;
    uint16_t  fulltime;
    uint8_t   startlevel;
  public:
    LevelUpdate (BlindStateMachine& m) : Alarm(0), sm(m), done(0), fulltime(0), startlevel(0) {
      async(true);
    }
    ~LevelUpdate () {}
    void start (AlarmClock& clock,uint16_t ft) {
      startlevel = sm.status();
      fulltime = ft;
      done = 0;
      set(millis2ticks(100));
      clock.add(*this);
      sm.triggerChanged();
    }
    void stop (AlarmClock& clock) {
      clock.cancel(*this);
      if( done > fulltime ) done = fulltime;
      uint8_t dx = (done * 200UL) / fulltime;
      if( sm.state == AS_CM_JT_RAMPON ) {
        if( dx > (200-startlevel) ) dx = 200-startlevel;
        sm.updateLevel(startlevel + dx);
      }
      else if( sm.state == AS_CM_JT_RAMPOFF ) {
        if( dx > startlevel ) dx = startlevel;
        sm.updateLevel(startlevel - dx);
      }
      sm.triggerChanged();
    }
    virtual void trigger (AlarmClock& clock) {
      // add 0.1s
      ++done;
      set(millis2ticks(100));
      clock.add(*this);
    }
  };
  

Wie kann ich den virtuellen trigger in den Hauptsketch bekommen?
Und gibt es eine variable die ich dann auslesen kann um den momentanen Level angezeigt zu bekommen?

Re: HM-LC-Bl1-FM externes setzen der Position

Verfasst: 20.08.2019, 19:43
von papa
Hm - da kommt man nicht ran. Du kannst aber im Channel in den motorUp/Down/Stop Methoden nen eigenen Alarm starten/stoppen. Das aktuelle Level gibt es in status().

Re: HM-LC-Bl1-FM externes setzen der Position

Verfasst: 10.10.2019, 12:43
von Horbi
und schon wieder eine Frage :-)
ich kann ja mit "sdev.channel(1).getList1().refRunningTimeBottomTop();" einen Listenwert auslesen.
Kann ich auch einen Listenwert schreiben? Ich habe eine Learnfunktion im Motor, ich würde das gerne koppeln, so dass der Arduino die Zeit auch mißt und dann als Registerwert schreibt.

Re: HM-LC-Bl1-FM externes setzen der Position

Verfasst: 10.10.2019, 12:57
von jp112sdl
Horbi hat geschrieben:
10.10.2019, 12:43
Kann ich auch einen Listenwert schreiben?

Code: Alles auswählen

sdev.channel(1).getList1().refRunningTimeBottomTop(MeinWert);
Im AskSinPP-Example steht es sogar schon auskommentiert drin

Re: HM-LC-Bl1-FM externes setzen der Position

Verfasst: 10.10.2019, 13:06
von Horbi
Danke - wer lesen kann und so :-)

Re: HM-LC-Bl1-FM externes setzen der Position

Verfasst: 10.10.2019, 13:16
von Horbi
Super funktioniert - Wert wird sauber gespeichert.
Allerdings sehe ich ihn nicht in der CCU.
Gibt es eine Möglichkeit das der Client ein Update triggert, also seine List1 an die CCU überträgt?

Re: HM-LC-Bl1-FM externes setzen der Position

Verfasst: 10.10.2019, 18:26
von jp112sdl
CCU DevConfig->Device List->Device auswählen, Kanal BLIND:1->Clear device config cache (steht ganz unten)
alternativ gehts auch mit Homematic Manager

Re: HM-LC-Bl1-FM externes setzen der Position

Verfasst: 13.10.2019, 10:24
von Horbi
Hi Jerome,
vielen Dank, aber meine CCU zeigt mir das nicht an... Habe mal den Screenshot angehängt.
Am elegantesten wäre es natürlich, wenn das Endgerät proaktiv die Konfig sendet, wenn im Endgerät was geändert wird.
Viele Grüße
Horst