Πίνακας περιεχομένων:

FlowerCare και Nymea για τη διάσωση των φυτών μου: 5 βήματα
FlowerCare και Nymea για τη διάσωση των φυτών μου: 5 βήματα

Βίντεο: FlowerCare και Nymea για τη διάσωση των φυτών μου: 5 βήματα

Βίντεο: FlowerCare και Nymea για τη διάσωση των φυτών μου: 5 βήματα
Βίντεο: Παγκόσμια μέρα βιοποικιλότητας 22 Μαϊου 2024, Ιούλιος
Anonim
FlowerCare και Nymea για τη διάσωση των φυτών μου
FlowerCare και Nymea για τη διάσωση των φυτών μου

Βρώμικα τα χέρια για να συνδέσω αισθητήρες φροντίδας φυτών στο υπάρχον έξυπνο σπίτι ανοιχτού κώδικα. Μια περιήγηση στην ανάπτυξη προσθηκών για το nymea.

Η ιστορία

Όπως πολλοί άλλοι τσιμπητές και χάκερ, πάσχω και εγώ από το ζήτημα ότι η παραβίαση πραγμάτων αφαιρεί τόσο πολύ τον χρόνο μου που ξεχνάω κατά καιρούς να ποτίζω τα φυτά μου. Αφού η Monstera Deliciosa για άλλη μια φορά υπέφερε από ξηρό χώμα, αποφάσισα να δω αν μπορώ να κάνω κάτι γι 'αυτό για να μου το θυμίσει όταν διψάω.

Μια γρήγορη έρευνα στον ιστό έφερε την προσοχή μου στο Xiaomi FlowerCare, γνωστό και ως MiCare ή PlantCare. Είναι μια συσκευή χαμηλής κατανάλωσης Bluetooth και ορισμένες βασικές έρευνες αποκάλυψαν ότι το πρωτόκολλό της φαίνεται να είναι αρκετά εύκολο να κατανοηθεί. Ενώ η Xiaomi δεν φαίνεται να παρέχει δημόσιες προδιαγραφές, υπήρξε αρκετή αντίστροφη μηχανική στο Διαδίκτυο για αυτήν τη συσκευή ακόμα. Έτσι αποφάσισα να παραγγείλω ένα από αυτά.

Λίγες μέρες αργότερα παραδόθηκε και φυσικά άρχισα να το παίζω αμέσως. Έλεγξα εν συντομία την εφαρμογή που συνοδεύει, αλλά όπως πιθανότατα μπορείτε να μαντέψετε, η χρήση της στην προεπιλεγμένη ρύθμιση δεν ήταν ποτέ το σχέδιό μου. Φυσικά αυτό πρέπει να ενσωματωθεί με την υπάρχουσα ρύθμιση έξυπνου σπιτιού μου. Όπως επίσης περιγράφεται εδώ, χρησιμοποιώ το nymea ως έξυπνη λύση στο σπίτι μου (Ναι, μπορείτε ακόμη και να εντοπίσετε το Monstera σε μία από τις εικόνες εκεί:)). Δυστυχώς, το nymea δεν υποστήριξε αυτόν τον αισθητήρα ακόμα, έτσι ώστε να ενεργοποιηθεί κάποιο IDE.

Βήμα 1: Φόρτωση ενός πρόσθετου Stubin

Φόρτωση ενός Stub Plugin
Φόρτωση ενός Stub Plugin
Λήψη Stub προσθηκών φόρτωσης
Λήψη Stub προσθηκών φόρτωσης
Φόρτωση Stub Plugin
Φόρτωση Stub Plugin

Έτσι, το πρώτο πράγμα που έκανα ήταν να αντιγράψω το υπάρχον πρόσθετο Texas Instruments Sensor Tag, φαινόταν αρκετά παρόμοιο με αυτό που υπέθεσα ότι θα έπρεπε να λειτουργεί και για τη συσκευή FlowerCare. Μετά τη βασική μετονομασία των πραγμάτων στο plugininfo.json και τον σχολιασμό του περισσότερου κώδικα του plugin sensortag, ήμουν έτοιμος να φορτώσω το νέο στέλεχος προσθήκης.

Όπως ήταν αναμενόμενο, η ανακάλυψη θα έδειχνε ήδη τον αισθητήρα αμέσως και θα μου επέτρεπε να τον προσθέσω στο σύστημα. Φυσικά δεν θα παράγει κανένα ουσιαστικό στοιχείο σε αυτό το σημείο.

Βήμα 2: Εύρεση δεδομένων στον αισθητήρα

Εύρεση δεδομένων στον αισθητήρα
Εύρεση δεδομένων στον αισθητήρα

Όπως συμβαίνει με κάθε συσκευή Bluetooth LE, το πρώτο πράγμα που θέλετε να κάνετε είναι να μάθετε για τις υπηρεσίες που προσφέρει και τα χαρακτηριστικά τους. Κάπου εκεί κρύβονται τα πραγματικά δεδομένα. Με μια γρήγορη εκτύπωση με εντοπισμό σφαλμάτων σε όλες τις ανακαλυφθείσες υπηρεσίες και εκτύπωση των χαρακτηριστικών τους ήμουν στο σημείο όπου μπορούσα να συγκρίνω τις πληροφορίες που βρήκα στο διαδίκτυο με ό, τι πραγματικά αναφέρει η συσκευή.

void FlowerCare:: onServiceDiscoveryFinished () {BluetoothLowEnergyDevice *btDev = static_cast (αποστολέας ()); qCDebug (dcFlowerCare ()) << "έχουν uuids υπηρεσίας" controller ()-> createServiceObject (sensorServiceUuid, αυτό); σύνδεση (m_sensorService, & QLowEnergyService:: stateChanged, this, & FlowerCare:: onSensorServiceStateChanged); connect (m_sensorService, & QLowEnergyService:: karakteristRead, this, & FlowerCare:: onSensorServiceCharacteristicRead); m_sensorService-> DiscoverDetails (); } void FlowerCare:: onSensorServiceStateChanged (const QLowEnergyService:: ServiceSate & state) {if (state! = QLowEnergyService:: ServiceDiscovered) {return; } foreach (const QLowEnergyCharacteristic & χαρακτηριστικό, m_sensorService-> χαρακτηριστικά ()) {qCDebug (dcFlowerCare ()). nospace () <"<< χαρακτηριστικό.uuid (). toString () <<" ("<< χαρακτηριστικό.χέρι () << "Όνομα:" << χαρακτηριστικό. Όνομα () << "):" << χαρακτηριστικό.τιμή () << "," << χαρακτηριστική.τιμή (). ToHex (); foreach (const QLowEnergyDescriptor & περιγραφέας, χαρακτηριστικό.descriptors ()) {qCDebug (dcFlowerCare ()). nospace () <"<< descriptor.uuid (). toString () <<" ("<< descriptor.handle () <<" Όνομα: "<< περιγραφέας.name () << "):" << descriptor.value () << "," << descriptor.value (). toHex (); }}}

Η έκδοση υλικολογισμικού και η στάθμη της μπαταρίας ήταν εύκολα. Θα μπορούσα ήδη να δω τις αντίστοιχες τιμές που εκτυπώθηκαν σε αυτήν την πρώτη προσπάθεια καταχώρισης των δεδομένων. Οι πραγματικές τιμές αισθητήρων είναι κρυμμένες λίγο πιο βαθιά εκεί, αλλά ο συνδυασμός τους με τα δεδομένα από το διαδίκτυο έδειξε αμέσως πού να τον βρείτε και κυρίως πώς να τον διαβάσετε.

void FlowerCare:: onSensorServiceCharacteristicRead (const QLowEnergyCharacteristic & χαρακτηριστικό, const QByteArray & value) {qCDebug (dcFlowerCare ()) << "Χαρακτηριστική ανάγνωση" << QString:: αριθμός (χαρακτηριστικό.χέρι (), 16) θερμοκρασία; qint8 παράλειψη ροή >> παράλειψη quint32 lux; stream >> lux? qint8 υγρασία? ρεύμα >> υγρασία? qint16 γονιμότητα? ρεύμα >> γονιμότητα? τελική εκπομπή (m_batteryLevel, 1.0 * temp / 10, lux, υγρασία, γονιμότητα). }

Συνδυάζοντας αυτό, το plugin άρχισε ήδη να παράγει σημαντικά δεδομένα.

Βήμα 3: Τελειώνοντας τις πινελιές

Τελευταίες πινελιές
Τελευταίες πινελιές

Οπότε βασικά λειτούργησε τώρα, ωστόσο, ένα θέμα είχε μείνει ακόμα εκεί. Ο αισθητήρας FlowerCare, σε αντίθεση με το Texas Instruments SensorTag, θα σταματήσει τη σύνδεση Bluetooth μετά από μερικά δευτερόλεπτα. Λαμβάνοντας όμως υπόψη την περίπτωση χρήσης, αυτό δεν φαίνεται να είναι ζήτημα καθώς είναι αρκετά αξιόπιστο για την απόκριση σε προσπάθειες σύνδεσης. Δεδομένου ότι κανονικά ένα φυτό δεν απορροφά ένα λίτρο νερό μέσα σε λίγα λεπτά, αλλά μάλλον μέρες, δεν φαίνεται απαραίτητο να παραμένει συνδεδεμένο όλη την ώρα. Επίσης, αυτό θα εξαντλήσει την μπαταρία αρκετά. Έτσι αποφάσισα να προσθέσω ένα PluginTimer που θα επανασύνδεσε τον αισθητήρα κάθε 20 λεπτά και θα έβγαζε δεδομένα από αυτόν. Εάν, για κάποιο λόγο, ο αισθητήρας δεν ανταποκριθεί στην προσπάθεια σύνδεσης, ο κώδικας θα ξεκινήσει ένα άλλο χρονόμετρο που προσπαθεί να επανασυνδεθεί κάθε λεπτό από εκείνο το σημείο και μετά μέχρι να καταφέρει να λάβει τα δεδομένα. Στη συνέχεια, θα επέστρεφε για να πάρει ξανά δεδομένα στο διάστημα 20 λεπτών. Εάν η συσκευή αποτύχει να συνδεθεί δύο φορές στη σειρά (δηλαδή, μετά από 20 + 1 λεπτά), θα επισημανθεί εκτός σύνδεσης στο σύστημα και ο χρήστης μπορεί να ειδοποιηθεί σχετικά.

void DevicePluginFlowercare:: onPluginTimer () {foreach (FlowerCare *flowerCare, m_list) {if (--m_refreshMinutes [flowerCare] <= 0) {qCDebug (dcFlowerCare ()) << "Αναζωογονητική" διεύθυνση (); flowerCare-> refreshData (); } else {qCDebug (dcFlowerCare ()) << "Δεν ανανεώνεται" διεύθυνση () << "Επόμενη ανανέωση στο" << m_refreshMinutes [flowerCare] << "λεπτά"; } // Αν είχαμε 2 ή περισσότερες αποτυχημένες προσπάθειες σύνδεσης, επισημάνετε το ως αποσυνδεδεμένο εάν (m_refreshMinutes [flowerCare] <-2) {qCDebug (dcFlowerCare ()) << "Αποτυχία ανανέωσης για" << (m_refreshMinutes [flowerCare] * -1) <setStateValue (flowerCareConnectedStateTypeId, false); }}}

Με αυτή τη στρατηγική, το nymea φάνηκε να παρέχει τέλεια αξιόπιστα δεδομένα από αυτόν τον αισθητήρα.

Βήμα 4: Χρησιμοποιώντας το στο μεγαλύτερο πλαίσιο

Χρησιμοποιώντας το στο μεγαλύτερο πλαίσιο
Χρησιμοποιώντας το στο μεγαλύτερο πλαίσιο
Χρησιμοποιώντας το στο μεγαλύτερο πλαίσιο
Χρησιμοποιώντας το στο μεγαλύτερο πλαίσιο

Η λήψη τιμών από τον αισθητήρα δεν είναι τόσο χρήσιμη, θα μπορούσα επίσης να είχα χρησιμοποιήσει την αρχική εφαρμογή για αυτό. Τώρα ας κάνουμε μερικά έξυπνα πράγματα με αυτό.

Το Nymea υποστηρίζει την αποστολή ειδοποιήσεων push, είτε σε τηλέφωνα με nymea: εγκατεστημένη εφαρμογή, είτε μέσω PushBullet. Έτσι, το προφανές που πρέπει να κάνω είναι να στέλνω στον εαυτό μου κάποιες ειδοποιήσεις ώθησης κάθε φορά που η υγρασία του εδάφους πέφτει κάτω από το 15%. Είναι αρκετά εύκολο να το ρυθμίσετε στην εφαρμογή. Ως προϋπόθεση είτε χρειάζεστε έναν λογαριασμό στο nymea: cloud είτε στο PushBullet. Για nymea: cloud notifications push αρκεί να ενεργοποιήσετε το nymea: cloud στο nymea: core και στο nymea: app. Μόλις συνδεθούν και τα δύο, θα εμφανιστεί αυτόματα ένα στοιχείο ειδοποίησης. Για το PushBullet προσθέστε ένα νέο πράγμα στο σύστημα, θα βρείτε το PushBullet στη λίστα εκεί. Θα σας ζητήσει το κλειδί API που λαμβάνετε κατά την εγγραφή σας στο PushBullet. Μόλις έχετε ένα στοιχείο ειδοποίησης push στο nymea, μπορείτε να δημιουργήσετε έναν κανόνα.

Φυσικά μπορείτε να κάνετε ό, τι άλλο θέλετε… Μπορείτε επίσης να ενεργοποιήσετε λίγο φως για να αντανακλά τις τιμές του αισθητήρα ή να χρησιμοποιήσετε το plugin HTTP Commander για να δημοσιεύσετε τιμές αισθητήρων σε διακομιστή στο διαδίκτυο για παράδειγμα. Δεν έχω βαλβίδα νερού το οποίο μπορεί να ελεγχθεί ψηφιακά (ακόμα) αλλά φυσικά, αν έχετε κάτι τέτοιο και δεν υποστηρίζεται ακόμη από το nymea, η προσθήκη ενός plugin γι 'αυτό θα ήταν μάλλον παρόμοια από αυτήν.

Βήμα 5: Κλείσιμο λέξεων

Λέξεις κλεισίματος
Λέξεις κλεισίματος

Το πρόσθετο Flowercare έχει γίνει αποδεκτό μέχρι τώρα και αν έχετε κάποιο από αυτά είναι έτοιμο να χρησιμοποιηθεί με το nymea τώρα. Ωστόσο, ελπίζω ότι αυτό το άρθρο μπορεί να ενδιαφέρει εάν κάποιος θέλει να προσθέσει υποστήριξη για άλλες συσκευές. Θα πρέπει να είναι μια περίληψη για το πώς να δημιουργήσετε το δικό σας plugin για το nymea.

Αν θέλετε να δημιουργήσετε αυτήν τη ρύθμιση στο σπίτι σας, το μόνο που χρειάζεστε είναι ο αισθητήρας FlowerCare, ένα Raspberry Pi, η εικόνα της κοινότητας nymea (περιλαμβάνει το πρόσθετο φροντίδας λουλουδιών μέχρι τώρα) και η εφαρμογή nymea που είναι διαθέσιμη στα καταστήματα εφαρμογών. Επίσης, μέχρι στιγμής η Monstera Deliciosa μου είναι πάλι χαρούμενη και όπως ίσως έχετε δει στα στιγμιότυπα οθόνης, έχω πάρει έναν δεύτερο από αυτούς τους αισθητήρες για να παρακολουθώ την υγεία της λεμονιάς μου επίσης. Γι 'αυτό στέλνω στον εαυτό μου ειδοποίηση push όποτε κάνει κρύο έξω, ώστε να μπορώ να το μεταφέρω με ασφάλεια τον χειμώνα.

Συνιστάται: