ããŒã¿ããã¯ãšã³ã
IronFlockã¯åãããžã§ã¯ãã«TimescaleDBæèŒã®ãã©ã€ããŒãããŒã¿ããŒã¹ãããããžã§ãã³ã°ããŸããã¢ããªãããŒã¿ã¹ããŒããå®çŸ©ãããšãããã€ã¹ãã¢ããªã«è¿œå ãããç¬éã«IronFlockãããŒãã«ãäœæããŠããŒã¿åéãéå§ããŸãã
ä»çµã¿
.ironflock/data-template.ymlã§ããŒã¿ã¹ããŒããå®çŸ©ããŸãã- IronFlock SDKã䜿çšããŠãšããžã³ãŒãããããŒã¿ãéä¿¡ããŸãã
- IronFlockã¯ã¢ããªãã€ã³ã¹ããŒã«ãããåãããžã§ã¯ãã«ããŒã¿ããŒã¹ããŒãã«ãèªåçã«ã»ããã¢ããããŸãã
- ããŒã¿ã¯ããã€ã¹ããã¡ãã»ãŒãžã³ã°ã·ã¹ãã ãçµç±ããŠãããžã§ã¯ãããŒã¿ããŒã¹ã«æµã蟌ã¿ãŸãã
åãããžã§ã¯ãã¯ç¬èªã®ç©çããŒã¿ããŒã¹ãæã¡ãŸã â ãããžã§ã¯ãéã§ã®ããŒã¿å ±æã¯ãããŸããã
ãŠãŒã¶ãŒã¯ããã®ãããžã§ã¯ãå ã§ã¢ããªãåéããããŒã¿ãå®å šã«ç®¡çã§ããŸããéçºè ãšããŠãã®ããŒã¿ã«ã¢ã¯ã»ã¹ããããšã¯ã§ããŸããã
ããŒã¿ã¹ããŒãã®å®çŸ©
.ironflock/ãã£ã¬ã¯ããªã«data-template.ymlãã¡ã€ã«ãäœæããŸãïŒ
data:
tables:
- tablename: sensordata
columns:
- id: tsp
name: Timestamp
description: Timestamp of measurement
path: args[0].timestamp
dataType: timestamp
- id: temperature
name: Temperature
description: Temperature reading in Celsius
path: args[0].temperature
dataType: numeric
- id: humidity
name: Humidity
description: Relative humidity percentage
path: args[0].humidity
dataType: numeric
- id: device_id
name: Device ID
description: Source device identifier
path: args[0].device_id
dataType: stringã«ã©ã ãªãã·ã§ã³
| ãã£ãŒã«ã | 説æ |
|---|---|
id | å
éšã«ã©ã èå¥åïŒã¿ã€ã ã¹ã¿ã³ãã«ã©ã ã«ã¯tspã䜿çšïŒ |
name | ããŒãã§è¡šç€ºããã人éãèªã¿ãããã«ã©ã å |
description | ãªãã·ã§ã³ã®èª¬æ |
path | éä¿¡ãããããŒã¿ãªããžã§ã¯ãå
ã®å€ãžã®ãã¹ïŒäŸïŒargs[0].temperatureïŒ |
dataType | timestampãnumericãstringãbooleanã®ãããã |
secret | ãã®ã«ã©ã ãä¿åæã«æå·åããéåžžã®èªã¿åãã§ã¯æ±ºããŠå¹³æã§è¿ããŸãã â åŸè¿°ã®ã·ãŒã¯ã¬ããã«ã©ã ãåç § |
ã·ãŒã¯ã¬ããã«ã©ã
ä¿åã¯ããªããã°ãªããªããã®ã®ã決ããŠè¡šç€ºããŠã¯ãªããªãå€ããããŸããAPIããŒã¯ã³ãããã€ã¹ã®ãã¹ã¯ãŒããã©ã€ã»ã³ã¹ããŒãªã©ã§ããã«ã©ã ã«secret: trueãæå®ãããšãããŒã¿ããã¯ãšã³ããæ¿å
¥æã«ãããæå·åããŸãïŒ
- tablename: credentials
columns:
- id: tsp
dataType: timestamp
- id: device_id
dataType: string
- id: api_token
dataType: string
secret: trueãã以éãéåžžã®èªã¿åããå¹³æãè¿ãããšã¯äžåãããŸãã â ãã®ããŒã¿ãæžã蟌ãã ã¢ããªèªèº«ã«å¯ŸããŠãã§ãïŒ
| èªã¿åãçµè·¯ | è¿ã£ãŠãããã® |
|---|---|
| ããŒãããŠã£ãžã§ããããã®ä»ã¡ãã»ãŒãžã«ãŒã¿ãŒçµç±ã®ãã¹ãŠ | ãã¬ãŒã¹ãã«ã__secret__ |
| SQLã¢ã¯ã»ã¹ïŒFleetDB Accessã®Postgresãã°ã€ã³ïŒ | ä¿åãããæå·æifsec:1:⊠|
| SDKã®reveal颿° | 埩å·ãããå€ |
NULLã¯ã©ãã§ãNULLã®ãŸãŸãªã®ã§ããèšå®æžã¿ã ãé衚瀺ããšãäžåºŠãæžã蟌ãŸããŠããªããã¯åŒãç¶ãåºå¥ã§ããŸãã
ã·ãŒã¯ã¬ãããå¹³æã§èªã¿æ»ããã®ã¯ãã¢ããªèªèº«ã®ã³ã³ããããSDKçµç±ã§è¡ãå Žåã ãã§ã â SDKãªãã¡ã¬ã³ã¹ã®ã·ãŒã¯ã¬ããã«ã©ã ãåç §ããŠãã ãããããŒããä»ã®ã¢ããªããããååŸããææ®µã¯ãŸã£ãããããŸãããã ãããããå¹³æã§æ±ºããŠè¡šç€ºãããªããããèŠãããã§ã¯ãªãäºå®ã«ãªããŸãã
ã·ãŒã¯ã¬ããã倱ããã«è¡ãæŽæ°ããããšã³ãã£ãã£ããŒãã«ã§ã¯ãè¡ãç·šéããã¯ã©ã€ã¢ã³ããæ¬ç©ã®ã·ãŒã¯ã¬ãããéãè¿ãããšã¯æ±ºããŠã§ããŸãã â èªã¿åãã§åŸãããã®ã¯åžžã«ãã¬ãŒã¹ãã«ãã ãã ããã§ãããã®ããããŒã¿ããã¯ãšã³ãã¯ãæžãèŸŒã¿æã®ãã¬ãŒã¹ãã«ã__secret__ïŒããã³ããŒãã衚瀺ãããã¹ã¯â¢â¢â¢â¢â¢â¢â¢â¢ïŒãçŽåã®å€ãç¶æãããšããæå³ã«è§£éããã·ãŒã¯ã¬ããã«ã©ã ãçç¥ãããå Žåãåæ§ã«ç¶æããŸããæç€ºçã«nullãéä¿¡ãããšã·ãŒã¯ã¬ããã¯ã¯ãªã¢ãããŸãããããã£ãŠãããŒãã®ãã©ãŒã ã§æ©æ¢°ã®èª¬æãç·šéããŠãããã®ã¢ã¯ã»ã¹ã³ãŒããæ¶ããããšã¯ãããŸããã
ãããã2ã€ã®åž°çµãå°ãããŸãããªãã©ã«æåå__secret__ããã³â¢â¢â¢â¢â¢â¢â¢â¢èªäœãã·ãŒã¯ã¬ããå€ãšããŠä¿åããããšã¯ã§ããïŒçã®ifsec:âŠæå·æãå
¥åãšããŠæåŠãããŸãïŒããšã³ãã£ãã£ããŒã®ãªãããŒãã«ã§ã¯ãã¬ãŒã¹ãã«ãã®æžã蟌ã¿ã¯æåŠãããŸã â ç¶æãã¹ãçŽåã®è¡ãååšããªãããã§ãã
次ã®ç¹ã¯æéã§ã¯ãªãããŒããªå¶çŽãªã®ã§ããããããèšèšã«ç¹ã蟌ãã§ãããŠãã ããã
- **ã·ãŒã¯ã¬ããã«ã©ã ã¯æååã®ã¿ã§ãã**æå·åã¯ããã¹ããçæããããã
numericãbooleanãtimestampã®ã«ã©ã ãã·ãŒã¯ã¬ããã«ããããšã¯ã§ããŸãããå¿ é ã®tspã«ã©ã ãã·ãŒã¯ã¬ããã«ã¯ã§ããŸããã - **ã·ãŒã¯ã¬ããã«ã©ã ã§ãã£ã«ã¿ãã°ã«ãŒãåããœãŒããè¡ãããšã¯ã§ããŸããã**åè¡ã¯ããããç¬èªã®ã©ã³ãã ãªå€ã§æå·åããããããåãã·ãŒã¯ã¬ãããä¿æãã2ã€ã®è¡ã¯ç°ãªãæå·æãä¿åããŸããã·ãŒã¯ã¬ããã«ã©ã ã«å¯Ÿããç䟡ãã£ã«ã¿ã
GROUP BYãORDER BYãDISTINCTã¯ãåççã«æ©èœããŸãããããã®å€ã¯äžèŽãããïŒãã«çããã«ã¯ãäœãè¿ããã«ããŒã¿ããã¯ãšã³ãå éšã§æ¯èŒãè¡ãSDKã®verify颿°ã䜿çšããŠãã ããã - **ã·ãŒã¯ã¬ããã«ã©ã ããšã³ãã£ãã£ããŒã«ããããšã¯ã§ããŸããã**è¡ããšã«æå·æãç°ãªãããããšã³ãã£ãã£ããšã®ææ°ã®è¡ãèªã¿åããšãåè¡ãããããå¥ã®ãšã³ãã£ãã£ãšããŠæ±ãããŠããŸããŸãããã®ããã
maintainLatestFlagForã§ã·ãŒã¯ã¬ããã«ã©ã ãæå®ããããšã¯æç¢ºã«æåŠãããŸãã
æåŸã®2ã€ã®å¶çŽã¯ããŒã¿ãã³ãã¬ãŒãã®æ€èšŒæã«ãã§ãã¯ãããŸãããã®ããããããã«éåããããŒãã«ã¯ãåŸããäžæ£ã«åäœããã®ã§ã¯ãªããªãªãŒã¹æã«å€±æããŸãã
ããŒãã«ãªãã·ã§ã³
columnsã®ã»ãã«ãããŒãã«ã®èª¬ææ¹æ³ãšããŒã¿ã®çµå¹Žç®¡çãå¶åŸ¡ãããªãã·ã§ã³ããŒãããã€ããããŸãã
data:
tables:
- tablename: sensordata
description: 補é çŸå Žã®ç°å¢æž¬å®å€
chunkTimeInterval: 1 hour
dropAfter: 30 days
columns:
# ...| ãã£ãŒã«ã | 説æ |
|---|---|
tablename | ããŒãã«å |
description | ãªãã·ã§ã³ã®èª¬æãUIã«è¡šç€ºãããAIãšãŒãžã§ã³ããããŒãã«ãçè§£ããããã«äœ¿çšããŸã |
chunkTimeInterval | ããŒãã«ãåå²ããæéããŒãã£ã·ã§ã³ã®ãµã€ãºãããã©ã«ãã¯7 days |
dropAfter | ä¿ææé â ããããå€ãããŒãã£ã·ã§ã³ã¯èªåçã«åé€ãããŸã |
downsample | é·æãŠã£ã³ããŠã®ãã£ãŒããé«éåããããã®äºåéèšæžã¿ã³ããŒãç¶æããŸã â åŸè¿°ã®ç¶ç¶çããŠã³ãµã³ããªã³ã°ãåç § |
maintainLatestFlagFor | äžæã®ãšã³ãã£ãã£ãèå¥ããã«ã©ã â åŸè¿°ã®ãšã³ãã£ãã£ã®ææ°ç¶æ ã®è¿œè·¡ãåç § |
private | ãã®ããŒãã«ãä»ã®ã¢ããªããé ããŸã â åŸè¿°ã®ä»ã®ã¢ããªãšã®ããŒã¿å ±æãåç § |
**chunkTimeInterval**ã¯ãæç³»åããŒã¿ããã£ã¹ã¯äžã§ã©ãåå²ããããæ±ºããŸãã1ã€ã®ããŒãã£ã·ã§ã³ãäžåºŠã«åãåãããããŒã¿éãšããããäžèŽããããã«éžãã§ãã ãããæ¯ç§åéããããããªé«é »åºŠããŒã¿ã¯å°ããªãã£ã³ã¯ïŒåãæéïŒããå€åã®é
ãããŒã¿ã¯å€§ããªãã£ã³ã¯ïŒé±ïŒãé©ããŠããŸããããã¯ã¢ããªã®ããã©ã«ãå€ã«ãããããããžã§ã¯ãã®ææè
ã¯åŸããèªèº«ã®ããŒã¿ããã¯ãšã³ãã§èª¿æŽã§ããŸãã
**dropAfter**ã¯ãããŒãã«ãããŒãªã³ã°ãŠã£ã³ããŠã«å€ããŸããæå®ããæéããå€ãããŒãã£ã·ã§ã³ã¯ãŸãããšåé€ããããããè¡ã1ä»¶ãã€åé€ããããã¯ããã«äœã³ã¹ãã§ããã¯ãªãŒã³ã¢ãããžã§ãã¯dropAfter / 4ã®ééã§å®è¡ããããããã¬ã³ãŒãã¯ããŒãã£ã·ã§ã³ãåé€ããããŸã§ãæå€§ã§æéã®4åã®1ã ãæå¹æéãè¶
ããŠæ®ãããšããããŸããããŒã¿ãç¡æéã«ä¿æããã«ã¯dropAfterãçç¥ããŠãã ããã
ããããPostgreSQLã®ééæååãåããŸã â 30 minutesã1 hourã7 daysã6 monthsã
ç¶ç¶çããŠã³ãµã³ããªã³ã°
ããã·ã¥ããŒãã¯ããŒã¿ããŒã¹ã«ããŒã¿ã®éèšãäŸé Œã§ããŸã â 1æéããšã®å¹³åã1æ¥ããšã®åèšãæ©æ¢°ããšã®ä»¶æ°ãªã©ããããçã¬ã³ãŒãããèšç®ããã®ã¯ã1æ¥åã§ããã°åé¡ãããŸãããã1幎åãšãªããšé«ã³ã¹ãã§ããããŒãã«ã«downsampleã远å ãããšããã©ãããã©ãŒã ã¯ç¶ç¶çã«æŽæ°ãããäºåéèšæžã¿ã®ã³ããŒãç¶æããé·æãŠã£ã³ããŠã®ã¯ãšãªã«ã¯ãã®ã³ããŒããå¿çããããã«ãªããŸãïŒ
data:
tables:
- tablename: sensordata
dropAfter: 30 days
downsample:
bucket: 1 minute
keepFor: 2 years
paths:
- payload.temperature
columns:
# ...| ãã£ãŒã«ã | 説æ |
|---|---|
bucket | äºåéèšæžã¿ã³ããŒã®ç²åºŠãããã©ã«ãã¯1 minute |
keepFor | ããŠã³ãµã³ããªã³ã°æžã¿å±¥æŽãä¿æããæéãçç¥ãããšç¡æéã«ä¿æãããŸã |
paths | 察象ã«å«ããJSONãã£ãŒã«ãã®ãã¹ãããã·ã¥ããŒããšåãèšæ³ã䜿çšããŸã |
**bucket**ã¯ããã£ãŒãã«æäŸã§ããæã现ããè§£å床ã§ããããããã¯ããã«çްãããã±ãããèŠæ±ãããã£ãŒãã¯ã代ããã«çããŒãã«ãèªã¿åããŸãã1æ¥ãåçã«åå²ãã1 secondãã1 dayãŸã§ã®åºå®å¹
ã®ééïŒ1 minuteã5 minutesã1 hourãªã©ïŒãæå®ã§ããŸããããã©ã«ãã®1 minuteã¯å®è³ªçã«ããããããã·ã¥ããŒãã«é©ããŠããŸãããã±ãããç²ããããšãã¹ãã¬ãŒãžãšæžã蟌ã¿ã¹ã«ãŒãããã®ã³ã¹ããäžãããŸãã
**keepFor**ã¯ãããããé·æå±¥æŽãå¯èœã«ããããã®èšå®ã§ããçã¬ã³ãŒãã¯dropAfterã«ãã£ãŠæ¶ããŠãããŸãããããŠã³ãµã³ããªã³ã°æžã¿ã®ã³ããŒã¯ç¬èªã®ä¿ææéãæã¡ãŸããçããŒã¿ã30æ¥ãããŠã³ãµã³ããªã³ã°æžã¿ããŒã¿ã2幎éä¿æããã°ãããŒãã¯ããäžéšã®ã¹ãã¬ãŒãžã§2幎åã®1æéå¹³åããã£ãŒã衚瀺ã§ããŸããdropAfterããé·ãèšå®ããŠãã ãã â éã®èšå®ã¯èª€èšå®ãšããŠãã©ãããã©ãŒã ãæåŠããŸãã
**paths**ã¯ãããŠã³ãµã³ããªã³ã°ãJSONã«ã©ã å
ã®å€ã«ãåºããŸããæ°å€ã«ã©ã ã¯èªåçã«å«ãŸããŸãããJSONã«ã©ã ã«ã¯åºå®ã®ããŒéåããªããããJSONãã£ãŒã«ãã¯æç€ºçã«æå®ããå¿
èŠããããŸãã宣èšãããŠããªããã£ãŒã«ããããã·ã¥ããŒãã§ã¯åé¡ãªãåäœããŸã â åã«çããŒãã«ããèšç®ãããã ãã§ãã
ãã以å€ã¯ãã¹ãŠèªåã§ãããã¹ãŠã®æ°å€ã«ã©ã ã«ã€ããŠçµ±èšïŒå¹³åãåèšãæå°å€ãæå€§å€ãæåã®å€ãæåŸã®å€ãã¬ã³ãŒãä»¶æ°ïŒãç¶æãããããŒãã«ã®ãšã³ãã£ãã£ããŒïŒmaintainLatestFlagForããŸãã¯ããŒã¿ãéä¿¡ããããã€ã¹ïŒã§ã°ã«ãŒãåãããŸããããã·ã¥ããŒãåŽã«èšå®ã¯äžèŠã§ããã®ååšãæèããå¿
èŠããããŸããããŠã£ãžã§ããã¯éåžžã©ããã¯ãšãªãå®è¡ãããã©ãããã©ãŒã ãã¯ãšãªããšã«äºåéèšæžã¿ã³ããŒã§å¿çã§ãããã倿ããŸã â å¿çã§ããªãå ŽåãäŸãã°ã³ããŒãã°ã«ãŒãåããŠããªãã«ã©ã ããã£ã«ã¿ãŒãåç
§ããŠããå Žåãªã©ã¯ãééçã«çããŒãã«ãžãã©ãŒã«ããã¯ããŸãã
**ã¹ããŒã倿Žã¯ã³ããŒãåæ§ç¯ããŸãã**ããŠã³ãµã³ããªã³ã°å¯Ÿè±¡ããŒãã«ã®ã«ã©ã ã远å ã»åé€ã»å倿Žããå Žåããããã¯
downsampleãããã¯èªäœãç·šéããå Žåãäºåéèšæžã¿ã³ããŒã¯çããŒãã«ããåæ§ç¯ãããŸããdropAfterããå€ããã®ã¯åŸ©å ã§ããã倱ãããŸããå¯èœãªéãããŒãã«ãšåæã«ãã®ãããã¯ãèšå®ããé·æéçšããŠããããŒãã«ãžã®åŸããã®ã¹ããŒã倿Žã¯æèçãªå€æãšããŠæ±ã£ãŠãã ããã
ãšããžã³ãŒãããã®ããŒã¿éä¿¡
IronFlock SDKã䜿çšããŠã¢ããªããããŒã¿ãéä¿¡ããŸãïŒ
Python
from ironflock import IronFlock
flock = IronFlock()
flock.publish_to_table("sensordata", {
"timestamp": "2025-01-15T10:30:00Z",
"temperature": 23.5,
"humidity": 62.1,
"device_id": "sensor-001"
})é«é »åºŠããŒã¿ã®å Žåã¯ã1 è¡ããšã«ã©ãŠã³ãããªãããè¡ã代ããã«ãpublish_rows_to_table / publishRowsToTableïŒãã¡ã€ã¢ã»ã¢ã³ãã»ãã©ãŒã²ããïŒãŸã㯠append_rows_to_table / appendRowsToTableïŒæ¿å
¥çµæãè¿ãïŒã䜿çšããŠãè€æ°ã®è¡ã 1 ã€ã®ã¡ãã»ãŒãžã§éä¿¡ã§ããŸããåãããã¯ã¢ãããã¯ã«æ¿å
¥ãããŸã â ãªãŒã«ã»ãªã¢ã»ããã·ã³ã°ã§ãã詳现ã«ã€ããŠã¯SDK ãªãã¡ã¬ã³ã¹ãåç
§ããŠãã ããã
倿ããŒãã«
çããŒã¿ãèªåçã«éèšã»åŠçããSQL倿ãå®çŸ©ã§ããŸãïŒ
data:
tables:
- tablename: sensordata
columns:
# ... çããŒã¿ã«ã©ã ...
transforms:
- tablename: hourly_averages
materialize: true
schedule: "0 * * * *"
sql: >
SELECT
time_bucket('1 hour', tsp) AS hour,
avg(temperature) AS avg_temp,
avg(humidity) AS avg_humidity
FROM sensordata
GROUP BY hour
columns:
- id: hour
name: Hour
dataType: timestamp
- id: avg_temp
name: Average Temperature
dataType: numeric
- id: avg_humidity
name: Average Humidity
dataType: numeric| ãã£ãŒã«ã | 説æ |
|---|---|
tablename | 掟çããŒãã«ã®åå |
materialize | trueã®å ŽåãçµæãããŒãã«ãšããŠæ°žç¶åããã |
schedule | 倿ãå®è¡ããã¿ã€ãã³ã°ã®cronåŒ |
sql | 倿ãèšç®ããSQLã¯ãšãª |
columns | åºåã®ã«ã©ã å®çŸ© |
倿ããŒãã«ã¯ãéåžžã®ããŒãã«ãšåæ§ã«ããŒããSDKçµç±ã§ã¢ã¯ã»ã¹ã§ããŸãã
倿ã¯ãèªèº«ã® SQL ãè¿ããšããã«èªã¿åãããŸãããŠã£ãžã§ããã®æéãŠã£ã³ããŠãã«ã¬ã³ããŒãã£ã«ã¿ãŒãlatest ã¢ãŒãã¯ããŒãã«ã«é©çšããããã®ã§ããã倿ã«å¯ŸããŠã¯ç¡èŠãããŸãããããã 3 ã€ã®ã«ãŒã«ãå°ãããŸããæéç¯å²ã¯ã¯ãšãªã®äžã§åºåãããšïŒWHERE tsp > now() - interval '7 days'ïŒãæç³»åã¯æ°ããé ã«äžŠã¹ãŠïŒORDER BY <time column> DESCïŒè¡æ°å¶éãããã£ãŠãæ°ããè¡ãæ®ãããã«ããããšããããŠããŒãã§ãããããŸãã¯ãã£ã«ã¿ãŒã«äœ¿ãã«ã©ã ããã¹ãŠéžæããããš â å€æã«æé»ã®ã¿ã€ã ã¹ã¿ã³ãã«ã©ã ãããã€ã¹ã«ã©ã ã¯ãããŸããã1 åã®èªã¿åãã§è¿ãã®ã¯æå€§ 3000 è¡ãªã®ã§ãã¯ãšãªã®äžã§éèšããŠãã ããã
倿ãæã«å ¥ããæ¹æ³ã¯ãã¢ããªã«å梱ããããšã ãã§ã¯ãããŸãããããŒã¿ã¢ã¯ã»ã¹æš©éãæã€ãããžã§ã¯ãã¡ã³ããŒã¯ãã¢ããªããŸã£ãã䜿ããã«ããããžã§ã¯ãã®ããŒã¿ãã¥ãŒããåãçš®é¡ã®å€æãä¿åã§ããŸããAI ã¢ã·ã¹ã¿ã³ããåæ§ã§ããã«ã¹ã¿ã 倿ãåç §ããŠãã ããã
ãšã³ãã£ãã£ã®ææ°ç¶æ ã®è¿œè·¡
æ©æ¢°ãè³ç£ãçç£ãªãŒããŒãªã©ãçŸå®äžçã®ãšã³ãã£ãã£ã®çŸåšã®ç¶æ ã衚ãããŒãã«ã«å¯ŸããŠãIronFlockã¯ææ°ç¶æ 远跡ãšåŒã°ãããã¿ãŒã³ããµããŒãããŠããŸãã
倿Žããã£ããšãã«è¡ãäžæžããã代ããã«ãåžžã«æ°ããè¡ã远å ããŸãããŠããŒã¯ãªãšã³ãã£ãã£ãèå¥ããã«ã©ã ã宣èšããŠãããšãIronFlockã¯ããŒãã«ãèªã¿åããããã³ã«ãšã³ãã£ãã£ããšã®ææ°ã®è¡ãå°åºããŸããããã«ããããã¹ãŠã®å€æŽã®å®å šãªå±¥æŽãä¿æããªãããçŸåšã®ç¶æ ã®ã¿ãç°¡åã«ã¯ãšãªã§ããŸãã
maintainLatestFlagForã§ããŒãã«ã«æå¹åããŸãïŒ
- tablename: machineform
maintainLatestFlagFor: ['machinename']
columns:
- id: tsp
dataType: timestamp
- id: machinename
dataType: string
- id: machinetype
dataType: string
- id: active
dataType: boolean
- id: description
dataType: stringmaintainLatestFlagForã«ã¯ããŠããŒã¯ãªãšã³ãã£ãã£ãèå¥ããã«ã©ã ã®ãªã¹ããæå®ããŸããè¡ãã®ãã®ã«ã¯äœãæžã蟌ãŸããŸãããIronFlockã¯ãã®ãšã³ãã£ãã£ããŒãšã¿ã€ã ã¹ã¿ã³ãã§ããŒãã«ã«ã€ã³ããã¯ã¹ãäœæããã¯ãšãªæã«ãšã³ãã£ãã£ããšã®ææ°ã®è¡ãéžã³åºããŸãããã®ãããé
ããŠå°çããè¡ãé åºãååŸããè¡ãå€ãããŒã¯ãæ®ããŠããŸãããšã¯ãããŸããã
éšåçãªè¡ã«ãããšã³ãã£ãã£ã®æŽæ°
ãšã³ãã£ãã£ããŒãã«ã«è¿œå ãããè¡ã¯ããã®ãšã³ãã£ãã£ã®æ°ããããŒãžã§ã³ã§ã â ãããŠãè¡ã¯å®å šã§ããå¿ èŠã¯ãããŸãããè¡ã«å«ãŸããŠããªãã«ã©ã ã¯ããã®ãšã³ãã£ãã£ã®çŽåã®ææ°ã®è¡ããåŒãç¶ãããŸãããã®ããã1ã€ã®ãã£ãŒã«ãã ããæŽæ°ããã«ã¯ããšã³ãã£ãã£ããŒãã¿ã€ã ã¹ã¿ã³ãããã®ãã£ãŒã«ãã ããéä¿¡ããã°æžã¿ãŸãïŒ
| æ°ããè¡ã®ã«ã©ã ã®ç¶æ | ä¿åãããããŒãžã§ã³ãä¿æããå€ |
|---|---|
æäŸãããŠããïŒ0ãfalseã""ãæäŸæžã¿ãšã¿ãªãããŸãïŒ | æäŸãããå€ |
æç€ºçã«null | NULL â ã«ã©ã ã¯ã¯ãªã¢ãããŸã |
| ååšããªã | çŽåã®ææ°ã®è¡ã®å€ |
æŒãããŠãããã詳现ã2ã€ãããŸãïŒ
- ãã¹ãŠã®ã«ã©ã ãæäŸããè¡ã¯ãçŽåã®è¡ã®åç §ãå®å šã«ã¹ãããããŸãããã®ãããå®å šãªè¡ã¯ãããŸã§ã©ããäœã³ã¹ãã®ãŸãŸã§ã â é«é »åºŠã®çµè·¯ã§ã¯åŒãç¶ãå®å šãªè¡ãéä¿¡ããŠãã ããã
- åŒãç¶ãã¯æéãå°éããŸããå€ãã¿ã€ã ã¹ã¿ã³ãã§å°çããè¡ïŒããã¯ãã£ã«ïŒã¯ãèªèº«ã®
tsp以åã®è¡ããã®ã¿åŒãç¶ããããããæ°ããè¡ããåŒãç¶ãããšã¯æ±ºããŠãããŸããã
maintainLatestFlagForã®ãªãããŒãã«ã¯ãåçŽãªè¿œèšã®ã»ãã³ãã£ã¯ã¹ãç¶æããŸããè¡ã«å«ãŸããŠããªãã«ã©ã ã¯NULLãšããŠä¿åãããŸãã
çŸåšã®æ©æ¢°ç¶æ ã®ã¿ãã¯ãšãªããã«ã¯ïŒ
SELECT DISTINCT ON (machinename) *
FROM machineform
ORDER BY machinename, tsp DESCç¹å®ã®æ©æ¢°ã®å šå±¥æŽã衚瀺ããã«ã¯ïŒ
SELECT * FROM machineform WHERE machinename = 'Assembly-Line-01' ORDER BY tspãã®ã¯ãšãªãææžãããããšã¯ã»ãšãã©ãããŸããããã®ããŒãã«ã«æ¥ç¶ããããŒãäžã®ãŠã£ãžã§ããã«ã¯ããã£ã«ã¿èšå®ã«latestãã°ã«ãçšæãããŠããããŠãŒã¶ãŒã¯è¿œå äœæ¥ãªãã§åžžã«çŸåšã®å€ã確èªã§ããŸããSDKããã¯ãfilterAndã«{"latest": true}ã远å ããããšã§åãã¢ãŒãããªã¯ãšã¹ãã§ããŸã â getHistoryãåç
§ããŠãã ããã
**
latest_flagããã®ç§»è¡ïŒ**以åã®ããŒãžã§ã³ã®IronFlockã¯ãlatest_flagãšããç©ççãªããŒãªã¢ã³ã«ã©ã ãä¿åããŠããŸããããã®ã«ã©ã ã¯ããååšãããçŸåšã®ç¶æ ã¯ä»£ããã«SQLã§å°åºãããŸããããã«ãããè¡ãé äžåã§å°çããå Žåã§ãæ£ããçµæãä¿ãããŸããlatest_flag = trueã§ãã£ã«ã¿ããæ¢åã®ããŒããSDKåŒã³åºãã¯ãã®ãŸãŸåäœããŸããIronFlockãããããèªèããææ°ç¶æ ã¢ãŒããé©çšããããã§ããæ°ããã³ãŒãã§ã¯ãlatestãã°ã«ãŸãã¯{"latest": true}ãã£ã«ã¿ãšã³ããªã䜿çšããŠãã ããã
ã¬ã³ãŒãã®è«çåé€
IronFlockã®è¿œèšå°çšã¢ãã«ã§ã¯ãã¬ã³ãŒãã¯ç©ççã«åé€ãããŸããã代ããã«ãdeletedããŒãªã¢ã³ã«ã©ã ã䜿çšããŠã¬ã³ãŒããå逿žã¿ãšããŠããŒã¯ããŸããããã«ãããããã·ã¥ããŒãããåé€ãããã¬ã³ãŒããé衚瀺ã«ãã€ã€ãå®å
šãªç£æ»èšŒè·¡ãä¿æããŸãã
ä»»æã®ãšã³ãã£ãã£ããŒãã«ã«deletedã«ã©ã ã远å ããŸãïŒ
- id: deleted
name: Deleted
dataType: booleanãŠãŒã¶ãŒãã¬ã³ãŒããåé€ãããšïŒäŸãã°ããŒãäžã®ãã©ãŒã çµç±ã§ïŒãã¢ããªã¯ãã®ãšã³ãã£ãã£ã«å¯ŸããŠdeleted: trueã®æ°ããè¡ãéä¿¡ããŸããmaintainLatestFlagForãšçµã¿åãããããšã§ããã®æ°ããè¡ãææ°ã®ç¶æ
ã«ãªããŸãããã®åŸã®éšåçãªè¡ã¯ãä»ã®ã«ã©ã ãšåæ§ã«deletedããŒã«ãŒãåŒãç¶ããŸãããã®ãããdeletedã«èšåããªãæŽæ°ããšã³ãã£ãã£ã埩掻ãããããšããé衚瀺ã«ããããšããããŸããã
ã¢ã¯ãã£ãïŒæªåé€ïŒã®çŸåšã®ã¬ã³ãŒãã®ã¿ãã¯ãšãªããã«ã¯ïŒ
SELECT * FROM (
SELECT DISTINCT ON (machinename) *
FROM machineform
ORDER BY machinename, tsp DESC
) latest
WHERE deleted IS NULL OR deleted = falsedeletedã®ãã§ãã¯ã¯ãæ©æ¢°ããšã®ææ°ã®è¡ãéžã³åºãããåŸã«å®è¡ãããŸãããã®é åºãéèŠã§ããå
ã«å逿žã¿ã®è¡ãé€å€ããŠããŸããšããã®åã®æªåé€ã®è¡ãçŸåšã®ç¶æ
ãšããŠåã³çŸããŠããŸããŸãã
ããŒããŠã£ãžã§ãããšSDKã¯ãåãé åºãèªåçã«é©çšããŸããlatestãã°ã«ïŒãŸãã¯{"latest": true}ïŒãšdeletedãã£ã«ã¿ãçµã¿åãããã°ããŸãã«ãã®åäœãåŸãããŸããåé€ãããã¬ã³ãŒãã¯ãã©ãŒã éä¿¡çŽåŸã«ããã·ã¥ããŒãããæ¶ããŸãããããŒã¿ããŒã¹ã«ã¯å±¥æŽããã³ç£æ»ç®çã§æ®ããŸãã
ä»ã®ã¢ããªãšã®ããŒã¿å ±æ
ããŒã¿ããã¯ãšã³ãã¯ã¢ããªå°çšã§ãããããžã§ã¯ãã«ã€ã³ã¹ããŒã«ãããä»ã®ã¢ããªããããŒãã«ã¯èŠããŸãããdata-template.ymlã®2ã€ã®ãªãã·ã§ã³ããŒããããå€ããŸãã
ä»ã®ã¢ããªã®ããŒã¿ãèªã¿åãã«ã¯ãèªã¿åãå
ã®ã¢ããªããããã¬ãã«ã®consumes:ã»ã¯ã·ã§ã³ã«åæããŸããdata:ã®äžã§ã¯ãªãããã®é£ã«çœ®ããŸãã
consumes:
- app: machine-monitor
reason: "ã¢ãã¿ãŒã®æ©æ¢°ç¶æ
ããã³ã«ãŠã³ã¿ãŒã¹ããªãŒã ããOEEãç®åºããŸã"
data:
tables:
- tablename: oee_results
columns:
# ... éåžžã©ãããèªã¢ããªã®ããŒãã«appã¯æäŸåŽã¢ããªã®æè¡åããŸãã¯ãããžã§ã¯ãå
ã®ãã¹ãŠã®ã¢ããªã衚ã"*"ïŒåŒçšç¬Šãå¿
é ïŒã§ããreasonã¯åæãã€ã¢ãã°ã§ãŠãŒã¶ãŒã«è¡šç€ºãããŸãã宣èšããã ãã§ã¯äœãèš±å¯ãããããŠãŒã¶ãŒã®æ¿èªãå¿
èŠã§ãã
åå¥ã®ããŒãã«ãéå
¬éã«ããã«ã¯ãprivate: trueãæå®ããŸããå®çŸ©ãããã®ã¯ããã©ã«ãã§å
±æå¯èœã§ããããã©ã€ããŒããªããŒãã«ããã©ã³ã¹ãã©ãŒã ã¯ä»ã®ã¢ããªãèŠãã«ã¿ãã°ã«äžåçŸããŸããã
data:
tables:
- tablename: measurements # å
±æïŒããã©ã«ãïŒ
columns: [ ... ]
- tablename: calibration_state # å
éšçš â ä»ã®ã¢ããªããã¯æ±ºããŠèŠããªã
private: true
columns: [ ... ]ã¢ã¯ã»ã¹ã¯èªã¿åãå°çšã§ããããžã§ã¯ãããšã«ãŠãŒã¶ãŒãèš±å¯ãããã€ã§ãåãæ¶ããŸããã¢ãã«å šäœãšãæäŸåŽã¢ããªã®å±¥æŽã»ã©ã€ãã¹ããªãŒã ãèªã¿åãSDKåŒã³åºãã«ã€ããŠã¯ä»ã®ã¢ããªã®ããŒã¿ã®å©çšãåç §ããŠãã ããã