net.atmowx.observation
Schema Diff
+41 -0
Compatibility Analysis
Backward Compatible
Backward compatible. 16 non-breaking changes.
Non-Breaking Changes (16)
- AddedVertex AddedVertex { vertex_id: "net.atmowx.observation:body.airQuality" }
- AddedVertex AddedVertex { vertex_id: "net.atmowx.observation:body.airQuality.co" }
- AddedVertex AddedVertex { vertex_id: "net.atmowx.observation:body.airQuality.no2" }
- AddedVertex AddedVertex { vertex_id: "net.atmowx.observation:body.airQuality.ozone" }
- AddedVertex AddedVertex { vertex_id: "net.atmowx.observation:body.airQuality.pm1" }
- AddedVertex AddedVertex { vertex_id: "net.atmowx.observation:body.airQuality.pm10" }
- AddedVertex AddedVertex { vertex_id: "net.atmowx.observation:body.airQuality.pm25" }
- AddedVertex AddedVertex { vertex_id: "net.atmowx.observation:body.airQuality.so2" }
- AddedEdge AddedEdge { src: "net.atmowx.observation:body", tgt: "net.atmowx.observation:body.airQuality", kind: "prop", name: Some("airQuality") }
- AddedEdge AddedEdge { src: "net.atmowx.observation:body.airQuality", tgt: "net.atmowx.observation:body.airQuality.co", kind: "prop", name: Some("co") }
- AddedEdge AddedEdge { src: "net.atmowx.observation:body.airQuality", tgt: "net.atmowx.observation:body.airQuality.no2", kind: "prop", name: Some("no2") }
- AddedEdge AddedEdge { src: "net.atmowx.observation:body.airQuality", tgt: "net.atmowx.observation:body.airQuality.ozone", kind: "prop", name: Some("ozone") }
- AddedEdge AddedEdge { src: "net.atmowx.observation:body.airQuality", tgt: "net.atmowx.observation:body.airQuality.pm1", kind: "prop", name: Some("pm1") }
- AddedEdge AddedEdge { src: "net.atmowx.observation:body.airQuality", tgt: "net.atmowx.observation:body.airQuality.pm10", kind: "prop", name: Some("pm10") }
- AddedEdge AddedEdge { src: "net.atmowx.observation:body.airQuality", tgt: "net.atmowx.observation:body.airQuality.pm25", kind: "prop", name: Some("pm25") }
- AddedEdge AddedEdge { src: "net.atmowx.observation:body.airQuality", tgt: "net.atmowx.observation:body.airQuality.so2", kind: "prop", name: Some("so2") }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "net.atmowx.observation:body.airQuality" }AddedVertex { vertex_id: "net.atmowx.observation:body.airQuality.co" }AddedVertex { vertex_id: "net.atmowx.observation:body.airQuality.no2" }AddedVertex { vertex_id: "net.atmowx.observation:body.airQuality.ozone" }AddedVertex { vertex_id: "net.atmowx.observation:body.airQuality.pm1" }AddedVertex { vertex_id: "net.atmowx.observation:body.airQuality.pm10" }AddedVertex { vertex_id: "net.atmowx.observation:body.airQuality.pm25" }AddedVertex { vertex_id: "net.atmowx.observation:body.airQuality.so2" }
Additional Notes
- Non-breaking: AddedEdge { src: "net.atmowx.observation:body", tgt: "net.atmowx.observation:body.airQuality", kind: "prop", name: Some("airQuality") }
- Non-breaking: AddedEdge { src: "net.atmowx.observation:body.airQuality", tgt: "net.atmowx.observation:body.airQuality.co", kind: "prop", name: Some("co") }
- Non-breaking: AddedEdge { src: "net.atmowx.observation:body.airQuality", tgt: "net.atmowx.observation:body.airQuality.no2", kind: "prop", name: Some("no2") }
- Non-breaking: AddedEdge { src: "net.atmowx.observation:body.airQuality", tgt: "net.atmowx.observation:body.airQuality.ozone", kind: "prop", name: Some("ozone") }
- Non-breaking: AddedEdge { src: "net.atmowx.observation:body.airQuality", tgt: "net.atmowx.observation:body.airQuality.pm1", kind: "prop", name: Some("pm1") }
- Non-breaking: AddedEdge { src: "net.atmowx.observation:body.airQuality", tgt: "net.atmowx.observation:body.airQuality.pm10", kind: "prop", name: Some("pm10") }
- Non-breaking: AddedEdge { src: "net.atmowx.observation:body.airQuality", tgt: "net.atmowx.observation:body.airQuality.pm25", kind: "prop", name: Some("pm25") }
- Non-breaking: AddedEdge { src: "net.atmowx.observation:body.airQuality", tgt: "net.atmowx.observation:body.airQuality.so2", kind: "prop", name: Some("so2") }
1
1
{
2
2
"id": "net.atmowx.observation",
3
3
"defs": {
4
4
"main": {
5
5
"key": "tid",
6
6
"type": "record",
7
7
"record": {
8
8
"type": "object",
9
9
"required": [
10
10
"station",
11
11
"observedAt"
12
12
],
13
13
"properties": {
14
14
"wind": {
15
15
"type": "object",
16
16
"properties": {
17
17
"gust": {
18
18
"ref": "net.atmowx.defs#quantity",
19
19
"type": "ref",
20
20
"description": "m/s."
21
21
},
22
22
"speed": {
23
23
"ref": "net.atmowx.defs#quantity",
24
24
"type": "ref",
25
25
"description": "m/s."
26
26
},
27
27
"direction": {
28
28
"type": "integer",
29
29
"maximum": 359,
30
30
"minimum": 0,
31
31
"description": "Degrees true, 0 = north."
32
32
},
33
33
"gustDirection": {
34
34
"type": "integer",
35
35
"maximum": 359,
36
36
"minimum": 0,
37
37
"description": "Degrees true, 0 = north."
38
38
}
39
39
}
40
40
},
41
41
"extra": {
42
42
"type": "array",
43
43
"items": {
44
44
"refs": [
45
45
"net.atmowx.defs#measurement"
46
46
],
47
47
"type": "union",
48
48
"closed": false
49
49
},
50
50
"maxLength": 64,
51
51
"description": "Measurements not covered by core fields. Open union."
52
52
},
53
53
"station": {
54
54
"type": "string",
55
55
"format": "at-uri",
56
56
"description": "AT-URI of the net.atmowx.station this reading came from."
57
57
},
58
58
"uvIndex": {
59
59
"ref": "net.atmowx.defs#quantity",
60
60
"type": "ref",
61
61
"description": "UV index, dimensionless."
62
62
},
63
63
"dewPoint": {
64
64
"ref": "net.atmowx.defs#quantity",
65
65
"type": "ref",
66
66
"description": "Dew point, °C."
67
67
},
68
68
"snowDepth": {
69
69
"ref": "net.atmowx.defs#quantity",
70
70
"type": "ref",
71
71
"description": "Millimeters."
72
72
},
73
+
"airQuality": {
74
+
"type": "object",
75
+
"properties": {
76
+
"co": {
77
+
"ref": "net.atmowx.defs#quantity",
78
+
"type": "ref",
79
+
"description": "CO mass concentration, µg/m³."
80
+
},
81
+
"no2": {
82
+
"ref": "net.atmowx.defs#quantity",
83
+
"type": "ref",
84
+
"description": "NO₂ mass concentration, µg/m³."
85
+
},
86
+
"pm1": {
87
+
"ref": "net.atmowx.defs#quantity",
88
+
"type": "ref",
89
+
"description": "PM1 mass concentration, µg/m³."
90
+
},
91
+
"so2": {
92
+
"ref": "net.atmowx.defs#quantity",
93
+
"type": "ref",
94
+
"description": "SO₂ mass concentration, µg/m³."
95
+
},
96
+
"pm10": {
97
+
"ref": "net.atmowx.defs#quantity",
98
+
"type": "ref",
99
+
"description": "PM10 mass concentration, µg/m³."
100
+
},
101
+
"pm25": {
102
+
"ref": "net.atmowx.defs#quantity",
103
+
"type": "ref",
104
+
"description": "PM2.5 mass concentration, µg/m³."
105
+
},
106
+
"ozone": {
107
+
"ref": "net.atmowx.defs#quantity",
108
+
"type": "ref",
109
+
"description": "O₃ mass concentration, µg/m³."
110
+
}
111
+
},
112
+
"description": "Outdoor ambient air-quality mass concentrations, µg/m³. Derived indexes (AQI, EAQI, …) are intentionally not stored: they are jurisdiction- and time-window-specific and must be computed by consumers from the concentration series."
113
+
},
73
114
"observedAt": {
74
115
"type": "string",
75
116
"format": "datetime",
76
117
"description": "Measurement time, UTC."
77
118
},
78
119
"visibility": {
79
120
"ref": "net.atmowx.defs#quantity",
80
121
"type": "ref",
81
122
"description": "Meters."
82
123
},
83
124
"temperature": {
84
125
"ref": "net.atmowx.defs#quantity",
85
126
"type": "ref",
86
127
"description": "Air temperature, °C."
87
128
},
88
129
"soilMoisture": {
89
130
"ref": "net.atmowx.defs#quantity",
90
131
"type": "ref",
91
132
"description": "Percent."
92
133
},
93
134
"precipitation": {
94
135
"type": "object",
95
136
"properties": {
96
137
"day": {
97
138
"ref": "net.atmowx.defs#quantity",
98
139
"type": "ref",
99
140
"description": "mm since station-local midnight."
100
141
},
101
142
"hour": {
102
143
"ref": "net.atmowx.defs#quantity",
103
144
"type": "ref",
104
145
"description": "mm in the last 60 minutes."
105
146
},
106
147
"rate": {
107
148
"ref": "net.atmowx.defs#quantity",
108
149
"type": "ref",
109
150
"description": "mm/h."
110
151
},
111
152
"event": {
112
153
"ref": "net.atmowx.defs#quantity",
113
154
"type": "ref",
114
155
"description": "mm in the current rain event."
115
156
}
116
157
}
117
158
},
118
159
"presentWeather": {
119
160
"type": "integer",
120
161
"maximum": 511,
121
162
"minimum": 0,
122
163
"description": "WMO code table 4680 (present weather from automatic station)."
123
164
},
124
165
"pressureStation": {
125
166
"ref": "net.atmowx.defs#quantity",
126
167
"type": "ref",
127
168
"description": "Absolute station pressure, hPa."
128
169
},
129
170
"soilTemperature": {
130
171
"ref": "net.atmowx.defs#quantity",
131
172
"type": "ref",
132
173
"description": "°C at default depth; use extra for multiple depths."
133
174
},
134
175
"solarIrradiance": {
135
176
"ref": "net.atmowx.defs#quantity",
136
177
"type": "ref",
137
178
"description": "W/m²."
138
179
},
139
180
"pressureSeaLevel": {
140
181
"ref": "net.atmowx.defs#quantity",
141
182
"type": "ref",
142
183
"description": "Mean-sea-level reduced pressure, hPa."
143
184
},
144
185
"relativeHumidity": {
145
186
"ref": "net.atmowx.defs#quantity",
146
187
"type": "ref",
147
188
"description": "Relative humidity, percent."
148
189
}
149
190
}
150
191
},
151
192
"description": "One immutable weather observation. All measurement fields are optional and SI-only: celsius, hectopascal, meters/second, millimeters, W/m². Record key SHOULD be a TID derived from observedAt."
152
193
}
153
194
},
154
195
"$type": "com.atproto.lexicon.schema",
155
196
"lexicon": 1
156
197
}