Calibration Servisi
Calibration Servisi, Stream Servisinden gelen stream.assembled.v1 eventini tüketip ham ölçüm değerlerini kalibrasyon kurallarına göre normalize eden mikroservistir.
Bu servis ham veriyi doğrudan DB segment tablolarına yazmaz. Çıktı olarak kalibre edilmiş veri setini bir sonraki katmana (Raw Writer) devreder.
Sorumluluk
stream.assembled.v1eventini consume etmek- Cihaz konfigürasyonundan CT oranını çözmek
- Kalibrasyon kuralını (
gain,offset) cihaz+global öncelikle çözmek - Değişken bazlı kalibrasyon uygulamak (kural yoksa pas geç)
- Başarıda
calibration.ready.v1, hatadacalibration.failed.v1üretmek
İşlem Akışı
Hesap Kuralı
İşlem sırası:
- CT dönüşümü (cihaz konfigürasyonu):
value_ct = raw_value * ct_ratio
- Kalibrasyon kuralı (değişken bazlı):
calibrated_value = value * gain + offset
Not:
- Kural bulunmayan değişken kalibrasyonda pas geçilir.
- Çıkış veri setinde kalibrasyon uygulanmış ve uygulanmamış alanlar birlikte taşınabilir.
Kural Çözümleme Önceliği
- Cihaz özel kural (
device_id = gerçek cihaz) - Global kural (
device_id = '0') - Kural yoksa pas geç
Bu öncelik deterministic olmalıdır.
Değişken Bazlı Kalibrasyon Uygulaması
Her değişken için uygulanacak kural aşağıdaki sırayla seçilir:
status = trueolan kayıtlar filtrelenir.- Zaman penceresi kontrol edilir:
valid_from <= device_timevalid_to is nullveyadevice_time <= valid_to
- Cihaz özel kayıtlar global kayıtlara göre önceliklidir.
- Aynı seviyede birden çok aday varsa:
priority ASCuygulanır (küçük değer daha öncelikli)- eşitlikte
update_timeen yeni olan seçilir.
Seçilen kural için uygulama:
value_calibrated = value_input * gain + offset
Kural bulunamazsa ilgili değişken pas geçilir (orijinal değer korunur).
Not: priority sıralama yönü servis konfigürasyonunda sabitlenmelidir; V1'de tek bir yön kullanılır ve dokümana kilitlenir.
CT Ratio Çözümleme Kaynağı
CT ratio çözümleme zinciri:
- Redis:
device:{device_id}:detail - Redis miss ise DB fallback:
devicestablosu (ct_ratio) - DB'den gelen değer Redis'e write-back edilir
Beklenen device detail örneği:
{
"device_id": "400000011D081B70",
"created_at": "2025-11-01T08:00:00Z",
"last_data_at": "2026-03-12T12:10:00Z",
"firmware": "1.0.7",
"iccid": "8946120802005507363",
"imei": "354485417650889",
"ct_ratio": 200.0,
"updated_at": "2026-03-12T12:10:00Z"
}
Not: ct_ratio bulunamazsa CT_CONFIG_MISS üretilir ve servis fallback olarak ct_ratio = 1 ile devam eder.
calibrations Tablo Şeması
| Kolon | Tip | Not |
|---|---|---|
id | bigint PK | Kayıt kimliği |
device_id | varchar(21) FK | 0 global kalibrasyon |
variable_id | varchar(30) FK | Kalibre edilen değişken |
gain | double precision | Çarpan |
offset | double precision | Ofset |
status | boolean | Aktif/pasif |
priority | integer | İkincil sıralama |
valid_from | timestamptz | Geçerlilik başlangıcı |
valid_to | timestamptz | Geçerlilik bitişi |
version | integer | Kural sürümü |
create_time | timestamptz | Oluşturma zamanı |
update_time | timestamptz | Güncelleme zamanı |
Kalibrasyon Kural Cache Modeli
Kalibrasyon kural çözümleme Redis öncelikli, DB fallback çalışır.
Çözümleme sırası:
- Redis cihaz key'i:
cal:{device_id}:latest - Redis global key'i:
cal:0:latest - Cache miss durumunda DB'den cihaz+global kuralları çöz, Redis'e write-back yap
Önerilen Redis gövdesi:
{
"device_id": "400000011D081B70",
"version": 12,
"variables": {
"IRMS_R": {
"gain": 1.015,
"offset": 0.002
},
"IRMS_S": {
"gain": 1.014,
"offset": 0.001
},
"IRMS_T": {
"gain": 1.016,
"offset": 0.003
}
},
"updated_at": "2026-03-12T12:00:00Z"
}
Notlar:
- Cihaz özel kural yoksa global (
device_id='0') fallback uygulanır. - Kural güncellemesinde cache invalidation zorunludur.
Event Sözleşmeleri
calibration.ready.v1
{
"event": "calibration.ready.v1",
"meta": {
"schema_version": 1,
"trace_id": "9f3f...",
"producer_service": "calibration-service",
"produced_at": "2026-03-11T15:22:09.102Z",
"process_ms": 14
},
"context": {
"device_id": "400000011D081B70",
"stream_id": 9823412,
"device_time": "2026-03-11T15:22:06Z",
"stream_time": "2026-03-11T15:22:09Z"
},
"data": {
"calibration_version": 12,
"calibrated": true,
"warnings": [
"CT_CONFIG_MISS"
]
},
"error": null
}
calibration.failed.v1
{
"event": "calibration.failed.v1",
"meta": {
"schema_version": 1,
"trace_id": "9f3f...",
"producer_service": "calibration-service",
"produced_at": "2026-03-11T15:22:09.140Z",
"process_ms": 13
},
"context": {
"device_id": "400000011D081B70",
"stream_id": 9823412
},
"error": {
"failed_stage": "calibration",
"error_code": "CAL_RULE_MISS",
"error_message": "calibration snapshot not found",
"failed_at": "2026-03-11T15:22:09Z"
}
}
Hata Kodları
CAL_RULE_MISSCT_CONFIG_MISSCAL_SNAPSHOT_INVALIDCALCULATION_ERROR
Redis Assembly Güncelleme ve Çıktı
Kalibrasyon uygulandıktan sonra servis aşağıdaki adımları uygular:
- Redis
device_buffer:{device_id}içindekiassembly.payload_mergedalanını kalibre değerlerle overwrite eder. assembly.calibrationmeta bloğu güncellenir:calibration_versionct_ratiocalibrated_at
- Ardından
calibration.ready.v1eventi üretilir.
Önerilen assembly kalibrasyon meta örneği:
{
"assembly": {
"payload_merged": {
"IRMS_R": 0.812,
"IRMS_S": 0.806
},
"calibration": {
"calibration_version": 12,
"ct_ratio": 200.0,
"calibrated_at": "2026-03-12T12:10:02Z"
}
}
}
Çıktı
Calibration Servisinin çıktısı:
- Redis'te kalibre edilmiş
assembly.payload_merged - Kafka'da
calibration.ready.v1eventi
Raw Writer Servisi bu eventi tüketerek ham segment tablolarına kalibre değerleri yazar.