Integration von MySensors in FHEM geplant?

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

Vorheriges Thema - Nächstes Thema

Bracew

FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

ntruchsess

Zitat von: eni am 25 Oktober 2014, 21:02:54
Mir ist noch was aufgefallen bzgl. den Attribute requestAck.
Das geht bei mir in eine Endlosschleife (s.u.).

Ist mir bekannt. Bisher ist das noch sehr simpel implementiert. Wenn requestAck gesetzt ist, dann wird einfach an jedes ausgehende Packet das Requet-ack-flag gesetzt, das Packet zwischengespeichert und auf eine Acknowledge-antwort (das ist im Prinzip das selbe Packet) gewartet. Kommt nix, wird das Packet jede Sekunde (potentiell endlos) wieder transmittet. Das ist zum einen noch nicht wirklich schlau (z.B. sollten die zeitlichen Abstände immer größer werden und das Packet irgendwann verworfen werden, wärend ein Fehler-reading gesetzt wird).

Leider werden manche Packete (z.B. die Antwort auf den Config-request) systematisch nicht wie erwartet acknowledged. Diese Packet-arten dürfen dann outbound auch kein Request-ack-flag bekommen.

Wird demnächst überarbeitet.

- Norbert
while (!asleep()) {sheep++};

ntruchsess

Zitat von: hexenmeister am 25 Oktober 2014, 22:01:55
Die Readings für Temperatur und Luftfeuchte hießen entsprechend. Die für Distance und Lichtstärke waren jedoch mit ihrer ID angelegt. Durch die Änderung der Attibute war das gleich erledigt, ein wenig inkonsequent ist das aber schon.
Irgendwie ist das dämlich. Der Sketch mit dem ich teste verwendet die 1 als kleinste ChildId, daher habe teste ich auf > 1 und hänge dann die ChildId zur Sicherstellung der Eindeutigkeit an. Jetzt verwendet Dein Sketch auch die 0 :-(
Prinzipiell könnte man die Readingsnummern auch nur dann hochzählen, wenn beim Eintreffen der Presentation-messages für den entsprechenden Typ schon mapReading-attribute definiert sind. Nur haben dann potentiell nicht alle zu einer ChildId gehörigen Readings die selbe Nummer (wäre wohl auch verwirrend).

- Norbert
while (!asleep()) {sheep++};

hexenmeister

Ich habe mein Sketch zwas mittlerweile etwas umgebaut (jetzt auch noch mit einem PIR), aber die 0 habe ich nicht ausgedacht, stand schon so im Humidity-Sketch. Scheinbar gibt es hier keine Vorgaben :(

ZitatNur haben dann potentiell nicht alle zu einer ChildId gehörigen Readings die selbe Nummer (wäre wohl auch verwirrend).
Ist so verwirrend, dass ich das nicht verstanden habe. :) Ich glaube, ich muss das morgen noch mal lesen ;)

Insgesamt ist das alles noch Feintuning, grundsätzlich funktioniert alles schon sehr gut!
(OK, die Sache mit ACK-Wiederholung halte ich noch für wichtig.)


fh168

#184
Die Idee mit den drei zusätzlichen LEDs zur Statusanzeige auf dem Gateway ist schon klasse.
Die Stabiltität mit einem Uno und dem W5100 Netzwerk-Shield klappt jetzt auch, zumindest ist der jetzt 10 Stunden ohne Unterbrechungen durchgelaufen.
Wie sieht es nach einem Update oder einer Strom-/ Netzwerkunterbrechung aus?

Ein einfaches shutdown restart funktioniert nicht. Die LEDs bleiben dunkel. Beim Klick auf dem externen inclusion-Button blinkt die LED ungefähr eine Minute, genauso wenn man über Fhem manuell über set gateway inclusion-mode on setzt.

ich helfe mir derzeitig, das ich die einzelnen Sensoren (ich habe testweise mal drei zusammengeklöppelt) resette, dann fängt das LED-Farbenspiel und Geblinke vom Gateway wieder an.
Das kann aber nicht sein, wenn man 20 Sensoren später im Haus verteilt hat.

update: ich wollte gerade einen neuen Sensor anlernen, klicke in der Software auf inclusion mode

root@raspbmc:/opt/fhem# Use of uninitialized value in anonymous hash ({}) at ./FHEM/10_MYSENSORS_DEVICE.pm line 170, <$fh> line 2097.
Use of uninitialized value in anonymous hash ({}) at ./FHEM/10_MYSENSORS_DEVICE.pm line 170, <$fh> line 2097.
Use of uninitialized value in anonymous hash ({}) at ./FHEM/10_MYSENSORS_DEVICE.pm line 170, <$fh> line 2097.
Use of uninitialized value in anonymous hash ({}) at ./FHEM/10_MYSENSORS_DEVICE.pm line 170, <$fh> line 2100.
Use of uninitialized value in anonymous hash ({}) at ./FHEM/10_MYSENSORS_DEVICE.pm line 170, <$fh> line 2100.
Use of uninitialized value in anonymous hash ({}) at ./FHEM/10_MYSENSORS_DEVICE.pm line 170, <$fh> line 2100.
Use of uninitialized value in anonymous hash ({}) at ./FHEM/10_MYSENSORS_DEVICE.pm line 170, <$fh> line 2120.
Use of uninitialized value in anonymous hash ({}) at ./FHEM/10_MYSENSORS_DEVICE.pm line 170, <$fh> line 2120.
Use of uninitialized value in anonymous hash ({}) at ./FHEM/10_MYSENSORS_DEVICE.pm line 170, <$fh> line 2120.
Undefined subroutine &MYSENSORS::DEVICE::ReadingsVal called at ./FHEM/10_MYSENSORS_DEVICE.pm line 414.

Kann man eigentlich das so programmieren, das bei Temperatur / Luftfeuchtigkeitssensoren in den Readings

state  T: 12.6 H: 75   2014-10-26 19:14:51

herauskommt, damit man nur eine Zeile wegschreiben muss?


robin


Hue, Lacrosse, PCA301, MySensors, V 1.67 CUL 868 V3.4, Lacrosse-WLAN-Gateway, Tasmota RF-

Porky666

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

fh168

Hallo Stefan,

probiere ich aus.
Mir ist auch aufgefallen, das Sketch mit dem Temperatursensor (DS18B20) ziemlich stark an der Batterie nuckelt, ich glaub daran muss man noch arbeiten.

Wie sieht es bei Euren Sensoren aus?
Hier im Forum http://mysensors.org/build/binary (weiter unten) hat jemand den Sleep-Modus verbessert.

LG
/robin
Hue, Lacrosse, PCA301, MySensors, V 1.67 CUL 868 V3.4, Lacrosse-WLAN-Gateway, Tasmota RF-

fh555

Hallo alle zusammen :-)

melde mich aus meinen Urlaub zurück.
Hier hat sich ja eine ganze Menge getan. Ich bin schon feste am lesen, damit ich auf den aktuellen Stand komme  ;D

Gruß Jens

ntruchsess

melde mich auch aus dem (Kurz-)Urlaub zurück...

Zitat von: fh168 am 26 Oktober 2014, 09:01:53
Wie sieht es nach einem Update oder einer Strom-/ Netzwerkunterbrechung aus?

Ein einfaches shutdown restart funktioniert nicht.
Reconnect bei als TCP-server arbeitenden Devices ist problematisch, wenn man das Device einfach so neustartet oder ausschaltet. Das bekommt die Gegenstelle (FHEM bzw. 00_MYSENSORS.pm) nämlich gar nicht unmittelbar mit, sondern erst wenn FHEM selber Daten schicken will und die TCP-timeouts ablaufen (das dauert etliche Minuten und wenn 00_MYSENSORS.pm nichts schicken will, merkt es den Verbindungsverlust überhaupt nicht). Eventuell könnte man die I_VERSION C_INTERNAL-message als Heartbeat misbrauchen um mitzukriegen, wenn die Verbindung weg ist, bisher ist so eine Funktion jedenfalls noch nicht eingebaut.
Ein 'shutdown restart' sollte eigentlich die Verbindung neu aufbauen. Damit das zuverlässig vom Arduino erkannt wird, muss man den EthernetGateway-sketch wohl noch etwas überarbeiten - der verläßt sich nämlich zu 100% auf 'EthernetServer::available()' ohne jemals stop() an einem Client-objekt aufzurufen. Wenn da die 4 verfügbaren Sockets 'verbraucht' sind, dann war's das erst mal (bis der WIZ5100-chip die sockets selbsttätig per timeout schließt, was eben auch etwas länger dauern kann).


Zitat von: fh168 am 26 Oktober 2014, 09:01:53
update: ich wollte gerade einen neuen Sensor anlernen, klicke in der Software auf inclusion mode

root@raspbmc:/opt/fhem# Use of uninitialized value in anonymous hash ({}) at ./FHEM/10_MYSENSORS_DEVICE.pm line 170, <$fh> line 2097.
Use of uninitialized value in anonymous hash ({}) at ./FHEM/10_MYSENSORS_DEVICE.pm line 170, <$fh> line 2097.
sieht nach nicht aktualisierter FHEM/lib/Device/MySensors/Constants.pm aus. Die Dateien in 'lib' kommen leider per update (noch nicht) mit.


Zitat von: fh168 am 26 Oktober 2014, 09:01:53
Kann man eigentlich das so programmieren, das bei Temperatur / Luftfeuchtigkeitssensoren in den Readings

state  T: 12.6 H: 75   2014-10-26 19:14:51

herauskommt, damit man nur eine Zeile wegschreiben muss?
ja, kannst Du mit userReadings machen.
while (!asleep()) {sheep++};

Porky666

Hallo,
Habe mal ein Node mit 8 Relais gebastelt und eingebunden,

um nun die Relais zu schalten muss ich set Befehle senden,
Besteht die Möglichkeit dieses über webcmd zu schalten, oder muss ich dummys für jedes Relais anlegen.

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:

fh555

so ich habe mal die usb/serielle Version an den Start gebracht :-)


define MYS_GW MYSENSORS /dev/ttyUSB1@115200
attr MYS_GW stateFormat connection
attr MYS_GW verbose 5


Logfile sagt:

2014.10.31 18:15:56 3: Opening MYS_GW device /dev/ttyUSB1
2014.10.31 18:15:56 3: Setting MYS_GW baudrate to 115200
2014.10.31 18:15:56 3: MYS_GW device opened

Also alles fein  :D

Dann den 1. Sensor ins Spiel gebracht


define mys_Temperatur1 MYSENSORS_DEVICE 60
attr mys_Temperatur1 IODev MYS_GW
attr mys_Temperatur1 stateFormat V_TEMP
#attr mys_Temperatur1 subscribeReading_state MYSENSORS/60/0/V_TEMP
attr mys_Temperatur1 room MySensors-Test
attr mys_Temperatur1 verbose 5




bekomme aber keine Werte (Gegentest am MQTT Gateway alles io).

Was fehlt oder mache ich falsch?

Porky666

Hallo Jens,

ich kann dir nur von mir berichten, ein State bekomme ich auch nicht.
Hast du denn den Sensor per autocreate anlegen lassen?
Also das GW mit inclusion 1  auf autocreate gesetzt ?

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:

fh555

#192
Nein, ich habe ihn per Hand angelegt.
Bekomme aber auf der Linux Console

2014.10.31 19:13:16 5: MYSENSORS Read: Rx: fr=000 ci=000 c=003(C_INTERNAL    ) st=009(I_LOG_MESSAGE   ) ack=0 'read: 60-60-0 s=0,c=1,t=0,pt=7,l=5:25.5'

2014.10.31 19:13:16 5: MYSENSORS gateway MYS_GW: read: 60-60-0 s=0,c=1,t=0,pt=7,l=5:25.5
2014.10.31 19:13:16 5: MYSENSORS Read: Rx: fr=060 ci=000 c=001(C_SET         ) st=000(V_TEMP          ) ack=0 '25.5'

2014.10.31 19:13:16 4: MYSENSORS_DEVICE mys_Temperatur1: ignoring C_SET-message no reading-mapping for childId 0, type temperature
2014.10.31 19:13:16 5: MYSENSORS Read: Rx: fr=000 ci=000 c=003(C_INTERNAL    ) st=009(I_LOG_MESSAGE   ) ack=0 'read: 60-60-0 s=1,c=1,t=0,pt=7,l=5:25.5'

2014.10.31 19:13:16 5: MYSENSORS gateway MYS_GW: read: 60-60-0 s=1,c=1,t=0,pt=7,l=5:25.5
2014.10.31 19:13:16 5: MYSENSORS Read: Rx: fr=060 ci=001 c=001(C_SET         ) st=000(V_TEMP          ) ack=0 '25.5'

2014.10.31 19:13:16 4: MYSENSORS_DEVICE mys_Temperatur1: ignoring C_SET-message no reading-mapping for childId 1, type temperature
2014.10.31 19:14:53 5: MYSENSORS/RAW: /0;0;3
2014.10.31 19:14:53 5: MYSENSORS/RAW: 0;0;3/;0;9;read: 60-60-0 s=1,c=1,t=0,pt=7,l=5:25.4
60;1;1;0;0;25.4

2014.10.31 19:14:53 5: MYSENSORS Read: Rx: fr=000 ci=000 c=003(C_INTERNAL    ) st=009(I_LOG_MESSAGE   ) ack=0 'read: 60-60-0 s=1,c=1,t=0,pt=7,l=5:25.4'

2014.10.31 19:14:53 5: MYSENSORS gateway MYS_GW: read: 60-60-0 s=1,c=1,t=0,pt=7,l=5:25.4
2014.10.31 19:14:53 5: MYSENSORS Read: Rx: fr=060 ci=001 c=001(C_SET         ) st=000(V_TEMP          ) ack=0 '25.4'

2014.10.31 19:14:53 4: MYSENSORS_DEVICE mys_Temperatur1: ignoring C_SET-message no reading-mapping for childId 1, type temperature
2014.10.31 19:15:25 5: MYSENSORS/RAW: /0;0;3;0;9;read
2014.10.31 19:15:25 5: MYSENSORS/RAW: 0;0;3;0;9;read/: 60-60-0 s=1,c=1,t=0,pt=7,l=5:25.5
60;1;1;0;0;25.5


Inclusion Mode am Gateway (Hardwareseitig hatte ich ausgeführt) aber automatisch im FHEM ist nichts passiert.
Muss man da für das Autocreate noch etwas setzen, es wurde noch nie was bei mir automatisch angelegt obwohl in der fhem.cfg


define autocreate autocreate
attr autocreate filelog ./log/%NAME-%Y.log

steht. Ich sehe gerade (nach Raspi-Neustart) kommen die Meldungen jetzt auch im FHE;-Log rein, aber der Wert wird trotzdem nicht angezeigt (siehe log 25.4 Grad)

Ich denke das es mit der Meldung
MYSENSORS_DEVICE mys_Temperatur1: ignoring C_SET-message no reading-mapping for childId 1, type temperature
zu tun hat, das ich noch was vergessen habe.

Gruß Jens


fh555


fh168

Bei mir siehts so aus, mit Inclusion button gedrückt und dann auf Reset vom Sensor geklickt.
Die Readings haben sich selber erzeugt.

Hue, Lacrosse, PCA301, MySensors, V 1.67 CUL 868 V3.4, Lacrosse-WLAN-Gateway, Tasmota RF-