Arduino Asksin library

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

Vorheriges Thema - Nächstes Thema

trilu

Ich glaube das eine Super Klasse wenig Sinn macht. Die Chanel Module müssen ja alle unterschiedlich auf die Nachrichten, Events reagieren.
Trigger 11, sind Nachrichten die von der Zentrale kommen. Z.b. schalte den Dimmer in 10 Sekunden auf 100%
Trigger 40, wird von Push Button Peers verwendet und liefert nur die Info Peer, Peer Chanel, Long oder Short und einen counter.
Trigger 41, kommt von Peer Sensoren, ähnlich wie Trigger 40 plus ein Byte Sensorwert.

Eigene Geräte in FHEM ist derzeit schwierig, da alle Geräte in HM cul hart verdrahtet sind. Ich nutze aber derzeit Homegear und habe zum erstellen der Config ein destillregs gebaut. Das generiert mir ein entsprechendes Device XML File, das für die CCU und Homegear passt. Vielleicht kann Martin sowas ähnliches in HM cul integrieren. Hat aber noch Zeit, soweit ist die Lib ja noch nicht...

Dietmar63

#1141
aber ist das ganze so nicht übersichtlicher und für Anfänger einfacher zu verstehen?

ChannelModel (Superklasse) -noch nicht sauber aufgebaut 

class ChannelModel {
  //- user code here ------------------------------------------------------------------------------------------------------
  public://----------------------------------------------------------------------------------------------------------------

...
...
// ---------------------------------------------------------------------
// ---------------------------------------------------------------------
// ---------------------------------------------------------------------
void      adjRly(void); // setting of relay status
void      sendStatus(void); // help function to send status messages

void      rlyPoll(void); // polling function

//  mandatory functions for every new module to communicate within AS protocol stack ------------------------------------
uint8_t   modStat;       // module status byte, needed for list3 modules to answer status requests
uint8_t   modDUL;       // module down up low battery byte
uint8_t   regCnl;       // holds the channel for the module

AS        *hm;                                                         // pointer to HM class instance

virtual  void      firstStart(void)                                                 ;
virtual  void      config(void Init(uint8_t), void Switch(uint8_t,uint8_t))         ;   // handover for jump addresses
virtual  void      poll(void) = 0                                                   ;    // poll function, driven by HM loop
                                                                                     
virtual void      trigger11(uint8_t value, uint8_t *rampTime, uint8_t *duraTime)   ; // what happens while a trigger11 message arrive
virtual void      trigger40(uint8_t msgLng, uint8_t msgCnt)                        ; // same for peer messages
virtual void      trigger41(uint8_t msgBLL, uint8_t msgCnt, uint8_t msgVal)        ; // same for sensor messages

void      showStruct(void);

void      hmEventCol(uint8_t by3, uint8_t by10, uint8_t by11, uint8_t *data, uint8_t len); // call back address for HM for informing on events
void      regInHM(uint8_t cnl, uint8_t lst, AS *instPtr);                 // register this module in HM on the specific channel
void      setToggle(void);                                         // toggle the module initiated by config button
void      configCngEvent(void);                                     // list1 on registered channel had changed

void      pairSetEvent(uint8_t *data, uint8_t len);                       // pair message to specific channel, handover information for value, ramp time and so on
void      pairStatusReq(void);                                       // event on status request

void      peerMsgEvent(uint8_t type, uint8_t *data, uint8_t len);           // peer message was received on the registered channel, handover the message bytes and length
void      peerAddEvent(uint8_t *data, uint8_t len); // peer was added to the specific channel, 1st and 2nd byte shows peer channel, third and fourth byte shows peer index
};


cmStromGasImpulsCounter

class cmStromGasImpulsCounter : public ChannelModel  {

private: 
uint32_t           lastDataSend      = 0;
volatile uint8_t   stromEventCounter [bufferLenPlusReserve];
volatile uint8_t   gasEventCounter   [bufferLenPlusReserve];

public:
virtual void       config(void Init(uint8_t), void Switch(uint8_t, uint8_t));

// void             init    (uint8_t channel);                  // declare function to jump in
// void             switch_ (uint8_t channel, uint8_t status);  // declare function to jump in

void               registerStromTick();
void               registerGasTick();
void               sendeDatenAnMaster(uint8_t idx);
     
virtual void      poll()                                                           ; //
virtual void      trigger11(uint8_t value, uint8_t *rampTime, uint8_t *duraTime)   ; // what happens while a trigger11 message arrive
virtual void      trigger40(uint8_t msgLng, uint8_t msgCnt)                        ; // same for peer messages
virtual void      trigger41(uint8_t msgBLL, uint8_t msgCnt, uint8_t msgVal)        ; // same for sensor messages
     
};

Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Dietmar63

config key gedrückt - sollte pairing sein:
<- 0E76
<- 0E 00 80 10 33 11 22 00 00 00 06 01 00 00 00 (1834)


und im event Monitor:

2016-08-26 20:27:00 CUL nanoCUL UNKNOWNCODE A0E0080103311220000000601000000::-45:nanoCUL
2016-08-26 20:27:02 CUL nanoCUL UNKNOWNCODE A0E0180103311220000000601C80000::-43.5:nanoCUL
2016-08-26 20:27:05 CUL nanoCUL UNKNOWNCODE A0E0280103311220000000601000000::-40.5:nanoCUL
2016-08-26 20:27:22 Global global UNDEFINED HM_331122 CUL_HM 331122
2016-08-26 20:27:22 Global global DEFINED HM_331122
2016-08-26 20:27:22 Global global SAVE
2016-08-26 20:27:22 CUL_HM HM_331122 D-firmware: 1.0
2016-08-26 20:27:22 CUL_HM HM_331122 D-serialNr: HBswitch01


und ein automatisch angelegter switch:

Internals:
   CFGFN
   DEF        331122
   IODev      nanoCUL
   LASTInputDev nanoCUL
   MSGCNT     1
   NAME       HM_331122
   NR         49
   STATE      ???
   TYPE       CUL_HM
   lastMsg    No:03 - t:00 s:331122 d:000000 10006C4842737769746368303100410100
   nanoCUL_MSGCNT 1
   nanoCUL_RAWMSG A1A03840033112200000010006C4842737769746368303100410100::-40:nanoCUL
   nanoCUL_RSSI -40
   nanoCUL_TIME 2016-08-26 20:27:22
   protLastRcv 2016-08-26 20:27:22
   rssi_at_nanoCUL avg:-40 min:-40 max:-40 lst:-40 cnt:1
   Readings:
     2016-08-26 20:27:22   D-firmware      1.0
     2016-08-26 20:27:22   D-serialNr      HBswitch01
   Helper:
     HM_CMDNR   3
     mId        006C
     rxType     2
     Expert:
       def        1
       det        0
       raw        1
       tpl        0
     Io:
       newChn     +331122,00,00,00
       nextSend   1472236042.14274
       prefIO
       rxt        0
       vccu
       p:
         331122
         00
         00
         00
     Mrssi:
       mNo        03
       Io:
         nanoCUL    -38
     Prt:
       bErr       0
       sProc      0
     Q:
       qReqConf   00
       qReqStat   00
     Role:
       chn        1
       dev        1
       prs        1
     Rssi:
       At_nanocul:
         avg        -40
         cnt        1
         lst        -40
         max        -40
         min        -40
Attributes:
   IODev      nanoCUL
   autoReadReg 4_reqStatus
   expert     2_raw
   firmware   1.0
   model      HM-LC-SW1-BA-PCB
   msgRepeat  1
   room       CUL_HM
   serialNr   HBswitch01
   subType    switch
   webCmd     statusRequest:toggle:on:off


sieht das gut aus?
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Dietmar63

#1143
Hallo Jungs ich habe im Serial Monitor folgendes Problem.


polling ch:0
polling ch:1
1h� �����
hm polling
RG polling
polling ch:0
polling ch:1
.:10h� �����
hm polling
RG polling
polling ch:0
polling ch:1
.:18h� �����
hm polling
RG polling
polling ch:0
polling ch:1
.:26h� �����
hm polling
RG polling
polling ch:0
polling ch:1
.:34h� �����
hm polling
RG polling
polling ch:0
polling ch:1
.:43h�


immer wenn der Arduino mit hm.pw.setMode(POWER_MODE_WAKEUP_8000MS);  in den Sleepmode versetzt wird, verschluckt der Monitor bzw. der Arduino Zeichen. Kann jemand sagen woran das liegt und ob man das abstellen kann.

habe es so vergeblich versucht:

void loop() {
// - AskSin related ---------------------------------------
  delay(100);
  dbg << (getMillis()/1000) << F("hm poll ") << "\n";
  delay(100);
hm.poll(); // poll the homematic main loop
// - user related -----------------------------------------

}
[code]
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

trilu

@dietmar, drück Mal den Config Key für 2 oder 3 Sekunden. Der Pairing String ist viel länger und enthält die Seriennummer.Beim Sleepmode bin ich mir nicht sicher ob der noch funktioniert. Den habe ich seit langem nicht mehr angefasst. Das er Zeichen verschluckt ist aber normal. Beim Sleepmode wird zuerst allesan IO abgedreht und dann die CPU Schlafen geschickt. Das darunter die serielle leidet ist klar.

trilu

Ich habe mir das Modell mit der Oberklasse noch Mal angeschaut, habe aber noch ein Verständnis Problem.
In der class channelmodel wird Poll definiert. Diese Poll wird regelmäßig von hm aufgerufen. Wie ruft Poll die eigentliche Poll Funktion im channelmodul auf?
Selbiges gilt für die Trigger. Trigger40 ist in deinem Beispiel ja definiert über
Void channelModell::trigger40()
Wie rufe ich von dort void cmStromGasImpulscounter::trigger40 auf?

Dietmar63

Werde den config key morgen drücken und berichten für heute ist Feierabend.
Bin froh dass das Löten geklappt hat und das die ersten Tests für mich erst mal erfolgreich waren.

Bevor ich anfange zu fabulieren.
hier sind zwei Webseiten, die das hoffentlich gut erklären:
https://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_Polymorphie
http://openbook.rheinwerk-verlag.de/oop/oop_kapitel_05_002.htm

Kurz zusammengefasst:
man definiert in der Superklasse Funktionen und kann sie auf dem Abstraktionslevel der Superklasse benutzen. In C++ ist das Schlüsselwort virtual wichtig. In neueren Sprachen ist das Schlüsselwort nicht mehr notwendig da ist einfach alles virtual.

In der Kindklasse kann man die Funktion überschreiben. Wenn dann konkrete Abkömmlinge(cmStromGasImpulscounter) definiert werden und auf dem Abstraktionslevel der Superklasse eine überschriebene Funktion aufgerufen wird, wird immer die Funktion der Kindklasse aufgerufen.

Etwas so - :

void vaterklasse::init(p1,p2) {
   _p1 = p1
   _p2 = p2
}
void subklasse::init(p1,p2,p3) {
   vaterklasse.init(p1,p2);
   _p3 = p3
}


Wenn auch der Code aus der Superklasse aufgerufen werden soll(wie im Beispiel), muss man das explizit selbst machen.

Im Grund entsteht durch das hierarchische Klassenmodell so etwas wie eine implizite Delegation der Aufgabenverteilung in der Hierarchie nach oben. Man muss dabei sehr sehr aufpassen was man wie definiert, weil eine Klassenhierarchie sehr statisch ist und nicht leicht verändert werden kann, besonders dann, wenn ersteinmal viel Software darauf basiert.

Aber man muss mal überlegen was man durch die Definition einer Klasse erreichen kann wenn man Mehrfachvererbung nutzt:


Class neueKlasse : klasse1,klasse2,klasse3,klasse4


Dann erbt die neue Klasse alle Funktionen der Väter und Mütter.
Vererbung ist immer dann sinnvoll, wenn Klassen eine gewisse Ähnlichkeit aufweisen.
Beispielsweise ist das bei den restlichen Klassen aus Asksin nicht der Fall: Power hat nichts mit cc1101zu tun.
Aber die Channels sind in vieler Hinsicht ähnlich. Der große Vorteil ist, das der Code, der für alle channel gilt nur einmal existiert und viel einfacher weiterentwickelt und gewartet werden kann.

Der Kommentar in den existierenden channels deutet darauf hin:

//-------------------------------------------------------------------------------------------------------------------------
//- predefined, no reason to touch -
//-------------------------------------------------------------------------------------------------------------------------
void THSensor::regInHM(uint8_t cnl, uint8_t lst) {



Wenn dir das gefällt, helfe ich gern es in Asksin einzubauen. Und ich lerne auch was.
Der Winter ist lang.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Dietmar63

have mal zu pairen versucht -kommt leider dieser Fehler:

2016-08-28 11:34:02 CUL_HM HM_331122 D-firmware: 1.0
2016-08-28 11:34:02 CUL_HM HM_331122 D-serialNr: HBswitch01
2016-08-28 11:34:02 CUL_HM HM_331122 R-pairCentral: set_0x513749
2016-08-28 11:34:05 CUL nanoCUL UNKNOWNCODE ERR:CCA
2016-08-28 11:34:11 CUL nanoCUL UNKNOWNCODE ERR:CCA
2016-08-28 11:34:15 CUL nanoCUL UNKNOWNCODE ERR:CCA


im Monitor finde ich das:


debug startet...
SN.
RV.
PW.
debug startet...
HM_LC_SW1_BA_PCB
AskSin-Lib V 0.2.4
AS.
EE.
PowerMode: 0
initRly: 1

....
CC.
123 - ready

HMID: 33 11 22, MAID: 00 00 00

<- 0E76
<- 0E 00 80 10 33 11 22 00 00 00 06 01 00 00 00 (1829)
switchRly: 1, 200
<- 0E77
<- 0E 01 80 10 33 11 22 00 00 00 06 01 C8 00 00 (9492)
switchRly: 1, 0
<- 0E74
<- 0E 02 80 10 33 11 22 00 00 00 06 01 00 00 00 (24000)
<- 1A75
<- 1A 03 84 00 33 11 22 00 00 00 10 00 6C 48 42 73 77 69 74 63 68 30 31 00 41 01 00 (33608)
<- 1A72
<- 1A 04 84 00 33 11 22 00 00 00 10 00 6C 48 42 73 77 69 74 63 68 30 31 00 41 01 00 (86496)
10 73 EF CA F7 E4 89 56 23 DD B9 90 6C 48 24 00 A0
getIdxByPeer, cnl:1, peer:51 37 49 00, ret:255
isPeerValid:51 37 49 00, ret:0
x> 10 05 A0 01 51 37 49 33 11 22 00 05 00 00 00 00 00 (87801)
<- 0A73
<- 0A 05 80 02 33 11 22 51 37 49 00 (87822)
10 77 E3 BE CB 90 25 32 1F D9 B5 94 70 4C 28 04 B0
getIdxByPeer, cnl:1, peer:51 37 49 00, ret:255
isPeerValid:51 37 49 00, ret:0
x> 10 01 B0 01 51 37 49 33 11 22 00 05 00 00 00 00 00 (93378)
<- 0A77
<- 0A 01 80 02 33 11 22 51 37 49 00 (93398)


kann jemand damit was anfangen
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

trilu

Das sieht schon ganz gut aus, ich vermute aber, du hast den GDO2 nicht, oder falsch angeschlossen.
Du bekommst einen vollen cc1101 Buffer falsch signalisiert.
<- 0E76
<- 0E 00 80 10 33 11 22 00 00 00 06 01 00 00 00 (1829)

Das 0e76 ist zu viel, da wird was falsches signalisiert.

Dietmar63

bist du durch meine Erklärungen zum Thema Vererbung, Super- Kindklasse durchgestiegen?
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

trilu

Es war ein Anfang, bin gerade am Testen. Ist aber viel Arbeit, schmeißt mein delegate Konzept über den Haufen. Könnte aber einfacher für channel Module werden und hoffentlich kleinerer Code.

Dietmar63

Der Tipp hat etwas gebracht:

Pairing funktioniert scheinbar:

HMID: 33 11 22, MAID: 00 00 00

<- 0E76
<- 0E 00 80 10 33 11 22 00 00 00 06 01 00 00 00 (1829)
<- 1A77
<- 1A 01 84 00 33 11 22 00 00 00 10 00 6C 48 42 73 77 69 74 63 68 30 31 00 41 01 00 (91130)
<- 1A74
<- 1A 02 84 00 33 11 22 00 00 00 10 00 6C 48 42 73 77 69 74 63 68 30 31 00 41 01 00 (132502)
10 75 F1 CC F9 E2 F7 E0 AD AB 87 66 42 1E FA D6 A0
getIdxByPeer, cnl:1, peer:51 37 49 00, ret:255
isPeerValid:51 37 49 00, ret:0
x> 10 03 A0 01 51 37 49 33 11 22 00 05 00 00 00 00 00 (133050)
<- 0A75
<- 0A 03 80 02 33 11 22 51 37 49 00 (133071)
13 72 EE CB F6 E5 88 57 22 DC B8 9C 7A 57 39 44 2B 30 00 E9
getIdxByPeer, cnl:1, peer:51 37 49 00, ret:255
isPeerValid:51 37 49 00, ret:0
x> 13 04 A0 01 51 37 49 33 11 22 00 08 02 01 0A 51 0B 37 0C 49 (133255)
x0 :02
x2 :0A
x4 :0B
x6 :0C
new masterid

<- 0A72
<- 0A 04 80 02 33 11 22 51 37 49 00 (133289)
0B 73 EF CA F7 E4 89 56 23 DD B9 A6
m> 0B 05 A0 01 51 37 49 33 11 22 00 06 (134047)
<- 0A73
<- 0A 05 80 02 33 11 22 51 37 49 00 (134068)
0E 70 FC C9 F4 E7 8A 55 20 DE B8 95 B9 95 B0
m> 0E 06 B0 11 51 37 49 33 11 22 02 01 C8 00 00 (294655)
<- 0E70
<- 0E 06 80 02 33 11 22 51 37 49 01 01 00 00 6B (294679)
switchRly: 1, 200
0E 71 ED D8 E5 F6 9B 44 31 2F 09 E4 08 E4 A0
m> 0E 07 A0 11 51 37 49 33 11 22 02 01 C8 00 00 (296184)
<- 0E71
<- 0E 07 80 02 33 11 22 51 37 49 01 01 00 00 6A (296208)
switchRly: 1, 0
0E 7E EA D7 E2 89 2C 3B 06 C0 9E 7B 9F 7B B0
m> 0E 08 B0 11 51 37 49 33 11 22 02 01 C8 00 00 (429091)
<- 0E7E
<- 0E 08 80 02 33 11 22 51 37 49 01 01 00 00 6B (429115)
switchRly: 1, 200
0E 7F FB C6 F3 F8 9D 4A 37 31 0F EA 0E EA A0
m> 0E 09 A0 11 51 37 49 33 11 22 02 01 C8 00 00 (429309)
<- 0E7F
<- 0E 09 80 02 33 11 22 51 37 49 01 01 00 00 6B (429333)
0E 7C E8 D5 E0 8B 2E 39 04 C2 9C 79 55 31 B0
m> 0E 0A B0 11 51 37 49 33 11 22 02 01 00 00 00 (432524)
<- 0E7C
<- 0E 0A 80 02 33 11 22 51 37 49 01 01 00 00 6B (432548)
switchRly: 1, 0
switchRly: 1, 200




2016.08.28 20:45:14 3: CUL_HM set HM_331122 off
2016.08.28 20:45:12 3: CUL_HM HM_331122 repeat, level 00 instead of C8
2016.08.28 20:45:12 3: CUL_HM HM_331122 repeat, level 00 instead of C8
2016.08.28 20:45:10 3: CUL_HM set HM_331122 on
2016.08.28 20:42:59 3: CUL_HM HM_331122 repeat, level 00 instead of C8
2016.08.28 20:42:57 3: CUL_HM HM_331122 repeat, level 00 instead of C8
2016.08.28 20:42:56 3: CUL_HM set HM_331122 on
2016.08.28 20:40:15 3: CUL_HM pair: HM_331122 switch, model HM-LC-SW1-BA-PCB serialNr HBswitch01
2016.08.28 20:39:33 2: autocreate: define HM_331122 CUL_HM 331122
2016.08.28 20:39:33 2: CUL_HM Unknown device HM_331122 is now defined


es lag an einer falschen Verbindung de GDO0.
Hatte es wie bei einem nanoCul an einen UNO angeschlossen - GDO2 wird nicht gebraucht und GDO0 muss an D2
#define CC_GDO0                PIN_D2 // GDO0 pin, identify data received on falling edge

<- 0E76

ist aber noch nicht verschwunden - habe aber herausgefunden, dass daschauher den gleichen Wert bekommen hat und auch lange verzweifelt war.
https://forum.fhem.de/index.php/topic,14140.msg341252.html#msg341252
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

papa

Zitat von: trilu am 28 August 2016, 20:18:59
Es war ein Anfang, bin gerade am Testen. Ist aber viel Arbeit, schmeißt mein delegate Konzept über den Haufen. Könnte aber einfacher für channel Module werden und hoffentlich kleinerer Code.

Also virtuelle Methoden sind auf dem 8bit AVR sehr teuer - sprich benötigen relativ viel Code und auch Daten. Ich experimentiere gerade mit Templates rum, um das ganze Device-Channel-Handling einfacher benutzbar zu machen. Eigentlich wollte ich die Entwicklung mindestens bis zum vollwertigen Switch treiben, bevor ich das ganze öffentlich mache. Damit sie Klassen entsprechend stabil sind. Aber da hier gerade wieder Bewegung in die Entwicklung kommt, kann ich vielleicht auch die ein oder andere Idee beisteuern. Der aktuelle Code ist in meinem GitHub zu finden:

https://github.com/pa-pa/AskSinPP.git

Hier mal kurz die Unterschiede zum (New)AskSin Code:
* im Ganzen mehr in C++ Klassen gekapselt
* Timer-Klasse, die Code zu einem bestimmten Zeitpunkt startet / Alarm ausführt
* Channel-Basis-Klasse, die direkt mit dem Flash arbeitet - kein RAM für die Channel-Listen-Kopien benötigt
* Templates zum konfigurieren der Channels eines Devices
* keine "handberechneten Tabellen" für die ChannelDaten nötig, damit einfacher neue Devices aufzusetzen

Wie gesagt, es fehlt noch einiges an Code bis zum funktionierenden Device - aber die grundsätzlichen Ideen sollten schon gut sichtbar sein.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Dietmar63


CC<- 0E76
<- 0E 00 A0 10 33 11 22 51 37 49 06 01 00 00 00 (1829)
CC<- 0E76
<- 0E 00 A0 10 33 11 22 51 37 49 06 01 00 00 00 (2151)
CC<- 0E76
<- 0E 00 A0 10 33 11 22 51 37 49 06 01 00 00 00 (2473)
  timed out (2773)


0E76 ist kein wirkliches Problem - scheint aus CC zu kommen:
habe am Ende von CC::sndData folgenden debugcode gefunden.
CC habe ich ergänzt um sicher zu sein, dass die Zeile auch wirklich von hier stammt.

#ifdef CC_DBG // only if cc debug is set
dbg << F("CC<- ") << _HEXB(buf[0]) << _HEXB(buf[1]) << '\n';//pTime();
#endif
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

trilu

Zitat0E76 ist kein wirkliches Problem - scheint aus CC zu kommen
Muss ich mir heute noch Mal anschauen, weiß nicht mehr wozu das debug im CC dient.

ZitatAlso virtuelle Methoden sind auf dem 8bit AVR sehr teuer - sprich benötigen relativ viel Code und auch Daten
Ich habe das Mal am pcb Sketch getestet. Ist etwas übersichtlicher geworden, hat aber auch 600 Byte gekostet. Das ist zu viel...
@papa - ich muss mir Mal deinen Ansatz genauer anschauen.
Wie machst du in deinem Ansatz das Konfiguration der Channel Module?