看ElaadNL如何建立一个完全基于IOTA并且仅有IOTA能胜任的PoC充电站

看ElaadNL如何建立一个完全基于IOTA并且仅有IOTA能胜任的PoC充电站

Harm van den Brink

网络安全,智能电网,电动汽车,分布式账本技术。为Enexis和ElaadNL工作。

个人署名文章。2017年10月31日

 

一个基于IOTA的充电站,功能有能量支付、通过IOTA与所有用户通信、在缠结中(像智能电表那样)储存测量值——非常棒,你必须通读全文!

看ElaadNL如何建立一个完全基于IOTA并且仅有IOTA能胜任的PoC充电站

ElaadNL 一直研究和利用新技术进一步创新,我们目前正在研究在电网中进行智能充电的可能性。我们发现,因其去中心化结算的特点,DLT(分布式账本技术)能够真正地影响信息流和电网安全,尤其在电动车领域,我们可以看到这种去中心化发展的影响超前于电力系统的其他部分,这就为新功能和技术提供了一个完美的试验基地。我们一头扎进该领域,开始撸起袖子加油干。这就是我们ElaadNL所做的:将理论转化为现实。

同样的事情发生在IOTA充电站的建设开端。我们发现了DLT的潜力,于是想:“我们能不能将它与充电站整合在一起?我们能否利用这项技术创造一个更好的集成系统,加入智能电网,吸收尽可能多的可再生能源呢?”

在ElaadNL和Enexis我们有充电站、智能电网以及电子工业的技术经验;两家公司均引进了一些额外的技术人才,这就有了足够的知识储备来开始干。起初,我们没有写下任何需求,我们只有一个终极目标:“用IOTA来给电动车充电。”这样就允许我们在解决问题时尝试不同的方法,而不再囿于需求所指。通过每周见面会,我们不断确认依然在一个正确的轨道上讨论可能的解决方案。开发过程中我们提出的要点包括:

  • 基于能量(kWh,千瓦时,度)充电,因此仅为你实际使用的能量精确付费。
  • IOTA充电App——因为我们要与终端用户交流,让用户体验更好,我们开发了自己的app。
  • kWh测量值存储,随时间储存电度表测量数据至缠结,令其成为电能消耗量的不可变存储(就像汽车的里程表)。

充电站里面有什么?它是怎样工作的?

IOTA充电站包含一座普通充电站的所有通用部件,一个电度表、一个开关、EVSE(Electric Vehicle Supply Equipment,电动汽车供应设备)调节器以及一个主控器。通常主控器用OCPP(Open Charge Point Protocol,开放充电点协议,该协议用于充电站,由ElaadNL发明并在世界范围内得到广泛使用)与一个后勤办公室通信。

看ElaadNL如何建立一个完全基于IOTA并且仅有IOTA能胜任的PoC充电站

这个项目白手起家,一开始并没有控制站点的软件,仅有些光秃秃的零件而已。因为时间紧迫,我们针对开发目标采用了Intel NUC,而在实际开发中,我们选择了一款更快的设备(因为其低CPU功率)。在树莓派(Raspberry Pi,一种卡片大小的单板小电脑)上运行充电站也是可以的,因为PoW(工作量证明)并不依赖于机器,而是外包给了IOTA节点。

“创造史上第一个基于IOTA的电动车充电站意义重大”

Dominik Schiener,IOTA联合创始人,对该充电站评价说:“作为机器间支付解决方案的众多应用中的一员,电动汽车充电以IOTA作为基础协议是显然的选择。Enexis团队创造史上第一个基于IOTA的电动车充电站的工作意义重大,并且将为更多IOTA在汽车领域的采用铺平道路。”

David Sønstebø,IOTA联合创始人,回应道:“随着轿车进化成带轮子的电脑,以及电动车时代的开启,建设支撑汽车新时代的基础设施势在必行。Enexis’ ElaadNL项目铺就了一条利用IOTA协议的康庄大道,这正是我们脑海中描绘的新‘机器经济’。”

NodeJS、TypeScript、JavaScript、串行通信以及更多极客怪咖才懂的东西

我们开始时仅仅试图让站点可以实现充电,进展出乎意料地快,一两周以后,我们建好了仅能充电的充电站,在持续检查账户余额时,如果发现它有增长,我们就开启充电进程。

看ElaadNL如何建立一个完全基于IOTA并且仅有IOTA能胜任的PoC充电站

上图代码粗略展示了该进程的概貌,我们通过IOTA JavaScript库恢复账户数据,如果有错,我们会将其记录到控制台,否则,我们检验返回的数据对象余额,如果余额比上次的检查结果大,我们计算支付的代币数,设置最后一个余额成为新余额,并且以算出的代币数额开始充电。

看ElaadNL如何建立一个完全基于IOTA并且仅有IOTA能胜任的PoC充电站

这是一些代码例子,展示了此方法早期版本之一是如何实现的。我们看到这里基于速率计算了分钟数,充电期的最后,将当前时间加上分钟数,该计算采用了库momentjs,接着我们写一行session:start命令进EVSE,这样就将已发送至充电站其他设备的不同的串行命令统一发动起来。

为了能向EVSE中写入命令,我们需要与其建立一个串行连接;幸运的是,有个叫作serialport的现成库让我们用起来得心应手。

智能EVSE

智能EVSE控制器与电动车相连,除了其他用途以外,它确保了通过mode 3 (IEC 62196) 协议与电动汽车的通信,Intel NUC通过串行接口与智能EVSE进行通信。

它的特性:

  • 适合标准导轨(DIN rail,符合德国工业标准的导轨)外壳。
  • 为开关和继电器转换230伏输出。
  • 自动选择连接电缆的载流量(13/20/32/63A)。
  • 锁住螺线管支撑、锁住端口中的充电电缆,在电源故障时自动解锁。
  • 内置温度传感器。
  • 可选支持8 x2字符LCD(liquid crystal display,液晶显示屏)。
  • 通过串行指令行接口,使得诸如最大/最小电流等指标可被设置。
  • 通过串行引导加载轻松升级。checkTime函数初始化了一个含有当前时间的新moment对象,如果当前时间比结束时大,那么我们会向EVSE写一行session:stop命令,否则,当此函数几秒后被再次调用时,我们令其为超时(由TIMER_CHARGE变量给出)。看ElaadNL如何建立一个完全基于IOTA并且仅有IOTA能胜任的PoC充电站

进步

我们已经从技术观点探讨了前文所述的终极目标,由于为达成此目标进行的开发有相当大的自由度,因此我们几乎以一种敏捷开发的方式在其之上叠加了层和特性。

基于用户反馈,我们从加入LED开始。我们添加的颜色有黄、绿、淡蓝、深蓝,分别代表空闲、连接、提供、充电以及错误,这些颜色已经在世界范围内被充电站所使用。EVSE提供了一些当前状态的信息,我们可以利用它们设置LED的颜色。LED亦通过使用串行命令的serialport库来控制。

加入颜色之后,我们开始研究利用缠结可以做的非常酷的事情之一——我们要将电度表上数据安全存入缠结,这将是从站点自身发送的第一笔交易!

因为接入方式与前述有略微不同,为了接入电度表,我们需要使用一个不同的库。电度表采用可以读取信息的保持寄存器(holding registers),例如,读出电表的度数,我们得读四个寄存器,这些寄存器各可存两个字节,这些字节必须被移位来取得正确数字,一个有两个寄存器的小例子如下所示:

看ElaadNL如何建立一个完全基于IOTA并且仅有IOTA能胜任的PoC充电站

此例展示了两个已写满的寄存器(两对两字节),其中最后一个寄存器后进先出,所以它的值为32768,因为只有第一个字节的第一个比特位被设置成1,其他位都为0。栈顶寄存器(寄存器1)值为65535,这是因为该寄存器必须乘以第一个寄存器的总值(译注:(1111111111111111)2=65535)。所以如果寄存器1(仅)有一个1在从右边数第二个比特位上(代替现在该位上的数字),寄存器值将为2*65535=131070。例中考虑寄存器2的值为32768,寄存器1的值为65535,电度表的总值即为65535 + 32768 = 98303,最后两位数字在电度表中以两位小数给出,所以电度表最终准确数字为98303 / 100 = 983.03 kWh。

现在我们知道了寄存器的读法,就可以在任意时间读取当前电表度数,所以我们建立一个循环,它可以时常进行零值交易,使得该交易可以被发送到含有当前电表度数的指定地址。

看ElaadNL如何建立一个完全基于IOTA并且仅有IOTA能胜任的PoC充电站

以上就是这个循环,我们打印一些信息给控制台:我们正在发送一个kWh报告。然后我们调用发送交易的函数,常数地址为接收数据的地址,发送代币数量为0,特定域标记标识该充电站,另外最终消息是一个interweave函数。Interweave是一个简单的函数,它用你在字符串中给出的变量替换了参数位。

看ElaadNL如何建立一个完全基于IOTA并且仅有IOTA能胜任的PoC充电站

打印的结果是Hello Harm, how are you? My name is Lucas.交易发出后,该函数被再次调用后,一个超时标记会被设置。发送交易才是最重要的!我们来看看它是如何工作的。在下面的代码里,我们可以看到之前提到的参数,address, value, tag, message。这四个是之前给出的,因此浏览该函数可以发现,如果有消息的话,我们会将消息转换为三进制。我们创建交易数组(对象数组),这里仅加入一笔交易,也就是由参数给出的那笔。如果没有提供标签,我们给它设置一个standard标签,然后调用发送转换函数,它将开始在IOTA上发送一笔交易的进程。我们使用充电站的种子,深度常数设置为9,最低重量大小为14,再传入之前创建的交易数组,最终,函数将在出现任何错误时记录错误信息。

看ElaadNL如何建立一个完全基于IOTA并且仅有IOTA能胜任的PoC充电站

更多的进步

我们发送了第一笔交易来报告kWh状态后,有了第二组进步。目前获知接收代币的地址的唯一方法是从充电站读取记录,这可不是什么友好的交互手段,也不可能做到,因为充电站不会将其显示在外。所以我们决定通过缠结来从充电站取得地址。我们采用调用Broadcasting的方法做到这一点,当你发送一个零值交易到你自己的地址上,其他各方将能够通过观察你给交易打上的特殊标记在缠结中扫描此交易,这样,用户就能输入一些站点“码”,然后扫描缠结,找出含有带码标签的交易。

从下图中可以窥探上述码标签的一点奥妙。我们构造一个搜索值对象(search values object),要寻找的标签由基础标签加上用户输入的码构成,然后用API来找到这些符合搜索值的交易对象。利用JavaScript promise结构,我们允许调用者处理任何我们需要的返回值,如果出现问题,拒绝这个promise,如果数据为空,同样也拒绝promise,否则开始寻找数据,我们将数据根据时间戳分类,接着,用码循环检索数据并抽取消息。消息此时仍为三进制格式,意味着它仅含有数字9和大写字母,这是一个编码格式,可以通过toTrytesfromTrytes函数分别被编解码,所以我们用空字符替换数字9(移除拖尾的9),然后转换消息(仍为三进制格式Tryte)为“正常”消息。我们将此消息填入消息数组,在函数的最后处理它。

看ElaadNL如何建立一个完全基于IOTA并且仅有IOTA能胜任的PoC充电站

我们还要通知用户刚刚发生的事情。当前状态下,他们所见只是一些LED亮着,但是拜缠结所赐,我们还可以根据充电交易状态通过缠结发送用户状态更新。进行一些实验后,我们搞清楚了做法,已经可以通过缠结给用户发送一些反馈。

 

沿途发现的……

收入交易

越来越明显的是,当前对收入余额的测量可以用一种更为高效的方法来完成。先看老方法,每次均调查余额,然后检验客户地址的最后一笔交易;新方法是我们仅检查收入部分的交易,如果它们往我们的地址里增加了余额,我们就将其看作一笔新的有价值交易,并且立即取得客户的地址,储存以便下一步发消息。新方法令充电站和用户之间的沟通变得更加容易,下面的小例子展示了一束交易的形态。标蓝的交易显示了要记住的用户的正确地址。

看ElaadNL如何建立一个完全基于IOTA并且仅有IOTA能胜任的PoC充电站

消息VS轻钱包

学习了如何获取用户地址之后,我们开始尝试通过零值交易发送用户消息,但是,我们从中发现当前版本轻钱包的一个小缺点,即无法在交易历史中看到消息,因此我们停止了使用标签。

更合逻辑的支付

我们研究了扫描收入交易的新方法,接着又发现,当前为时间付费的方向并不是太有意义,更合逻辑的方向是为能量付费,所以我们将时间循环改成了kWh循环,这个循环会收集当前kWh水平并将其与用户的购买金额相比较。

用户友好度

随着对充电站本身的开发,我们开始研究更加用户友好的与站点交互的方法。最初只是做了一个小网站,用户可以填入码来寻找站点广播的地址,网站建成后,下一步给它扩展了更多的功能,我们构建了一个在线“钱包”,专门处理充电站的工作。我们称其为IOTA充电App。此款app有以下特性:

  • 输入种子。
  • 在你的设备上本地保存种子(从不发送到任何其他地方)。
  • 通过输入的码搜索充电站。
  • 找到站点及其当前最新位置、速率、状态(被占用否),以及存款地址(如果你不想在app中输入你的种子的话)。
  • 通过从app发送一笔交易为你在站点充电的kWh付费(要求种子)。
  • 查看按照日期和时间分类的消息(要求种子)。
  • 查看按照日期和时间分类的交易历史(要求种子)。图12图13图14图15
  • 交易历史
  • 从充电站发送给客户的消息
  • 找到充电站后发送一笔交易
  • 输入种子

下面这些截屏展示了app的一些特性。

看ElaadNL如何建立一个完全基于IOTA并且仅有IOTA能胜任的PoC充电站

输入种子

看ElaadNL如何建立一个完全基于IOTA并且仅有IOTA能胜任的PoC充电站

找到充电站后发送一笔交易

看ElaadNL如何建立一个完全基于IOTA并且仅有IOTA能胜任的PoC充电站

从充电站发送给客户的消息

看ElaadNL如何建立一个完全基于IOTA并且仅有IOTA能胜任的PoC充电站

交易历史

未来发展

MAM

在当前的概念证明中,我们没有利用MAM(Masked Authentication Messaging,掩码鉴权消息)。MAM使用户(或机器)间的交流更安全,或者甚至在使用签名和/或对称加密时做到完全保密。在充电站中实现MAM会使站点变得更安全。我们可以利用它与用户通信、在缠结中储存测量值数据,或者甚至电网运营者为充电站运转提供当前电网容量。

闪速信道

闪速信道是一个在用户和充电站间建立更多信任的超级简单的方法。有了闪速信道,双方(可能都只是机器)可以建立一个信道。通过这个信道,它们可以从缠结下线,在线下完成相互支付。这就意味着小额支付(例如每100Wh的能量消耗)可以在汽车与充电站间直接进行,完全线下。一旦充电过程结束,信道结果将上传至缠结,由后者保管支付。如果某一方在信道中而拒绝支付,之前所有的支付将仍然有效,因此,通过为(中)小额能量进行的微交易,充电站可以确定其收到付费,汽车可以确定其获得了购买的能量。

设置电流

由于通过缠结收发消息的便利性,未来我们可以寻求发送消息给站点来设置其最大允许电流(容量)。电网运营者可以切换能量流来满足容量要求。

带钱包的轿车

在我们的概念证明中,我们还要求用户进行支付,我们的下一个概念证明是建立一个带钱包轿车的解决方案,它能与充电站建立一个闪速信道,为收到的能量做支付。它还能广播其能量需求(充电状态),这对像电网运营者这样的交易方来说很有意思,它可以预测电网特别部分的能量需求。我们有足够多的想法,就看哪些能走进实践了。

Harm van den Brink (LinkedIn)是ElaadNL和Enexis的创新领军人物,他说:“这些技术能够迅速地改变世界。在ElaadNL,我们跟随并且积极参与到像IOTA这样前景广阔的技术中去。建立基于IOTA的完全可运转的充电站展示了这些技术的真实潜力和毋庸置疑的力量。”

特别致谢为充电站编程的Lucas Weideveld,和用各种零配件组装建造真实充电站的Klaas van Zuuren

如果您有心打赏,请随意(译注:下为原文作者收款地址):

X9DRZRGNNTHFCAQHEDRQIPIZHKNQGIXNYNFTOBDADLKMEZBY9PXUWTLFBZLKRNBTOMXBSSNHDBAEYUGXZTTRCLHAGD

 

原文:

https://medium.com/@harmvandenbrink/how-elaadnl-built-a-poc-charge-station-running-fully-on-iota-and-iota-only-e16ed4c4d4d5

 

 

 

 

专栏作者:小椽子

个人简介:我共发表了 11 篇文章,总计被阅读了48,300 次,共获得了 183 个赞。

作者邮箱 作者主页 Ta的文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注