AskSin++ Library

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

Vorheriges Thema - Nächstes Thema

east

So. Jetzt mal ein bissel getestet und hier die Lösung, mit einer eigenen XML für die CCU....
//- -----------------------------------------------------------------------------------------------------------------------
// AskSin++
// 2017-05-10 papa Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/
//- -----------------------------------------------------------------------------------------------------------------------

// define this to read the device id, serial and device type from bootloader section
// #define USE_OTA_BOOTLOADER

// number of relays - possible values 1,2,4
// will map to HM-LC-SW1-SM, HM-LC-SW2-SM, HM-LC-SW4-SM
#define RELAY_COUNT 2

// define all device properties
#define DEVICE_ID HMID(0x90,0x78,0x90)
#define DEVICE_SERIAL "xms1234567"
#define DEVICE_MODEL  0xF1,0xDF
#define DEVICE_FIRMWARE 0x10
#define DEVICE_TYPE DeviceType::Switch
#define DEVICE_INFO 0x02,0x01,0x00

#include <EnableInterrupt.h>
#include <AskSinPP.h>
#include <TimerOne.h>
#include <LowPower.h>

#include <MultiChannelDevice.h>
#include <Remote.h>
#include <SwitchChannel.h>



// we use a Pro Mini
// Arduino pin for the LED
// D4 == PIN 4 on Pro Mini
#define LED_PIN 4
#define LED_PIN2 6

// Arduino pin for the config button
// B0 == PIN 8 on Pro Mini
#define CONFIG_BUTTON_PIN 8

// relay output pins compatible to the HM_Relay project
#define RELAY1_PIN 7
#define RELAY2_PIN 9

#define BUTTON1_PIN 3
#define BUTTON2_PIN 5

// number of available peers per channel
#define PEERS_PER_SWCHANNEL 2
#define PEERS_PER_BTNCHANNEL 10

// all library classes are placed in the namespace 'as'
using namespace as;

/**
* Configure the used hardware
*/
typedef AvrSPI<10,11,12,13> SPIType;
typedef Radio<SPIType,2> RadioType;
typedef DualStatusLed<6,4> LedType;
typedef AskSin<LedType,NoBattery,RadioType> Hal;
Hal hal;

typedef RemoteChannel<Hal,PEERS_PER_BTNCHANNEL> BtnChannel;
typedef SwitchChannel<Hal,PEERS_PER_SWCHANNEL> SwChannel;

class MixDevice : public ChannelDevice<Hal,VirtBaseChannel<Hal>,4> {
public:
  VirtChannel<Hal,BtnChannel> c1,c2;
  VirtChannel<Hal,SwChannel> c3,c4;
public:
  typedef ChannelDevice<Hal,VirtBaseChannel<Hal>,4> DeviceType;
  MixDevice (uint16_t addr) : DeviceType(addr) {
    DeviceType::registerChannel(c1,1);
    DeviceType::registerChannel(c2,2);
    DeviceType::registerChannel(c3,3);
    DeviceType::registerChannel(c4,4);
  }
  virtual ~MixDevice () {}

  BtnChannel& btn1Channel () { return c1; }
  BtnChannel& btn2Channel () { return c2; }
  SwChannel&  Sw3Channel  () { return c3; }
  SwChannel&  Sw4Channel  () { return c4; }
};
MixDevice sdev(0x20);

ConfigButton<MixDevice> cfgBtn(sdev);

// map number of channel to pin
// this will be called by the SwitchChannel class
uint8_t SwitchPin (uint8_t number) {
  switch( number ) {
   
    case 3: return RELAY1_PIN;
    case 4: return RELAY2_PIN;
   
   
  }
}

void setup () {
  DINIT(57600,ASKSIN_PLUS_PLUS_IDENTIFIER);
  sdev.init(hal);
  sdev.Sw3Channel().lowactive(false);
  sdev.Sw4Channel().lowactive(false);
  buttonISR(cfgBtn,CONFIG_BUTTON_PIN);
  remoteChannelISR(sdev.btn1Channel(),BUTTON1_PIN);
  remoteChannelISR(sdev.btn2Channel(),BUTTON2_PIN);
 
}

void loop() {
  bool pinchanged = sdev.btn1Channel().checkpin();
  pinchanged |= sdev.btn2Channel().checkpin();

  bool worked = hal.runready();
  bool poll = sdev.pollRadio();
  if( pinchanged == false && worked == false && poll == false ) {
    // deep discharge protection
    // if we drop below critical battery level - switch off all and sleep forever
    if( hal.battery.critical() ) {
      // this call will never return
      hal.activity.sleepForever(hal);
    }

  if( worked == false && poll == false ) {
    hal.activity.savePower<Idle<> >(hal);
  }
  }
}

papa

Na das sind ja gute Nachrichten. Willst Du das Device auch in FHEM einbinden ?
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

east

Leider habe ich bis dato noch gar keine Erfahrung mit FHEM. Hatte es auch noch nie getestet. Brauche glaube dann einen CUL, oder?

Xent

Ich würde gerne das Gerät HM-LC-RGBW-WM nachbauen.
Gibts dafür schon alles in der Lib oder muss da noch was aus der XML generiert werden?

papa

Ich habe mal jetzt so auf die Schnelle in das XML reingesehen - im Prinzip scheint es ja wie ein Dimmer zu funktionieren - aber die Listen unterscheiden sich schon. Da muss wohl noch etwas Aufwand in die Channel-Listen gesteckt werden.

@Dietmar kannst Du die mal generieren ?
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Dietmar63

#305
Gleicher Code wie beim letzten Mal?
Habe gesehen, dass du nur einen Teil der List Klassen verwendet hast.

Die Message Klassen hattest du nicht nötig.

Vielleicht schaffe ich es erst morgen Abend.
Morgen früh geht es leider schon  früh los.

Die Nachricht habe ich leider erst jetzt gelesen.

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

Xent

Vielen Dank fürs generieren leider weiß ich nicht so recht, was ich davon brauche und wie ich es einbauen müsste.
Ich denke da weiß papa eher bescheid was getan werden muss.

Ich würde dann schauen, dass ich die Ausgabe als PWM etc. einbaue.

papa

Bei mir ist die Zeit gerade echt knapp. Du könntest ja auch erst mal den Dimmer nehmen und die 3 Kanäle für RGB missbrauchen.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Xent

Kenn ich ;-)
Meinst du nen neues Gerät definieren mit 3 Kanälen und dann auch ne neue XML für die CCU anlegen (da es maximal nen 2 Kanal-Dimmer gibt)
oder das Modell auf den RGB ändern und 3 Dimmerkanäle definieren?

papa

Es gibt das HM-LC-Dim1PWM-CV Example. Das ist ein Dimmer mit 3 Kanälen. 2 sind virtuell. Aber das muss ja so nicht sein.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Xent

Ah ok, ich werd mich mal dran versuchen.

andirs

#311
Hallo zusammen, ich hoffe jmd. kann mir nochmal weiterhelfen.
Ich bin gerade dabei das xml file für meinen Universalsensor zu basteln.
Ich bekomme die Helligkeit (vorletzter Teil der Nachricht "24") noch erfolgreich eingebunden, aber beim letzten Teil "01" welcher ein bool für "Bewegung erkannt" darstellt nicht mehr.

So sieht die Nachricht aus, die an die Homematic Zentrale gesandt wird.
0E 01 A0 70 212223 FD4365 00 19 31 24 01

Und so das xml File (abgeändert vom WDS10THO)
<homegearDevice version="1">
<supportedDevices>
<device id="HM-UniSen">
<description>HM-UniSen</description>
<typeNumber>0x99</typeNumber>
</device>
</supportedDevices>
<properties>
<receiveMode>config</receiveMode>
<receiveMode>wakeUp</receiveMode>
<timeout>600</timeout>
<hasBattery>true</hasBattery>
</properties>
<functions>
<function channel="0" type="MAINTENANCE">
<properties>
<internal>true</internal>
</properties>
<configParameters>ash550_dev_master--0</configParameters>
<variables>maint_ch_values--0</variables>
</function>
<function channel="1" type="WEATHER">
<properties>
<linkSenderFunctionTypes>
<type>WEATHER_TH</type>
</linkSenderFunctionTypes>
</properties>
<configParameters>ash550_ch_master--1</configParameters>
<variables>ash550_ch_values--1</variables>
<linkParameters>ash550_ch_link--1</linkParameters>
</function>
</functions>
<packets>
<packet id="WEATHER_EVENT">
<direction>toCentral</direction>
<type>0x70</type>
<channel>1</channel>
<binaryPayload>
<element>
<index>9.0</index>
<size>1.7</size>
<parameterId>TEMPERATURE</parameterId>
<isSigned>true</isSigned>
</element>
<element>
<index>11.0</index>
<parameterId>HUMIDITY</parameterId>
</element>
<element>
<index>12.0</index>
<parameterId>BRIGHTNESS</parameterId>
</element>
<element>
<index>13.0</index>
<parameterId>MOTION</parameterId>
</element>
</binaryPayload>
</packet>
</packets>
<parameterGroups>
<configParameters id="ash550_ch_master--1"/>
<configParameters id="ash550_dev_master--0">
<parameter id="BURST_RX">
<properties/>
<logicalBoolean>
<defaultValue>false</defaultValue>
</logicalBoolean>
<physicalInteger>
<index>1.0</index>
<size>1.0</size>
<list>0</list>
<operationType>config</operationType>
</physicalInteger>
</parameter>
<parameter id="ROAMING">
<properties>
<internal>true</internal>
</properties>
<logicalBoolean>
<defaultValue>false</defaultValue>
</logicalBoolean>
<physicalInteger>
<operationType>store</operationType>
</physicalInteger>
</parameter>
</configParameters>
<variables id="ash550_ch_values--1">
<parameter id="TEMPERATURE">
<properties>
<writeable>false</writeable>
<signed>true</signed>
<unit>°C</unit>
<casts>
<decimalIntegerScale>
<factor>1.000000</factor>
</decimalIntegerScale>
</casts>
</properties>
<logicalDecimal>
<minimumValue>-40.000000</minimumValue>
<maximumValue>80.000000</maximumValue>
</logicalDecimal>
<physicalInteger groupId="TEMPERATURE">
<size>1.7</size>
<operationType>command</operationType>
</physicalInteger>
<packets>
<packet id="WEATHER_EVENT">
<type>event</type>
</packet>
</packets>
</parameter>
<parameter id="HUMIDITY">
<properties>
<writeable>false</writeable>
<unit>%</unit>
</properties>
<logicalInteger>
<minimumValue>0</minimumValue>
<maximumValue>100</maximumValue>
</logicalInteger>
<physicalInteger groupId="HUMIDITY">
<size>1.0</size>
<operationType>command</operationType>
</physicalInteger>
<packets>
<packet id="WEATHER_EVENT">
<type>event</type>
</packet>
</packets>
</parameter>
<parameter id="BRIGHTNESS">
<properties>
<writeable>false</writeable>
<unit>%</unit>
</properties>
<logicalInteger>
<minimumValue>0</minimumValue>
<maximumValue>100</maximumValue>
</logicalInteger>
<physicalInteger groupId="BRIGHTNESS">
<size>1.0</size>
<operationType>command</operationType>
</physicalInteger>
<packets>
<packet id="WEATHER_EVENT">
<type>event</type>
</packet>
</packets>
</parameter>
<parameter id="MOTION">
<properties>
<writeable>false</writeable>
<unit>-</unit>
</properties>
<logicalInteger>
<minimumValue>0</minimumValue>
<maximumValue>1</maximumValue>
</logicalInteger>
<physicalInteger groupId="MOTION">
<size>1.0</size>
<operationType>command</operationType>
</physicalInteger>
<packets>
<packet id="WEATHER_EVENT">
<type>event</type>
</packet>
</packets>
</parameter>
</variables>
<variables id="maint_ch_values--0">
<parameter id="UNREACH">
<properties>
<writeable>false</writeable>
<service>true</service>
</properties>
<logicalBoolean/>
<physicalInteger groupId="UNREACH">
<operationType>internal</operationType>
</physicalInteger>
</parameter>
<parameter id="STICKY_UNREACH">
<properties>
<service>true</service>
<sticky>true</sticky>
</properties>
<logicalBoolean/>
<physicalInteger groupId="STICKY_UNREACH">
<operationType>internal</operationType>
</physicalInteger>
</parameter>
<parameter id="CONFIG_PENDING">
<properties>
<writeable>false</writeable>
<service>true</service>
</properties>
<logicalBoolean/>
<physicalInteger groupId="CONFIG_PENDING">
<operationType>internal</operationType>
</physicalInteger>
</parameter>
<parameter id="LOWBAT">
<properties>
<writeable>false</writeable>
<service>true</service>
</properties>
<logicalBoolean/>
<physicalInteger groupId="LOWBAT">
<operationType>internal</operationType>
</physicalInteger>
</parameter>
<parameter id="RSSI_DEVICE">
<properties>
<writeable>false</writeable>
</properties>
<logicalInteger/>
<physicalInteger groupId="RSSI_DEVICE">
<operationType>internal</operationType>
</physicalInteger>
</parameter>
<parameter id="RSSI_PEER">
<properties>
<writeable>false</writeable>
</properties>
<logicalInteger/>
<physicalInteger groupId="RSSI_PEER">
<operationType>internal</operationType>
</physicalInteger>
</parameter>
<parameter id="CENTRAL_ADDRESS_SPOOFED">
<properties>
<service>true</service>
<sticky>true</sticky>
<control>NONE</control>
</properties>
<logicalEnumeration>
<defaultValue>0</defaultValue>
<value>
<id>UNSET</id>
<index>0</index>
</value>
<value>
<id>CENTRAL_ADDRESS_SPOOFED</id>
<index>1</index>
</value>
</logicalEnumeration>
<physicalInteger groupId="CENTRAL_ADDRESS_SPOOFED">
<operationType>internal</operationType>
</physicalInteger>
</parameter>
</variables>
<linkParameters id="ash550_ch_link--1"/>
</parameterGroups>
</homegearDevice>


Kann mir jmd. sagen worans liegt? Ich muss leider gestehen, dass ich die Syntax überhaupt nicht verstehe und nichtmal verstehe was "size", "index" etc. sind. Bei der Brightness scheine ich aber immerhin richtig geraten zu haben :)

Ich habe es jetzt erst garnicht als Switch versucht sondern erstmal auch als Zahl.

Danke.

EDIT: Habe es jetzt selber hinbekommen. Btw. gibt es irgendwo eine Anleitung zum Thema?
Habe diesen Thread https://forum.fhem.de/index.php?topic=61780.0 gefunden, allerdings scheint HM Wired nicht wirklich mit HM BidCos übereinander zu passen...

papa

Ich kenne auch nur die Anleitung von Thorsten für HM-Wired. Aber das scheint leider nicht gleich zu sein.

Könntest Du bitte die Lösung noch posten, falls jamand mal etwas ähnliches bauen will. Soweit ich das verstanden habe, hast Du das Weather-Event um einen Motion-Status erweitert. Richtig ? Und mit deinem XML läuft es mit der CCU. Korrekt ?
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

andirs

#313
Ich habe das Weather Event um eine Meldung zur Helligkeit und Bewegung erweitert.
Hier die xml Datei

<homegearDevice version="1">
<supportedDevices>
<device id="HM-UniSen">
<description>HM-UniSen</description>
<typeNumber>0x99</typeNumber>
</device>
</supportedDevices>
<properties>
<receiveMode>config</receiveMode>
<receiveMode>wakeUp</receiveMode>
<timeout>600</timeout>
<hasBattery>true</hasBattery>
</properties>
<functions>
<function channel="0" type="MAINTENANCE">
<properties>
<internal>true</internal>
</properties>
<configParameters>ash550_dev_master--0</configParameters>
<variables>maint_ch_values--0</variables>
</function>
<function channel="1" type="WEATHER">
<properties>
<linkSenderFunctionTypes>
<type>WEATHER_TH</type>
</linkSenderFunctionTypes>
</properties>
<configParameters>ash550_ch_master--1</configParameters>
<variables>ash550_ch_values--1</variables>
<linkParameters>ash550_ch_link--1</linkParameters>
</function>
</functions>
<packets>
<packet id="WEATHER_EVENT">
<direction>toCentral</direction>
<type>0x70</type>
<channel>1</channel>
<binaryPayload>
<element>
<index>9.0</index>
<size>1.7</size>
<parameterId>TEMPERATURE</parameterId>
<isSigned>true</isSigned>
</element>
<element>
<index>11.0</index>
<size>1.0</size>
<parameterId>HUMIDITY</parameterId>
</element>
<element>
<index>12.0</index>
<size>1.0</size>
<parameterId>BRIGHTNESS</parameterId>
</element>
<element>
<index>13.0</index>
<size>1.0</size>
<parameterId>MOTION</parameterId>
</element>
</binaryPayload>
</packet>
</packets>
<parameterGroups>
<configParameters id="ash550_ch_master--1"/>
<configParameters id="ash550_dev_master--0">
<parameter id="BURST_RX">
<properties/>
<logicalBoolean>
<defaultValue>false</defaultValue>
</logicalBoolean>
<physicalInteger>
<index>1.0</index>
<size>1.0</size>
<list>0</list>
<operationType>config</operationType>
</physicalInteger>
</parameter>
<parameter id="ROAMING">
<properties>
<internal>true</internal>
</properties>
<logicalBoolean>
<defaultValue>false</defaultValue>
</logicalBoolean>
<physicalInteger>
<operationType>store</operationType>
</physicalInteger>
</parameter>
</configParameters>
<variables id="ash550_ch_values--1">
<parameter id="TEMPERATURE">
<properties>
<writeable>false</writeable>
<signed>true</signed>
<unit>°C</unit>
<casts>
<decimalIntegerScale>
<factor>10.000000</factor>
</decimalIntegerScale>
</casts>
</properties>
<logicalDecimal>
<minimumValue>-40.000000</minimumValue>
<maximumValue>80.000000</maximumValue>
</logicalDecimal>
<physicalInteger groupId="TEMPERATURE">
<size>1.7</size>
<operationType>command</operationType>
</physicalInteger>
<packets>
<packet id="WEATHER_EVENT">
<type>event</type>
</packet>
</packets>
</parameter>
<parameter id="HUMIDITY">
<properties>
<writeable>false</writeable>
<unit>%</unit>
</properties>
<logicalInteger>
<minimumValue>0</minimumValue>
<maximumValue>100</maximumValue>
</logicalInteger>
<physicalInteger groupId="HUMIDITY">
<size>1.0</size>
<operationType>command</operationType>
</physicalInteger>
<packets>
<packet id="WEATHER_EVENT">
<type>event</type>
</packet>
</packets>
</parameter>
<parameter id="BRIGHTNESS">
<properties>
<writeable>false</writeable>
<unit>%</unit>
</properties>
<logicalInteger>
<minimumValue>0</minimumValue>
<maximumValue>100</maximumValue>
</logicalInteger>
<physicalInteger groupId="BRIGHTNESS">
<size>1.0</size>
<operationType>command</operationType>
</physicalInteger>
<packets>
<packet id="WEATHER_EVENT">
<type>event</type>
</packet>
</packets>
</parameter>
<parameter id="MOTION">
<properties>
<writeable>false</writeable>
</properties>
<logicalBoolean/>
<physicalInteger groupId="MOTION">
<operationType>command</operationType>
</physicalInteger>
<packets>
<packet id="WEATHER_EVENT">
<type>event</type>
</packet>
</packets>
</parameter>
</variables>
<variables id="maint_ch_values--0">
<parameter id="UNREACH">
<properties>
<writeable>false</writeable>
<service>true</service>
</properties>
<logicalBoolean/>
<physicalInteger groupId="UNREACH">
<operationType>internal</operationType>
</physicalInteger>
</parameter>
<parameter id="STICKY_UNREACH">
<properties>
<service>true</service>
<sticky>true</sticky>
</properties>
<logicalBoolean/>
<physicalInteger groupId="STICKY_UNREACH">
<operationType>internal</operationType>
</physicalInteger>
</parameter>
<parameter id="CONFIG_PENDING">
<properties>
<writeable>false</writeable>
<service>true</service>
</properties>
<logicalBoolean/>
<physicalInteger groupId="CONFIG_PENDING">
<operationType>internal</operationType>
</physicalInteger>
</parameter>
<parameter id="LOWBAT">
<properties>
<writeable>false</writeable>
<service>true</service>
</properties>
<logicalBoolean/>
<physicalInteger groupId="LOWBAT">
<operationType>internal</operationType>
</physicalInteger>
</parameter>
<parameter id="RSSI_DEVICE">
<properties>
<writeable>false</writeable>
</properties>
<logicalInteger/>
<physicalInteger groupId="RSSI_DEVICE">
<operationType>internal</operationType>
</physicalInteger>
</parameter>
<parameter id="RSSI_PEER">
<properties>
<writeable>false</writeable>
</properties>
<logicalInteger/>
<physicalInteger groupId="RSSI_PEER">
<operationType>internal</operationType>
</physicalInteger>
</parameter>
<parameter id="CENTRAL_ADDRESS_SPOOFED">
<properties>
<service>true</service>
<sticky>true</sticky>
<control>NONE</control>
</properties>
<logicalEnumeration>
<defaultValue>0</defaultValue>
<value>
<id>UNSET</id>
<index>0</index>
</value>
<value>
<id>CENTRAL_ADDRESS_SPOOFED</id>
<index>1</index>
</value>
</logicalEnumeration>
<physicalInteger groupId="CENTRAL_ADDRESS_SPOOFED">
<operationType>internal</operationType>
</physicalInteger>
</parameter>
</variables>
<linkParameters id="ash550_ch_link--1"/>
</parameterGroups>
</homegearDevice>


Allerdings habe ich ein neues Problem, welches ich nicht gelöst bekomme.
Eigentlich wurde im seriellen Monitor immer noch die Antwort von der Zentrale angezeigt und ob das Ganze "ACK"ed wurde. Da hat alles super funktioniert. Das ist jetzt aber plötzlich weg (ohne dass ich denke etwas relevantes geändert zu haben) und nur erste die Nachrichten kommt an, danach dem 600s Timeout wird das Gerät dann als offline angezeigt.

AskSin++ V1.0.4
Address Space: 32 - 73
CC init12..........3 - ready
Bat: 33
<- 0E 00 A0 70 212223 000000 01 11 3C 5B 00
<- 0E 01 A0 70 212223 000000 01 13 3B 5C 01
<- 0E 02 A0 70 212223 000000 01 0C 3C 58 00
<- 0E 03 A0 70 212223 000000 01 14 3B 5D 01
<- 0E 04 A0 70 212223 000000 01 14 3C 41 00
<- 0E 05 A0 70 212223 000000 01 14 41 3A 01
<- 0E 06 A0 70 212223 000000 01 14 3E 4C 00


Kannst du mir sagen, woran das liegen könnte?
Vielen Dank

papa

Du sendest an 000000 - anstatt zur Zentrale. Das Gerät ist nicht korrekt gepairet.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire