Integration von MySensors in FHEM geplant?

Begonnen von fh555, 06 September 2014, 00:40:58

Vorheriges Thema - Nächstes Thema

Spezialtrick

Bei mir steht

boolean metric = true;

im Sketch. Habe gestern auch mal versucht den DallasTemperatureSensor Sketch mit dem Battery Sketch zu verbinden. Beim Kompilieren bekomme ich auch keine Fehler. Im Serial Monitor wird auch die Batteriespannung ausgegeben, aber leider kommt in FHEM nicht davon an.

sensor started, id 0
send: 0-0-0-0 s=255,c=0,t=17,pt=0,l=5,st=ok:1.4.1
send: 0-0-0-0 s=255,c=3,t=6,pt=1,l=1,st=ok:0
send: 0-0-0-0 s=255,c=3,t=11,pt=0,l=18,st=ok:Temperature Sensor
send: 0-0-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0
send: 0-0-0-0 s=255,c=3,t=11,pt=0,l=13,st=ok:Battery Meter
send: 0-0-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0
send: 0-0-0-0 s=0,c=0,t=6,pt=0,l=5,st=ok:1.4.1
send: 0-0-0-0 s=0,c=1,t=0,pt=7,l=5,st=ok:84.4
1023
Battery Voltage: 3.44 V
Battery percent: 102 %
send: 0-0-0-0 s=255,c=3,t=0,pt=1,l=1,st=ok:102


Habe ich möglicherweise doch eine Fehler im Sketch:

// Example sketch showing how to send in OneWire temperature readings
#include <MySensor.h> 
#include <SPI.h>
#include <DallasTemperature.h>
#include <OneWire.h>

#define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected
#define MAX_ATTACHED_DS18B20 16


unsigned long SLEEP_TIME = 300000; // Sleep time between reads (in milliseconds)
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
MySensor gw;
float lastTemperature[MAX_ATTACHED_DS18B20];
int numSensors=0;
int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point
int oldBatteryPcnt = 0;
boolean receivedConfig = false;
boolean metric = true;
// Initialize temperature message
MyMessage msg(0,V_TEMP);

void setup() 
{
  // Startup OneWire
  sensors.begin();
 
  // use the 1.1 V internal reference
  analogReference(INTERNAL);

  // Startup and initialize MySensors library. Set callback for incoming messages.
  gw.begin();

  // Send the sketch version information to the gateway and Controller
  gw.sendSketchInfo("Temperature Sensor", "1.0");
  gw.sendSketchInfo("Battery Meter", "1.0");

  // Fetch the number of attached temperature sensors 
  numSensors = sensors.getDeviceCount();

  // Present all sensors to controller
  for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
     gw.present(i, S_TEMP);
  }
}


void loop()     
{     
  // Process incoming messages (like config from server)
  gw.process();

  // Fetch temperatures from Dallas sensors
  sensors.requestTemperatures();

  // Read temperatures and send them to controller
  for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {

    // Fetch and round temperature to one decimal
    float temperature = static_cast<float>(static_cast<int>((gw.getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;

    // Only send data if temperature has changed and no error
    if (lastTemperature[i] != temperature && temperature != -127.00) {

      // Send in the new temperature
      gw.send(msg.setSensor(i).set(temperature,1));
      lastTemperature[i]=temperature;
    }
  }
  {
   // get the battery Voltage
   int sensorValue = analogRead(BATTERY_SENSE_PIN);
   Serial.println(sensorValue);
   
   // 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
   float batteryV  = sensorValue * 0.003363075;
   int batteryPcnt = sensorValue / 10;

   Serial.print("Battery Voltage: ");
   Serial.print(batteryV);
   Serial.println(" V");

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

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


FHEM - Debmatic - Zigbee2MQTT - Homekit

Porky666

Was steht in deinem Sketch?

boolean metric = true
oder
boolean metric = false



Gruß
Stefan
ODROID U3 1GB Ubuntu immer aktuell
FHEM immer das aktuellste Development
Defined modules:

COC; CULv3; HMLAN :HM-CC-SCD,HM-CC-TC,HM-LC-SW4-PCB,HM-LC-Sw1PBU-FM,HM-OU-LED16,HM-SCI-3-FM,HM-SEC-SC,HM-SEC-WIN,HM-WDS10-TH-O; ESA2000; FS20; HUEBridge; Huedevices; IT; JeeLink :PCA301 :panstamp:

Spezialtrick

Bei mir steht

boolean metric = true;

im Sketch.

Wie oben beschrieben. :D
FHEM - Debmatic - Zigbee2MQTT - Homekit

wmr72

#333

  gw.sendSketchInfo("Temperature Sensor", "1.0");
  gw.sendSketchInfo("Battery Meter", "1.0");

Das sieht für mich doppelt aus, keine Ahnung ob deswegen was durcheinander kommt.

Außerdem nutzt Du beim Sensor auslesen nicht Deinen boolean sondern:

float temperature = static_cast<float>(static_cast<int>((gw.getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;


Das erklärt zumindest die Fahrenheit-Werte. Das sollte wohl eher so heißen:

float temperature = static_cast<float>(static_cast<int>((metric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;

Spezialtrick

#334
Vielen Dank! Nun zeigt der Sensor mir die Temperaturwerte in Celsius an.

Die eine Zeile habe ich aus dem Sketch gelöscht. Dies bringt jedoch keine Besserung.

Möglicherweise liegt es daran dass FHEM die Reading nicht konkret zu ordnen kann. Im Log kann ich diese nämlich sehen.

Muss man die Batteriewerte dem Sensor manuell zu teilen oder geschieht dies automatisch?

FHEM - Debmatic - Zigbee2MQTT - Homekit

hexenmeister

Die Batteriewerte musst Du natürlich manuell senden. SketchInfo brauchst Du dafür nicht.
gw.sendBatteryLevel(batteryPcnt); sollte reichen. Dabei wird Message I_BATTERY_LEVEL als C_INTERNAL gesendet. Habe leider keinen Batteriesensor uns kann gerade keinen aufbauen/emulieren.

Kannst Du etwa in Log sehen? Da sollte beim Empfang solcher Meldungen folgendes ausgeführt werden:
Log3 ($name,4,"MYSENSORS_DEVICE $name: batterylevel $msg->{payload}");

Spezialtrick

#336
Die Batteriewerte werden von meinem Sketch gesendet. Ich übertrage zusätzlich auch die Spannung:

gw.sendBatteryLevel(batteryPcnt);
     gw.sendBatteryLevel(batteryV);


Folgendes wird von FHEM empfangen:

2015.03.18 19:34:47 5: MYSENSORS Read: Rx: fr=000 ci=000 c=003(C_INTERNAL    ) st=009(I_LOG_MESSAGE   ) ack=0 'read: 0-0-0 s=0,c=1,t=0,pt=7,l=5:22.4'

2015.03.18 19:34:47 5: MYSENSORS gateway MySensors: read: 0-0-0 s=0,c=1,t=0,pt=7,l=5:22.4
2015.03.18 19:34:47 5: MYSENSORS Read: Rx: fr=000 ci=000 c=001(C_SET         ) st=000(V_TEMP          ) ack=0 '22.4'

2015.03.18 19:34:47 5: MYSENSORS/RAW: /0;0;3;0;9;read: 0-0-0 s=255,c=3,t=0,pt=1,l=1:102
0;0;3;0;9;read: 0-0-0 s=255,c=3,t=0,pt=1,l=1:3

2015.03.18 19:34:47 5: MYSENSORS Read: Rx: fr=000 ci=000 c=003(C_INTERNAL    ) st=009(I_LOG_MESSAGE   ) ack=0 'read: 0-0-0 s=255,c=3,t=0,pt=1,l=1:102'

2015.03.18 19:34:47 5: MYSENSORS gateway MySensors: read: 0-0-0 s=255,c=3,t=0,pt=1,l=1:102
2015.03.18 19:34:47 5: MYSENSORS Read: Rx: fr=000 ci=000 c=003(C_INTERNAL    ) st=009(I_LOG_MESSAGE   ) ack=0 'read: 0-0-0 s=255,c=3,t=0,pt=1,l=1:3'

2015.03.18 19:34:47 5: MYSENSORS gateway MySensors: read: 0-0-0 s=255,c=3,t=0,pt=1,l=1:3


Soweit ich das nachvollziehen kann, empfängt Fhem doch hier die Temperatur von 22.4 °C, den Batteriestand von 102% und auch die Batteriespannung von 3V. Automatisch angelegt wird jedoch nur das Temperatur Reading. Habe die Sensor auch schon öfters gelöscht und neu hinzugefügt. Es bleibt aber ausschließlich beim Temperatur Reading.

Edit: So ganz stimmt die Spannung jedoch nicht. Laut Messgerät sind es nur 2,92 V.
FHEM - Debmatic - Zigbee2MQTT - Homekit

hexenmeister

Zwei mal verschiedene Werte mit der Methode sendBatteryLevel zu senden macht keinen Sinn. ABer daran wird es wohl nicht liegen. Deine Meldung kommt irgendwie mit dem Typ I_LOG_MESSAGE (9) statt I_BATTERY_LEVEL (0). Habe leider keine Ahnung, warum das passiert.

fh555

Hi hexenmeister, mal eine andere Frage zu MySensors :-)

Habt ihr das Modul jetzt auch über die Update-Funktion von FHEM eingecheckt?
Der Probelauf ist doch positiv verlaufen :-)

Gruß Jens

hexenmeister

Norbert hat das Modul schon lange in die FHEM-Repository eingecheckt.

Spezialtrick

Zitat von: hexenmeister am 18 März 2015, 20:30:12
Zwei mal verschiedene Werte mit der Methode sendBatteryLevel zu senden macht keinen Sinn. ABer daran wird es wohl nicht liegen. Deine Meldung kommt irgendwie mit dem Typ I_LOG_MESSAGE (9) statt I_BATTERY_LEVEL (0). Habe leider keine Ahnung, warum das passiert.

Dann werde ich einen Wert wieder löschen. Du liegst damit richtig, dass sich nichts ändert. Stefan hatte vor längerer Zeit nachfolgenden Sketch gepost:

Zitat von: Porky666 am 29 Oktober 2014, 16:08:04
Hallo Zusammen,

da ich die Mysensor Nodes mit Batterie betreibe, habe ich natürlich auch ein Bedarf ein Reading oder 2 mit dem Batterielevel empfangen zu können.
Nun auf [url]http://mysensors.org/build/battery[url] gibt es den Hinweis mit einem einfachen Spannungsteiler über einen Analogen Eingang (A0) die Spannung zu überwachen.
Ich habe das dort verlinkte Batterysensor.ino von Github mal mit dem Humiditysensor.ino gemergt -- aufgespielt und getestet.
Funktioniert mit deinem im FHEM ankommenden Reading Batterylevel als % Angabe. Das kann man auch varirieren mit Battery in Volt oder beides. Vielleicht passts Euch ja.

#include <SPI.h>
#include <MySensor.h> 
#include <DHT.h> 

#define CHILD_ID_HUM 0
#define CHILD_ID_TEMP 1
int BATTERY_SENSE_PIN = A0;
#define HUMIDITY_SENSOR_DIGITAL_PIN 3
unsigned long SLEEP_TIME = 900000; // Sleep time between reads (in milliseconds)
int oldBatteryPcnt = 0;
MySensor gw;
DHT dht;
float lastTemp;
float lastHum;
boolean metric = true;
MyMessage msgHum(CHILD_ID_HUM, V_HUM);
MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);


void setup() 
{
  analogReference(INTERNAL);
  gw.begin();
  dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN);

  // Send the Sketch Version Information to the Gateway
  gw.sendSketchInfo("Humidity", "1.0");

  // Register all sensors to gw (they will be created as child devices)
  gw.present(CHILD_ID_HUM, S_HUM);
  gw.present(CHILD_ID_TEMP, S_TEMP);
 
  metric = gw.getConfig().isMetric;
}

void loop()     

  delay(dht.getMinimumSamplingPeriod());

  float temperature = dht.getTemperature();
  if (isnan(temperature)) {
      Serial.println("Failed reading temperature from DHT");
  } else if (temperature != lastTemp) {
    lastTemp = temperature;
    if (!metric) {
      temperature = dht.toFahrenheit(temperature);
    }
    gw.send(msgTemp.set(temperature, 1));
    Serial.print("T: ");
    Serial.println(temperature);
  }
 
  float humidity = dht.getHumidity();
  if (isnan(humidity)) {
      Serial.println("Failed reading humidity from DHT");
  } else if (humidity != lastHum) {
      lastHum = humidity;
      gw.send(msgHum.set(humidity, 1));
      Serial.print("H: ");
      Serial.println(humidity);
  }
  {
     
   // get the battery Voltage
   int sensorValue = analogRead(BATTERY_SENSE_PIN);
   Serial.println(sensorValue);
   
   // 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
   float batteryV  = sensorValue * 0.003363075;
   int batteryPcnt = sensorValue / 10;

   Serial.print("Battery Voltage: ");
   Serial.print(batteryV);
   Serial.println(" V");

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

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

  gw.sleep(SLEEP_TIME); //sleep a bit
  }}



Gruß
Stefan und Danke für die Prima Arbeit an dem Modul !

Funktioniert dieser Sketch noch bei dir, Stefan?

Bei mir klappt es auch mit diesem Sketch nicht. Alles wird angelegt, nur das Batterie Reading nicht. Allerdings finden sich wieder exakt die gleichen Meldungen im Log:


2015.03.18 22:08:03 5: MYSENSORS Read: Rx: fr=000 ci=000 c=003(C_INTERNAL    ) st=009(I_LOG_MESSAGE   ) ack=0 'read: 0-0-0 s=255,c=3,t=0,pt=1,l=1:102'

2015.03.18 22:08:03 5: MYSENSORS gateway MySensors: read: 0-0-0 s=255,c=3,t=0,pt=1,l=1:102


Hat sich möglicherweise irgendwas an den Modulen geändert? Es wird wohl kaum an dem Arduino Nano liegen den ich zum Testen nutze, oder?
FHEM - Debmatic - Zigbee2MQTT - Homekit

hexenmeister

Wie gesagt, ich verstehe nicht auf Anhieb, was hier falsch läuft. Ich müsste mal eine Sensor und einen Gateway nachbauen und schauen, was und wo ankommt. Komme leider in der nächsten Zeit nicht dazu. Ich glaube nicht, dass der Sensor etwas falsch sendet. Schon eher wird das in GateWay nicht richtig weitergeleitet. Evtl. liegt hier ein Mißverständnis der Funktion in dem Gateway und dem FHEM-Modul.
Kannst Du mal loggen, was Gateway auf Seriel ausgibt für die Bat.-Meldungen? Also ohne an FHEM angeschlossen zu sein.
Dann sehen wir, ob die Meldungen in dem Modul (glaube ich eher nicht) oder im Gateway als LOG-Message "umdefiniert".

P.S. Auch die seriellen Ausgaben des Sensors wären interessant.

Spezialtrick

Ich hoffe, dass du mit den seriellen Ausgaben, die Ausgabe über den SerialMonitor meintest. Habe es gerade mal nacheinander getestet:

Gateway:

0;0;3;0;14;Gateway startup complete.
0;0;3;0;9;read: 0-0-0 s=255,c=0,t=17,pt=0,l=5:1.4.1
0;255;0;0;17;1.4.1
0;0;3;0;9;read: 0-0-0 s=255,c=3,t=6,pt=1,l=1:0
0;0;3;0;9;read: 0-0-0 s=255,c=3,t=11,pt=0,l=18:Temperature Sensor
0;0;3;0;9;read: 0-0-0 s=255,c=3,t=12,pt=0,l=3:1.0
0;0;3;0;9;read: 0-0-0 s=0,c=0,t=6,pt=0,l=5:1.4.1
0;0;0;0;6;1.4.1
0;0;3;0;9;read: 0-0-0 s=0,c=1,t=0,pt=7,l=5:22.3
0;0;1;0;0;22.3
0;0;3;0;9;read: 0-0-0 s=255,c=3,t=0,pt=1,l=1:102


Sensor:

sensor started, id 0
send: 0-0-0-0 s=255,c=0,t=17,pt=0,l=5,st=ok:1.4.1
send: 0-0-0-0 s=255,c=3,t=6,pt=1,l=1,st=ok:0
send: 0-0-0-0 s=255,c=3,t=11,pt=0,l=18,st=ok:Temperature Sensor
send: 0-0-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0
send: 0-0-0-0 s=0,c=0,t=6,pt=0,l=5,st=ok:1.4.1
send: 0-0-0-0 s=0,c=1,t=0,pt=7,l=5,st=ok:22.5
1023
Battery Voltage: 3.44 V
Battery percent: 102 %
send: 0-0-0-0 s=255,c=3,t=0,pt=1,l=1,st=ok:102
FHEM - Debmatic - Zigbee2MQTT - Homekit

hexenmeister

Aus meiner Sicht sind die Batterie-Meldungen in Sensor und auch in Gateway korrekt. Die Ursache liegt wahrscheinlich in dem FHEM-Modul.
Die Methode MYSENSORS::DEVICE::onInternalMessage scheint nur dann aufgerufen zu werden (in onInternalMsg), wenn die Meldung nicht an/von Gateway gesendet wird. Das ist hier jedoch genau der Fall. So zumindest beim schnellen Durchsehen.

Hier solle Norbert das Modul ansehen.
Du kannst ggf. ein Issue erstellen: https://github.com/ntruchsess/fhem-mirror/issues?q=is%3Aopen+is%3Aissue

Oder Du überträgst die Werte als normale Reading (analog Termperatur etc.)

Spezialtrick

Ok. Das würde das Problem zumindest erklären. Weißt du zufällig,ob Norbert hier noch mitliest?

Was schreibt man denn in so ein Issue rein? Habe sowas noch nie gemacht. Kannst du das ggf. machen sonst schreibe ich Norbert einfach mal eine Nachricht.

Danke für deine Hilfe!
FHEM - Debmatic - Zigbee2MQTT - Homekit