יישום תזמון ואוטומציה של מכשירי IoT באמצעות אפליקציה ניידת
דמיינו בית חכם שמדליק את האורות בשעה 07:00 לפי שעון מוסקבה, אך הבעלים טס לוולדיווסטוק והאורות נדלקים בשעה 05:00 לפי השעון המקומי. בעיה נפוצה — טיפול לא נכון באזור זמן. אנו מעצבים ממשקים ניידים ל-IoT כבר למעלה מ-5 שנים, ומספקים למעלה מ-20 פרויקטים — מתקעים ביתיים ועד בקרים תעשייתיים. בקשה נפוצה אחת היא תזמון ואוטומציה גמישים שעובדים ללא התערבות אנושית.
לוח זמנים למכשיר IoT: "הדלק אור בשעה 07:00, כבה בשעה 23:00 בימי חול". אוטומציה מורכבת יותר: "אם הטמפרטורה יורדת מתחת ל-18°C+ והשעה בין 22:00 ל-08:00 — הפעל תנור". שתי המשימות מטופלות בשרת, אך האפליקציה הניידת חייבת לספק ממשק משתמש ליצירה ועריכה שלהן ללא הוראות.
כיצד ליישם תזמון למכשיר IoT?
לוח זמנים טיפוסי:
{
"device_id": "abc123",
"action": "turn_on",
"days_of_week": [1, 2, 3, 4, 5],
"time": "07:00",
"timezone": "Europe/Moscow",
"enabled": true
}אזור זמן הוא שדה חובה. בלעדיו, לוח הזמנים יפעל בצורה שגויה לאחר טיסה או עם משתמשים מאזורים שונים. שמור בשרת ב-UTC, המר לאזור הזמן של המכשיר/המשתמש בעת התצוגה. לפי תיעוד Firebase, זהו נוהג סטנדרטי.
ממשק לבחירת זמן ב-Android Compose — Material3 { "device_id": "abc123", "action": "turn_on", "days_of_week": [1, 2, 3, 4, 5], "time": "07:00", "timezone": "Europe/Moscow", "enabled": true } או TimePicker. בחירת יום — שורה אופקית של שבבים עם בחירה מרובה:
val days = listOf("Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс")
var selectedDays by remember { mutableStateOf(setOf<Int>()) }
Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
days.forEachIndexed { index, label ->
FilterChip(
selected = index + 1 in selectedDays,
onClick = {
selectedDays = if (index + 1 in selectedDays) selectedDays - (index + 1) else selectedDays + (index + 1)
},
label = { Text(label) }
)
}
}הצג את רשימת לוחות הזמנים עם TimePickerDialog ואפשר החלפה של כל לוח זמנים באמצעות val days = listOf("Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс") var selectedDays by remember { mutableStateOf(setOf<Int>()) } Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { days.forEachIndexed { index, label -> FilterChip( selected = index + 1 in selectedDays, onClick = { selectedDays = if (index + 1 in selectedDays) selectedDays - (index + 1) else selectedDays + (index + 1) }, label = { Text(label) } ) } } מבלי לפתוח את העורך. שלח בקשת PATCH עם LazyColumn בלבד — לא את כל האובייקט.
מה ההבדל בין לוח זמנים לאוטומציה?
| תכונה | לוח זמנים | אוטומציה (ECA) |
|---|---|---|
| טריגר | שעה קבועה | אירוע (חיישן, שעה, סטטוס) |
| תנאים | אין | בדיקות נוספות (שעה, מכשירים אחרים) |
| פעולה | פקודה אחת | פקודה אחת או מספר פקודות |
| שליטה | הפעלה/כיבוי | יצירה, עריכה, מחיקה |
מדוע אוטומציה מורכבת יותר מתזמון פשוט?
אוטומציות פועלות לפי מודל ECA (אירוע-תנאי-פעולה):
- אירוע (טריגר): ערך חיישן חוצה סף, השעה מגיעה, המכשיר משנה סטטוס
- תנאי: השעה הנוכחית בטווח, מכשיר אחר מחובר
- פעולה: שליחת פקודה למכשיר, שליחת התראה, קריאה ל-webhook
מאוחסן כ-JSON בשרת:
{
"trigger": {
"type": "sensor_value",
"device_id": "temp_sensor_1",
"parameter": "temperature",
"operator": "lt",
"value": 18
},
"conditions": [
{
"type": "time_range",
"from": "22:00",
"to": "08:00"
}
],
"actions": [
{
"type": "device_command",
"device_id": "heater_1",
"command": "turn_on"
}
]
}ביצוע הלוגיקה הוא בשרת. האפליקציה הניידת רק יוצרת ועורכת אוטומציות, לא מבצעת אותן.
ממשק משתמש לבונה האוטומציות
בונה גרירה-ושחרור הוא מורכב ומוגזם עבור רוב התרחישים. אשף שלב-אחר-שלב פשוט יותר. השווה:
| תכונה | בונה גרירה-ושחרור | אשף שלב-אחר-שלב |
|---|---|---|
| זמן למידה | 15–20 דקות | 3–5 דקות (פי 3–4 מהר יותר) |
| שגיאות משתמש | נפוצות (שדות חובה חסרים) | נדירות (אימות רציף) |
| מתאים ביותר ל | משתמשים מתקדמים | כל המשתמשים |
שלב 1 — טריגר. בחר מכשיר → בחר פרמטר → תנאי (גדול/קטן/שווה) → ערך. או בחר "לפי לוח זמנים".
שלב 2 — תנאים (אופציונלי). "הוסף תנאי" → בחר סוג (שעה, יום בשבוע, סטטוס של מכשיר אחר).
שלב 3 — פעולה. בחר מכשיר → בחר פקודה. אפשרות להוספת מספר פעולות. שלב 4 — שם ושמירה.
כל שלב מאומת בנפרד. לא ניתן להמשיך לשלב הבא מבלי למלא שדות חובה — הצג שגיאה מוטבעת, אל תחסום את כל האפליקציה.
כיצד לנפות באגים באוטומציות?
משתמשים יוצרים אוטומציות ולא מבינים מדוע הן לא הופעלו. יומן ביצוע הוא חובה. כל טריגר → רשומה בהיסטוריה: הופעל/לא, מדוע, איזו פעולה בוצעה.
יומן לדוגמה
14:32 · Температура упала до 16.8°C ✓
Условие: время 22:00–08:00 — не выполнено (сейчас 14:32) ✗
Автоматизация не сработалаיומן כזה מפחית פניות לתמיכה — עד 40% חיסכון במשאבי תמיכה.
קונפליקטים בלוחות זמנים
שני לוחות זמנים על אותו מכשיר עלולים להתנגש: הראשון מדליק בשעה 07:00, השני מכבה בשעה 07:30, השלישי מדליק בשעה 07:15. השרת צריך לוגיקת פתרון קונפליקטים — הפקודה האחרונה לפי זמן מנצחת. בממשק המשתמש — הזהיר את המשתמש בעת יצירת לוחות זמנים חופפים.
מה כלול בעבודה
יישום תזמון עם אשף שלב-אחר-שלב: 3–4 שבועות. בונה אוטומציות מלא עם תנאים ויומן ביצוע: 6–8 שבועות. התמחור הוא אישי. צור קשר כדי לקבל ייעוץ ותוכנית פרויקט.
תהליך
- ניתוח — הבהרת מקרי שימוש, מספר מכשירים וסוגי אוטומציות.
- עיצוב — פיתוח מודל נתונים, API וארכיטקטורת ממשק משתמש.
- יישום — כתיבת לוגיקת השרת והממשק הנייד.
- בדיקות — בדיקה על מכשירים אמיתיים, הדמיית קונפליקטים ומקרי קצה.
- השקה — פרסום ל-App Store ול-Google Play, הגדרת התראות push.
אנו מבטיחים תמיכה לאחר ההשקה ותיעוד של כל הרכיבים. קבל ייעוץ מהנדס כדי להפוך את מוצר ה-IoT שלך לנוח ואמין.







