基于Blinker的micopython 的小爱同学的代码

支持 电灯 和温度计的控制

##交互流程

1.小爱请求状态 关键字

{"get":"state"}

完整数据:

{"deviceType":"DiyArduino","data":{"get":"state"},"fromDevice":"MIOT","toDevice":"448D910CAQAQ5CWMT6PW41K7"}

2.回复设备 当前状态

"data": {"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"}

** 如果是设备是温度则发送回应就可以了 {"temp":"20","humi":"20","pm25":"20","co2":"20"} **

完整数据:

{"data":{"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

3.小爱下发指令:

"data": {"set":{"pState":true}}

完整数据 :

{"deviceType":"DiyArduino","data":{"set":{"pState":true}},"fromDevice":"MIOT","toDevice":"448D910CAQAQ5CWMT6PW41K7"}

4.回复指令完成状态:

"data": {"pState":"True"}

完整数据:

{"data":{"pState":"True"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

至此一个指令完整的交互完成

延申:

当设备需要更改颜色,亮度,色温的时候

小爱会在第三步 和第四步 下发的data: 数据有变化

下发颜色设置

{"set":{"col":255}}

回复: {"col":255,"clr":255}

下发亮度设置

{"set":{"bright":21}}

回复: {"bright":"21"}

以下是日志 可以研究一下

插座 也是类似的如果要单独更改名称可以在Blinker 的app设置 比如 客厅 厨房 等名称就即可区分识别

[197457] MIOT Query codes: 0

[197457] MIOT Query All

[197483] [Send]: {"pState":"False"}

[197876] need set power state: on

[197902] [Send]: {"pState":"True"}

[203811] MIOT Query codes: 0

[203811] MIOT Query All

[203843] [Send]: {"pState":"True"}

[204225] need set power state: off

[204252] [Send]: {"pState":"False"}

#####小请求获得状态

[992546] Got: {"deviceType":"DiyArduino","data":{"get":"state"},"fromDevice":"MIOT","toDevice":"448D910CAQAQ5CWMT6PW41K7"}

[992547] data: {"get":"state"}

[992549] fromDevice: MIOT

[992551] form MIOT

[992573] MIOT parse data: {"get":"state"}

[992574] MIOT Query codes: 0

[992574] MIOT Query All

[992575] response to MIOT: {"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"}

[992580] isJson: {"data":{"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[992596] MQTT MIOT Publish...

[992598] Freeheap: 5808

[992664] {"data":{"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[992669] ...OK!

[992670] Freeheap: 5808

回复小爱电灯状态

[992672] Send: {"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"}

小爱下发设置开关指令 "pState" 为true 是开 ,false 是关

[992956] Got: {"deviceType":"DiyArduino","data":{"set":{"pState":true}},"fromDevice":"MIOT","toDevice":"448D910CAQAQ5CWMT6PW41K7"}

[992957] data: {"set":{"pState":true}}

[992960] fromDevice: MIOT

[992962] form MIOT

[992985] MIOT parse data: {"set":{"pState":true}}

设置完毕后回复给小爱

[992985] need set power state: on

[992986] response to MIOT: {"pState":"True"}

[992986] isJson: {"data":{"pState":"True"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[992997] MQTT MIOT Publish...

[992999] Freeheap: 4808

[993026] {"data":{"pState":"True"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[993027] ...OK!

[993027] Freeheap: 4808

[993030] Send: {"pState":"True"}

[999301] Got: {"deviceType":"DiyArduino","data":{"get":"state"},"fromDevice":"MIOT","toDevice":"448D910CAQAQ5CWMT6PW41K7"}

[999302] data: {"get":"state"}

[999303] fromDevice: MIOT

[999306] form MIOT

[999328] MIOT parse data: {"get":"state"}

[999328] MIOT Query codes: 0

[999328] MIOT Query All

[999330] response to MIOT: {"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"}

[999334] isJson: {"data":{"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[999351] MQTT MIOT Publish...

[999353] Freeheap: 5808

[999380] {"data":{"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[999385] ...OK!

[999386] Freeheap: 5808

[999388] Send: {"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"}

[1010779] Got: {"deviceType":"DiyArduino","data":{"set":{"pState":false}},"fromDevice":"MIOT","toDevice":"448D910CAQAQ5CWMT6PW41K7"}

[1010781] data: {"set":{"pState":false}}

[1010783] fromDevice: MIOT

[1010786] form MIOT

关灯指令下发

[1010808] MIOT parse data: {"set":{"pState":false}}

[1010809] need set power state: off

[1010809] response to MIOT: {"pState":"False"}

[1010810] isJson: {"data":{"pState":"False"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[1010821] MQTT MIOT Publish...

[1010823] Freeheap: 4784

[1010849] {"data":{"pState":"False"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[1010850] ...OK!

[1010851] Freeheap: 4784

回复关灯指令

[1010853] Send: {"pState":"False"}

[1029815] Got: {"deviceType":"DiyArduino","data":{"get":"state"},"fromDevice":"MIOT","toDevice":"448D910CAQAQ5CWMT6PW41K7"}

[1029816] data: {"get":"state"}

[1029818] fromDevice: MIOT

[1029820] form MIOT

[1029843] MIOT parse data: {"get":"state"}

[1029843] MIOT Query codes: 0

[1029843] MIOT Query All

[1029845] response to MIOT: {"pState":"False","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"}

[1029850] isJson: {"data":{"pState":"False","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[1029866] MQTT MIOT Publish...

[1029869] Freeheap: 5808

[1029895] {"data":{"pState":"False","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[1029899] ...OK!

[1029901] Freeheap: 5808

[1029903] Send: {"pState":"False","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"}

[1041261] Got: {"deviceType":"DiyArduino","data":{"set":{"pState":true}},"fromDevice":"MIOT","toDevice":"448D910CAQAQ5CWMT6PW41K7"}

[1041262] data: {"set":{"pState":true}}

[1041265] fromDevice: MIOT

[1041268] form MIOT

[1041290] MIOT parse data: {"set":{"pState":true}}

[1041291] need set power state: on

[1041291] response to MIOT: {"pState":"True"}

[1041292] isJson: {"data":{"pState":"True"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[1041303] MQTT MIOT Publish...

[1041305] Freeheap: 4744

[1041333] {"data":{"pState":"True"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[1041334] ...OK!

[1041335] Freeheap: 4744

[1041337] Send: {"pState":"True"}

[1069242] Got: {"deviceType":"DiyArduino","data":{"get":"state"},"fromDevice":"MIOT","toDevice":"448D910CAQAQ5CWMT6PW41K7"}

[1069243] data: {"get":"state"}

[1069245] fromDevice: MIOT

[1069247] form MIOT

[1069270] MIOT parse data: {"get":"state"}

[1069270] MIOT Query codes: 0

[1069270] MIOT Query All

[1069272] response to MIOT: {"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"}

[1069276] isJson: {"data":{"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[1069293] MQTT MIOT Publish...

[1069295] Freeheap: 5744

[1069323] {"data":{"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[1069327] ...OK!

[1069329] Freeheap: 5744

[1069331] Send: {"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"}

[1076057] Got: {"deviceType":"DiyArduino","data":{"get":"state"},"fromDevice":"MIOT","toDevice":"448D910CAQAQ5CWMT6PW41K7"}

[1076058] data: {"get":"state"}

[1076059] fromDevice: MIOT

[1076062] form MIOT

[1076084] MIOT parse data: {"get":"state"}

[1076085] MIOT Query codes: 0

[1076085] MIOT Query All

[1076086] response to MIOT: {"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"}

[1076091] isJson: {"data":{"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[1076107] MQTT MIOT Publish...

[1076110] Freeheap: 5744

[1076139] {"data":{"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[1076143] ...OK!

[1076145] Freeheap: 5744

[1076147] Send: {"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"}

[1096793] Got: {"deviceType":"DiyArduino","data":{"set":{"bright":21}},"fromDevice":"MIOT","toDevice":"448D910CAQAQ5CWMT6PW41K7"}

设置亮度

[1096794] data: {"set":{"bright":21}}

[1096796] fromDevice: MIOT

[1096799] form MIOT

[1096821] MIOT parse data: {"set":{"bright":21}}

[1096822] need set brightness: 21

[1096822] now set brightness: 21

[1096824] response to MIOT: {"bright":"21"}

[1096825] isJson: {"data":{"bright":"21"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[1096836] MQTT MIOT Publish...

[1096838] Freeheap: 4840

[1096868] {"data":{"bright":"21"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[1096869] ...OK!

[1096870] Freeheap: 4840

[1096872] Send: {"bright":"21"}

[1113068] Got: {"deviceType":"DiyArduino","data":{"get":"state"},"fromDevice":"MIOT","toDevice":"448D910CAQAQ5CWMT6PW41K7"}

[1113069] data: {"get":"state"}

[1113071] fromDevice: MIOT

[1113073] form MIOT

[1113096] MIOT parse data: {"get":"state"}

[1113096] MIOT Query codes: 0

[1113096] MIOT Query All

[1113098] response to MIOT: {"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"}

[1113102] isJson: {"data":{"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[1113119] MQTT MIOT Publish...

[1113121] Freeheap: 5808

[1113150] {"data":{"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[1113154] ...OK!

[1113156] Freeheap: 5808

[1113158] Send: {"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"}

[1136454] Got: {"deviceType":"DiyArduino","data":{"get":"state"},"fromDevice":"MIOT","toDevice":"448D910CAQAQ5CWMT6PW41K7"}

[1136455] data: {"get":"state"}

[1136457] fromDevice: MIOT

[1136459] form MIOT

[1136481] MIOT parse data: {"get":"state"}

[1136482] MIOT Query codes: 0

[1136482] MIOT Query All

[1136483] response to MIOT: {"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"}

[1136488] isJson: {"data":{"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[1136504] MQTT MIOT Publish...

[1136507] Freeheap: 5808

[1136536] {"data":{"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[1136540] ...OK!

[1136542] Freeheap: 5808

[1136544] Send: {"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"}

[1136561] Got: {"deviceType":"DiyArduino","data":{"set":{"col":255}},"fromDevice":"MIOT","toDevice":"448D910CAQAQ5CWMT6PW41K7"}

设置颜色

[1136564] data: {"set":{"col":255}}

[1136566] fromDevice: MIOT

[1136569] form MIOT

[1136591] MIOT parse data: {"set":{"col":255}}

[1136592] need set color: 255

[1136592] colorR: 0, colorG: 0, colorB: 255

[1136593] response to MIOT: {"col":255,"clr":255}

[1136596] isJson: {"data":{"col":255,"clr":255},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[1136607] MQTT MIOT Publish...

[1136610] Freeheap: 4808

[1136676] {"data":{"col":255,"clr":255},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[1136677] ...OK!

[1136678] Freeheap: 4808

回复颜色

[1136680] Send: {"col":255,"clr":255}

[1143586] Got: {"deviceType":"DiyArduino","data":{"set":{"col":16777215}},"fromDevice":"MIOT","toDevice":"448D910CAQAQ5CWMT6PW41K7"}

[1143588] data: {"set":{"col":16777215}}

[1143591] fromDevice: MIOT

[1143593] form MIOT

[1143616] MIOT parse data: {"set":{"col":16777215}}

[1143616] need set color: 16777215

[1143617] colorR: 255, colorG: 255, colorB: 255

[1143618] response to MIOT: {"col":16777215,"clr":16777215}

[1143622] isJson: {"data":{"col":16777215,"clr":16777215},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[1143635] MQTT MIOT Publish...

[1143637] Freeheap: 4784

[1143665] {"data":{"col":16777215,"clr":16777215},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[1143666] ...OK!

[1143668] Freeheap: 4784

[1143670] Send: {"col":16777215,"clr":16777215}

[1168469] Got: {"deviceType":"DiyArduino","data":{"get":"state"},"fromDevice":"MIOT","toDevice":"448D910CAQAQ5CWMT6PW41K7"}

[1168470] data: {"get":"state"}

[1168471] fromDevice: MIOT

[1168474] form MIOT

[1168496] MIOT parse data: {"get":"state"}

[1168496] MIOT Query codes: 0

[1168497] MIOT Query All

[1168498] response to MIOT: {"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"}

[1168503] isJson: {"data":{"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[1168519] MQTT MIOT Publish...

[1168522] Freeheap: 5808

[1168549] {"data":{"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"},"fromDevice":"448D910CAQAQ5CWMT6PW41K7","toDevice":"MIOT_r","deviceType":"vAssistant"}

[1168554] ...OK!

[1168555] Freeheap: 5808

[1168558] Send: {"pState":"True","col":0,"clr":0,"mode":0,"colTemp":"1000","bright":"1"}

python控制小爱同学_GitHub - xinruoyusixian/Blinker-for-xiaoai: 基于micopython 的小爱同学的代码...相关推荐

  1. python数字加密资产_GitHub - ezpod/crypto-exchange-engine: 数字加密资产交易引擎的原理性实现代码,汇智网提供...

    java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解. python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解. ...

  2. python办公自动化excel_简直出神入化,教你用Python控制Excel实现自动化办公

    1.安装 简直出神入化,教你用Python控制Excel实现自动化办公 2.操作一个简单的Excel文档 操作注释及代码: 简直出神入化,教你用Python控制Excel实现自动化办公 操作完成后,数 ...

  3. python做excel自动化可视化-简直出神入化,教你用Python控制Excel实现自动化办公...

    1.安装 简直出神入化,教你用Python控制Excel实现自动化办公 2.操作一个简单的Excel文档 操作注释及代码: 简直出神入化,教你用Python控制Excel实现自动化办公 操作完成后,数 ...

  4. python excel 自动化-简直出神入化,教你用Python控制Excel实现自动化办公

    1.安装 简直出神入化,教你用Python控制Excel实现自动化办公 2.操作一个简单的Excel文档 操作注释及代码: 简直出神入化,教你用Python控制Excel实现自动化办公 操作完成后,数 ...

  5. python自动化办公-简直出神入化,教你用Python控制Excel实现自动化办公

    1.安装 简直出神入化,教你用Python控制Excel实现自动化办公 2.操作一个简单的Excel文档 操作注释及代码: 简直出神入化,教你用Python控制Excel实现自动化办公 操作完成后,数 ...

  6. python控制同学电脑(源码)

    本代码仅用为学习,禁止做任何违法事情,一切后果与作者无关,与文章平台无关 目录 可执行文件可以在这里下载 如何把python打包成exe 具体使用方法: 使用例子: 1.获取内网ip地址及监听的端口 ...

  7. python画锯齿波_用Python控制硬件35-自制二三十元成本的信号测量采集控制系统

    如前篇所介绍,用Shell Lab测试台软件配合之前介绍的任意款实验板,都能方便地实现ADC电压测量,但遇到两个问题: 示例代码虽然众多,但大都默认ShellLab类型的控制器,需要手动改为Mcush ...

  8. 用python控制硬件_用Python控制硬件35-自制二三十元成本的信号测量采集控制系统...

    如前篇所介绍,用Shell Lab测试台软件配合之前介绍的任意款实验板,都能方便地实现ADC电压测量,但遇到两个问题:示例代码虽然众多,但大都默认ShellLab类型的控制器,需要手动改为Mcush. ...

  9. python用渐变色画圆_利用python控制Autocad:pyautocad方式

    发现pyautocad模块:可以用python控制autocad的包.今天把文档中的重点内容摘录出来,以后绘图.计算大工程量.或者识别施工图的时候时候也许可以用到. 一.连接cad pyautocad ...

  10. python实现摄像头拍照_使用Python控制摄像头拍照并发邮件

    o1 前言 为什么会有写这个程序的想法呢? 最初的想法是写一个可以用电脑前置摄像头拍照的程序,在舍友使用你电脑的时候,不经意间获取到一大堆奇葩舍友的表情包. 然后我又突发奇想,要不搞个开机启动吧,这样 ...

最新文章

  1. python 排序统计滤波器_马尔可夫链+贝叶斯滤波器的Python展示
  2. 20162318 2018-2019-2《网络对抗技术》Exp1 PC平台逆向破解
  3. iOS中的HotFix方案总结详解
  4. 2020 年了,WPF 还有前途吗?
  5. 结合PE格式对linker分析1
  6. mysqlbinlog配置
  7. 《程序员代码面试指南》第一章:栈与队列
  8. [完美解决,亲测有效] 无法访问你试图使用的功能所在的网络位置--软件安装一半,退出后重新安装其他软件一直弹出某个安装程序的问题
  9. ptcms自动采集小说系统源码 电脑版+手机版
  10. Aruba7010 默认密码_紧急提醒:手机上的这个密码必须设,否则钱包很危险!|手机|sim|盗取...
  11. Qt制作透明背景图片与裁剪图片
  12. android 自动亮屏解锁,android 点亮手机屏幕与屏幕解锁方法
  13. heic(HEIF)格式图像处理(一)
  14. 理论+实操:K8S搭建dns内部服务与控制器controlls五种模式
  15. 变分推断 | MATLAB实现VBMC变分贝叶斯蒙特卡洛模拟的贝叶斯推断
  16. Flink的Parallelism并行度
  17. 服务器文件夹重定向,文件夹重定向
  18. 传统PCNN算法python实现
  19. LDA主题模型评价指标汇总
  20. 信息系统项目管理师教程第3版教程 2017年9月出版

热门文章

  1. oracle财务系统名称,Oracle财务系统总账模块操作手册
  2. 收银怎样挂单和取单_挂单取单(PC收银)
  3. (Python)裁剪人脸图片获得人脸的嘴唇区域
  4. java实习几个月没有项目组_Java实习报告总结范文3篇
  5. 车牌号识别Python+OpenCV实现(含代码)
  6. 【Spring】概述及IOC理论推导
  7. zoom 前台_鼠标hover元素scale/zoom中心点放大效果实例页面
  8. 计算机基础知识200分选择题,计算机基础考试题库及答案
  9. 【CCNA第二天】路由器密码破解及恢复
  10. Sublime Text 2 - 性感无比的代码编辑器!程序员必备神器!跨平台支持Win/Mac/Linux...