I2C Sensoren erfassen in FHEM. Aber wie?

Begonnen von Burny4600, 18 Juli 2016, 14:12:51

Vorheriges Thema - Nächstes Thema

Burny4600

Ich habe einige Sensoren die ich in FHEM gerne nutzen möchte.
Diese habe ich soweit funktionsfähig aufgebaut und werden auch mit ihren I2C Adresse angezeigt.

Zitat:~ $ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          03 -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 1e --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- 39 -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- 77

Nun besitze ich leider nicht die Fertigkeiten diese Sensoren in FHEM für meine Wetterstation einzubinden.
Bei den Sensoren handelt es sich um den:
1. BlitzdetektorFranklin AS3935 Adresse 03
2. Magnetometer HMC5883 Adresse 1e
3. LuftdruckTemperatur BMP180 Adresse 77
4. Helligkeitssensor TSL2561 Adresse 39

LuftdruckTemperatur BMP180 und Helligkeitssensor TSL2561 gibt es für FHEM schon.

Für den Sensor Magnetometer HMC5883 habe ich schon eine Tipp bekommen, was aber gänzlich daneben gegangen ist.

Hat zufälliger weise jemand schon einmal etwas mit diesen Sonsoren zu tun gehabt und könnte mir hierbei behilflich sein?

Der Sensor Magnetometer HMC5883 liese sich unter anderem bei Gaszählern verwenden wo es mit dem Reedkontakt nicht so wirklich gut funktioniert.
Mfg Chris

Raspberry Pi 2/2+/3/3+/4 / Betriebssystem: Bullseye Lite
Schnittstellen: RFXtrx433E, SIGNALduino, MQTT, nanoCUL, HM-MOD-UART, 1-Wire, LAN, ser2net, FHEM2FEHEM
Devices: S.USV, APC-USV, Fronius Datalogger Web 2, FS20, IT, Resol VBUS & DL2, TEK603, WMR200, YouLess, Homematic, MQTT

klausw

Zitat von: Burny4600 am 18 Juli 2016, 14:12:51
Nun besitze ich leider nicht die Fertigkeiten diese Sensoren in FHEM für meine Wetterstation einzubinden.

Für den Sensor Magnetometer HMC5883 habe ich schon eine Tipp bekommen, was aber gänzlich daneben gegangen ist.
Für beide IC's wurde scheinbar noch nichts entwickelt.

Die Fertigkeiten lassen sich aneignen  8)

Was ist denn daneben gegangen? Wenn es Verständnisfragen sind bekommst du hier im Forum sicher Hilfe
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

Edi77

Hallo,

Einen AS3935 ( MOD-1016 ) habe ich hier auch noch leigen, da gab es mal ein schönes Projekt in einer c't make, das Log File könnte man wie in meinem GammaScout Projekt einfach importieren.
Rein  für Arduino gibt es ein paar schöne Sachen mit dem AS3935 ist aber für den FHEM nicht zu gebrauchen.
In der Entwicklung scheint im Bereich MySensors zu sein, das man ja auch an FHEM koppeln kann.
Ich hoffe ich konnte dir weiter helfen.
Master FHEM 6 als VM auf ESX Ubuntu 20.04 LTS mit MAXCube/MAX!/FS20|TabletUI|Flightradar|Tasmota|TTN Lora|CCU3 HomematicIP|RPi mit GammaScout|MQTT EasyESP 8266|LuftdatenInfo|deCONZ HUEDev|probemon|Siemens Logo|P4D|3D PRINTER RAISE3D

thymjan

#3
Der AS3935 meldet ja per Interrupt (GPIO17) ein anliegendes Event (Blitzsignal, Disturber, zu hoher Rauschpegel) über I2C. Lässt sich sowas sinnvoll in FHEM mit einem I2C-Modul integrieren?

Datenblatt:
http://www.is-line.de/fileadmin/user_upload/is-line/sensorik/hersteller/datasheets/ams_as3935_lightming_sensor_datasheet_en.pdf

Gerade eben zog ein Gewitter durch und hat folgende Meldungen vom Python-Script generiert (Sensor per I2C am Raspberry):
pi@raspberry:/usr/local/RaspberryPi-AS3935 $ sudo ./demo.py
Waiting for lightning - or at least something that looks like it
We sensed lightning!
It was 27km away. (10:15:50 - 2016/07/31)

We sensed lightning!
It was 14km away. (11:20:33 - 2016/07/31)

Noise level too high - adjusting
We sensed lightning!
It was 10km away. (11:26:38 - 2016/07/31)

We sensed lightning!
It was 10km away. (11:30:22 - 2016/07/31)

We sensed lightning!
It was 10km away. (11:32:00 - 2016/07/31)

We sensed lightning!
It was 10km away. (11:33:49 - 2016/07/31)

We sensed lightning!
It was 1km away. (11:35:15 - 2016/07/31)

We sensed lightning!
It was 1km away. (11:38:58 - 2016/07/31)

We sensed lightning!
It was 1km away. (11:40:08 - 2016/07/31)

We sensed lightning!
It was 1km away. (11:44:06 - 2016/07/31)

We sensed lightning!
It was 1km away. (11:51:12 - 2016/07/31)

We sensed lightning!
It was 10km away. (11:53:10 - 2016/07/31)

We sensed lightning!
It was 10km away. (11:55:22 - 2016/07/31)

We sensed lightning!
It was 10km away. (11:56:58 - 2016/07/31)

We sensed lightning!
It was 8km away. (12:03:15 - 2016/07/31)

Link zum Python-Script: https://github.com/pcfens/RaspberryPi-AS3935.git

Empfindlichkeit lässt sich einstellen (noise level). Standard I2C-Adresse ist =0x03. Indoor oder Outdoor-Benutzung (den Unterschied hab ich noch nicht verstanden).

klausw

Zitat von: thymjan am 31 Juli 2016, 12:07:33
Der AS3935 meldet ja per Interrupt (GPIO17) ein anliegendes Event (Blitzsignal, Disturber, zu hoher Rauschpegel) über I2C. Lässt sich sowas sinnvoll in FHEM mit einem I2C-Modul integrieren?
Beim integrieren bin ich mir nicht sicher. Für den Interrupt muss ein GPIO verwendet werden, das auch Triggerfunktionalität hat. GPIOs sind wiederum Hardwareabhängig und benötigen ein spezielles Modul (z.B. Raspberry oder Firmata). Du könntest den GPIO separat anlegen und über ein notify den Auslesevorgang triggern.
Vielleicht lässt sich das notify auch in ein AS3935 integrieren, so das der GPIO nur als Attribut angegeben werden muss.

Zitat von: thymjan am 31 Juli 2016, 12:07:33
Empfindlichkeit lässt sich einstellen (noise level). Standard I2C-Adresse ist =0x03. Indoor oder Outdoor-Benutzung (den Unterschied hab ich noch nicht verstanden).
Vermutlich wird bei Indoornutzung die Empfindlichkeit hochgeschraubt, da die Hauswände eine dämpfende Wirkung haben.

Gibt es eigentlich ein Breakout Board für den AS3935?
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

thymjan

Hallo Klaus!

Breakoutboards gibt es mehrere. Ich habe dieses (aus USA, dauert knappe 2 Wochen):
https://www.embeddedadventures.com/as3935_lightning_sensor_module_mod-1016.html

Dieses Breakoutboard hat den Vorteil, das der Sensor kalibriert ist. Auf der Verpackung klebt ein Hinweis SensorTune = x. Dies muss im Script mit eingegeben werden.
In der Make: 1/2016 wird ein Bauprojekt besprochen (mit obigem python script).

Das Testen gestaltet sich dann aber langwierig, da sich Blitze eben nicht so leicht simulieren lassen.

So wie du das mit GPIO/Interrupt oben beschrieben hast hab ich mir das auch überlegt. Ich meine ich hätte irgendwo gelesen, dass der Interrupt-Grund (da gibt es verschiedene) nach 2 ms ausgelesen werden kann/muss. Könnte bei FHEM zeitkritisch werden, was meinst Du?

Burny4600

@klausw
ZitatDie Fertigkeiten lassen sich aneignen

Da stimme ich dir zu, aber das wird bei mir sicherlich noch eine Weile dauern.
Bin froh das ich soweit den Umzug von der Ezcontrol XS1 auf FHEM hinbekommen habe.
Das sogar besser als ich gedacht habe.
Mfg Chris

Raspberry Pi 2/2+/3/3+/4 / Betriebssystem: Bullseye Lite
Schnittstellen: RFXtrx433E, SIGNALduino, MQTT, nanoCUL, HM-MOD-UART, 1-Wire, LAN, ser2net, FHEM2FEHEM
Devices: S.USV, APC-USV, Fronius Datalogger Web 2, FS20, IT, Resol VBUS & DL2, TEK603, WMR200, YouLess, Homematic, MQTT

klausw

Zitat von: thymjan am 03 August 2016, 18:32:09
Breakoutboards gibt es mehrere. Ich habe dieses (aus USA, dauert knappe 2 Wochen):
https://www.embeddedadventures.com/as3935_lightning_sensor_module_mod-1016.html

Dieses Breakoutboard hat den Vorteil, das der Sensor kalibriert ist. Auf der Verpackung klebt ein Hinweis SensorTune = x. Dies muss im Script mit eingegeben werden.
In der Make: 1/2016 wird ein Bauprojekt besprochen (mit obigem python script).

nen Schnäppchen ist es nicht gerade...da muss ich mal in mich gehen ;)

Zitat von: thymjan am 03 August 2016, 18:32:09
Das Testen gestaltet sich dann aber langwierig, da sich Blitze eben nicht so leicht simulieren lassen.

bei dem super Sommer ist das simulieren ja nicht notwendig

Zitat von: thymjan am 03 August 2016, 18:32:09
So wie du das mit GPIO/Interrupt oben beschrieben hast hab ich mir das auch überlegt. Ich meine ich hätte irgendwo gelesen, dass der Interrupt-Grund (da gibt es verschiedene) nach 2 ms ausgelesen werden kann/muss. Könnte bei FHEM zeitkritisch werden, was meinst Du?
2ms ist sehr kurz.
Das macht für mich auch keinen Sinn.
Wenn es so ist dann wird das schwierig mir FHEM.
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

thymjan

ZitatInterrupt Management
Whenever events happen, the AS3935 pulls the IRQ high and displays the interrupt in the REG0x03[3:0]. Figure 43 shows the interrupt register. After the signal IRQ goes high the external unit should wait 2ms before reading the interrupt register. The interrupt bus IRQ is set back to low whenever the interrupt register is read out.

Man soll 2 ms warten, bevor man liest/bevor die Daten anliegen.
Das geht ja nochmal ;)

Burny4600

Mfg Chris

Raspberry Pi 2/2+/3/3+/4 / Betriebssystem: Bullseye Lite
Schnittstellen: RFXtrx433E, SIGNALduino, MQTT, nanoCUL, HM-MOD-UART, 1-Wire, LAN, ser2net, FHEM2FEHEM
Devices: S.USV, APC-USV, Fronius Datalogger Web 2, FS20, IT, Resol VBUS & DL2, TEK603, WMR200, YouLess, Homematic, MQTT

Stargazer

Hallo zusammen,

ich möchte den AS3935 auch gerne via Skript am RasPi 3 betreiben.
Eine Version habe ich schon erfolgreich an einem Arduino in Betrieb.
Doch nun wäre ich an einem einbinden in FHEM auch interessiert.

Gibt es da schon etwas neues ?

Ich suche jetzt noch etwas weiter, doch die Ausbeute war bis jetzt recht mager.

Viele Grüße und besten Dank

André

Burny4600

Mfg Chris

Raspberry Pi 2/2+/3/3+/4 / Betriebssystem: Bullseye Lite
Schnittstellen: RFXtrx433E, SIGNALduino, MQTT, nanoCUL, HM-MOD-UART, 1-Wire, LAN, ser2net, FHEM2FEHEM
Devices: S.USV, APC-USV, Fronius Datalogger Web 2, FS20, IT, Resol VBUS & DL2, TEK603, WMR200, YouLess, Homematic, MQTT

albundy118

Hi,

ohne dass ich jetzt geprüft habe ob die oben erwähnten Sensorung unterstützt werden, könntet ihr es mal mit pilight versuchen. Da wird einiges mit I2C unterstützt.
Pilight läuft dann parallel zu fhem als eine Art Middleware und lässt sich dann mittels pilight_xxx module in FHEM einbinden.
Ich nutze z.B. pilight um 433 Mhz Sender/empfänger an GPIO in FHEM einzubinden und wollte demnächt einen I2C Helligkeits Sensor BH1750 damit auslesen.
Vielleicht hilft euch das ja weiter.

Gruß
Florian

hankyzoolander

Hallo,
habe mir für meine Wetterstation einen Blitzsensor zugelegt. Nach langem hin und her hat er endlich auch die Adresse 0x03  :)
Da bei uns im Moment kein Gewitter auch nur in der nähe ist, heißt es abwarten :(


Script:
Wenn ich das richtig sehe, schreibt das script bei einem erfassten Blitz in die Console oder?

Idee:
# Die ausgabe in der Console abschalten.
# Python script als service laufen lassen
# Fhem im python script einbinden
# erkannte Blitze aus dem script heraus in einen fhem dummy schreiben

Habe das so in der art mit meinem Windmesser gelöst. Das funktioniert auch wunderbar.
Ich setzte mich mal dran und schaue mal, ob ich da was brauchbares zusammen bekomme.

Wo ich noch nicht ganz durchblicke, ist mit der justierung des Sensors.
Wurde bis jetzt aus den Internet Beispielen noch nicht erleuchtet :o ::)
Also wenn da jemand ein paar Tips hätte wär das toll.
betateilchen  <--- my personal hero

thymjan

Gute Idee!  ;)
Ich habe das in etwa so am Laufen.

blitz-fhem.py:

from RPi_AS3935 import RPi_AS3935

import RPi.GPIO as GPIO
import time
import os
from datetime import datetime

GPIO.setmode(GPIO.BCM)

# Initialisierung
Indoors = False
NoiseFloor = 0
TuningCap = 0x05
DispLco = False

sensor = RPi_AS3935(address=0x03, bus=1)
sensor.reset()

sensor.set_indoors(False)
os.system('perl /opt/fhem/fhem.pl 7072 "setreading AS3935 indoors '+str(Indoors)+'"')
sensor.set_noise_floor(0)
os.system('perl /opt/fhem/fhem.pl 7072 "setreading AS3935 level '+str(NoiseFloor)+'"')
sensor.calibrate(tun_cap=0x05)
time.sleep(1.0)
os.system('perl /opt/fhem/fhem.pl 7072 "setreading AS3935 tun_cap '+str(TuningCap)+'"')
sensor.set_disp_lco(DispLco)
os.system('perl /opt/fhem/fhem.pl 7072 "setreading AS3935 disp_lco '+str(DispLco)+'"')
minStrikes = sensor.get_min_strikes()
os.system('perl /opt/fhem/fhem.pl 7072 "setreading AS3935 min_strikes '+str(minStrikes)+'"')

# Interruptbehandlung
def handle_interrupt(channel):
now = datetime.now().strftime('%H:%M:%S - %Y/%m/%d')
time.sleep(0.004)
global sensor
reason = sensor.get_interrupt()
if reason == 0x01:
  noise = sensor.raise_noise_floor()
  os.system('perl /opt/fhem/fhem.pl 7072 "setreading AS3935 level '+str(noise)+'"')
elif reason == 0x04:
  os.system('perl /opt/fhem/fhem.pl 7072 "setreading AS3935 disturb 1"')
  sensor.set_mask_disturber(True)
elif reason == 0x08:
  distance = sensor.get_distance()
  os.system('perl /opt/fhem/fhem.pl 7072 "setreading AS3935 distance '+str(distance)+'"')
  energy = sensor.get_energy()
  os.system('perl /opt/fhem/fhem.pl 7072 "setreading AS3935 energy '+str(energy)+'"')

pin = 17
GPIO.setup(pin, GPIO.IN)
GPIO.add_event_detect(pin, GPIO.RISING, callback=handle_interrupt)

# heartbeat-Schleife
while True:
os.system('perl /opt/fhem/fhem.pl 7072 "setreading AS3935 heartbeat present"')
time.sleep(60.0)


Das Script läuft als Service, für den Empfang der Daten in FHEM habe ich den telnet-port aktiviert.

Hier ist meine dummy-Definition:

defmod AS3935 dummy
attr AS3935 icon weather_thunderstorm
attr AS3935 readingList level disturb distance energy
attr AS3935 room AS3935
attr AS3935 stateFormat D: [$name:distance] km, P: [$name:energy] um [$name:energy:t]\
<br>Noisefloor: [$name:level], Störer maskiert: [$name:disturb:t]\
<br>Display LC oscillator on interrupt pin: [$name:disp_lco]\
<br>Indoors: [$name:indoors], Min. Strikes: [$name:min_strikes]\
<br>internal tuning capacitors: [$name:tun_cap] x 8pF\
<br>Heartbeat: [$name:heartbeat:t]

setstate AS3935 D: 1 km, P: 0 um 2019-07-05 13:31:29\
<br>Noisefloor: 1, Störer maskiert: 2019-07-03 21:38:19\
<br>Display LC oscillator on interrupt pin: False\
<br>Indoors: False, Min. Strikes: 1\
<br>internal tuning capacitors: 5 x 8pF\
<br>Heartbeat: 2019-07-06 13:54:44
setstate AS3935 2019-07-03 21:38:15 disp_lco False
setstate AS3935 2019-07-05 13:31:29 distance 1
setstate AS3935 2019-07-03 21:38:19 disturb 1
setstate AS3935 2019-07-05 13:31:29 energy 0
setstate AS3935 2019-07-06 13:54:44 heartbeat present
setstate AS3935 2019-07-03 21:38:13 indoors False
setstate AS3935 2019-07-04 20:26:33 level 1
setstate AS3935 2019-07-03 21:38:16 min_strikes 1
setstate AS3935 2019-07-03 21:38:15 tun_cap 5


Im Anhang noch ein paar Screenshots dazu. Ich warte momentan auf das nächste Gewitter.
Bis vor kurzem hatte ich noch ziemlich zugemüllte Diagramme in denen ein Gewitter nicht direkt aufgefallen ist.
Bin mir auch nicht sicher ob der Sensor gelegentlich aussteigt und sich nur durch einen Kaltstart reaktivieren lässt.