สารบัญ:

FlowerCare และ Nymea เพื่อช่วยเหลือพืชของฉัน: 5 ขั้นตอน
FlowerCare และ Nymea เพื่อช่วยเหลือพืชของฉัน: 5 ขั้นตอน

วีดีโอ: FlowerCare และ Nymea เพื่อช่วยเหลือพืชของฉัน: 5 ขั้นตอน

วีดีโอ: FlowerCare และ Nymea เพื่อช่วยเหลือพืชของฉัน: 5 ขั้นตอน
วีดีโอ: GARDEN 101 | Glow Morning Glory from Seeds in 5 Steps | ปลูกผักบุ้งง่ายๆใน 5 ขั้นตอน | HappyWeeknd 2024, พฤศจิกายน
Anonim
FlowerCare และ Nymea เพื่อช่วยเหลือพืชของฉัน
FlowerCare และ Nymea เพื่อช่วยเหลือพืชของฉัน

ทำให้มือสกปรกในการเชื่อมต่อเซ็นเซอร์การดูแลพืชกับโอเพ่นซอร์สสมาร์ทโฮมที่มีอยู่ของฉัน คำแนะนำในการพัฒนาปลั๊กอินสำหรับ nymea

เรื่องราว

เช่นเดียวกับคนจรจัดและแฮ็กเกอร์คนอื่นๆ ฉันก็ประสบปัญหาเช่นกันที่การแฮ็กสิ่งต่างๆ ต้องใช้เวลามากจนฉันลืมรดน้ำต้นไม้เป็นบางครั้ง หลังจากที่ Monstera Deliciosa ของฉันได้รับความทุกข์ทรมานจากดินแห้งอีกครั้ง ฉันตัดสินใจที่จะดูว่าฉันสามารถทำอะไรกับมันเพื่อเตือนฉันเมื่อมันกระหายน้ำได้หรือไม่

การวิจัยอย่างรวดเร็วบนเว็บทำให้ฉันสนใจ Xiaomi FlowerCare หรือที่เรียกว่า MiCare หรือ PlantCare เป็นอุปกรณ์ Bluetooth Low Energy และการวิจัยขั้นพื้นฐานพบว่าโปรโตคอลดูเหมือนจะเข้าใจได้ง่าย แม้ว่า Xiaomi จะไม่ได้ให้รายละเอียดสาธารณะใด ๆ แต่ก็ยังมีการทำวิศวกรรมย้อนกลับบนอินเทอร์เน็ตสำหรับอุปกรณ์นี้อยู่บ้าง ดังนั้นฉันจึงตัดสินใจสั่งซื้อหนึ่งในนั้น

ไม่กี่วันต่อมาก็มีการส่งมอบและแน่นอนว่าฉันเริ่มเล่นกับมันทันที ฉันตรวจสอบแอพที่มาพร้อมกับมันสั้น ๆ แต่อย่างที่คุณอาจเดาได้ การใช้มันในการตั้งค่าเริ่มต้นไม่ใช่แผนของฉัน แน่นอนว่าสิ่งนี้ต้องรวมเข้ากับการตั้งค่าบ้านอัจฉริยะที่มีอยู่ของฉัน ตามที่อธิบายไว้ที่นี่ ฉันใช้ nymea เป็นโซลูชันบ้านอัจฉริยะของฉัน (ใช่ คุณสามารถมองเห็น Monstera ได้จากรูปภาพใดรูปหนึ่งที่นั่น:)) น่าเศร้าที่ nymea ยังไม่รองรับเซ็นเซอร์นั้น ดังนั้นการเปิดใช้งาน IDE บางตัวจึงเป็นไปตามลำดับ

ขั้นตอนที่ 1: โหลดปลั๊กอิน Stub

กำลังโหลด Stub ปลั๊กอิน
กำลังโหลด Stub ปลั๊กอิน
กำลังโหลด Stub ปลั๊กอิน
กำลังโหลด Stub ปลั๊กอิน
กำลังโหลด Stub ปลั๊กอิน
กำลังโหลด Stub ปลั๊กอิน

สิ่งแรกที่ฉันทำคือคัดลอกปลั๊กอิน Texas Instruments Sensor Tag ที่มีอยู่ ดูเหมือนว่าจะคล้ายกับสิ่งที่ฉันคิดว่าน่าจะใช้ได้กับอุปกรณ์ FlowerCare เช่นกัน หลังจากการเปลี่ยนชื่อพื้นฐานของสิ่งต่าง ๆ ใน plugininfo.json และแสดงความคิดเห็นกับโค้ดของปลั๊กอิน sensortag ส่วนใหญ่ ฉันก็พร้อมที่จะโหลดต้นขั้วปลั๊กอินใหม่

ตามที่คาดไว้ การค้นพบจะแสดงเซ็นเซอร์ทันทีและอนุญาตให้ฉันเพิ่มลงในระบบ แน่นอนว่ามันจะไม่สร้างข้อมูลที่มีความหมายในตอนนี้

ขั้นตอนที่ 2: ค้นหาข้อมูลบนเซ็นเซอร์

การค้นหาข้อมูลบนเซนเซอร์
การค้นหาข้อมูลบนเซนเซอร์

เช่นเดียวกับอุปกรณ์ Bluetooth LE ใดๆ สิ่งแรกที่คุณต้องทำคือค้นหาบริการที่มีให้และคุณลักษณะ ข้อมูลจริงถูกซ่อนอยู่ที่ไหนสักแห่งในนั้น ด้วยการพิมพ์ดีบักอย่างรวดเร็ววนรอบบริการที่ค้นพบทั้งหมดและการพิมพ์คุณลักษณะของพวกเขา ฉันมาถึงจุดที่ฉันสามารถเปรียบเทียบข้อมูลที่ฉันพบบนอินเทอร์เน็ตกับสิ่งที่อุปกรณ์รายงานจริง

เป็นโมฆะ FlowerCare:: onServiceDiscoveryFinished () { BluetoothLowEnergyDevice * btDev = static_cast (ผู้ส่ง ()); qCDebug(dcFlowerCare()) << "มีบริการ uuids" controller()->createServiceObject(sensorServiceUuid นี่); เชื่อมต่อ (m_sensorService, &QLowEnergyService::stateChanged, this, &FlowerCare::onSensorServiceStateChanged); เชื่อมต่อ (m_sensorService, &QLowEnergyService::characteristicRead, this, &FlowerCare::onSensorServiceCharacteristicRead); m_sensorService->discoverDetails(); } เป็นโมฆะ 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 &descriptor, ลักษณะเฉพาะ.descriptors()) { qCDebug(dcFlowerCare()).nospace() < " << descriptor.uuid().toString() << " (" << descriptor.handle() << " ชื่อ: " << descriptor.name() << "): " << descriptor.value() << ", " << descriptor.value().toHex(); } } }

เวอร์ชั่นเฟิร์มแวร์และระดับแบตเตอรี่นั้นง่าย ฉันสามารถเห็นค่าตามที่พิมพ์ในความพยายามครั้งแรกในการแสดงรายการข้อมูลแล้ว ค่าเซ็นเซอร์ที่แท้จริงซ่อนอยู่ลึกลงไปเล็กน้อย แต่การรวมเข้ากับข้อมูลจากอินเทอร์เน็ตจะชี้ให้เห็นทันทีว่าจะหาได้จากที่ใดและโดยเฉพาะอย่างยิ่งวิธีการอ่าน

เป็นโมฆะ FlowerCare:: onSensorServiceCharacteristicRead (const QLowEnergyCharacteristic & ลักษณะ const QByteArray &value) { qCDebug (dcFlowerCare ()) << "ลักษณะการอ่าน" << QString:: หมายเลข (characteristic.handle (), 16) ชั่วคราว; qint8 ข้าม; สตรีม >> ข้าม; quint32 ลักซ์; สตรีม >> ลักซ์; qint8 ความชื้น; กระแส >> ความชื้น; ภาวะเจริญพันธุ์ qint16; กระแส >> เจริญพันธุ์; ปล่อยเสร็จแล้ว(m_batteryLevel, 1.0 * temp / 10, lux, moisture, fertility); }

เมื่อรวมเข้าด้วยกันแล้ว ปลั๊กอินก็เริ่มสร้างข้อมูลที่มีความหมายแล้ว

ขั้นตอนที่ 3: เสร็จสิ้นการสัมผัส

สัมผัสสุดท้าย
สัมผัสสุดท้าย

ดังนั้นมันจึงใช้งานได้โดยพื้นฐานแล้วในตอนนี้ อย่างไรก็ตาม ปัญหาหนึ่งยังเหลืออยู่ที่นั่น ตรงกันข้ามกับ Texas Instruments SensorTag เซ็นเซอร์ FlowerCare จะยกเลิกการเชื่อมต่อ Bluetooth หลังจากผ่านไปสองสามวินาที เมื่อพิจารณาถึงกรณีการใช้งาน ดูเหมือนว่าจะไม่เป็นปัญหาเนื่องจากค่อนข้างน่าเชื่อถือในการตอบสนองต่อความพยายามในการเชื่อมต่อ เนื่องจากโดยปกติพืชจะไม่ดูดน้ำสักลิตรภายในไม่กี่นาที แต่เป็นวัน ไม่จำเป็นต้องเชื่อมต่อตลอดเวลา นอกจากนี้ยังจะทำให้แบตเตอรี่หมดค่อนข้างมาก ดังนั้นฉันจึงตัดสินใจเพิ่ม PluginTimer ซึ่งจะเชื่อมต่อเซ็นเซอร์อีกครั้งทุกๆ 20 นาทีและดึงข้อมูลจากเซ็นเซอร์ หากด้วยเหตุผลบางอย่าง เซ็นเซอร์ไม่ตอบสนองต่อความพยายามในการเชื่อมต่อ รหัสจะเริ่มตัวจับเวลาอื่นซึ่งจะพยายามเชื่อมต่อใหม่ทุกนาทีนับจากจุดนั้นจนกว่าจะสามารถจัดการเพื่อรับข้อมูลได้ จากนั้นจะกลับไปดึงข้อมูลในช่วงเวลา 20 นาทีอีกครั้ง หากอุปกรณ์ไม่สามารถเชื่อมต่อสองครั้งติดต่อกัน (หมายถึงหลังจาก 20 + 1 นาที) อุปกรณ์จะถูกทำเครื่องหมายว่าออฟไลน์ในระบบและผู้ใช้จะได้รับการแจ้งเตือนเกี่ยวกับอุปกรณ์ดังกล่าว

ถือเป็นโมฆะ DevicePluginFlowercare::onPluginTimer(){ foreach (FlowerCare *flowerCare, m_list) { if (--m_refreshMinutes[flowerCare] <= 0) { qCDebug (dcFlowerCare()) << ที่อยู่ "รีเฟรช" (); flowerCare->refreshData(); } else { qCDebug(dcFlowerCare()) << ที่อยู่ "ไม่รีเฟรช" () << " รีเฟรชครั้งต่อไปใน" << m_refreshMinutes[flowerCare] << "minutes"; } // หากเราพยายามเชื่อมต่อไม่สำเร็จ 2 ครั้งขึ้นไป ให้ทำเครื่องหมายว่าไม่ได้เชื่อมต่อหาก (m_refreshMinutes[flowerCare] < -2) { qCDebug(dcFlowerCare()) << "ไม่สามารถรีเฟรชสำหรับ" << (m_refreshMinutes[flowerCare] * -1) <setStateValue(flowerCareConnectedStateTypeId เท็จ); } } }

ด้วยกลยุทธ์นี้ nymea ดูเหมือนว่าจะส่งข้อมูลที่เชื่อถือได้อย่างสมบูรณ์จากเซ็นเซอร์นี้

ขั้นตอนที่ 4: ใช้ในบริบทที่ใหญ่ขึ้น

ใช้ในบริบทที่ใหญ่ขึ้น
ใช้ในบริบทที่ใหญ่ขึ้น
ใช้ในบริบทที่ใหญ่ขึ้น
ใช้ในบริบทที่ใหญ่ขึ้น

การรับค่าจากเซ็นเซอร์นั้นไม่มีประโยชน์มากนัก แต่ฉันสามารถใช้แอพดั้งเดิมสำหรับสิ่งนั้นได้ ตอนนี้เรามาทำสิ่งที่ชาญฉลาดกับมันกันดีกว่า

Nymea รองรับการส่งการแจ้งเตือนแบบพุชไปยังโทรศัพท์ที่ติดตั้ง nymea:app หรือผ่าน PushBullet สิ่งที่ชัดเจนที่ต้องทำคือส่งการแจ้งเตือนแบบพุชให้ตัวเองทุกครั้งที่ความชื้นในดินลดลงต่ำกว่า 15% การตั้งค่าในแอปนั้นค่อนข้างง่าย ตามข้อกำหนดเบื้องต้น คุณต้องมีบัญชีใน nymea:cloud หรือบน PushBullet สำหรับการแจ้งเตือนแบบพุชที่ใช้ nymea:cloud ก็เพียงพอที่จะเปิดใช้งาน nymea:cloud บน nymea:core และใน nymea:app ทันทีที่ทั้งสองเชื่อมต่อกัน สิ่งแจ้งเตือนจะปรากฏขึ้นโดยอัตโนมัติ สำหรับ PushBullet เพิ่มสิ่งใหม่ในระบบ คุณจะพบ PushBullet ในรายการที่นั่น มันจะขอรหัส API ที่คุณได้รับเมื่อสมัครใช้งาน PushBullet เมื่อคุณมีสิ่งแจ้งเตือนแบบพุชใน nymea คุณสามารถสร้างกฎได้

แน่นอน คุณสามารถทำอย่างอื่นได้ตามใจชอบ… เปิดไฟบางส่วนเพื่อสะท้อนค่าเซ็นเซอร์ หรือใช้ปลั๊กอินคำสั่ง HTTP เพื่อโพสต์ค่าเซ็นเซอร์ไปยังเซิร์ฟเวอร์บนอินเทอร์เน็ต เป็นต้น ฉันไม่มีวาล์วน้ำ ซึ่งสามารถควบคุมได้แบบดิจิทัล (ยัง) แต่แน่นอน ถ้าคุณมีสิ่งนั้นและยังไม่รองรับโดย nymea การเพิ่มปลั๊กอินสำหรับสิ่งนั้นจะค่อนข้างคล้ายกันกว่านี้

ขั้นตอนที่ 5: การปิดคำ

คำปิด
คำปิด

ปลั๊กอิน flowercare ได้รับการยอมรับต้นน้ำแล้ว และถ้าคุณมีหนึ่งในนั้น ก็พร้อมที่จะใช้กับ nymea แล้ว อย่างไรก็ตาม ฉันหวังว่าบทความนี้อาจเป็นที่สนใจหากมีใครต้องการเพิ่มการสนับสนุนสำหรับอุปกรณ์อื่นๆ ควรเป็นคำแนะนำเกี่ยวกับวิธีการสร้างปลั๊กอินของคุณเองสำหรับ nymea

หากคุณต้องการเพียงแค่สร้างการตั้งค่านี้ที่บ้านของคุณ สิ่งที่คุณต้องมีคือเซ็นเซอร์ FlowerCare, Raspberry Pi, ภาพชุมชน nymea (ตอนนี้รวมปลั๊กอินการดูแลดอกไม้ด้วย) และ nymea:app ซึ่งมีอยู่ในร้านแอป นอกจากนี้ จนถึงตอนนี้ Monstera Deliciosa ของฉันมีความสุขอีกครั้ง และอย่างที่คุณอาจเคยเห็นในภาพหน้าจอ ฉันได้เซ็นเซอร์ตัวที่สองในตัวเองเพื่อติดตามสุขภาพของต้นมะนาวของฉันด้วย สำหรับตัวนั้น ฉันกำลังส่งการแจ้งเตือนแบบพุชให้ตัวเองทุกครั้งที่อากาศข้างนอกหนาว เพื่อให้ฉันสามารถผ่านฤดูหนาวได้อย่างปลอดภัย

แนะนำ: