Read the statement by Michael Teeuw here.
Error in using python with child_process
-
node_helper.js
const spawn = require('child_process').spawn; const NodeHelper = require("node_helper"); var self; module.exports = NodeHelper.create({ start: function () { self = this; console.log("Starting node_helper for: " + this.name); }, getData: function () { const result = spawn('python', ['/home/pi/MagicMirror/modules/MMM-DustInfo/Naver_geo.py']); result.stdout.on('data', function(data) { console.log(data.toString()); recivedData = data.toString(); recivedData = JSON.parse(recivedData); }); result.on('close', (code) => { console.log(recivedData.station); station = recivedData.station; pm10 = recivedData.pm10; var recivedData = { station, pm10 } self.sendSocketNotification('TEXT_RESULT', recivedData); }); process.on('exit', function() { if (x) { x.kill(); } }); }, socketNotificationReceived: function (notification, payload) { if (notification === 'GET_TEXT_DATA') { self.getData(); } }, });my python file code
import requests import pandas as pd import json import urllib.request from bs4 import BeautifulSoup from haversine import haversine station_data = pd.read_excel("/home/pi/Desktop/Dust/station_list.xlsx") location_data = pd.read_excel("/home/pi/Desktop/Dust/location.xlsx") location_data = location_data.values.tolist() def search_map(search_text): client_id = 'vo9k89s848' #클라이언트 ID값 client_secret = 'MPooQfaCMH9eSMnT50RvNEYjChshVRHwq3qiBoQi' #클라이언트 Secret값 encText = urllib.parse.quote(search_text) url = 'https://naveropenapi.apigw.ntruss.com/map-geocode/v2/geocode?query='+encText request = urllib.request.Request(url) request.add_header('X-NCP-APIGW-API-KEY-ID', client_id) request.add_header('X-NCP-APIGW-API-KEY', client_secret) response = urllib.request.urlopen(request) rescode = response.getcode() if(rescode==200): response_body = response.read() return response_body.decode('utf-8') def station_info(): station_info = [] for i in range(489): info = search_map(station_data.loc[i]['측정소 주소']) info = json.loads(info) station_info.append([float(info['addresses'][0]['y']),float(info['addresses'][0]['x'])]) return station_info def curr_LocInfo(): curr_LocInfo = [] info = search_map("서울특별시 노원구 공릉로 232") info = json.loads(info) curr_LocInfo.append([float(info['addresses'][0]['y']),float(info['addresses'][0]['x'])]) return curr_LocInfo def Loc_to_xlsx(): station_x = station_info() station_x = pd.DataFrame(station_x) station_x.to_excel("C:/Users/sks12/Desktop/PythonWorkspace/Dust_Window/location.xlsx") def search_station(): station_Loc = location_data curr_Loc = curr_LocInfo() min = 10000 for i in range(489): distance = haversine((station_Loc[i][1], station_Loc[i][2]), curr_Loc[0], unit = 'km') if distance < min: min = distance globals()['station_index'] = i def Dust_info(): search_station() city = station_data.loc[station_index]['측정소명'] key = "mr81qR0Ed0RG4%2FUFpmXXLO0c7AO3HI6PC%2BVFgy%2BMO1yZ%2F7ciBAJejaPZ%2FmHi%2F30D4CYg7DKkGwpxHXTgHQDTSQ%3D%3D" url = "http://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getMsrstnAcctoRltmMesureDnsty?stationName={}&dataTerm=month&pageNo=1&numOfRows=100&returnType=xml&serviceKey={}".format(city, key) res = requests.get(url) res.raise_for_status() content = BeautifulSoup(res.text, "lxml") dust = content.item pm10 = dust.pm10value check = pm10.get_text() if check == '-': dust = dust.next_sibling dust = dust.next_sibling pm10 = dust.pm10value pm10 = int(pm10.get_text()) # print("near station: {}".format(station_data.loc[station_index]['측정소명'])) # print("dust info:{}".format(pm10)) data = { "station" : station_data.loc[station_index]['측정소명'], "pm10" : pm10 } data_json = json.dumps(data) print (data_json) Dust_info()my module code
Module.register("MMM-DustInfo", { defaults: { updateInterval: 60000, }, requiresVersion: "2.1.0", // Required version of MagicMirror start: function () { // Log.info("Starting module: " + this.name); // requiresVersion: "2.1.0"; // this.loaded = false; this.scheduleUpdate(); }, getStyles: function() { return["MMM-DustInfo.css"]; }, scheduleUpdate: function () { setInterval(() => { this.getData(); }, this.config.updateInterval); this.getData(); }, getData: function() { console.log('GET_TEXT_DATA', this.config) this.sendSocketNotification('GET_TEXT_DATA', this.config); }, socketNotificationReceived: function (notification, payload) { if (notification === "TEXT_RESULT") { this.textDataRecived = payload; this.loaded = true; } this.updateDom(); }, getDom: function () { var wrapper = document.createElement("div"); if (!this.loaded) { wrapper.innerHTML = "LOADING"; return wrapper; } if (this.loaded) { var table = document.createElement('td'); var space1 = document.createElement('tr'); var space2 = document.createElement('tr'); var pm10Icon = document.createElement("tr"); if (this.textDataRecived.pm10 <= 30) { Icon_pm10 = "fa fa-smile-o"; pm10Icon.id = 'smile' } else if (this.textDataRecived.pm10 > 30 && this.textDataRecived.pm10 <= 80) { Icon_pm10 = "fa fa-meh-o" pm10Icon.id = 'meh' } else { Icon_pm10 = "fa fa-frown-o" pm10Icon.id = 'frown' } pm10Icon.className = Icon_pm10; var pm10Data = document.createElement('span'); pm10Data.className = "medium"; pm10Data.innerHTML = "PM10: " + this.textDataRecived.pm10 +" ppm"; var stationIcon = document.createElement("tr"); stationIcon.className = "fa fa-home"; var stationData = document.createElement("span"); stationData.className = "medium"; stationData.innerHTML = "내 위치: " + this.textDataRecived.station; table.appendChild(space1); table.appendChild(space2); space1.appendChild(pm10Icon); pm10Icon.appendChild(pm10Data); space2.appendChild(stationIcon); stationIcon.appendChild(stationData); wrapper.appendChild(table); } return wrapper; }, });and i got a error like this
[01.07.2021 23:12.25.107] [LOG] {"station": "\ub178\uc6d0\uad6c", "pm10": 31} [01.07.2021 23:12.25.342] [ERROR] Whoops! There was an uncaught exception... [01.07.2021 23:12.25.345] [ERROR] TypeError: Cannot read property 'station' of undefined at ChildProcess.<anonymous> (/home/pi/MagicMirror/modules/MMM-DustInfo/node_helper.js:23:28) at ChildProcess.emit (events.js:315:20) at maybeClose (internal/child_process.js:1021:16) at Process.ChildProcess._handle.onexit (internal/child_process.js:286:5)I want to display pm10 value and nearest dustinfo station using airkorea API
I’m really beginner please help me…
-
@doridol
In node_helperreceiveddata needs to be defined outside the on handlers. u could move the handling up to the on data, and remove the on close
-
@sdetweil Really really thanks!! I solved problem
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login