Arduino Asksin library

Begonnen von trilu, 06 August 2013, 10:02:17

Vorheriges Thema - Nächstes Thema

unimatrix

Es geht ja darum dass auf den Devices von eq3 schon ein empört drauf ist... Fuer die Anwendung reicht es wohl wirklich einfach die paar ms zu warten bzw.  in der hal abzupruefen ob das eeprom bereit ist.

unimatrix

@trilu

unter https://github.com/unimatrix27/Asksin/tree/mymaster findest du eine dimmer.cpp und dimmer.h - dies ist der erste Draft einer Dimmerklasse, deckt bis jetzt nur trigger11 ab.

ich bin allerdings auf einer Dienstreise und kann das nicht auf einem Device testen. Aber nur  mal so als Zwischenstand...

PeterS

Hallo unimatrix

Zitat von: unimatrix am 28 Juli 2014, 14:05:04
Übrigens eine Register.h für einen 8-Kanal Aktor würde ungefähr so aussehen. Wenn man da mehrere Peers braucht gibts aber EEProm Platzprobleme.

Bei mir erscheint zwar die Komponente in FHEM, allerdings ohne schaltbare Kanäle.

Ich habe nun mal das Script destillRegs.pl mal mit der mitgelieferten devDefinition.pm ausgeführt und das Ergebnis in eine Register.h Datei umgeleitet. anschliessend noch die Headerinfos dazu kopiert und erhalte beim Kompilieren nun folgende Meldung:

AskSin\AskSinMain.cpp.o: In function `HM::loadDefaults()':
C:\Users\Test\Documents\Arduino\libraries\AskSin/AskSinMain.cpp:249: undefined reference to `dtRegs'
C:\Users\Test\Documents\Arduino\libraries\AskSin/AskSinMain.cpp:255: undefined reference to `dtRegs'
C:\Users\Test\Documents\Arduino\libraries\AskSin/AskSinMain.cpp:255: undefined reference to `dtRegs'
C:\Users\Test\Documents\Arduino\libraries\AskSin/AskSinMain.cpp:254: undefined reference to `dtRegs'

Hast du noch ein paar Tipps für mich ?

Gruss Peter

unimatrix

Hallo PeterS,

Damit ein Device in FHEM funtktioniert, muss es natürlich in HMConfig überhaupt existieren. Dieser Thread hier geht hauptsächlich um die Firmware der Module. Für eine komplette Integration muss immer auch die FHEM Seite angepasst/erweitert werden- zumindest bei neuen Modulen die es ansonsten "so nicht gibt".

Wenn man Module die es auch von EQ3 gibt nachbaut oder zumindest solche, die die gleiche Art und Anzahl an Kanälen haben, dann kann man diesen die entsprechende Modell ID in der register.h geben. FHEM "kennt" sie dann und legt auch die Kanäle richtig an.

Der andere Fehler von dir sagt ja schon, was fehlt. Nämlich die Definition von dtRegs. Diese kann unten an die register.h manuell angefügt werden und führt dazu, dass du Defaultwerte in den Listen hast.

Beispiel:

const uint8_t regs01[] PROGMEM = {0x00,0x00,0x11,0x22,0x33};    //(Default wird als Pair 112233 eingetragen, so muss man nicht immer neu pairen)

s_defaultRegsTbl defaultRegsTbl[] = {
{1, 0, 0, 0, 5, regs01},
};

HM::s_dtRegs dtRegs = {
// amount of lines in defaultRegsTbl[], pointer to defaultRegsTbl[]
1, defaultRegsTbl
};


PeterS

Hallo kuek

Ich kann das Verhalten, dass die Kanäle nach einigen Sekunden abschalten auch auf einem Panstamp feststellen.
Konntest du das Problem schon lösen ?

Zitat von: kuek am 20 Juli 2014, 20:27:06
Habe die gesamte lib getauscht und den aktuellen status von trilu genommen. Damit geht es prinzipiell.

-> 0E 1E B0 11 F1 00 64 00 00 63 02 01 C8 00 00 (l:15)
<- 0E 1E 80 02 00 00 63 F1 00 64 01 01 C8 00 00 (l:15)
<- 0E 05 A4 10 00 00 63 F1 00 64 06 01 C8 00 00 (l:15)
-> 0A 05 80 02 F1 00 64 00 00 63 00 (l:11)


Allerdings funktioniert es nur wenige Minuten, danach schaltet der arduino wieder konstant aus, wie gehabt. Nach einem reset geht es dann wieder.
Werde mal neue arduino hardware testen, vielleicht liegt es doch an der China version!?

Grüße,
kuek

Gruss Peter

unimatrix

Habe einen Bug in der Lib gefunden der dazu führen kann dass nach einem Einschalten über FHEM die Kanäle nach einer zufälligen Zeit wieder abschalten.

Kann in Kürze einen Fix bereitstellen

PeterS

Hallo unimatrix

Ich würde dann auch diesen testen  ;)

Zitat von: unimatrix am 31 Juli 2014, 13:26:15
Habe einen Bug in der Lib gefunden der dazu führen kann dass nach einem Einschalten über FHEM die Kanäle nach einer zufälligen Zeit wieder abschalten.

Kann in Kürze einen Fix bereitstellen

Gruss Peter

unimatrix

Der hier angefügte Patch (Trilu kann überlegen, ob er das in die bestehende Lib (nicht die neue, die in Erstellung ist) noch einpatchen möchte auf dem Git) beinhaltet:

- Bug: Kanal schaltet manchmal nach einer Zeit x, die unterschiedlich ist, ab. Dies lag daran, dass, wenn unlimitiert eingeschaltet wird per FHEM, nicht geprüft wurde, ob es eine OnTime überhaupt gibt und dann ein Wert per Zeiger aus dem Speicher genommen wurde, der ggf. einen undefinierten Zustand haben konnte. Der Kanal hat reagiert wie bei "on-for-timer"

- MsgCount wird mit 0 initialisiert: vorher hatte ein Kanal immer den zweiten Tastendruck eines Peers verpasst/übersprungen

- Das Anlegen des Default-Registersets für single-peering funtioniert jetzt. Das Default-Set wurde angepasst nach dem Schema: Off->OnDly->On->OffDly



--- a/Relay.h
+++ b/Relay.h

@@ -85,7 +85,7 @@ class Relay {
uint8_t mDel, rDel; // store for the call back delay
uint32_t cbsTme; // timer for call back poll routine

- void    trigger11(uint8_t val, uint8_t *rampTime, uint8_t *duraTime); // FHEM event
+ void    trigger11(uint8_t val, uint8_t *rampTime, uint8_t *duraTime,uint8_t len);   // FHEM event
void    trigger41(uint8_t lngIn, uint8_t val); // sensor event called
void    trigger40(uint8_t lngIn, uint8_t cnt); // remote event called
 

 
--- "a/Relay.cpp"
+++ "b/Relay.cpp"
@@ -22,9 +22,9 @@ const uint8_t peerEven[] =   {
};
const uint8_t peerSingle[] = {
// Default actor single: 02:00 03:00 04:32 05:64 06:00 07:FF 08:00 09:FF 0A:01
- // 0B:14 0C:63 82:00 83:00 84:32 85:64 86:00 87:FF 88:00 89:FF 8A:21 8B:14 8C:63
+ // 0B:14 0C:63 82:00 83:00 84:32 85:64 86:00 87:FF 88:00 89:FF 8A:01 8B:14 8C:63
0x00, 0x00, 0x32, 0x64, 0x00, 0xFF, 0x00, 0xFF, 0x01, 0x14, 0x63,
- 0x00, 0x00, 0x32, 0x64, 0x00, 0xFF, 0x00, 0xFF, 0x21, 0x14, 0x63,
+ 0x00, 0x00, 0x32, 0x64, 0x00, 0xFF, 0x00, 0xFF, 0x01, 0x14, 0x63,
};


@@ -50,15 +50,19 @@ void Relay::config(void Init(), void Switch(uint8_t), uint8_t minDelay, uint8_t
nxtStat = 6; // set relay status to off
adjRly(0); // set relay to a defined status
curStat = 6; // set relay status to off
+ msgRecvCnt = 0; // init counter.
}

// private functions for triggering some action
-void Relay::trigger11(uint8_t val, uint8_t *rampTime, uint8_t *duraTime) {
+void Relay::trigger11(uint8_t val, uint8_t *rampTime, uint8_t *duraTime, uint8_t len) {
// {no=>0,dlyOn=>1,on=>3,dlyOff=>4,off=>6}

rTime = (uint16_t)rampTime[0]<<8 | (uint16_t)rampTime[1]; // store ramp time
- dTime = (duraTime)?((uint16_t)duraTime[0]<<8 | (uint16_t)duraTime[1]):0; // duration time if given
-
+ if(len>3){
+ dTime = (duraTime)?((uint16_t)duraTime[0]<<8 | (uint16_t)duraTime[1]):0;// duration time if given
+ }else{
+ dTime =0;
+ }
if (rTime) nxtStat = (val == 0)?4:1; // set next status
else nxtStat = (val == 0)?6:3;

@@ -261,7 +265,7 @@ void Relay::hmEventCol(uint8_t by3, uint8_t by10, uint8_t by11, uint8_t *data, u
if ((by3 == 0x01) && (by11 == 0x01)) peerAddEvent(data, len);
if  (by3 >= 0x3E)                    peerMsgEvent(by3, data, len);

- if ((by3 == 0x11) && (by10 == 0x02)) trigger11(data[0], &data[1], &data[3]);
+ if ((by3 == 0x11) && (by10 == 0x02)) trigger11(data[0], &data[1], &data[3],len);
if  (by3 == 0x40)                    trigger40((by10 & 0x40), data[0]);
}
void Relay::peerAddEvent(uint8_t *data, uint8_t len) {
@@ -269,10 +273,10 @@ void Relay::peerAddEvent(uint8_t *data, uint8_t len) {
// 1st byte and 2nd byte shows the peer channel, 3rd and 4th byte gives the peer index
// no need for sending an answer, but we could set default data to the respective list3/4
#ifdef DM_DBG
Serial << F("peerAddEvent: pCnl1: ") << pHexB(data[0]) << F(", pCnl2: ") << pHexB(data[1]) << F(", pIdx1: ") << pHexB(data[2]) << F(", pIdx2: ") << pHexB(data[3]) << '\n';
#endif

- if ((data[0]) && (data[1])) { // dual peer add
+ if ((data[0]) != (data[1])) { // dual peer add
if (data[0]%2) { // odd
hm->setListFromModule(regCnl,data[2],(uint8_t*)peerOdd,sizeof(peerOdd));
hm->setListFromModule(regCnl,data[3],(uint8_t*)peerEven,sizeof(peerEven));


PeterS

Hallo unimatrix

Danke für den Patch.
Ein erster Test mit dem Sketch "HM_LC_SW1_BA_PCB" sah zunächst ganz gut aus.
Nach mehrfachen Schalten fällt der Ausgang leider wieder ab!

Gruss Peter

unimatrix

melde mich per PM bei dir

kuek

Zitat von: PeterS am 31 Juli 2014, 14:54:29
Hallo unimatrix

Danke für den Patch.
Ein erster Test mit dem Sketch "HM_LC_SW1_BA_PCB" sah zunächst ganz gut aus.
Nach mehrfachen Schalten fällt der Ausgang leider wieder ab!

Gruss Peter

Hi Peter,
komme erst gerade dazu wieder im Forum zu lesen. Gibt es schon Neuigkeiten? Habe es bisher nicht ans Laufen bekommen. Den Patch habe ich noch nicht getestet.

kuek

kuek

hallo unimatrix, hallo peter,

scheint zu gehen. auch mit "meinem" Sw4-BA. Zumindest nach den ersten 15 minuten testen ist es stabil. Konntest Du es auch zum Laufen bringen, Peter? Sonst schicke ich dir meine Lib und die ino.

kuek

Zitat von: unimatrix am 31 Juli 2014, 14:26:59
Der hier angefügte Patch (Trilu kann überlegen, ob er das in die bestehende Lib (nicht die neue, die in Erstellung ist) noch einpatchen möchte auf dem Git) beinhaltet:

- Bug: Kanal schaltet manchmal nach einer Zeit x, die unterschiedlich ist, ab. Dies lag daran, dass, wenn unlimitiert eingeschaltet wird per FHEM, nicht geprüft wurde, ob es eine OnTime überhaupt gibt und dann ein Wert per Zeiger aus dem Speicher genommen wurde, der ggf. einen undefinierten Zustand haben konnte. Der Kanal hat reagiert wie bei "on-for-timer"

- MsgCount wird mit 0 initialisiert: vorher hatte ein Kanal immer den zweiten Tastendruck eines Peers verpasst/übersprungen

- Das Anlegen des Default-Registersets für single-peering funtioniert jetzt. Das Default-Set wurde angepasst nach dem Schema: Off->OnDly->On->OffDly



--- a/Relay.h
+++ b/Relay.h

@@ -85,7 +85,7 @@ class Relay {
uint8_t mDel, rDel; // store for the call back delay
uint32_t cbsTme; // timer for call back poll routine

- void    trigger11(uint8_t val, uint8_t *rampTime, uint8_t *duraTime); // FHEM event
+ void    trigger11(uint8_t val, uint8_t *rampTime, uint8_t *duraTime,uint8_t len);   // FHEM event
void    trigger41(uint8_t lngIn, uint8_t val); // sensor event called
void    trigger40(uint8_t lngIn, uint8_t cnt); // remote event called
 

 
--- "a/Relay.cpp"
+++ "b/Relay.cpp"
@@ -22,9 +22,9 @@ const uint8_t peerEven[] =   {
};
const uint8_t peerSingle[] = {
// Default actor single: 02:00 03:00 04:32 05:64 06:00 07:FF 08:00 09:FF 0A:01
- // 0B:14 0C:63 82:00 83:00 84:32 85:64 86:00 87:FF 88:00 89:FF 8A:21 8B:14 8C:63
+ // 0B:14 0C:63 82:00 83:00 84:32 85:64 86:00 87:FF 88:00 89:FF 8A:01 8B:14 8C:63
0x00, 0x00, 0x32, 0x64, 0x00, 0xFF, 0x00, 0xFF, 0x01, 0x14, 0x63,
- 0x00, 0x00, 0x32, 0x64, 0x00, 0xFF, 0x00, 0xFF, 0x21, 0x14, 0x63,
+ 0x00, 0x00, 0x32, 0x64, 0x00, 0xFF, 0x00, 0xFF, 0x01, 0x14, 0x63,
};


@@ -50,15 +50,19 @@ void Relay::config(void Init(), void Switch(uint8_t), uint8_t minDelay, uint8_t
nxtStat = 6; // set relay status to off
adjRly(0); // set relay to a defined status
curStat = 6; // set relay status to off
+ msgRecvCnt = 0; // init counter.
}

// private functions for triggering some action
-void Relay::trigger11(uint8_t val, uint8_t *rampTime, uint8_t *duraTime) {
+void Relay::trigger11(uint8_t val, uint8_t *rampTime, uint8_t *duraTime, uint8_t len) {
// {no=>0,dlyOn=>1,on=>3,dlyOff=>4,off=>6}

rTime = (uint16_t)rampTime[0]<<8 | (uint16_t)rampTime[1]; // store ramp time
- dTime = (duraTime)?((uint16_t)duraTime[0]<<8 | (uint16_t)duraTime[1]):0; // duration time if given
-
+ if(len>3){
+ dTime = (duraTime)?((uint16_t)duraTime[0]<<8 | (uint16_t)duraTime[1]):0;// duration time if given
+ }else{
+ dTime =0;
+ }
if (rTime) nxtStat = (val == 0)?4:1; // set next status
else nxtStat = (val == 0)?6:3;

@@ -261,7 +265,7 @@ void Relay::hmEventCol(uint8_t by3, uint8_t by10, uint8_t by11, uint8_t *data, u
if ((by3 == 0x01) && (by11 == 0x01)) peerAddEvent(data, len);
if  (by3 >= 0x3E)                    peerMsgEvent(by3, data, len);

- if ((by3 == 0x11) && (by10 == 0x02)) trigger11(data[0], &data[1], &data[3]);
+ if ((by3 == 0x11) && (by10 == 0x02)) trigger11(data[0], &data[1], &data[3],len);
if  (by3 == 0x40)                    trigger40((by10 & 0x40), data[0]);
}
void Relay::peerAddEvent(uint8_t *data, uint8_t len) {
@@ -269,10 +273,10 @@ void Relay::peerAddEvent(uint8_t *data, uint8_t len) {
// 1st byte and 2nd byte shows the peer channel, 3rd and 4th byte gives the peer index
// no need for sending an answer, but we could set default data to the respective list3/4
#ifdef DM_DBG
Serial << F("peerAddEvent: pCnl1: ") << pHexB(data[0]) << F(", pCnl2: ") << pHexB(data[1]) << F(", pIdx1: ") << pHexB(data[2]) << F(", pIdx2: ") << pHexB(data[3]) << '\n';
#endif

- if ((data[0]) && (data[1])) { // dual peer add
+ if ((data[0]) != (data[1])) { // dual peer add
if (data[0]%2) { // odd
hm->setListFromModule(regCnl,data[2],(uint8_t*)peerOdd,sizeof(peerOdd));
hm->setListFromModule(regCnl,data[3],(uint8_t*)peerEven,sizeof(peerEven));



unimatrix

Peter hat wohl noch das Problem und hat mir seine Sachen geschickt, ich komme aber wohl heute nicht mehr dazu, mir das anzuschauen.

PeterS

Hallo kuek
Ich habe basierend auf dem Beispiel HM_LC_SW1_BA_PCB und deiner 4fach Register.h meinen Sketch aufgebaut.
Von unimatrix habe ich Änderungen an der Lib übernommen.
Meine 4fach Relaiskarte schaltet sauber und hält meistens die Signalzustände.
Hin und wieder fallen die Ausgänge aber reihenweise ab. Dann schalte ich sie mehrfach ein und irgendwann bleiben sie dann wieder an.
Wenn deine Lösung stabil läuft schicke mir mal bitte dein Paket zum Testen!
Danke im voraus ;)
Gruss Peter

kuek

Zitat von: PeterS am 03 August 2014, 21:59:08
Hallo kuek
Ich habe basierend auf dem Beispiel HM_LC_SW1_BA_PCB und deiner 4fach Register.h meinen Sketch aufgebaut.
Von unimatrix habe ich Änderungen an der Lib übernommen.
Meine 4fach Relaiskarte schaltet sauber und hält meistens die Signalzustände.
Hin und wieder fallen die Ausgänge aber reihenweise ab. Dann schalte ich sie mehrfach ein und irgendwann bleiben sie dann wieder an.
Wenn deine Lösung stabil läuft schicke mir mal bitte dein Paket zum Testen!
Danke im voraus ;)
Gruss Peter

hast ne pm.
wenn es bei dir auch läuft werde ich es hier hochladen. so hat jeder was davon.

kuek