일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 오블완
- 배당
- matter
- MQTT
- ConnectedHomeIP
- 월패드
- 파이썬
- esp32
- 퀄컴
- 현대통신
- 공모주
- 애플
- 홈네트워크
- Python
- 엔비디아
- 국내주식
- 매터
- Home Assistant
- 티스토리챌린지
- raspberry pi
- 힐스테이트 광교산
- Bestin
- Espressif
- 나스닥
- 해외주식
- Apple
- 미국주식
- 코스피
- homebridge
- RS-485
- Today
- Total
목록Python (62)
YOGYUI
한동안 1일 1디바이스씩 조지다가(?) 21일~23일 거제도 출장 일정으로 잠깐 휴식을 가졌다 ㅎㅎ 다시 열심히 달려보자.. 거실 월패드랑 복도 쪽 제어패드에는 엘리베이터 호출 기능이 있다 월패드에서는 상향, 하향 양방향으로 호출이 가능한데 반해, 복도 제어패드에서는 하향으로만 호출이 된다는 차이가 있다 (Hi-oT 앱에서도 하향으로만 호출된다는 점은 약간 특이하다) 월패드로 엘리베이터를 호출하면서 패킷 변화를 캡쳐해보자 1. 엘리베이터 호출 시 패킷 분석 class ParserVarious(SerialParser): def interpretPacket(self, packet: bytearray): try: if packet[3] == 0x18: # 난방 self.handleThermostat(packe..
분양받을 때 옵션으로 거실이랑 방3개 모두 천장형 시스템에어컨 (공기청정 미적용) 설치하기로 계약했다 원래 가지고 있던 에어컨이 없었을 뿐더러 이제껏 천장에 달린 시스템에어컨이 있는 집에서만 살아왔기 때문에 이게 익숙해서 별고민없이 설치할 수 있는 공간엔 죄다 설치했다 (에어컨 옵션 금액만 638만원 부들부들... 돈이 이렇게 많이 들줄은 몰랐지 ㅠㅠ) 거실에 있는 월패드로 각 방별로 에어컨 4가지의 상태를 설정할 수 있다 가동상태: On/Off 희망온도: 1도 단위, 최소 18도 ~ 최대 30도 풍량: 자동/미풍/약풍/강풍 모드: 자동/냉방/제습/공기청정 공기청정은 미적용 옵션으로 했는데, 월패드에서는 설정할 수 있는 점이 신기했다 (물론 Hi-oT 앱으로도 가능한데, 앱에서는 여러 상태에 대한 명령을..
도시가스, 난방 관련 제어를 하면서, RS-485 통신선 여러개가 묶여있는 포트로 오가는 패킷 중 네번째 바이트 값에 따라 어떤 기기가 관련있는지 조사해나가고 있다 총 7개 값 (0x18, 0x1B, 0x1C, 0x2A, 0x2B, 0x34, 0x48)이 네번째 바이트 값으로 설정되어 있으며, 그 중 0x1B: 도기가스밸브 0x18: 난방 인 것을 알게 되었다 이번엔 환기(전열교환기)를 제어하면서 5번째 바이트가 0x02인 명령 패킷을 캡쳐하고 분석해보자 1. 환기 가동 및 풍량 변경 패킷 분석 가스, 난방을 제외하고 패킷을 캡쳐해보자 class ParserVarious(SerialParser): def interpretPacket(self, packet: bytearray): if packet[2:4]..
지난번 도시가스차단기(밸브)쪽 포트의 RS-485 패킷 분석 시 (링크), 4번째 바이트가 0x1B인 패킷은 가스밸브와 관련된 패킷인 것을 알아냈다 그 외에도 4번째 바이트가 0x18, 0x1C, 0x2A, 0x2B, 0x34, 0x48인 패킷 종류가 있는 것을 확인했는데, 이제 힐스테이트 Hi-oT 앱으로 제어 가능한 디바이스들을 하나하나 건드려보면서 각각이 어떤 기기와 관련있는지 알아내보자 1. 난방 가동 및 온도 변경 패킷 분석 class ParserGas(SerialParser): def interpretPacket(self, packet: bytearray): if packet[2:4] == bytearray([0x01, 0x1B]): # 가스차단기 if packet[4] == 0x01: # 상..
분양받은 아파트 입주 시작일(5/17)이 코앞으로 다가왔다 분명히 아파트는 다 지어졌는데 나는 현금이 없다... 현금없는 서민에게 필요한건 역시 주택담보대출! 집단대출 상담받으면서 대출가능금액, 대출기한 및 금리같은 중요한 정보들을 들었는데, 매달 내야하는 이자 및 원금(원리금) = 내가 실제로 내야하는 돈에 대해서는 상담사가 계산기를 두들겨주는 것만 보고는 까먹어버렸다... 대출 이자 계산을 해주는 웹사이트가 워낙 많기 때문에 인터넷만 가능한 환경이면 금방 계산 가능한 세상이긴 하지만, 개발자라면 계산기정도는 직접 만들어보는 것도 시간때우기용으로 적당하다 ㅎㅎ Python으로 만들었고, UI는 PyQt5를 활용했다 https://github.com/YOGYUI/Mortgage-Loan-Calculato..
PyQt5 - Set maximum value over 0x7FFFFFFFF of Spin Box PyQt5의 QSpinBox는 4바이트 부호 있는 정수 (singed integer)를 표현할 수 있다 (자세히 알아보지는 않았는데, QSpinBox 내부 QLineEdit의 validator가 Qt에서 제공하는 default QIntValidator인듯?) from PyQt5.QtWidgets import * app = QApplication([]) spinbox = QSpinBox() lineedit = spinbox.lineEdit() validator = lineedit.validator() print(validator) In [1]: print(validator) Out[1]: (그냥 QValida..
typing - Literal 파이썬, 자바스크립트, 루비 등 최근 유행하는 프로그래밍 언어의 가장 큰 특징 중 하나는 변수의 형(type)을 지정하지 않아도 원활하게 동작하는 코드를 작성할 수 있다는 점이다 (dynamic typing) v = '123456789' >> type(v) v = 123456789 >> type(v) 하지만 대형 팀 프로젝트 작업 시에 함수 인자 및 반환의 형을 명시해두지 않으면 각종 예외 발생으로 고통받게 된다 def my_func(x): return x + 1 >> my_func(1) 2 >> my_func('123') Traceback (most recent call last): File "C:\Python38\lib\code.py", line 90, in runcod..
앞서 공공데이터포털에서 대기오염정보를 조회하는 예시를 작성해봤는데(링크), API의 서비스 중 "측정소별 실시간 측정정보"를 호출하기 위해서는 '측정소 이름'을 정확히 기재해야 결과가 제대로 나왔다 API 명세서에 측정소 이름에 대한 정보는 없으며, 에어코리아 홈페이지의 "측정소 정보"에서 지역별 측정소의 이름과 주소 정보를 확인할 수 있다 URL: https://airkorea.or.kr/web/stationInfo?pMENU_NO=93 전체 조회 후 엑셀로 저장하는 방법(a.k.a. 노가다)이 가장 보편적이겠지만, 간단한 자바스크립트 및 파이썬으로 스마트하게 자동화할 수 있다 1. 웹페이지 소스 확인 브라우저의 개발자 도구에서 제어하고자 하는 컨트롤들에 해당하는 태그들을 찾아보자 (구글 크롬: 단축키..
공공데이터포털에서 전국의 대기오염정보를 가져와보자 공공데이터포털 관련 글을 많이 쓰다보니 서론 쓰는 것도 힘들다 1. API 활용신청 정식 데이터 타이틀은 "한국환경공단_에어코리아_대기오염정보" URL: https://www.data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15073861 2020년 12월에 공공데이터포털에 등록되었는데, 8000건이 넘게 활용신청된 아주 따끈따끈하고 핫한 API !! 미세먼지가 1년 내내 우리를 괴롭히니 어쩔 수가 없는건가 ㅠㅠ API 활용신청(방법은 링크 참고)하고 인증키 획득 인증키를 메모장에 복사해두자 2. API 명세 확인 API 명세서는 워드 문서로 제공되는데, 상세하게 기입되어 있어 문서 한장만으로도 충..
Get Corporations List Classified by Sectors from DART(fss) [시리즈] 웹크롤링 - DART 기업개황 업종별 기업 리스트 가져오기 (1) 웹크롤링 - DART 기업개황 업종별 기업 리스트 가져오기 (2) 웹크롤링 - DART 기업개황 업종별 기업 리스트 가져오기 (3) 웹크롤링 - DART 기업개황 업종별 기업 리스트 가져오기 (Final) 11. 기업 객체 정보 가져오도록 스크립트 수정 테이블에서 기업 이름 및 기업 고유 코드 (8자리 문자열), 섹터 id를 함께 가져오도록 javascript를 수정하도록 하자 [run_code.js] /* * 필요한 함수 선언 */ // jsTree 노드의 부모 노드들의 id와 text 어레이로 반환 function fnG..
Get Corporations List Classified by Sectors from DART(fss) [시리즈] 웹크롤링 - DART 기업개황 업종별 기업 리스트 가져오기 (1) 웹크롤링 - DART 기업개황 업종별 기업 리스트 가져오기 (2) 웹크롤링 - DART 기업개황 업종별 기업 리스트 가져오기 (3) 웹크롤링 - DART 기업개황 업종별 기업 리스트 가져오기 (Final) 7. 업종에 기업이 존재하지 않을 경우에 대한 예외처리 전체 트리노드를 크롤링하다보니 미처 고려하지 못했던 문제를 발견했다 특정 업종의 경우 해당 업종에 속하는 기업이 아예 없는 경우가 있는데, 이 경우 테이블 아래의 페이지 탐색 태그 () 자체가 없어서 코드에 예외가 발생했다 앞서 javascript에서 함수 두 개를 다..
Get Corporations List Classified by Sectors from DART(fss) [시리즈] 웹크롤링 - DART 기업개황 업종별 기업 리스트 가져오기 (1) 웹크롤링 - DART 기업개황 업종별 기업 리스트 가져오기 (2) 웹크롤링 - DART 기업개황 업종별 기업 리스트 가져오기 (3) 웹크롤링 - DART 기업개황 업종별 기업 리스트 가져오기 (Final) 4. 트리 노드 위계구조 파악 업종 정보 트리의 위계구조(hierarchy)를 함께 가져와야 나만의 서비스를 만들기 편하다 jsTree 노드 객체의 부모 노드의 정보는 객체 내부에 parents 속성으로 조회할 수 있다 예를 위해 '곡물 및 기타 식량작물 재배업' 최하위 노드에 접근해보자 var tree = $j("#bus..
2022년 공휴일 정보 공공데이터포털(data.go.kr)의 "한국천문연구원_특일 정보" Open API를 활용하면 공휴일 정보를 알 수 있다 API 활용 관련글 바로가기 2021년도 이제 끝나가니, 2022년은 공휴일이 무슨 요일인지 한번 훑어보자 import datetime import requests import pandas as pd from bs4 import BeautifulSoup, element from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * def getHolidayDataFrame(year: int) -> pd.DataFrame: url = "http://apis.data.go.kr/B0..
공공데이터포털(data.go.kr)에서 한국예탁결제원이 제공하는 국내 주식시장과 관련된 다양한 정보들을 가져와보자 (KSD 증권정보포털인 SEIBro의 API, api.seibro.or.kr) 1. 공공데이터포털 API 활용신청 데이터 타이틀은 "한국예탁결제원_주식정보서비스", URL은 아래 링크 참고 https://www.data.go.kr/data/15001145/openapi.do 1.1 활용신청 활용신청 버튼을 클릭 1.2. 활용목적 기입 1.3. 상세기능정보 선택 특별한 사유가 아니라면 전부 선택해주자 (서버 과부하를 우려해서 그런가, 일일 트래픽이 기능별로 100회로 한정되어 있다 ㅠ) 1.4. 활용신청 저작자표시 동의 체크박스 클릭 수 활용신청 2. 인증키 확인 [마이페이지 - 오픈API -..
티스토리 유입 경로를 보면 간혹 다음과 같이 링크로 유입된 경우를 확인하게 된다 위 예시의 URL은 다음과 같다 https://yogyui.tistory.com/notify-Notice_Blog_New?aHR0cHM6Ly95b2d5dWkudGlzdG9yeS5jb20vZW50cnkvJUVBJUI0JTkxJUVBJUI1JTkwJUVDJTk1JTg0JUVDJTlEJUI0JUVEJThDJThDJUVEJTgxJUFDLSVFQyU5NyU5OCVFQiVBNiVBQyVFQiVCMiVBMCVFQyU5RCVCNCVFRCU4NCVCMC0lRUQlOTklODglRUQlODIlQjctJUVDJTk3JUIwJUVCJThGJTk5LTEtMg==;n4NRnC9NaQ4RKh+vRtSjrCgg81uCPHnovGhC9+SAIC8= 정작 ..