HM-LC-Dim1PWM-CV Problem mit der State Machine

Entwicklung und Bau von Hardware aller Art, die im HM-Umfeld eingesetzt werden kann

Moderator: Co-Administratoren

Horbi
Beiträge: 199
Registriert: 29.05.2019, 12:51
Hat sich bedankt: 19 Mal
Danksagung erhalten: 65 Mal

HM-LC-Dim1PWM-CV Problem mit der State Machine

Beitrag von Horbi » 18.05.2020, 19:48

Hallo Zusammen,

es scheint ein Problem beim Dimmer Sketch mit der state machine zu geben. Darauf gekommen bin ich mit einer Treppenhauslichtschaltung.
Wenn man in der Phase AS_CM_JT_OFFDELAY retriggert, sollte der Sketch zu AS_CM_JT_ONDELAY springen und von vorne abgearbeitet werden.

Zumindest ist das so im Jumptable hinterlegt:

Code: Alles auswählen

SHORT_JT_OFF		ONDELAY	 	 	 
SHORT_JT_ON		RAMPON 	 
SHORT_JT_OFFDELAY	RAMPON	 	 	 
SHORT_JT_ONDELAY	RAMPON	 	 	 
SHORT_JT_RAMPOFF	RAMPON	 	 	 
SHORT_JT_RAMPON		NO_JUMP_IGNORED
In Wirklichkeit springt er aber zu AS_CM_JT_ON, bleibt dort stehen, das Hinterlegte Delay wird nicht abgearbeitet.
Jmp: AS_CM_JT_OFFDELAY - AS_CM_JT_ON
Dimmer State: 03 -> 02 Level: C8 Delay: 00000064

Weiteres triggern wird ignoriert.
Jmp: AS_CM_JT_ON - AS_CM_JT_NONE

Das ganze ist wiederholbar...
Gerade fehlt mir die Idee wie ich das analysieren kann. Kenne die Tiefen der Lib noch nicht wirklich.
Viele Grüße
Horst

papa
Beiträge: 705
Registriert: 22.05.2018, 10:23
Hat sich bedankt: 24 Mal
Danksagung erhalten: 120 Mal

Re: HM-LC-Dim1PWM-CV Problem mit der State Machine

Beitrag von papa » 18.05.2020, 20:24

Das kann schon sein, dass die Statemachine nicht ganz fehlerfrei ist. Die Implementierung ist in Dimmer.h -> DimmerStateMachine.
Ich habe aber Deine Ausführung auch noch nicht so ganz verstanden.
Wird der State über ein Sensor-Event oder Remote-Event ausgelöst ? Wie sehen die Jump-Table, Conditon-Table und Delays aus ? Bevor ich mich wieder ewig in die Statemachine einarbeite, sollten wir erst mal sicherstellen, das die Register alle logisch korrekt sind.
Anfragen zur AskSin++ werden nur im Forum beantwortet

Horbi
Beiträge: 199
Registriert: 29.05.2019, 12:51
Hat sich bedankt: 19 Mal
Danksagung erhalten: 65 Mal

Re: HM-LC-Dim1PWM-CV Problem mit der State Machine

Beitrag von Horbi » 19.05.2020, 12:16

Den State setze ich über einen Remote Event, das Verhalten bleibt aber auch über den InternalKey.

Hier funktioniert es, Treppenhauslicht läuft durch (Rampenzeit beim Einschalten 1s, Verweildauer im Zustand "ein" 10s, Rampenzeit beim Ausschalten 2s):

Code: Alles auswählen

Remote event - current: AS_CM_JT_OFF - next: AS_CM_JT_ONDELAY
Dimmer State: 06 -> 01  Level: 00  Delay: 00000000
Dimmer State: 01 -> 02  Level: 00  Delay: 00000064
Ramp/Level: 100/200

Dimmer State: 02 -> 03  Level: C8  Delay: 000003E8

Dimmer State: 03 -> 04  Level: C8  Delay: 00000000
Dimmer State: 04 -> 05  Level: C8  Delay: 000000C8
Ramp/Level: 200/0
Dimmer State: 05 -> 06  Level: 00  Delay: FFFFFFFF
Hier funktioniert es nicht, Treppenhauslicht bleibt im Zustand "ein" stehen:

Code: Alles auswählen

Remote event - current: AS_CM_JT_OFF - next: AS_CM_JT_ONDELAY
Dimmer State: 06 -> 01  Level: 00  Delay: 00000000
Dimmer State: 01 -> 02  Level: 00  Delay: 00000064
Ramp/Level: 100/200

Dimmer State: 02 -> 03  Level: C8  Delay: 000003E8

Remote event - current: AS_CM_JT_ON - next: AS_CM_JT_RAMPON
Dimmer State: 03 -> 02  Level: C8  Delay: 00000064
Ramp/Level: 100/200
Das Peer ist wie folgt konfiguriert:

Code: Alles auswählen

-> 10 0C A0 01 45FBFA 4109F2 01 05 4E 6C 05 01 03  - 7348
<- 0A 0C 80 02 4109F2 45FBFA 00  - 7469
-> 19 15 A0 01 45FBFA 4109F2 01 08 07 2A 0A 81 0B 12 0C 22 0D 20 0E 40 10 14  - 7514
<- 0A 15 80 02 4109F2 45FBFA 00  - 7628
-> 19 1E A0 01 45FBFA 4109F2 01 08 14 14 15 00 17 0A 19 04 1A 04 87 2A 8A A1  - 7673
<- 0A 1E 80 02 4109F2 45FBFA 00  - 7788
-> 19 27 A0 01 45FBFA 4109F2 01 08 8B 12 8C 22 8D 20 8E 40 90 14 94 14 95 00  - 7835
<- 0A 27 80 02 4109F2 45FBFA 00  - 7948
-> 11 30 A0 01 45FBFA 4109F2 01 08 97 0A 99 04 9A 04  - 7985
<- 0A 30 80 02 4109F2 45FBFA 00  - 8108
-> 0B 39 A0 01 45FBFA 4109F2 01 06  - 8138
<- 0A 39 82 02 4109F2 45FBFA 00  - 8257
Reicht das an Info?

Ein weiterer Punkt der mir aufgefallen ist, Du definierst in cm.h diese Stati:

Code: Alles auswählen

	#define AS_CM_JT_NONE                                     0
	#define AS_CM_JT_ONDELAY                                  1
	#define AS_CM_JT_REFON                                    2						// Ignore for dimmer
	#define AS_CM_JT_ON                                       3
	#define AS_CM_JT_OFFDELAY                                 4
	#define AS_CM_JT_REFOFF                                   5						// Ignore for dimmer
	#define AS_CM_JT_OFF                                      6
	#define AS_CM_JT_RAMPON                                   8
	#define AS_CM_JT_RAMPOFF                                  9
In der Device XML sind die Stati aber anders definiert:

Code: Alles auswählen

					<option id="NO_JUMP_IGNORE_COMMAND"/>
					<option id="ONDELAY" default="true"/>
					<option id="RAMPON"/>
					<option id="ON"/>
					<option id="OFFDELAY"/>
					<option id="RAMPOFF"/>
					<option id="OFF"/>
Kann das die Ursache sein?

Update - habe noch ein wenig weiter gesucht - Mittlerer weile glaube ich das die List3, etc korrekt gelesen wird und auch die Stati stimmen.
Das Problem scheint die Änderung der State Machine zu sein.
Remote event - current: AS_CM_JT_ON - next: AS_CM_JT_RAMPON
Dimmer State: 03 -> 02 Level: C8 Delay: 00000064

papa
Beiträge: 705
Registriert: 22.05.2018, 10:23
Hat sich bedankt: 24 Mal
Danksagung erhalten: 120 Mal

Re: HM-LC-Dim1PWM-CV Problem mit der State Machine

Beitrag von papa » 19.05.2020, 14:42

Kannst Du hier bitte mal den Delay (dly) mit ausgeben.
https://github.com/pa-pa/AskSinPP/blob/ ... mer.h#L243
Anfragen zur AskSin++ werden nur im Forum beantwortet

Horbi
Beiträge: 199
Registriert: 29.05.2019, 12:51
Hat sich bedankt: 19 Mal
Danksagung erhalten: 65 Mal

Re: HM-LC-Dim1PWM-CV Problem mit der State Machine

Beitrag von Horbi » 19.05.2020, 17:21

Einmal gedrückt...

Code: Alles auswählen

Remote event - current: AS_CM_JT_OFF - next: AS_CM_JT_ONDELAY

update state: 6 , next: 1 , dly: 00000000
Dimmer State: 06 -> 01  Level: 00  Delay: 00000000
DELAY_NO

update state: 1 , next: 2 , dly: 00000064
Dimmer State: 01 -> 02  Level: 00  Delay: 00000064
Ramp/Level: 100/200, dly:0

update state: 2 , next: 3 , dly: 000003E8
Dimmer State: 02 -> 03  Level: C8  Delay: 000003E8

update state: 3 , next: 4 , dly: 00000000
Dimmer State: 03 -> 04  Level: C8  Delay: 00000000

update state: 4 , next: 5 , dly: 000000C8
Dimmer State: 04 -> 05  Level: C8  Delay: 000000C8
Ramp/Level: 200/0, dly:0

update state: 5 , next: 6 , dly: FFFFFFFF
Dimmer State: 05 -> 06  Level: 00  Delay: FFFFFFFF
Wiederholt gedrückt:

Code: Alles auswählen

Remote event - current: AS_CM_JT_OFF - next: AS_CM_JT_ONDELAY

update state: 6 , next: 1 , dly: 00000000
Dimmer State: 06 -> 01  Level: 00  Delay: 00000000

update state: 1 , next: 2 , dly: 00000064
Dimmer State: 01 -> 02  Level: 00  Delay: 00000064
Ramp/Level: 100/200, dly:0

update state: 2 , next: 3 , dly: 000003E8
Dimmer State: 02 -> 03  Level: C8  Delay: 000003E8

Remote event - current: AS_CM_JT_ON - next: AS_CM_JT_RAMPON

update state: 3 , next: 2 , dly: 00000064
Dimmer State: 03 -> 02  Level: C8  Delay: 00000064
Ramp/Level: 100/200, dly:0
Soweit ich es nachverfolgt habe scheint das Problem hier zu sein:

Code: Alles auswählen

      if ( state == AS_CM_JT_RAMPON || state == AS_CM_JT_RAMPOFF ) {
        DPRINTLN("ALARM INIT");
        alarm.init(state,lst);
        sysclock.add(alarm);
      }
Aus meiner Sicht müsste doch hier ein Timer für Rampon gesetzt werden?

papa
Beiträge: 705
Registriert: 22.05.2018, 10:23
Hat sich bedankt: 24 Mal
Danksagung erhalten: 120 Mal

Re: HM-LC-Dim1PWM-CV Problem mit der State Machine

Beitrag von papa » 19.05.2020, 19:52

Ne - 0 ist ok. Damit sollte der Delay nach dem RampOn aus der Liste genommen werden.
Kannst Du hier in den if/else Block nochmal ordentlich Debugging-Ausgaben rein machen.
https://github.com/pa-pa/AskSinPP/blob/ ... mer.h#L285
Anfragen zur AskSin++ werden nur im Forum beantwortet

papa
Beiträge: 705
Registriert: 22.05.2018, 10:23
Hat sich bedankt: 24 Mal
Danksagung erhalten: 120 Mal

Re: HM-LC-Dim1PWM-CV Problem mit der State Machine

Beitrag von papa » 19.05.2020, 20:22

Diesen Output brauche ich auch noch
https://github.com/pa-pa/AskSinPP/blob/ ... mer.h#L269
Anfragen zur AskSin++ werden nur im Forum beantwortet

Horbi
Beiträge: 199
Registriert: 29.05.2019, 12:51
Hat sich bedankt: 19 Mal
Danksagung erhalten: 65 Mal

Re: HM-LC-Dim1PWM-CV Problem mit der State Machine

Beitrag von Horbi » 20.05.2020, 10:48

Geht:

Code: Alles auswählen

Remote event - current: AS_CM_JT_OFF - next: AS_CM_JT_ONDELAY

setState - update state: 6 , next: 1 , dly: 00000000
Dimmer State: 06 -> 01  Level: 00  Delay: 00000000
setState - DELAY_NO

setState - update state: 1 , next: 2 , dly: 00000064
Dimmer State: 01 -> 02  Level: 00  Delay: 00000064
setState - ALARM INIT
Ramp/Level: 100/200, dly:0
Level/Dx/Tack: 0/2/1

rampStep - tack: 00000001 ca. 100x

call setState - next: 3, delay: 000003E8
setState - update state: 2 , next: 3 , dly: 000003E8
Dimmer State: 02 -> 03  Level: C8  Delay: 000003E8
setState - NEW ALARM

call setState - next: 4, delay: 00000000
setState - update state: 3 , next: 4 , dly: 00000000
Dimmer State: 03 -> 04  Level: C8  Delay: 00000000
setState - DELAY_NO

setState - update state: 4 , next: 5 , dly: 000000C8
Dimmer State: 04 -> 05  Level: C8  Delay: 000000C8

setState - ALARM INIT
Ramp/Level: 200/0, dly:0
Level/Dx/Tack: 200/1/1

rampStep - tack: 00000001 ca. 200x

call setState - next: 6, delay: FFFFFFFF
setState - update state: 5 , next: 6 , dly: FFFFFFFF
Dimmer State: 05 -> 06  Level: 00  Delay: FFFFFFFF
Geht nicht:

Code: Alles auswählen

Remote event - current: AS_CM_JT_OFF - next: AS_CM_JT_ONDELAY

setState - update state: 6 , next: 1 , dly: 00000000
Dimmer State: 06 -> 01  Level: 00  Delay: 00000000
setState - DELAY_NO

setState - update state: 1 , next: 2 , dly: 00000064
Dimmer State: 01 -> 02  Level: 00  Delay: 00000064
setState - ALARM INIT
Ramp/Level: 100/200, dly:0
Level/Dx/Tack: 20/1/1

rampStep - tack: 00000001 ca. 100x

call setState - next: 3, delay: 000003E8
setState - update state: 2 , next: 3 , dly: 000003E8
Dimmer State: 02 -> 03  Level: C8  Delay: 000003E8
setState - NEW ALARM

Remote event - current: AS_CM_JT_ON - next: AS_CM_JT_RAMPON

setState - update state: 3 , next: 2 , dly: 00000064
Dimmer State: 03 -> 02  Level: C8  Delay: 00000064
setState - ALARM INIT
Ramp/Level: 100/200, dly:0
Level/Dx/Tack: 200/1/4294967295

Hurra, ich glaube ich habe den Fehler.

Code: Alles auswählen

      DPRINT("RA init - ramptime: "); DHEX(ramptime); DPRINT(" ,diff: "); DHEXLN(diff);
      if( ramptime > diff ) {
        dx = 1;
        tack = ramptime / diff;
      }
      else {
Ramptime wäre 100, diff ist 0 - damit wird durch 0 geteilt und läuft auf Fehler.
Das erklärt den Tack Wert von: 4294967295
Zuletzt geändert von Horbi am 20.05.2020, 11:29, insgesamt 1-mal geändert.

papa
Beiträge: 705
Registriert: 22.05.2018, 10:23
Hat sich bedankt: 24 Mal
Danksagung erhalten: 120 Mal

Re: HM-LC-Dim1PWM-CV Problem mit der State Machine

Beitrag von papa » 20.05.2020, 11:09

Hier sieht man das Problem - der Timer wird mit 4294967295 gestartet.

Code: Alles auswählen

Level/Dx/Tack: 200/1/4294967295
Das dürfte echt lange dauern. Hm - die Berechnung des Ramp-Timers (Variable tack) scheint nicht zu klappen, wenn der anzufahrende Level bereits erreicht ist. Ich schau heute Abend mal drauf - wenn ich es schaffe. Wahrscheinlich muss das extra behandelt werden.
Anfragen zur AskSin++ werden nur im Forum beantwortet

papa
Beiträge: 705
Registriert: 22.05.2018, 10:23
Hat sich bedankt: 24 Mal
Danksagung erhalten: 120 Mal

Re: HM-LC-Dim1PWM-CV Problem mit der State Machine

Beitrag von papa » 20.05.2020, 11:35

Mach mal folgende Änderung

Code: Alles auswählen

if( diff == 0 ) { dx = 0; tack = 1; } 
else if( ramptime > diff ) { ....
Anfragen zur AskSin++ werden nur im Forum beantwortet

Antworten

Zurück zu „Hardwareentwicklung und Selbstbau von Aktoren und Sensoren“