NEWS
Xioami Flower Care / Tool
-
Hallo.
Ich nutzte da einige Flower Care für meine Pflanzen. Da ich gern die Logik lieber im Backend bilde habe ich mir ein Script gebaut welches im Prinzip die ble.0. <mac>Datenpunkte in dem Zweig javascript.0.flowercare spiegelt und eben dazu Min / Triggerwerte eingebaut.
Dadurch habe ich dann ganz einfache Datenpunkte die auf true springen wenn ich giessen bzw. düngen sollte. Für jeden Sensor gibt es dann die entsprechenden Werte. Das ganze ist noch am Anfang, noch prüfe ich beim spiegeln nicht ob das Gerät überhaupt ein Flower Care Sensor ist und noch so einige andere Verbesserungen stehen aus. Die Spiegelung in dem Zweig Javascript ist beabsichtigt, einmal weil ich in ble.0.* kein createstate() machen kann und auch um in VIS ein zentraleren Ort für alles relevante zu haben.
Es ist nur ein Anfang, nix fertiges. Aber vielleicht hat ja wer Interesse:
// Xiaomi Flower Sensor / Erweiterung der BLE.0 Daten // Autor: Malc ------------------------- // Version 0.1 27.08.2018 - Initialversion // Erweiterte Version 0.2c 27.08.2018 // // Erweiterte Funktionen im Vergleich zu 0.2a // - Bei Scriptstart werden alle Messwerte mit -99 initialisiert // - applyfertilizer wird nur berechnet wenn fertility gesendet wird // - towater wird nur berechnet wenn moisture gesendet wird // - BugFix // // Erweiterte Funktionen im Vergleich zu 0.1 // -Neuer Datenpunkt "online" // Wird bei Scriptstart auf false gesetetzt und bei jedem Datenempfang auf true // Jede Minute werden alle Devices geprüft und wenn TimeStamp länger als DeviceOnlineTimeout her ist auf false // -Neuer Datenpunk "rssiquality" // Bewertung RSSI im Klartext // - BugFix var DeviceOnlineTimeout = 5; // Wenn länger als n Minuten keine Diff aus Now - Timestamp, dann online=false log("Start"); Init(); //CheckOnline(); schedule('* * * * *', function() { CheckOnline(); }); function CheckOnline() { $('[state.id=flowersensor.*.timestamp]').each(function(id,i) { var ParentId = id.split(".").slice(0,-1).join("."); var Val = getState(id).val; if (Val !== '' && TimeLeft(new Date(), new Date(Val)) <= DeviceOnlineTimeout) { setState(ParentId +'.online', true); } else { setState(ParentId +'.online', false); } }); } function Init() { createState('flowersensor.timestamp', "", { read: true, write: false, name: "TimeStamp", type: "string", def: null }); setState('flowersensor.timestamp' , ""); $('[state.id=ble.0.*.fertility]').each(function(id,i) { var ParentId = id.split(".").slice(0,-1).join("."); var MAC = ParentId.substr(ParentId.lastIndexOf(".") +1); var Name = ""; if (true) { createState('flowersensor.' + MAC + '.name', Name, { read: true, write: false, name: "Name", type: "string", // "number", def: null }); createState('flowersensor.' + MAC + '.online', false, { read: true, write: false, name: "Device Online", type: "boolean", unit: "", def: null }); createState('flowersensor.' + MAC + '.timestamp', "", { read: true, write: false, name: "Name", type: "string", // "number", def: null }); createState('flowersensor.' + MAC + '.fertility', 0, { read: true, write: false, name: "Fertility of the soil", type: "number", def: 0 }); createState('flowersensor.' + MAC + '.illuminance', 0, { read: true, write: false, name: "illuminance", type: "number", unit: "lux", def: 0 }); createState('flowersensor.' + MAC + '.moisture', 0, { read: true, write: false, name: "Moisture of the soil", type: "number", unit: "%", def: 0 }); createState('flowersensor.' + MAC + '.temperature', 0, { read: true, write: false, name: "temperature", type: "number", unit: "°C", def: 0 }); createState('flowersensor.' + MAC + '.timestamp', "", { read: true, write: false, name: "Timestamp", type: "string", unit: "", def: "" }); createState('flowersensor.' + MAC + '.rssi', 0, { read: true, write: false, name: "Signal strength of the device", type: "number", unit: "", def: 0 }); createState('flowersensor.' + MAC + '.rssiquality', "", { read: true, write: false, name: "Quality of RSSI", type: "string", unit: "", def: "" }); createState('flowersensor.' + MAC + '.minfertility', 300, { read: true, write: false, name: "Minimum Fertility", type: "number", unit: "", def: 0 }) createState('flowersensor.' + MAC + '.applyfertilizer', false, { read: true, write: false, name: "apply fertilizer", type: "boolean", unit: "", def: null }); createState('flowersensor.' + MAC + '.minmoisture', 30, { read: true, write: false, name: "Minimum Moisture", type: "number", unit: "", def: 0 }) createState('flowersensor.' + MAC + '.towater', false, { read: true, write: false, name: "to water", type: "boolean", unit: "", def: null }); } setState('flowersensor.' + MAC + '.fertility' , -99); setState('flowersensor.' + MAC + '.illuminance' , -99); setState('flowersensor.' + MAC + '.moisture' , -99); setState('flowersensor.' + MAC + '.temperature' , -99); setState('flowersensor.' + MAC + '.rssi' , -99); setState('flowersensor.' + MAC + '.timestamp' , ''); setState('flowersensor.' + MAC + '.online' , false); setState('flowersensor.' + MAC + '.applyfertilizer' , false); setState('flowersensor.' + MAC + '.towater' , false); on({id: ParentId + '.fertility' , change: "ne"}, function (obj) {FlowerData(obj); }) on({id: ParentId + '.illuminance' , change: "ne"}, function (obj) {FlowerData(obj); }) on({id: ParentId + '.moisture' , change: "ne"}, function (obj) {FlowerData(obj); }) on({id: ParentId + '.temperature' , change: "ne"}, function (obj) {FlowerData(obj); }) on({id: ParentId + '.rssi' , change: "ne"}, function (obj) {FlowerData(obj); }) }) } function FlowerData(obj ) { var Id = obj.id; var Val = obj.state.val; var Item = Id.substr(Id.lastIndexOf(".") +1); var ParentId = Id.split(".").slice(0,-1).join("."); var Name = getState(ParentId + '.name').val; var MAC = ParentId.substr(ParentId.lastIndexOf(".") +1); var Timestamp = formatDate(new Date(obj.state.ts), "JJJJ-MM-DD hh:mm:ss"); /* log("FlowerData MAC " + MAC); log("FlowerData Item " + Item); log("FlowerData Val " + Val); */ //log("FlowerData " + Name + ".Item[" + Item + "] = " + Val); setState('flowersensor.' + MAC + '.' + Item , Val); setState('flowersensor.' + MAC + '.timestamp' , Timestamp); setState('flowersensor.' + MAC + '.online' , true); setState('flowersensor.timestamp' , Timestamp); /* Generell bei jedem Ereignis prüfen da bei keiner Änderung der Feuchtigkeit / Dünger nichts übertragen wird */ log (Name + " " + Item + " " + Val ); if (Item == 'fertility') { if (Val < getState('flowersensor.' + MAC + '.minfertility').val ) { if (!getState('flowersensor.' + MAC + '.applyfertilizer').val) { setState('flowersensor.' + MAC + '.applyfertilizer', true); log(Name + " " + Item + " " + Val + " applyfertilizer ON"); } }else { if (getState('flowersensor.' + MAC + '.applyfertilizer').val) { log (Name + " " + Item + " " + Val + " applyfertilizer OFF"); setState('flowersensor.' + MAC + '.applyfertilizer', false); } } } if (Item == 'moisture') { if (Val < getState('flowersensor.' + MAC + '.minmoisture').val ) { if (!getState('flowersensor.' + MAC + '.towater').val) { setState('flowersensor.' + MAC + '.towater', true); log(Name + " " + Item + " " + Val + " towater ON"); } } else { if (getState('flowersensor.' + MAC + '.towater').val) { log (Name + " " + Item + " " + Val + " towater OFF"); setState('flowersensor.' + MAC + '.towater', false); } } } if( Item == "rssi") { var rq = ''; if (Val >= -40) { rq = 'excellent'; } else if (Val >= -55) { rq = 'good'; } else if (Val <= -55) { rq = 'bad'; } else if (Val <= -100) { rq = 'very bad'; } else { rq = 'unkonwn'; } setState('flowersensor.' + MAC + '.rssiquality', rq); } } function TimeLeft(Start, End) { var diff = Start - End; var h = Math.floor( diff / 3.6e6 ); var m = Math.floor((diff % 3.6e6) / 6e4); var s = Math.floor((diff % 6e4) / 1000); var Ret = (h * 60) + m; /* log('Start ' + Start); log('End..' + End); log('Ret ' + Ret); */ return Ret; } ````</mac>
-
Hi,
super, vielen Dank, sehr gute Idee, und funktioniert hier einwandfrei!
Klasse!
-
Update: 0.2b
(Script ist im Eingangspost aktualisiert)
Erweiterte Funktionen im Vergleich zu 0.2a
-
Bei Scriptstart werden alle Messwerte mit -99 initialisiert
-
applyfertilizer wird nur berechnet wenn fertility gesendet wird
-
towater wird nur berechnet wenn moisture gesendet wird
-
BugFix
Erweiterte Funktionen im Vergleich zu 0.1
-Neuer Datenpunkt "online"
Wird bei Scriptstart auf false gesetetzt und bei jedem Datenempfang auf true
Jede Minute werden alle Devices geprüft und wenn TimeStamp länger als DeviceOnlineTimeout her ist auf false
-Neuer Datenpunk "rssiquality"
Bewertung RSSI im Klartext
- BugFix
-
-
Danke für das Script.
scheint bei mir auch zu funktionieren, bekomme allerdings im Log immer folgende Warn-Medlung:
javascript.0 2018-10-10 00:14:17.405 warn at Object. <anonymous>(script.js.FlowerCare.Flower:205:78) javascript.0 2018-10-10 00:14:17.405 warn at FlowerData (script.js.FlowerCare.Flower:217:27) javascript.0 2018-10-10 00:14:17.399 warn getState "ble.0.c4:7c:8d:66:da:37.name" not found (3) javascript.0 2018-10-10 00:14:05.388 info script.js.FlowerCare.Flower: null rssi -88 javascript.0 2018-10-10 00:14:05.384 warn at Object. <anonymous>(script.js.FlowerCare.Flower:205:78) javascript.0 2018-10-10 00:14:05.384 warn at FlowerData (script.js.FlowerCare.Flower:217:27) javascript.0 2018-10-10 00:14:05.378 warn getState "ble.0.c4:7c:8d:66:da:37.name" not found (3) javascript.0 2018-10-10 00:14:03.213 info script.js.FlowerCare.Flower: null fertility 170 javascript.0 2018-10-10 00:14:03.211 warn at Object. <anonymous>(script.js.FlowerCare.Flower:201:78) javascript.0 2018-10-10 00:14:03.211 warn at FlowerData (script.js.FlowerCare.Flower:217:27) javascript.0 2018-10-10 00:14:03.208 warn getState "ble.0.c4:7c:8d:66:4c:07.name" not found (3) javascript.0 2018-10-10 00:13:54.383 info script.js.FlowerCare.Flower: null rssi -85 javascript.0 2018-10-10 00:13:54.380 warn at Object. <anonymous>(script.js.FlowerCare.Flower:205:78) javascript.0 2018-10-10 00:13:54.379 warn at FlowerData (script.js.FlowerCare.Flower:217:27) javascript.0 2018-10-10 00:13:54.373 warn getState "ble.0.c4:7c:8d:66:da:37.name" not found (3) javascript.0 2018-10-10 00:13:54.174 info script.js.FlowerCare.Flower: null rssi -70 javascript.0 2018-10-10 00:13:54.172 warn at Object. <anonymous>(script.js.FlowerCare.Flower:205:78) javascript.0 2018-10-10 00:13:54.171 warn at FlowerData (script.js.FlowerCare.Flower:217:27) javascript.0 2018-10-10 00:13:54.164 warn getState "ble.0.c4:7c:8d:66:4c:07.name" not found (3) javascript.0 2018-10-10 00:13:53.378 info script.js.FlowerCare.Flower: null fertility 457 javascript.0 2018-10-10 00:13:53.377 warn at Object. <anonymous>(script.js.FlowerCare.Flower:201:78) javascript.0 2018-10-10 00:13:53.376 warn at FlowerData (script.js.FlowerCare.Flower:217:27) javascript.0 2018-10-10 00:13:53.373 warn getState "ble.0.c4:7c:8d:66:da:37.name" not found (3) javascript.0 2018-10-10 00:13:47.758 info script.js.FlowerCare.Flower: null rssi -76 javascript.0 2018-10-10 00:13:47.755 warn at Object. <anonymous>(script.js.FlowerCare.Flower:205:78) javascript.0 2018-10-10 00:13:47.754 warn at FlowerData (script.js.FlowerCare.Flower:217:27) javascript.0 2018-10-10 00:13:47.748 warn getState "ble.0.c4:7c:8d:66:4c:05.name" not found (3) javascript.0 2018-10-10 00:13:44.164 info script.js.FlowerCare.Flower: null rssi -68 javascript.0 2018-10-10 00:13:44.161 warn at Object. <anonymous>(script.js.FlowerCare.Flower:205:78) javascript.0 2018-10-10 00:13:44.160 warn at FlowerData (script.js.FlowerCare.Flower:217:27) javascript.0 2018-10-10 00:13:44.154 warn getState "ble.0.c4:7c:8d:66:4c:07.name" not found (3) javascript.0 2018-10-10 00:13:43.386 info script.js.FlowerCare.Flower: null rssi -86 javascript.0 2018-10-10 00:13:43.383 warn at Object. <anonymous>(script.js.FlowerCare.Flower:205:78) javascript.0 2018-10-10 00:13:43.383 warn at FlowerData (script.js.FlowerCare.Flower:217:27) javascript.0 2018-10-10 00:13:43.377 warn getState "ble.0.c4:7c:8d:66:da:37.name" not found (3) javascript.0 2018-10-10 00:13:35.785 info script.js.FlowerCare.Flower: null moisture 41 javascript.0 2018-10-10 00:13:35.783 warn at Object. <anonymous>(script.js.FlowerCare.Flower:203:78) javascript.0 2018-10-10 00:13:35.783 warn at FlowerData (script.js.FlowerCare.Flower:217:27) javascript.0 2018-10-10 00:13:35.776 warn getState "ble.0.c4:7c:8d:66:4c:05.name" not found (3) javascript.0 2018-10-10 00:13:35.746 info script.js.FlowerCare.Flower: null rssi -74 javascript.0 2018-10-10 00:13:35.743 warn at Object. <anonymous>(script.js.FlowerCare.Flower:205:78) javascript.0 2018-10-10 00:13:35.743 warn at FlowerData (script.js.FlowerCare.Flower:217:27) javascript.0 2018-10-10 00:13:35.737 warn getState "ble.0.c4:7c:8d:66:4c:05.name" not found (3)</anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></anonymous></anonymous>
muss ich noch irgendetwas eintragen? Bei mir scheint er den Punkt "name" nicht zu finden,
habe bei den eigentlichen BLE Datenpunkten auch keinen "Unterpunkt" "name" gefunden.
Bin für jede Hilfe dankbar.
Gruße