Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Xioami Flower Care / Tool

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Xioami Flower Care / Tool

    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      malc last edited by

      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>
      1 Reply Last reply Reply Quote 0
      • ?
        A Former User last edited by

        Hi,

        super, vielen Dank, sehr gute Idee, und funktioniert hier einwandfrei!

        Klasse!

        1 Reply Last reply Reply Quote 0
        • M
          malc last edited by

          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
          1 Reply Last reply Reply Quote 0
          • R
            Ritschy2000 last edited by

            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

            1 Reply Last reply Reply Quote 0
            • First post
              Last post

            Support us

            ioBroker
            Community Adapters
            Donate

            551
            Online

            31.9k
            Users

            80.2k
            Topics

            1.3m
            Posts

            3
            4
            862
            Loading More Posts
            • Oldest to Newest
            • Newest to Oldest
            • Most Votes
            Reply
            • Reply as topic
            Log in to reply
            Community
            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
            The ioBroker Community 2014-2023
            logo