배터리: ? %
비거니즘 전시 매뉴얼
Gemfile
... ...
@@ -0,0 +1,5 @@
1
+source "https://rubygems.org"
2
+
3
+gem "gollum", "~> 6.1.0"
4
+gem "json", "~> 3.1"
5
+gem "sprockets", "~> 4.4"
run-wiki.sh
... ...
@@ -1,6 +1,17 @@
1 1
#!/bin/bash
2
+set -euo pipefail
3
+cd -- "$(dirname -- "${BASH_SOURCE[0]}")"
2 4
3
-npx tailwindcss -i theme/css/tailwind.css -o tailwind.css -c tailwind.config.js
5
+# Use this Ruby's Bundler, not the stale Ruby 2.7 bundle executable.
6
+# Resolve only this application's gems, excluding unrelated GitLab gems.
7
+if ! ruby -rbundler/setup -e ''; then
8
+ echo 'Install Ruby dependencies with a Bundler matching the current Ruby.' >&2
9
+ exit 1
10
+fi
4 11
5
-gollum --allow-uploads=dir --template-dir=templates --h1-title --css --adapter rugged --no-edit
12
+# This stylesheet uses Tailwind v3; v4 no longer ships this CLI.
13
+npx --yes tailwindcss@3.4.17 -i theme/css/tailwind.css -o tailwind.css -c tailwind.config.js
14
+
15
+exec ruby -rbundler/setup -e 'load Gem.bin_path("gollum", "gollum")' -- \
16
+ --allow-uploads=dir --template-dir=templates --h1-title --css --adapter rugged --no-edit
6 17
tailwind.css
... ...
@@ -1,12 +1,119 @@
1 1
*, ::before, ::after {
2
- --tw-border-opacity: 1;
3
- border-color: rgba(229, 231, 235, var(--tw-border-opacity))
2
+ --tw-border-spacing-x: 0;
3
+ --tw-border-spacing-y: 0;
4
+ --tw-translate-x: 0;
5
+ --tw-translate-y: 0;
6
+ --tw-rotate: 0;
7
+ --tw-skew-x: 0;
8
+ --tw-skew-y: 0;
9
+ --tw-scale-x: 1;
10
+ --tw-scale-y: 1;
11
+ --tw-pan-x: ;
12
+ --tw-pan-y: ;
13
+ --tw-pinch-zoom: ;
14
+ --tw-scroll-snap-strictness: proximity;
15
+ --tw-gradient-from-position: ;
16
+ --tw-gradient-via-position: ;
17
+ --tw-gradient-to-position: ;
18
+ --tw-ordinal: ;
19
+ --tw-slashed-zero: ;
20
+ --tw-numeric-figure: ;
21
+ --tw-numeric-spacing: ;
22
+ --tw-numeric-fraction: ;
23
+ --tw-ring-inset: ;
24
+ --tw-ring-offset-width: 0px;
25
+ --tw-ring-offset-color: #fff;
26
+ --tw-ring-color: rgb(59 130 246 / 0.5);
27
+ --tw-ring-offset-shadow: 0 0 #0000;
28
+ --tw-ring-shadow: 0 0 #0000;
29
+ --tw-shadow: 0 0 #0000;
30
+ --tw-shadow-colored: 0 0 #0000;
31
+ --tw-blur: ;
32
+ --tw-brightness: ;
33
+ --tw-contrast: ;
34
+ --tw-grayscale: ;
35
+ --tw-hue-rotate: ;
36
+ --tw-invert: ;
37
+ --tw-saturate: ;
38
+ --tw-sepia: ;
39
+ --tw-drop-shadow: ;
40
+ --tw-backdrop-blur: ;
41
+ --tw-backdrop-brightness: ;
42
+ --tw-backdrop-contrast: ;
43
+ --tw-backdrop-grayscale: ;
44
+ --tw-backdrop-hue-rotate: ;
45
+ --tw-backdrop-invert: ;
46
+ --tw-backdrop-opacity: ;
47
+ --tw-backdrop-saturate: ;
48
+ --tw-backdrop-sepia: ;
49
+ --tw-contain-size: ;
50
+ --tw-contain-layout: ;
51
+ --tw-contain-paint: ;
52
+ --tw-contain-style:
53
+}
54
+
55
+::backdrop {
56
+ --tw-border-spacing-x: 0;
57
+ --tw-border-spacing-y: 0;
58
+ --tw-translate-x: 0;
59
+ --tw-translate-y: 0;
60
+ --tw-rotate: 0;
61
+ --tw-skew-x: 0;
62
+ --tw-skew-y: 0;
63
+ --tw-scale-x: 1;
64
+ --tw-scale-y: 1;
65
+ --tw-pan-x: ;
66
+ --tw-pan-y: ;
67
+ --tw-pinch-zoom: ;
68
+ --tw-scroll-snap-strictness: proximity;
69
+ --tw-gradient-from-position: ;
70
+ --tw-gradient-via-position: ;
71
+ --tw-gradient-to-position: ;
72
+ --tw-ordinal: ;
73
+ --tw-slashed-zero: ;
74
+ --tw-numeric-figure: ;
75
+ --tw-numeric-spacing: ;
76
+ --tw-numeric-fraction: ;
77
+ --tw-ring-inset: ;
78
+ --tw-ring-offset-width: 0px;
79
+ --tw-ring-offset-color: #fff;
80
+ --tw-ring-color: rgb(59 130 246 / 0.5);
81
+ --tw-ring-offset-shadow: 0 0 #0000;
82
+ --tw-ring-shadow: 0 0 #0000;
83
+ --tw-shadow: 0 0 #0000;
84
+ --tw-shadow-colored: 0 0 #0000;
85
+ --tw-blur: ;
86
+ --tw-brightness: ;
87
+ --tw-contrast: ;
88
+ --tw-grayscale: ;
89
+ --tw-hue-rotate: ;
90
+ --tw-invert: ;
91
+ --tw-saturate: ;
92
+ --tw-sepia: ;
93
+ --tw-drop-shadow: ;
94
+ --tw-backdrop-blur: ;
95
+ --tw-backdrop-brightness: ;
96
+ --tw-backdrop-contrast: ;
97
+ --tw-backdrop-grayscale: ;
98
+ --tw-backdrop-hue-rotate: ;
99
+ --tw-backdrop-invert: ;
100
+ --tw-backdrop-opacity: ;
101
+ --tw-backdrop-saturate: ;
102
+ --tw-backdrop-sepia: ;
103
+ --tw-contain-size: ;
104
+ --tw-contain-layout: ;
105
+ --tw-contain-paint: ;
106
+ --tw-contain-style:
4 107
}
5 108
6 109
.visible {
7 110
visibility: visible
8 111
}
9 112
113
+.fixed {
114
+ position: fixed
115
+}
116
+
10 117
.sticky {
11 118
position: sticky
12 119
}
... ...
@@ -64,26 +171,6 @@
64 171
margin-bottom: 2rem
65 172
}
66 173
67
-.mt-2 {
68
- margin-top: 0.5rem
69
-}
70
-
71
-.mt-4 {
72
- margin-top: 1rem
73
-}
74
-
75
-.mt-10 {
76
- margin-top: 2.5rem
77
-}
78
-
79
-.mt-20 {
80
- margin-top: 5rem
81
-}
82
-
83
-.mt-48 {
84
- margin-top: 12rem
85
-}
86
-
87 174
.mb-0 {
88 175
margin-bottom: 0px
89 176
}
... ...
@@ -92,6 +179,10 @@
92 179
margin-bottom: 0.25rem
93 180
}
94 181
182
+.mb-10 {
183
+ margin-bottom: 2.5rem
184
+}
185
+
95 186
.mb-2 {
96 187
margin-bottom: 0.5rem
97 188
}
... ...
@@ -100,10 +191,6 @@
100 191
margin-bottom: 2rem
101 192
}
102 193
103
-.mb-10 {
104
- margin-bottom: 2.5rem
105
-}
106
-
107 194
.ml-2 {
108 195
margin-left: 0.5rem
109 196
}
... ...
@@ -112,6 +199,26 @@
112 199
margin-left: 1rem
113 200
}
114 201
202
+.mt-10 {
203
+ margin-top: 2.5rem
204
+}
205
+
206
+.mt-2 {
207
+ margin-top: 0.5rem
208
+}
209
+
210
+.mt-20 {
211
+ margin-top: 5rem
212
+}
213
+
214
+.mt-4 {
215
+ margin-top: 1rem
216
+}
217
+
218
+.mt-48 {
219
+ margin-top: 12rem
220
+}
221
+
115 222
.block {
116 223
display: block
117 224
}
... ...
@@ -140,10 +247,6 @@
140 247
display: none
141 248
}
142 249
143
-.h-8 {
144
- height: 2rem
145
-}
146
-
147 250
.h-12 {
148 251
height: 3rem
149 252
}
... ...
@@ -164,6 +267,10 @@
164 267
height: 16rem
165 268
}
166 269
270
+.h-8 {
271
+ height: 2rem
272
+}
273
+
167 274
.w-full {
168 275
width: 100%
169 276
}
... ...
@@ -180,72 +287,6 @@
180 287
flex-grow: 1
181 288
}
182 289
183
-@-webkit-keyframes spin {
184
- to {
185
- transform: rotate(360deg)
186
- }
187
-}
188
-
189
-@keyframes spin {
190
- to {
191
- transform: rotate(360deg)
192
- }
193
-}
194
-
195
-@-webkit-keyframes ping {
196
- 75%, 100% {
197
- transform: scale(2);
198
- opacity: 0
199
- }
200
-}
201
-
202
-@keyframes ping {
203
- 75%, 100% {
204
- transform: scale(2);
205
- opacity: 0
206
- }
207
-}
208
-
209
-@-webkit-keyframes pulse {
210
- 50% {
211
- opacity: .5
212
- }
213
-}
214
-
215
-@keyframes pulse {
216
- 50% {
217
- opacity: .5
218
- }
219
-}
220
-
221
-@-webkit-keyframes bounce {
222
- 0%, 100% {
223
- transform: translateY(-25%);
224
- -webkit-animation-timing-function: cubic-bezier(0.8,0,1,1);
225
- animation-timing-function: cubic-bezier(0.8,0,1,1)
226
- }
227
-
228
- 50% {
229
- transform: none;
230
- -webkit-animation-timing-function: cubic-bezier(0,0,0.2,1);
231
- animation-timing-function: cubic-bezier(0,0,0.2,1)
232
- }
233
-}
234
-
235
-@keyframes bounce {
236
- 0%, 100% {
237
- transform: translateY(-25%);
238
- -webkit-animation-timing-function: cubic-bezier(0.8,0,1,1);
239
- animation-timing-function: cubic-bezier(0.8,0,1,1)
240
- }
241
-
242
- 50% {
243
- transform: none;
244
- -webkit-animation-timing-function: cubic-bezier(0,0,0.2,1);
245
- animation-timing-function: cubic-bezier(0,0,0.2,1)
246
- }
247
-}
248
-
249 290
.flex-row {
250 291
flex-direction: row
251 292
}
... ...
@@ -278,6 +319,10 @@
278 319
border-radius: 9999px
279 320
}
280 321
322
+.border {
323
+ border-width: 1px
324
+}
325
+
281 326
.border-0 {
282 327
border-width: 0px
283 328
}
... ...
@@ -286,75 +331,61 @@
286 331
border-width: 2px
287 332
}
288 333
289
-.border {
290
- border-width: 1px
334
+.border-b-2 {
335
+ border-bottom-width: 2px
291 336
}
292 337
293 338
.border-t-2 {
294 339
border-top-width: 2px
295 340
}
296 341
297
-.border-b-2 {
298
- border-bottom-width: 2px
299
-}
300
-
301 342
.border-black {
302 343
--tw-border-opacity: 1;
303
- border-color: rgba(0, 0, 0, var(--tw-border-opacity))
344
+ border-color: rgb(0 0 0 / var(--tw-border-opacity, 1))
304 345
}
305 346
306 347
.border-gray-300 {
307 348
--tw-border-opacity: 1;
308
- border-color: rgba(209, 213, 219, var(--tw-border-opacity))
349
+ border-color: rgb(209 213 219 / var(--tw-border-opacity, 1))
309 350
}
310 351
311 352
.border-pink-200 {
312 353
--tw-border-opacity: 1;
313
- border-color: rgba(251, 207, 232, var(--tw-border-opacity))
354
+ border-color: rgb(251 207 232 / var(--tw-border-opacity, 1))
314 355
}
315 356
316 357
.border-pink-300 {
317 358
--tw-border-opacity: 1;
318
- border-color: rgba(249, 168, 212, var(--tw-border-opacity))
359
+ border-color: rgb(249 168 212 / var(--tw-border-opacity, 1))
319 360
}
320 361
321 362
.border-pink-600 {
322 363
--tw-border-opacity: 1;
323
- border-color: rgba(219, 39, 119, var(--tw-border-opacity))
324
-}
325
-
326
-.bg-transparent {
327
- background-color: transparent
364
+ border-color: rgb(219 39 119 / var(--tw-border-opacity, 1))
328 365
}
329 366
330 367
.bg-gray-300 {
331 368
--tw-bg-opacity: 1;
332
- background-color: rgba(209, 213, 219, var(--tw-bg-opacity))
369
+ background-color: rgb(209 213 219 / var(--tw-bg-opacity, 1))
333 370
}
334 371
335 372
.bg-pink-100 {
336 373
--tw-bg-opacity: 1;
337
- background-color: rgba(252, 231, 243, var(--tw-bg-opacity))
374
+ background-color: rgb(252 231 243 / var(--tw-bg-opacity, 1))
338 375
}
339 376
340 377
.bg-pink-300 {
341 378
--tw-bg-opacity: 1;
342
- background-color: rgba(249, 168, 212, var(--tw-bg-opacity))
379
+ background-color: rgb(249 168 212 / var(--tw-bg-opacity, 1))
343 380
}
344 381
345 382
.bg-pink-400 {
346 383
--tw-bg-opacity: 1;
347
- background-color: rgba(244, 114, 182, var(--tw-bg-opacity))
348
-}
349
-
350
-.hover\:bg-gray-300:hover {
351
- --tw-bg-opacity: 1;
352
- background-color: rgba(209, 213, 219, var(--tw-bg-opacity))
384
+ background-color: rgb(244 114 182 / var(--tw-bg-opacity, 1))
353 385
}
354 386
355
-.hover\:bg-pink-100:hover {
356
- --tw-bg-opacity: 1;
357
- background-color: rgba(252, 231, 243, var(--tw-bg-opacity))
387
+.bg-transparent {
388
+ background-color: transparent
358 389
}
359 390
360 391
.p-0 {
... ...
@@ -423,20 +454,24 @@
423 454
padding-bottom: 2rem
424 455
}
425 456
426
-.pt-4 {
427
- padding-top: 1rem
457
+.pb-0 {
458
+ padding-bottom: 0px
428 459
}
429 460
430
-.pt-5 {
431
- padding-top: 1.25rem
461
+.pb-4 {
462
+ padding-bottom: 1rem
432 463
}
433 464
434
-.pt-10 {
435
- padding-top: 2.5rem
465
+.pl-2 {
466
+ padding-left: 0.5rem
436 467
}
437 468
438
-.pt-28 {
439
- padding-top: 7rem
469
+.pl-4 {
470
+ padding-left: 1rem
471
+}
472
+
473
+.pl-5 {
474
+ padding-left: 1.25rem
440 475
}
441 476
442 477
.pr-2 {
... ...
@@ -455,24 +490,20 @@
455 490
padding-right: 2.25rem
456 491
}
457 492
458
-.pb-0 {
459
- padding-bottom: 0px
460
-}
461
-
462
-.pb-4 {
463
- padding-bottom: 1rem
493
+.pt-10 {
494
+ padding-top: 2.5rem
464 495
}
465 496
466
-.pl-2 {
467
- padding-left: 0.5rem
497
+.pt-28 {
498
+ padding-top: 7rem
468 499
}
469 500
470
-.pl-4 {
471
- padding-left: 1rem
501
+.pt-4 {
502
+ padding-top: 1rem
472 503
}
473 504
474
-.pl-5 {
475
- padding-left: 1.25rem
505
+.pt-5 {
506
+ padding-top: 1.25rem
476 507
}
477 508
478 509
.text-center {
... ...
@@ -483,6 +514,16 @@
483 514
vertical-align: text-bottom
484 515
}
485 516
517
+.text-2xl {
518
+ font-size: 1.5rem;
519
+ line-height: 2rem
520
+}
521
+
522
+.text-3xl {
523
+ font-size: 1.875rem;
524
+ line-height: 2.25rem
525
+}
526
+
486 527
.text-base {
487 528
font-size: 1rem;
488 529
line-height: 1.5rem
... ...
@@ -498,14 +539,8 @@
498 539
line-height: 1.75rem
499 540
}
500 541
501
-.text-2xl {
502
- font-size: 1.5rem;
503
- line-height: 2rem
504
-}
505
-
506
-.text-3xl {
507
- font-size: 1.875rem;
508
- line-height: 2.25rem
542
+.font-bold {
543
+ font-weight: 700
509 544
}
510 545
511 546
.font-medium {
... ...
@@ -516,10 +551,6 @@
516 551
font-weight: 600
517 552
}
518 553
519
-.font-bold {
520
- font-weight: 700
521
-}
522
-
523 554
.italic {
524 555
font-style: italic
525 556
}
... ...
@@ -534,50 +565,48 @@
534 565
535 566
.text-black {
536 567
--tw-text-opacity: 1;
537
- color: rgba(0, 0, 0, var(--tw-text-opacity))
568
+ color: rgb(0 0 0 / var(--tw-text-opacity, 1))
538 569
}
539 570
540 571
.text-white {
541 572
--tw-text-opacity: 1;
542
- color: rgba(255, 255, 255, var(--tw-text-opacity))
573
+ color: rgb(255 255 255 / var(--tw-text-opacity, 1))
543 574
}
544 575
545
-.hover\:text-black:hover {
546
- --tw-text-opacity: 1;
547
- color: rgba(0, 0, 0, var(--tw-text-opacity))
576
+.underline {
577
+ text-decoration-line: underline
548 578
}
549 579
550
-.hover\:text-gray-800:hover {
551
- --tw-text-opacity: 1;
552
- color: rgba(31, 41, 55, var(--tw-text-opacity))
580
+.no-underline {
581
+ text-decoration-line: none
553 582
}
554 583
555
-.underline {
556
- text-decoration: underline
584
+.visited\:text-black:visited {
585
+ color: rgb(0 0 0 )
557 586
}
558 587
559
-.no-underline {
560
- text-decoration: none
588
+.hover\:bg-gray-300:hover {
589
+ --tw-bg-opacity: 1;
590
+ background-color: rgb(209 213 219 / var(--tw-bg-opacity, 1))
561 591
}
562 592
563
-.hover\:underline:hover {
564
- text-decoration: underline
593
+.hover\:bg-pink-100:hover {
594
+ --tw-bg-opacity: 1;
595
+ background-color: rgb(252 231 243 / var(--tw-bg-opacity, 1))
565 596
}
566 597
567
-*, ::before, ::after {
568
- --tw-shadow: 0 0 #0000
598
+.hover\:text-black:hover {
599
+ --tw-text-opacity: 1;
600
+ color: rgb(0 0 0 / var(--tw-text-opacity, 1))
569 601
}
570 602
571
-*, ::before, ::after {
572
- --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);
573
- --tw-ring-offset-width: 0px;
574
- --tw-ring-offset-color: #fff;
575
- --tw-ring-color: rgba(59, 130, 246, 0.5);
576
- --tw-ring-offset-shadow: 0 0 #0000;
577
- --tw-ring-shadow: 0 0 #0000
603
+.hover\:text-gray-800:hover {
604
+ --tw-text-opacity: 1;
605
+ color: rgb(31 41 55 / var(--tw-text-opacity, 1))
578 606
}
579 607
580
-@media (min-width: 640px) {
608
+.hover\:underline:hover {
609
+ text-decoration-line: underline
581 610
}
582 611
583 612
@media (min-width: 768px) {
... ...
@@ -605,14 +634,14 @@
605 634
display: none
606 635
}
607 636
608
- .md\:h-6 {
609
- height: 1.5rem
610
- }
611
-
612 637
.md\:h-40 {
613 638
height: 10rem
614 639
}
615 640
641
+ .md\:h-6 {
642
+ height: 1.5rem
643
+ }
644
+
616 645
.md\:w-auto {
617 646
width: auto
618 647
}
... ...
@@ -627,16 +656,16 @@
627 656
}
628 657
629 658
@media (min-width: 1024px) {
630
- .lg\:mt-0 {
631
- margin-top: 0px
659
+ .lg\:ml-5 {
660
+ margin-left: 1.25rem
632 661
}
633 662
634 663
.lg\:mr-5 {
635 664
margin-right: 1.25rem
636 665
}
637 666
638
- .lg\:ml-5 {
639
- margin-left: 1.25rem
667
+ .lg\:mt-0 {
668
+ margin-top: 0px
640 669
}
641 670
642 671
.lg\:flex {
... ...
@@ -666,6 +695,3 @@
666 695
padding: 1rem
667 696
}
668 697
}
669
-
670
-@media (min-width: 1536px) {
671
-}
templates/layout.mustache
... ...
@@ -85,9 +85,11 @@
85 85
<a href="/" class="pr-4 font-semibold text-black hover:text-gray-800 block mt-4 md:inline-block md:mt-0 ">위키</a>
86 86
<a href="/book" class=" pr-4 font-semibold text-black hover:text-gray-800 block mt-4 md:inline-block md:mt-0 "><span>ver.1</span></a>
87 87
<a href="https://0makes0.com" class="pr-4 font-semibold text-black hover:text-gray-800 block mt-4 md:inline-block md:mt-0"><span>제로의 예술</span></a>
88
+ <!--
88 89
<a href="https://nothingmakesitself.art/Satellite-Project">
89 90
<img class="h-12 block md:inline-block md:mt-0" src="https://freight.cargo.site/t/original/i/abcd0824382cdb1e6c2efca6e3d5ae4dd8fc33f6ed88bddbfa25923073865abf/12313123100.png">
90 91
</a>
92
+ -->
91 93
</div>
92 94
</div>
93 95
</nav>
templates/server.mustache
... ...
@@ -11,10 +11,11 @@
11 11
<span id="address"> 위치: 위도 37.493423, 경도 126.834054</span><br/>
12 12
</div>
13 13
<div class="lg:mt-0">
14
- <h2 class="font-semibold text-lg mb-1">제로의 예술</h2>
14
+ <h2 class="font-semibold text-lg mb-1"><a href="https://0makes0.com" target="_blank">제로의 예술</a></h2>
15 15
<a href="https://barimart.wordpress.com" target="_blank"><span>바림</span></a> (광주광역시 동구 대의동 80-2 3층) <br>
16 16
<a href="http://womanopentechlab.kr" target="_blank"><span>여성을 위한 열린 기술랩</span></a> (서울시 중구 을지로 157 대림상가 세운메이커스큐브 대림-동측 306호)
17 17
</br>
18
+ <!--
18 19
<div>
19 20
<a href="https://nothingmakesitself.art/Satellite-Project"><img class="inline md:hidden mt-4 mb-1 h-16" src="https://freight.cargo.site/t/original/i/abcd0824382cdb1e6c2efca6e3d5ae4dd8fc33f6ed88bddbfa25923073865abf/12313123100.png"></a>
20 21
</br>
... ...
@@ -22,6 +23,7 @@
22 23
<span class="">2021 아르코 융복합 예술 페스티벌 《횡단하는 물질의 세계》</span> <br/>
23 24
<span class="">2021 ARKO Art & Tech Festival Nothing Makes Itself</span>
24 25
</div>
26
+ -->
25 27
</div>
26 28
</div>
27 29
</div>
tools/run-wiki-server.sh
... ...
@@ -1,4 +1,5 @@
1 1
#!/bin/sh
2 2
3 3
cd /tmp
4
-python3 -m http.server 8000
4
+#python3 -m http.server 8000
5
+python3 -m http.server 8002
tools/server-status.sh
... ...
@@ -1,22 +1,25 @@
1 1
#while true; do echo -e "Battery: 13.2v 86% \n Power Consumption: 1.2W \n Date: $(date) \n Uptime: $(uptime)\n\n"> /tmp/index.html; sleep 1; done
2 2
3 3
while true; do
4
- SENSORS=(`python2 ~/ina226.py`)
5 4
6
- CURRENT=${SENSORS[0]}
7
- VOLTAGE=${SENSORS[1]}
8
- POWER=${SENSORS[2]}
9
- BATTERY=${SENSORS[3]}
5
+ #SENSORS=(`python2 ~/ina226.py`)
10 6
11
- WEATHERS=(`python2 ~/weather.py`)
7
+ #CURRENT=${SENSORS[0]}
8
+ #VOLTAGE=${SENSORS[1]}
9
+ #POWER=${SENSORS[2]}
10
+ #BATTERY=${SENSORS[3]}
11
+
12
+ WEATHERS=(`python3 ./weather-2026.py`)
12 13
TEMPERATURE=${WEATHERS[0]}
13 14
FORECAST=${WEATHERS[1]}
14 15
LATITUDE=${WEATHERS[2]}
15 16
LONGITUDE=${WEATHERS[3]}
16 17
17
- #VOLTAGE=`seq 13 0.1 14 | shuf | head -n1`;
18
- #BATTERY=`seq 70 1 90 | shuf | head -n1`;
19
- #POWER=`seq 1 .1 1.5 | shuf | head -n1`;
18
+ # simulate for testing
19
+ CURRENT=`seq 0.1 0.15 0.2 | shuf | head -n1`;
20
+ VOLTAGE=`seq 13 0.1 14 | shuf | head -n1`;
21
+ POWER=`seq 1 .1 1.5 | shuf | head -n1`;
22
+ BATTERY=`seq 70 1 90 | shuf | head -n1`;
20 23
21 24
echo -e "{\"voltage\": $VOLTAGE, \"battery\": $BATTERY, \"powerConsumption\": $POWER, \"current\": $CURRENT, \"forecast\": \"$FORECAST\", \"temperature\": $TEMPERATURE, \"date\": \"$(date)\", \"uptime\": \"$(uptime -p)\", \"latitude\": $LATITUDE, \"longitude\": $LONGITUDE }" > /tmp/index.html;
22 25
sleep 30;
tools/weather-2026.py
... ...
@@ -0,0 +1,50 @@
1
+import sys
2
+from datetime import datetime, timedelta, timezone
3
+
4
+import requests
5
+from lxml import html
6
+
7
+HEADERS = {'User-Agent': 'Mozilla/5.0'}
8
+KST = timezone(timedelta(hours=9))
9
+
10
+# 기상청 AWS(방재기상관측) 구로 관측소 실황
11
+AWS_URL = 'https://www.weather.go.kr/w/observation/land/aws-obs-data.do'
12
+# 기상청 ASOS(종관기상관측) 도시별관측 - 운량은 여기에만 있음
13
+CITY_URL = 'https://www.weather.go.kr/w/observation/land/city-obs.do'
14
+
15
+r = requests.get(AWS_URL, headers=HEADERS, timeout=20, params={
16
+ 'db': 'MINDB_01M',
17
+ 'tm': datetime.now(KST).strftime('%Y.%m.%d %H:%M'),
18
+ 'stnId': '423',
19
+ 'sidoCode': 'asos',
20
+ 'sort': '',
21
+ 'config': '',
22
+})
23
+r.raise_for_status()
24
+item = r.json()['items'][0] # 가장 최근 관측값
25
+
26
+temperature = item['awsTmp']
27
+latitude = '37.493423'
28
+longitude = '126.834054'
29
+
30
+# 현재일기(맑음 등)와 운량(1/10 -> %): 도시별관측 표의 서울 행 (구로는 ASOS가 아니라 서울 값 사용)
31
+r = requests.get(CITY_URL, headers=HEADERS, timeout=20, params={
32
+ 'type': 't99', 'mode': '0', 'reg': '100', 'auto_man': 'm', 'stn': '108',
33
+})
34
+r.raise_for_status()
35
+t = html.fromstring(r.content.decode('utf8'))
36
+forecast = '-'
37
+cloud = '-'
38
+for tr in t.xpath('//table//tr'):
39
+ td = [' '.join(x.text_content().split()) for x in tr.xpath('./td')]
40
+ if len(td) > 3 and td[0] == '서울':
41
+ # td: 이름, 현재일기, 시정, 운량, ...
42
+ forecast = td[1] or '-'
43
+ if td[3].isdigit():
44
+ cloud = str(int(td[3]) * 10) + '%'
45
+ break
46
+
47
+if cloud != '-':
48
+ forecast += '(' + cloud + ')'
49
+
50
+sys.stdout.write(temperature + ' ' + forecast + ' ' + latitude + ' ' + longitude)

태양광 웹 서버

배터리 남은 용량: %
배터리 전압: V
전기 사용: Watt
서버 시간:
가동 시간:
날씨(구름량):
위치: 위도 37.493423, 경도 126.834054

제로의 예술

바림 (광주광역시 동구 대의동 80-2 3층)
여성을 위한 열린 기술랩 (서울시 중구 을지로 157 대림상가 세운메이커스큐브 대림-동측 306호)