leider komme ich bei dem Versuch, 20 bytes an Messdaten zzgl. 3 bytes fuer Temperatur/Feuchte von einem Sensor an die CCU zu uebertragen und in einem Kanal darzustellen, nicht weiter. Der Sensor ist an die CCU angelernt und die Geraeteconfig in Kanal 0 laesst sich von dort aendern. Die vom Sensor ueber die serielle Schnittstelle ausgegebenen Telegramme werden ebenso wie die ACKs der CCU auch im Analyzer sichtbar, am Funk liegt es also wohl nicht. Dennoch landen keine Daten auf der CCU:
Ausschnitt aus dem xml:
Code: Alles auswählen
<channel index="1" type="HBWEATHER" autoregister="true">
<link_roles>
<source name="WEATHER_TH" />
</link_roles>
<paramset type="MASTER" id="HB-UNI-Sen-PM_master" />
<paramset type="VALUES" id="HB-UNI-Sen-PM_values">
<parameter id="TEMPERATURE" operations="read,event">
<logical type="float" min="-50.0" max="120.0" unit="°C" />
<physical type="integer" interface="command" value_id="TEMPERATURE">
<event frame="WEATHER_EVENT" />
</physical>
<conversion type="float_integer_scale" factor="10.0" />
<description>
<field id="AutoconfRoles" value="WEATHER" />
</description>
</parameter>
<parameter id="HUMIDITY" operations="read,event">
<logical type="integer" min="0" max="100" unit="%" />
<physical type="integer" interface="command" value_id="HUMIDITY">
<event frame="WEATHER_EVENT" />
</physical>
</parameter>
<parameter id="PM_1P0" operations="read,event">
<logical type="float" min="0.0" max="6553.5" unit="µg/m³" />
<physical type="integer" interface="command" value_id="PM_1P0">
<event frame="WEATHER_EVENT" />
</physical>
<conversion type="float_integer_scale" factor="10.0" />
</parameter>
<parameter id="PM_2P5" operations="read,event">
<logical type="float" min="0.0" max="6553.5" unit="µg/m³" />
<physical type="integer" interface="command" value_id="PM_2P5">
<event frame="WEATHER_EVENT" />
</physical>
<conversion type="float_integer_scale" factor="10.0" />
</parameter>
<parameter id="PM_4P0" operations="read,event">
<logical type="float" min="0.0" max="6553.5" unit="µg/m³" />
<physical type="integer" interface="command" value_id="PM_4P0">
<event frame="WEATHER_EVENT" />
</physical>
<conversion type="float_integer_scale" factor="10.0" />
</parameter>
<parameter id="PM_10P0" operations="read,event">
<logical type="float" min="0.0" max="6553.5" unit="µg/m³" />
<physical type="integer" interface="command" value_id="PM_10P0">
<event frame="WEATHER_EVENT" />
</physical>
<conversion type="float_integer_scale" factor="10.0" />
</parameter>
<parameter id="NC_0P5" operations="read,event">
<logical type="float" min="0.0" max="6553.5" unit="/cm³" />
<physical type="integer" interface="command" value_id="NC_0P5">
<event frame="WEATHER_EVENT" />
</physical>
<conversion type="float_integer_scale" factor="10.0" />
</parameter>
<parameter id="NC_1P0" operations="read,event">
<logical type="float" min="0.0" max="6553.5" unit="/cm³" />
<physical type="integer" interface="command" value_id="NC_1P0">
<event frame="WEATHER_EVENT" />
</physical>
<conversion type="float_integer_scale" factor="10.0" />
</parameter>
<parameter id="NC_2P5" operations="read,event">
<logical type="float" min="0.0" max="6553.5" unit="/cm³" />
<physical type="integer" interface="command" value_id="NC_2P5">
<event frame="WEATHER_EVENT" />
</physical>
<conversion type="float_integer_scale" factor="10.0" />
</parameter>
<parameter id="NC_4P0" operations="read,event">
<logical type="float" min="0.0" max="6553.5" unit="/cm³" />
<physical type="integer" interface="command" value_id="NC_4P0">
<event frame="WEATHER_EVENT" />
</physical>
<conversion type="float_integer_scale" factor="10.0" />
</parameter>
<parameter id="NC_10P0" operations="read,event">
<logical type="float" min="0.0" max="6553.5" unit="/cm³" />
<physical type="integer" interface="command" value_id="NC_10P0">
<event frame="WEATHER_EVENT" />
</physical>
<conversion type="float_integer_scale" factor="10.0" />
</parameter>
<parameter id="AVG_PARTICLE_SIZE" operations="read,event">
<logical type="float" min="0.0" max="6553.5" unit="µm" />
<physical type="integer" interface="command" value_id="AVG_PARTICLE_SIZE">
<event frame="WEATHER_EVENT" />
</physical>
<conversion type="float_integer_scale" factor="100.0" />
</parameter>
</paramset>
<paramset type="LINK" id="HB-UNI-Sen-PM_link"></paramset>
</channel>
</channels>
<frames>
<frame id="WEATHER_EVENT" direction="from_device" event="true" type="0x70">
<parameter type="integer" signed="true" index="9" size="1.7" param="TEMPERATURE" />
<parameter type="integer" index="11" size="1.0" param="HUMIDITY" />
<parameter type="integer" index="12" size="2.0" param="PM_1P0" />
<parameter type="integer" index="14" size="2.0" param="PM_2P5" />
<parameter type="integer" index="16" size="2.0" param="PM_4P0" />
<parameter type="integer" index="18" size="2.0" param="PM_10P0" />
</frame>
<frame id="MEASURE_EVENT" direction="from_device" event="true" type="0x53">
<parameter type="integer" index= "9" size="2.0" param="NC_0P5" />
<parameter type="integer" index="11" size="2.0" param="NC_1P0" />
<parameter type="integer" index="13" size="2.0" param="NC_2P5" />
<parameter type="integer" index="15" size="2.0" param="NC4P0" />
<parameter type="integer" index="17" size="2.0" param="NC_10P0" />
<parameter type="integer" index="19" size="2.0" param="AVG_PARTICLE_SIZE" />
</frame>
</frames>
<paramset_defs></paramset_defs>
Ausschnitt aus dem Sketch:
Code: Alles auswählen
class PMDataMsg1 : public Message {
public:
void init(uint8_t msgcnt, int16_t temp, uint8_t humidity, uint16_t mc1p0, uint16_t mc2p5, uint16_t mc4p0, uint16_t mc10p0) {
// Message Length (first byte param.): 11 + payload. Max. payload: 17 Bytes (https://www.youtube.com/watch?v=uAyzimU60jw)
uint8_t t1 = (temp >> 8) & 0x7f;
uint8_t t2 = temp & 0xff;
Message::init(20, msgcnt, 0x70, BIDI | WKMEUP, t1, t2);
pload[0] = humidity & 0xff;
pload[1] = (mc1p0 >> 8) & 0xff;
pload[2] = mc1p0 & 0xff;
pload[3] = (mc2p5 >> 8) & 0xff;
pload[4] = mc2p5 & 0xff;
pload[5] = (mc4p0 >> 8) & 0xff;
pload[6] = mc4p0 & 0xff;
pload[7] = (mc10p0 >> 8) & 0xff;
pload[8] = mc10p0 & 0xff;
}
};
class PMDataMsg2 : public Message {
public:
void init(uint8_t msgcnt, uint16_t nc0p5, uint16_t nc1p0, uint16_t nc2p5, uint16_t nc4p0, uint16_t nc10p0, uint16_t partsize) {
// Message Length (first byte param.): 11 + payload. Max. payload: 17 Bytes (https://www.youtube.com/watch?v=uAyzimU60jw)
Message::init(23, msgcnt, 0x53, BIDI | WKMEUP, 0, 0);
pload[0] = (nc0p5 >> 8) & 0xff;
pload[1] = nc0p5 & 0xff;
pload[2] = (nc1p0 >> 8) & 0xff;
pload[3] = nc1p0 & 0xff;
pload[4] = (nc2p5 >> 8) & 0xff;
pload[5] = nc2p5 & 0xff;
pload[6] = (nc4p0 >> 8) & 0xff;
pload[7] = nc4p0 & 0xff;
pload[8] = (nc10p0 >> 8) & 0xff;
pload[9] = nc10p0 & 0xff;
pload[10] = (partsize >> 8) & 0xff;
pload[11] = partsize & 0xff;
}
};
class SensChannel : public Channel<Hal, List1, EmptyList, List4, PEERS_PER_CHANNEL, GDList0>, public Alarm {
PMDataMsg1 msg1;
PMDataMsg2 msg2;
Sens_SHT31<0x44> sht31; //SG: GY breakout board standard address
Sens_SPS30 sps30;
uint16_t millis;
public:
SensChannel () : Channel(), Alarm(5), millis(0) {}
virtual ~SensChannel () {}
virtual void trigger (__attribute__ ((unused)) AlarmClock& clock) {
// reactivate for next measure
tick = seconds2ticks(10);
clock.add(*this);
sht31.measure();
sps30.measure();
DPRINT("temp / hum = ");DDEC(sht31.temperature());DPRINT(" / ");DDECLN(sht31.humidity());
DPRINT("mass concentration 1 / 2.5 / 4 / 10 = ");DDEC(sps30.mc_1p0());DPRINT(" / ");DDEC(sps30.mc_2p5());;DPRINT(" / ");DDEC(sps30.mc_4p0());;DPRINT(" / ");DDECLN(sps30.mc_10p0());
DPRINT("numb concentration 0.5 / 1 / 2.5 / 4 / 10 = ");DDEC(sps30.nc_0p5());DPRINT(" / ");DDEC(sps30.nc_1p0());DPRINT(" / ");DDEC(sps30.nc_2p5());;DPRINT(" / ");DDEC(sps30.nc_4p0());;DPRINT(" / ");DDECLN(sps30.nc_10p0());
DPRINT("avg particle size = ");DDECLN(sps30.partsize());
uint8_t msgcnt = device().nextcount();
//msg1.init( msgcnt, sht31.temperature(), sht31.humidity(), sps30.mc_1p0(), sps30.mc_2p5(), sps30.mc_4p0(), sps30.mc_10p0());
msg1.init( msgcnt, 0x0333, 0x55, sps30.mc_1p0(), sps30.mc_2p5(), sps30.mc_4p0(), sps30.mc_10p0());
device().sendPeerEvent(msg1, *this);
msgcnt = device().nextcount();
msg2.init( msgcnt, sps30.nc_0p5(), sps30.nc_1p0(), sps30.nc_2p5(), sps30.nc_4p0(), sps30.nc_10p0(), sps30.partsize());
device().sendPeerEvent(msg2, *this);
}
Code: Alles auswählen
AskSin++ v5.0.0 (Jan 23 2022 20:33:38)
SHT31 OK
SPS30 ok, measurement started
Address Space: 32 - 70
CC init1
CC Version: 14
- ready
Config Freq: 0x2165C2
* Config Changed : List0
* LED Mode : 1
* Low Bat Limit : 0
* Sendeversuche : 3
* SENDEINTERVALL : 10
temp / hum = 0 / 0
mass concentration 1 / 2.5 / 4 / 10 = 75 / 79 / 79 / 79
numb concentration 0.5 / 1 / 2.5 / 4 / 10 = 501 / 598 / 602 / 602 / 602
avg particle size = 48
<- 14 01 A2 70 F82401 BA4BC3 03 33 55 00 4B 00 4F 00 4F 00 4F - 231
-> 0A 01 80 02 BA4BC3 F82401 00 - 356
waitAck: 01
<- 17 02 A2 53 F82401 BA4BC3 00 00 01 F5 02 56 02 5A 02 5A 02 5A 00 30 - 399
-> 0A 02 80 02 BA4BC3 F82401 00 - 514
waitAck: 01
Hinweise, wie ich das zum Laufen bekomme, waeren super.
Vielen Dank vorab,
Stephan