Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ism7mqtt Unable to read data from the transport connection (Wolf CHA 7 with ISM7 Link Home) #112

Closed
CEXC opened this issue Jul 28, 2024 · 37 comments

Comments

@CEXC
Copy link

CEXC commented Jul 28, 2024

System information:

  • ioBroker v6.17.14 with MQTT Broker/Client Adapter running nativ on Windows 11 64 Bit
  • Wolf Link Home (ISM7) with firmware version: 4.40.1 connected via WLAN 2,4Ghz to WindowsPC
  • ism7mqtt-win-x64 (version v0.0.16) also tried with v0.0.15

Problem:

While ism7config-win-x64 works fine and generate a properties.json (see attached one) ism7mqtt-win-x64 has success in connection to the ism7 Module, but the remote host is always going to close the connection. Output of windows cmd with debug option is:

C:\Users\Stephan\Downloads\ism7mqtt-win-x64>ism7mqtt -m 192.168.1.2 -i 192.168.1.3 -p XXXXXXXX --mqttuser mqtt_wolf_user --mqttpass "XXXXXXXX" -mqttport 9092 -d

Output:

> <?xml version="1.0" encoding="utf-16"?><direct-logon-request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><password>XXXXXXXX </password></direct-logon-request>
< <direct-logon-response state="ok" sid="1">
  <installationname>Wolf Link</installationname>
  <serialnumber>XXXXXXXX </serialnumber>
  <date-time>2024-07-28T15:55:40</date-time>
  <ism-softwareversion>4.40</ism-softwareversion>
  <ism-hardwareversion>linkr-4</ism-hardwareversion>
  <wlan-connected>true</wlan-connected>
  <type>Link</type>
</direct-logon-response>
> <?xml version="1.0" encoding="utf-16"?><tbreq xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" bn="1" gw="1" ae="false" ty="pull"><ird in="0" se="" ba="0x00" /></tbreq>
> <?xml version="1.0" encoding="utf-16"?><tbreq xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" bn="2" gw="1" ae="false" ty="pull"><ird in="10121" se="" ba="0x35" /><ird in="271" se="" ba="0x35" /></tbreq>
> <?xml version="1.0" encoding="utf-16"?><tbreq xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" bn="3" gw="1" ae="false" ty="pull"><ird in="13081" se="" ba="0x8" /><ird in="13002" se="" ba="0x8" /><ird in="13004" se="" ba="0x8" /><ird in="13006" se="" ba="0x8" /></tbreq>
System.IO.IOException: Unable to read data from the transport connection: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat..
 ---> System.Net.Sockets.SocketException (10060): Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat.
   --- End of inner exception stack trace ---
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError , CancellationToken )
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource<System.Int32>.GetResult(Int16 )
   at System.Net.Security.SslStream.EnsureFullTlsFrameAsync[TIOAdapter](TIOAdapter )
   at System.Net.Security.SslStream.ReadAsyncInternal[TIOAdapter](TIOAdapter , Memory`1 )
   at ism7mqtt.Ism7Client.FillPipeAsync(PipeWriter target, CancellationToken cancellationToken) in /home/runner/work/ism7mqtt/ism7mqtt/src/ism7mqtt/ISM7/Ism7Client.cs:line 166
System.IO.IOException: Unable to read data from the transport connection: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat..
 ---> System.Net.Sockets.SocketException (10060): Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht richtig reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat.
   --- End of inner exception stack trace ---
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError , CancellationToken )
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource<System.Int32>.GetResult(Int16 )
   at System.Net.Security.SslStream.EnsureFullTlsFrameAsync[TIOAdapter](TIOAdapter )
   at System.Net.Security.SslStream.ReadAsyncInternal[TIOAdapter](TIOAdapter , Memory`1 )
   at ism7mqtt.Ism7Client.FillPipeAsync(PipeWriter target, CancellationToken cancellationToken) in /home/runner/work/ism7mqtt/ism7mqtt/src/ism7mqtt/ISM7/Ism7Client.cs:line 166
   at System.IO.Pipelines.Pipe.GetReadResult(ReadResult& )
   at System.IO.Pipelines.Pipe.GetReadAsyncResult()
   at System.IO.Pipelines.Pipe.DefaultPipeReader.GetResult(Int16 )
   at ism7mqtt.Ism7Client.ReadPipeAsync(PipeReader source, CancellationToken cancellationToken) in /home/runner/work/ism7mqtt/ism7mqtt/src/ism7mqtt/ISM7/Ism7Client.cs:line 190

I've tried many different configurations (with or without mqqt password and special port etc.) and with a very reduced parameter.json too. In every case the error occurs. With debug option all the output ist displayed directly, than it took abaout 30 seconds (maybee timeout) and the error messages append to the output in the cmd.

Protokoll of ioBroker:

mqtt.0 | 2024-07-28 21:59:38.001 | debug | stateChange mqtt.0.info.connection: {"val":"","ack":true,"ts":1722196777998,"q":0,"from":"system.adapter.mqtt.0","user":"system.user.admin","lc":1722196777998}
-- | -- | -- | --
mqtt.0 | 2024-07-28 21:59:37.996 | info | Client [Wolf_19216813] connection closed: closed
mqtt.0 | 2024-07-28 21:59:33.420 | debug | Client [Wolf_19216813] pingreq
mqtt.0 | 2024-07-28 21:59:18.226 | debug | Client [Wolf_19216813] pingreq
mqtt.0 | 2024-07-28 21:59:03.116 | info | Client [Wolf_19216813] subscribes on "Wolf/192.168.1.3/+/set/#" with regex /^mqtt\.0\.Wolf\.192\.168\.1\.3\.[^.]*\.set\..*/
mqtt.0 | 2024-07-28 21:59:03.116 | info | Client [Wolf_19216813] subscribes on "Wolf/192.168.1.3/+/set/#" with regex /^Wolf\.192\.168\.1\.3\.[^.]*\.set\..*/
mqtt.0 | 2024-07-28 21:59:03.116 | debug | Client [Wolf_19216813] Handle subscribe: {"topic":"Wolf/192.168.1.3/+/set/#","qos":0}
mqtt.0 | 2024-07-28 21:59:03.109 | info | Client [Wolf_19216813] subscribes on "Wolf/192.168.1.3/+/set" with regex /mqtt\.0\.Wolf\.192\.168\.1\.3\.[^.]*\.set/
mqtt.0 | 2024-07-28 21:59:03.109 | info | Client [Wolf_19216813] subscribes on "Wolf/192.168.1.3/+/set" with regex /Wolf\.192\.168\.1\.3\.[^.]*\.set/
mqtt.0 | 2024-07-28 21:59:03.109 | debug | Client [Wolf_19216813] Handle subscribe: {"topic":"Wolf/192.168.1.3/+/set","qos":0}
mqtt.0 | 2024-07-28 21:59:03.060 | debug | stateChange mqtt.0.info.connection: {"val":"Wolf_19216813","ack":true,"ts":1722196743059,"q":0,"from":"system.adapter.mqtt.0","user":"system.user.admin","lc":1722196743059}
mqtt.0 | 2024-07-28 21:59:03.057 | debug | Client [Wolf_19216813] with keepalive 15 set timeout to 22.5 seconds
mqtt.0 | 2024-07-28 21:59:03.056 | info | Client [Wolf_19216813] connected with secret 1722196742821_354

parameter.json

Hint: The Smartset portal of Wolf Link home ist deactivated but it was active on first tests..

@CEXC
Copy link
Author

CEXC commented Jul 28, 2024

Same thing with the addon for home assistant. Is my new Wolf Link Home broken? Testet with smartset app and cloud, both works fine.. https://github.com/b3nn0/hassio-addon-ism7mqtt

@krusta4711
Copy link
Sponsor Contributor

krusta4711 commented Aug 4, 2024

I have the same problem with my brand new ism7. I try ism7mqtt the first time today and do not get it running. So I do not know whether it worked before.

I tried the debug modus "-d" and it looks the the first login works fine (I get a direct-logon-response) but after 60 seconds the connection is closed. Not sure whether the logged XML after the logon request is a response of the ism7 or is it just the request payload?

Environment
Wolf CHA 7
ism7 Link Home connected via LAN
raspi
tried both: Using Docker and starting ism7mqtt directly and also tried version 0.15

How I start
./ism7mqtt -d -m XXXXXXX -i XXXXXXX -p XXXXXXX -t ../../app/parameter.json

Output after start

<?xml version="1.0" encoding="utf-16"?><direct-logon-request xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><password>REMOVED</password></direct-logon-request>
<direct-logon-response state="ok" sid="1">
  <installationname>Wolf Link</installationname>
  <serialnumber>REMOVED</serialnumber>
  <date-time>2024-08-04T12:18:24</date-time>
  <ism-softwareversion>4.40</ism-softwareversion>
  <ism-hardwareversion>linkr-4</ism-hardwareversion>
  <wlan-connected>false</wlan-connected>
  <type>Link</type>
</direct-logon-response>
> <?xml version="1.0" encoding="utf-16"?><tbreq xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" bn="1" gw="1" ae="false" ty="pull"><ird in="0" se="" ba="0x00" /><ird in="0" se="" ba="0x00" /><ird in="0" se="" ba="0x00" /><ird in="0" se="" ba="0x00" /></tbreq>
> <?xml version="1.0" encoding="utf-16"?><tbreq xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" bn="2" gw="1" ae="false" ty="pull"><ird in="10121" se="" ba="0x35" /><ird in="10157" se="" ba="0x35" /><ird in="271" se="" ba="0x35" /><ird in="388" se="" ba="0x35" /><ird in="257" se="" ba="0x35" /><ird in="35" se="" ba="0x35" /><ird in="701" se="" ba="0x35" /><ird in="702" se="" ba="0x35" /><ird in="408" se="" ba="0x35" /><ird in="41" se="" ba="0x35" /><ird in="42" se="" ba="0x35" /><ird in="10141" se="" ba="0x35" /><ird in="10161" se="" ba="0x35" /><ird in="10160" se="" ba="0x35" /><ird in="10150" se="" ba="0x35" /><ird in="10145" se="" ba="0x35" /><ird in="10180" se="" ba="0x35" /><ird in="10117" se="" ba="0x35" /><ird in="10163" se="" ba="0x35" /><ird in="10162" se="" ba="0x35" /><ird in="10185" se="" ba="0x35" /><ird in="10165" se="" ba="0x35" /><ird in="10920" se="" ba="0x35" /><ird in="10912" se="" ba="0x35" /><ird in="10195" se="" ba="0x35" /><ird in="618" se="" ba="0x35" /><ird in="10812" se="" ba="0x35" /><ird in="10130" se="" ba="0x35" /><ird in="265" se="" ba="0x35" /><ird in="1443" se="" ba="0x35" /><ird in="10920" se="" ba="0x35" /><ird in="10130" se="" ba="0x35" /><ird in="10185" se="" ba="0x35" /><ird in="10151" se="" ba="0x35" /><ird in="10152" se="" ba="0x35" /><ird in="10153" se="" ba="0x35" /><ird in="10154" se="" ba="0x35" /><ird in="10161" se="" ba="0x35" /><ird in="10160" se="" ba="0x35" /><ird in="10146" se="" ba="0x35" /><ird in="10147" se="" ba="0x35" /><ird in="10148" se="" ba="0x35" /><ird in="10149" se="" ba="0x35" /><ird in="10161" se="" ba="0x35" /><ird in="10160" se="" ba="0x35" /><ird in="10134" se="" ba="0x35" /><ird in="10158" se="" ba="0x35" /><ird in="19" se="" ba="0x35" /><ird in="10101" se="" ba="0x35" /><ird in="19" se="" ba="0x35" /><ird in="10101" se="" ba="0x35" /><ird in="10853" se="" ba="0x35" /><ird in="10854" se="" ba="0x35" /><ird in="10855" se="" ba="0x35" /><ird in="10856" se="" ba="0x35" /><ird in="10857" se="" ba="0x35" /><ird in="10858" se="" ba="0x35" /><ird in="10859" se="" ba="0x35" /><ird in="10860" se="" ba="0x35" /><ird in="10861" se="" ba="0x35" /><ird in="10862" se="" ba="0x35" /><ird in="10863" se="" ba="0x35" /><ird in="10864" se="" ba="0x35" /><ird in="10865" se="" ba="0x35" /><ird in="10866" se="" ba="0x35" /><ird in="10867" se="" ba="0x35" /></tbreq>
> <?xml version="1.0" encoding="utf-16"?><tbreq xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" bn="3" gw="1" ae="false" ty="pull"><ird in="82" se="" ba="0x51" /><ird in="86" se="" ba="0x51" /><ird in="87" se="" ba="0x51" /><ird in="4" se="" ba="0x51" /><ird in="299" se="" ba="0x51" /><ird in="40" se="" ba="0x51" /><ird in="273" se="" ba="0x51" /><ird in="2593" se="" ba="0x51" /><ird in="322" se="" ba="0x51" /><ird in="399" se="" ba="0x51" /><ird in="65019" se="" ba="0x51" /><ird in="15" se="" ba="0x51" /><ird in="82" se="" ba="0x51" /><ird in="410" se="" ba="0x51" /></tbreq>
> <?xml version="1.0" encoding="utf-16"?><tbreq xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" bn="4" gw="1" ae="false" ty="pull"><ird in="13081" se="" ba="0x8" /><ird in="13002" se="" ba="0x8" /><ird in="13004" se="" ba="0x8" /><ird in="13006" se="" ba="0x8" /><ird in="2" se="" ba="0x8" /><ird in="12" se="" ba="0x8" /><ird in="13" se="" ba="0x8" /><ird in="14" se="" ba="0x8" /><ird in="19" se="" ba="0x8" /><ird in="22" se="" ba="0x8" /><ird in="367" se="" ba="0x8" /><ird in="12409" se="" ba="0x8" /><ird in="12409" se="" ba="0x8" /><ird in="12409" se="" ba="0x8" /><ird in="12409" se="" ba="0x8" /><ird in="12409" se="" ba="0x8" /><ird in="12409" se="" ba="0x8" /><ird in="12409" se="" ba="0x8" /><ird in="12409" se="" ba="0x8" /><ird in="12409" se="" ba="0x8" /><ird in="12409" se="" ba="0x8" /><ird in="12409" se="" ba="0x8" /><ird in="410" se="" ba="0x8" /><ird in="13080" se="" ba="0x8" /><ird in="10040" se="" ba="0x8" /><ird in="551" se="" ba="0x8" /><ird in="550" se="" ba="0x8" /><ird in="553" se="" ba="0x8" /><ird in="552" se="" ba="0x8" /><ird in="554" se="" ba="0x8" /><ird in="6105" se="" ba="0x8" /><ird in="10007" se="" ba="0x8" /><ird in="10010" se="" ba="0x8" /><ird in="10006" se="" ba="0x8" /><ird in="13060" se="" ba="0x8" /><ird in="13061" se="" ba="0x8" /><ird in="13062" se="" ba="0x8" /><ird in="10071" se="" ba="0x8" /><ird in="10078" se="" ba="0x8" /><ird in="10800" se="" ba="0x8" /><ird in="10814" se="" ba="0x8" /><ird in="10815" se="" ba="0x8" /><ird in="12373" se="" ba="0x8" /><ird in="12375" se="" ba="0x8" /><ird in="13073" se="" ba="0x8" /><ird in="13075" se="" ba="0x8" /><ird in="12376" se="" ba="0x8" /><ird in="12379" se="" ba="0x8" /><ird in="12380" se="" ba="0x8" /><ird in="12383" se="" ba="0x8" /><ird in="12385" se="" ba="0x8" /><ird in="12389" se="" ba="0x8" /><ird in="12391" se="" ba="0x8" /><ird in="12392" se="" ba="0x8" /><ird in="12393" se="" ba="0x8" /><ird in="12394" se="" ba="0x8" /><ird in="12396" se="" ba="0x8" /><ird in="13057" se="" ba="0x8" /><ird in="12397" se="" ba="0x8" /><ird in="12398" se="" ba="0x8" /><ird in="12400" se="" ba="0x8" /><ird in="12399" se="" ba="0x8" /><ird in="12411" se="" ba="0x8" /><ird in="12410" se="" ba="0x8" /><ird in="12413" se="" ba="0x8" /><ird in="12412" se="" ba="0x8" /><ird in="12435" se="" ba="0x8" /><ird in="13070" se="" ba="0x8" /><ird in="13071" se="" ba="0x8" /><ird in="13076" se="" ba="0x8" /><ird in="13077" se="" ba="0x8" /><ird in="13000" se="" ba="0x8" /><ird in="13001" se="" ba="0x8" /><ird in="13002" se="" ba="0x8" /><ird in="13003" se="" ba="0x8" /><ird in="13004" se="" ba="0x8" /><ird in="13005" se="" ba="0x8" /><ird in="13006" se="" ba="0x8" /><ird in="13007" se="" ba="0x8" /><ird in="12009" se="" ba="0x8" /><ird in="13008" se="" ba="0x8" /><ird in="13009" se="" ba="0x8" /><ird in="12012" se="" ba="0x8" /><ird in="13010" se="" ba="0x8" /><ird in="12014" se="" ba="0x8" /><ird in="12015" se="" ba="0x8" /><ird in="13011" se="" ba="0x8" /><ird in="12017" se="" ba="0x8" /><ird in="13012" se="" ba="0x8" /><ird in="13013" se="" ba="0x8" /><ird in="12020" se="" ba="0x8" /><ird in="384" se="" ba="0x8" /><ird in="12022" se="" ba="0x8" /><ird in="13016" se="" ba="0x8" /><ird in="13017" se="" ba="0x8" /><ird in="13018" se="" ba="0x8" /><ird in="13019" se="" ba="0x8" /><ird in="13020" se="" ba="0x8" /><ird in="13021" se="" ba="0x8" /><ird in="13022" se="" ba="0x8" /><ird in="13063" se="" ba="0x8" /><ird in="13023" se="" ba="0x8" /><ird in="12052" se="" ba="0x8" /><ird in="13024" se="" ba="0x8" /><ird in="12057" se="" ba="0x8" /><ird in="13025" se="" ba="0x8" /><ird in="12060" se="" ba="0x8" /><ird in="12061" se="" ba="0x8" /><ird in="13026" se="" ba="0x8" /><ird in="13027" se="" ba="0x8" /><ird in="12006" se="" ba="0x8" /><ird in="13028" se="" ba="0x8" /><ird in="13029" se="" ba="0x8" /><ird in="13030" se="" ba="0x8" /><ird in="13031" se="" ba="0x8" /><ird in="13032" se="" ba="0x8" /><ird in="12089" se="" ba="0x8" /><ird in="13033" se="" ba="0x8" /><ird in="12091" se="" ba="0x8" /><ird in="13034" se="" ba="0x8" /><ird in="13035" se="" ba="0x8" /><ird in="13036" se="" ba="0x8" /><ird in="13037" se="" ba="0x8" /><ird in="13038" se="" ba="0x8" /><ird in="12103" se="" ba="0x8" /><ird in="13082" se="" ba="0x8" /><ird in="13039" se="" ba="0x8" /><ird in="13040" se="" ba="0x8" /><ird in="13042" se="" ba="0x8" /><ird in="13043" se="" ba="0x8" /><ird in="13044" se="" ba="0x8" /><ird in="12120" se="" ba="0x8" /><ird in="10873" se="" ba="0x8" /><ird in="13079" se="" ba="0x8" /><ird in="13078" se="" ba="0x8" /><ird in="410" se="" ba="0x8" /><ird in="10877" se="" ba="0x8" /><ird in="10878" se="" ba="0x8" /><ird in="10879" se="" ba="0x8" /><ird in="10880" se="" ba="0x8" /><ird in="13098" se="" ba="0x8" /><ird in="13099" se="" ba="0x8" /><ird in="13100" se="" ba="0x8" /><ird in="10888" se="" ba="0x8" /><ird in="10881" se="" ba="0x8" /><ird in="10882" se="" ba="0x8" /><ird in="10883" se="" ba="0x8" /><ird in="10884" se="" ba="0x8" /><ird in="10886" se="" ba="0x8" /><ird in="10885" se="" ba="0x8" /><ird in="10892" se="" ba="0x8" /><ird in="10891" se="" ba="0x8" /><ird in="10894" se="" ba="0x8" /><ird in="10893" se="" ba="0x8" /><ird in="10896" se="" ba="0x8" /><ird in="10895" se="" ba="0x8" /><ird in="10898" se="" ba="0x8" /><ird in="10897" se="" ba="0x8" /><ird in="10900" se="" ba="0x8" /><ird in="10899" se="" ba="0x8" /><ird in="13053" se="" ba="0x8" /><ird in="13056" se="" ba="0x8" /><ird in="13048" se="" ba="0x8" /><ird in="13049" se="" ba="0x8" /><ird in="13050" se="" ba="0x8" /></tbreq>
> <?xml version="1.0" encoding="utf-16"?><tbreq xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" bn="5" gw="1" ae="false" ty="pull"><ird in="10164" se="" ba="0x85" /><ird in="10179" se="" ba="0x85" /><ird in="10155" se="" ba="0x85" /><ird in="10156" se="" ba="0x85" /><ird in="10113" se="" ba="0x85" /><ird in="278" se="" ba="0x85" /><ird in="279" se="" ba="0x85" /><ird in="651" se="" ba="0x85" /><ird in="10119" se="" ba="0x85" /><ird in="10107" se="" ba="0x85" /><ird in="10110" se="" ba="0x85" /><ird in="10111" se="" ba="0x85" /><ird in="10108" se="" ba="0x85" /><ird in="10159" se="" ba="0x85" /><ird in="10165" se="" ba="0x85" /><ird in="10165" se="" ba="0x85" /><ird in="10100" se="" ba="0x85" /><ird in="10100" se="" ba="0x85" /><ird in="5266" se="" ba="0x85" /><ird in="10109" se="" ba="0x85" /><ird in="10109" se="" ba="0x85" /><ird in="10109" se="" ba="0x85" /><ird in="10164" se="" ba="0x85" /><ird in="10838" se="" ba="0x85" /><ird in="10839" se="" ba="0x85" /><ird in="10840" se="" ba="0x85" /><ird in="10841" se="" ba="0x85" /><ird in="10842" se="" ba="0x85" /><ird in="10843" se="" ba="0x85" /><ird in="10844" se="" ba="0x85" /><ird in="10845" se="" ba="0x85" /><ird in="10846" se="" ba="0x85" /><ird in="10847" se="" ba="0x85" /><ird in="10848" se="" ba="0x85" /><ird in="10849" se="" ba="0x85" /><ird in="10850" se="" ba="0x85" /><ird in="10851" se="" ba="0x85" /><ird in="10852" se="" ba="0x85" /><ird in="9024" se="" ba="0x85" /><ird in="9007" se="" ba="0x85" /><ird in="9028" se="" ba="0x85" /><ird in="10823" se="" ba="0x85" /><ird in="10824" se="" ba="0x85" /><ird in="10825" se="" ba="0x85" /><ird in="10826" se="" ba="0x85" /></tbreq>

Output after another 60 seconds

System.IO.IOException: Unable to read data from the transport connection: Connection reset by peer.
 ---> System.Net.Sockets.SocketException (104): Connection reset by peer
   --- End of inner exception stack trace ---
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource<System.Int32>.GetResult(Int16 token)
   at System.Net.Security.SslStream.EnsureFullTlsFrameAsync[TIOAdapter](TIOAdapter adapter)
   at System.Net.Security.SslStream.ReadAsyncInternal[TIOAdapter](TIOAdapter adapter, Memory``1 buffer)
   at ism7mqtt.Ism7Client.FillPipeAsync(PipeWriter target, CancellationToken cancellationToken) in /app/ism7mqtt/ISM7/Ism7Client.cs:line 166
System.IO.IOException: Unable to read data from the transport connection: Connection reset by peer.
 ---> System.Net.Sockets.SocketException (104): Connection reset by peer
   --- End of inner exception stack trace ---
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource<System.Int32>.GetResult(Int16 token)
   at System.Net.Security.SslStream.EnsureFullTlsFrameAsync[TIOAdapter](TIOAdapter adapter)
   at System.Net.Security.SslStream.ReadAsyncInternal[TIOAdapter](TIOAdapter adapter, Memory``1 buffer)
   at ism7mqtt.Ism7Client.FillPipeAsync(PipeWriter target, CancellationToken cancellationToken) in /app/ism7mqtt/ISM7/Ism7Client.cs:line 166
   at System.IO.Pipelines.Pipe.GetReadResult(ReadResult& result)
   at System.IO.Pipelines.Pipe.GetReadAsyncResult()
   at System.IO.Pipelines.Pipe.DefaultPipeReader.GetResult(Int16 token)
   at ism7mqtt.Ism7Client.ReadPipeAsync(PipeReader source, CancellationToken cancellationToken) in /app/ism7mqtt/ISM7/Ism7Client.cs:line 190

parameter:
parameter.json

@krusta4711
Copy link
Sponsor Contributor

krusta4711 commented Aug 4, 2024

I did a cross check:

  1. start ism7mqtt in debug mode
  2. wait for the xml on console
  3. kill ism7mqtt and directly start it again

Outcome the second start:
ism7mqtt successfully fetches the XML after start. EDIT: ok, it seems that the XML written to console after login is just the payload of the requests? In that case it seems that after login none of the calls is responded.

@krusta4711
Copy link
Sponsor Contributor

krusta4711 commented Aug 4, 2024

If it helps for finding the root cause:
I managed to compile and debug the project on my Windows machine with the connection to the ism7. So I can test code changes on the fly and try them out. I just have no clue what to try.

@krusta4711
Copy link
Sponsor Contributor

krusta4711 commented Aug 5, 2024

For another cross check I installed the Smartset PC application which uses the local connection. That works. So the ism7 provides the data locally.

@krusta4711
Copy link
Sponsor Contributor

krusta4711 commented Aug 6, 2024

@CEXC
I think I found the root cause by network sniffing, debugging and testing self compiled code:

In case the Smartset PC app requests data (here as example cha-7 outside temperature, PTID="270004", in="12"), the XML request body sent to the ism7 it looks like this:

<?xml version="1.0" encoding="utf-8"?> <tbreq bn="1000" gw="1" ae="true" ty="push"><ird se="A;46" ba="0x8" in="12" is="60" /></tbreq>

In case is ism7mqtt is requesting the same data it looks like this:

<?xml version="1.0" encoding="utf-16"?><tbreq xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" bn="2" gw="1" ae="false" ty="push"><ird in="12" se="" ba="0x8" /></tbreq>

When laying the important parts of the request on top of each other, it looks like this:

<tbreq bn="1000" gw="1" ae="true"  ty="push"><ird se="A;46" ba="0x8" in="12" is="60" /></tbreq>                                
<tbreq bn="1"    gw="1" ae="false" ty="push"><ird se=""     ba="0x8" in="12"         /></tbreq>

By adapting these attributes in the code I finally found out that the missing content of the "se=" parameter is the root cause of the exceptions. When adding content to the parameter in the source code, everything works fine (at least I do not get any Exception anymore with my test code and the outside temperature is written to console in debug mode every time it changes).


That was the good news. 👍

The not so good news: I have no clue what has to be written into the se parameter. I do not know whether the number is randomly increased or is mapped somehow to the "in" parameter (like "PTID" is). Additionally there are "A", "B" and "C" parameters (maybe even more). See this sniffed xml request by Smartset PC app:

  <tbreq bn="1000" gw="1" ae="true" ty="push">
    <ird se="A;187" ba="0x35" in="10148" is="60" />
    <ird se="C;57;12411;12410" ba="0x8" in="12411" is="60" />
    <ird se="C;57;12411;12410" ba="0x8" in="12410" is="60" />
    <ird se="A;23" ba="0x35" in="10134" is="60" />
    <ird se="B;189;182" ba="0x35" in="10161" is="60" />
    <ird se="A;299" ba="0x85" in="10159" is="60" />
    <ird se="B;239;238" ba="0x51" in="82" is="60" />
    <ird se="A;46" ba="0x8" in="12" is="60" />
    <ird se="B;270;269" ba="0x85" in="10100" is="60" />
    <ird se="A;63" ba="0x8" in="14" is="60" />
    <ird se="A;271" ba="0x85" in="10179" is="60" />
    <ird se="A;184" ba="0x35" in="10150" is="60" />
    <ird se="A;51" ba="0x8" in="6105" is="60" />
    <ird se="A;50" ba="0x8" in="22" is="60" />
    <ird se="B;313;314" ba="0x35" in="19" is="60" />
    <ird se="A;54" ba="0x8" in="12389" is="60" />
    <ird se="A;52" ba="0x8" in="10010" is="60" />
    <ird se="B;29;31;30;32;33" ba="0x8" in="12409" is="60" />
    <ird se="A;276" ba="0x85" in="10156" is="60" />
    <ird se="A;45" ba="0x8" in="12392" is="60" />
  </tbreq>

It would be great to get @zivillian on board. Maybe he has more knowledge about that topic. It might even be that all ism7mqtt installations stop working when they update to newer firmware.

P.S.
I additionally checked the utf-8 vs. uft-16 issue in the xml declaration. That is no problem. The data is correctly serialized to utf-8 and the ism7 seems to ignore the "wrong" declaration. Nevertheless that can easily be corrected in the class XmlPayload.cs by not using a StringWriter in line 16 but a self defined Utf8StringWriter with the correct encoding.

@zivillian
Copy link
Owner

Can you try to send some static value as se attribute (e.g. se="Z;314")? As far as I've understood this attribute is not used by the ism module, but only by the app to correlate multiple telegrams into a single region in the UI.

Maybe it's also enough to just send an empty se="" attribute...

@krusta4711
Copy link
Sponsor Contributor

krusta4711 commented Aug 6, 2024

I will try some static values with multiple attributes in the request and see whether one can put anything into the parameter as long its has the syntax "Character;Number". But I'm not sure how and when to handle parameters with multiple numbers (see e.g. se="C;57;12411;12410").

An empty se="" does not work. It is already sent empty in every request in your current version (see the snippet from my last post).

The attribute is definitely the root cause. I re-checked it a second ago:

Without a value it is causing the IOException. Just changing the code for both, "pull" and "post" TelegramBundelTypes will heal the problem. For example for push:

grafik

I will check now if any Character/Number combination is excepted or whether A/B/C has some semantic meaning...

@krusta4711
Copy link
Sponsor Contributor

krusta4711 commented Aug 6, 2024

I'm not sure how far I will come time-wise today with testing. It might be that I'm not able to test anymore before Thursday evening.

Quick tests:

  1. Not sending the se attribute at all does not work (in code it is currently initialized with an empty string).
  2. Sending a weird Char/Number combination works at least for the one and only single attribute I'm testing with at present

So this request works:
<tbreq bn="2" gw="1" ae="false" ty="push"><ird in="12" se="HelloWorld;123456789" ba="0x8" /></tbreq>

@krusta4711
Copy link
Sponsor Contributor

krusta4711 commented Aug 6, 2024

I did a test with two attributes of the Wolf CHA (PTID 270005 and 270006) and all of the following variants worked well:

  1. Increase the numbers for every attribute ("A;1", "A;2" etc.) and even distinguish the numbers between pull and push requests of the same attribute
  2. Allocate to both attributes exactly the same value (e.g. "A;1") for both pull and push)
  3. Use a string even without any semicolon (tested with "4gd3g4d4gd54gd54gd5fg4d5g4")

So it seems that for the new ism7 FW and/or the new ism7 HW the rules are:

  1. The se parameter has to be present
  2. The se attribute must not be an empty string
  3. Which string is set as value seems to be irrelevant (at least at present)

As last check I will test one of the attributes which have multiple numbers (some kind of list?) and sensors of two different device (e.g. cha and ism). But for today I'm done with testing.

@zivillian
Can you give me a hint how to compile the C# project on my Windows machine for a raspberry pi 64 (linux arm64) ? That would help to test for a longer period than just a few minutes.

@zivillian
Copy link
Owner

zivillian commented Aug 6, 2024

Can you give me a hint how to compile the C# project for raspberry (linux arm64) on my Windows machine? That would help to test for a longer period than just a few minutes.

Sure, take a look at the github actions

dotnet publish -c release -r linux-arm64 -p:PublishTrimmed=True --sc -nowarn:IL2026,IL2104 src/ism7mqtt/ism7mqtt.csproj

@krusta4711
Copy link
Sponsor Contributor

I did a night-shift :-P

I build the "fixed" code for my raspi and added it as service with a parameter.json consist of 15 entities in one device: The service was running perfectly for 14 hours before I stopped it to do some further tests:

I tried to find out how the se attributes with multiple values (e.g. <ird se="C;57;12411;12410" ba="0x8" in="12411" is="60" />) behave with my solution (whether you have to use multiple values to make them running). To be honest: I do not know. Nearly all in values I found in the Smartset PC app sniff are not configured in my by ism7config produced parameter.json.

I just found in "86" and "87" which are included in DeviceTemplateId "40000", PTID "40002" (Mischermotor) which where send like this in the sniff:

<ird se="C;240;86;87" ba="0x51" in="86" is="60" />
<ird se="C;240;86;87" ba="0x51" in="87" is="60" />

I do see the value in my home assistant. So it seems to work without taking care of multiple numbers in the se.

After that I started the service in my raspi with nearly all attributes found by ism7config. I now receive some 200 new ism7 entities in home assistant. :-)

@zivillian
I will create a pull request tomorrow. Then you can see what I changed and someone can maybe test the solution with old ism7 FW/HW to see whether the change is backward compatible.

P.S.
Just comes into my mind now:
I did NOT test setting a value yet!

@krusta4711
Copy link
Sponsor Contributor

krusta4711 commented Aug 8, 2024

I will not create a pull request today as my solution seems unfortunately not to be stable with all parameters added. I let ism7mqtt run on a raspi 5 as systemctl service.

The problems I face with my self-compiled solution:

  1. Yesterday night I got an IOException on network which stopped the program (such error can happpen and is kind of ok for me as the service is restarted automatically by Linux).
  2. Since two hours I do not get any data anymore. The service is running and Linux journalctl is not reporting any problem. I stopped the service and started ism7mqtt manually with debug flag enabled. The login works but no responses with data arrive. Also not for the initial pull method. Only the keepalive service is reporting responses.
    2a. Additionally when calling the IP of my ism7mqtt the local is shown as connected besides nothing is connected because stopped
    2b. Additionally the Smartset cloud is showing old data and the local PC app is not able to connect either.

So my ism7 seems kind of stopped sending data to any network (neither cloud nor locally). The data on the BM-2 is correct hence.

I do not know whether that would had happend anyhow or whether my change is responsible. I'm counting up the se number endless at present. Maybe it reached a limit which break some internal state of the ism7?

Turning the CHA-7 completely of and on again has healed everything. I will test some changes (not counting up endless, using an dedicated interval)

@krusta4711
Copy link
Sponsor Contributor

krusta4711 commented Aug 8, 2024

Hmmm, just saw in debug output that the highest number is just "A;480". The "push" registration for listening to the attributes is only done once at startup. The numbers do not increase anymore after that. So that is not a problem.

Not sure what I can check anymore to find out why my ism7 has stopped sending data to the networks.

@allcoolusernamesaregone
Copy link
Contributor

You could check and try to run with the sane value of se for all requests, e.g. se="A;46"..!?

@krusta4711
Copy link
Sponsor Contributor

krusta4711 commented Aug 9, 2024

My comment was a bit misleading. I tried to express that the numbers are not the problem. They do not increase after the startup phase and are smaller than what the Smartset PC app is sending.

Meanwhile I found some posts in the internet where users had the same problem: ism7 is not sending any data anymore until a reboot of the Wolf CHA. So maybe my problem had nothing to do with my code changes. I will observe it over the weekend.

@CEXC
Copy link
Author

CEXC commented Aug 10, 2024

My comment was a bit misleading. I tried to express that the numbers are not the problem. They do not increase after the startup phase and are smaller than what the Smartset PC app is sending.

Meanwhile I found some posts in the internet where users had the same problem: ism7 is not sending any data anymore until a reboot of the Wolf CHA. So maybe my problem had nothing to do with my code changes. I will observe it over the weekend.

This could be a general issue. As soon as i got my ism7 and set it up, i got a call from Wolf that my CHC/CHA has to be an Update, it is for free and will be dated on August 21. They dont explain the reason. Last Updateservice of my Wolf CHC is only a few month ago, less than a year.

Will we be able to get your changes into the homeasistsant addon? In this case i could report if i have the same problem and whats happend after the update of wolf chc/cha.

@allcoolusernamesaregone
Copy link
Contributor

Meanwhile I found some posts in the internet where users had the same problem: ism7 is not sending any data anymore until a reboot

Would you share the links to those posts?

And I wonder why there are more differences in the XML from here

ae="false" vs. ae="true"
bn="2" vs. bn="1000"

Maybe @zivillian could share his knowledge about the meaning of each attribute of the xml..?

@allcoolusernamesaregone
Copy link
Contributor

And about

I do not know whether that would had happend anyhow or whether my change is responsible

you could try:

  • redo the same thing and check, If ism7 stops again after about the same time
  • redo but not with ism7mqtt but the original smartset App

The requested amount of Data/Push information should be nearly the same ...

If smartset does work longer than your modified ism7mqtt you could redo the same but with the ism7proxy to compare the XMLs
if it doesnt work longer I think its clear that it isn't an issue of ism7mqtt

@krusta4711
Copy link
Sponsor Contributor

krusta4711 commented Aug 10, 2024

Current status:
My ism7 luckily did not run into the problem again, that it stops sending data to the network. But I do get a network IOException once or twice a day which stops ism7mqtt. Sometimes 2 hours after the start, sometimes 12 hours. That is in general no issue because my Linux service is restarting ism7mqtt automatically. But of course it doesn't feel right. ;-) Currently ism7mqtt is running for 16 hours without an issue.

@CEXC
I think it should be no problem to add the changes to the home assistant Addon too. But I have no clue how that works. That would be a job for @b3nn0 I guess. Additionally I guess that @zivillian needs to build a new version of ism7mqtt beforehand.

@allcoolusernamesaregone
All tests to come now will be very ugly because I can only test long term (let it run one or two days and check the error output in Linux journalctl). I will need a lot of time from now on. Also I do not find the link anymore where others had the same problem, that the ism7 is connected but not reporting data anymore until a reboot. One user wrote in that thread, that unplugging the network cables from the switch also works to get data again (which did not work for me).

@zivillian
I created a pull request (#114) just to show what I have changed. I think that sending the se attribute should be a switch at startup as experimental feature. In that case other users could help testing without having to change the version every time. I have never worked with C# before and was not sure how these startup switches works in the code (especially why they exists twice with different names (upper case, lower case)). So I did not change that part for not breaking anything.

@b3nn0
Copy link
Contributor

b3nn0 commented Aug 10, 2024

The addon is basically just a docker container with a shell script that starts ism7mqtt. I will push a new version once it is released.

@allcoolusernamesaregone
Copy link
Contributor

@krusta4711 , another thought, did you had a reboot of the ism7 (Power Off/On) after the failed connections with unmodified ism7mqtt but before successful using your "patched" Version? maybe there were some Leftovers from the requests without the se attributes in the ism7, I hope you get what I mean..
Or it had nothing to do with ism7 at all...

@krusta4711
Copy link
Sponsor Contributor

krusta4711 commented Aug 10, 2024

Yes, I got what you meant. And no, I did not a reboot after the connection issues with the unmodified version. I just rebooted once after the ism module stopped sending. That was two hours after I started the ism7mqtt the first time with a full set of data.

It might be that there have been leftovers from either the unmodified version or one of my million tests before. But my gut feeling is that my issues does not have to do anything with my code changes but with the ism module itself (respectively its FW). It would really be good if others can start testing "my" version to have more information what happens with other ism modules and FWs.

P.S.
ism7mqtt is up an running without any issues for 16 hours now. Maybe something healed itself. :-P

@zivillian
Copy link
Owner

@krusta4711 I've merged your pr - if someone wants to test there is a new docker image and binaries available

@krusta4711
Copy link
Sponsor Contributor

krusta4711 commented Aug 10, 2024

Cool, thank you. :-)

@b3nn0
Can you integrate the master Docker version in the Addon as experimental setting so that @CEXC can test the solution and other users can can cross check whether it still works for older ism7 FW/HW?

@b3nn0
Copy link
Contributor

b3nn0 commented Aug 10, 2024

I'm not sure.. HA addons don't have any "beta management" or something, where the user can pick a specific version.. it will be offered as an update to all users. And depending on when they install it, they will receiver a different version (whatever is master at the time of installing), disregarding any proper version management..

Maybe I can copy-paste into a second addon ism7mqtt-experimental or something...

@CEXC
Copy link
Author

CEXC commented Aug 10, 2024

I'm not sure.. HA addons don't have any "beta management" or something, where the user can pick a specific version.. it will be offered as an update to all users. And depending on when they install it, they will receiver a different version (whatever is master at the time of installing), disregarding any proper version management..

Maybe I can copy-paste into a second addon ism7mqtt-experimental or something...

An experimental version would be great

@b3nn0
Copy link
Contributor

b3nn0 commented Aug 10, 2024

Done..
Go to Addons in HA, check for updates via the button in the top right corner, then go to the addon store and it should be listed.
I think once installed, there should be a "rebuild" button for that addon. Whenever you want to fetch the latest experimental version, just hit that one.

Make sure you stop the non-experimental addon before running this. Only one of them can connect at the same time.

@CEXC
Copy link
Author

CEXC commented Aug 10, 2024

Done.. Go to Addons in HA, check for updates via the button in the top right corner, then go to the addon store and it should be listed. I think once installed, there should be a "rebuild" button for that addon. Whenever you want to fetch the latest experimental version, just hit that one.

Make sure you stop the non-experimental addon before running this. Only one of them can connect at the same time.

For me it works like a charm since 5 hours, even when i sniff all parameters and request those in a timeintervall of 30 seconds (60 is standard). It is also possible to change parameters and start manualy some functions like warm water. I will report a long term test.

Big thanks to all of you guys, especially @krusta4711

@krusta4711
Copy link
Sponsor Contributor

krusta4711 commented Aug 12, 2024

Mine was running for 31 hours before another network IOException occured. As already stated this is no problem to me, as my Linux service is restarting the program automatically. Without looking manually in the output I even would not recognize it. It would nevertheless be interesting whether others also have this issue -> have a look at the console output.

@alexkno79
Copy link

alexkno79 commented Aug 12, 2024

Well, I see the IOExceptions (connection reset by peer) also every once in a while. On my side this seems to happen when the ISM7 looses network shortly (due to router reconnection etc). This seems to happen mainly when the ISM7 is connected to Smartset portal. If then network is lost it seems the ISM7 is forced to close all connections for a moment.
When I deactivate the Smartset portal I don’t see these exceptions for weeks. But I run ism7mqtt in docker also with restarting the service automatically so I also don’t really mind

I also now run “your” version (I.e the new docker build zivilian linked) for about 24 hours with no issues (read and write work as before on my CBG2-14)

@krusta4711
Copy link
Sponsor Contributor

Thanks for the testing and the explanation. That was valuable input. :-) Now I know that it is a "normal" behavior by the ism module (my smartset portal is activated).

@krusta4711
Copy link
Sponsor Contributor

krusta4711 commented Aug 15, 2024

I have issue number 2. from my post #112 (comment) again. :-(

I think it has neither to with my code changes nor with ism7mqtt at all. Nevertheless I opened a new issue here. Maybe someone of you has an idea what to do/test:
#115

@Dschiii
Copy link

Dschiii commented Aug 23, 2024

I'm another user of the homeassistant addon with a new Wolf LINK Pro module, FW 4.4.0.
the "original" ism7mqtt doesn't work at all for me with the same errors as mentioned in the first post.
yesterday I installed the experimental version from @b3nn0 which seemed to work just fine - until today.
for some reason it just stopped working. no updates are sent in either direction, the states in HA are just static values.
I restarted the add-on in debug mode and the only output i get is

Aug 23 10:30:34 < �
Aug 23 10:31:34 > �
Aug 23 10:31:34 < �
Aug 23 10:32:34 > �
Aug 23 10:32:34 < �

any ideas?

Update: I pulled the power plug from the WOLF Link module, reconnected it and it started working again.
let's see how long it lasts this time.

@CEXC
Copy link
Author

CEXC commented Aug 23, 2024

I'm another user of the homeassistant addon with a new Wolf LINK Pro module, FW 4.4.0. the "original" ism7mqtt doesn't work at all for me with the same errors as mentioned in the first post. yesterday I installed the experimental version from @b3nn0 which seemed to work just fine - until today. for some reason it just stopped working. no updates are sent in either direction, the states in HA are just static values. I restarted the add-on in debug mode and the only output i get is

Aug 23 10:30:34 < � Aug 23 10:31:34 > � Aug 23 10:31:34 < � Aug 23 10:32:34 > � Aug 23 10:32:34 < �

any ideas?

Update: I pulled the power plug from the WOLF Link module, reconnected it and it started working again. let's see how long it lasts this time.

Thats the same behaviour as it is by us. If you Look into the Protokoll (Logs), you will find IOExceptions and so on. Please be sure to use a static ip for your HomeAssistant (WebGui)

@zivillian zivillian mentioned this issue Aug 25, 2024
@krusta4711
Copy link
Sponsor Contributor

@Dschiii
That is exactly the problem I also have and I opened this issue for:
#115

The debug output you posted is the so called "keep alive" message which the ism7mqtt is sending every 60 seconds to the ism module. This output is normal and indicates that ism module and even the connection in general is still alive. Why it stops sending messages is unknown yet. But it seems to be more a problem of the (newer?) ism modules themselves, than ism7mqtt. We are still analyzing the problem in the mentioned issue #115 .

@zivillian
Copy link
Owner

@krusta4711 stated in #115

All parameters I want to see are there and writing works too. So my root cause is simply that the ism module stops sending data completely.

so I'd close this issue as resolved. Please feel free to reopen if you still have problems with the initial connection.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants