Inventory & Topology
Bu sayfa, Cınga backend içindeki fiziksel varlıkların ve saha topolojisinin nasıl modellendiğini detaylı biçimde açıklar. Amaç yalnız cihaz listesi tutmak değil; cihazın hangi modemle, hangi SIM ile, hangi pompaya, hangi panoya, hangi parsele ve hangi adrese bağlı olduğunu tarihsel olarak izlenebilir hale getirmektir.
Bu katmanda temel prensip şudur:
Fiziksel varlık ile ilişki geçmişi aynı tabloda eritilmez. Varlık ayrı tutulur, atama/bağlantı tarihi ayrı tutulur.
Genel Fiziksel Zincir
1. devices
devices, sistemdeki mantıksal cihaz kimliğinin ana tablosudur. Bu tablo cihazı bir inventory nesnesi olarak tanımlar; canlı runtime state’i taşımaması önerilir.
Neden vardır?
- telemetry, rule engine, inbox, finance, notes gibi pek çok modül cihaz kimliği etrafında döner
- cihazın hangi proje, model, firmware ve adrese ait olduğu burada çözümlenir
- diğer domain tabloları cihazı referans alır
Kolonlar
| Kolon | Tip | Null | Anlamı |
|---|---|---|---|
id | varchar(21) | hayır | Cihazın birincil kimliği |
status_id | int | evet | Cihazın genel statü referansı |
project_id | int | evet | Hangi ürün/proje ailesine ait olduğu |
manufacturer_model_id | int | evet | Cihaz modeli |
firmware_id | int | evet | Son bilinen firmware ilişkisi |
address_id | int | evet | Kurulu adres |
name | varchar(100) | evet | Kullanıcıya görünen ad |
description | text | evet | Açıklama |
create_time | timestamp | hayır | Oluşturma zamanı |
update_time | timestamp | hayır | Son güncelleme |
Mimari karar
Aşağıdaki alanlar devices tablosunda yaşamaz ve ayrı state tablolarında tutulur:
last_connection_iplast_connection_timelast_stream_idlast_raw_idlast_device_timeregister_statusregister_stopregister_publish
Bu ayrım aşağıdaki tablolar üzerinden çözülür:
device_runtime_statedevice_register_state
Örnek kayıt
{
"id": "46000000C47CA670",
"project_id": 1,
"manufacturer_model_id": 8,
"firmware_id": 1,
"address_id": 3,
"name": "Kuyu 1 PowerStat",
"description": "Kuyu 1 sahasında çalışan PowerStat V1 cihazı"
}
2. modems
Bu tablo fiziksel modem varlığını taşır.
Neden vardır?
Cihaz ile haberleşme katmanı aynı şey değildir. Modem arızalanabilir, stokta olabilir, sahadan sökülebilir veya başka cihaza aktarılabilir. Bu nedenle modem bağımsız bir inventory nesnesi olarak tutulur.
Kolonlar
| Kolon | Tip | Null | Anlamı |
|---|---|---|---|
id | int | hayır | Modem anahtarı |
imei | varchar(20) | hayır | Fiziksel modem kimliği |
manufacturer_model_id | int | hayır | Modem modeli |
status | enum | hayır | stok / installed / faulty / retired |
serial_number | varchar(100) | evet | Seri numarası |
notes | varchar(255) | evet | Açıklama |
create_time | timestamp | hayır | Oluşturma zamanı |
update_time | timestamp | hayır | Son güncelleme |
Örnek kayıt
{
"id": 1,
"imei": "356938035643809",
"manufacturer_model_id": 7,
"status": "installed",
"serial_number": "TELIT-LE910-001",
"notes": "Sahada aktif modem"
}
3. modem_assignments
Bu tablo modem ile cihaz arasındaki tarihsel atamayı tutar.
Neden vardır?
Bir modem farklı zamanlarda farklı cihazlara takılabilir. Modemin tek başına hangi cihaza ait olduğunu modems tablosunda tutmak geçmişi siler. Bu yüzden ilişki ayrı tabloda tutulur.
Kolonlar
| Kolon | Tip | Null | Anlamı |
|---|---|---|---|
id | int | hayır | Atama anahtarı |
modem_id | int | hayır | Atanan modem |
device_id | varchar(21) | hayır | Modemin takıldığı cihaz |
is_active | boolean | hayır | Halen aktif atama mı |
assigned_by | int | evet | Atamayı yapan kullanıcı |
assigned_at | timestamp | hayır | Takılma zamanı |
removed_at | timestamp | evet | Sökülme zamanı |
notes | varchar(255) | evet | Not |
create_time | timestamp | hayır | Oluşturma |
update_time | timestamp | hayır | Güncelleme |
Örnek kayıt
{
"id": 1,
"modem_id": 1,
"device_id": "46000000C47CA670",
"is_active": true,
"assigned_at": "2026-04-01T10:00:00Z",
"removed_at": null,
"notes": "Ana cihaz modemi olarak takıldı"
}
4. sim.sims
Bu tablo fiziksel SIM varlığını temsil eder.
Neden vardır?
SIM kart, modemden ve cihazdan bağımsız bir fiziksel/operasyonel kimliktir. Operatör değişimi, arıza, stok ve askıya alınma gibi durumları cihaz tablosunda taşımak doğru değildir.
Kolonlar
| Kolon | Tip | Null | Anlamı |
|---|---|---|---|
id | int | hayır | SIM anahtarı |
iccid | varchar(25) | hayır | Fiziksel SIM kimliği |
imsi | varchar(25) | evet | Ağ kimliği |
msisdn | varchar(20) | evet | Hat numarası |
operator_id | int | evet | Operatör referansı |
status | enum | hayır | stock / active / suspended / faulty / retired |
notes | varchar(255) | evet | Not |
create_time | timestamp | hayır | Oluşturma |
update_time | timestamp | hayır | Güncelleme |
5. sim.assignments
Bu tablo SIM ile modem arasındaki tarihsel ilişkiyi taşır.
Neden vardır?
Bir SIM farklı zamanlarda farklı modemde kullanılabilir. Bu ilişkiyi tek tabloda tutmak geçmiş takibi açısından zayıf kalır.
Kolonlar
| Kolon | Tip | Null | Anlamı |
|---|---|---|---|
id | int | hayır | Atama anahtarı |
sim_id | int | hayır | Takılan SIM |
modem_id | int | hayır | SIM’in takıldığı modem |
is_active | boolean | hayır | Aktif atama mı |
assigned_by | int | evet | İşlemi yapan kullanıcı |
assigned_at | timestamp | hayır | Takılma zamanı |
removed_at | timestamp | evet | Çıkarılma zamanı |
notes | varchar(255) | evet | Not |
create_time | timestamp | hayır | Oluşturma |
update_time | timestamp | hayır | Güncelleme |
6. sim.connectivity_state
Bu tablo SIM’in son bağlantı özet durumunu taşır.
Neden vardır?
Heartbeat geçmişi çok satırlıdır. UI ve alarm tarafında ise son özet durum gerekir. Bu yüzden özet state ayrı tabloda tutulur.
Kolonlar
| Kolon | Tip | Null | Anlamı |
|---|---|---|---|
sim_id | int | hayır | SIM anahtarı |
last_status | enum | hayır | Son heartbeat durumu |
last_ping_time_ms | float | evet | Son ping süresi |
last_checked_at | timestamp | hayır | Son kontrol zamanı |
last_success_at | timestamp | evet | Son başarılı kontrol |
consecutive_fail_count | int | hayır | Art arda başarısızlık sayısı |
update_time | timestamp | hayır | Güncelleme |
7. sim.heartbeats
Bu tablo SIM heartbeat geçmişini saklar.
Neden vardır?
Özet state tek başına yeterli değildir; zaman içinde timeout, unreachable veya success geçmişi tutulmalıdır.
Kolonlar
| Kolon | Tip | Null | Anlamı |
|---|---|---|---|
id | int | hayır | Kayıt anahtarı |
sim_id | int | hayır | İlgili SIM |
status | enum | hayır | success / timeout / unreachable / error |
ping_time_ms | float | evet | Ölçülen süre |
checked_at | timestamp | hayır | Kontrol zamanı |
details | varchar(255) | evet | Açıklama |
8. transformers
transformers, sahadaki trafo varlığını tanımlar.
Neden vardır?
Enerji altyapısı tarafında pano ve pompa çoğu zaman bir trafodan beslenir. Trafoyu ayrı varlık olarak modellemek besleme topolojisini görünür kılar.
Kolonlar
| Kolon | Tip | Null | Anlamı |
|---|---|---|---|
id | int | hayır | Trafo anahtarı |
manufacturer_model_id | int | evet | Trafo modeli |
name | varchar(100) | evet | Saha adı |
description | varchar(255) | evet | Açıklama |
capacity_kva | int | evet | Güç kapasitesi |
installation_date | timestamp | evet | Kurulum tarihi |
address_id | int | evet | Konum |
is_active | boolean | hayır | Aktiflik |
create_time | timestamp | hayır | Oluşturma |
update_time | timestamp | hayır | Güncelleme |
9. pumps
pumps, fiziksel pompa varlığını tanımlar.
Neden vardır?
Pompa, telemetry üreten cihazdan farklı bir gerçek dünya nesnesidir. Aynı cihaz başka pompaya taşınabilir; aynı pompa başka cihazla izlenebilir. Bu nedenle ayrı varlık olmalıdır.
Kolonlar
| Kolon | Tip | Null | Anlamı |
|---|---|---|---|
id | int | hayır | Pompa anahtarı |
manufacturer_model_id | int | evet | Pompa modeli |
pump_type_id | int | evet | Pompa tipi |
name | varchar(100) | evet | Pompa adı |
description | varchar(255) | evet | Açıklama |
capacity_hp | int | evet | Güç kapasitesi |
flow_rate_m3_h | int | evet | Debi |
pipe_size | int | evet | Boru ölçüsü |
installation_date | timestamp | evet | Kurulum tarihi |
address_id | int | evet | Adres |
is_active | boolean | hayır | Aktiflik |
create_time | timestamp | hayır | Oluşturma |
update_time | timestamp | hayır | Güncelleme |
10. electricity_boxes
Bu tablo panoyu temsil eder.
Neden vardır?
Pompa doğrudan yalnız motor değildir; pano, trafo ve koruma ekipmanlarıyla birlikte çalışır. Pano, saha topolojisinde bağımsız ve kritik bir varlıktır.
Kolonlar
| Kolon | Tip | Null | Anlamı |
|---|---|---|---|
id | int | hayır | Pano anahtarı |
name | varchar(100) | evet | Pano adı |
description | varchar(255) | evet | Açıklama |
transformer_id | int | evet | Besleyen trafo |
auto_start_delay | int | evet | Gecikme ayarı |
address_id | int | evet | Adres |
is_active | boolean | hayır | Aktiflik |
create_time | timestamp | hayır | Oluşturma |
update_time | timestamp | hayır | Güncelleme |
11. pump_box_assignments
Pompa ile pano arasındaki tarihsel ilişkiyi taşır.
Neden vardır?
Pompa başka panoya taşınabilir veya saha topolojisi değişebilir. Bu ilişkiyi pumps ya da electricity_boxes tablosunda tek kolonla tutmak geçmişi yok eder.
Kolonlar
| Kolon | Tip | Null | Anlamı |
|---|---|---|---|
id | int | hayır | Atama anahtarı |
pump_id | int | hayır | Pompa |
electricity_box_id | int | hayır | Bağlı pano |
is_active | boolean | hayır | Halen aktif bağlantı mı |
assigned_at | timestamp | hayır | Bağlanma zamanı |
removed_at | timestamp | evet | Ayrılma zamanı |
notes | varchar(255) | evet | Not |
create_time | timestamp | hayır | Oluşturma |
update_time | timestamp | hayır | Güncelleme |
12. electricity_box_assets
Bu tablo pano içindeki ekipmanları modelleyen inventory katmanıdır.
Neden vardır?
Pano tek nesne değildir; içinde CT, kontaktör, softstarter, VFD, sigorta, termik röle gibi farklı ekipmanlar yaşar. Bunları bir açıklama alanına gömmek yerine ayrı satırlar halinde saklamak saha gerçekliğine daha uygundur.
Kolonlar
| Kolon | Tip | Null | Anlamı |
|---|---|---|---|
id | int | hayır | Varlık kaydı |
electricity_box_id | int | hayır | Bağlı pano |
manufacturer_model_id | int | hayır | Model |
role | enum | hayır | Varlığın panodaki rolü |
quantity | int | hayır | Adet |
serial_number | varchar(100) | evet | Seri no |
tag_no | varchar(100) | evet | Saha etiketi |
specs | json | evet | Ek teknik özellik |
is_active | boolean | hayır | Aktiflik |
notes | varchar(255) | evet | Not |
create_time | timestamp | hayır | Oluşturma |
update_time | timestamp | hayır | Güncelleme |
Örnek kayıt
{
"id": 14,
"electricity_box_id": 3,
"manufacturer_model_id": 6,
"role": "softstarter",
"quantity": 1,
"tag_no": "SS-01",
"specs": { "nominal_current_a": 370 },
"is_active": true,
"notes": "Direkt şebekeden beslenen panodaki soft starter"
}
13. land_plots
Bu tablo tarla/parsel varlığını taşır.
Neden vardır?
Sistem yalnız cihaz ve pompa izlemez; bunların hangi araziye hizmet ettiğini de bağlam olarak bilmek ister. Sulama, ürün planı ve saha operasyonları bu tablo üstünden bağlanır.
Kolonlar
| Kolon | Tip | Null | Anlamı |
|---|---|---|---|
id | int | hayır | Parsel anahtarı |
name | varchar(100) | evet | Parsel adı |
description | varchar(255) | evet | Açıklama |
address_id | int | evet | Konum |
block_number | varchar(50) | evet | Ada/parsel bloğu |
parcel_number | varchar(50) | evet | Parsel no |
area_sq_meter | int | evet | Alan |
irrigation_type_id | int | evet | Sulama tipi |
is_active | boolean | hayır | Aktiflik |
create_time | timestamp | hayır | Oluşturma |
update_time | timestamp | hayır | Güncelleme |
14. Atama Tabloları: land_plot_device_assignments, land_plot_pump_assignments, land_plot_crops
Bu tablolar fiziksel tarla bağlamının tarihsel yönetimini sağlar.
Neden vardır?
- bir cihaz başka parsele taşınabilir
- bir pompa farklı parsele hizmet verebilir
- aynı parselde farklı sezonlarda farklı ürün yetişebilir
Bu yüzden ilişki geçmişi ayrı tabloda tutulur.
15. address.* Şeması
Adres yapısı normalize biçimde şu tablolara ayrılmıştır:
address.provincesaddress.districtsaddress.neighborhoodsaddress.coordinatesaddress.addresses
Neden ayrı şema?
Bu yapı tekrar eden il/ilçe/mahalle verisini normalize eder ve koordinat bilgisini merkezi hale getirir. Aynı adres kaydının farklı saha nesneleri tarafından tekrar kullanılması mümkün olur.
Sonuç
Inventory & topology modeli, Cınga backend’in fiziksel dünya ile bağını kurar. Bu modelde cihaz, modem, SIM, pompa, pano, trafo ve parsel gibi varlıklar birbirinden ayrılır; aralarındaki ilişki ise assignment tabloları üzerinden tarihsel olarak izlenir.
Bu sayede saha değişimleri, ekipman taşımaları, modem/SIM değişimleri ve pompa-pano-topoloji dönüşümleri veri modelinde kaybolmadan temsil edilebilir.