Zendure EV Guard
Lindungi baterai Zendure-mu selama pengisian daya mobil listrikmu
Kompatibel dengan Zendure SolarFlow 2400 AC • Shelly Pro 3EM • Smappee • Windows, Linux, macOS
Kamu punya baterai Zendure dan mobil listrik?
Kamu tahu sendiri: saat mobilmu dicolokkan ke wallbox, mobil itu menyedot semuanya. Baterai Zendure-mu terkuras dengan sangat cepat, siklusnya terus bertambah, dan masa pakai sel-sel berhargamu mencair seperti salju di bawah matahari.
Kalau mobilmu adalah mobil perusahaan dan listriknya dibayar oleh perusahaan tempatmu bekerja, sayang sekali menguras bateraimu untuk mengisi ulang mobil itu kalau nanti malam tidak akan tersisa apa-apa untuk konsumsi sendiri di rumahmu.
Kasus lainnya: meskipun mobil itu bukan mobil perusahaan, mungkin kamu hanya ingin mencegah bateraimu terkuras selama pengisian daya, agar bisa sepenuhnya menikmati listrik yang dihasilkan panel suryamu saat matahari terik, tanpa mengambil daya dari baterai Zendure-mu.
Zendure EV Guard menyelesaikan masalah ini secara otomatis. Begitu pengisian daya mobilmu terdeteksi, program ini menjeda bateraimu. Saat pengisian selesai, program ini mengaktifkannya kembali. Sederhana, otomatis, tanpa risiko.
Bagaimana cara kerjanya?
1. Deteksi
Shelly Pro 3EM milikmu (atau Smappee) mengukur konsumsi. Saat daya melewati ambang batas (contoh: 5000W), program ini tahu bahwa mobilmu sedang mengisi daya.
2. Perlindungan
Baterai Zendure langsung masuk ke mode OFF. Baterai tidak lagi mengalami pengosongan, siklusmu tetap terjaga.
3. Dilanjutkan kembali
Pengisian selesai? Program ini otomatis mengaktifkan kembali bateraimu dengan parameter awalmu. Tidak perlu intervensi manual.
🔒 100% aman untuk bateraimu
Zendure EV Guard secara eksklusif menggunakan API HTTP lokal dari hub Zendure-mu. Program ini hanya menyentuh dua pengaturan, persis yang kamu lihat di aplikasi Zendure: minSoc (batas bawah pengosongan) dan outputLimit (daya keluaran). Untuk menjeda, program ini menaikkan minSoc ke 100% dan menurunkan keluaran ke 0 W. Untuk melanjutkan, program ini mengembalikan nilai-nilai biasanya.
Kenapa keduanya? Karena satu saja tidak selalu cukup. Kalau hub-mu berjalan dalam mode HEMS, kadang hub itu membuka kembali keluarannya sendiri selama jeda. Program ini menyadarinya dalam beberapa detik dan menutupnya kembali. Pengukuran yang dilakukan di rumahku pada 22 Agustus 2026, baterai 30%, mobil 18 kW: dua kali terbuka, ditutup kembali dalam 10 lalu 5 detik, total 2 Wh.
Tidak ada firmware yang diubah, tidak ada akses cloud, tidak ada risiko. Ini persis sama seperti kalau kamu mengubah pengaturan secara manual di aplikasi Zendure, tetapi dilakukan otomatis dan pada waktu yang tepat.
Yang baru di 1.3.12
- Programnya berbahasa Prancis. Semua yang Anda baca (email, Pushover, Telegram, laporan pengisian) tersedia dalam bahasa Prancis dan Inggris. Satu kunci konfigurasi,
Messages:Language, dan itu saja. Log teknis tetap dalam bahasa Inggris, memang sengaja. - Laporan di akhir setiap pengisian. Berapa kWh yang tercatat di meter, berapa untuk mobil, durasi, puncak, rata-rata. Dan perkiraan biayanya, jika Anda memasukkan harga kWh Anda di
Energy:PricePerKwhCents. - Kebocoran saat jeda diukur dan ditutup. Hub dalam mode HEMS dapat membuka kembali output-nya saat jeda. Program melihatnya, mengukurnya, menutupnya, dan memberi peringatan kepada Anda jika berlangsung lama.
- Arsipnya berisi semua yang diperlukan untuk instalasi. Satu skrip untuk Linux, satu untuk macOS, satu untuk Windows, ditambah panduan pengguna dalam bahasa Prancis dan Inggris. Anda tidak perlu lagi menyalin file layanan secara manual.
- Jeda pencegahan jika meter menjadi bisu. Dalam keadaan buta, program tidak dapat lagi melihat mobil Anda tersambung: program mengamankan baterai dan melepaskannya pada pengukuran valid pertama.
- Baterai Anda diaktifkan kembali sebelum penghentian, termasuk ketika sistemlah yang menghentikan program.
Prasyarat
| Peralatan | Detail |
|---|---|
| Zendure SolarFlow 2400 AC | Hub dengan API HTTP lokal yang diaktifkan (port 80) |
| Shelly Pro 3EM atau Smappee1 diperlukan | Penjepit amperemetrik (Shelly, waktu nyata) atau monitor energi Smappee (API cloud, blok 5 menit) untuk mengukur konsumsi |
| Wallbox / Stasiun pengisian | Stasiun apa pun: deteksi didasarkan pada konsumsi, bukan pada stasiunnya sendiri |
| PC, Server atau NAS | Windows, Linux atau macOS, program berjalan di latar belakang 24 jam sehari |
Instalasi
1. Ekstrak arsip
Ekstrak isi file ZIP ke direktori pilihan Anda, misalnya:
- Windows :
C:\ZendureEvGuard\ - Linux :
/home/ZendureEvGuard/ - macOS :
/Applications/ZendureEvGuard/
2. Hak eksekusi (Linux / macOS saja)
Di Linux dan macOS, kamu harus membuat file dapat dieksekusi sebelum menjalankannya:
chmod +x ZendureEvGuard
./ZendureEvGuard3. Konfigurasikan appsettings.json
Buka file appsettings.json yang terletak di sebelah executable dan isi parametermu (lihat bagian di bawah).
4. Jalankan program
# Windows
ZendureEvGuard.exe
# Linux / macOS
./ZendureEvGuardProgram menampilkan informasi koneksi saat dimulai. Gunakan P untuk menjeda secara manual, R untuk melanjutkan, dan Ctrl+C dua kali untuk menghentikannya dengan benar.
5. Instal sebagai layanan (disarankan)
Program hanya melindungi bateraimu jika berjalan. Sejak 1.3.12, arsip tersebut berisi skrip untuk setiap sistem: skrip itu menginstal layanan, mengaktifkannya saat mulai dan menjalankannya, dari folder tempat kamu mengekstraknya. Tidak ada yang disalin ke tempat lain.
# Linux
sudo sh install-linux.sh
# macOS
sudo sh install-macos.sh
# Windows (PowerShell sebagai administrator)
powershell -ExecutionPolicy Bypass -File .\install-windows.ps1Di Windows, layanan berjalan menggunakan akun SYSTEM, yang tidak memiliki ruang data yang sama dengan sesimu: pastikan kamu mengisi Subscription.SecretKey di appsettings.json sebelum menginstalnya.
File README.txt yang disertakan dalam arsip merinci setiap perintah, penghapusan instalasi dan pembaruan. Dan USER_GUIDE_FR.md memuat kembali semua pengaturan, secara offline.
Anda lebih suka menulis servicenya sendiri? Di Linux, berikut unit yang dipasang oleh skrip. Dua baris tidak bersifat dekoratif: TimeoutStopSec=120 memberi waktu kepada program untuk mengaktifkan kembali baterai Anda sebelum systemd mematikannya, dan network-online.target mencegahnya mulai sebelum jaringan benar-benar tersedia.
[Unit]
Description=ZendureEvGuard - EV Charging Battery Protection Daemon
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
WorkingDirectory=/home/ZendureEvGuard
ExecStart="/home/ZendureEvGuard/ZendureEvGuard"
Restart=on-failure
RestartSec=10
TimeoutStopSec=120
SyslogIdentifier=zendure-evguard
Environment=DOTNET_ENVIRONMENT=Production
[Install]
WantedBy=multi-user.targetLalu perintah-perintah biasanya:
sudo systemctl daemon-reload
sudo systemctl enable --now zendure-evguard
# Voir le statut
sudo systemctl status zendure-evguard
# Voir les logs en temps reel
sudo journalctl -u zendure-evguard -f
# Redemarrer apres une mise a jour
sudo systemctl restart zendure-evguardJangan menambahkan User= khusus tanpa memikirkannya terlebih dahulu: program menulis log dan status jedanya di sebelah executable, dan akun yang tidak memiliki hak akses ke folder tersebut akan membuatnya gagal saat dimulai ulang pertama kali.
Konfigurasi: appsettings.json
Berikut semua parameter yang bisa Anda konfigurasi. Bagian Shelly dan ZendureDevice wajib ada.
Pesan baru di 1.3.12
Bahasa semua hal yang Anda baca: email, Pushover, Telegram, laporan akhir pengisian daya. Log teknis tetap dalam bahasa Inggris, agar pesan kesalahan tetap bisa dicari.
| Parameter | Deskripsi | Bawaan |
|---|---|---|
Language | Bahasa pesan: "en" atau "fr". Nilai lainnya akan kembali ke bahasa Inggris, tanpa menghalangi proses mulai | "en" |
Perhatikan penempatannya: kunci ini harus berada di bawah bagian Messages, tidak pernah di akar berkas. Di Linux, kunci Language yang diletakkan di akar akan ditimpa oleh variabel lingkungan LANGUAGE milik sistem, dan pesanmu kembali menjadi bahasa Inggris tanpa peringatan.
"Messages": {
"Language": "fr"
}⚡ Shelly wajib
Konfigurasi Shelly Pro 3EM kamu. Ini adalah sensor yang mengukur konsumsi listrik rumahmu.
| Parameter | Deskripsi | Contoh |
|---|---|---|
Enabled | Aktifkan Shelly sebagai sumber pengukuran | true |
Host | Alamat IP Shelly Pro 3EM Anda di jaringan lokal | "192.168.1.50" |
UseDigestAuth | Aktifkan jika Anda telah melindungi Shelly dengan kata sandi | false |
Username | Nama pengguna (jika autentikasi aktif) | "admin" |
Password | Kata sandi (jika autentikasi aktif) | "monmotdepasse" |
🔌 Stasiun Smappee opsional
Stasiun energi Smappee dapat digunakan dengan dua cara :
- Sebagai sumber deteksi EV (alternatif untuk Shelly) : jika Shelly dinonaktifkan, Smappee menjadi sumber pengukuran daya untuk mendeteksi pengisian EV. Deteksi dilakukan melalui API cloud Smappee (blok 5 menit, kurang responsif dibandingkan Shelly secara real-time).
- Bersamaan dengan Shelly : jika Shelly aktif sebagai sumber deteksi, Smappee tetap dapat diaktifkan untuk menampilkan terus-menerus informasi konsumsi (surya, rumah, jaringan) dan stasiun Smappee EV Wall milikmu (daya pengisian, status, dan sebagainya) di dalam log.
| Parameter | Deskripsi | Contoh |
|---|---|---|
Enabled | Mengaktifkan Smappee (sumber deteksi jika Shelly dinonaktifkan, atau menampilkan info konsumsi/stasiun pengisian EV secara bersamaan) | false |
ClientId | Client ID aplikasi Smappee kamu (API v3) | "votre-client-id" |
ClientSecret | Client Secret aplikasi Smappee kamu | "votre-client-secret" |
Username | Nama pengguna akun Smappee kamu | "user@email.com" |
Password | Kata sandi akun Smappee kamu | "motdepasse" |
ServiceLocationId | ID lokasi Smappee kamu (terlihat di dasbor Smappee, ini bukan nomor seri) | "190802" |
PollingIntervalSeconds | Frekuensi pemanggilan API Smappee | 30 |
Baterai Zendure wajib
Konfigurasi hub Zendure SolarFlow 2400 AC kamu atau yang lainnya. Alamat IP-nya ada di aplikasi Zendure.
| Parameter | Deskripsi | Contoh |
|---|---|---|
Host | Alamat IP hub Zendure kamu di jaringan lokal | "192.168.1.127" |
Port | Port HTTP API lokal (80 secara default) | 80 |
DefaultOutputLimit | Daya output maksimum dalam watt yang harus dipulihkan setelah pengisian daya EV | 2400 |
DefaultMinSoc | Batas minimum pengosongan yang harus dipulihkan setelah pengisian daya : tingkat di bawahnya baterai kamu tidak akan lagi dikosongkan (nilainya dikalikan ×10 : 100 = 10%, 200 = 20%). Ini bukan tingkat pengisian daya maksimum. | 100 |
TimeoutSeconds | Waktu tunggu untuk permintaan ke hub | 10 |
Memahami DefaultMinSoc
Parameter ini menentukan batas bawah pelepasan baterai kamu: tingkat di bawahnya hub tidak akan membiarkan baterai terus terkuras. Nilainya dikalikan 10 dalam API Zendure:
100= baterai bisa turun sampai 10%200= baterai bisa turun sampai 20%500= baterai berhenti di 50%, dan separuh kapasitas kamu tak lagi berguna
Jangan samakan dengan batas atas pengisian. Tingkat saat baterai kamu berhenti mengisi daya adalah socSet, pengaturan lain, yang kamu lihat di aplikasi Zendure. Memasukkan 950 di sini bukan berarti "isi daya sampai 95%" melainkan "jangan pernah turun di bawah 95%" : baterai kamu jadi tak bisa digunakan. Sejak versi 1.3.0, program menolak memulai dengan nilai di luar 1 sampai 999, dan memperingatkan kamu jika nilainya di atas 500.
Pilihan ada di tanganmu! Semakin rendah nilainya, semakin banyak kamu menggunakan baterai; semakin tinggi nilainya, semakin kamu menjaga sel-sel baterai, dengan mengorbankan kapasitas yang tersedia. Kebanyakan pengguna memilih antara 100 (10%) dan 200 (20%).
EvDetection
Pengaturan deteksi pengisian daya kendaraan listrik kamu. Algoritmenya menggunakan histeresis : perlu beberapa pembacaan berturut-turut di atas ambang untuk mengonfirmasi pengisian daya, dan beberapa pembacaan di bawahnya untuk mengonfirmasi penghentian.
| Parameter | Deskripsi | Default |
|---|---|---|
PowerThresholdWatts | Ambang daya (dalam watt) di atasnya program menganggap mobil sedang mengisi daya. Sesuaikan dengan wallbox kamu. | 5000 |
ConfirmationReadings | Jumlah pembacaan berturut-turut di atas ambang untuk mengonfirmasi dimulainya pengisian daya | 2 |
ReleaseReadings | Jumlah pembacaan berturut-turut di bawah ambang untuk mengonfirmasi berakhirnya pengisian daya (24 = ~2 menit pada 5d/pembacaan) | 24 |
PollingIntervalSeconds | Frekuensi pengukuran dalam detik | 5 |
PauseOnSourceUnreachableMinutes | Baru di 1.3.0. Durasi saat meter boleh tetap tidak dapat dihubungi sebelum baterai dijeda sebagai tindakan pencegahan : dalam keadaan buta, program tidak lagi bisa melihat mobil kamu terhubung. Jeda dicabut sejak pengukuran valid pertama. Isi 0 untuk menonaktifkan pengaman ini. | 3 |
NotifyPrecautionaryPauseAfterMinutes | Jeda pencegahan langsung berlaku, tetapi kamu baru diberi tahu setelah durasi ini terlampaui : meter yang berkedip selama tiga detik tidak layak mendapat email | 30 |
SourceUnreachableReleaseMinutes | Durasi setelahnya jeda pencegahan dilepas meskipun meter masih tetap membisu | 10 |
ReleaseHysteresisWatts | Margin di bawah ambang yang harus dilewati lagi untuk mengonfirmasi berakhirnya pengisian daya. Mencegah bolak-balik saat konsumsi berosilasi tepat di sekitar ambang | 500 |
PostResumeCooldownSeconds | Jeda setelah melanjutkan kembali selama pendeteksian baru diabaikan | 60 |
Energi baru di 1.3.12
Di akhir setiap pengisian daya, program memberi tahu berapa kWh yang telah terpakai. Beri tahu harga kWh milikmu dan program akan menambahkan jumlahnya. Ini indikatif, bukan tagihan : tidak ada yang mengukur stasiun pengisian itu sendiri, dan harganya tetap sementara harga milikmu mungkin tidak tetap.
Penggunaan yang terpikir olehku : beberapa mobil terhubung di rumahmu, dan masing-masing harus tahu berapa yang telah dikonsumsinya.
| Parameter | Deskripsi | Bawaan |
|---|---|---|
PricePerKwhCents | Harga kWh dalam sen bulat (28 = 0,28 EUR). Masukkan 0 agar tidak menampilkan apa pun. Angka berkoma ditolak dan dibaca sebagai 0, tanpa menghalangi proses mulai | 28 |
Laporan menghitung dua energi. Yang diukur pada meteran, yang merupakan fakta. Dan bagian yang diperkirakan untuk kendaraan, yang mengurangi konsumsi rumah biasanya : sebuah perkiraan, dan nilai maksimum ketika panelmu mengekspor listrik saat kendaraan dicolokkan.
Charge terminee : 1h03 | 11,30 kWh au compteur (3,16 EUR) |
~11,30 kWh pour le vehicule (3,16 EUR) | pointe 14627 W | moyenne 11169 WNotifikasi opsional
Terima email saat bateraimu dijeda, dilanjutkan kembali, atau jika terjadi kesalahan. Konfigurasikan server SMTP-mu.
| Parameter | Deskripsi | Bawaan |
|---|---|---|
Enabled | Aktifkan notifikasi email | false |
SmtpHost | Server SMTP (mis.: smtp.gmail.com) | "" |
SmtpPort | Port SMTP | 587 |
UseSsl | Gunakan TLS/SSL | true |
Username / Password | Kredensial SMTP | "" |
FromAddress | Alamat email pengirim | "" |
ToAddress | Penerima, dipisahkan dengan ; jika lebih dari satu | "" |
RateLimitMinutes | Interval minimum antara dua peringatan (anti-spam) | 15 |
📴 Pushover opsional
Notifikasi push di ponsel Anda melalui Pushover. Buat aplikasi di pushover.net untuk mendapatkan API Token Anda.
| Parameter | Deskripsi |
|---|---|
Enabled | Aktifkan Pushover (true / false) |
ApiToken | Token API aplikasi Pushover Anda |
UserKey | Kunci pengguna Pushover Anda |
RateLimitMinutes | Interval minimum antarperingatan (default: 15) |
💬 Telegram opsional
Notifikasi melalui bot Telegram. Buat bot dengan @BotFather dan dapatkan Chat ID Anda.
| Parameter | Deskripsi |
|---|---|
Enabled | Aktifkan Telegram (true / false) |
Bots | Daftar bot. Masing-masing memiliki Name, BotToken dan daftar ChatIds. Inilah yang memungkinkan pemberitahuan kepada orang yang berbeda dalam grup yang berbeda |
RateLimitMinutes | Interval minimum antarperingatan (default: 15) |
Sejak 1.2.0, kamu bisa memberi tahu beberapa grup sekaligus: dua orang melalui bot pertama, tiga orang lainnya melalui bot kedua. Setiap pengiriman terisolasi, penerima yang tidak dapat dihubungi tidak lagi menghalangi penerima lain untuk menerima pesan.
"Telegram": {
"Enabled": true,
"RateLimitMinutes": 15,
"Bots": [
{
"Name": "Famille",
"BotToken": "123456:AAExxxxxxxxxxxxxxxxxxxx",
"ChatIds": [ "11111111", "22222222" ]
},
{
"Name": "Voisins",
"BotToken": "789012:BBEyyyyyyyyyyyyyyyyyyyy",
"ChatIds": [ "33333333", "44444444", "55555555" ]
}
]
}Format lama, dengan satu BotToken dan beberapa ChatId yang dipisahkan dengan titik koma, tetap berfungsi. Jika kamu tidak mengubah apa pun pada konfigurasi, notifikasi kamu tetap berjalan persis seperti sebelumnya.
Monitoring opsional
| Parameter | Deskripsi | Default |
|---|---|---|
HealthCheckIntervalSeconds | Frekuensi pemeriksaan konektivitas perangkat | 30 |
LogStatusIntervalSeconds | Frekuensi pencatatan status lengkap dalam file log | 300 |
PostResumeGuardSeconds | Durasi program memeriksa bahwa hub tetap menyimpan pengaturanmu setelah pemulihan | 300 |
DeviceUnreachableAlertMinutes | Durasi perangkat tidak dapat dijangkau yang setelahnya kamu akan mendapat peringatan | 60 |
🔄 Update opsional
Sejak 1.2.0, program tidak lagi memperbarui dirinya sendiri. Program memeriksa sekali per jam apakah ada versi yang lebih baru, dan cukup memberi tahu kamu: pengingat dalam log setiap jam selama kamu belum memasang versi baru, dan satu pesan saja di kanal yang sudah kamu konfigurasikan, dengan tautan unduhan langsung.
Mengganti biner sebuah layanan yang melindungi bateraimu saat sedang berjalan adalah tindakan paling berisiko dalam produk ini. Sebaiknya kamu yang menentukan waktunya. Kunci lama AutoUpdateEnabled dan CheckIntervalHours tidak lagi dibaca: kamu bisa membiarkannya di dalam berkasmu, keduanya diabaikan.
| Parameter | Deskripsi | Default |
|---|---|---|
CheckEnabled | Periksa setiap jam apakah ada versi yang lebih baru | true |
NotifyOnNewVersion | Kirim pesan ke saluran notifikasimu saat pertama kali mendeteksi sebuah versi. Hanya sekali per versi, tidak pernah dikirim ulang | true |
Lisensi setelah uji coba
Setelah periode uji coba 30 hari, tambahkan kunci rahasiamu untuk mengaktifkan lisensi PRO. Kuncimu ada di akunmu pada pojok kanan atas > "Akun Saya". Lisensi diperbarui secara otomatis di latar belakang.
| Parameter | Deskripsi | Contoh |
|---|---|---|
SecretKey | Kunci rahasia unikmu (GUID) dari akunmu di digital3d.com. Kosongkan untuk menggunakan mode uji coba. | d79d24cc-eb02-48d7-94f8-xxxxxxxxxxxx |
Contoh konfigurasi minimal
Berikut adalah contoh yang siap digunakan. Cukup ganti alamat IP dengan alamat perangkat Anda :
{
"Messages": {
"Language": "fr"
},
"Energy": {
"PricePerKwhCents": 28
},
"Shelly": {
"Enabled": true,
"Host": "192.168.1.50"
},
"ZendureDevice": {
"Host": "192.168.1.127",
"Port": 80,
"DefaultOutputLimit": 2400,
"DefaultMinSoc": 100
},
"EvDetection": {
"PowerThresholdWatts": 5000
},
"Subscription": {
"SecretKey": "d79d24cc-eb02-48d7-94f8-xxxxxxxxxxxx"
}
}Dengan konfigurasi ini, program memantau Shelly Anda, mendeteksi setiap konsumsi yang lebih besar dari 5000W (sebagai contoh), dan memulihkan baterai Anda dengan minimum 10% (100 ÷ 10) dan keluaran maksimum sebesar 2400W. Bagian Subscription secara default kosong : program berfungsi dalam mode uji coba selama 30 hari. Untuk mengaktifkan lisensi PRO, tambahkan kunci rahasia Anda dari akun Anda di kanan atas.
Uji coba gratis & Langganan
🎉 30 hari uji coba gratis, tanpa komitmen!
Unduh Zendure EV Guard dan uji selama 30 hari penuh, tanpa membayar apa pun dan tanpa batasan fitur. Anda akan mendapatkan akses ke 100% fungsi untuk memastikan bahwa program ini benar-benar sesuai dengan instalasi Anda.
Setelah 30 hari berakhir, langganan Digital3D diperlukan untuk terus menggunakan program ini. Satu langganan memberi Anda akses ke semua aplikasi Digital3D (CompactForIA, AutoMouseMove, Zendure EV Guard, dll.).
🔑 Cara mengaktifkan lisensi Anda
- Berlangganan di "One for All"
- Masuk ke akun Anda di digital3d.com dan salin kunci rahasia Anda (pengidentifikasi unik dalam format GUID, misalnya :
f89f26cc-eb03-48d7-94f8-xxxxxxxxxxxx) - Buka file
appsettings.jsondan tambahkan kunci Anda di bagianSubscription:"Subscription": { "SecretKey": "votre-clef-secrete-guid" } - Mulai ulang program : lisensi PRO akan aktif secara otomatis dan diperbarui tanpa campur tangan apa pun dari Anda.
Siap melindungi bateraimu?
Unduh gratis, konfigurasikan dalam 5 menit, dan tidur dengan tenang.
Langganan “ One for All ”: satu langganan untuk semua aplikasi Digital3D.
Join the conversation
You need an account to comment on this article. Creating one is free and takes under a minute.
No comments yet.