Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bazen gelen ileti ihtiyacınız olan her şeyi içermez. Sıcaklık okuması bir cihaz kimliğiyle gelebilir, ancak görünen ad, konum ve ayar uzaklığı ayrı bir arama tablosunda bulunur. Zenginleştirme, bu dış verileri dönüştürme kurallarınıza çekmenizi sağlar.
Veri akışı graflarına genel bakış için bkz. Veri akışı graflarına genel bakış.
Dönüşümler, değerleri, test koşullarını ve referans alanlarını hesaplamak için bir ifade dili kullanır. İfadeler, girdilere isimle değil, konuma göre atıfta bulunur: listedeki inputs ilk girdi $1, ikinci girdi $2, ve benzeri.
cToF gibi yerleşik işlevler, bu değerleri dönüştürür ve işler.
Operatörler, fonksiyonlar, veri tipleri ve metaveri alanlarının tam listesi için İfadeler referansına bakınız.
Zenginleştirme isteğe bağlıdır ve bir varlık üzerinde tanımlayabileceğiniz veri setlerinden ayrı bir özelliktir. Veri akışı grafiklerinde, veri seti her zaman durum deposundan okunan bir bağlamlandırma veri seti anlamına gelir. Mesajlarınızda zaten ihtiyacınız olan alanlar varsa, veri setlerini yapılandırmanıza hiç gerek yok.
Zenginleştirme, map, filter ve branch dönüşümleriyle ve 1.1 veya sonraki sürümlerde pencere dönüşümlerindeki tetikleyici kurallarıyla çalışır.
Önkoşullar
- Kubernetes kümesinde dağıtılan Azure IoT İşlemleri örneği. Daha fazla bilgi için bkz. Deploy Azure IoT İşlemleri.
- Dağıtım, otomatik olarak 'ye
mcr.microsoft.comişaret eden varsayılan bir kayıt defteri uç noktasıdefaultoluşturur.
Bu makaledeki Azure CLI örnek, her değeri bir kez ayarlayabilmeniz ve ardından komutları kopyalayıp yapıştırmanız için ortam değişkenlerini kullanır as-is. Eğer hızlı başlangıçta Azure IoT İşlemleri Codespaces ortamını kullanıyorsanız, bu değişkenler zaten sizin için ayarlanmış ve bu adımı atlayabilirsiniz. Aksi takdirde, komutları çalıştırmadan önce shell'inizde aşağıdaki ortam değişkenlerini ayarlayın.
Aşağıdaki betikler en sık kullanılan ortam değişkenlerini ayarlar:
| Ortam değişkeni | Açıklama |
|---|---|
SUBSCRIPTION_ID |
Azure IoT İşlemleri örneğini içeren aboneliğin kimliği. |
RESOURCE_GROUP |
Azure IoT İşlemleri örneğini içeren kaynak grubunun adı. |
AIO_INSTANCE_NAME |
Azure IoT İşlemleri örneğinizin adı. Örneklerinizi listelemek için çalıştırın az iot ops list -o table. |
CLUSTER_NAME |
Azure Arc özellikli Kubernetes kümesinin adı, örneğini barındırıyor. |
LOCATION |
Yeni kaynaklar için kullanılacak Azure bölgesi, örneğin eastus. |
SUBSCRIPTION_ID=<subscription-id>
RESOURCE_GROUP=<resource-group-name>
AIO_INSTANCE_NAME=<instance-name>
CLUSTER_NAME=<cluster-name>
LOCATION=<region>
Sadece bu makalenin kullandığı değişkenleri ayarlamanız yeterlidir. Bu makale, seçtiğiniz kaynak adları için ek ortam değişkenleri kullanabilir. Makale, tanıtıldıkları yere nasıl yerleştirileceğini açıklıyor.
Durum deposunu ayarlayın
Çalışma zamanı, Azure IoT İşlemleri dağıtılmış durum deposundaki veri kümesi kayıtlarını okur. Her veri kümesi anahtarı NDJSON biçimindeki bir veya daha fazla kayıtla eşler (satır başına bir JSON nesnesi). Çalışma zamanı kayıtları önbelleer ve değişiklik bildirimleri alır, böylece durum deposu güncellemeleri işlem sırasında etki gösterir.
Dağıtılmış durum depoyu yapılandırma hakkında bilgi için bkz. Durum deposuna genel bakış.
Eyalet deposu anahtarını doldur
Eyalet mağazası önceden doldurulmuş değil. Veri seti kayıtlarını MQTT üzerinden eyalet deposunun SET komutunu kullanarak yazabilirsiniz. Bu makalenin ilerleyen bölümlerinde yapılandırılacak device-metadata as device veri kümesi için, device-metadata anahtarı altında iki NDJSON kaydını (satır başına birer kayıt) tohumlamak üzere aşağıdaki isteği yayımlayın. Bu veri setini kullanan kurallar tarafından referans verilen tüm alanları dahil edin, bunlar locationarasında .
Geliştirilmiş bir veri akışı grafiğini zenginleştirme örneği bu makalenin ilerleyen bölümlerinde location kullanılır. Aksi takdirde, alan her mesaj için şöyle çözülür null :
mosquitto_pub -h <BROKER_HOST> -p <BROKER_PORT> -V mqttv5 -q 1 \
-t 'statestore/v1/FA9AE35F-2F64-47CD-9BFF-08E2B32A0FE8/command/invoke' \
-D publish response-topic 'clients/dataflow-docs-client/services/statestore/_any_/command/invoke/response' \
-D publish correlation-data '1' \
-D publish user-property __ts "$(date +%s%3N):0:dataflow-docs-client" \
-m $'*3\r\n$3\r\nSET\r\n$15\r\ndevice-metadata\r\n$153\r\n{"deviceId":"dev-001","displayName":"Line 1 Sensor","location":"Building A"}\n{"deviceId":"dev-002","displayName":"Line 2 Sensor","location":"Building B"}\r\n'
ve $15$153 değerleri, anahtarın (device-metadata) bayt uzunlukları ve ardından gelen değerdir. Başarılı bir SET, yanıt konusunda +OK ile yanıt verir. Tam istek formatı, gerekli MQTT v5 özellikleri ve yanıt kodları için durum deposu protokol referansına bakınız.
Veri kümesini yapılandırma
datasets, map ve filter dönüşümleri için veri kümelerini kural yapılandırmanızın en üst düzeyindeki branch dizisinde tanımlayın.
Pencere dönüşümleri için (sürüm 1.1 veya daha sonra), yapılandırma içinde triggers veri setlerini yapılandırın. Detaylar için bkz. Veri akışı grafiklerinde pencere dönüşümleriyle veri topla.
Dönüştürme yapılandırmasında bir veri kümesi ekleyin. Yapılandırmak:
| Setting | Açıklama |
|---|---|
| Durum deposu anahtarı | Veri kümesi kayıtlarının depolandığı anahtar.
as kullanarak bir diğer ad atayın (örneğin, device-metadata as device). |
| Girişleri eşleştirme | Karşılaştıracak alanlar: biri kaynak iletiden ($source.<field>) ve biri veri kümesinden ($context.<field>). |
| İfadeyi eşleştir | Boole ifadesi (örneğin, $1 == $2). |
Her veri kümesi girdisi şu özelliklere sahiptir:
| Mülkiyet | Zorunlu | Açıklama |
|---|---|---|
key |
Evet | Veri kümesi kayıtlarının depolandığı durum deposu anahtarı.
as anahtar sözcüğüyle isteğe bağlı bir takma ad destekler. Bu anahtarı doldurmak için MQTT üzerinden bir SET istek yayınlayın (bkz. Durum deposu anahtarını doldur). |
dynamicValues |
Hayı | Mesaj alanı yollarının listesi $N , çalışma keyzamanının her mesaj için durum deposu anahtarını türetmesine izin verecek yer tutuculara yerleştirilmiştir.
Dinamik tuşlar sayfasına bakınız. |
inputs |
Evet | Eşleştirme ifadesinde kullanılan alan başvurularının listesi. Her girdi bir $source. veya $context. ön eki kullanır. |
expression |
Evet | Gelen iletiyle hangi veri kümesi kaydının eşleştiğini belirleyen boole ifadesi. |
Anahtar ve rumuz
key çalışma zamanının okuduğu durum deposu anahtar değeridir. Anahtar kelimeyi as kullanarak daha kısa bir takma ad atayın. Örneğin, datasets.parag10.rule42 as position alanlara $context(position).WorkingHours olarak başvurmanızı sağlar.
Bir anahtar, çalışma zamanının her mesaj için ayrı ayrı çözülen bir şablon olabilir. Daha fazla bilgi için Dinamik tuşlar sayfasına bakınız.
Dinamik anahtarlar
Statik key , aynı eyalet mağaza kaydından gelen tüm mesajları zenginleştirdiğinizde iyi çalışır. Ama bazen her mesajın farklı bir kayıt gerektirmesi olur. Örneğin, cihaz başına kalibrasyon verilerinde, bakacak kayıt, gelen mesajdaki bir alana bağlıdır.
Her olası arama değeri için ayrı bir veri seti (ve ayrı bir grafik) dağıtmak yerine, , key, ve benzeri yer tutucularla bir şablon $1oluşturun$2. Her yer tutucu için ikame edilecek mesaj alanını listeleyen bir dynamicValues özelliği ekleyin. Çalışma zamanı, durum deposunu sorgulamadan önce her mesaj için şablonu çözümler.
İpucu
Bir dinamiği, key kullanarak bir takma adla eşleştirin. Çözülen anahtar değil, takma ad, kurallarda $context(<alias>).<field>referans verdiğiniz sabit isimdir. Temel anahtar mesaj başına değişse de, takma adı sabit bir tanımlayıcı olarak kalın.
Ön koşul: Dinamik durum deposu anahtarını doldurun
Çözümlenen anahtar veriye dayalı olduğundan, aramayı beklediğiniz her çözümlenmiş değer için durum deposunu bir kayıtla doldurmanız gerekir. Aşağıdaki bölümdeki örnekte, ile sensorId: "TEMP-42"bir mesaj için çalışma zamanı arar calibration:TEMP-42ve tam olarak o anahtar için bir SET talep yayınlayın. Kayıt, veri setinin eşleşmesinde inputs kullanılan tüm alanları (burada, sensorIdgelen mesajın $source.sensorIdkarşılaştırmasıyla karşılaştırıldığında) ve kuralların zenginleştirdiği alanlara ek olarak içermelidir, örneğin offset. Aksi takdirde, maç asla başarılı olmaz ve zenginleştirme alanları kullanılabilir kalmaz:
mosquitto_pub -h <BROKER_HOST> -p <BROKER_PORT> -V mqttv5 -q 1 \
-t 'statestore/v1/FA9AE35F-2F64-47CD-9BFF-08E2B32A0FE8/command/invoke' \
-D publish response-topic 'clients/dataflow-docs-client/services/statestore/_any_/command/invoke/response' \
-D publish correlation-data '1' \
-D publish user-property __ts "$(date +%s%3N):0:dataflow-docs-client" \
-m $'*3\r\n$3\r\nSET\r\n$19\r\ncalibration:TEMP-42\r\n$33\r\n{"sensorId":"TEMP-42","offset":5}\r\n'
ve $19$33 değerleri, anahtarın (calibration:TEMP-42) bayt uzunlukları ve ardından gelen değerdir. Başarılı bir SET, yanıt konusunda +OK ile yanıt verir. Tam istek formatı, gerekli MQTT v5 özellikleri ve yanıt kodları için durum deposu protokol referansına bakınız.
Dinamik değerlerle bir veri seti yapılandırma
Dönüşüm yapılandırmasında bir veri seti ekleyin ve şunu yapılandırın:
| Setting | Açıklama |
|---|---|
| Durum deposu anahtarı | Mesaj alanının işlem zamanında yerine $1 geçtiği bir şabloncalibration:$1 as calibration. Çözülmüş anahtarı doldurmak için, MQTT üzerinden bir SET istek yayınlayın (bkz. Dinamik durum deposu anahtarını doldurun). |
| Dinamik değerler | Her bir yer tutucunun yerine sırasıyla kullanılacak mesaj alanı (örneğin, sensorId). |
| Eşleşme girişleri / Eşleşme ifadesi | Statik anahtarlı veri setiyle aynı şekilde yapılandırın. |
sensorId: "TEMP-42" içeren bir mesaj için çalışma zamanı, durum deposunu sorgulamadan önce şablonu calibration:TEMP-42 olarak çözümler. Eşleşen kaydın offset alanı şu şekilde $context(calibration).offsetkullanılabilir hale gelir.
Eksik alanlar için varsayılan değerler
dynamicValues içindeki her giriş, mesaj alanı eksik olduğunda veya ?? olduğunda kullanılan bir null varsayılanı içerebilir. Bir varsayılan değer olmadan, eksik veya null alanı o iletinin işlenmesinin başarısız olmasına neden olur.
{
"key": "calibration:$1 as calibration",
"dynamicValues": ["sensorId ?? \"unknown\""]
}
Kelimenin tam anlamıyla kaçmak $
Sisteminizdeki durum deposu anahtarları zaten gerçek bir $ karakteri içeriyorsa, şablonda bunu $$ olarak kaçışlayın. Sadece $N (a'dan $ sonra rakamlar) yer tutucu olarak kabul edilir.
$$ her zaman tek bir sabit değer $ üretir.
{
"key": "rate:$$USD:$1",
"dynamicValues": ["region ?? \"us\""]
}
region: "eu" içeren bir mesaj için bu, rate:$USD:eu olarak çözümlenir.
Bileşik anahtarlar
Bir şablon, birden fazla mesaj alanına referans verebilir. Her $N, sırasıyla dynamicValues içindeki karşılık gelen girdiye karşılık gelir:
{
"key": "line:$1:station:$2 as lineStatus",
"dynamicValues": ["lineId ?? \"unknown\"", "stationId ?? \"0\""]
}
lineId: "L-3" ve stationId: "7" içeren bir mesaj için bu, line:L-3:station:7 olarak çözülür.
Note
Sadece dize, sayı ve boolean mesaj alanları bir anahtara değiştirilebilir. Nesne ve dizi alanları dinamik anahtar değerleri olarak desteklenmez. Birini kullanmak, mesaj işlenirken hata ile sonuçlanır.
Önemli
Aşağıdaki hatalar, grafik uygulandığında doğrulanır, mesajlar işlendiğinde değil:
-
$Niçindeki giriş sayısından büyük bir indekse sahipdynamicValuesyer tutucusu. -
dynamicValuesüzerinde yapılandırılmış, escape edilmemişkeyyer tutucusu içermeyen bir$Nliste. - Hatalı biçimlendirilmiş bir yer tutucu; örneğin
$0veya ardından bir rakam gelmeyen bir$.
Grafiği uygulamadan önce bu hataları düzeltin. Daha sonra mesaj işleme hataları olarak ortaya çıkmazlar.
Çözülen anahtar veri odaklı olduğu için, her mesaj için farklı olabilir. Zenginleştirme aramaları için tanılama günlüğe kaydetmeyi veya izlemeyi etkinleştirirseniz, yapılandırılan şablon yerine çözümlenen anahtarı (örneğin, calibration:TEMP-42) göreceğinizi bekleyin.
Veri kümesi girişleri
Dizideki inputs her girdi, değerin nereden geldiğini belirtmek için bir ön ek kullanır:
-
$source.<field>: gelen iletiden okur. -
$context.<field>: değerlendirilmekte olan veri kümesi kaydından okur.
Girişler herhangi bir sırada görünebilir ve $source ve $context referanslarını özgürce karıştırarak kullanabilirsiniz. Veri kümesi tanımlarında joker karakter girişleri desteklenmez.
İfadeyi eşleştir
expression bir boole değeri olarak değerlendirilir. Çalışma zamanı kaynak kümesini durum deposundan NDJSON (satır başına bir JSON nesnesi) olarak yükler, kaynak verileri yineler ve ifadenin true olduğu ilk kaydı döndürür.
Eğer hiçbir kayıt eşleşmezse, zenginleştirme alanları kullanılamaz. Onlara bağlı olan kurallar hâlâ çalışır, ancak mesajı başarısız etmek yerine çıktı alanını bir null değerle yazırlar. Kural çıktıdan kaldırılmaz, yalnızca çözümlenen değeri null olur.
Kurallarda zenginleştirilmiş verileri kullanma
Herhangi bir kuralın inputs dizisinde eşleşen kayıt alanlarına referans olarak $context(<alias>).<fieldPath>.
Harita örneği
Zenginleştirilmiş alanlara başvuran harita kuralları ekleyin:
| Giriş | Çıkış |
|---|---|
$context(position).WorkingHours |
WorkingHours |
rawValue ve $context(product).multiplier |
adjustedValue (ifade: $1 * $2) |
Filtre örneği
Filtre kuralı eklemek için rawValue, $context(limits).multiplier, ve $context(limits).baseLimit girişlerini ve $1 * $2 > $3 ifadesini kullanın.
Dal örneği
quantity, $context(mult).factor, ve $context(mult).threshold girdileri ve $1 * $2 > $3 ifadesiyle bir dal kuralı yapılandırın.
Veri kümeleriyle joker karakterler
Harita kurallarında, eşleşen veri kümesi kaydındaki tüm üst düzey alanları kopyalamak için $context(<alias>).* kullanın.
Giriş $context(device).* ve çıkış * ile bir eşleme kuralı ekleyin.
Joker kartlar ayrıca veri seti kaydı içindeki iç içe bir nesneyi hedefleyebilir. Örneğin, $context(device).configuration.* yalnızca altındaki configurationalanları kopyalar.
Sadece harita kuralları joker kart zenginleştirme girişlerini destekler. Filtre ve dal kuralları joker karakter girişlerini desteklemez.
Zenginleştirilmiş veri akışı grafiği dağıtma
İşlemler deneyiminde zenginleştirme ile bir veri akışı grafı oluşturun:
- MQTT konunuzdan okuyan bir kaynak ekleyin.
- Harita dönüşümü ekleyin. Veri kümesi yapılandırmasında, durum deposu anahtarı ve eşleşme koşuluyla bir veri kümesi ekleyin.
- Harita kurallarında, zenginleştirilmiş alanlara sözdizimi kullanılarak
$context(<alias>).<field>referans verin. - Çıkış konunuza gönderim yapacak bir hedef ekleyin.
Zenginleştirme sınırlamaları
- Pencere desteği sadece tetikleyici içindir. Pencere dönüşümlerinde, veri seti zenginleştirmesi tetikleyici kurallar (
triggers.datasets) içindeazureiotoperations/graph-dataflow-window:1.1.0veya sonrasında mümkündür, birikim kuralları için değil. - İlk maç kazanır. Çalışma zamanı, ifadenin
trueolarak değerlendirildiği ilk kaydı kullanır. - Eksik eşleşmeler mesajın başarısız olmasına neden olmaz. Eğer hiçbir veri seti kaydı eşleşmezse, referans
$context(<alias>)alanları olan kurallar yine çalışır ama çözüme ulaşır.nullÇıkış alanı birnulldeğerle mevcut, atlanmamıştır. Dönüştürme başarısız olmaz. - Durum depolama hataları yayılır. Durum deposuna ulaşılamıyorsa, bu iletiyi dönüştürme işlemi başarısız olur.
- Veri kümesi tanımlarında joker karakter girişi yok. Her bir giriş
$source.<field>veya$context.<field>belirli bir başvuru olmalıdır.