DEV Community

linzhongxue
linzhongxue

Posted on

Developing a Smart Community Life Assistant Based on HarmonyOS Next

Developing a Smart Community Life Assistant Based on HarmonyOS Next

In the era of ubiquitous connectivity, HarmonyOS Next revolutionizes the development experience for lifestyle service applications. This article combines AppGallery Connect (AGC) services with ArkTS to guide you in building a comprehensive smart community assistant application, covering core scenarios like community services, smart home control, and neighborhood social features—making lifestyle app development simple and efficient.


1. Project Blueprint and Foundation Setup

Tech Stack:

  • HarmonyOS SDK 5.0
  • ArkTS Declarative UI
  • AGC Core Services: Cloud DB, Auth Service, Cloud Functions

Three-Step Initialization:

  1. Create an AGC project and enable Cloud DB
  2. Design community service data structures
  3. Configure HarmonyOS app permissions
// CommunityService.ets - Data Model  
@Observed  
export class CommunityService {  
  @PrimaryKey id: string = '';      // Unique service ID  
  title: "string = '';               // Service title (e.g., \"Parcel Receiving\")  "
  description: "string = '';         // Service description  "
  icon: Resource = $r('app.media.default_icon'); // Service icon  
  contact: string = '';             // Contact number  
}  
Enter fullscreen mode Exit fullscreen mode

2. Community Information Service Implementation

Core Features:

  • Real-time property announcements
  • Community event calendar
  • Emergency alert system
// NoticeManager.ets - Announcement Module  
import { cloudDB } from '@kit.AGConnectCloudDBKit';  

export class NoticeManager {  
  private static cloudDBZone: cloudDB.CloudDBZone | null = null;  

  // Initialize Cloud DB  
  static async init() {  
    try {  
      const agcCloudDB = await cloudDB.getAGConnectCloudDB();  
      this.cloudDBZone = await agcCloudDB.openCloudDBZone(  
        new cloudDB.CloudDBZoneConfig('CommunityZone')  
      );  
    } catch (err) {  
      console.error('Cloud DB init failed', err.message);  
    }  
  }  

  // Get latest notice  
  static async getLatestNotice(): Promise<string> {  
    const query = cloudDB.CloudDBZoneQuery.where(CommunityNotice)  
      .orderByDesc('publishTime')  
      .limit(1);  

    const snapshot = await this.cloudDBZone.executeSnapshotQuery(query);  
    if (snapshot.hasNext()) {  
      return (await snapshot.next()).content;  
    }  
    return 'No announcements';  
  }  

  // Send emergency alert (Property management use)  
  static async sendEmergencyAlert(message: string) {  
    const alert = new CommunityNotice();  
    alert.id = generateUUID();  
    alert.content = `[URGENT] ${message}`;  
    await this.cloudDBZone?.upsertData([alert]);  
  }  
}  
Enter fullscreen mode Exit fullscreen mode

3. Smart Home Control Center

Scenario: Control smart devices via phone

// SmartHomeController.ets  
import { smarthome } from '@kit.ConnectedHomeKit';  

@Entry  
@Component  
struct HomeControlPanel {  
  @State lightsStatus: boolean = false;  
  @State temperature: number = 24;  

  // Load devices  
  private async loadDevices() {  
    const devices = await smarthome.getDeviceList();  
    devices.forEach(device => {  
      if (device.deviceType === 'LIGHT') {  
        this.lightsStatus = device.status === 'ON';  
      }  
    });  
  }  

  // Toggle lights  
  private async toggleLights() {  
    await smarthome.executeCommand({  
      deviceType: 'LIGHT',  
      command: this.lightsStatus ? 'TURN_OFF' : 'TURN_ON'  
    });  
    this.lightsStatus = !this.lightsStatus;  
  }  

  build() {  
    Column() {  
      // Light control card  
      ControlCard({  
        icon: $r('app.media.light_icon'),  
        title: 'Living Room Lights',  
        status: this.lightsStatus ? 'ON' : 'OFF',  
        onToggle: () => this.toggleLights()  
      })  

      // Temperature controller  
      TemperatureSlider({  
        currentTemp: this.temperature,  
        onTempChange: (newTemp) => { this.temperature = newTemp }  
      })  
    }  
    .onAppear(() => this.loadDevices())  
  }  
}  

// Temperature control component  
@Component  
struct TemperatureSlider {  
  @Link currentTemp: number;  
  build() {  
    Row() {  
      Image($r('app.media.temp_icon')).width(30)  
      Slider({ value: this.currentTemp, min: 16, max: 30 })  
        .onChange(v => this.currentTemp = v)  
      Text(`${this.currentTemp}°C`).fontSize(18)  
    }  
  }  
}  
Enter fullscreen mode Exit fullscreen mode

4. Neighborhood Social Features

Key Features:

  • Community chat rooms
  • Second-hand marketplace
  • Skill exchange platform
// NeighborChat.ets - Community Chat  
import { agconnect } from '@kit.AGConnectCoreKit';  

@Entry  
@Component  
struct CommunityChatRoom {  
  @State messages: ChatMessage[] = [];  
  @State newMessage: string = '';  
  private chatRoomId: string = 'community_main';  

  // Send message  
  private async sendMessage() {  
    const user = agconnect.auth().currentUser;  
    await cloud.function('sendChatMessage').call({  
      roomId: this.chatRoomId,  
      message: {  
        sender: user?.displayName || 'Anonymous Neighbor',  
        content: this.newMessage  
      }  
    });  
    this.newMessage = '';  
  }  

  // Real-time message listener  
  onInit() {  
    cloud.function('subscribeToChat').call({ roomId: this.chatRoomId })  
      .on('message', (event) => {  
        this.messages = [...this.messages, event.data];  
      });  
  }  

  build() {  
    Column() {  
      // Message list  
      List({ space: 10 }) {  
        ForEach(this.messages, (msg) => {  
          ListItem() { ChatBubble({ message: msg }) }  
        })  
      }  
      .layoutWeight(1)  

      // Input area  
      Row() {  
        TextInput({ text: this.newMessage })  
          .onChange(v => this.newMessage = v)  
          .layoutWeight(1)  
        Button('Send').onClick(() => this.sendMessage())  
      }  
    }  
  }  
}  
Enter fullscreen mode Exit fullscreen mode

5. Convenient Payment System

Features:

  • Utility bill queries
  • Online payments
  • Payment history
// PaymentService.ets  
import { pay } from '@kit.PaymentKit';  

export class PaymentManager {  
  // Retrieve pending bills  
  static async getPendingBills(userId: string): Promise<UtilityBill[]> {  
    const query = cloudDB.CloudDBZoneQuery.where(UtilityBill)  
      .equalTo('userId', userId)  
      .equalTo('isPaid', false);  

    const snapshot = await this.cloudDBZone.executeSnapshotQuery(query);  
    return await snapshot.getAllObjects();  
  }  

  // Pay bill  
  static async payBill(billId: string) {  
    const bill = await this.getBillById(billId);  
    const result = await pay.requestPayment({  
      amount: bill.amount,  
      description: `${bill.type} bill`  
    });  

    if (result.code === 0) {  
      await this.markBillAsPaid(billId);  
      return true;  
    }  
    return false;  
  }  

  // Mark bill as paid  
  private static async markBillAsPaid(billId: string) {  
    const bill = await this.getBillById(billId);  
    bill.isPaid = true;  
    await this.cloudDBZone.upsertData([bill]);  
  }  
}  
Enter fullscreen mode Exit fullscreen mode

6. Seamless Multi-Device Experience

Cross-Device Scenario:

View parcels on watch → Pay fees on phone → Check events on tablet

// Distributed Express Info Sync  
import { distributedKVStore } from '@kit.DistributedDataManagerKit';  

// Phone (Send parcel info)  
async function saveExpressInfo(info: ExpressInfo) {  
  const kvManager = await distributedKVStore.createKVManager();  
  const store = await kvManager.getKVStore('express_store');  
  await store.put('latest_express', JSON.stringify(info));  
}  

// Watch (Receive parcel info)  
@Entry  
@Component  
struct WatchExpressView {  
  @State expressInfo: ExpressInfo | null = null;  

  onInit() {  
    distributedKVStore.createKVManager()  
      .getKVStore('express_store')  
      .on('dataChange', 'latest_express', (data) => {  
        this.expressInfo = JSON.parse(data.value);  
      });  
  }  

  build() {  
    Column() {  
      if (this.expressInfo) {  
        Text(`Courier: ${this.expressInfo.company}`)  
        Text(`Status: ${this.expressInfo.status}`)  
      }  
    }  
  }  
}  
Enter fullscreen mode Exit fullscreen mode

7. Privacy and Security

Key Measures:

  1. Data Minimization
   async function requestNecessaryPermissions() {  
     const permissions: Array<Permissions> = [  
       'ohos.permission.READ_CONTACTS', // Neighborhood contacts  
       'ohos.permission.LOCATION'      // Community services  
     ];  
     const result = await abilityAccessCtrl  
       .createAtManager()  
       .requestPermissionsFromUser(getContext(), permissions);  
     return result.permissions.every(p => p.granted);  
   }  
Enter fullscreen mode Exit fullscreen mode
  1. End-to-Cloud Encryption
   <!-- security_config.xml -->  
   <security-config>  
     <domain-config cleartextTrafficPermitted="false">  
       <domain>community-api.example.com</domain>  
       <trust-anchors>  
         <certificates src="@raw/security_cert"/>  
       </trust-anchors>  
     </domain-config>  
   </security-config>  
Enter fullscreen mode Exit fullscreen mode
  1. Data Masking
   function maskPhoneNumber(phone: string): string {  
     return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');  
   }  
Enter fullscreen mode Exit fullscreen mode

8. Expansion Scenarios

  1. Community AI Assistant
   import { ai } from '@kit.AIKit';  
   const assistant = ai.createConversationAssistant();  
   assistant.on('response', (event) => {  
     showResponse(event.text);  
   });  
Enter fullscreen mode Exit fullscreen mode
  1. Smart Waste Sorting
   camera.takePhoto().then(photo => {  
     ai.imageRecognition(photo).then(result => {  
       showGarbageCategory(result.objectName);  
     });  
   });  
Enter fullscreen mode Exit fullscreen mode
  1. Shared Tool Reservation
   async function reserveTool(toolId: string) {  
     const result = await booking.createReservation({  
       itemId: toolId,  
       timeSlot: '2023-11-15 14:00'  
     });  
     return result.status === 'CONFIRMED';  
   }  
Enter fullscreen mode Exit fullscreen mode

Conclusion: Building Next-Gen Smart Living Experiences

Through HarmonyOS Next's capabilities, we achieve:

  1. Service Integration - Unifying property, home, and social services
  2. Seamless Device Coordination - Real-time sync across phone/watch/tablet
  3. Intelligent Interactions - Enhanced UX with AI assistants

Best Practices:

  • Optimize workflows with AGC's A/B testing
  • Implement device auto-discovery via distributed soft bus
  • Decouple features using atomic services

Top comments (0)

Some comments may only be visible to logged-in visitors. Sign in to view all comments.