Hallo zusammen,
hat schon jemand einen Parrot Flower Power Pflanzensensor in FHEM integriert?
Produkt: http://www.parrot.com/de/produkte/flower-power/
Es gibt auch eine API Dokumentation.
https://flowerpowerdev.parrot.com/
Hab das Produkt bei mir im Einsatz und Frage die Daten per BT4.0 über die iOS App ab. Die Daten hätte ich aber gerne in meiner FHEM Umgebung um damit eine Pflanzenbewässerung zu steuern.
Freu mich auf eure Hilfe.
Danke,
Snowball
Spannendes Thema. Ich bin gerade bei Amazon drauf gestoßen. Und auch nicht deutlich teurer als der Vegetronix, den hier viele einsetzen.
Meiner ist heute angekommen.
Gerade bin ich noch auf diesen Link gestoßen:
http://hobbyquaker.blogspot.de/2014/02/parrot-flower-power.html (http://hobbyquaker.blogspot.de/2014/02/parrot-flower-power.html)
Ich bin da sehr skeptisch - die gegabelte Struktur ist ein Hinweis darauf, dass hier einfach die Leitfähigkeit des Bodens gemessen wird. Korrosion des Sensors ist davon ebenso die Folge, wie die Vergiftung des Bodens mit Schwermetallionen.
Das Gute an dem Vegetronix-Sensor ist die kapazitive Messung, bei der dies eben nicht vorkommen kann.
LG
pah
Jetzt ist endlich mein Zubehör beisammen und ich konnte einen ersten Test mit dem RasPi machen.
Die Daten fließen schon mal. Da es für Perl keinen gescheiten BLE Stack gibt und die node.js Implementierung gut läuft, werde ich wohl node.js als Daten-Proxy nutzen und die Daten nach FHEM und in die Cloud pushen.
pi@raspi2 ~/node_modules/flower-power $ sudo node test.js
connectAndSetup
readSystemId
system id = **:**:**:**:**:**:**:**
readSerialNumber
serial number = *******************Flower p
readFirmwareRevision
firmware revision = 2014-06-23_hawaii-1.1.0_hardware-config-MP
readHardwareRevision
hardware revision = 2013-07-26_hawaiiProduction-1.2_protoDV-bootloader
readManufacturerName
manufacturer name = Parrot
readBatteryLevel
battery level = 94
readFriendlyName
friendly name = Flower power ******
writeFriendlyName
readColor
color = brown
readSunlight
sunlight = 0.32 mol/m²/d
readSoilElectricalConductivity
soil electrical conductivity = 0.00
readSoilTemperature
soil temperature = 21.92°C
readAirTemperature
air temperature = 23.08°C
readSoilMoisture
soil moisture = 15.10%
readCalibratedSoilMoisture
calibrated soil moisture = 19.34%
readCalibratedAirTemperature
calibrated air temperature = 24.02°C
readCalibratedSunlight
calibrated sunlight = 0.37 mol/m²/d
readCalibratedEa
calibrated EA = 10.26
readCalibratedEcb
calibrated ECB = 0.00 dS/m
readCalibratedEcPorous
calibrated EC porous = 0.00 dS/m
enableLiveMode
live mode
sunlight = 0.37 mol/m²/d
soil electrical conductivity = 0.00
soil temperature = 21.92°C
air temperature = 23.08°C
soil moisture = 15.59%
sunlight = 0.36 mol/m²/d
soil electrical conductivity = 0.00
soil temperature = 21.92°C
air temperature = 23.08°C
soil moisture = 16.83%
sunlight = 0.37 mol/m²/d
soil electrical conductivity = 0.00
soil temperature = 21.92°C
air temperature = 23.08°C
soil moisture = 16.21%
sunlight = 0.37 mol/m²/d
soil electrical conductivity = 0.00
soil temperature = 21.97°C
air temperature = 23.08°C
soil moisture = 16.83%
sunlight = 0.37 mol/m²/d
soil electrical conductivity = 0.00
soil temperature = 21.92°C
air temperature = 23.08°C
disableLiveMode
soil moisture = 16.21%
enableCalibratedLiveMode
calibrated live mode
calibrated soil moisture = 20.92%
calibrated air temperature = 24.02°C
calibrated sunlight = 0.42 mol/m²/d
calibrated EA = 11.10
calibrated ECB = 0.00 dS/m
calibrated EC porous = 0.00 dS/m
calibrated soil moisture = 19.82%
calibrated air temperature = 24.02°C
calibrated sunlight = 0.42 mol/m²/d
calibrated EA = 10.52
calibrated ECB = 0.00 dS/m
calibrated EC porous = 0.00 dS/m
calibrated soil moisture = 21.16%
calibrated air temperature = 24.02°C
calibrated sunlight = 0.42 mol/m²/d
calibrated EA = 11.23
calibrated ECB = 0.00 dS/m
calibrated EC porous = 0.00 dS/m
calibrated soil moisture = 19.21%
calibrated air temperature = 24.02°C
calibrated sunlight = 0.42 mol/m²/d
calibrated EA = 10.20
calibrated ECB = 0.00 dS/m
calibrated EC porous = 0.00 dS/m
calibrated soil moisture = 20.31%
calibrated air temperature = 24.02°C
calibrated sunlight = 0.42 mol/m²/d
calibrated EA = 10.77
disableCalibratedLiveMode
calibrated ECB = 0.00 dS/m
calibrated EC porous = 0.00 dS/m
ledPulse
delay
ledOff
disconnect
disconnected!
Und nach einem
npm install flower-power-cloud
klappt nach der Zusendung eines API-Keys durch Parrot jetzt auch der Zugriff auf die Cloud. Damit müsste sich ein automatisiertes Hochladen in die Cloud und die Nutzung der Zustände und Trigger aus den Pflanzenwerten in FHEM realisieren lassen.
Jerome von Parrot hat heute dankenswerterweise ein Testscript für node.js auf dem RasPi für die komplette Synchronisation zwischen Sensor und Cloud veröffentlicht.
https://github.com/Parrot-Developers/FlowerPower-Tools/tree/master/BLE-cloud-bridge
Werde am Wochenende mal schauen, wie es läuft.
Damit könnte man
- alle Sensordaten auch ohne Handy und damit bei Abwesenheit mit der Cloud synchronisieren
- in FHEM die Echtdaten der Sensoren nutzen
- in FHEM die Cloud-Daten mit den Verarbeitungen aus der Pflanzendatenbank nutzen
Punkt 1 ist bei mir jetzt abgehakt.
Seit gestern läuft über den RasPi alle 30 Minuten ein Abruf der Daten von den Sensoren und die Übertragung in die Cloud. Das Schöne ist, dass die Sensoren einen Zwischenspeicher für historische Daten haben. Man könnte also auch nur einmal am Tag abrufen und dann ein größeres Paket in die Cloud übertragen.
Hej,
eigentlich darf es mich ja nicht wundern, dass es schon jemand anders entdeckt hat. Aber eben wollte ich verkünden, dass ich dank der offenen Schnittstelle und Jerome jetzt beginnen werde, an einer Integration des Sensors in FHEM zu arbeiten und wollte in die Runde nach Ideen fragen, wie ihr euch das vorstellen könntet.
Wie volschin schon richtig bemerkt hat, ist das mit Perl ja nicht so einfach und deswegen hätte ich an einen Wrapper gedacht. Aber wie gesagt - würde mich freuen, von allen Interessierten eine kurze Rückmeldung zu erhalten, welche Ideen es gibt bzw. was ihr euch an Umsetzung vorstellen könntet. :-)
Mein Cloud Sync läuft jetzt seit rund 2 Wochen. Ich musste noch ein paar Bugs fixen, die nur bei mehreren Sensoren relevant werden.
Mein Fork ist hier zu finden:
https://github.com/volschin/FlowerPower-Tools
Sehr cool,
hätte auch Interesse an einem FHEM Wrapper/Modul.
Muss aber erstmal BLE zum werkeln bekommen auf meinem SBC hier :(
Hi Volschin,
hab die letzten Tage versucht, meinen Parott Sensor zum Laufen zu kriegen, bin baer nicht so weit gekommen wie Du.
Während eine App auf meinem Android-Smartphone problemlos den Sensor sieht (auch aus größerer Entfernung), Kontakt mit ihm aufnehmen und die Messwerte auslesen kann, bekomme ich weder am Raspberry Pi noch an meinem Laptop eine Verbindung.
pi@raspi2 ~/node_modules/flower-power $ sudo node test.js
kommt nie zurück, liefert insbesondere keine Ausgabe.
pi@raspi2 $ sodo hcitool lescan
zeigt sehr schnell hintereinander immer wieder die Adresse eines Gerätes, das sich als "Apple TV" ausgibt, gehört wohl dem Nachbarn. Die Adresse des Flower Power taucht hier nie auf. Ich have verschiedene Kernelversionen und bluez-Reeases durchprobiert, alle zeigen das gleiche Verhalten. Deswegen habe ich meinen SB-BT4.0-Adapter, ein "Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)" mit der ID: 0a12:0001 in Verdacht.
Welchen Bluetooth-Adapter verwendest Du denn, und welche bluez-/kernel-Version hast Du im Einsatz?
Danke schonmal,
Andy.
Ich habe bluez in Version 5.23 im Einsatz mit Kernel 4.1.6, Standardpaket aus dem Jessie-Zweig. Lief aber auch auf älteren Kernel-Versionen (3.11 und 3.18) problemlos.
Adapter habe ich einen mit Broadcom BCM20702-Chip (diesen (http://www.amazon.de/gp/product/B010NISKFK))
Sollte aber auch mit CSR-Chip laufen, der unterstützt aber nur bis zu 5 Devices, der Broadcom bis zu 14. Das spielt hier keine Rolle.
Solange Du mit
sudo hcitool lescan
den FlowerPower nicht zu sehen bekommst, brauchst Du mit node nicht weiter zu versuchen. Da stimmt irgendwo die Basis nicht.
@volschin: Was ich dich noch fragen wollte... Warum hast du den Job eigentlich alle 30 Minuten laufen?
Die zwei Stunden, wie es die App selbst auch macht, sollten doch ausreichen und das geht vor allem nicht so auf die Batterie. :-)
Habe ich mittlerweile auch auf stündlich hochgesetzt. Theoretisch reicht auch einmal pro Tag, da er die Daten ja puffert und nur das hochlädt, was noch fehlt.
Naja... Wenn man an heißen Tagen mehrmals am Tag gießen muss, schadet es nicht, alle paar Stunden abzurufen...
Bei den aktuellen Temperaturen genügt aber vermutlich wirklich einmal am Morgen und einmal am Abend. :-)
Zitat von: volschin am 17 August 2015, 16:50:37
Mein Cloud Sync läuft jetzt seit rund 2 Wochen. Ich musste noch ein paar Bugs fixen, die nur bei mehreren Sensoren relevant werden.
Mein Fork ist hier zu finden:
https://github.com/volschin/FlowerPower-Tools
Kann ich bestätigen, nachdem ich nun einen funktionierenden Stick verwende (danke nochmal für den Tipp! ).
Mit der original Version überlagern sich bei einer Pflanze mitunter Messungen von zwei verschiedenen Sensoren. Andere tun so als würden sie nach der Erstinbetriebnahme die ersten 24h Daten sammeln. Deine Version hat diese Probleme nicht.
Was mich allerdings plagt ist ein anderes Thema: Ich habe 8 Sensoren über die Wohnung verteilt, teilweise mit Wänden und Fenstern zwischen Sensor und RPI. Ein hcitool blescan listet alle Sensoren auf, doch scheint bei manchen der Empfang so schlecht zu sein, dass beim Auslesen mit BLE-cloud-bridge ein disconnected! ausgegeben wird und in der Folge das Programm mit einer exception aussteigt, ohne die restlichen Sensoren zu behandeln. Ohne diesen Fehler könnte ich zumindest 2-3 RPIs verteilen um alle Sensoren auszulesen.
Leider habe ich weder ausreichend Erfahrung mit Javascript noch blicke ich hinreichend durch den Code um hier geeignete Lösungsansätze zu sehen. Weißt Du wie dem disconnect-Problem beizukommen ist?
Grüße,
Andy.
Disconnected hatte ich auch schon, aber ausgestiegen ist das Programm deshalb nicht. Welche node Version verwendest Du?
0.10.29
Hier ein trace :
$ sh scriptForCrontab.sh
--------------------
Mo 21. Sep 19:16:42 CEST 2015
Mon Sep 21 2015 19:16:52 GMT+0200 (CEST) Starting new sync for clientID: gandy@...
login error: premature end-of-file
login error: invalid credentials: code=undefined results=undefined
getGarden: premature end-of-file
user_config_version1=50 tabSensors=A0143D000007CFD6,A0143D000007CFB5,9003B70000C74068,A0143D000007D466,9003B70000C7476B,A0143D000007D04D,A0143D000007CE5E,9003B70000E81BDB tabIndex=7967,7932,8005,8006,8006,8008,7909,8389
invoke
{ event: 'garden_locations_status',
diagnostic: 'premature end-of-file' }
a0143d07d466
SPLICE i=3 fp=a0143d07d466
9003b7e81bdb
9003b7c7476b
a0143d07cfb5
SPLICE i=1 fp=a0143d07cfb5
a0143d07d04d
SPLICE i=5 fp=a0143d07d04d
9003b7c74068
End of discovery
connectAndSetup{"uuid":"a0143d07d466","name":"Flower power D466"}
order id x=3
getHistoryLastEntryIdx:8021
getHistoryCurrentSessionID: 2
getHistoryCurrentSessionStartIdx: 7680
getHistoryCurrentSessionPeriod: 900
getStartUpTime: Fri Sep 18 2015 05:50:44 GMT+0200 (CEST)
getHistory original startIdx=8006
downloaded: 8 % buffer.idx = 0 nbBuffer = 13 current idx = 0
downloaded: 15 % buffer.idx = 1 nbBuffer = 13 current idx = 0
downloaded: 23 % buffer.idx = 2 nbBuffer = 13 current idx = 0
downloaded: 31 % buffer.idx = 3 nbBuffer = 13 current idx = 0
downloaded: 38 % buffer.idx = 4 nbBuffer = 13 current idx = 0
downloaded: 46 % buffer.idx = 5 nbBuffer = 13 current idx = 0
downloaded: 54 % buffer.idx = 6 nbBuffer = 13 current idx = 0
downloaded: 62 % buffer.idx = 7 nbBuffer = 13 current idx = 0
downloaded: 69 % buffer.idx = 8 nbBuffer = 13 current idx = 0
downloaded: 77 % buffer.idx = 9 nbBuffer = 13 current idx = 0
downloaded: 85 % buffer.idx = 10 nbBuffer = 13 current idx = 0
downloaded: 92 % buffer.idx = 11 nbBuffer = 13 current idx = 0
downloaded: 100 % buffer.idx = 12 nbBuffer = 13 current idx = 0
uploaded to sensor A0143D000007D466
disconnect
connectAndSetup{"uuid":"a0143d07cfb5","name":"Flower power CFB5"}
order id x=1
disconnected!
disconnected!
disconnected!
/home/andy/node_modules/noble-device/lib/noble-device.js:68
this._characteristics[serviceUuid][characteristicUuid].read(function(error,
^
TypeError: Cannot read property '39e1fc0284a811e2afba0002a5d5c51b' of undefined
at FlowerPower.NobleDevice.readDataCharacteristic (/home/andy/node_modules/noble-device/lib/noble-device.js:68:37)
at FlowerPower.getHistoryLastEntryIdx (/home/andy/node_modules/node-flower-power/index.js:461:7)
at async.series.tab.(anonymous function).getHistoryCurrentSessionID.currentID (/home/andy/src/volschin-FlowerPower-Tools/BLE-cloud-bridge/app.js:190:20)
at /usr/lib/nodejs/async.js:610:21
at /usr/lib/nodejs/async.js:249:17
at iterate (/usr/lib/nodejs/async.js:149:13)
at /usr/lib/nodejs/async.js:160:25
at /usr/lib/nodejs/async.js:251:21
at /usr/lib/nodejs/async.js:615:34
at FlowerPower.<anonymous> (/home/andy/src/volschin-FlowerPower-Tools/BLE-cloud-bridge/app.js:157:15)
Wie sieht das bei dir aus?
Hi,
Hab nochmal die node Module in den Versionen installiert, die in README.md angegeben waren - mit dem selben Ergebnis.
Die Fehlermeldung sieht für mich so aus,als würde auf eine nicht (mehr) definierte Variable zugegriffen. Läßt sich das abfangen?
Grüße,
Andy.
Zitat von: gandy am 21 September 2015, 19:20:12
0.10.29
Aktualisiere mal auf 0,12.6 oder 4.0.
Deine Version ist schon eher alt und könnte Problemursache sein.
Zitat von: volschin am 23 September 2015, 14:51:03
Aktualisiere mal auf 0,12.6 oder 4.0.
Deine Version ist schon eher alt und könnte Problemursache sein.
Hmm... Dabei ist die schon viel neuer seit ich mein raspbian aktualisiert habe :-) Aber danke für den Tipp, ich versuch das mal.
So... Zur Sicherheit habe ich alle node Pakete die vom Raspbian kamen entfernt und auch alles in node_modules. Dann node 4.0 und mit npm alle angegebenen Abhängigkeiten.
Jetzt sieht die Ausgabe etwas anders aus, die Fehlermeldung ist aber die gleiche:
$ sh scriptForCrontab.sh
--------------------
Mi 23. Sep 17:53:49 CEST 2015
Wed Sep 23 2015 17:53:58 GMT+0200 (CEST) Starting new sync for clientID: gandy92@googlemail.com
user_config_version1=52 tabSensors=A0143D000007D466,A0143D000007CE5E,9003B70000C74068,A0143D000007CFD6,A0143D000007CFB5,9003B70000C7476B,A0143D000007D04D,9003B70000E81BDB tabIndex=8161,8122,8196,8126,8160,8196,8195,8580
9003b7e81bdb
a0143d07d04d
SPLICE i=6 fp=a0143d07d04d
a0143d07d466
SPLICE i=0 fp=a0143d07d466
9003b7c74068
a0143d07cfb5
SPLICE i=4 fp=a0143d07cfb5
9003b7c7476b
End of discovery
connectAndSetup{"uuid":"a0143d07d466","name":"Flower power D466"}
order id x=0
noble: unknown peripheral a0143d07d466 connected!
noble: unknown peripheral a0143d07d466 disconnected!
disconnected!
/home/andy/node_modules/noble-device/lib/noble-device.js:68
this._characteristics[serviceUuid][characteristicUuid].read(function(error, data) {
^
TypeError: Cannot read property '39e1fc0284a811e2afba0002a5d5c51b' of undefined
at FlowerPower.NobleDevice.readDataCharacteristic (/home/andy/node_modules/noble-device/lib/noble-device.js:68:37)
at FlowerPower.getHistoryLastEntryIdx (/home/andy/node_modules/node-flower-power/index.js:461:7)
at async.series.tab.(anonymous function).getHistoryCurrentSessionID.currentID (/home/andy/src/volschin-FlowerPower-Tools/BLE-cloud-bridge/app.js:185:20)
at /home/andy/node_modules/async/lib/async.js:763:21
at /home/andy/node_modules/async/lib/async.js:391:17
at iterate (/home/andy/node_modules/async/lib/async.js:181:13)
at /home/andy/node_modules/async/lib/async.js:192:25
at /home/andy/node_modules/async/lib/async.js:393:21
at /home/andy/node_modules/async/lib/async.js:768:34
at FlowerPower.<anonymous> (/home/andy/src/volschin-FlowerPower-Tools/BLE-cloud-bridge/app.js:157:15)
Zwischen connected! und disconnected! vergehen 2-4 Sekunden.
Was mir auch nicht klar ist: IDs 9003b7e81bdb, 9003b7c74068 und 9003b7c7476b sind registrierte Sensoren, werden aber augenscheinlich ignoriert.
Aber eins nach dem anderen, hast du noch Ideen was ich tun kann?
Ich bin mir nicht sicher, aber ich habe mir gerade mal noble und noble-device angesehen. Dort wurden neue Versionen erstellt. noble-device ist in der installationsanleitung von Parrot mit einer Version fest verdrahtet, noble dagegen nicht.
Meine Installation stammt vom 30.7.
Allerdings widersprechen sich teile der Anleitung und Angaben im Package-File von node-flower-power
Dort steht:
"dependencies": {
"noble": "~0.3.6",
"noble-device": "^0.1.2"
Bedeutet Du bekommst von noble die höchste 0.3.-Version. Das ist 0.3.14.
Auf der anderen Seite hast Du dir vermutlich über die Anleitung zusätzlich noble 1.1.0 installiert. Das ist inkompatibel zu noble-device 0.1.2.
Ich bin mir nicht sicher, was an welcher Stelle vorrangig zieht. Ich werde mir wohl von dem node-flower-power auch noch meinen eigenen Fork machen und das glattziehen. Seitens Parrot scheint sich da nichts mehr zu tun.
Versuch evtl. mal
"noble-device": "~0.1.2"
im package.json von node-flower-power
und anschließend in diesem Verzeichnis ein
npm update
Hmmm auch das wars nicht.
Kannst du mir bitte mal kurz den Output von
find ~/node_modules -name package.json | xargs grep -H version
schicken, dann versuche ich die exakt gleichen Versionen zu installieren.
/home/pi/node_modules/debug/package.json: "version": "2.2.0",
/home/pi/node_modules/debug/node_modules/ms/package.json: "version": "0.7.1",
/home/pi/node_modules/debug/node_modules/ms/package.json: "description": "Tiny ms conversion utility",
/home/pi/node_modules/noble-device/package.json: "version": "0.1.2",
/home/pi/node_modules/noble-device/node_modules/noble/package.json: "version": "0.3.14",
/home/pi/node_modules/noble-device/node_modules/noble/node_modules/debug/package.json: "version": "0.7.4",
/home/pi/node_modules/noble-device/node_modules/noble/node_modules/bplist-parser/package.json: "version": "0.0.6",
/home/pi/node_modules/node-uuid/package.json: "version": "1.4.3",
/home/pi/node_modules/noble/package.json: "version": "1.0.2",
/home/pi/node_modules/noble/node_modules/mocha/package.json: "version": "1.8.2",
/home/pi/node_modules/noble/node_modules/mocha/node_modules/diff/package.json: "version": "1.0.2",
/home/pi/node_modules/noble/node_modules/mocha/node_modules/ms/package.json: "version": "0.3.0",
/home/pi/node_modules/noble/node_modules/mocha/node_modules/ms/package.json: "description": "Tiny ms conversion utility",
/home/pi/node_modules/noble/node_modules/mocha/node_modules/mkdirp/package.json: "version": "0.3.3",
/home/pi/node_modules/noble/node_modules/mocha/node_modules/growl/package.json: "version": "1.7.0",
/home/pi/node_modules/noble/node_modules/mocha/node_modules/commander/package.json: "version": "0.6.1",
/home/pi/node_modules/noble/node_modules/mocha/node_modules/jade/package.json: "version": "0.26.3",
/home/pi/node_modules/noble/node_modules/mocha/node_modules/jade/node_modules/mkdirp/package.json: "version": "0.3.0",
/home/pi/node_modules/noble/node_modules/debug/package.json: "version": "2.2.0",
/home/pi/node_modules/noble/node_modules/debug/node_modules/ms/package.json: "version": "0.7.1",
/home/pi/node_modules/noble/node_modules/debug/node_modules/ms/package.json: "description": "Tiny ms conversion utility",
/home/pi/node_modules/noble/node_modules/sinon/package.json: "version": "1.6.0",
/home/pi/node_modules/noble/node_modules/sinon/node_modules/buster-format/package.json: "version": "0.5.6",
/home/pi/node_modules/noble/node_modules/sinon/node_modules/buster-format/node_modules/buster-core/vendor/sinon/package.json: "version": "1.4.0",
/home/pi/node_modules/noble/node_modules/sinon/node_modules/buster-format/node_modules/buster-core/vendor/buster-util/package.json: "version": "0.5.0",
/home/pi/node_modules/noble/node_modules/sinon/node_modules/buster-format/node_modules/buster-core/package.json: "version": "0.6.4",
/home/pi/node_modules/noble/node_modules/should/package.json: "version": "1.2.2",
/home/pi/node_modules/noble/node_modules/ws/package.json: "version": "0.4.32",
/home/pi/node_modules/noble/node_modules/ws/node_modules/nan/package.json: "version": "1.0.0",
/home/pi/node_modules/noble/node_modules/ws/node_modules/commander/package.json: "version": "2.1.0",
/home/pi/node_modules/noble/node_modules/ws/node_modules/options/package.json: "version": "0.0.6",
/home/pi/node_modules/noble/node_modules/ws/node_modules/tinycolor/package.json: "version": "0.0.1",
/home/pi/node_modules/noble/node_modules/jshint/package.json: "version": "2.8.0",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/shelljs/package.json: "version": "0.3.0",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/minimatch/package.json: "version": "2.0.10",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/minimatch/node_modules/brace-expansion/package.json: "version": "1.1.0",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json: "version": "0.0.1",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json: "version": "0.2.0",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/console-browserify/package.json: "version": "1.1.0",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/console-browserify/node_modules/date-now/package.json: "version": "0.1.4",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/console-browserify/node_modules/date-now/package.json: "description": "A requirable version of Date.now()",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/cli/package.json: "version": "0.6.6",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/cli/node_modules/glob/package.json: "version": "3.2.11",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/package.json: "version": "2.0.1",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/minimatch/package.json: "version": "0.3.0",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json: "version": "2.6.5",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json: "version": "1.0.1",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/htmlparser2/package.json: "version": "3.8.3",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/htmlparser2/node_modules/entities/package.json: "version": "1.0.0",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/htmlparser2/node_modules/domelementtype/package.json: "version": "1.3.0",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/htmlparser2/node_modules/domhandler/package.json: "version": "2.3.0",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/package.json: "version": "1.1.13",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/inherits/package.json: "version": "2.0.1",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/string_decoder/package.json: "version": "0.10.31",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/isarray/package.json: "version": "0.0.1",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/htmlparser2/node_modules/readable-stream/node_modules/core-util-is/package.json: "version": "1.0.1",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/package.json: "version": "1.5.1",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/node_modules/dom-serializer/package.json: "version": "0.1.0",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/node_modules/dom-serializer/node_modules/entities/package.json: "version": "1.1.1",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/htmlparser2/node_modules/domutils/node_modules/dom-serializer/node_modules/domelementtype/package.json: "version": "1.1.3",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/lodash/package.json: "version": "3.7.0",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/strip-json-comments/package.json: "version": "1.0.2",
/home/pi/node_modules/noble/node_modules/jshint/node_modules/exit/package.json: "version": "0.1.2",
/home/pi/node_modules/noble/node_modules/bplist-parser/package.json: "version": "0.0.6",
/home/pi/node_modules/noble/node_modules/async/package.json: "version": "0.2.10",
/home/pi/node_modules/node-flower-power/package.json: "version": "0.2.1",
/home/pi/node_modules/node-flower-power/node_modules/noble-device/package.json: "version": "0.1.3",
/home/pi/node_modules/node-flower-power/node_modules/noble/package.json: "version": "0.3.14",
/home/pi/node_modules/node-flower-power/node_modules/noble/node_modules/debug/package.json: "version": "0.7.4",
/home/pi/node_modules/node-flower-power/node_modules/noble/node_modules/bplist-parser/package.json: "version": "0.0.6",
/home/pi/node_modules/node-flower-power/node_modules/jshint/package.json: "version": "2.3.0",
/home/pi/node_modules/node-flower-power/node_modules/jshint/node_modules/shelljs/package.json: "version": "0.1.4",
/home/pi/node_modules/node-flower-power/node_modules/jshint/node_modules/minimatch/package.json: "version": "0.4.0",
/home/pi/node_modules/node-flower-power/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/package.json: "version": "2.6.5",
/home/pi/node_modules/node-flower-power/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/package.json: "version": "1.0.1",
/home/pi/node_modules/node-flower-power/node_modules/jshint/node_modules/underscore/package.json: "version": "1.4.4",
/home/pi/node_modules/node-flower-power/node_modules/jshint/node_modules/console-browserify/package.json: "version": "0.1.6",
/home/pi/node_modules/node-flower-power/node_modules/jshint/node_modules/cli/package.json: "version": "0.4.5",
/home/pi/node_modules/node-flower-power/node_modules/jshint/node_modules/cli/node_modules/glob/package.json: "version": "5.0.14",
/home/pi/node_modules/node-flower-power/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/once/package.json: "version": "1.3.2",
/home/pi/node_modules/node-flower-power/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/once/node_modules/wrappy/package.json: "version": "1.0.1",
/home/pi/node_modules/node-flower-power/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/package.json: "version": "2.0.1",
/home/pi/node_modules/node-flower-power/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inflight/package.json: "version": "1.0.4",
/home/pi/node_modules/node-flower-power/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json: "version": "1.0.1",
/home/pi/node_modules/node-flower-power/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/path-is-absolute/package.json: "version": "1.0.0",
/home/pi/node_modules/node-flower-power/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/minimatch/package.json: "version": "2.0.10",
/home/pi/node_modules/node-flower-power/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json: "version": "1.1.0",
/home/pi/node_modules/node-flower-power/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json: "version": "0.0.1",
/home/pi/node_modules/node-flower-power/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json: "version": "0.2.0",
/home/pi/node_modules/node-flower-power/node_modules/bleno/package.json: "version": "0.1.14",
/home/pi/node_modules/node-flower-power/node_modules/bleno/node_modules/debug/package.json: "version": "0.7.4",
/home/pi/node_modules/node-flower-power/node_modules/bleno/node_modules/bplist-parser/package.json: "version": "0.0.6",
/home/pi/node_modules/node-flower-power/node_modules/bleno/examples/battery-service/package.json: "version": "0.1.0",
/home/pi/node_modules/node-flower-power/node_modules/async/package.json: "version": "0.2.10",
/home/pi/node_modules/flower-power-cloud/package.json: "version": "0.2.1",
/home/pi/node_modules/sync/package.json: "version": "0.2.5",
/home/pi/node_modules/sync/node_modules/fibers/package.json: "version": "1.0.7",
/home/pi/node_modules/lazy/package.json: "version": "1.0.11",
/home/pi/node_modules/node-flower-power-cloud/package.json:, "version" : "0.2.1"
/home/pi/node_modules/request/package.json: "version": "2.60.0",
/home/pi/node_modules/request/node_modules/oauth-sign/package.json: "version": "0.8.0",
/home/pi/node_modules/request/node_modules/forever-agent/package.json: "version": "0.6.1",
/home/pi/node_modules/request/node_modules/stringstream/package.json: "version": "0.0.4",
/home/pi/node_modules/request/node_modules/bl/package.json: "version": "1.0.0",
/home/pi/node_modules/request/node_modules/bl/node_modules/readable-stream/package.json: "version": "2.0.2",
/home/pi/node_modules/request/node_modules/bl/node_modules/readable-stream/package.json: "browser": "zuul --browser-name $BROWSER_NAME --browser-version $BROWSER_VERSION -- test/browser.js"
/home/pi/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/package.json: "version": "1.0.1",
/home/pi/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/package.json: "version": "1.0.2",
/home/pi/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/package.json: "version": "2.0.1",
/home/pi/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/package.json: "version": "0.10.31",
/home/pi/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/package.json: "version": "0.0.1",
/home/pi/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/package.json: "version": "1.0.1",
/home/pi/node_modules/request/node_modules/extend/package.json: "version": "3.0.0",
/home/pi/node_modules/request/node_modules/qs/package.json: "version": "4.0.0",
/home/pi/node_modules/request/node_modules/hawk/package.json: "version": "3.1.0",
/home/pi/node_modules/request/node_modules/hawk/node_modules/cryptiles/package.json: "version": "2.0.4",
/home/pi/node_modules/request/node_modules/hawk/node_modules/sntp/package.json: "version": "1.0.9",
/home/pi/node_modules/request/node_modules/hawk/node_modules/boom/package.json: "version": "2.8.0",
/home/pi/node_modules/request/node_modules/hawk/node_modules/hoek/package.json: "version": "2.14.0",
/home/pi/node_modules/request/node_modules/har-validator/package.json: "version": "1.8.0",
/home/pi/node_modules/request/node_modules/har-validator/node_modules/bluebird/package.json: "version": "2.9.34",
/home/pi/node_modules/request/node_modules/har-validator/node_modules/commander/package.json: "version": "2.8.1",
/home/pi/node_modules/request/node_modules/har-validator/node_modules/commander/node_modules/graceful-readlink/package.json: "version": "1.0.1",
/home/pi/node_modules/request/node_modules/har-validator/node_modules/chalk/package.json: "version": "1.1.0",
/home/pi/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/escape-string-regexp/package.json: "version": "1.0.3",
/home/pi/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/package.json: "version": "2.0.0",
/home/pi/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/package.json: "version": "2.0.0",
/home/pi/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/ansi-styles/package.json: "version": "2.1.0",
/home/pi/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/package.json: "version": "3.0.0",
/home/pi/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/package.json: "version": "2.0.0",
/home/pi/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/supports-color/package.json: "version": "2.0.0",
/home/pi/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/package.json: "version": "2.12.1",
/home/pi/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/package.json: "version": "2.0.0",
/home/pi/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/package.json: "version": "1.2.0",
/home/pi/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/package.json: "version": "1.0.2",
/home/pi/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/package.json: "version": "1.1.0",
/home/pi/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/package.json: "version": "4.0.0",
/home/pi/node_modules/request/node_modules/http-signature/package.json: "version": "0.11.0",
/home/pi/node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json: "version": "0.1.5",
/home/pi/node_modules/request/node_modules/http-signature/node_modules/ctype/package.json: "version": "0.5.3",
/home/pi/node_modules/request/node_modules/http-signature/node_modules/asn1/package.json: "version": "0.1.11",
/home/pi/node_modules/request/node_modules/aws-sign2/package.json: "version": "0.5.0",
/home/pi/node_modules/request/node_modules/caseless/package.json: "version": "0.11.0",
/home/pi/node_modules/request/node_modules/form-data/package.json: "version": "1.0.0-rc3",
/home/pi/node_modules/request/node_modules/form-data/node_modules/async/package.json: "version": "1.4.0",
/home/pi/node_modules/request/node_modules/isstream/package.json: "version": "0.1.2",
/home/pi/node_modules/request/node_modules/json-stringify-safe/package.json: "version": "5.0.1",
/home/pi/node_modules/request/node_modules/tough-cookie/package.json: "version": "2.0.0",
/home/pi/node_modules/request/node_modules/combined-stream/package.json: "version": "1.0.5",
/home/pi/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/package.json: "version": "1.0.0",
/home/pi/node_modules/request/node_modules/tunnel-agent/package.json: "version": "0.4.1",
/home/pi/node_modules/request/node_modules/mime-types/package.json: "version": "2.1.4",
/home/pi/node_modules/request/node_modules/mime-types/node_modules/mime-db/package.json: "version": "1.16.0",
/home/pi/node_modules/flower-power/package.json: "version": "0.2.1",
/home/pi/node_modules/flower-power/node_modules/noble-device/package.json: "version": "0.1.3",
/home/pi/node_modules/flower-power/node_modules/noble/package.json: "version": "0.3.14",
/home/pi/node_modules/flower-power/node_modules/noble/node_modules/debug/package.json: "version": "0.7.4",
/home/pi/node_modules/flower-power/node_modules/noble/node_modules/bplist-parser/package.json: "version": "0.0.6",
/home/pi/node_modules/flower-power/node_modules/jshint/package.json: "version": "2.3.0",
/home/pi/node_modules/flower-power/node_modules/jshint/node_modules/shelljs/package.json: "version": "0.1.4",
/home/pi/node_modules/flower-power/node_modules/jshint/node_modules/minimatch/package.json: "version": "0.4.0",
/home/pi/node_modules/flower-power/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/package.json: "version": "2.6.5",
/home/pi/node_modules/flower-power/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/package.json: "version": "1.0.1",
/home/pi/node_modules/flower-power/node_modules/jshint/node_modules/underscore/package.json: "version": "1.4.4",
/home/pi/node_modules/flower-power/node_modules/jshint/node_modules/console-browserify/package.json: "version": "0.1.6",
/home/pi/node_modules/flower-power/node_modules/jshint/node_modules/cli/package.json: "version": "0.4.5",
/home/pi/node_modules/flower-power/node_modules/jshint/node_modules/cli/node_modules/glob/package.json: "version": "5.0.14",
/home/pi/node_modules/flower-power/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/once/package.json: "version": "1.3.2",
/home/pi/node_modules/flower-power/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/once/node_modules/wrappy/package.json: "version": "1.0.1",
/home/pi/node_modules/flower-power/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/package.json: "version": "2.0.1",
/home/pi/node_modules/flower-power/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inflight/package.json: "version": "1.0.4",
/home/pi/node_modules/flower-power/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json: "version": "1.0.1",
/home/pi/node_modules/flower-power/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/path-is-absolute/package.json: "version": "1.0.0",
/home/pi/node_modules/flower-power/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/minimatch/package.json: "version": "2.0.10",
/home/pi/node_modules/flower-power/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json: "version": "1.1.0",
/home/pi/node_modules/flower-power/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json: "version": "0.0.1",
/home/pi/node_modules/flower-power/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json: "version": "0.2.0",
/home/pi/node_modules/flower-power/node_modules/bleno/package.json: "version": "0.1.14",
/home/pi/node_modules/flower-power/node_modules/bleno/node_modules/debug/package.json: "version": "0.7.4",
/home/pi/node_modules/flower-power/node_modules/bleno/node_modules/bplist-parser/package.json: "version": "0.0.6",
/home/pi/node_modules/flower-power/node_modules/bleno/examples/battery-service/package.json: "version": "0.1.0",
/home/pi/node_modules/flower-power/node_modules/async/package.json: "version": "0.2.10",
/home/pi/node_modules/fs/package.json: "version": "0.0.2",
/home/pi/node_modules/async/package.json: "version": "1.0.0",
Danke! Eines der Pakete wars offenbar, denn jetzt kommt dieser Fehler zwar ab und an noch, aber sehr viel seltener. Die meiste Zeit werden alle Sensoren die beim Scan gefunden werden auch ausgelesen.
Evtl versuche ich nochmal herauszufinden, welches Paket ausschlaggebend ist, noble-device allein wars anscheinend nicht. Insgesamt ist mir die Sache ja schon etwas suspekt, mal sehen was da noch kommt :-)
Einen Bug konnte ich noch beheben: Wenn die BT-Adresse aus der ID berechnet wird, nimmt der code bislang die ersten 7 Zeichen und dann wieder an idx 13. Stattdessen sollte es 6 und 12 sein. An die variablebnamen komme ich gerade nicht ran, ich kann dir aber gern einen Patch schicken. - oder wäre dir ein pull-request incl. Modul-Versionen im README.MD.md lieber?
Pull Request wäre super, komme aber vermutlich erst in der nächsten Woche dazu, mich mit dem Package Thema auseinanderzusetzen.
Wenn du willst, probier doch mal die neueste Version der app.js von meinem clone https://github.com/gandy92/FlowerPower-Tools
Ich habe den Code ein wenig umgestellt, ein paar Kommentare eingefügt, die Zuordnung uuid/sensorSerial solider gemacht und das ganze so hinbekommen, dass auch bei sehr schlechter Verbindung und vorzeitigen disconnects jeder gefundene Sensor mal drankommt.
Ein paar Verbesserungen sind sicher noch drin, aber zumindest die Stabilität die ich brauche ist jetzt vorhanden.
gibt es schon die aussicht auf ein Modul ? Um die Geräte relativ einfach ohne viel basteln in Fhem zu bekommen ? Fände es sehr Intressant.
Nein, aus meiner Sicht nicht, da Perl keinen brauchbaren BLE Stack hat. Also nur mit Node.js dazwischen.
Wollte heute auch die Pakete für meine FlowerPower runter laden....jedoch bekomm ich folgenden Fehler, wenn ich am Raspberry das eingebe:
npm install flower-power
npm http GET https://registry.npmjs.org/flower-power
npm ERR! Error: failed to fetch from registry: flower-power
npm ERR! at /usr/share/npm/lib/utils/npm-registry-client/get.js:139:12
npm ERR! at cb (/usr/share/npm/lib/utils/npm-registry-client/request.js:31:9)
npm ERR! at Request._callback (/usr/share/npm/lib/utils/npm-registry-client/request.js:136:18)
npm ERR! at Request.callback (/usr/lib/nodejs/request/main.js:119:22)
npm ERR! at Request.<anonymous> (/usr/lib/nodejs/request/main.js:212:58)
npm ERR! at Request.emit (events.js:88:20)
npm ERR! at ClientRequest.<anonymous> (/usr/lib/nodejs/request/main.js:412:12)
npm ERR! at ClientRequest.g (events.js:156:14)
npm ERR! at ClientRequest.emit (events.js:67:17)
npm ERR! at HTTPParser.parserOnIncomingClient [as onIncoming] (http.js:1256:7)
npm ERR! You may report this log at:
npm ERR! <http://bugs.debian.org/npm>
npm ERR! or use
npm ERR! reportbug --attach /home/pi/npm-debug.log npm
npm ERR!
npm ERR! System Linux 4.1.6+
npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "install" "flower-power"
npm ERR! cwd /home/pi
npm ERR! node -v v0.6.19
npm ERR! npm -v 1.1.4
npm ERR! message failed to fetch from registry: flower-power
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR! /home/pi/npm-debug.log
npm not ok
Hat das schon mal jemand gehabt :(
Grusel. ::) node -v v0.6.19
haha was willst du mir damit sagen :D?
Aktuell ist stable 5.0
Bring mal dein Node auf eine akzeptable Version.
Sent from my iPhone using Tapatalk
ok nun hab ich die Version 5 drauf :)
wenn ich jetzt
sudo npm install flower-power
ausführe, kommt jedoch noch immer ein Fehler:
pi@raspberrypi ~ $ sudo npm install flower-power
npm WARN install Couldn't install optional dependency: Unsupported
> usb@1.1.0 install /home/pi/node_modules/usb
> node-pre-gyp install --fallback-to-build
gyp WARN EACCES user "root" does not have permission to access the dev dir "/root/.node-gyp/5.0.0"
gyp WARN EACCES attempting to reinstall using temporary dev dir "/home/pi/node_modules/usb/.node-gyp"
make: Entering directory '/home/pi/node_modules/usb/build'
make: *** No rule to make target '../.node-gyp/5.0.0/include/node/common.gypi', needed by 'Makefile'. Schluss.
make: Leaving directory '/home/pi/node_modules/usb/build'
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack at ChildProcess.onExit (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:270:23)
gyp ERR! stack at emitTwo (events.js:87:13)
gyp ERR! stack at ChildProcess.emit (events.js:172:7)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:200:12)
gyp ERR! System Linux 4.1.7+
gyp ERR! command "/usr/local/bin/node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "build" "--fallback-to-build" "--module=/home/pi/node_modules/usb/src/binding/usb_bindings.node" "--module_name=usb_bindings" "--module_path=/home/pi/node_modules/usb/src/binding"
gyp ERR! cwd /home/pi/node_modules/usb
gyp ERR! node -v v5.0.0
gyp ERR! node-gyp -v v3.0.3
gyp ERR! not ok
node-pre-gyp ERR! build error
node-pre-gyp ERR! stack Error: Failed to execute '/usr/local/bin/node /usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js build --fallback-to-build --module=/home/pi/node_modules/usb/src/binding/usb_bindings.node --module_name=usb_bindings --module_path=/home/pi/node_modules/usb/src/binding' (1)
node-pre-gyp ERR! stack at ChildProcess.<anonymous> (/home/pi/node_modules/usb/node_modules/node-pre-gyp/lib/util/compile.js:83:29)
node-pre-gyp ERR! stack at emitTwo (events.js:87:13)
node-pre-gyp ERR! stack at ChildProcess.emit (events.js:172:7)
node-pre-gyp ERR! stack at maybeClose (internal/child_process.js:818:16)
node-pre-gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:211:5)
node-pre-gyp ERR! System Linux 4.1.7+
node-pre-gyp ERR! command "/usr/local/bin/node" "/home/pi/node_modules/usb/node_modules/.bin/node-pre-gyp" "install" "--fallback-to-build"
node-pre-gyp ERR! cwd /home/pi/node_modules/usb
node-pre-gyp ERR! node -v v5.0.0
node-pre-gyp ERR! node-pre-gyp -v v0.6.4
node-pre-gyp ERR! not ok
Failed to execute '/usr/local/bin/node /usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js build --fallback-to-build --module=/home/pi/node_modules/usb/src/binding/usb_bindings.node --module_name=usb_bindings --module_path=/home/pi/node_modules/usb/src/binding' (1)
npm WARN install:usb usb@1.1.0 install: `node-pre-gyp install --fallback-to-build`
npm WARN install:usb Exit status 1
Woran kann das wieder liegen :(?
hat das keiner sonst gehabt?
ich würde das Paket node-gyp nochmal reinstallen...
hab ich probiert aber dann kommen nur noch mehr Fehler :(
sudo npm install flower-power
npm WARN optional dep failed, continuing xpc-connection@0.1.4
-
> usb@1.1.0 install /home/pi/node_modules/flower-power/node_modules/noble-device/node_modules/noble/node_modules/bluetooth-hci-socket/node_modules/usb
> node-pre-gyp install --fallback-to-build
gyp WARN EACCES user "root" does not have permission to access the dev dir "/root/.node-gyp/4.0.0"
gyp WARN EACCES attempting to reinstall using temporary dev dir "/home/pi/node_modules/flower-power/node_modules/noble-device/node_modules/noble/node_modules/bluetooth-hci-socket/node_modules/usb/.node-gyp"
make: Entering directory '/home/pi/node_modules/flower-power/node_modules/noble-device/node_modules/noble/node_modules/bluetooth-hci-socket/node_modules/usb/build'
make: *** No rule to make target '../.node-gyp/4.0.0/include/node/common.gypi', needed by 'Makefile'. Schluss.
make: Leaving directory '/home/pi/node_modules/flower-power/node_modules/noble-device/node_modules/noble/node_modules/bluetooth-hci-socket/node_modules/usb/build'
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack at ChildProcess.onExit (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:270:23)
gyp ERR! stack at emitTwo (events.js:87:13)
gyp ERR! stack at ChildProcess.emit (events.js:172:7)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:200:12)
gyp ERR! System Linux 4.1.7+
gyp ERR! command "/usr/local/bin/node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "build" "--fallback-to-build" "--module=/home/pi/node_modules/flower-power/node_modules/noble-device/node_modules/noble/node_modules/bluetooth-hci-socket/node_modules/usb/src/binding/usb_bindings.node" "--module_name=usb_bindings" "--module_path=/home/pi/node_modules/flower-power/node_modules/noble-device/node_modules/noble/node_modules/bluetooth-hci-socket/node_modules/usb/src/binding"
gyp ERR! cwd /home/pi/node_modules/flower-power/node_modules/noble-device/node_modules/noble/node_modules/bluetooth-hci-socket/node_modules/usb
gyp ERR! node -v v4.0.0
gyp ERR! node-gyp -v v3.0.1
gyp ERR! not ok
node-pre-gyp ERR! build error
node-pre-gyp ERR! stack Error: Failed to execute '/usr/local/bin/node /usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js build --fallback-to-build --module=/home/pi/node_modules/flower-power/node_modules/noble-device/node_modules/noble/node_modules/bluetooth-hci-socket/node_modules/usb/src/binding/usb_bindings.node --module_name=usb_bindings --module_path=/home/pi/node_modules/flower-power/node_modules/noble-device/node_modules/noble/node_modules/bluetooth-hci-socket/node_modules/usb/src/binding' (1)
node-pre-gyp ERR! stack at ChildProcess.<anonymous> (/home/pi/node_modules/flower-power/node_modules/noble-device/node_modules/noble/node_modules/bluetooth-hci-socket/node_modules/usb/node_modules/node-pre-gyp/lib/util/compile.js:83:29)
node-pre-gyp ERR! stack at emitTwo (events.js:87:13)
node-pre-gyp ERR! stack at ChildProcess.emit (events.js:172:7)
node-pre-gyp ERR! stack at maybeClose (internal/child_process.js:817:16)
node-pre-gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:211:5)
node-pre-gyp ERR! System Linux 4.1.7+
node-pre-gyp ERR! command "/usr/local/bin/node" "/home/pi/node_modules/flower-power/node_modules/noble-device/node_modules/noble/node_modules/bluetooth-hci-socket/node_modules/usb/node_modules/.bin/node-pre-gyp" "install" "--fallback-to-build"
node-pre-gyp ERR! cwd /home/pi/node_modules/flower-power/node_modules/noble-device/node_modules/noble/node_modules/bluetooth-hci-socket/node_modules/usb
node-pre-gyp ERR! node -v v4.0.0
node-pre-gyp ERR! node-pre-gyp -v v0.6.4
node-pre-gyp ERR! not ok
Failed to execute '/usr/local/bin/node /usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js build --fallback-to-build --module=/home/pi/node_modules/flower-power/node_modules/noble-device/node_modules/noble/node_modules/bluetooth-hci-socket/node_modules/usb/src/binding/usb_bindings.node --module_name=usb_bindings --module_path=/home/pi/node_modules/flower-power/node_modules/noble-device/node_modules/noble/node_modules/bluetooth-hci-socket/node_modules/usb/src/binding' (1)
npm WARN optional dep failed, continuing usb@1.1.0
> bluetooth-hci-socket@0.4.2 install /home/pi/node_modules/flower-power/node_modules/noble-device/node_modules/noble/node_modules/bluetooth-hci-socket
> node-gyp rebuild
Sieht für mich so aus, als ob node unsauber installiert ist, d.h. am Besten löschen und neu machen und unter einem user organisieren.
Ein sudo führt dazu, das die Module unter root installiert werden ohne sudo im jeweiligen User. Bei Dir scheint er das nicht mehr zusammen zu bekommen.
komisch ist, dass die Homebridge, welche ja auch so installiert wird und lauft, ganz normal funktioniert. Kann mir irgendwie nicht vorstellen, dass es an node liegt :(
Läuft bei euch die Installation durch?
unter https://forum.fhem.de/index.php/topic,56490.msg486160 findet man nun ein Modul, das die Daten aus der FlowerPower-Cloud holt
Hi,
anbei ein Python-Script, das den History-Buffer eines Sensors ausliest. Es wurde unter Linux entwickelt und auch auf einem Raspberry Pi getestet, benötigt bluez-5.37 oder höher und bluepy (https://github.com/IanHarvey/bluepy (https://github.com/IanHarvey/bluepy)).
Aufgerufen wird es mit der bluetooth-Adresse des Sensors so:
sudo python fp-download.py --addr a0:14:3d:07:d4:66
Bei erfolgreicher Verbindung mit dem Sensor (es kann vorkommen, dass das nicht auf Anhieb geht, dann einfach nochmal starten; Fehlerbehandlung komtm später) speichert es eine Datei wie im zweiten Anhang mit ein paar Informationen zum Sensor und der kompletten Messwerttabelle:
# History data collected by fp-download.py v1.0
# current time: 1473155082
# sensor time: 1141568
# calib: 0,208,21,65535,65535,122,767,1491,1431,216,685
# firmware: 2016-07-06_hawaii-2.0.2_hardware-config-MP
#
# 3,0,records=1269,lts=1141200,lidx=47348,sid=5,sp=900
#
0 0x8000 0x0005 0x0384 0x0000 0x0000 0x0000 32768 5 900 0 0 0
1 0x0272 0xaa1e 0x012f 0x02af 0x01d5 0x0359 626 43550 303 687 469 857
2 0x0281 0x7a2b 0x012d 0x02ab 0x01d4 0x0359 641 31275 301 683 468 857
Die Zeilen mit '#' an Anfang sind Kommentare; die vorletzte dieser Zeilen (# 3,0,0records..) ist bereits Bestandteil der History-Daten, die Bedeutung der einzelnen Felder war relativ leicht zuzuordnen. Bis auf die ersten beiden Bytes, hier vermute ich, dass '3' die Version der Datentabelle sein könnte. Um das zu prüfen, wäre es interessant, die Daten eines Sensors zu sehen, der noch nicht die neueste Firmware trägt. Oder hat jeder schon ein Update gemacht?
Die Bedeutung der eigentlichen Messdaten zu eruieren wäre der nächste Schritt. Dazu gibt es neben der Nummer des Eintrags (erste Spalte) die Hexwerte der Messdaten (6x16Byte, Spalten 2-7) und die jeweiligen Dezimal-Werte (Spalten 8-13). Eine Zeitachse in Sekunden ergibt sich übrigens durch Multiplikation der ersten Spalte mit der Session Period (sp=900). Der letzte Eintrag wurde zur Sensorzeit (sensor time) in Sekunden seit dem letzten Start erzeugt. Als Bezug dient mit "current time" die Systemzeit zum Zeitpunkt des Auslesens. Kurioserweise ist der erste Datensatz nach Start des Sensors völlig anders als alle weiteren und mit Ausnahme des zweiten Datums identisch für alle meine 8 Sensoren. Danach folgen 'echte' Messwerte.
Was die einzelnen Messwerte bedeuten, könnte sich recht einfach aus einem Vergleich mit den nicht-kalibrierten Life-Daten zeigen (der Lichtsensor meldet immer 0xffff wenn es dunkel ist und kleinere Werte mit steigender Helligkeit). Die Formeln für die Umrechnung in Real-Werte könnte etwas weniger trivial, aber durch Regressionsanalyse halbwegs machbar sein, wenn für einen physikalischen Wert nicht mehr als ein Datum und ggfls die Kalibrierwerte in die Formel eingehen. Für Temperaturwerte (Boden und Luft) mag das noch zutreffen, für die Bodenfeuchtigkeit und den Leitwert vielleicht nicht mehr so ganz, wie der Plot von Spalte 10 und 12 zeigt: Beide Kurven gehen grob mit der Bodenfeuchtigkeit, wobei die rote Kurve auch Charakterisitka des Temperaturverlaufs zu enthalten scheint. Vom Hersteller selbst ist zur korrekten Umrechnung keine Hilfe zu erwarten, hier wird nur auf den Cloud-Service verwiesen (http://forum.developer.parrot.com/t/origin-of-raw-temperature-conversion-formula/1395 (http://forum.developer.parrot.com/t/origin-of-raw-temperature-conversion-formula/1395)).
Hat jemand Lust, hier mitzumachen, oder zumindest ein paar Daten beizusteuern (gerne auch per PN)? Interessant wäre wie gesagt erst einml zu sehen, wie die History-Daten bei einer älteren Firmware Version aussehen und was es mit dem ersten Eintrag auf sich hat. Demnächst wird noch ein Script folgen, um zu den Sensordaten die passenden Daten aus der Cloud-API auszulesen.
Beste Grüße,
Andy.
Edit: Script-Dateianhang gelöscht, aktuelle Version befindet sich auf https://github.com/gandy92/pyflowerpower (https://github.com/gandy92/pyflowerpower)
Hallo ich habe mir auch einen Flower Power Pflanzensensor zugelegt.
Fhem lauf bei mir auf einem rasberry pi3 .
Ich würde gerne mit dem rasberry die live Daten des Pflanzensensors logen. Funktioniert dies schon oder kann ich nur auf die cloud zugreifen?
kennt jemand dieses Projekt ? Hier müssen die Livedaten ja auch vom rasberry erfasst werden
https://github.com/Parrot-Developers/node-flower-bridge
Zitat von: emilio20 am 29 Dezember 2016, 12:54:09
Hallo ich habe mir auch einen Flower Power Pflanzensensor zugelegt.
Fhem lauf bei mir auf einem rasberry pi3 .
Ich würde gerne mit dem rasberry die live Daten des Pflanzensensors logen. Funktioniert dies schon oder kann ich nur auf die cloud zugreifen?
kennt jemand dieses Projekt ? Hier müssen die Livedaten ja auch vom rasberry erfasst werden
https://github.com/Parrot-Developers/node-flower-bridge
Das ging mal eine ganze Weile recht gut in Kombination von node-flower-bridge (damit scannte mein pi immer meine Pflanzen und pushte die Daten in die Cloud) sowie FlowerPowerTools, mit dem ich dann die Daten aus der Cloud mittels cronjob wieder aus der Cloud ausgelesen und in ein CSV gepumpt habe.
Leider hat Parrot vor einigen Monaten die API, Firmware und Software grundsätzlich geändert und dann ging quasi nix mehr. Es gab dann von dem node-flower-bridge eine V2 Version, welche aber ebenfalls seit nem guten Jahr nicht mehr weiterentwickelt wurde, mit der ging es wenigstens wieder nen kleines bisschen. Sie haben auch beim Parrot-Support gestanden, das sie momentan Probleme haben mit mehr als einem Sensor und überhaupt, aber das sie "energisch dran seien" das zu fixen. Das ist nun glaub 4 Monate her und es hat sich nichts getan. Daher werde ich meine FlowerPower-Sensoren in naher Zukunft wegschmeissen und durch z.B. die "xiaomi flower monitor" ersetzen, falls die mal irgendwo in annehmbarer Zeit lieferbar sind.
Gruss,
Hive
Nachdem ich mich einige Zeit mit irgendwelchen Bridges und anderem Zeugs rumgeschlagen habe und alles nur halblebig funktioniert, habe ich mal ein kleines Perl Script gebastelt, das die Daten direkt auslesen kann. Das sind wenige zeilen Code, die gern als Grundlage für ein FHEM Modul dienen können.
Schaut es euch doch mal bitte an und sagt mir, ob es bei euch funktioniert. Die komischen Formeln im Code habe ich von den Git Sourcen der Parrot Entwickler. Warum oder weshalb die so ausehen müssen, entzieht sich meiner Kenntnis. Am genauesten scheinen mir die Calibrated Werte zu sein (macht irgendwie auch Sinn). Leider sind bei meinem Sensor nur 3 der ansonsten 6 Werte auslesbar. Vielleicht gibts andere Sensoren die alle Werte haben. Außerdem ist das hier verwendete Gatttool auf 20 Byte Daten beschränkt. Die Firmware und Hardware Version wird deshalb nur teilweise angezeigt. Vielleicht hat dazu noch jemand eine Idee?
1.) Damit das Ganze funktioniert muss Bluez z.B. auf eurem Raspberry installiert sein und ordnungsgemäß funktionieren!
2.) Weiterhin müsst ihr im Script die Mac Adresse für euren Parrot Flower Power Sensor eintragen!
3.) Denkt bitte daran, dass das Script ausführbar sein muss (chmod +x ...).
Der Output sieht bei mir dann so aus:
Name: Flower power 43F8
System ID: f8438400003d14a0
Serial Number: PI040297AD5I204905
Firmware Revision: 2016-09-14_hawaii-2
Hardware Revision: 2013-07-26_hawaiiPr
Color: 4
Battery Level: 95
Calibrated Soil Moisture: 40.7666854858398
Calibrated Air Temperature: 18.6852474212646
Calibrated Sunlight: 0.100000001490116
Calibrated EA: 0
Calibrated ECB: 0
Calibrated EC Porous: 0
Sunlight: 0.129691229016778
Soil Electrical Conductivity: 3.87916431394692
Soil Temperature: 19.364238285
Air Temperature: 17.74524974592
Soil Moisture: 29.5134248813477
#!/usr/bin/perl
use strict;
use warnings;
sub readSensorValue($$);
sub convertStringToFloat($);
sub convertStringToU8($);
sub convertStringToU16($);
sub convertHexToString($);
my $mac = "AA:BB:CC:DD:EE:FF";
my $result;
# Name
$result = readSensorValue($mac, "00002a00-0000-1000-8000-00805f9b34fb");
print "Name: ".convertHexToString($result)."\n";
# Device Name
#$result = readSensorValue($mac, "39e1fe03-84a8-11e2-afba-0002a5d5c51b");
#print "Device Name: ".convertHexToString(substr($result, 0, -4))."\n";
# System ID
$result = readSensorValue($mac, "00002a23-0000-1000-8000-00805f9b34fb");
print "System ID: ".$result."\n";
# Serial Number
$result = readSensorValue($mac, "00002a25-0000-1000-8000-00805f9b34fb");
print "Serial Number: ".convertHexToString($result)."\n";
# Firmware Revision (gatttool is limited to 20 bytes of data)
$result = readSensorValue($mac, "00002a26-0000-1000-8000-00805f9b34fb");
print "Firmware Revision: ".convertHexToString($result)."\n";
# Hardware Revision (gatttool is limited to 20 bytes of data)
$result = readSensorValue($mac, "00002a27-0000-1000-8000-00805f9b34fb");
print "Hardware Revision: ".convertHexToString($result)."\n";
# Color
$result = readSensorValue($mac, "39e1fe04-84a8-11e2-afba-0002a5d5c51b");
print "Color: ".convertStringToU16($result)."\n";
# Battery Level in %
$result = readSensorValue($mac, "00002a19-0000-1000-8000-00805f9b34fb");
print "Battery Level: ".convertStringToU8($result)."\n";
# Calibrated Soil Moisture in %
$result = readSensorValue($mac, "39e1fa09-84a8-11e2-afba-0002a5d5c51b");
print "Calibrated Soil Moisture: ".convertStringToFloat($result)."\n";
# Calibrated Air Temperature in °C
$result = readSensorValue($mac, "39e1fa0a-84a8-11e2-afba-0002a5d5c51b");
print "Calibrated Air Temperature: ".convertStringToFloat($result)."\n";
# Calibrated Sunlight in mol/m^2
$result = readSensorValue($mac, "39e1fa0b-84a8-11e2-afba-0002a5d5c51b");
print "Calibrated Sunlight: ".convertStringToFloat($result)."\n";
# Calibrated EA (not available?)
$result = readSensorValue($mac, "39e1fa0c-84a8-11e2-afba-0002a5d5c51b");
print "Calibrated EA: ".convertStringToFloat($result)."\n";
# Calibrated ECB in dS/m (not available?)
$result = readSensorValue($mac, "39e1fa0d-84a8-11e2-afba-0002a5d5c51b");
print "Calibrated ECB: ".convertStringToFloat($result)."\n";
# Calibrated EC Porous in dS/m (not available?)
$result = readSensorValue($mac, "39e1fa0e-84a8-11e2-afba-0002a5d5c51b");
print "Calibrated EC Porous: ".convertStringToFloat($result)."\n";
# reference: https://github.com/Parrot-Developers/node-flower-power/blob/master/index.js
# reference: FlowerPower-BLE.pdf
# Sunlight in mol/m^2
$result = readSensorValue($mac, "39e1fa01-84a8-11e2-afba-0002a5d5c51b");
$result = 0.08640000000000001 * (192773.17000000001 * (convertStringToU16($result) ** -1.0606619));
print "Sunlight: ".$result."\n";
# Soil Electrical Conductivity in dS/m
$result = readSensorValue($mac, "39e1fa02-84a8-11e2-afba-0002a5d5c51b");
$result = (convertStringToU16($result) * 10.0) / 1771.0;
print "Soil Electrical Conductivity: ".$result."\n";
# Soil Temperature in °C
$result = readSensorValue($mac, "39e1fa03-84a8-11e2-afba-0002a5d5c51b");
$_ = convertStringToU16($result) * 1.0;
$result = (0.00000003044 * ($_ ** 3.0)) - (0.00008038 * ($_ ** 2.0)) + ($_ * 0.1149) - 30.449999999999999;
if ($result < -10.0)
{
$result = -10.0;
}
elsif ($result > 55.0)
{
$result = 55.0;
}
print "Soil Temperature: ".$result."\n";
# Air Temperature in °C
$result = readSensorValue($mac, "39e1fa04-84a8-11e2-afba-0002a5d5c51b");
$_ = convertStringToU16($result) * 1.0;
$result = (0.00000003044 * ($_ ** 3.0)) - (0.00008038 * ($_ ** 2.0)) + ($_ * 0.1149) - 30.449999999999999;
if ($result < -10.0)
{
$result = -10.0;
}
elsif ($result > 55.0)
{
$result = 55.0;
}
print "Air Temperature: ".$result."\n";
# Soil Moisture in % (seems to be incorrect)
$result = readSensorValue($mac, "39e1fa05-84a8-11e2-afba-0002a5d5c51b");
$_ = convertStringToU16($result) * 1.0;
$result = 11.4293 + ((0.0000000010698 * $_**4.0) - (0.00000152538 * $_**3.0) + (0.000866976 * $_**2.0) - (0.169422 * $_));
$result = 100.0 * ((0.0000045 * $result**3.0) - (0.00055 * $result**2.0) + (0.0292 * $result) - 0.053);
if ($result < 0.0)
{
$result = 0.0;
}
elsif ($result > 60.0)
{
$result = 60.0;
}
print "Soil Moisture: ".$result."\n";
sub readSensorValue($$)
{
my $mac = shift;
my $uuid = shift;
my @result;
my $repeatCounter = 0;
do
{
# try to read the value from sensor
@result = split(": ", qx(gatttool -b $mac --char-read --uuid=$uuid 2>/dev/null));
$repeatCounter++;
}
while (($repeatCounter < 10) && (not defined($result[0])));
if (defined($result[0]))
{
# remove spaces
$result[2] =~ s/\s//g;
return $result[2];
}
else
{
# return 0 in case of an error
return "0";
}
}
sub convertStringToFloat($)
{
$_ = shift;
# switch endianess of string
$_ = unpack("H*", reverse(pack("H*", $_)));
# convert string to float
return unpack("f", pack("L", hex($_)));
}
sub convertStringToU8($)
{
$_ = shift;
# convert string to U8
return hex($_);
}
sub convertStringToU16($)
{
$_ = shift;
# switch endianess of string
$_ = unpack("H*", reverse(pack("H*", $_)));
# convert string to U16
return hex($_);
}
sub convertHexToString($)
{
$_ = shift;
# convert hex string into string
return pack("H*", $_);
}
Das scheint ein und die selbe uuid zu sein. Kann mir da einer den char für geben. Ist irgendwie Recht viel Code um ein paar Werte aus dem Hex Telegramm zu bekommen.
Nein das sind immer andere oder übersehe ich da etwas? Ist leider nicht so einfach wie beim Xiaomi Sensor, bei dem in einer Antwort alle Werte hintereinander stehen. Die Doku von Parrot findest du hier. Gibt aber ehrlich gesagt nicht viel her. Andere Anhaltspunkte bietet die Bridge von Parrot. Die Berechnungen daraus habe ich Beispielsweise übernommen.
https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=0ahUKEwjclMf989bRAhWCHxoKHatEB4IQFggaMAA&url=http%3A%2F%2Fdeveloper.parrot.com%2Fdocs%2FFlowerPower%2FFlowerPower-BLE.pdf&usg=AFQjCNHHPSPY-9n7gJDPUixOVj_nh-Q6Qw&sig2=N2071_Mxl2OY4qj61laiVg&bvm=bv.144686652,d.d2s (https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=0ahUKEwjclMf989bRAhWCHxoKHatEB4IQFggaMAA&url=http%3A%2F%2Fdeveloper.parrot.com%2Fdocs%2FFlowerPower%2FFlowerPower-BLE.pdf&usg=AFQjCNHHPSPY-9n7gJDPUixOVj_nh-Q6Qw&sig2=N2071_Mxl2OY4qj61laiVg&bvm=bv.144686652,d.d2s)
Mist hast Recht. Habe eben erst den Anfang mir mal genau angeschaut.
Das sind dann aber ne Menge Anfragen, die arme Batterie :)
@mumpitzstuff
Danke für da Script. Ich habe es bei mir mal laufen gelassen mit einem meiner Sensoren, aber die Ergebnisse sind ... hmm ... seltsam. Zum einen kommt kaum was zurück an Daten, zum anderen ist die Ausgabe bei jedem Aufruf etwas anders. Manchmal sind es ein paar mehr Infos, manchmal weniger.
Name: Flower power A70F
System ID: 466c6f77657220706f7765722041373046
Serial Number: ?
=?
Firmware Revision: PI040307AA4C024330
Hardware Revision:
Color: 0
Battery Level: 0
Calibrated Soil Moisture: 0
Calibrated Air Temperature: 0
Calibrated Sunlight: 0
Calibrated EA: 0
Calibrated ECB: 0
Calibrated EC Porous: 0
Sunlight: inf
Soil Electrical Conductivity: 0
Soil Temperature: -10
Air Temperature: -10
Soil Moisture: 21.5608151743303
dann mal:
Name: Flower power A70F
System ID: 0
Serial Number:
Firmware Revision:
Hardware Revision:
Color: 0
Battery Level: 0
Calibrated Soil Moisture: 0
Calibrated Air Temperature: 0
Calibrated Sunlight: 0
Calibrated EA: 0
Calibrated ECB: 0
Calibrated EC Porous: 0
Sunlight: inf
Soil Electrical Conductivity: 0
Soil Temperature: -10
Air Temperature: -10
Soil Moisture: 21.5608151743303
oder:
Name:
System ID: 0
Serial Number:
Firmware Revision:
Hardware Revision:
Color: 0
Battery Level: 0
Calibrated Soil Moisture: 0
Calibrated Air Temperature: 0
Calibrated Sunlight: 0
Calibrated EA: 0
Calibrated ECB: 0
Was könnte das sein?
Danke und Gruss,
Hive
0 wird normalerweise zurück gegeben, wenn irgend etwas schief läuft und das Script es nach 10 Versuchen es nicht schafft den entsprechenden Wert zu lesen. Leg mal den Sensor relativ nahe an deinen Bluetooth Dongle und probier mal folgendes:
Such mal im Skript nach: 2>/dev/null
Und entferne den Teil.
Danach solltest du die Fehlermeldungen vom Gatttool sehen.
Ansonsten hier eine Version mit mehr Debugausgaben:
#!/usr/bin/perl
use strict;
use warnings;
sub readSensorValue($$);
sub convertStringToFloat($);
sub convertStringToU8($);
sub convertStringToU16($);
sub convertHexToString($);
my $mac = "AA:BB:CC:DD:EE:FF";
my $result;
# Name
$result = readSensorValue($mac, "00002a00-0000-1000-8000-00805f9b34fb");
print "Name (raw): ".$result."\n";
print "Name: ".convertHexToString($result)."\n";
# Device Name
#$result = readSensorValue($mac, "39e1fe03-84a8-11e2-afba-0002a5d5c51b");
#print "Device Name: ".convertHexToString(substr($result, 0, -4))."\n";
# System ID
$result = readSensorValue($mac, "00002a23-0000-1000-8000-00805f9b34fb");
print "System ID (raw): ".$result."\n";
print "System ID: ".$result."\n";
# Serial Number
$result = readSensorValue($mac, "00002a25-0000-1000-8000-00805f9b34fb");
print "Serial Number (raw): ".$result."\n";
print "Serial Number: ".convertHexToString($result)."\n";
# Firmware Revision (gatttool is limited to 20 bytes of data)
$result = readSensorValue($mac, "00002a26-0000-1000-8000-00805f9b34fb");
print "Firmware Revision (raw): ".$result."\n";
print "Firmware Revision: ".convertHexToString($result)."\n";
# Hardware Revision (gatttool is limited to 20 bytes of data)
$result = readSensorValue($mac, "00002a27-0000-1000-8000-00805f9b34fb");
print "Hardware Revision (raw): ".$result."\n";
print "Hardware Revision: ".convertHexToString($result)."\n";
# Color
$result = readSensorValue($mac, "39e1fe04-84a8-11e2-afba-0002a5d5c51b");
print "Color (raw): ".$result."\n";
print "Color: ".convertStringToU16($result)."\n";
# Battery Level in %
$result = readSensorValue($mac, "00002a19-0000-1000-8000-00805f9b34fb");
print "Battery Level (raw): ".$result."\n";
print "Battery Level: ".convertStringToU8($result)."\n";
# Calibrated Soil Moisture in %
$result = readSensorValue($mac, "39e1fa09-84a8-11e2-afba-0002a5d5c51b");
print "Calibrated Soil Moisture (raw): ".$result."\n";
print "Calibrated Soil Moisture: ".convertStringToFloat($result)."\n";
# Calibrated Air Temperature in °C
$result = readSensorValue($mac, "39e1fa0a-84a8-11e2-afba-0002a5d5c51b");
print "Calibrated Air Temperature (raw): ".$result."\n";
print "Calibrated Air Temperature: ".convertStringToFloat($result)."\n";
# Calibrated Sunlight in mol/m^2
$result = readSensorValue($mac, "39e1fa0b-84a8-11e2-afba-0002a5d5c51b");
print "Calibrated Sunlight (raw): ".$result."\n";
print "Calibrated Sunlight: ".convertStringToFloat($result)."\n";
# Calibrated EA (not available?)
$result = readSensorValue($mac, "39e1fa0c-84a8-11e2-afba-0002a5d5c51b");
print "Calibrated EA (raw): ".$result."\n";
print "Calibrated EA: ".convertStringToFloat($result)."\n";
# Calibrated ECB in dS/m (not available?)
$result = readSensorValue($mac, "39e1fa0d-84a8-11e2-afba-0002a5d5c51b");
print "Calibrated ECB (raw): ".$result."\n";
print "Calibrated ECB: ".convertStringToFloat($result)."\n";
# Calibrated EC Porous in dS/m (not available?)
$result = readSensorValue($mac, "39e1fa0e-84a8-11e2-afba-0002a5d5c51b");
print "Calibrated EC Porous (raw): ".$result."\n";
print "Calibrated EC Porous: ".convertStringToFloat($result)."\n";
# reference: https://github.com/Parrot-Developers/node-flower-power/blob/master/index.js
# reference: FlowerPower-BLE.pdf
# Sunlight in mol/m^2
$result = readSensorValue($mac, "39e1fa01-84a8-11e2-afba-0002a5d5c51b");
print "Sunlight (raw): ".$result."\n";
$result = 0.08640000000000001 * (192773.17000000001 * (convertStringToU16($result) ** -1.0606619));
print "Sunlight: ".$result."\n";
# Soil Electrical Conductivity in dS/m
$result = readSensorValue($mac, "39e1fa02-84a8-11e2-afba-0002a5d5c51b");
print "Soil Electrical Conductivity (raw): ".$result."\n";
$result = (convertStringToU16($result) * 10.0) / 1771.0;
print "Soil Electrical Conductivity: ".$result."\n";
# Soil Temperature in °C
$result = readSensorValue($mac, "39e1fa03-84a8-11e2-afba-0002a5d5c51b");
print "Soil Temperature (raw): ".$result."\n";
$_ = convertStringToU16($result) * 1.0;
$result = (0.00000003044 * ($_ ** 3.0)) - (0.00008038 * ($_ ** 2.0)) + ($_ * 0.1149) - 30.449999999999999;
if ($result < -10.0)
{
$result = -10.0;
}
elsif ($result > 55.0)
{
$result = 55.0;
}
print "Soil Temperature: ".$result."\n";
# Air Temperature in °C
$result = readSensorValue($mac, "39e1fa04-84a8-11e2-afba-0002a5d5c51b");
print "Air Temperature (raw): ".$result."\n";
$_ = convertStringToU16($result) * 1.0;
$result = (0.00000003044 * ($_ ** 3.0)) - (0.00008038 * ($_ ** 2.0)) + ($_ * 0.1149) - 30.449999999999999;
if ($result < -10.0)
{
$result = -10.0;
}
elsif ($result > 55.0)
{
$result = 55.0;
}
print "Air Temperature: ".$result."\n";
# Soil Moisture in % (seems to be incorrect)
$result = readSensorValue($mac, "39e1fa05-84a8-11e2-afba-0002a5d5c51b");
print "Soil Moisture (raw): ".$result."\n";
$_ = convertStringToU16($result) * 1.0;
$result = 11.4293 + ((0.0000000010698 * $_**4.0) - (0.00000152538 * $_**3.0) + (0.000866976 * $_**2.0) - (0.169422 * $_));
$result = 100.0 * ((0.0000045 * $result**3.0) - (0.00055 * $result**2.0) + (0.0292 * $result) - 0.053);
if ($result < 0.0)
{
$result = 0.0;
}
elsif ($result > 60.0)
{
$result = 60.0;
}
print "Soil Moisture: ".$result."\n";
sub readSensorValue($$)
{
my $mac = shift;
my $uuid = shift;
my @result;
my $repeatCounter = 0;
do
{
# try to read the value from sensor
@result = split(": ", qx(gatttool -b $mac --char-read --uuid=$uuid));
$repeatCounter++;
}
while (($repeatCounter < 10) && (not defined($result[0])));
if (defined($result[0]))
{
# remove spaces
$result[2] =~ s/\s//g;
return $result[2];
}
else
{
print "Error: max retries reached (return 0)\n";
# return 0 in case of an error
return "0";
}
}
sub convertStringToFloat($)
{
$_ = shift;
# switch endianess of string
$_ = unpack("H*", reverse(pack("H*", $_)));
# convert string to float
return unpack("f", pack("L", hex($_)));
}
sub convertStringToU8($)
{
$_ = shift;
# convert string to U8
return hex($_);
}
sub convertStringToU16($)
{
$_ = shift;
# switch endianess of string
$_ = unpack("H*", reverse(pack("H*", $_)));
# convert string to U16
return hex($_);
}
sub convertHexToString($)
{
$_ = shift;
# convert hex string into string
return pack("H*", $_);
}
Die Ausgabe ist dann bei mir wie folgt:
Name (raw): 466c6f77657220706f7765722034334638
Name: Flower power 43F8
System ID (raw): f8438400003d14a0
System ID: f8438400003d14a0
Serial Number (raw): 50493034303239374144354932303439303500
Serial Number: PI040297AD5I204905
Firmware Revision (raw): 323031362d30392d31345f6861776169692d32
Firmware Revision: 2016-09-14_hawaii-2
Hardware Revision (raw): 323031332d30372d32365f6861776169695072
Hardware Revision: 2013-07-26_hawaiiPr
Color (raw): 0400
Color: 4
Battery Level (raw): 5a
Battery Level: 90
Calibrated Soil Moisture (raw): c4803f42
Calibrated Soil Moisture: 47.8757476806641
Calibrated Air Temperature (raw): 9f979c41
Calibrated Air Temperature: 19.5740337371826
Calibrated Sunlight (raw): cdcccc3d
Calibrated Sunlight: 0.100000001490116
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Error: max retries reached (return 0)
Calibrated EA (raw): 0
Calibrated EA: 0
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Error: max retries reached (return 0)
Calibrated ECB (raw): 0
Calibrated ECB: 0
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Read characteristics by UUID failed: No attribute found within the given range
Error: max retries reached (return 0)
Calibrated EC Porous (raw): 0
Calibrated EC Porous: 0
Sunlight (raw): ffff
Sunlight: 0.129691229016778
Soil Electrical Conductivity (raw): 1805
Soil Electrical Conductivity: 7.3630717108978
Soil Temperature (raw): aa02
Soil Temperature: 20.18114432992
Air Temperature (raw): 8a02
Air Temperature: 18.634035
Soil Moisture (raw): fa01
Soil Moisture: 34.9378398850164
Ich habe auch noch mal etwas recherchiert. Es ist leider tatsächlich so, dass man nur die Calibrated Werte verwenden kann, weil diese direkt den Werten in der App entsprechen. Alle anderen Werte werden erst auf dem Server umgerechnet. Parrot macht aus dem Wie leider ein Geheimnis, so dass man hier nur irgendwelche Berechnungen im Web findet, die sich jemand aus den Fingern gesogen hat und deshalb relativ ungenau sein dürften. Übrig bleiben deshalb nur:
Batterie
Feuchtigkeit
Licht
Lufttemperatur
und noch ein paar andere unwichtige wie Name, Firmware, Farbe usw.
Den Düngergehalt zum Beispiel bekommt man nur als Raw Wert. Und da niemand die Formel zur Umrechnung kennt, ist der relativ nutzlos. Vielleicht gibt es aber auch neuere Sensoren als meinen, die den Düngergehalt auch als Calibrated Wert abgelegt haben. Laut Parrot Doku soll es das geben, nur mein Sensor spuckt da nix aus.
Zitat von: CoolTux am 23 Januar 2017, 04:36:49
Mist hast Recht. Habe eben erst den Anfang mir mal genau angeschaut.
Das sind dann aber ne Menge Anfragen, die arme Batterie :)
Die Daten einzeln aus den Characteristics zu lesen ist in der Tat nicht sehr höflich ggü der Batterie ;D Parrot sieht dafür den
History Service vor, über den man alle seit dem letzten Auslesen im viertelstunden Takt angefallenen Messdaten beschaffen kann. In den Advertising Daten kann man sogar sehen, ob überhaupt neue Daten hinzugekommen sind, was die Sache noch batterieschonender gestaltet.
Das Problem dabei wie auch mumpitzstuff schreibt: Die Daten liegen in der History im Rohformat vor und sind nicht wie die Life-Daten in physikalische Größen umgerechnet. Das Format ist nicht dokumentiert, entsprechende Anfragen im Parrot-Forum wurden bislang geblockt. Für eine Umrechnung der Rohdaten muss also ein wenig Reverse Engineering herhalten.
Dazu habe ich auf Github mit https://github.com/gandy92/pyflowerpower (https://github.com/gandy92/pyflowerpower) ein paar Python-Scripten eingestellt, um mit den Flower Power Sensoren ein wenig spielen zu können. Auslesen des History Buffers funktioniert und auch die Datenstruktur ist schon gut verstanden. Für den Reverse-Engineering Teil gibt es ein Script, das die Rohdaten mit den umgerechneten Sensordaten aus der Cloud anreichert (alte und neue API).
Dadurch lassen sich leicht die umgerechneten Daten gegen Rohdaten plotten und für einfache 1:1 Relationen konnte ich auch geeignete Funktionen finden (Temperatur, Licht und Batterie). Wie Bodenfeuchtigkeit und Düngergehalt zu berechnen sind, ist im Moment noch unklar, aber vielleicht findet sich jemand, der hier mithelfen kann. Wenn uns das gelingt, steht einer batterieschonenden Cloud-freien Lösung für FHEM nichts im Weg.
Grüße,
Andy.
Wow interessant. Das hatte ich noch nicht gefunden bei meiner Suche...
Grundsätzlich ist es richtig, dass es Batterieschonender ist die History Werte auszulesen, wenn man wirklich alle Werte haben möchte. Aber mal ganz ehrlich, brauche ich von einem Pflanzensensor alle 15min Werte? Hinzu kommt, dass ich die Daten ebenfalls scheibchenweise in 20Byte Blöcken runterladen muss bzw. den Protokolloverhead mitschleppe. Mir persönlich würde es ausreichen 3-4x am Tag die Werte zu erhalten und dann relativiert sich der Batterieverbrauch glaube ich wieder. Weiterhin würde ich lieber auf die kalibrierten Werte setzen, da diese wirklich richtig sind. Aus den Rohwerten die richtigen Werte rauslesen zu wollen, würde bedeuten, dass man die gesamte Skala aller Werte schrittweise abfahren müsste, was nicht unbedingt einfach ist. Hinzu kommt, dass die Sensoren mit hoher Wahrscheinlichkeit kalibriert sind. Solange man diese Werte nicht kennt, ist jede Berechnung sinnlos (siehe dazu die UUID: FE01 (calibration service)).
Wenn man sich beim Auslesen auf 4 Werte beschränkt (batterie, licht (fragwürdig ob man das braucht in der wohnung, das sind eh mondwerte...), feuchtigkeit, temperatur), dann ist der Aufwand ebenfalls überschaubar. Man könnte weiterhin verschiedene Intervalle definieren, um den Aufwand weiterhin zu senken.
Konntest Du bei Deiner Suche nicht finden, hab das erst gestern auf Github eingestellt, nachdem ich endlich den Zugriff auf den neuen Cloud-Dienst eingebaut habe.
Sicher, die Anforderungen und Vorstellungen unterscheiden sich von User zu User. Ich für meinen Teil finde die 1/4-stündliche Samplingrate nicht so schlecht und der Sensor nimmt die Daten ohnehin, warum sie also nicht auslesen und weiterverarbeiten. Wenn z.B. in den ersten 2-3 Stunden nach dem Gießen die gemessene Bodenfeuchtigkeit nicht wieder deutlich abnimmt, deutet das auf Staunässe hin, manche Pflanzen wollen dann schnelle Hilfe. Kurzum, ich will den vollen Funktionsumfang der Sensoren nutzen können, dazu gehören die History-Daten.
Aktuell lese ich die wie viele andere auch per cloud-bridge aus, die sie dann umgehend in die Cloud pumpt. Von Cloud-Diensten möchte ich aber aus verschiedenen Gründen unabhängig sein, hierher kommt der Wunsch, die History-Daten selbst konvertieren zu können.
Der Calibration Service hat mich zunächst auch schwer beeindruckt, bis ich gesehen habe, dass der alte Cloud-Dienst die Temperatur-Werte für alle Sensoren schon mal identisch umrechnet. Ob das auch der neue Cloud-Service so macht, habe ich mir noch nicht angesehen. Zumindest in den ersten Wochen lieferte der ja z.T. andere Werte als der Alte, den ich immer noch parallel mit Daten füttere. Für die Umrechnung des Lichtwertes hingegen wird eine sensortypischer Kalibrierwert benötigt, der sich aber bequem einmalig aus den Life-Daten des betreffenden Sensors berechnen lässt, ohne die Werte aus dem Calibration Service verstanden haben zu müssen.
In dem Skript von mir sind für die Temperaturen und auch Licht Formeln hinterlegt, die bereits im Netz rum schwirren und auch relativ gut die Werte aus der Cloud treffen. Die beiden entscheidenden Werte wie Feuchtigkeit und Dünger liefern allerdings Mondwerte. Die Formel die ich im Netz gefunden habe stimmt bei mir gar nicht. Um wirklich verwertbare Werte zu bekommen, bräuchte man mind. 2 Sensoren in einem Topf ohne Pflanze, den man mit Folie umwickelt und dann alle 15 min. ein wenig Wasser zuführt und den Rohwert und den Wert aus der Cloud ermittelt (liefert die Cloud Nachkommawerte, welche die App nur nicht anzeigt?). Um genügend Werte zu bekommen sitzt man dann aber etliche Stunden vor dem Topf. Wenn man die beiden Sensoren miteinander vergleicht, findet man vielleicht auch den richtigen Kalibrierwert raus. Beim Dünger wirds dann noch komplizierter. Hier muss man, wenn man der Literatur trauen kann, alles auf 25 Grad normieren. Schätzungsweise geht auch noch die Feuchtigkeit mit ein. Keine Ahnung wie man das ermitteln soll.
Mir fällt auch grad ein, dass es auch interessant wäre die Werte zu ermitteln wenn sich der Sensor nicht in der Erde befindet, also vollkommen trocken ist. Vielleicht erhält man dann ja die kalibrierwerte direkt. Ach und bei der Feuchtigkeit hat man ja noch den kalibrierten wert. Wenn man den kalibrierten und unkalibrierten wert in einer Schleife ausließt und den Sensor mit extrem langsamen Bewegungen im Wasser unterschiedlich eintaucht, müsste man die Kurve ebenfalls nachstellen können (hoffe der Sensor misst kapazitiv)
Ich hab zwar extrem wenig Zeit aber ich versuche mal mit so wenig Readings wie möglich ein fhem Modul zu machen (wird noch etwas dauern) und dann schaue ich mir den Batteriverbrauch mal genau an.
Zwischenzeitlich habe ich mal die historischen Daten meiner 8 Sensoren verglichen: Die Daten, die jeweils vom alten und vom neuen Cloud-Dienst ausgeliefert werden, stimmen bis auf einen minimalen Unterschied überein.
Demgegenüber weichen sie aber deutlich von den historischen Daten ab, die in der App angezeigt werden, und auch von den Life-Daten. So bekomme ich zB für die Bodenfeuchte eines der Sensoren:
- 26.8% vom Cloud-Server (historische Daten)
- 32.7% vom Life Service (Sensor, Calibrated VWC)
- 33% in der App (aktueller Wert)
- 33.8% in der App (Datenplot aus historischen Daten vom Server)
Augenscheinlich nimmt hier die App nochmal eine Umrechnung der in der Cloud gespeicherten Werte vor, kommt aber nicht auf die gleichen 'kalibrierten' Werte wie der Sensor selbst.
Zwei meiner Sensoren stecken seit einiger Zeit dicht nebeneinander im selben Topf, die Cloud-Daten der beiden zeigen aber unterschiedliche Werte für Temperatur und Bodenfeuchtigkeit. Im nächsten Schritt versuche ich, die Life-Daten und die App-Daten miteinander zu vergleichen.
Ich vermute, dass der erste Wert der Rohwert ist, ohne die Calibrierung des Sensors mit einzubeziehen. Der aktuelle Wert wird wahrscheinlich einfach gerundet. Warum der Datenplot anders ist verstehe ich allerdings auch nicht. Es könnte höchstens sein, dass der Zeitpunkt der Messung anders war, da die historischen Werte ja in einem bestimmten Zeitraster aufgezeichnet werden. Beim Life Service springt bei mir die Anzeige auch manchmal um 1-2 Prozent in der App hin und her.
Sind bei den beiden Sensoren die nebeneinander stehen nur die Cloud Werte anders und die Werte vom Life Service ähnlich? Wenn ja, dann werden tatsächlich die unkalibrierten Werte in der Cloud hinterlegt.
Hallo,
ich habe das Ganze mal in eine erste Version eines fhem Moduls gegossen. Ich muss darauf hinweisen, dass noch einige Fehler enthalten sein können. Ich habe bisher nur das Anlegen des Devices und das Verändern des Intervalls getestet. Ich würde mich freuen, wenn das der ein oder andere mal testen könnte:
https://github.com/mumpitzstuff/fhem-ParrotFlowerPower (https://github.com/mumpitzstuff/fhem-ParrotFlowerPower)
Wenn es Fehler oder Probleme gibt, dann könnt ihr im Device das Attribut verbose auf 5 setzen und dann im Logfile nachvollziehen, was genau innerhalb des Moduls passiert.
Viel Spaß.
Hallo
ich habe einen Flower Power Sensor und möchte diesen gerne in Fhem einbinden.
Kannst du mir kurz erklären wie ich das machen muss ? Dann könnte ich dein Modul testen
Steht unten im Script drin...
1.) Skript auf den Rechner holen z.b. mit wget oder clonen mit git.
2.) Skript nach /opt/fhem/FHEM kopieren und mit chown fhem:dialout <file> dem entsprechenden User zuweisen.
3.) device anlegen: define <name> ParrotFlowerPower <mac des Sensors>
4.) Wenn du die Mac Adresse des Sensors nicht kennst, vorher "sudo hcitool lescan" eingeben und die Mac Adresse ermitteln.
Wenn du nicht weiter kommst, einfach noch mal fragen.
So sieht es dann bei mir aus (mit Statistics Modul). Funktioniert wunderbar. Ich lese aktuell den Sensor alle 15 Minuten aus, wobei der Akkustand in den letzten 3 Tagen um etwa 2% gesunken ist. Ich würde das Intervall auf mindestens 1h setzen oder höher, da sonst die Batterie recht schnell leer wird.
Hallo,
die Installation wurde jetzt wesentlich vereinfacht und ist in 3 Schritten zu innerhalb von FEHM zu bewerkstelligen:
1.) update add http://raw.githubusercontent.com/mumpitzstuff/fhem-ParrotFlowerPower/master/controls_parrotflowerpower.txt
2.) update all
3.) shutdown restart
Danach kann ein neues Gerät einfach angelegt werden mit:
define MyPlant ParrotFlowerPower AA:BB:CC:DD:EE:FF
Das könnt ihr auch noch mal hier nachlesen:
https://github.com/mumpitzstuff/fhem-ParrotFlowerPower (https://github.com/mumpitzstuff/fhem-ParrotFlowerPower)
Ich hoffe in den nächsten Tagen kommen ein paar Rückmeldungen, sonst versuche ich mal einen neuen Beitrag aufzumachen...
installiert, ausprobiert, geht! Werde nun mal noch etwas weiter testen, aber erst einmal perfekt!
Oh schön, das freut mich. Anregungen bzw. Verbesserungsvorschläge sind gern gesehen.
Ich hab es auch mal installiert, funktioniert auf Anhieb :) Danke
Hätte gleich noch ne Anregung, ich glaube es würde eine oder zwei Nachkommastellen reichen bei den Werten ;)
Gruß Christoph
Grossartiges Modul, vielen Dank dafür!!!
Bin dabei folgendes zu implementieren:
- konfigurierbare Anzahl von Nachkommastellen
- Attribute für Min/Max in denen für die Feuchtigkeit und das Licht Grenzen pro Pflanze definiert werden können. Dann gibt's ein Userreading das ok/high/low ausspuckt. Darauf lässt sich dann Pflanzenübergreifend ein Notify erstellen.
Hallo
wie bekomm ich die Mac des Sensors heraus ?
hcitool lescan
Zitat von: mumpitzstuff am 08 Februar 2017, 09:07:11
Bin dabei folgendes zu implementieren:
- konfigurierbare Anzahl von Nachkommastellen
- Attribute für Min/Max in denen für die Feuchtigkeit und das Licht Grenzen pro Pflanze definiert werden können. Dann gibt's ein Userreading das ok/high/low ausspuckt. Darauf lässt sich dann Pflanzenübergreifend ein Notify erstellen.
Hast du gesehen dass hier auch jemand an einem "Überwachungsmodul" für Pflanzen arbeitet?
https://forum.fhem.de/index.php/topic,65836.msg573537.html#msg573537
Zitat von: emilio20 am 09 Februar 2017, 00:31:42
Hallo
wie bekomm ich die Mac des Sensors heraus ?
Wenn du ein Android Handy hast, kannst du auch z.B. die App BLE Scanner installieren und nach deinen Sensoren suchen. Dort findest du die MAC Adresse ebenfalls.
Das Gardener Modul habe ich gesehen und mir auch angeschaut. Im Prinzip kann man das On Top installieren, denn selbst fragt es die Werte vom Sensor nicht ab. Es bietet dir im Prinzip ein Berechnung von Statistik Werten und informiert dich per Mail, wenn ein Limit erreicht ist, z.B. zu wenig Wasser. Mir persönlich sind dort zu viele Abhängigkeiten enthalten was Perl Module angeht und auch FHEM Module (z.b. um die Mails zu verschicken).
Ich verwende momentan das Statistics Modul in FHEM, um mir Statistische Werte zu berechnen (nehme ich mal in der Beschreibung mit auf wie das geht). Und wenn ich die angedachten Dinge implementiere, dann kann man sich mit einem einfachen Notify informieren lassen, wenn einer der Pflanzen irgendwas fehlen sollte. Das Gardener Modul bietet momentan glaube ich nur hardcoded Werte für die Limits und verschickt auch nur Mails. Mit einem Notify wäre man völlig frei in der Wahl des Tools (Mail, Sms, Push Notification usw.).
Heute mal ein Vorschlag von mir, nicht das ich immer nur von Dir profitiere.
Wenn Du auf Events Deines eigenen Modules reagieren möchtest, zum Beispiel wird der Wert der Wässerung geschrieben und Du möchtest diesen nun mit einem als Attribut vergeben Wert als unterste Schwelle vergleichen, so kann man eine NotifyFn funktion ins Modul bauen. Hier kann man dann auch gleich als Ergebnis der Auswertung und bei positiv Wert (muss gegossen werden) eine neues Reading setzen (gießen) oder einfach nur einen Event erzeugen auf den dann ein User Notify reagieren kann.
Sofern noch nicht geschehen empfehle ich Dir Dich in die Developer Doku zu FHEM ein zu lesen. Dein Perlcode ist gut aber wenn Du für FHEM entwickelst dann ist die Empfehlung Dich weitestgehend an die Guidline zu richten.
Grüße
Erwischt. Ich muss gestehen, dass ich noch nicht einen Blick in die Doku geworfen habe. Das liegt zum Teil an meinem Beruf, der mich gelehrt hat: vertraue dem Code aber niemals der Doku.
Verständnisfrage: Welchen Vorteil hat es eine Notification auszulösen und dann über die Callback Funktion das Reading zu setzen? Wenn ich sowieso den Wert auslesen und direkt vergleichen kann, dann kann ich doch direkt das Reading setzen und FHEM lösst dann ein Event aus, weil sich das Reading geändert hat. Jeder Anwender kann dann ein eigenes Notify erzeugen und auf solche Events reagieren. Für mein Empfinden ist der Weg direkter. Beim Xiaomi Sensor machst du das z.b. bei dem Battery Reading.
Zitat von: mumpitzstuff am 09 Februar 2017, 12:43:38
Erwischt. Ich muss gestehen, dass ich noch nicht einen Blick in die Doku geworfen habe. Das liegt zum Teil an meinem Beruf, der mich gelehrt hat: vertraue dem Code aber niemals der Doku.
Verständnisfrage: Welchen Vorteil hat es eine Notification auszulösen und dann über die Callback Funktion das Reading zu setzen? Wenn ich sowieso den Wert auslesen und direkt vergleichen kann, dann kann ich doch direkt das Reading setzen und FHEM lösst dann ein Event aus, weil sich das Reading geändert hat. Jeder Anwender kann dann ein eigenes Notify erzeugen und auf solche Events reagieren. Für mein Empfinden ist der Weg direkter. Beim Xiaomi Sensor machst du das z.b. bei dem Battery Reading.
Ja das Thema hatte ich letztens erst. Lach. Du hast Recht, der Weg wäre direkter. Aber nicht unbedingt Strukturiert.
Man muß schauen wie viele Daten man vergleichen will und was man genau machen will. Das mit dem Batterie Reading ist ja nur eine einzige Umsetzung. Das geht ja noch.
Du jedoch willst mehrere Daten vergleichen und entsprechend reagieren. Das mit dem Reading setzen war nur so eine Idee. Man muß noch nicht mal ein Reading setzen, Du kannst auch einfach nur ein Event erzeugen, also ganz ohne Reading.
Beispiel:
Es kommen Daten die Du vergleichst. Der Feuchtigkeitsgehalt Deiner Pflanze ist laut Attribut minFeucht zu gering. Nun setzt Du einfach ein Event ab (giessen). Wichtig ist das Du das Event für Deine User Dokumentierst, da ja nicht für den User ersichtlich.
Thema Doku. Die Doku ist wirklich Klasse, der Markus hat sich da Mega Mühe gegeben und es ist verständlich geworden. Es ist wichtig zu verstehen was genau einzelne Fn machen.
Das Problem hatte ich letztens erst, der Modulauthor hat sich viel Mühe gegeben sein Perlcode zu schreiben und das ganze in ein abkopiertes Modul ein zu fügen. Das Ende vom Lied war das er nicht wusste was FHEM spezifische Funktionen machen und somit hat er zwar eine Undef Funktion im Initial mit an gegeben, aber die eigentliche Funktion fehlte vollends. Somit ist FHEM in den Tod gegangen wenn man ein Device löschen wollte.
Dann hat er ein TCP Socket aufgebaut und daraus gelesen. Sein Aufbau plus Lesen hat FHEM für diesen Moment blockiert. Das war zwar nur ne Sekunde oder so, aber es hat nunmal blockiert.
Für sowas gibt es schon fertige FHEM Funktionen welche man nutzen sollte. So wird ein Socket zum Beispiel an einer select Liste übergeben und wenn Daten bereit stehen wird die ReadFn aufgerufen um die Daten zu holen. Alles ganz ohne blockieren.
Grüße
Leon
Die aktuelle Beta liegt hier ab, falls es jemand schon mal vorab testen möchte:
https://github.com/mumpitzstuff/fhem-ParrotFlowerPower/tree/devel (https://github.com/mumpitzstuff/fhem-ParrotFlowerPower/tree/devel)
Ich lasse das ansonsten noch ein paar Tage laufen und teste die neuen Features systematisch durch, bevor ich die Änderungen mit dem Master Branch merge.
Frage: Besteht Interesse an einem Rohwert für den Dünger im Boden? Das wäre aber nur ein Rohwert und es gibt keinerlei Information dazu wie man den umrechnet. Zudem ist der Wert Temperaturabhängig und wahrscheinlich auch Feuchtigkeitsabhängig. Ich hatte den Wert deshalb erst einmal weg gelassen, da er meiner Meinung nach wenig bringt. Selbst in der App muss man gefühlt jeden Tag in den Blumenkübel pieseln, um den Wert im Normbereich zu halten.
Wenn jemand trotzdem dringenden Bedarf sieht, bitte melden. Zur Not nehme ich den optional rein, dann kann sich jeder selbst aussuchen, ob er den Wert braucht oder nicht. Das Auslesen geht halt auf die Batterielaufzeit...
Ich denke, dass ein Düngerrohwert, den man kaum interpretieren kann, keinen Nutzen bringt. Der Düngerwert ist eh der zeitlich am wenigsten veränderliche und so eher nicht so wichtig; ich kann ja immer mal wieder auch in der App nachsehen.
Hallo
ich habe ein Raspberr pi 2 und habe mir folgenden BT Stick Installiert ,,Logilink BT0015 Bluetooth Adapter
Folgendes Ergebnis erhalte ich wenn ich scanne
pi@raspberrypi ~ $ sudo service bluetooth status
[ ok ] bluetooth is running.
pi@raspberrypi ~ $ hcitool scan
Scanning ...
CS:B1:1A:BD:60:DF [TV] Samsung 7 Series (65)
Der Pflanzensensor ist nicht dabei.
Ich habe das ganze schon mal mit einen Raspberry pi 3 versucht. Hiermit habe ich den Sensor gefunden. Leider musste ich wieder auf das Raspberry pi 2 umsteigen das sich Enocean, Z-Wave und BT nicht vertrgaen haben.
Hat jemand eine Lösung hierzu ?
ist der Empfang vielleicht einfach schlechter? Kannst du mit dem Sensor näher zum Dongle?
Habe den Sensor direkt neben dem raspberry liegen, das kann es nicht sein.
Geht es bei deinem Pi2 ? Wenn ja welchen BT Stick verwendest du ?
LogiLink BT0015 @ Raspi 2 mit Jezzy
Allerdings muss das Kommando hcitool lescan sein!
Ich habe
PRETTY_NAME="Raspbian GNU/Linux 7 (wheezy)"
NAME="Raspbian GNU/Linux"
VERSION_ID="7"
VERSION="7 (wheezy)"
ID=raspbian
ID_LIKE=debian
ANSI_COLOR="1;31"
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
Bei hcitool lescan erhalte ich
pi@raspberrypi ~ $ hcitool lescan
Set scan parameters failed: Operation not permitted
pi@raspberrypi ~ $
ok das ist gemein. Das bluez Packet ist sehr alt als aus den originalen Raspi Quellen. Vorallem bei wheezy.
Ich hab letztens erst ewig rumgefrickelt um es mit wheezy zum laufen zu bekommen, am Ende dann aber auf jezzy upgegradet.
Der Befehl heist "hcitool lescan" um ein Bluetooth LE Gerät zu finden, wie der Pflanzensensor z.b. eines ist. Wenn dein System den nicht kennt, ist vermutlich auch das bluez Packet sehr alt.
Ok
also müsse ich auf jezzy upgegradet.
Werde woll das ganze System neu aufsetzen müssen oder ?
Ne so schlimm ist das nicht. Auser du hast jede Menge Sonderkram drauf....
Ich habe es nach https://www.datenreise.de/raspberry-pi-raspbian-linux-wheezy-jessie-upgrade/ gemacht.
Ok Danke,
werde ich gleich mal versuchen.
Hast du zuerst mal dein System auf den aktuellen Stand gebracht?
sudo apt-get update
sudo apt-get upgrade
Ansonsten habe ich mein System ebenfalls auf Jessie geupdated. Hat einwandfrei funktioniert. Du solltest ebenfalls gucken, dass du alle notwendigen Pakete installiert hast.
https://klenzel.de/3345 (https://klenzel.de/3345)
Dann sollte auch ein sudo hcitool lescan funktionieren...
Version 0.0.3 des Moduls ist verfügbar mit folgenden Änderungen:
- attribute decimalPlaces (1-6 decimal places are possible) added
- detection of running gatttool and hcitool improved
- hciDevice attribute fixed
- hciDevice attribute fixed
- sunlight value mol/(m * m)/d converted to lux
- attributes for min/max SoilMoisture, AirTemperature and Sunlight added
- 3 new Readings added: stateSoilMoisture, stateAirTemperature and stateSunlight added (states can be: ok, low or high)
- some small bugfixes
Das Plugin selbst findet ihr hier: https://github.com/mumpitzstuff/fhem-ParrotFlowerPower (https://github.com/mumpitzstuff/fhem-ParrotFlowerPower)
sehr schick.
Ich würde mir ja wünschen dass es am Ende ein extra Pflanzenüberwachungsmodul gibt.
Nur mit min/max Schwellen kann man die Pflanzen oftmals garnicht sinnvoll überwachen.
Daher hab ich ja die Diskussion hier gestartet
https://forum.fhem.de/index.php/topic,65836.0.html
Ich verwende momentan statistics usw um die Daten besser auszuwerten, aber das wird pro Pflanze ein ganz schönes gewurschdel.
Die min/max Schwellen sind dafür da, für jede Pflanze individuell eine Grenze festzulegen. Das muss für jede Pflanze separat gemacht werden, außer man hat eine Monokultur in seiner Wohnung. Diese kannst du dann im Prinzip mit einem Notify abfragen und dich z.B. per Mail informieren lassen, wenn ein Wert bei einer Pflanze unterschritten oder überschritten wird. Darüber hinaus kann man weitere Dinge machen wie z.B. das von dir vorgeschlagene Statistik Modul. Ich bin inzwischen davon wieder weg, weil die Daten bei jedem FHEM Neustart zurückgesetzt werden bzw. ich oft Fehler von diesem Modul im Logfile gefunden habe.
Prinzipiell kann man Auswertungen in allen erdenklichen Formen anwenden. Das in einem Modul abzubilden wird kaum möglich sein, dazu sind die Vorstellungen der einzelnen User zu unterschiedlich. Mir z.B. würde auch eine Abfrage der Werte am Tag ausreichen, wenn nur mein Plot dann nicht so blöd aussehen würde. ;) Ich habe das Intervall deshalb aktuell auf 1h stehen.
Hinzu kommt, dass die Werte von solchen Sensoren auch nicht super genau sind und man es deshalb bei der Auswertung auch nicht übertreiben sollte. Allein die Tatsache, dass der Sensor niemals die Zusammensetzung des Bodens kennt, sorgt dafür, dass die angezeigten Werte bestenfalls Näherungswerte darstellen.
Hallo
endlich läuft mein Pflanzensensor nachdem ich ewig damit verbracht haben BT einzurichten. Für alle die eine ähnliches Problem haben. Ich habe es nicht hin bekommen auf einem Raspberry pi 3 mit Enocean Modul und Z-Wave Stick BT zum Laufen zu bekommen.
Habe jetzt mein altes Raspberry pi 2 mit Enocean Modul, Z-Wave Stick und BT-Stick mit Jessy zum Laufen bekommen
Hallo
auf was bezieht sich der Lux Wert? Das Aktuelle Lux Wert am Sensor ist bei mir wesentlich höher. Auch der Durchschnittswert ist ein anderer.
Das ist der Wert der sich durch die Umrechnung von mol/m*m/d in lux ergibt. Wie das parrot auf ihrem Server machen ist unbekannt. Den rohwert anzuzeigen macht auch wenig Sinn, das wäre ein wert zwischen 0-20 oder so.
Kannst du mir das genauer erklären ?
Auf der App werden z.b 1500 Lux angezeigt. In fhem an anderer Wert.
Was bedeutet der Wert genau ?
Ich such die Grundlagen noch mal raus. Kannst du mir vielleicht mal 4-5 Wertepaare geben? Jeweils der Wert vom fhem Modul und den der app? Mich würde interessieren wie weit die Werte auseinander liegen.
Mach ich morgen wenn wieder Tageslicht da ist.
Aktuell habe ich in der APP 0 LUX und in Fhem 125LUX
Es kann sein, das ich die 125 raus rechnen muss, da der Rohwert nie unter 0,1 fällt, was nach der Umrechnung den 125 entspricht. Wenn die Abweichung konstant ist, dann kann ich das raus rechnen.
Hallo
hier mal eine paar Wertepaare, jedoch kann ich App und Fhem nicht gleichzeitig Daten lesen lassen. Die Werte sind nur ca. Werte
App Fhem
0 125
650 174
1000 268
2100 547
3120 830
Schau dir mal die Kumulierte Kurve an
Damit wie Werte bei mir stimmen würden müsste ich deinen Wert mit 268 multiplizieren.
Jedoch muss noch die multiplizieren bei 0 Lux angepasst werden
Danke für die Analyse. Im Prinzip könnte ich jetzt eine Regressionsfunktion berechnen und drüber legen. Dann müssten die Werte in etwa denen der App entsprechen. Ich mache mir allerdings Sorgen, dass die Werte dann in höheren Bereichen trotzdem völlig daneben liegen. Sonnenlicht geht bis etwa 120000 Lux... ich glaube deshalb, dass ein Faktor zwar relativ ungenau ist, aber wohl über das gesamte Spektrum den besten Wert liefert.
y=3.742962546 x + 496.8885739 x / (x + 3.714614273)
Das hier würde den genauesten Wert liefern, wobei x = fhem Wert - 125 ist. Ich hab nur keine Ahnung wohin der in höheren Bereichen abdriftet.
Als Faktor würde sich das anbieten:
y=4.671692692 x
Das ist aber sehr ungenau, wobei deine Werte ebenfalls nicht genau sind, weil Parrot App Werte und Fhem Werte nicht exakt synchron aufgenommen wurden.
Hier wird auch noch eine andere Formel vorgeschlagen: https://github.com/Parrot-Developers/node-flower-power/blob/master/index.js (https://github.com/Parrot-Developers/node-flower-power/blob/master/index.js)
Ich denke mal noch etwas drüber nach und würde dir dann mal eine Testversion zukommen lassen.
Es hat leider etwas gedauert, aber ich hatte ziemlich viel um die Ohren...
Ich habe jetzt im Development branch mal die neue lux Berechnung auf Basis der von mir letztens geposteten Regressionsfunktion abgelegt. Kannst du die dir mal manuell runterladen und die verhandene Version ersetzen und gucken, ob das in etwa dem entspricht, was dir die App raus gibt?
Zitat von: emilio20 am 19 Februar 2017, 15:37:49
Hallo
hier mal eine paar Wertepaare, jedoch kann ich App und Fhem nicht gleichzeitig Daten lesen lassen. Die Werte sind nur ca. Werte
App Fhem
0 125
650 174
1000 268
2100 547
3120 830
Schau dir mal die Kumulierte Kurve an
Damit wie Werte bei mir stimmen würden müsste ich deinen Wert mit 268 multiplizieren.
Jedoch muss noch die multiplizieren bei 0 Lux angepasst werden
Wi find ich das und was muss ich machen um zu testen ?
Ups den Link vergessen:
https://github.com/mumpitzstuff/fhem-ParrotFlowerPower/tree/devel/FHEM (https://github.com/mumpitzstuff/fhem-ParrotFlowerPower/tree/devel/FHEM)
Runterladen und die Version in deinem FHEM Verzeichnis ersetzen. Eventuell mit chown wieder den User und die Gruppe ändern. Modul dann reloaden oder shutdown restart machen in FHEM.
Die Version mit der neuen Berechnung für den Sunlight Wert ist jetzt online. Ich bin aßerdem umgezogen zu folgendem Beitrag: https://forum.fhem.de/index.php/topic,68568.0.html (https://forum.fhem.de/index.php/topic,68568.0.html)
Gibt es irgendwo eine Übersicht mit FHEM-kompatiblen Pflanzensensoren, die nicht wie dieser hier den Boden und die Pflanze vergiften?
Weshalb sollte der den Boden vergiften? Meine Pflanzen erfreuen sich bester Gesundheit.
Von FHEM wird meines Erachtens nur noch der Xiaomi Sensor unterstützt. Weitere sind zumindest mir nicht bekannt. Das Ding verwendet allerdings das selbe Messprinzip.
Zitat von: mumpitzstuff am 16 Juli 2017, 23:59:04
Weshalb sollte der den Boden vergiften? Meine Pflanzen erfreuen sich bester Gesundheit.
Von FHEM wird meines Erachtens nur noch der Xiaomi Sensor unterstützt. Weitere sind zumindest mir nicht bekannt. Das Ding verwendet allerdings das selbe Messprinzip.
In FHEM unterstützte Pflanzensensoren gibt es einige...Xiaomi, Opus XT, Parrot Flower, Selbstbau mit nanoCUL usw. usf. mit entsprechenden Modulen.
Beim Xiaomi steht dabei, dass er Kapazitiv messen würde...das wäre nicht dasselbe Messprinzip. Bei resistiven Sensoren findet Elektrolyse statt und sorgt für chemische Reaktionen an Elektroden und Material im Boden, wobei die erzeugten Stoffe von der Pflanze aufgenommen werden. Ausserdem korrodieren die Elektroden sehr schnell.
Deshalb gibt es ja extra den Vegetronix. Wollte nur wissen, ob es soetwas in fertig mit Funk für FHEM gibt, da der Vegetronix kabelgebunden ist. Wie gesagt steht es bei der Spezifikation für die Xiaomi/HuaHuaCaoCao dabei, aber das muss nicht stimmen...deshalb die Frage...
Soweit ich informiert bin, findet die Feuchtigkeitsmessung kapazitiv statt. Die beiden Kontakte sind meines erachtens für die Analyse des Düngers da. Und ja du hast recht, wenn hierfür eine Art Gleichstrom verwendet wird, korrodiert mindestens 1 Kontakt. Es gibt aber auch hierfür Methoden das zu verhindern, indem zum Beispiel die Pole gewechselt werden. Was genau bei den einzelnen Sensoren gemacht wird, ist meist nicht bekannt. Wenn du was ganz einfaches haben willst, was nur kapazitiv misst und mit Ton funktioniert, dann such mal nach chirp. Das Ding ist eigentlich auch ganz cool und funktioniert ohne fhem.