Skip to content

Commit 716ca19

Browse files
committed
update extension v2
1 parent 3173e15 commit 716ca19

15 files changed

+546
-53
lines changed

extensions_v2/eim_monitor.py

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
def monitor(content,logger):
2+
return content + ' from script'

extensions_v2/eim_trigger.py

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import time
2+
3+
def trigger():
4+
timestamp = time.time()
5+
time.sleep(1)
6+
return timestamp

extensions_v2/extension_HA.py

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from codelab_adapter.core_extension import ControllerExtension
2+
from codelab_adapter.utils import get_server_file_path
3+
4+
5+
class HAControllerExtension(ControllerExtension):
6+
'''
7+
use to control HA server
8+
'''
9+
10+
def __init__(self):
11+
super().__init__()
12+
self.server_extension_id = "eim/HA_gateway"
13+
self.EXTENSION_ID = f"{self.server_extension_id}/control" # default eim
14+
self.server_file = get_server_file_path("HA_server.py")
15+
16+
17+
export = HAControllerExtension

extensions_v2/extension_HCI.py

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
'''
2+
HCI: human–machine interaction
3+
本插件支持将任何输入映射为鼠标键盘行为
4+
5+
requirement:
6+
pip3 install pyautogui --user
7+
8+
PyAutoGUI only runs on Windows, Mac, and Linux.
9+
If you lose control and need to stop the current PyAutoGUI function, keep moving the mouse cursor up and to the left.
10+
11+
tips:
12+
currentMouseX, currentMouseY = pyautogui.position()
13+
pyautogui.moveTo(100, 150)
14+
pyautogui.click()
15+
pyautogui.moveRel(None, 10) # move mouse 10 pixels down
16+
pyautogui.typewrite('Hello world!', interval=0.25)
17+
18+
todo:
19+
在Scratch3.0中写一个能自己写程序的程序
20+
'''
21+
22+
from codelab_adapter.core_extension import ControllerExtension
23+
from codelab_adapter.utils import get_server_file_path
24+
25+
26+
class HCIControllerExtension(ControllerExtension):
27+
'''
28+
use to control VectorNode(server)
29+
'''
30+
31+
def __init__(self):
32+
super().__init__()
33+
self.server_extension_id = "eim/HCI"
34+
self.EXTENSION_ID = f"{self.server_extension_id}/control" # default eim
35+
self.server_file = get_server_file_path("HCI_server.py")
36+
37+
38+
export = HCIControllerExtension
+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import subprocess
2+
import time
3+
from codelab_adapter.core_extension import ControllerExtension
4+
from codelab_adapter.utils import get_server_file_path
5+
from codelab_adapter.utils import get_python3_path
6+
7+
8+
class ColorTrackingControllerExtension(ControllerExtension):
9+
'''
10+
use to control HA server
11+
'''
12+
13+
def __init__(self):
14+
super().__init__()
15+
self.server_extension_id = "eim/ColorTracking"
16+
self.EXTENSION_ID = f"{self.server_extension_id}/control" # default eim
17+
self.server_file = get_server_file_path("color_tracking_server.py")
18+
19+
def run(self):
20+
python3_path = get_python3_path()
21+
camera = 1 # 0: mac 1: usb
22+
cmd = f'{python3_path} {self.server_file} --camera {camera}' # 0
23+
self.server = subprocess.Popen(cmd,shell=True) # 发送ctrl c,但使用消息意味着可以分布式
24+
while self._running:
25+
time.sleep(0.1)
26+
27+
export = ColorTrackingControllerExtension

extensions_v2/extension_cozmo.py

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from codelab_adapter.core_extension import ControllerExtension
2+
from codelab_adapter.utils import get_server_file_path
3+
4+
class CozmoControllerExtension(ControllerExtension):
5+
'''
6+
use to control CozmoNode(server)
7+
'''
8+
9+
def __init__(self):
10+
super().__init__()
11+
self.server_extension_id = "eim/cozmo"
12+
self.EXTENSION_ID = f"{self.server_extension_id}/control" # default eim
13+
self.server_file = get_server_file_path("cozmo_server.py")
14+
15+
16+
export = CozmoControllerExtension

extensions_v2/extension_eim.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def __init__(self):
1515
self.EXTENSION_ID = "eim"
1616

1717
def extension_message_handle(self, topic, payload):
18-
print(topic, payload, type(payload))
18+
# print(topic, payload, type(payload))
1919
if type(payload) == str:
2020
self.logger.info(f'scratch eim message:{payload}')
2121
return
@@ -29,7 +29,8 @@ def run(self):
2929
'''
3030
i = 0
3131
while self._running:
32-
message = {"payload": {"content": str(i)}} # topic可选
32+
message = self.message_template()
33+
message["payload"]["content"] = str(i) # topic可选
3334
self.publish(message)
3435
time.sleep(1)
3536
i += 1
+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import time
2+
import importlib, sys
3+
from codelab_adapter import settings
4+
from codelab_adapter.core_extension import Extension
5+
import queue
6+
7+
8+
class EimMonitorExtension(Extension):
9+
def __init__(self):
10+
'''
11+
参考 home assistant
12+
'''
13+
super().__init__()
14+
self.EXTENSION_ID = "eim"
15+
self.q = queue.Queue()
16+
17+
def extension_message_handle(self, topic, payload):
18+
self.q.put(payload)
19+
20+
def run(self):
21+
module_name = "eim_monitor"
22+
try:
23+
importlib.import_module(module_name)
24+
except Exception as e:
25+
self.pub_notification(f'{e}')
26+
return
27+
module = sys.modules["eim_monitor"]
28+
importlib.reload(module)
29+
30+
while self._running:
31+
if not self.q.empty():
32+
payload = self.q.get()
33+
content = payload["content"]
34+
response = sys.modules["eim_monitor"].monitor(
35+
content, self.logger)
36+
payload["content"] = response
37+
message = {"payload": payload}
38+
self.publish(message)
39+
time.sleep(0.1)
40+
41+
42+
export = EimMonitorExtension
+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import time
2+
import importlib, sys
3+
from codelab_adapter import settings
4+
from codelab_adapter.core_extension import Extension
5+
import zmq
6+
'''
7+
检测文件是否存在 不存在就创建 都在插件里做
8+
'''
9+
10+
11+
class EimTriggerExtension(Extension):
12+
def __init__(self):
13+
super().__init__()
14+
self.EXTENSION_ID = "eim"
15+
16+
def run(self):
17+
module_name = "eim_trigger"
18+
try:
19+
importlib.import_module(module_name)
20+
except Exception as e:
21+
self.pub_notification(f'{e}')
22+
return
23+
module = sys.modules[module_name]
24+
importlib.reload(module)
25+
while self._running:
26+
# monitor返回值被pub
27+
# rate = 10
28+
# time.sleep(1/rate) # 默认频率是每秒运行十次这个函数
29+
try:
30+
response = sys.modules[
31+
module_name].trigger() # 休眠1s,阻塞,stop会报错, 等待退出,todo 非守护进程
32+
if response:
33+
message = {"payload": {"content": response}}
34+
self.publish(message)
35+
except zmq.error.ZMQError as e:
36+
self.logger.error(f'{e}') # 终止之后 发不出消息
37+
except Exception as e:
38+
self.logger.error(f'{e}')
39+
# self.pub_notification(f'{e}')
40+
41+
42+
export = EimTriggerExtension

extensions_v2/extension_joystick.py

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from codelab_adapter.core_extension import ControllerExtension
2+
from codelab_adapter.utils import get_server_file_path
3+
4+
5+
class JoystickControllerExtension(ControllerExtension):
6+
'''
7+
use to control VectorNode(server)
8+
'''
9+
10+
def __init__(self):
11+
super().__init__()
12+
self.server_extension_id = "eim/joystick"
13+
self.EXTENSION_ID = f"{self.server_extension_id}/control" # default eim
14+
self.server_file = get_server_file_path("joystick_server.py")
15+
16+
17+
export = JoystickControllerExtension
+93
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
'''
2+
to_mqtt
3+
from_mqtt
4+
'''
5+
6+
import asyncio
7+
import os
8+
import time
9+
import json
10+
# from hbmqtt.client import MQTTClient, ClientException
11+
# from hbmqtt.mqtt.constants import QOS_1, QOS_2
12+
13+
from codelab_adapter.settings import FROM_MQTT_TOPIC, TO_MQTT_TOPIC
14+
from codelab_adapter.core_extension import Extension
15+
from codelab_adapter.utils import threaded
16+
import paho.mqtt.client as mqtt
17+
18+
19+
class MqttGatewayExtension(Extension):
20+
'''
21+
gateway的职责: 转发进出的消息: from_mqtt/to_mqtt
22+
23+
hbmqtt_pub --url mqtt://guest:[email protected] -t 'eim/mqtt_gateway' -m "hello from hbmqtt"
24+
'''
25+
26+
def __init__(self):
27+
self.EXTENSION_ID = "eim/mqtt_gateway"
28+
super().__init__()
29+
self.set_subscriber_topic(TO_MQTT_TOPIC) # sub zmq message
30+
self.mqtt_sub_topics = [FROM_MQTT_TOPIC]
31+
32+
# mqtt settings
33+
self.mqtt_addr = "iot.codelab.club"
34+
self.username = "guest"
35+
self.password = "test"
36+
self.mqtt_port = 1883
37+
38+
# mqtt client
39+
self.client = mqtt.Client()
40+
self.client.on_connect = self.mqtt_on_connect
41+
self.client.on_message = self.mqtt_on_message
42+
self.client.username_pw_set(self.username, self.password)
43+
self.client.connect(self.mqtt_addr, self.mqtt_port, 60)
44+
self.client.loop_start() # as thread
45+
46+
def exit_message_handle(self, topic, payload):
47+
# stop mqtt client
48+
self.client.loop_stop()
49+
self.terminate()
50+
51+
def extension_message_handle(self, topic, payload):
52+
'''
53+
zmq -> mqtt
54+
注意 进出消息格式不同
55+
56+
Q: 无法进入这里吧, 这里要求extension_id一致
57+
'''
58+
if topic == TO_MQTT_TOPIC:
59+
self.logger.info(topic, payload)
60+
payload = json.dumps(payload).encode()
61+
self.client.publish(topic, payload)
62+
63+
def mqtt_on_connect(self, client, userdata, flags, rc):
64+
self.logger.info(
65+
"MQTT Gateway Connected to MQTT {}:{} with result code {}.".format(
66+
self.mqtt_addr, self.mqtt_port, str(rc)))
67+
# when mqtt is connected to subscribe to mqtt topics
68+
if self.mqtt_sub_topics:
69+
for sub in self.mqtt_sub_topics:
70+
self.client.subscribe(sub)
71+
72+
def mqtt_on_message(self, client, userdata, msg):
73+
'''
74+
mqtt -> zmq
75+
传递json 而不是content
76+
'''
77+
topic = msg.topic # str
78+
if topic == FROM_MQTT_TOPIC:
79+
m = msg.payload.decode() # 在通道的两端做好decode和encode
80+
payload = json.loads(m) # json
81+
zmq_topic = payload["zmq_topic"]
82+
zmq_payload = payload["zmq_payload"]
83+
self.logger.info(f'mqtt topic:{topic} payload: {payload}')
84+
self.publish_payload(zmq_payload, zmq_topic)
85+
86+
def run(self):
87+
88+
while self._running:
89+
# to publish mqtt message
90+
time.sleep(0.1)
91+
92+
93+
export = MqttGatewayExtension

0 commit comments

Comments
 (0)