AskSin++ Library

Begonnen von papa, 08 September 2016, 11:11:25

Vorheriges Thema - Nächstes Thema

Linef

Das passt aber schon. Auch gepairte Sensoren senden an 000000.
Das funktioniert bei meinen eigenen Temperatursensoren (mit NewAskSin), als auch z.B. bei meinem PowerMeter von EQ3.
Sowohl die FHEM-Zentrale also auch gepeerte Aktoren werten so ein "gebroadcastetes" Telegramm aus.

Es funktioniert sogar eher _nicht_, wenn der Sensor an jedes Ziel einzeln sendet - da hatten meine RT-DNs massive Probleme.

Martin
fhem auf cubietruck, HM-USB-CFG-2, CUL-V3, 6x HM-CC-RT-DN, 5x HM-SEC-SD, 2x HM-SEC-SCo, 5x HM Eigenbausensoren, AVR-Heizungsgateway

papa

Also ein Ack wird nur angefordert, wenn nicht an die Broadcast-Adresse gesendet wird. Wenn nicht gepaired ist und an 000000 gesendet wird, kommt also auch keine Ack. Wer soll denn da antworten ?
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Linef

#317
Acks bei Sensoren sind eher unüblich. Hatte ich am Anfang auch - lief dann allerdings in Probleme damit rein. Weiss aber nicht mehr genau, wo das Problem war.

martinp876 hat mir dann davon abgeraten, bei Sensoren Acks zu verwenden. Seitdem sende ich grundsätzlich ohne Acks.

Anfangs hatte ich noch bei gepeerten Devices als Zieladresse den Peer drin, bekam dann allerdings bei zwei Peers (und damit zwei hintereinander gesendeten Messages) Probleme: mein zweiter RT-DN reagierte auf die zweite, an ihn gerichtete Message nicht mehr. Nur der jeweils zuerst angesprochene RT-DN empfing die Temperatur.

Seitdem sende ich vom Sensor aus _immer_ an 000000 - egal, ob mit der Zentrale gepairt oder nicht, oder mit weiteren Peers gepeert. Und das immer ohne Anforderung eines Acks. Was interessiert auch den Sensor, ob seine Sensordaten irgendwo angekommen sind? In 2-3 Minuten kommt ja eh die nächste Ladung an Daten... Wer die Daten braucht, soll sie auswerten, wer nicht - halt nicht. Und ob ein Aktor Daten von diesem Sensor entgegennimmt, steht eh in dessen Peer-Tabelle.

Es geht hier aber nur um die regelmäßig gesendeten Sensordaten (Messagetyp 0x70).
Die sonstige Kommunikation (Pairing, getConfig, Register setzen) läuft natürlich schon mit Acks und entsprechender Zieladresse.

Gruss,
Martin
fhem auf cubietruck, HM-USB-CFG-2, CUL-V3, 6x HM-CC-RT-DN, 5x HM-SEC-SD, 2x HM-SEC-SCo, 5x HM Eigenbausensoren, AVR-Heizungsgateway

papa

Ok - das klinkt auch irgendwie logisch logisch.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Xent

Ich verscuche gerade beim HM-LC-SWX-SM die Methode switchState zu überschreiben, da ich da ein eigenes Verhalten implementieren möchte.
Leider bin ich in C++ nicht ganz so weit, dass ich direkt den richtigen Weg gefunden habe.

Ich habe mich aktuell durch Try&Error durch die Fehler durchgearbeitet.

Das ist meine neue Klasse SwitchChannel1
namespace as {
template <class HalType,int PeerCount>
class SwitchChannel1 : public SwitchChannel<HalType,PeerCount>{

protected:
  typedef SwitchChannel1<HalType,PeerCount> SwitchChannel;

public:
  SwitchChannel1 () : SwitchChannel {}

  void switchState(__attribute__((unused)) uint8_t oldstate,uint8_t newstate) {
    uint8_t pin = SwitchPin(SwitchChannel::BaseChannel::number());
    if( newstate == AS_CM_JT_ON ) {
      digitalWrite(pin,lowact ? LOW : HIGH);
    }
    else if ( newstate == AS_CM_JT_OFF ) {
      digitalWrite(pin,lowact ? HIGH : LOW);
    }
    SwitchChannel::BaseChannel::changed(true);
  }
};
};


aktuell kommen folgende Fehler:
E:\Eigene Dokumente\GitHub\AskSinPP\examples\HM-LC-SWX-SM\HM-LC-SWX-SM.ino: In constructor 'as::SwitchChannel1<HalType, PeerCount>::SwitchChannel1()':

HM-LC-SWX-SM:79: error: expected '{' before 'void'

   void switchState(__attribute__((unused)) uint8_t oldstate,uint8_t newstate) {

   ^

E:\Eigene Dokumente\GitHub\AskSinPP\examples\HM-LC-SWX-SM\HM-LC-SWX-SM.ino: In instantiation of 'as::SwitchChannel1<HalType, PeerCount>::SwitchChannel1() [with HalType = as::AskSin<as::StatusLed<4u>, as::NoBattery, as::Radio<as::AvrSPI<10u, 11u, 12u, 13u>, 2u> >; int PeerCount = 2]':

C:\Program Files (x86)\Arduino\libraries\AskSinPP/MultiChannelDevice.h:474:102:   required from 'as::MultiChannelDevice<HalType, ChannelType, ChannelCount, List0Type>::MultiChannelDevice(uint16_t) [with HalType = as::AskSin<as::StatusLed<4u>, as::NoBattery, as::Radio<as::AvrSPI<10u, 11u, 12u, 13u>, 2u> >; ChannelType = as::SwitchChannel1<as::AskSin<as::StatusLed<4u>, as::NoBattery, as::Radio<as::AvrSPI<10u, 11u, 12u, 13u>, 2u> >, 2>; int ChannelCount = 4; List0Type = as::List0; uint16_t = unsigned int]'

E:\Eigene Dokumente\GitHub\AskSinPP\examples\HM-LC-SWX-SM\HM-LC-SWX-SM.ino:95:21:   required from here

HM-LC-SWX-SM:77: error: constructor delegates to itself

   SwitchChannel1 () : SwitchChannel {}

                                      ^

exit status 1
expected '{' before 'void'


Damit dann die neue Klasse benutzt wird reicht es ja bei der Definition des MultiChannelDevices die neue Klasse einzutragen oder?
// setup the device with channel type and number of channels
typedef MultiChannelDevice<Hal,SwitchChannel1<Hal,PEERS_PER_CHANNEL>,4> SwitchType;


Vielen Dank schonmal

papa

Jetzt mal ohne den Compiler anzuwerfen:


class SwitchChannel1 : public SwitchChannel<HalType,PeerCount>{

protected:
  typedef SwitchChannel<HalType,PeerCount> BaseChannel;

public:
  SwitchChannel1 () : BaseChannel()  {}



Ja genau einfach die Klasse bei der Definition des Devices austauschen.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Xent

Super, damit gehts.
Vielen Dank.

Will damit den Motor einer Katzenklappe ansteuern und damit ich den Status weiß, soll beim einschalten und ausschalten der Motor für die Verriegelung kurz in die eine oder die andere Richtung drehen und dann wieder stoppen ;-)

Xent

Nochmal ich xD

Ich möchte, dass der Kanal 1 nach dem einschalten des Arduino ausgeschaltet wird (Katzenklappe verschließen).

Aktuell mache ich dies so:

sdev.channel(1).switchState(AS_CM_JT_ON, AS_CM_JT_OFF);

Das schaltet den Kanal aus, aber sendet kein Statusupdate an Homematic.
Wie mache ich es richtig?

papa

Der Einschaltstatus jedes Kanales wird mit dem "powerUpAction" Regsiter bestimmt. Da brauchst Du gar nichts weiter tun.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Xent

Hmm, bei mir passiert da nichts ...

Vielleicht ist das Pairing auch nicht ganz richtig.
Kann nur Kanal 1 konfigurieren, bei den andere steht, ich soll in den Servicemeldungen schauen.
Ich werd heut Nachmittag das Pairing nochmal neu machen.

papa

Kannst Du mal den ganzen Sketch zeigen
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Xent

Hier ist der Sketch.

papa

Hm - das macht für mich irgendwie alles keinen richtigen Sinn.

Was soll das Geräte wie steuern ? Vielleicht kann ich Dir besser helfen, wenn ich weiss, was Du vor hast.

Ich habe bisher verstanden, dass eine Katzenklappe gesteuert werden soll. Dazu soll der Kanal 1 angeschalten werden und das führt dazu, dass ein Pin für eine bestimmte Zeit auf HIGH gesetzt wird. Wird der Kanal 1 wieder ausgeschalten, soll ein Pin (ein anderer ??? ) ebenfalls für eine bestimmte Zeit auf HIGH gestelt werden. Das soll dann sicherlich die Klappe hoch bzw. runter fahren.

Das wird sich schwer mit dem Switch abbilden lassen. Genau dafür gibt es Blind-Aktoren. Dazu fehlt aber leider noch ein Example in der Lib.

Mit den Standard-Switch könntest Du das auch machen, indem Du Kanal 1 für hoch und Kanal 2 für runter nimmst. Dann kannst Du set on-for-timer benutzen, um einen Kanal nur eine bestimmte Zeit an zu lassen.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Xent

Also eigentlich klappt das steuern über die GUI ganz gut.

Dieser Code sorgt dafür, dass wenn Kanal 1 eingeschaltet wird, der Motor für 250ms eingeschaltet.
Entweder nach Links oder nach Rechts drehend.

Jetzt ist es aber so, dass wenn ich den Kanal über die GUI einschalte und dann den Arduino resette oder aber neu flashe, dass die GUI immer noch auf "An" steht.
Wenn ich die letzte Zeile in der Setup-Methode einkommentiere, dann wird die Klappe wieder verriegelt, aber es wird scheinbar kein Statusupdate gesendet.

if( newstate == AS_CM_JT_ON ) {
         PORTC &= ~B00000011;
         PORTD |= B11000000;
         delay(250);
         PORTD &= ~B11000000;
      }
      else if ( newstate == AS_CM_JT_OFF ) {
         PORTD &= ~B11000000;
         PORTC |= B00000011;
         delay(250);
         PORTC &= ~B00000011;
      }

papa

Du darfst den init-Code (ja - lowactive() ist ein blöder Name) nicht rausnehmen. Der initialisiert den Channel. Es wird der gespeicherte  PowerOn-Zustand hergestellt und dann der Status gesendet.


  sdev.init(hal);

  for( uint8_t i=1; i<=sdev.channels(); ++i ) {
    sdev.channel(i).lowactive(false);
  }

  buttonISR(cfgBtn,CONFIG_BUTTON_PIN);

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