Git Product home page Git Product logo

Comments (14)

Heckie75 avatar Heckie75 commented on July 23, 2024

According the second request the script tries to connect to the smart meter by using the default pin 1234.

In case that you have changed the PIN by using you smartphone please make sure that the pin is simular in the .known_sem6 file which is located in your home directory.

from voltcraft-sem-6000.

Grrb avatar Grrb commented on July 23, 2024

We used 1234 (set by phone) and 0000, but both didn't work. The firmware on the sem6000 is 1.13. The .known_sem6 file is this (we have 6 meters):

root@pi01:~# cat .known_sem6 
50:51:A9:76:5E:89 1234 vc1
50:51:A9:76:48:16 1234 vc2
50:51:A9:76:61:BC 1234 vc3
50:51:A9:76:6D:48 1234 vc4
50:51:A9:76:61:C9 1234 vc5
50:51:A9:76:6E:C9 1234 vc6

At the moment I'm running an continuous loop of "while true" on "for i in {1..6}" for the 6 VC's, using the set-by-phone pin 1234, and sofar I only twice got some sort of succesful connection from one, and once from another VC:

INFO:   Try to connect to 50:51:A9:76:61:C9
INFO:   Connected to 50:51:A9:76:61:C9
INFO:   Auth SEM
INFO:   >>>     char-write-req 2b 0f0c170000010203040000000022ffff
INFO:   OK
INFO:   <<<     Notification handle = 0x2b value: 0f 06 17 00 00 00 00 18 ff ff 
INFO:   Response completed in terms of announced length and end sequence
INFO:   SEM authorized successfully with PIN
INFO:   Request measurement
INFO:   >>>     char-write-req 2b 0f050400000005ffff
INFO:   OK
INFO:   <<<     Notification handle = 0x2b value: 0f 11 04 00 01 0b 0f e7 de 0d 46 32 00 00 00 00 00 00 6a 
INFO:   Response already completed in current notification in terms of announced length. No need to wait for another notification

INFO:   Measurement successfully requested
INFO:   Disconnect from 50:51:A9:76:61:C9

When this VC was probed at the next round in the "while true" loop it got the usual "WARN: Timeout. Notification not received" again. The while loop was this:
while true; do for i in 1 2 3 4 5 6; do ./sem-6000.exp vc$i --verbose --status; done |& tee -a sem6000-1234-continuous.txt; done

from voltcraft-sem-6000.

bmmlms avatar bmmlms commented on July 23, 2024

Everything worked for a long time but since last week I cannot access two different SEM 6000 devices.
These are the outputs:

INFO:   Connected to 2C:AB:33:01:F8:A7
INFO:   Auth SEM  
INFO:   >>>     char-write-req 2b 0f0c17000003060702000000002affff
WARN:   Timeout. Notification not received
ERROR:  Notification invalid!
ERROR:  Checksum of notification invalid!
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!
INFO:   Connected to 2C:AB:33:01:1E:5E
INFO:   Auth SEM
INFO:   >>>     char-write-req 2b 0f0c17000003060702000000002affff
WARN:   Timeout. Notification not received
ERROR:  Notification invalid!
ERROR:  Checksum of notification invalid!
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!

I also tried it with the python SEM6000 library that outputs "bluepy.btle.BTLEException: Device disconnected" right after the authentication call. The PIN 3672 works using the android app.

from voltcraft-sem-6000.

Heckie75 avatar Heckie75 commented on July 23, 2024

I don't expect that this is a software problem since my device still works like a charm.

Maybe you can try the debug and verbose mode get more insights what's going on.

$ sem-6000 FC:69:47:06:CB:C6 0309 --verbose --debug --sync --on --sleep 5 --off
INFO:	Try to connect to FC:69:47:06:CB:C6
[                 ][LE]> connect FC:69:47:06:CB:C6
Attempting to connect to FC:69:47:06:CB:C6
Connection successful
[FC:69:47:06:CB:C6][LE]> INFO:	Connected to FC:69:47:06:CB:C6
INFO:	Synchronize SEM
INFO:	>>>	char-write-req 2b 0f0c0100291614030807e400004bffff
char-write-req 2b 0f0c0100291614030807e400004bffff
Characteristic value was written successfully
[FC:69:47:06:CB:C6][LE]> INFO:	OK
Notification handle = 0x002e value: 0f 04 01 00 00 02 ff ff 
[FC:69:47:06:CB:C6][LE]> INFO:	<<<	Notification handle = 0x2b value: 0f 04 01 00 00 02 ff ff 
INFO:	Response completed in terms of announced length and end sequence
INFO:	SEM successfully synchronized
INFO:	Auth SEM
INFO:	>>>	char-write-req 2b 0f0c170000000300090000000024ffff
char-write-req 2b 0f0c170000000300090000000024ffff
Characteristic value was written successfully
[FC:69:47:06:CB:C6][LE]> INFO:	OK
Notification handle = 0x002e value: 0f 06 17 00 00 00 00 18 ff ff 
[FC:69:47:06:CB:C6][LE]> INFO:	<<<	Notification handle = 0x2b value: 0f 06 17 00 00 00 00 18 ff ff 
INFO:	Response completed in terms of announced length and end sequence
INFO:	SEM authorized successfully with PIN
INFO:	Switch SEM
INFO:	>>>	char-write-req 2b 0f06030001000005ffff
char-write-req 2b 0f06030001000005ffff
Characteristic value was written successfully
[FC:69:47:06:CB:C6][LE]> INFO:	OK
Notification handle = 0x002e value: 0f 04 03 00 00 04 ff ff 
[FC:69:47:06:CB:C6][LE]> INFO:	<<<	Notification handle = 0x2b value: 0f 04 03 00 00 04 ff ff 
INFO:	Response completed in terms of announced length and end sequence
INFO:	SEM successfully switched
INFO:	Switch SEM
INFO:	>>>	char-write-req 2b 0f06030000000004ffff
char-write-req 2b 0f06030000000004ffff
Characteristic value was written successfully
Notification handle = 0x002e value: 0f 04 03 00 00 04 ff ff 
INFO:	OK
INFO:	<<<	Notification handle = 0x2b value: 0f 04 03 00 00 04 ff ff 
INFO:	Response completed in terms of announced length and end sequence
INFO:	SEM successfully switched
INFO:	Disconnect from FC:69:47:06:CB:C6

from voltcraft-sem-6000.

bmmlms avatar bmmlms commented on July 23, 2024

Thanks for your reply. I cannot send switch on/off commands currently, but added the --debug flag. Most times this is the output:

INFO:   Try to connect to 2C:AB:33:01:F8:A7
[                 ][LE]> connect 2C:AB:33:01:F8:A7
Attempting to connect to 2C:AB:33:01:F8:A7
Connection successful
[2C:AB:33:01:F8:A7][LE]> INFO:  Connected to 2C:AB:33:01:F8:A7
INFO:   Auth SEM
INFO:   >>>     char-write-req 2b 0f0c17000003060702000000002affff
char-write-req 2b 0f0c17000003060702000000002affff
[2C:AB:33:01:F8:A7][LE]>
(gatttool:18194): GLib-WARNING **: 10:20:28.089: Invalid file descriptor.
WARN:   Timeout. Notification not received
ERROR:  Notification invalid!
ERROR:  Checksum of notification invalid!
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!

After many tries it worked once:

INFO:   Try to connect to 2C:AB:33:01:F8:A7
[                 ][LE]> connect 2C:AB:33:01:F8:A7
Attempting to connect to 2C:AB:33:01:F8:A7
Connection successful
[2C:AB:33:01:F8:A7][LE]> INFO:  Connected to 2C:AB:33:01:F8:A7
INFO:   Auth SEM
INFO:   >>>     char-write-req 2b 0f0c17000003060702000000002affff
char-write-req 2b 0f0c17000003060702000000002affff
Characteristic value was written successfully
[2C:AB:33:01:F8:A7][LE]> INFO:  OK
Notification handle = 0x002e value: 0f 06 17 00 00 00 00 18 ff ff
[2C:AB:33:01:F8:A7][LE]> INFO:  <<<     Notification handle = 0x2b value: 0f 06 17 00 00 00 00 18 ff ff
INFO:   Response completed in terms of announced length and end sequence
INFO:   SEM authorized successfully with PIN
INFO:   Request measurement
INFO:   >>>     char-write-req 2b 0f050400000005ffff
char-write-req 2b 0f050400000005ffff
Characteristic value was written successfully
[2C:AB:33:01:F8:A7][LE]> INFO:  OK
Notification handle = 0x002e value: 0f 11 04 00 01 01 6f 26 e0 02 10 32 00 00 00 00 00 00 c0
[2C:AB:33:01:F8:A7][LE]> INFO:  <<<     Notification handle = 0x2b value: 0f 11 04 00 01 01 6f 26 e0 02 10 32 00 00 00 00 00 00 c0
INFO:   Response already completed in current notification in terms of announced length. No need to wait for another notification

INFO:   Measurement successfully requested
{
  "device" : null,
  "status" : {
    "power" : 1,
    "voltage" : 224,
    "ampere" : 0.528,
    "watts" : 93.99,
    "frequency" : 50,
    "power_factor" : 0.79,
    "total" : 0.0
  },
  "settings" : null,
  "schedulers" : null,
  "countdown" : null,
  "randommode" : null,
  "data_per_hour" : [
  ],
  "data_per_day" : [
  ],
  "data_per_month" : [
  ]
}
INFO:   Disconnect from 2C:AB:33:01:F8:A7

Maybe my devices are broken?

from voltcraft-sem-6000.

Heckie75 avatar Heckie75 commented on July 23, 2024

I don't think that your device is broken. The most likely case is that the radio connection is poor.

It is also possible that you habe an other revision.

Maybe try the following in order to query if characteristics are simular to mine.

$ gatttool -b FC:69:47:06:CB:C6 -I
[FC:69:47:06:CB:C6][LE]> connect
Attempting to connect to FC:69:47:06:CB:C6
Connection successful
[FC:69:47:06:CB:C6][LE]> characteristics
handle: 0x0002, char properties: 0x02, char value handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb
handle: 0x0004, char properties: 0x02, char value handle: 0x0005, uuid: 00002a01-0000-1000-8000-00805f9b34fb
handle: 0x0006, char properties: 0x0a, char value handle: 0x0007, uuid: 00002a02-0000-1000-8000-00805f9b34fb
handle: 0x0008, char properties: 0x08, char value handle: 0x0009, uuid: 00002a03-0000-1000-8000-00805f9b34fb
handle: 0x000a, char properties: 0x02, char value handle: 0x000b, uuid: 00002a04-0000-1000-8000-00805f9b34fb
handle: 0x000d, char properties: 0x20, char value handle: 0x000e, uuid: 00002a05-0000-1000-8000-00805f9b34fb
handle: 0x0011, char properties: 0x02, char value handle: 0x0012, uuid: 00002a23-0000-1000-8000-00805f9b34fb
handle: 0x0013, char properties: 0x02, char value handle: 0x0014, uuid: 00002a24-0000-1000-8000-00805f9b34fb
handle: 0x0015, char properties: 0x02, char value handle: 0x0016, uuid: 00002a25-0000-1000-8000-00805f9b34fb
handle: 0x0017, char properties: 0x02, char value handle: 0x0018, uuid: 00002a26-0000-1000-8000-00805f9b34fb
handle: 0x0019, char properties: 0x02, char value handle: 0x001a, uuid: 00002a27-0000-1000-8000-00805f9b34fb
handle: 0x001b, char properties: 0x02, char value handle: 0x001c, uuid: 00002a28-0000-1000-8000-00805f9b34fb
handle: 0x001d, char properties: 0x02, char value handle: 0x001e, uuid: 00002a29-0000-1000-8000-00805f9b34fb
handle: 0x001f, char properties: 0x02, char value handle: 0x0020, uuid: 00002a2a-0000-1000-8000-00805f9b34fb
handle: 0x0021, char properties: 0x02, char value handle: 0x0022, uuid: 00002a50-0000-1000-8000-00805f9b34fb
handle: 0x0024, char properties: 0x06, char value handle: 0x0025, uuid: 0000fff1-0000-1000-8000-00805f9b34fb
handle: 0x0027, char properties: 0x02, char value handle: 0x0028, uuid: 0000fff2-0000-1000-8000-00805f9b34fb
handle: 0x002a, char properties: 0x04, char value handle: 0x002b, uuid: 0000fff3-0000-1000-8000-00805f9b34fb
handle: 0x002d, char properties: 0x10, char value handle: 0x002e, uuid: 0000fff4-0000-1000-8000-00805f9b34fb
handle: 0x0031, char properties: 0x02, char value handle: 0x0032, uuid: 0000fff5-0000-1000-8000-00805f9b34fb
handle: 0x0034, char properties: 0x02, char value handle: 0x0035, uuid: 0000fff6-0000-1000-8000-00805f9b34fb

from voltcraft-sem-6000.

bmmlms avatar bmmlms commented on July 23, 2024

The charasteristics look the same:

[2C:AB:33:01:F8:A7][LE]> connect
Attempting to connect to 2C:AB:33:01:F8:A7
Connection successful
[2C:AB:33:01:F8:A7][LE]> characteristics
handle: 0x0002, char properties: 0x02, char value handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb
handle: 0x0004, char properties: 0x02, char value handle: 0x0005, uuid: 00002a01-0000-1000-8000-00805f9b34fb
handle: 0x0006, char properties: 0x0a, char value handle: 0x0007, uuid: 00002a02-0000-1000-8000-00805f9b34fb
handle: 0x0008, char properties: 0x08, char value handle: 0x0009, uuid: 00002a03-0000-1000-8000-00805f9b34fb
handle: 0x000a, char properties: 0x02, char value handle: 0x000b, uuid: 00002a04-0000-1000-8000-00805f9b34fb
handle: 0x000d, char properties: 0x20, char value handle: 0x000e, uuid: 00002a05-0000-1000-8000-00805f9b34fb
handle: 0x0011, char properties: 0x02, char value handle: 0x0012, uuid: 00002a23-0000-1000-8000-00805f9b34fb
handle: 0x0013, char properties: 0x02, char value handle: 0x0014, uuid: 00002a24-0000-1000-8000-00805f9b34fb
handle: 0x0015, char properties: 0x02, char value handle: 0x0016, uuid: 00002a25-0000-1000-8000-00805f9b34fb
handle: 0x0017, char properties: 0x02, char value handle: 0x0018, uuid: 00002a26-0000-1000-8000-00805f9b34fb
handle: 0x0019, char properties: 0x02, char value handle: 0x001a, uuid: 00002a27-0000-1000-8000-00805f9b34fb
handle: 0x001b, char properties: 0x02, char value handle: 0x001c, uuid: 00002a28-0000-1000-8000-00805f9b34fb
handle: 0x001d, char properties: 0x02, char value handle: 0x001e, uuid: 00002a29-0000-1000-8000-00805f9b34fb
handle: 0x001f, char properties: 0x02, char value handle: 0x0020, uuid: 00002a2a-0000-1000-8000-00805f9b34fb
handle: 0x0021, char properties: 0x02, char value handle: 0x0022, uuid: 00002a50-0000-1000-8000-00805f9b34fb
handle: 0x0024, char properties: 0x06, char value handle: 0x0025, uuid: 0000fff1-0000-1000-8000-00805f9b34fb
handle: 0x0027, char properties: 0x02, char value handle: 0x0028, uuid: 0000fff2-0000-1000-8000-00805f9b34fb
handle: 0x002a, char properties: 0x04, char value handle: 0x002b, uuid: 0000fff3-0000-1000-8000-00805f9b34fb
handle: 0x002d, char properties: 0x10, char value handle: 0x002e, uuid: 0000fff4-0000-1000-8000-00805f9b34fb
handle: 0x0031, char properties: 0x02, char value handle: 0x0032, uuid: 0000fff5-0000-1000-8000-00805f9b34fb
handle: 0x0034, char properties: 0x02, char value handle: 0x0035, uuid: 0000fff6-0000-1000-8000-00805f9b34fb
[2C:AB:33:01:F8:A7][LE]> [Ctrl+D]

(gatttool:26778): GLib-WARNING **: 17:36:13.386: Invalid file descriptor.

At the moment I cannot rearrange my Raspberry or the SEM6000 to check if it is a radio connection issue. I will try this maybe next week. Thanks so far for your support!

from voltcraft-sem-6000.

Grrb avatar Grrb commented on July 23, 2024

My characteristics also are the same. I have run a loop again, running "./sem-6000.exp vc$i --verbose --debug --device" and after tens of failures for each of my 6 sem6000's, I got one success:

INFO:   Try to connect to 50:51:A9:76:6E:C9
[                 ][LE]> connect 50:51:A9:76:6E:C9
Attempting to connect to 50:51:A9:76:6E:C9
Connection successful
[50:51:A9:76:6E:C9][LE]> INFO:  Connected to 50:51:A9:76:6E:C9
INFO:   Auth SEM
INFO:   >>>     char-write-req 2b 0f0c170000010203040000000022ffff
char-write-req 2b 0f0c170000010203040000000022ffff
Characteristic value was written successfully
[50:51:A9:76:6E:C9][LE]> INFO:  OK
Notification handle = 0x002e value: 0f 06 17 00 00 00 00 18 ff ff 
[50:51:A9:76:6E:C9][LE]> INFO:  <<<     Notification handle = 0x2b value: 0f 06 17 00 00 00 00 18 ff ff 
INFO:   Response completed in terms of announced length and end sequence
INFO:   SEM authorized successfully with PIN
INFO:   Read name
INFO:   >>>     char-read-hnd 03
char-read-hnd 03
Characteristic value/descriptor: 76 63 34 
[50:51:A9:76:6E:C9][LE]> INFO:  <<<     Characteristic value/descriptor: 76 63 34 
INFO:   name successfully read
INFO:   Request serial number
INFO:   >>>     char-write-req 2b 0f051100000012ffff
char-write-req 2b 0f051100000012ffff
Characteristic value was written successfully
[50:51:A9:76:6E:C9][LE]> INFO:  OK
Notification handle = 0x002e value: 0f 15 11 00 4d 4c 30 31 44 31 30 30 31 32 30 30 30 30 30 30 
[50:51:A9:76:6E:C9][LE]> INFO:  <<<     Notification handle = 0x2b value: 0f 15 11 00 4d 4c 30 31 44 31 30 30 31 32 30 30 30 30 30 30 
INFO:   Response not complete, wait for another notification...
Notification handle = 0x002e value: 00 00 64 ff ff 
[50:51:A9:76:6E:C9][LE]> INFO:  <<<     Notification handle = 0x2b value: 00 00 64 ff ff 
INFO:   Response completed in terms of announced length and end sequence
INFO:   Serial requested successfully
INFO:   Disconnect from 50:51:A9:76:6E:C9

All other tries resulted in:

INFO:   Try to connect to 50:51:A9:76:6E:C9
[                 ][LE]> connect 50:51:A9:76:6E:C9
Attempting to connect to 50:51:A9:76:6E:C9
Connection successful
[50:51:A9:76:6E:C9][LE]> INFO:  Connected to 50:51:A9:76:6E:C9
INFO:   Auth SEM
INFO:   >>>     char-write-req 2b 0f0c170000010203040000000022ffff
char-write-req 2b 0f0c170000010203040000000022ffff
[50:51:A9:76:6E:C9][LE]> 
(gatttool:4457): GLib-WARNING **: 10:37:51.653: Invalid file descriptor.
WARN:   Timeout. Notification not received
ERROR:  Notification invalid!
ERROR:  Checksum of notification invalid!
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!

Does the "WARN: Timeout" have something to do with the problems? I see this with wicht08 too.

from voltcraft-sem-6000.

Grrb avatar Grrb commented on July 23, 2024

The command "./sem6000.exp vc1 --device" (or one of the other 5) usually gives "Error Authorization failed. Check PIN!" but sometimes it doesn't, but it then doesn't give any output at all. I guess that's not right either?
I noticed that while doing my loop again with just --device and no debug or verbose, which resulted in mostly 6 rows of Check PIN but sometimes 5 or even 4 rows:

# while true; do echo "next round of 6"; for i in 1 2 3 4 5 6; do ./sem-6000.exp vc$i --device; done
next round of 6
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!
next round of 6
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!
next round of 6
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!
next round of 6
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!
next round of 6
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!

from voltcraft-sem-6000.

Heckie75 avatar Heckie75 commented on July 23, 2024

At least if you want to print any output you must add the --print command like this

 while true; do echo "next round of 6"; for i in 1 2 3 4 5 6; do ./sem-6000.exp vc$i --device --print; done

from voltcraft-sem-6000.

Grrb avatar Grrb commented on July 23, 2024

Ok, mostly it's just 6 times "ERROR" but once in a while I see something like this:

next round of 6
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!
        Mac:                 50:51:A9:76:6D:48
        Device PIN:          1234
        Name:                vc3
        Serial:              ML01D10012000000
        Alias:               vc4

ERROR:  Authorization failed. Check PIN!
ERROR:  Authorization failed. Check PIN!

not sure why name <> alias, would that be part of the problem? I would expect that they would all / always complain or none. Because this problem is sort of "analog" (I mean not predictable) would that point to some electromagnetical thing? Bluetooth range problem? The pi is about 30 cm from the meters but it is in a server room with lots of iron stuff, some between the pi and the meters. Is it possible to change the timeouts of the program? I mean, seeing the Timeout warnings..

from voltcraft-sem-6000.

Heckie75 avatar Heckie75 commented on July 23, 2024

I expect that this is something relate to electromagnetical issues. I have learnt that bluetooth is very weak in terms of distance and other devices that operate in 2.4GHz range.

You can check if this is the problem by changing the position of the device that work with the position of a device that don't work.

from voltcraft-sem-6000.

CrookedBIOS avatar CrookedBIOS commented on July 23, 2024

I had the same problem. This is purely due to poor connection, even with my raspberry pi only 30 cm away from the Voltcrafts.
I fixed it by using a USB extension cord and a separate Bluetooth dongle to get closer to both the Voltcrafts, and use that Bluetooth device to connect to the Voltcrafts.

from voltcraft-sem-6000.

Heckie75 avatar Heckie75 commented on July 23, 2024

This is actually the same that I did. I had an Intel NUC in a metal case. Bluetooth connection was very poor. Then, I have bought an extension cord and external bluetooth dongle, too, and placed it on top of my bookshelf. This works for me. I can control all my Mipow Playbulbs, Eqiva radiator controls and switches. However, the voltcraft SEM-3600bt still needs several attempts in most cases.

from voltcraft-sem-6000.

Related Issues (15)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.