Sketch MAX44009+Measuring

Begonnen von TomLee, 12 Mai 2020, 17:28:39

Vorheriges Thema - Nächstes Thema

TomLee

Hallo,

hab mir letzte Woche aus Bauteilen deren "Incoming" vor mehreren Jahren war 3 Nodes gebastelt.

Als Sparfuchs hab ich kein Problem damit, zum spielen, ein ESP-basiertes Gateway zu nehmen, einfach weil der Wemos schon da ist  :P.
Mit GatewayESP8266 hab ich in MYSENSORS(_DEVICE) reingeschnuppert, GatewayESP8266MQTTClient ist mir mit MQTT2 aber erstmal für 2 dringend benötigte Helligkeitssensoren lieber.

Eine Sensor-Node (Pro Mini,NRF24L01+,BH1750,LiPo LiFePo4 3,2V) läuft mit LightLuxSensor und alles passt gut in ein 3-fach Batteriegehäuse  :) .
Noch kein mV Spannungsverlust seit 4-5 Tagen, kanns gar nicht glauben.

Sketch:

// Enable and select radio type attached
#define MY_RADIO_RF24
//#define MY_RADIO_RFM69
#define MY_NODE_ID 3
#include <MySensors.h> 
#include <BH1750.h>
#include <Wire.h>

#define CHILD_ID_LIGHT 0
unsigned long SLEEP_TIME = 300000; // Sleep time between reads (in milliseconds)

BH1750 lightSensor;

// V_LIGHT_LEVEL should only be used for uncalibrated light level 0-100%.
// If your controller supports the new V_LEVEL variable, use this instead for
// transmitting LUX light level.
MyMessage msg(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
// MyMessage msg(CHILD_ID_LIGHT, V_LEVEL); 
uint16_t lastlux;

void setup() 
{
  lightSensor.begin();
}

void presentation()  {
  // Send the sketch version information to the gateway and Controller
  sendSketchInfo("Light Lux Sensor", "1.0");

  // Register all sensors to gateway (they will be created as child devices)
  present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);
}

void loop()     
{     
  uint16_t lux = lightSensor.readLightLevel();// Get Lux value
  Serial.println(lux);
  if (lux != lastlux) {
      send(msg.set(lux));
      lastlux = lux;
  }
 
  sleep(SLEEP_TIME);
}


MQTT2-Device:

defmod MQTT2_MYSENSORS_BH1750 MQTT2_DEVICE mysensors_BH1750
attr MQTT2_MYSENSORS_BH1750 IODev MQTT2_Server
attr MQTT2_MYSENSORS_BH1750 event-on-change-reading brightness
attr MQTT2_MYSENSORS_BH1750 readingList mygateway1-out/3/255/0/0/17:.* MYSENSORS_VERSION\
mygateway1-out/3/255/3/0/6:.* 0_6\
mygateway1-out/3/255/3/0/11:.* SKETCH_NAME\
mygateway1-out/3/255/3/0/12:.* SKETCH_VERSION\
mygateway1-out/3/0/0/0/16:.* 0_16\
mygateway1-out/3/0/1/0/23:.* brightness\

attr MQTT2_MYSENSORS_BH1750 room MQTT2_DEVICE
attr MQTT2_MYSENSORS_BH1750 stateFormat brightness lux

setstate MQTT2_MYSENSORS_BH1750 191 lux
setstate MQTT2_MYSENSORS_BH1750 2020-05-12 15:32:04 0_16
setstate MQTT2_MYSENSORS_BH1750 2020-05-12 15:32:02 0_6 0
setstate MQTT2_MYSENSORS_BH1750 2020-05-12 15:32:02 MYSENSORS_VERSION 2.3.2
setstate MQTT2_MYSENSORS_BH1750 2020-05-12 15:32:04 SKETCH_NAME Light Lux Sensor
setstate MQTT2_MYSENSORS_BH1750 2020-05-12 15:32:04 SKETCH_VERSION 1.0
setstate MQTT2_MYSENSORS_BH1750 2020-05-12 16:55:06 brightness 191




Die andere Node existiert nur auf dem Steckbrett (gleiche Bauteile), da ich nur einen BH1750 hab, aber mehrere MAX44009, musst ich den LightLuxSensor,ino anpassen, was mir wirklich gelungen ist, die Werte werden übertragen.

Heute kamen die fehlenden 470K Widerstände für die Spannungsmessung und ich hab mich an den Sketch gemacht.

Bisher sieht das so aus:

/**
* connect the sensor as follows :
*
*   VCC  >>> 5V
*   Gnd  >>> Gnd
*   ADDR >>> NC or GND 
*   SCL  >>> A5
*   SDA  >>> A4

*/


// Enable debug prints to serial monitor
#define MY_DEBUG

// Enable and select radio type attached
#define MY_RADIO_RF24
//#define MY_RADIO_RFM69
#define MY_NODE_ID 2
#include <MySensors.h> 
#include <MAX44009.h>
#include <Wire.h>

#define CHILD_ID_LIGHT 2
unsigned long SLEEP_TIME = 3000; // Sleep time between reads (in milliseconds)

MAX44009 light;

// V_LIGHT_LEVEL should only be used for uncalibrated light level 0-100%.
// If your controller supports the new V_LEVEL variable, use this instead for
// transmitting LUX light level.
MyMessage msglight(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
// MyMessage msg(CHILD_ID_LIGHT, V_LEVEL); 
uint16_t lastlux;

// Battery Measuring
int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
// uint32_t SLEEP_TIME = 900000;  // sleep time between reads (seconds * 1000 milliseconds)
int oldBatteryPcnt = 0;

void setup() 
{
  light.begin();
  // Battery Measuring use the 1.1 V internal reference
#if defined(__AVR_ATmega2560__)
  analogReference(INTERNAL1V1);
#else
  analogReference(INTERNAL);
#endif
}

void presentation()  {
  // Send the sketch version information to the gateway and Controller
  sendSketchInfo("LightMaxMeasSensor", "1.0");

  // Register all sensors to gateway (they will be created as child devices)
  present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);

  bool sendBatteryLevel(uint8_t level, bool echo);
}

void loop()     
{     
  uint16_t lux = light.get_lux();// Get Lux value
  Serial.println(lux);
  if (lux != lastlux) {
      send(msglight.set(lux));
      lastlux = lux;
  }
// Battery Measuring get the battery Voltage
  int sensorValue = analogRead(BATTERY_SENSE_PIN);
#ifdef MY_DEBUG
  Serial.println(sensorValue);
#endif

  // 1M, 470K divider across battery and using internal ADC ref of 1.1V
  // Sense point is bypassed with 0.1 uF cap to reduce noise at that point
  // ((1e6+470e3)/470e3)*1.1 = Vmax = 3.44 Volts
  // 3.44/1023 = Volts per bit = 0.003363075

  int batteryPcnt = sensorValue / 10;

#ifdef MY_DEBUG
  float batteryV  = sensorValue * 0.003363075;
  Serial.print("Battery Voltage: ");
  Serial.print(batteryV);
  Serial.println(" V");

  Serial.print("Battery percent: ");
  Serial.print(batteryPcnt);
  Serial.println(" %");
#endif

  if (oldBatteryPcnt != batteryPcnt) {
    // Power up radio after sleep
    sendBatteryLevel(batteryPcnt);
    oldBatteryPcnt = batteryPcnt;
  }
  sleep(SLEEP_TIME);
}


Im seriellen Monitor sehe ich:

__  __       ____
|  \/  |_   _/ ___|  ___ _ __  ___  ___  _ __ ___
| |\/| | | | \___ \ / _ \ `_ \/ __|/ _ \| `__/ __|
| |  | | |_| |___| |  __/ | | \__ \  _  | |  \__ \
|_|  |_|\__, |____/ \___|_| |_|___/\___/|_|  |___/
        |___/                      2.3.2

16 MCO:BGN:INIT NODE,CP=RNNNA---,FQ=16,REL=255,VER=2.3.2
26 TSM:INIT
28 TSF:WUR:MS=0
34 TSM:INIT:TSP OK
36 TSM:INIT:STATID=2
38 TSF:SID:OK,ID=2
39 TSM:FPAR
43 ?TSF:MSG:SEND,2-2-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
2050 !TSM:FPAR:NO REPLY
2052 TSM:FPAR
2055 ?TSF:MSG:SEND,2-2-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
4062 !TSM:FPAR:NO REPLY
4064 TSM:FPAR
4067 ?TSF:MSG:SEND,2-2-255-255,s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=OK:
4246 TSF:MSG:READ,0-0-2,s=255,c=3,t=8,pt=1,l=1,sg=0:0
4251 TSF:MSG:FPAR OK,ID=0,D=1
6074 TSM:FPAR:OK
6075 TSM:ID
6076 TSM:ID:OK
6078 TSM:UPL
6082 TSF:MSG:SEND,2-2-0-0,s=255,c=3,t=24,pt=1,l=1,sg=0,ft=0,st=OK:1
6133 TSF:MSG:READ,0-0-2,s=255,c=3,t=25,pt=1,l=1,sg=0:1
6138 TSF:MSG:PONG RECV,HP=1
6140 TSM:UPL:OK
6142 TSM:READY:ID=2,PAR=0,DIS=1
6149 TSF:MSG:SEND,2-2-0-0,s=255,c=3,t=15,pt=6,l=2,sg=0,ft=0,st=OK:0100
6204 TSF:MSG:READ,0-0-2,s=255,c=3,t=15,pt=6,l=2,sg=0:0100
6212 TSF:MSG:SEND,2-2-0-0,s=255,c=0,t=17,pt=0,l=5,sg=0,ft=0,st=OK:2.3.2
6221 TSF:MSG:SEND,2-2-0-0,s=255,c=3,t=6,pt=1,l=1,sg=0,ft=0,st=OK:0
8229 TSF:MSG:SEND,2-2-0-0,s=255,c=3,t=11,pt=0,l=18,sg=0,ft=0,st=OK:LightMaxMeasSensor
8244 TSF:MSG:SEND,2-2-0-0,s=255,c=3,t=12,pt=0,l=3,sg=0,ft=0,st=OK:1.0
8251 TSF:MSG:SEND,2-2-0-0,s=2,c=0,t=16,pt=0,l=0,sg=0,ft=0,st=OK:
8257 MCO:REG:REQ
8264 TSF:MSG:SEND,2-2-0-0,s=255,c=3,t=26,pt=1,l=1,sg=0,ft=0,st=OK:2
8460 TSF:MSG:READ,0-0-2,s=255,c=3,t=27,pt=1,l=1,sg=0:1
8465 MCO:PIM:NODE REG=1
8467 MCO:BGN:STP
8469 MCO:BGN:INIT OK,TSP=1
175
8474 TSF:MSG:SEND,2-2-0-0,s=2,c=1,t=23,pt=3,l=2,sg=0,ft=0,st=OK:175
1008
Battery Voltage: 3.39 V
Battery percent: 100 %
8483 TSF:MSG:SEND,2-2-0-0,s=255,c=3,t=0,pt=1,l=1,sg=0,ft=0,st=OK:100
8492 MCO:SLP:MS=3000,SMS=0,I1=255,M1=255,I2=255,M2=255
8497 TSF:TDI:TSL
8498 MCO:SLP:WUP=-1
8500 TSF:TRI:TSB
174
8510 TSF:MSG:SEND,2-2-0-0,s=2,c=1,t=23,pt=3,l=2,sg=0,ft=0,st=OK:174
1017
Battery Voltage: 3.42 V
Battery percent: 101 %
8519 TSF:MSG:SEND,2-2-0-0,s=255,c=3,t=0,pt=1,l=1,sg=0,ft=0,st=OK:101
8527 MCO:SLP:MS=3000,SMS=0,I1=255,M1=255,I2=255,M2=255
8532 TSF:TDI:TSL
8535 MCO:SLP:WUP=-1
8536 TSF:TRI:TSB
174
1023
Battery Voltage: 3.44 V
Battery percent: 102 %
8550 TSF:MSG:SEND,2-2-0-0,s=255,c=3,t=0,pt=1,l=1,sg=0,ft=0,st=OK:102
8556 MCO:SLP:MS=3000,SMS=0,I1=255,M1=255,I2=255,M2=255
8561 TSF:TDI:TSL
8562 MCO:SLP:WUP=-1
8564 TSF:TRI:TSB
173


Das MQTT2-Device (0-18 ist das Gateway) :

defmod MQTT2_MYSENSORS_MAX44009 MQTT2_DEVICE mysensors_MAX44009
attr MQTT2_MYSENSORS_MAX44009 IODev MQTT2_Server
attr MQTT2_MYSENSORS_MAX44009 readingList mygateway1-out/0/255/0/0/18:.* 0_18\
mygateway1-out/2/255/0/0/17:.* MYSENSORS_VERSION\
mygateway1-out/2/255/3/0/6:.* 0_6\
mygateway1-out/2/255/3/0/11:.* SKETCH_NAME\
mygateway1-out/2/255/3/0/12:.* SKETCH_VERSION\
mygateway1-out/2/2/0/0/16:.* 0_16\
mygateway1-out/2/2/1/0/23:.* brightness
attr MQTT2_MYSENSORS_MAX44009 room MQTT2_DEVICE
attr MQTT2_MYSENSORS_MAX44009 stateFormat brightness lux

setstate MQTT2_MYSENSORS_MAX44009 120 lux
setstate MQTT2_MYSENSORS_MAX44009 2020-05-11 20:34:26 0_11 Temperature Sensor // Test
setstate MQTT2_MYSENSORS_MAX44009 2020-05-11 20:34:26 0_12 1.2 // Test
setstate MQTT2_MYSENSORS_MAX44009 2020-05-12 16:06:26 0_16 // Test
setstate MQTT2_MYSENSORS_MAX44009 2020-05-12 15:14:02 0_17 2.3.2 // Test
setstate MQTT2_MYSENSORS_MAX44009 2020-05-12 11:30:34 0_18 2.3.2
setstate MQTT2_MYSENSORS_MAX44009 2020-05-11 16:07:45 0_3
setstate MQTT2_MYSENSORS_MAX44009 2020-05-12 16:06:22 0_6 0
setstate MQTT2_MYSENSORS_MAX44009 2020-05-12 16:06:21 MYSENSORS_VERSION 2.3.2
setstate MQTT2_MYSENSORS_MAX44009 2020-05-12 16:06:25 SKETCH_NAME LightMaxMeasSensor
setstate MQTT2_MYSENSORS_MAX44009 2020-05-12 16:06:26 SKETCH_VERSION 1.0
setstate MQTT2_MYSENSORS_MAX44009 2020-05-12 16:18:51 brightness 120



Die Frage ist jetzt wie das Batterie-Level genau übertragen werden muss, das es im MQTT2-DEVICE ankommt ?

ZitatIf your node is running on batteries and you've implemented battery level measurements you can send the battery level back to the controller.

bool sendBatteryLevel(uint8_t level, bool echo);

Hab ich gemacht, ich weiß die Ausgaben im Monitor aber nicht genau zu deuten, hiermit

Zitat8535 MCO:SLP:WUP=-1
8536 TSF:TRI:TSB
174
1023

Battery Voltage: 3.44 V
Battery percent: 102 %

denk ich wird der Wert schon an den Controller übertragen, weil die 174 kommen ja im Device an, aber die 1023 nicht und wenn überhaupt dann doch unter dem gleichen topic wie der Helligkeitswert ?

An dem Punkt weiß ich jetzt nicht weiter, wäre nett wenn mir da einer weiterhelfen könnte und auch mal über die Anpassungen an den MAX44009 Sensor drüberschaut ob das wirklich so passt.

Gruß

Thomas


Beta-User

Hmm, also MQTT... (Das ist auch in interessantes Feld, auch wenn ich für MySensors@FHEM nie auf den Gedanken gekommen wäre, das über diesen Weg zu machen, dazu sind die "originären Module" m.E. "zu gut" :P ).

Vorab und leicht OT: Du könntest eventuell mal versuchen, eine passende bridgeRegexp zu basteln: Die dann auf das GW angewendet, sollte den online-Status des ESP wiedergeben und den Rest anhand der Node-ID sortieren.

Was damit nicht geht: Automatische Vergabe der Node-ID. Hast du ja auch ganz brav manuell gemacht (für die, die das nachbauen wollen)...

Wie die Handhabung der internen Messages (battery ist intern!) bei MQTT ist, kann ich nicht so richtig verorten, aber auch das scheint ja in den meisten Fällen unter "255" ausgespuckt zu werden; hier könnte höchstens das Problem sein, dass 102 (als ungültig?) im GW verworfen wird. Vielleicht mal testweise einen harten Wert reinschreiben oder ein "min" verwenden?

Ansonsten wundert mich die Verwunderung darüber, dass das kaum Strom braucht. Was hattest du erwartet...?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

Du magst es nicht glauben aber was  die bridgeRegexp angeht ist es genauso wie mit der Verwunderung darüber das kein Strom verbraucht wird, überlese ich i.d.R gekonnt (im Falle MySensors dummerweise: seit Jahren  ;D) und bisher noch nie mit beschäftigt und mir war auch klar das dieser Vorschlag nicht ausbleiben wird.
Eine bridgeRegexp ist auch das kleinste Problem denk ich, hab andere Probleme  ;D, mich beschäftigt seit 2 Tagen das ich keinen dummen DS18B20 zum laufen bekomme, nicht mal mit einem stinknormalen anderen Sketch, egal mit welcher library.


Ich bin noch nicht weit in dem Thema drin, online-status mein ich gibts erst wenn man heartbeat einbaut.

Was die Handhabung der Messages angeht: schätze man muss MyMessage verwenden (vlt. mit S_CUSTOM ?), mir ist nur die Syntax noch nicht klar, muss ich noch mehr zu lesen





Beta-User

Kurz.. Könnte auch das Thema "capacitor" sein. Dreh mal die Sendereihenfolge um.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

Komm ich nicht mit, Kondensator ? Welche Sendereihenfolge genau ?

Den 0,1uF hab ich auf dem Steckbrett nicht drin, hab ich nur in SMD, dabei gehts doch aber nur um Störungen ?

Beta-User

Nicht nur. Geht auch um power für zwei Sendungen. Ein wait könnte auch helfen.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

wenn das wait hier gemeint war (immer noch ohne Kondensator)

sleep(SLEEP_TIME);
  wait(200);


dann keine Änderung.

Es bringt mir auch nichts auf dem Gateway zu schauen was dort ankommt, oder ? Was auf dem Gateway ankommt, sieht auch MQTT2_Server ?

Ich bleib ja immer noch bei meiner Vermutung mit MyMessage.

Beta-User

Also nochmal die Langform:

Senden kostet Energie. Du hast in deinem 2. Sketch zwei Messages drin, die versendet werden, nämlich den Lichtlevel und den Batterie-Level. Das erste ist eine "normale" Message, das andere eine "interne", daher sieht der Sendebefehl anders aus (den Basiscode dazu hattest du ja irgendwo rauskopiert, den Teil habe ich nicht näher geprüft, ist aber z.B. bei heartbeat genauso; was mir aber komisch vorkommt ist der "bool"-Teil in presentation(). Bitte ggf. mal die REferenz raussuchen, wo das her ist (ich verwende keine Batterie-Geräte) und habe damit daher keine Erfahrungen, außer dass es vom Hörensagen her klar ist, dass es geht).

Wenn du den Kondensator bei der ersten Message "leersaugst", ist die Sendeleistung dann ggf. für die zweite zu gering (aus dem ersten Post war zu sehen, dass auch da schon Messages verloren gegangen waren, die Verbindung ist also an sich schon grenzwertig).

Ergo kannst du entweder die beiden Senderoutinen tauschen (dann kommt evtl. nur noch der Batteriewert), oder eben ein wait() einfügen - zwischen den Sendungen. Z.B. so:

/**
* connect the sensor as follows :
*
*   VCC  >>> 5V
*   Gnd  >>> Gnd
*   ADDR >>> NC or GND
*   SCL  >>> A5
*   SDA  >>> A4

*/


// Enable debug prints to serial monitor
#define MY_DEBUG

// Enable and select radio type attached
#define MY_RADIO_RF24
//#define MY_RADIO_RFM69
#define MY_NODE_ID 2
#include <MySensors.h>
#include <MAX44009.h>
#include <Wire.h>

#define CHILD_ID_LIGHT 2
unsigned long SLEEP_TIME = 3000; // Sleep time between reads (in milliseconds)

MAX44009 light;

// V_LIGHT_LEVEL should only be used for uncalibrated light level 0-100%.
// If your controller supports the new V_LEVEL variable, use this instead for
// transmitting LUX light level.
MyMessage msglight(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
// MyMessage msg(CHILD_ID_LIGHT, V_LEVEL);
uint16_t lastlux;

// Battery Measuring
int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
// uint32_t SLEEP_TIME = 900000;  // sleep time between reads (seconds * 1000 milliseconds)
int oldBatteryPcnt = 0;

void setup()
{
  light.begin();
  // Battery Measuring use the 1.1 V internal reference
#if defined(__AVR_ATmega2560__)
  analogReference(INTERNAL1V1);
#else
  analogReference(INTERNAL);
#endif
}

void presentation()  {
  // Send the sketch version information to the gateway and Controller
  sendSketchInfo("LightMaxMeasSensor", "1.0");

  // Register all sensors to gateway (they will be created as child devices)
  present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);

  bool sendBatteryLevel(uint8_t level, bool echo);
}

void loop()     
{     
  uint16_t lux = light.get_lux();// Get Lux value
  Serial.println(lux);
  if (lux != lastlux) {
      send(msglight.set(lux));
      lastlux = lux;
  }
// Battery Measuring get the battery Voltage
  int sensorValue = analogRead(BATTERY_SENSE_PIN);
#ifdef MY_DEBUG
  Serial.println(sensorValue);
#endif

  // 1M, 470K divider across battery and using internal ADC ref of 1.1V
  // Sense point is bypassed with 0.1 uF cap to reduce noise at that point
  // ((1e6+470e3)/470e3)*1.1 = Vmax = 3.44 Volts
  // 3.44/1023 = Volts per bit = 0.003363075

  int batteryPcnt = sensorValue / 10;

#ifdef MY_DEBUG
  float batteryV  = sensorValue * 0.003363075;
  Serial.print("Battery Voltage: ");
  Serial.print(batteryV);
  Serial.println(" V");

  Serial.print("Battery percent: ");
  Serial.print(batteryPcnt);
  Serial.println(" %");
#endif

  if (oldBatteryPcnt != batteryPcnt) {
    // Power up radio after sleep
    wait(250);
    sendBatteryLevel(batteryPcnt);
    oldBatteryPcnt = batteryPcnt;
  }
  sleep(SLEEP_TIME);
}


In jedem Fall bitte erst mal GW und Node relativ nahe beieinander lassen.

Die internen Messages scheinen auch etwas weniger "abgesichert" zu werden, was das Versenden (bzw. den bestätigten Empfang) angeht, das ist eher ein anonymer Broadcast.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

Arg >:( :'( ;D, sry "noise" um nix.

Wenn ich die DEF der beiden MQTT2_DEVICEs ändere ist doch klar das alle späteren neuen topics wieder in einem neuen Gerät landen, mit der alten CID  ::).

Das mit dem bool Teil hab ich wohl einfach nicht richtig gelesen und zusätzlich noch ein Mix mit Presentation gemacht  ;D.
Das wait braucht man gar nicht batteryPcnt wird auch so übertragen.

heartbeat hab ich jetzt einfach mal in loop rein, jetzt bekomm ich in dem Reading eine aufsteigende Zeit die wieder von vorne beginnt sollte die Node die Verbindung zum Gateway verloren haben, ist das so korrekt ?

So sieht jetzt der Sketch aus:

// Enable debug prints to serial monitor
#define MY_DEBUG

// Enable and select radio type attached
#define MY_RADIO_RF24
//#define MY_RADIO_RFM69
#define MY_NODE_ID 2
#include <MySensors.h> 
#include <MAX44009.h>
#include <Wire.h>

#define CHILD_ID_LIGHT 2
unsigned long SLEEP_TIME = 3000; // Sleep time between reads (in milliseconds)
MAX44009 light;

MyMessage msglight(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
uint16_t lastlux;

// Battery Measuring
int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
// uint32_t SLEEP_TIME = 900000;  // sleep time between reads (seconds * 1000 milliseconds)
int oldBatteryPcnt = 0;

void setup() 
{
  light.begin();
  // Battery Measuring use the 1.1 V internal reference
#if defined(__AVR_ATmega2560__)
  analogReference(INTERNAL1V1);
#else
  analogReference(INTERNAL);
#endif
}

void presentation()  {
 
  sendSketchInfo("LightMaxMeasSensor", "1.0");
  present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);
 
}

void loop()     
{     
  uint16_t lux = light.get_lux();// Get Lux value
  Serial.println(lux);
  if (lux != lastlux) {
      send(msglight.set(lux));
      lastlux = lux;
  }

  int sensorValue = analogRead(BATTERY_SENSE_PIN);
  int batteryPcnt = sensorValue / 10;
 
#ifdef MY_DEBUG
  Serial.println(sensorValue);
  float batteryV  = sensorValue * 0.003363075;
  Serial.print("Battery Voltage: ");
  Serial.print(batteryV);
  Serial.println(" V");
  Serial.print("Battery percent: ");
  Serial.print(batteryPcnt);
  Serial.println(" %"); 
#endif

  if (oldBatteryPcnt != batteryPcnt) {
    // Power up radio after sleep
    sendBatteryLevel(batteryPcnt);
    oldBatteryPcnt = batteryPcnt;
  }
  sendHeartbeat();
  sleep(SLEEP_TIME);
}


defmod MQTT2_MYSENSORS_MAX44009 MQTT2_DEVICE mysensors_MAX44009
attr MQTT2_MYSENSORS_MAX44009 IODev MQTT2_Server
attr MQTT2_MYSENSORS_MAX44009 readingList mygateway1-out/0/255/0/0/18:.* MYSENSORS_GW_VERSION\
mygateway1-out/2/255/0/0/17:.* MYSENSORS_VERSION\
mygateway1-out/2/255/3/0/6:.* 0_6\
mygateway1-out/2/255/3/0/11:.* SKETCH_NAME\
mygateway1-out/2/255/3/0/12:.* SKETCH_VERSION\
mygateway1-out/2/2/0/0/16:.* 0_16\
mygateway1-out/2/2/1/0/23:.* brightness\
mygateway1-out/2/255/3/0/0:.* battery\
mygateway1-out/2/255/3/0/22:.* heartbeat
attr MQTT2_MYSENSORS_MAX44009 room MQTT2_DEVICE
attr MQTT2_MYSENSORS_MAX44009 stateFormat Helligkeit: brightness lux<br>Batterie: battery %

setstate MQTT2_MYSENSORS_MAX44009 Helligkeit: 100 lux<br>Batterie: 101 %
setstate MQTT2_MYSENSORS_MAX44009 2020-05-13 14:44:38 0_16
setstate MQTT2_MYSENSORS_MAX44009 2020-05-13 14:44:36 0_6 0
setstate MQTT2_MYSENSORS_MAX44009 2020-05-13 14:36:45 MYSENSORS_GW_VERSION 2.3.2
setstate MQTT2_MYSENSORS_MAX44009 2020-05-13 14:44:36 MYSENSORS_VERSION 2.3.2
setstate MQTT2_MYSENSORS_MAX44009 2020-05-13 14:44:38 SKETCH_NAME LightMaxMeasSensor
setstate MQTT2_MYSENSORS_MAX44009 2020-05-13 14:44:38 SKETCH_VERSION 1.0
setstate MQTT2_MYSENSORS_MAX44009 2020-05-13 14:49:22 battery 101
setstate MQTT2_MYSENSORS_MAX44009 2020-05-13 14:49:25 brightness 100
setstate MQTT2_MYSENSORS_MAX44009 2020-05-13 14:49:25 heartbeat 2644


Das mit der bridgeRegexp seh ich ja ein, beschäftige mich damit. ...irgendwann...

Trotzdem Danke für die Erläuterungen.

Beta-User

 ;D nevermind...

Mir ging es eher darum abzusichern, dass niemand einen (berechtigten) Grund findet, meine grundsätzliche Aussage in Zweifel zu ziehen, dass MySensors "an sich" einfach ist ::) . (Dass man natürlich trotzdem über viele Details stolpern kann, ist klar, vor allem, wenn man "neue Wege" (im FHEM-Kontext) geht... Was MQTT angeht: kannst gerne den Weg weiter gehen, mußt dich aber eben ziemlich alleine durchkämpfen.)

Das mit der payload von heartbeat ist  interessant, ich habe bisher nur ausgewertet, DASS etwas (zurück-) kommt, mich aber nie dafür interessiert, WAS. Müßte mal im Quellcode nachsehen, würde aber eher vermuten, dass das die uptime in Sekunden ist (hmm, nee, kann eigentlich auch nicht, das Ding schläft ja). Hmm, ein andermal ::) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

Zitatdass MySensors "an sich" einfach ist ::)

dann will ich den Usern die sich beim mitlesen mglw. infizieren haben lassen (und einfach mal machen) keine Steine in die Wege legen und erwähnen das ich diese
libraries für die o.a. Sketche nutze, die für den MAX44009 i.A., Arduino IDE ist die 1.8.12, in der IDE kann man mit dem Bibliothekenassistenten die MySensors-Bibliotheken hinzufügen oder als zip, dann hier runterladen.

Beta-User

Yep, auch die Einbindung in der Arduino IDE ist ein Kinderspielchen (oder in Atom).

Ich persönlich bin u.a. auch an der Stelle "Beta-User" und nehme grundsätzlich immer die Entwicklerversion, was etwas "schwieriger" ist (ich mache das meistens mit einem git-checkout). Habe schon ein paar Versionen durch, und afaik gab es nur ein einziges Mal eine regression (das war mit den nRF24-libs, was mich da zugegebenermaßen aber wohl schon nicht mehr betroffen hatte).

Mal schauen, vielleicht installiere ich zum Rumspielen auch bei Gelegenheit mal den zu mergenden Fork für PJON von tekka007. Der dürfte "fully functional" sein, und man braucht nicht mehr als zwei Arduinos... (Falls jemand grade die Lücke bis zur Wiedereröffnung der Stammkneipe ausnützen will und den fehlenden Transceiver als Ausrede ansieht... Es sollte übrigens für Testzwecke auch gehen, das "normale RS485" zu nehmen und zwei Arduinos einfach über Kreuz (RX/TX) zu verbinden.).

Have fun!
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

[OT]
Bin ja selbst Schuld wenn ich bisher den MQTT2_Server nur mit einem unsicheren, vierstelligen Passwort abgesichert hatte (war ich "gezwungen" zu ändern wegen der neuesten Tasmota-Version (MQTT minimum password length restriction in GUI)), trotzdem ist es Mist, das man User/Passwort nur im Sketch eingeben tut und es kein UI zum einstellen gibt  ::)

[OT]