ããã«ã¡ã¯ïŒ
ã¹ããŒãããŒã ãåã«å®¶ã®æè¡çãªé 眮ã«èå³ãæã£ãŠããå€ãã®äººã¯ãã倧æ°ãã§éæšæºã®ç §æã·ã¹ãã ã«ã€ããŠèãããšæããŸãã
æ ç»ãèŠãªãããã®ãããªãçãããæ¹æ³ã§éšå±ãç §ãã1ã€ã®æ¹æ³ã¯ããã©ã³ãã®
ãã®èšäºã§ã¯ãXiaomiYeelightã¹ããŒããã«ãã䜿çšããAmbilightã®å®è£ ã«ã€ããŠèª¬æããŸãã
Ambilightã«ã€ããŠ
誰ãç¥ããªã-Ambilightãã¯ãããžãŒã¯ãTVã«çµã¿èŸŒãŸããããã¯ã©ã€ãã§ãããTVç»é¢äžã®ãã¬ãŒã ã®ã«ã©ãŒç»åãåæããTVã®åšå²ã«æ¡æ£ããå ãåçŸããŸãã
Ambilightã®é·æïŒ
- , ;
- ;
- , .
äžè¬ã«ãAmbilightã¯éåžžã«èå³æ·±ããã¯ãããžãŒã§ããããã®äºå®ã®ç¢ºèªã¯ãã€ã³ã¿ãŒãããäžã«æ瀺ãããããã®ãè·äººã«ãããå®è£ ã®ããã®å€æ°ã®ããŸããŸãªãªãã·ã§ã³ã®ååšã§ãããããããããã¯ãã¹ãŠããã¬ã/ã¢ãã¿ãŒ/ã©ãããããã«ããŒã®èé¢ã«æ¥çãããã¢ãã¬ã¹æå®å¯èœãªLEDã¹ããªããã®äœ¿çšã«å§åçã«åºã¥ããŠããŸãããã®ãããªå®è£ ã§ã¯ãå°ãªããšãLEDã®å¶åŸ¡ãæ åœããç©ççãªå€éšã³ã³ãããŒã©ãŒãå¿ èŠã§ããããã«ã¯ããã®ãããªã·ã¹ãã ãã€ã³ã¹ããŒã«ããã人ããã®ç¹å®ã®ç¥èãå¿ èŠã§ãããããã£ãŠãå¥ã®æ¹æ³ãšããŠãã¹ããŒãã©ã³ãã䜿çšãããã®ãããªããã¯ã©ã€ãã®æãããããžã§ãã§ããªãåçŽãªããŒãžã§ã³ãææ¡ããŸãã
ãããã®ã¹ããŒãã©ã³ãã¯äœã§ããïŒ
ãã®ããã¯ã©ã€ããªãã·ã§ã³ãäœæããã«ã¯ãYeelightãã©ã³ãã®ç §æããã€ã¹ïŒXiaomiã®åäŒç€ŸïŒãŸãã¯XiaomiïŒãã ããååã«Yeelightãå«ãŸããŠãããã®ã®ã¿ïŒãå¿ èŠã§ããããã¯ãããã€ã¹ãXiaomiã¹ããŒãããŒã ãšã³ã·ã¹ãã ã«çµã¿èŸŒãŸããŠãããYeelightã¢ããªãä»ããŠå¶åŸ¡ãããããšãæå³ããŸãã
ç§ã®æèŠã§ã¯ãé©å¿åããã¯ã©ã€ãã¯ã誰ããXiaomiã¹ããŒãã©ã³ããè³Œå ¥ããããã«å®è¡ããæ©èœã§ã¯ãããŸããïŒã¡ãªã¿ã«ãããªãã®éé¡ã§ïŒãããããç§ã«ãšã£ãŠã¯ãããã¯èªå® ã®æ¢åã®ã©ã³ãã®æ©èœãæ¡åŒµããè¯ãæ©äŒã§ãããããã«ããã2ã€ã®Xiaomiã©ã³ãã®ææè ãšããŠãç§ã¯ãããã2ã¶æ䜿çšããåŸãç§ã¯æ¥œããå°è±¡ããæã£ãŠããªããšèšãããšãã§ããŸãã
Yeelightã¢ããªã±ãŒã·ã§ã³ã«ã¯ãéçºè ã¢ãŒããšãã1ã€ã®äŸ¿å©ãªãã©ã¡ãŒã¿ãŒãããããããã®ãããžã§ã¯ãã®å®è£ ã«ãããŠéèŠãªåœ¹å²ãæãããŸãã
ææ°ã®ã¢ããããŒãã§ã¯ããLANControlãã«ååãå€æŽãããŸãã
ææ°ã®ã¹ããŒãããŒã ãšã³ã·ã¹ãã ã¯ãwi-fiãããã³ã«ãä»ããããã€ã¹éã®ããŒã¿äº€æã«åºã¥ããŠããŸããåã¹ããŒãããã€ã¹ã«ã¯ãããŒã«ã«ã¯ã€ã€ã¬ã¹ãããã¯ãŒã¯ã«æ¥ç¶ã§ããWi-Fiã¢ãžã¥ãŒã«ãçµã¿èŸŒãŸããŠããŸãããã®ãããã§ãããã€ã¹ã¯ã¹ããŒãããŒã ã®ã¯ã©ãŠããµãŒãã¹ãä»ããŠå¶åŸ¡ãããŸãããã ããéçºè ã¢ãŒãã§ã¯ãããã€ã¹ã«å²ãåœãŠãããIPã¢ãã¬ã¹ã«ãªã¯ãšã¹ããéä¿¡ããããšã§ããã€ã¹ãšçŽæ¥éä¿¡ã§ããŸãïŒããã€ã¹ã¢ãã¬ã¹ã¯Yeelightã¢ããªã®ããã€ã¹æ å ±ã«ãããŸãïŒããã®ã¢ãŒãã¯ãã¹ããŒãã©ã³ããšåãããŒã«ã«ãããã¯ãŒã¯ã«ããããã€ã¹ããã®ããŒã¿ã®åä¿¡ãä¿èšŒããŸãã Yeelight Webãµã€ãã«ã¯ãéçºè ã¢ãŒãæ©èœã®å°ããªãã¢ããããŸãã
ãã®ãªãã·ã§ã³ã®ãããã§ãã¢ãããã£ãã©ã€ãã£ã³ã°æ©èœãå®è£ ããŠãªãŒãã³ãœãŒã¹ãã¬ãŒã€ãŒã«åã蟌ãããšãã§ããŸãã
æ©èœå®çŸ©
ãšã³ãžãã¢ããã®ãããªãã®ãèšèšããããšãèããŠãããšãã«çŽé¢ããå¯èœæ§ã®ããå°é£ïŒããã³ãããã解決ããæ¹æ³ïŒãšãèšç»ã®å®æœã«ãããäžè¬çãªé²æç¶æ³ã«ã€ããŠãããã«æçš¿ããŸãã
æ¢è£œã®ããã°ã©ã ã ãã«èå³ãããå Žåã¯ããæ¢è£œã®ãã¬ãŒã€ãŒã䜿ãããã ãã®äººåããã®é ç®ã«çŽæ¥ã¢ã¯ã»ã¹ã§ããŸãã
ãŸããéçºäžã®ãããžã§ã¯ãã§è§£æ±ºãã¹ã課é¡ã決ããŸãããããã®ãããžã§ã¯ãã®TORã®èŠç¹ïŒ
- ã¡ãã£ã¢ãã¬ãŒã€ãŒãŠã£ã³ããŠã®çŸåšã®ç»åã«å¿ããŠãã¹ããŒãã©ã³ãã®ãã©ã¡ãŒã¿ãŒïŒrgb LEDã®ãªãããã€ã¹ã䜿çšããå Žåã¯ãã©ã€ãã®è²ãŸãã¯æãã/枩床ïŒãåçã«å€æŽã§ããæ©èœãéçºããå¿ èŠããããŸãã
- .
- , «» .
- .
- .
,
ãããžã§ã¯ãéçºã®åæ段éã¯ãæ©èœãåã蟌ãããã®ãã¬ãŒã€ãŒãšãã¹ããŒãã©ã³ããšéä¿¡ããããã®ã©ã€ãã©ãªã®å®çŸ©ã§ãã
ç§ã®éžæã¯ã«èœã¡ãvlcjãã¬ãŒã€ãŒãšYAPIã®ã©ã€ãã©ãªã§æžãããJavaã®ãMavenã¯ãã«ãããŒã«ãšããŠäœ¿çšãããŸããã
Vlcjã¯ããã€ãã£ãVLCãã¬ãŒã€ãŒãJavaã¢ããªã±ãŒã·ã§ã³ã«åã蟌ãã ããJavaã³ãŒããä»ããŠãã¬ãŒã€ãŒã®ã©ã€ããµã€ã¯ã«ã管çãããã§ãããã¬ãŒã ã¯ãŒã¯ã§ãããã¬ãŒã ã¯ãŒã¯ã®äœæè ã¯ãVLCãã¬ãŒã€ãŒã®ã€ã³ã¿ãŒãã§ã€ã¹ãšæ©èœãã»ãŒå®å šã«ç¹°ãè¿ããã¬ãŒã€ãŒã®ãã¢ããŒãžã§ã³ãæã£ãŠããŸããçŸæç¹ã§æãå®å®ããŠããããŒãžã§ã³ã®ãã¬ãŒã€ãŒã¯ããŒãžã§ã³3ã§ããããã¯ãããžã§ã¯ãã§äœ¿çšãããŸãã
è¿œå ã®ãŠã£ã³ããŠãéããVlcjãã¬ãŒã€ãŒã€ã³ã¿ãŒãã§ã€ã¹vlcjãã¬ãŒã€ãŒã®
å©ç¹ïŒ
- VLCãã¬ãŒã€ãŒã®é·å¹Žã®æ©èœã§ããããµããŒããããŠããèšå€§ãªæ°ã®ãããªåœ¢åŒã
- PLãšããŠã®Javaãããã«ãããå€æ°ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ãã¬ãŒã€ãŒãéãããšãã§ããŸãïŒãã®å ŽåãJavaã¢ããªã±ãŒã·ã§ã³ãšå¯æ¥ã«ãªã³ã¯ãããŠããVLCãã¬ãŒã€ãŒã®å®è£ ã«ãã£ãŠã®ã¿å¶éãããŸãïŒã
çæïŒ
- ãã¬ã€ã€ãŒã®æ代é ãã®ãã¶ã€ã³ãããã¯ãç¬èªã®ã€ã³ã¿ãŒãã§ãŒã¹ã®å®è£ ã«ãã£ãŠè§£æ±ºãããŸãã
- ããã°ã©ã ã䜿çšããåã«ãVLCãã¬ãŒã€ãŒãšJavaããŒãžã§ã³8以éãã€ã³ã¹ããŒã«ããå¿ èŠããããŸããããã¯ééããªãæ¬ ç¹ã§ãã
䜿çšYAPIã¹ããŒãYeelightã¬ãžã§ãããšæ¥ç¶ããããã®ã©ã€ãã©ãªãšããŠã¯ãæ¢è£œã®ãœãªã¥ãŒã·ã§ã³ã®äžè¶³ã«ããã第äºã«ã·ã³ãã«ã§ãäž»ã«æ£åœåãããã³ããããšãã§ããŸããçŸæç¹ã§ã¯ãç¹ã«Javaèšèªã§ãã¹ããŒãã©ã³ããå¶åŸ¡ããããã®ãµãŒãããŒãã£ããŒã«ã¯å€ããããŸããã
Yapiã©ã€ãã©ãªã®äž»ãªæ¬ ç¹ã¯ããã®ããŒãžã§ã³ãMavenãªããžããªã«ååšããªãããšã§ãããã®ããããããžã§ã¯ãã³ãŒããã³ã³ãã€ã«ããåã«ãYapiãããŒã«ã«ãªããžããªã«æåã§ã€ã³ã¹ããŒã«ããå¿ èŠããããŸãïŒã€ã³ã¹ããŒã«å šäœã¯ãªããžããªã®READMEãã¡ã€ã«ã«èšè¿°ãããŠããŸãïŒã
ç»å解æã¢ã«ãŽãªãºã
åçç §æã®åçã¯ãçŸåšã®ãã¬ãŒã ã®å®æçãªè²åæã«åºã¥ããŠããŸãã
è©Šè¡é¯èª€ã®æ®µéã®çµæãšããŠã次ã®ç»ååæã®ååãéçºãããŸããã
æå®ãããé »åºŠã§ãããã°ã©ã ã¯ã¡ãã£ã¢ãã¬ãŒã€ãŒã®ã¹ã¯ãªãŒã³ã·ã§ãããæ®ããBufferedImageã¯ã©ã¹ã®ãªããžã§ã¯ããåãåããŸãã次ã«ãæéã®çµã¿èŸŒã¿ã¢ã«ãŽãªãºã ã䜿çšããŠãå ã®ç»åã®ãµã€ãºã20x20ãã¯ã»ã«ã«å€æŽããŸãã
ããã¯ã¢ã«ãŽãªãºã ã®é床ã®ããã«å¿ èŠã§ããããã®ããã«è²ã決å®ããéã«ããçšåºŠã®ç²ŸåºŠãç ç²ã«ããããšãã§ããŸãããŸããç»ååŠçæéã®çŸåšã®ã¡ãã£ã¢ãã¡ã€ã«ã®è§£å床ãžã®äŸåãæå°éã«æããããã«ãå¿ èŠã§ãã
次ã«ãã¢ã«ãŽãªãºã ã¯ãçµæã®ç»åã4ã€ã®ãããŒã¹ããŸãŒã³ïŒå·Šäžãå·Šäžãªã©ïŒã®10x10ãã¯ã»ã«ã®ãµã€ãºã«åå²ããŸãã
ãåºæ¬ããŸãŒã³
ãã®ã¡ã«ããºã ã¯ãããŸããŸãªç»åãŸãŒã³ã®ç¬ç«ããåæãæäŸããããã«å®è£ ãããŸããããã«ãããå°æ¥ãç §æããã€ã¹ãéšå±ã®ç¹å®ã®å Žæã«é 眮ããã远跡ãããå¿ èŠã®ããç»åãŸãŒã³ã瀺ãããšãã§ããŸãããã«ãã©ã³ãããã°ã©ã ã§äœ¿çšãããšããã®æ©èœã«ããåçç §æãã¯ããã«é°å²æ°ã®ãããã®ã«ãªããŸãã
次ã«ãç»åã®åé åã«ã€ããŠãåãã¯ã»ã«ã®3ã€ã®è²æåïŒèµ€ãç·ãéïŒã®ç®è¡å¹³åãåå¥ã«èšç®ããçµæã®ããŒã¿ãåäžã®è²ã®å€ã«é 眮ããããšã«ãã£ãŠãå¹³åè²ãèšç®ãããŸãã
çµæãšããŠåŸããã4ã€ã®å€ã®ãããã§ã次ã®ããšãã§ããŸãã
- 5 : , , , ( «» );
- :
r, g, b â // -
ç»åãã©ã¡ãŒã¿ãèšç®ããå¹ççã§ã¹ã±ãŒã©ãã«ãªã¡ã«ããºã ã®ããã«ããã¹ãŠã®è¿œå ããŒã¿ïŒãããŒã¹ããŸãŒã³ã枩床ãè²ã®æããã§ã¯ãªãïŒã¯ãæ æ°ã«ãèšç®ãããŸããå¿ èŠã«å¿ããŠã
ãã¹ãŠã®ç»ååŠçã³ãŒãã¯ã1ã€ã®ImageHandlerã¯ã©ã¹ã«åãŸããŸãã
public class ImageHandler {
private static List<ScreenArea> mainAreas = Arrays.asList(ScreenArea.TOP_LEFT, ScreenArea.TOP_RIGHT, ScreenArea.BOTTOM_LEFT, ScreenArea.BOTTOM_RIGHT);
private static int scaledWidth = 20;
private static int scaledHeight = 20;
private static int scaledWidthCenter = scaledWidth / 2;
private static int scaledHeightCenter = scaledHeight / 2;
private Map<ScreenArea, Integer> screenData;
private LightConfig config;
//
private int[] getDimensions(ScreenArea area) {
int[] dimensions = new int[4];
if (!mainAreas.contains(area)) {
return dimensions;
}
String name = area.name().toLowerCase();
dimensions[0] = (name.contains("left")) ? 0 : scaledWidthCenter;
dimensions[1] = (name.contains("top")) ? 0 : scaledHeightCenter;
dimensions[2] = scaledWidthCenter;
dimensions[3] = scaledHeightCenter;
return dimensions;
}
//
private BufferedImage getScaledImage(BufferedImage image, int width, int height) {
Image tmp = image.getScaledInstance(width, height, Image.SCALE_FAST);
BufferedImage scaledImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = scaledImage.createGraphics();
g2d.drawImage(tmp, 0, 0, null);
g2d.dispose();
return scaledImage;
}
// , , ,
private void proceedImage(BufferedImage image) {
BufferedImage scaledImage = getScaledImage(image, scaledWidth, scaledHeight);
screenData = new HashMap<>();
mainAreas.forEach(area -> {
int[] dimensions = getDimensions(area);
BufferedImage subImage = scaledImage.getSubimage(dimensions[0], dimensions[1], dimensions[2], dimensions[3]);
int average = IntStream.range(0, dimensions[3])
.flatMap(row -> IntStream.range(0, dimensions[2]).map(col -> subImage.getRGB(col, row))).boxed()
.reduce(new ColorAveragerer(), (t, u) -> {
t.accept(u);
return t;
}, (t, u) -> {
t.combine(u);
return t;
}).average();
screenData.put(area, average);
});
}
public ImageHandler(BufferedImage image, LightConfig config) {
this.config = config;
proceedImage(image);
}
// , considerRate ( )
public int getValue(ScreenArea area, Feature feature, Boolean considerRate) {
Integer intValue = screenData.get(area);
if (intValue != null) {
Color color = new Color(intValue);
if (feature == Feature.COLOR) {
return color.getRGB();
} else if (feature == Feature.BRIGHTNESS || feature == Feature.TEMPERATURE) {
int value = (feature == Feature.BRIGHTNESS) ? getBrightness(color) : getTemperature(color);
double rate = (feature == Feature.BRIGHTNESS) ? config.getBrightnessRate() : config.getTemperatureRate();
value = (value < 0) ? 0 : value;
if (considerRate) {
value = 10 + (int) (value * rate);
}
return (value > 100) ? 100 : value;
} else {
return 0;
}
} else {
calculateArea(area);
return getValue(area, feature, considerRate);
}
}
//
private int getBrightness(Color color) {
return (int) ((color.getRed() * 0.2126f + color.getGreen() * 0.7152f + color.getBlue() * 0.0722f) / 255 * 100);
}
//
private int getTemperature(Color color) {
return (int) ((float) (color.getRed() - color.getBlue()) / 255 * 100);
}
// ""
private void calculateArea(ScreenArea area) {
int value = 0;
switch (area) {
case TOP:
value = getAverage(ScreenArea.TOP_LEFT, ScreenArea.TOP_RIGHT);
break;
case BOTTOM:
value = getAverage(ScreenArea.BOTTOM_LEFT, ScreenArea.BOTTOM_RIGHT);
break;
case LEFT:
value = getAverage(ScreenArea.BOTTOM_LEFT, ScreenArea.TOP_LEFT);
break;
case RIGHT:
value = getAverage(ScreenArea.BOTTOM_RIGHT, ScreenArea.TOP_RIGHT);
break;
case WHOLE_SCREEN:
value = getAverage(mainAreas.toArray(new ScreenArea[0]));
break;
}
screenData.put(area, value);
}
//
private int getAverage(ScreenArea... areas) {
return Arrays.stream(areas).map(color -> screenData.get(color))
.reduce(new ColorAveragerer(), (t, u) -> {
t.accept(u);
return t;
}, (t, u) -> {
t.combine(u);
return t;
}).average();
}
// rgb int-
public static int[] getRgbArray(int color) {
int[] rgb = new int[3];
rgb[0] = (color >>> 16) & 0xFF;
rgb[1] = (color >>> 8) & 0xFF;
rgb[2] = (color >>> 0) & 0xFF;
return rgb;
}
// int- rgb
public static int getRgbInt(int[] pixel) {
int value = ((255 & 0xFF) << 24) |
((pixel[0] & 0xFF) << 16) |
((pixel[1] & 0xFF) << 8) |
((pixel[2] & 0xFF) << 0);
return value;
}
// stream API
private class ColorAveragerer {
private int[] total = new int[]{0, 0, 0};
private int count = 0;
private ColorAveragerer() {
}
private int average() {
int[] rgb = new int[3];
for (int it = 0; it < total.length; it++) {
rgb[it] = total[it] / count;
}
return count > 0 ? getRgbInt(rgb) : 0;
}
private void accept(int i) {
int[] rgb = getRgbArray(i);
for (int it = 0; it < total.length; it++) {
total[it] += rgb[it];
}
count++;
}
private void combine(ColorAveragerer other) {
for (int it = 0; it < total.length; it++) {
total[it] += other.total[it];
}
count += other.count;
}
}
}
ã©ã³ãã®é »ç¹ãªã¡ãã€ããç®ãåºæ¿ããã®ãé²ãããã«ããã©ã¡ãŒã¿ãå€æŽããããã®ãããå€ãå°å ¥ãããŸãããããšãã°ãã©ã³ãã¯ãæ ç»ã®çŸåšã®ã·ãŒã³ãåã®ã·ãŒã³ãã10ïŒ ä»¥äžæããå Žåã«ã®ã¿ãèŒåºŠå€ãå€æŽããŸãã
ä»ã®åææ¹æ³ãšã®æ¯èŒ
ãç»åã2x2ãã¯ã»ã«ã«çž®å°ããŠãçµæã®å€ãæ°ããªãã®ã¯ãªãã§ããïŒã㚠質åãããããããŸããã ..ã
çãã¯æ¬¡ã®ããã«ãªããŸãããç§ã®å®éšã«åºã¥ããŠãç»åïŒãŸãã¯ãã®ãŸãŒã³ïŒã®ãµã€ãºãçž®å°ããŠå¹³åè²ã決å®ããã¢ã«ãŽãªãºã ã¯ããã¹ãŠã®ãã¯ã»ã«ã®ç®è¡å¹³åã決å®ããã¢ã«ãŽãªãºã ãããå®å®æ§ãšä¿¡é Œæ§ãäœãããšãããããŸããïŒç¹ã«ç»åã®æãé åãåæããå ŽåïŒã "ã
ç»åã®ãµã€ãºãå€æŽããããã«ãããã€ãã®æ¹æ³ãè©ŠãããŸãããopenCVã©ã€ãã©ãªã䜿çšããŠãã€ã¡ãŒãžãããæ¬æ Œçã«åŠçããããšã¯å¯èœã§ããããããã¯ãã®ã¿ã¹ã¯ã§ã¯éå°ã«èšèšãããŠãããšèããŸãããæ¯èŒã®ããã«ã以äžã¯ãBufferedImageã¯ã©ã¹ã®çµã¿èŸŒã¿ã®é«éã¹ã±ãŒãªã³ã°ã䜿çšããŠè²ãå®çŸ©ããç®è¡å¹³åãèšç®ããäŸã§ããã³ã¡ã³ãã¯äžèŠã ãšæããŸãã
æ§æ
çŸåšãããã°ã©ã ã¯jsonãã¡ã€ã«ã䜿çšããŠæ§æãããŠããŸããJSON.simpleã¯ãæ§æãã¡ã€ã«ã解æããããã®ã©ã€ãã©ãªãšããŠäœ¿çšãããŸããã
Jsonãã¡ã€ã«ã«ã¯ãconfig.jsonããšããååãä»ããèªåæ§ææ€åºçšã®ããã°ã©ã ãšåããã©ã«ããŒã«é 眮ããå¿ èŠããããŸããããããªããšãé©å¿èŒåºŠæ©èœãæå¹ã«ãªã£ãŠããå Žåãããã°ã©ã ã¯ãã¡ã€ã«éžæãŠã£ã³ããŠãéããŠæ§æãã¡ã€ã«ãæå®ããããã«æ±ããŸãããã®ãã¡ã€ã«ã§ã¯ãç §æããã€ã¹ã®IPã¢ãã¬ã¹ãåããã€ã¹ã®ãç£èŠå¯Ÿè±¡ãã€ã¡ãŒãžãŸãŒã³ãæãããšè²ã®æž©åºŠä¿æ°ããŸãã¯èªåã€ã³ã¹ããŒã«ã®æéïŒæ¬¡ã®æ®µèœã§èª¬æããŸãïŒãæå®ããå¿ èŠããããŸãã jsonãã¡ã€ã«ã«å ¥åããããã®ã«ãŒã«ã¯ããããžã§ã¯ãã®READMEãã¡ã€ã«ã«èšè¿°ãããŠããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ïŒã©ã€ããã¿ã³ïŒã®ãã¹ãŠã®å€æŽããã¿ã³ãæŒããšã䜿çšå¯èœãªæ§æãã¡ã€ã«ãé©çšãããããéžæçšã®ãŠã£ã³ããŠãéããŸãã
ä¿æ°ã¯ãã©ã³ãããããã«æãããããéã«æããããããããªã©ãç»ååæãããæ£ç¢ºã«èšå®ããããã«å¿ èŠã§ãããããã®ãã©ã¡ãŒã¿ã¯ãã¹ãŠãªãã·ã§ã³ã§ããããã§å¿ èŠãªå¯äžã®ãã©ã¡ãŒã¿ã¯ãç §æåšå ·ã®IPã¢ãã¬ã¹ã®å€ã§ãã
ãªããºã®èªåèšå®
ããã°ã©ã ã¯ãŸããéšå±ã®çŸåšã®ç §æã«å¿ããŠä¿æ°ã®èªå調æŽã®æ©èœãå®è£ ããŠããŸããããã¯æ¬¡ã®ããã«çºçããŸããéžæããåšæ³¢æ°ã§ã©ãããããã®Webãµã€ããç°å¢ã®åçãæ®ãããã§ã«èª¬æããã¢ã«ãŽãªãºã ã«åŸã£ãŠãã®æãããåæãã次ã®åŒã«åŸã£ãŠä¿æ°ãèšå®ããŸãã
ãã®æ©èœã¯ãæ§æãã¡ã€ã«ã«ç¹å¥ãªã¿ã°ãæžã蟌ãããšã§æå¹ã«ãªããŸãã
æ©èœäŸ
çµè«
ãã®åé¡ã解決ããçµæãYeelightã¹ããŒãã©ã³ããã¡ãã£ã¢ãã¡ã€ã«ã®é©å¿åããã¯ã©ã€ããšããŠäœ¿çšã§ããæ©èœãéçºãããŸãããããã«ãçŸåšã®éšå±ã®ç §æãåæããæ©èœãå®è£ ãããŠããŸãããã¹ãŠã®ãœãŒã¹ã³ãŒãã¯ãç§ã®githubãªããžããªã®ãªã³ã¯ããå ¥æã§ããŸãã
ãæž èŽããããšãããããŸããïŒ
PSç§ã¯ãééãã®è¿œå ãçºèšãããã³å åãããã°åãã§ããŸãã