Verschiedenes > MySensors

Sketch MAX44009+Measuring

(1/3) > >>

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:


--- Code: ---// 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);
}
--- Ende Code ---

MQTT2-Device:


--- Code: ---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

--- Ende Code ---



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:

--- Code: ---/**
 * 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);
}
--- Ende Code ---

Im seriellen Monitor sehe ich:


--- Code: --- __  __       ____
|  \/  |_   _/ ___|  ___ _ __  ___  ___  _ __ ___
| |\/| | | | \___ \ / _ \ `_ \/ __|/ _ \| `__/ __|
| |  | | |_| |___| |  __/ | | \__ \  _  | |  \__ \
|_|  |_|\__, |____/ \___|_| |_|___/\___/|_|  |___/
        |___/                      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
--- Ende Code ---

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


--- Code: ---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
--- Ende Code ---


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


--- Zitat ---If 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);
--- Ende Zitat ---

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


--- Zitat ---8535 MCO:SLP:WUP=-1
8536 TSF:TRI:TSB
174
1023
Battery Voltage: 3.44 V
Battery percent: 102 %

--- Ende Zitat ---

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...?

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.

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 ?

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln