# Crestron Proje Arşivi

Geçmiş Crestron projelerinizi bu klasöre koyun. Proje başına bir alt klasör önerilir:

```
programlar/
├── MUSTERI-A/
│   ├── SMW/…
│   ├── VTP/…
│   └── …
└── MUSTERI-B/
    └── …
```

## Bu klasörün git durumu

**Bu klasörde örnek olarak iki proje arşivi versiyonlanmıştır** — `NISANTASI UNIVERSITESI.zip`
ve `PRINCESS.zip`. Bu bilinçli bir karardır; araçların gerçek girdiyle çalıştığını göstermek
için depoda tutulurlar. `.gitignore` bu ikisini **ismen istisna** olarak tanır.

Bilmeniz gerekenler:

- Depo **private**'tır. Bu iki arşiv bayi adı, müşteri adı, personel adı ve cihaz IP'si taşır.
- Depo herkese açık hâle getirilirse veya çatallanırsa (fork) **bu veri onunla birlikte gider**.
- **Yeni** arşivler varsayılan olarak `.gitignore` tarafından dışarıda tutulur
  (`programlar/*`). Bir arşivi bilerek eklemek istiyorsanız `.gitignore`'a ismen bir
  istisna satırı yazmanız gerekir — aksi hâlde `git add` onu almaz.
- Bu klasör **salt okunurdur**: araçlar buradan okur, buraya yazmaz.

Sebebi hatırlatmak gerekirse: `.smw` dosyalarının başlık bloğu bayi (`DlrNm`) ve müşteri
(`CltNm`) adını taşır; projelerin içinde IP adresleri ve bazen şifreler bulunur. Otonom
çalışma kipi "her adımda `git add -A`" dediği için, yeni arşivlerin varsayılan olarak
dışarıda kalması önemlidir.

## Kullanımı

Arşivler bugün burada **ZIP içinde** duruyor. Araçlar bayrak verilmeden ZIP'in içine
inmez; `--zip-ac` olmadan sonuç `0 .smw, 0 .ir` çıkar.

```bash
# Format envanteri — hangi uzantıdan kaç dosya, hangisi metin hangisi ikili
python3 tools/arsiv-tarayici/tara.py --kok ./programlar --cikti ./rapor --zip-ac

# Cihaz envanteri — .smw ve .ir ayrıştırılır, DvC → model tablosu üretilir
python3 tools/arsiv-tarayici/envanter.py --kok ./programlar --cikti ./envanter --zip-ac
```

Arşivi **açılmış klasör** hâlinde tutuyorsanız bayrak gerekmez:

```bash
python3 tools/arsiv-tarayici/tara.py --kok ./programlar --cikti ./rapor
python3 tools/arsiv-tarayici/envanter.py --kok ./programlar --cikti ./envanter
```

Her iki aracın çıktısı da (`rapor/`, `envanter/`) gitignore'dadır. Neyin paylaşılabilir
olduğu ve maskelemenin **neyi kapsamadığı** için `tools/arsiv-tarayici/README.md`'ye bakın.
`ESLESTIRME-yerel.json` **paylaşılmaz**, gerçek proje adlarını içerir.

## `knx/` — KNX/ETS örnek projeleri (2026-08-30)

Aşama 3'ün (KNX içe aktarma) tek gerçek veri kaynağı. Beşi de `.gitignore`'da **ismen**
istisna tutulur; yeni dosyalar yine varsayılan olarak dışarıda kalır.

| Dosya | ETS | Şema | Ham GA | Ayrıştırılan | Cihaz | Durum |
|---|---|---:|---:|---:|---:|---|
| `CIKNX.knxproj` | 5.5 | 13 | 125 | 125 | 1 | yedek okuyucu |
| `DEMO.knxproj` | 5.5 | 13 | 78 | 78 | 21 | yedek okuyucu |
| `AET_SHOWROOM_SY04_11.01.22.knxproj` | 5.7 | 20 | 45 | 45 | 1 | tam |
| `YENI_OFIS.knxproj` | 5.7 | 20 | 239 | 239 | 12 | tam |
| `Yucel_Yetik_Ev_56.knxproj` | 5.7 | 20 | 427 | 427 | 59 | tam |
| `Dusler_Vadisi_629_SY01_06.07.23.knxproj` | 6.1 | 22 | 438 | 438 | 37 | tam |
| `CK_Villa_1.knxproj` | 6.4 | 23 | 877 | 877 | 42 | tam |
| `Zorlu_Raffles_23_Kat.knxproj` | ? | ? | (iç ZIP) | — | — | **PAROLALI** |

### Ölçülen üç gerçek — Aşama 3 bunlara dayanır

**1. `xknxproject` 3.10.0 ETS 5.5 (şema 13) dosyalarını SESSİZCE boş döndürür.**
`CIKNX` ve `DEMO` için "Found 0 group addresses" deyip **hatasız** çıkar; oysa ham
`0.xml` içinde 125 ve 78 grup adresi vardır, adları ve adresleri sağlamdır. Sebep:
kütüphanenin tanıdığı şema sabitleri 11 / 14 / 20 / 21'dir; 13 aradan düşer.
Şema 22 ve 23 (ETS 6.1 / 6.4) sorunsuz çalışır — yani yeniler zarifçe bozulmaz,
**eski şema sessizce boşalır.** Korpusun %25'i bu durumda.
→ **Zorunlu koruma:** ham `<GroupAddress>` sayısı ile ayrıştırılan sayı karşılaştırılır;
sapma varsa kapsam **hatası** üretilir. Sessiz başarı kabul edilmez (§15.1).

→ **ÇÖZÜLDÜ (2026-08-30): yedek okuyucu.** Kök neden ölçülmüş olduğu için sidecar,
kütüphane sıfır döndüğünde `<GroupAddresses>` bölümünü doğrudan XML'den okur.
`CIKNX` 125/125, `DEMO` 78/78 — toplam **203 grup adresi kurtarıldı**, ham XML'e karşı
bağımsız doğrulandı (**adres+ad uyuşmazlığı 0**). Kurtarılan kayıtlar
`source: "yedek-okuyucu"` taşır ve **tam ayrıştırma gibi sunulmaz**: iletişim nesnesi
ve cihaz bağları okunmaz, bu yüzden sınıflandırma güveni düşer. Kurtarma sessiz
değildir — `KNX-GA-KURTARILDI` (uyarı) ve `KNX-GA-KONUM-FARKLI` (kök neden) birlikte
üretilir. Yedek okuyucu her şeyi kurtaramaz; `Address` taşımayan elemanlarda kapsam
koruması hâlâ hata verir (testle kilitli).

**2. Parola koruması gerçek ve iki katmanlıdır (§11.2 doğrulandı).**
`Zorlu_Raffles` dıştan düz ZIP, içinde `P-06D3.zip` var ve o iç arşivin 3 girdisi
`compress_type=99` (**AES**) ile şifreli. Python stdlib `zipfile` bunu çözemez —
spesifikasyonun iddiası ölçümle doğrulandı. `xknxproject` temiz bir
`InvalidPasswordException: Password required.` atar; **sessiz başarısızlık yoktur**,
bu yol güvenlidir.

**3. `Function` kapsamı %0 (M-29).** Okunabilen yedi projenin hiçbirinde tek bir
`<Function>` öğesi yoktur. Sınıflandırma stratejisi Function'lara dayandırılamaz;
grup adresi adı, DPT ve grup aralığı yapısı kullanılmalıdır.

Diğer yedi dosyada KNX Secure yapılandırması yok (`Secure` dizgesi geçmiyor).

### Gizlilik — okunması gereken not

Dosyalar depoya **kullanıcının açık talimatıyla** eklendi (2026-08-30) ve içerikleri
ölçüldü. Ölçümün söylediği:

- **Gerçek IP: 1 adet** — `Dusler_Vadisi` içinde bir cihaz parametresinde. MAC, e-posta,
  parola belirteci: **sıfır**.
- **Proje adları anonim DEĞİLDİR.** Dosya içindeki `Name` alanları: `YÜCEL YETİK EVİ`
  (bir kişinin adı + evi), `Düşler Vadisi 629` (site adı + daire numarası), `CK VİLLA`,
  `YENİ OFİS`, `AET SHOWROOM`, `Zorlu Raffles 23. Kat` (bilinen bir bina).
  `CIKNX` ve `DEMO` gerçekten geneldir.
- Grup adresi adları oda ve mahal adı taşır (`Alt Kat Mutfak Tavan Sağ Spot` gibi).

Depo **private**'tır. Depo herkese açık hâle getirilirse veya çatallanırsa bu adlar
onunla birlikte gider. Anonimleştirilmiş kopyayla değiştirmek istenirse `Name` alanları
ve GA adları yerinde değiştirilebilir; dosyalar düz ZIP olduğu için bu tek geçişlik bir iştir.
