Giter VIP home page Giter VIP logo

infinitive's Introduction

infinitive

Infinitive impersonates a SAM on a Carrier Infinity system management bus.

DISCLAIMER

The software and hardware described here interacts with a proprietary system using information gleaned by reverse engineering. Although it works fine for me, no guarantee or warranty is provided. Use at your own risk to your HVAC system and yourself.

Getting started

Hardware setup

I've done all my development on a Raspberry Pi, although any reasonably performant Linux system with an RS-485 interface should work. I chose the Pi 3 since the built-in WiFi saved me the hassle of running Ethernet to my furnace. I'm not sure if older Pis have enough horsepower to run the Infinitive software. If you give it a shot and are successful, please let me know so I can update this information.

In addition to a Linux system, you'll need to source an adapter to communicate on the RS-485 bus. I am using a FTDI chipset USB to RS-485 adapter that I bought from Amazon. There are a variety of adapters on Amazon and eBay, although it may take a few attempts to find one that works reliably.

Once you have a RS-485 adapter you'll need to connect it to your ABCD bus. The easiest way to do this is by attaching new wires to the A and B terminals of the ABCD bus connector inside your furnace and connecting them to your adapter. The A and B lines are used for RS-485 communication, while C and D are 24V AC power. Do not connect your RS-485 adapter to the C and D terminals unless you want to see its magic smoke.

Software

Download the Infinitive release appropriate for your architecture.

  • amd64:
$ wget -O infinitive https://github.com/acd/infinitive/releases/download/v0.2/infinitive.amd64
  • arm:
$ wget -O infinitive https://github.com/acd/infinitive/releases/download/v0.2/infinitive.arm

Start Infinitive, providing the HTTP port to listen on for the management interface and the path to the correct serial device.

$ ./infinitive -httpport=8080 -serial=/dev/ttyUSB0 

Logs are written to stderr. For now I've been running Infinitive under screen. If folks are interested in a proper start/stop script and log management, submit a pull request or let me know.

If the RS-485 adapter is properly connected to your ABCD bus you should immediately see Infinitive logging messages indicating it is receiving data, such as:

INFO[0000] read frame: 2001 -> 4001: READ     000302    
INFO[0000] read frame: 4001 -> 2001: RESPONSE 000302041100000414000004020000 
INFO[0000] read frame: 2001 -> 4001: READ     000316    
INFO[0000] read frame: 4001 -> 2001: RESPONSE 0003160000000003ba004a2f780100037a 

Browse to your host system's IP, with the port you provided on the command line, and you should see a page that looks similar to the following:

Note: I am not much of a frontend web developer. I'd love to see pull requests for enhancements to the web interface.

There is a brief delay between altering a setting and Infinitive updating the information displayed. This is due to Infinitive polling the thermostat settings once per second.

Building from source

If you'd like to build Infinitive from source, first confirm you have a working Go environment (I've been using release 1.21). Ensure your GOPATH and GOHOME are set correctly, then:

$ go get github.com/acd/infinitive
$ go build github.com/acd/infinitive

JSON API

Infinitive exposes a JSON API to retrieve and manipulate thermostat parameters.

GET /api/zone/1/config

{
   "currentTemp": 70,
   "currentHumidity": 50,
   "outdoorTemp": 50,
   "mode": "heat",
   "stage": 2,
   "fanMode": "auto",
   "hold": true,
   "heatSetpoint": 68,
   "coolSetpoint": 74,
   "rawMode": 64
}

rawMode included for debugging purposes. It encodes stage and mode.

PUT /api/zone/1/config

Valid values for zone are 1-8.

{
   "mode": "auto",
   "fanMode": "auto",
   "hold": true,
   "heatSetpoint": 68,
   "coolSetpoint": 74
}

Valid write values for mode are off, auto, heat, and cool. Additional read values for mode are electric and heatpump indicating "heat pump only" or "electric heat only" have been selected at the thermostat Values for fanMode are auto, low, med, and high.

GET /api/airhandler

{
	"blowerRPM":0,
	"airFlowCFM":0,
	"elecHeat":false
}

GET /api/heatpump

{
	"coilTemp":28.8125,
	"outsideTemp":31.375,
	"stage":2
}

GET /api/zone/1/vacation

{
   "active":false,
   "days":0,
   "minTemperature":56,
   "maxTemperature":84,
   "minHumidity":15,
   "maxHumidity":60,
   "fanMode":"auto"
}

PUT /api/zone/1/vacation

{
   "days":0,
   "minTemperature":56,
   "maxTemperature":84,
   "minHumidity":15,
   "maxHumidity":60,
   "fanMode":"auto"
}

All parameters are optional. A single parameter may be updated by sending a JSON document containing only that parameter. Vacation mode is disabled by setting days to 0. Valid values for fanMode are auto, low, med, and high.

Details

ABCD bus

Infinity systems use a proprietary binary protocol for data exchange between system components. These message are sent across an RS-485 serial bus which Carrier refers to as the ABCD bus. Most systems usually includes an air-conditioning unit or heat pump, furnace, and thermostat. The thermostat is responsible for enumerating other components of the system and managing their operation.

The protocol has been reverse engineered as Carrier has not published a protocol specification. The following resources provided invaluable assistance with my reverse engineering efforts:

Infinitive reads and writes information from the Infinity thermostat. It also gathers data by passively observing traffic exchanged between the thermostat and other system components.

Bryant Evolution

I believe Infinitive should work with Bryant Evolution systems as they use the same ABCD bus. Please let me know if you have success using Infinitive on a Bryant system.

Unimplemented features

Multi-zone Infinity HVAC systems are partially supported. For now, the set API supports manipulating zonal fan mode, heat setpoint, and cool setpoint. I only have a single zone setup, so I can't test if multi-zone capability works properly. If you have a multi-zone setup and want to be a guinea pig, get in touch and maybe we can work something out.

I don't use the thermostat's scheduling capabilities or vacation mode so Infinitive does not support them. Reach out if this is something you'd like to see.

Issues

rPi USB stack

The USB to RS-485 adapter I'm using periodically locks up due to what appear to be USB stack issues on the Raspberry Pi 3. When this happens, reads on the serial file descriptor block forever and the kernel logs the following:

[491862.396039] ftdi_sio ttyUSB0: usb_serial_generic_read_bulk_callback - urb stopped: -32

Infinitive reopens the serial interface when it hasn't received any data in 5 seconds to workaround the issue. Alternatively, forcing the Pi USB stack to USB 1.1 mode resolves the issue. If you want to go this route, add dwc_otg.speed=1 to /boot/config.txt and reboot the Pi.

Bogus data

Occasionally Infinitive will display incorrect data via the web interface for a second. This is likely caused by improper parsing of data received from the ABCD bus. I'd like to track down the root cause of this issue and resolve it, but due to its transient nature it's not a high priority and does not affect usability.

See Also

Infinitude is another solution for managing Carrier HVAC systems. It impersonates Carrier web services and provides an alternate interface for controlling Carrier Internet-enabled touchscreen thermostats. It also supports passive snooping of the RS-485 bus and can decode and display some of the data.

Contact

Andrew Danforth ([email protected])

infinitive's People

Contributors

acd avatar cheitzig avatar jmbwell avatar maximvoven avatar will1604 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

infinitive's Issues

Muti-Zone and Schedule support

@acd or @Will1604 Just joined the Infinitive's team a year ago and since then I always wondered if there was a way to add multi-zone support as well as support for handling Schedules.

I currently have a 2 Zones setup so if I can send you any data so this can be added, please let me know as this would be more versatile for those who don't have the Touch Thermostat.

Unexpected end of JSON input

Homebridge keeps crashing and I have this in the log. Any ideas what Im doing wrong here?

Config

{
"accessory": "Thermostat",
"name": "Infinitive",
"apiEndpoint": "http://xxx.xxx.x.xx:8080/api"
}

Log

SyntaxError: Unexpected end of JSON input
at JSON.parse ()
at Thermostat. (/home/hoobs/.hoobs/node_modules/homebridge-infinitive-thermostat/index.js:373:18)
at Request.self.callback (/home/hoobs/.hoobs/node_modules/request/request.js:185:22)
at Request.emit (events.js:310:20)
at Request. (/home/hoobs/.hoobs/node_modules/request/request.js:1154:10)
at Request.emit (events.js:310:20)
at IncomingMessage. (/home/hoobs/.hoobs/node_modules/request/request.js:1076:12)
at Object.onceWrapper (events.js:416:28)
at IncomingMessage.emit (events.js:322:22)
at endReadableNT (_stream_readable.js:1187:12)

Current Temperature Decimal Point

Good morning, this is not an issue report, instead a request for information.
I am wrestling the idea of adding RS485 monitoring to my currrent set-up (raspberryPIv -> HomeAssistant -> HomAssistant-infinitude -> Infinitude -> Carrier Infinity Thermostat)..

One key feature that I am looking at is the ability to retrieve the Thermostat Current Temperature with at least one decimal point of resolution. With my current set-up i can only "see" zero decimal points.

Is the infinitive RS485 monitor capable of accessing the Thermostat Current Temperature with a resolution of 1 decimal point (r.g. 73.3degF ot 21.2degC)?

Thanks

Bogus data

From the readme "Bogus data: Occasionally Infinitive will display incorrect data via the web interface for a second. This is likely caused by improper parsing of data received from the ABCD bus. I'd like to track down the root cause of this issue and resolve it, but due to its transient nature it's not a high priority and does not affect usability."

While this is transient on the web interface it's more of an issue when reading and logging data via the API. Previously when logging data every minute bogus data was showing up two or three times a day. Recently it's gone up to as much as 12 times a day. Still only 0.83% but it makes plots like the following pretty ugly
rplot01

.

default build issue

My Gofoo is weak, but I can't seem to get infinitive to compile (on an arm5 board) due to a missing function reference. See below for an example.
it does compile with the StaticFS line commented out as a test

go get github.com/acd/infinitive go/src/github.com/acd/infinitive/webserver.go:27: cannot convert nil to type bool go/src/github.com/acd/infinitive/webserver.go:74: r.StaticFS undefined (type *gin.Engine has no field or method StaticFS)

RS-485 Errors and Timeouts

Can I get a little help troubleshooting my setup?

I have a Carrier Infinity furnace and AC unit that were installed in 2005. When I moved in about 3 years ago it was connected to a generic 2-stage thermostat, which I replaced with a systxccuid01 thermostat (the one with buttons) from eBay along with a new run of 18/5 thermostat wire from the furnace in the attic to the AC unit outside (about 50 feet). The thermostat is directly below the furnace, connected by about 10 feet of wire. Over the weekend, I ran about 20 feet of new 18/2 thermostat wire from the furnace to an RPi in my structured media center, which has the following RS-485 to USB adapter: https://www.amazon.com/gp/product/B005CPI0JQ

The Infinity A and B wires are connected to the RS-485 (A+) and (B-) terminals, respectively, which I believe is correct, although I'm new to RS-485 and it feels weird to not have a signal ground wire like with RS-232.

When I fire up Infinitive, I see lots of errors in the log output (see below), and the Infinitive UI is not populated with any values. (note that the AC was not on at the time, so RPM and CFM readings of 0 are correct)

Any ideas where I should direct my troubleshooting efforts? Does this look like a wiring issue, or possibly something wrong on the Carrier side? I'd rather not put the RPi at the furnace permanently, as I have a very hot attic, but maybe I can try it temporarily to rule out wiring issues due to staples, running near AC circuits, etc.

INFO[0028] read frame: 2001 -> e01: READ 003e04
INFO[0028] read frame: e01 -> 2001: RESPONSE 003e0400
INFO[0028] read frame: 2001 -> e01: READ 003e07
INFO[0028] read frame: e01 -> 2001: RESPONSE 003e070000
INFO[0028] read frame: 2001 -> 9201: ERROR 04
DEBU[0028] timeout waiting for response, retransmitting frame
DEBU[0028] transmitting frame: 200192010300000b003b03ecba
INFO[0028] read frame: 2001 -> 9201: ERROR 04
DEBU[0028] timeout waiting for response, retransmitting frame
DEBU[0028] transmitting frame: 200192010300000b003b03ecba
INFO[0028] read frame: 2001 -> 9201: ERROR 04
DEBU[0028] timeout waiting for response, retransmitting frame
DEBU[0028] transmitting frame: 200192010300000b003b03ecba
INFO[0028] read frame: 2001 -> 9201: ERROR 04
DEBU[0028] timeout waiting for response, retransmitting frame
DEBU[0028] transmitting frame: 200192010300000b003b03ecba
INFO[0028] read frame: 2001 -> 9201: ERROR 04
DEBU[0029] timeout waiting for response, retransmitting frame
DEBU[0029] transmitting frame: 200192010300000b003b03ecba
INFO[0029] action timed out
INFO[0029] read frame: 2001 -> 9201: ERROR 04
INFO[0030] encoded frame: 9201 -> 2001: READ 003b03
DEBU[0030] transmitting frame: 200192010300000b003b03ecba
INFO[0030] read frame: 2001 -> 9201: ERROR 04
INFO[0030] read frame: 2001 -> 4001: READ 00030a
INFO[0030] read frame: 4001 -> 2001: RESPONSE 00030a010a0a02001f004b000010080414
INFO[0030] read frame: 2001 -> 4001: READ 000104
DEBU[0030] timeout waiting for response, retransmitting frame
DEBU[0030] transmitting frame: 200192010300000b003b03ecba
INFO[0030] read frame: 4001 -> 2001: RESPONSE 0001045641524941424c45205350454544204655524e4143452020000000000000000000000000000000000000000000000000434553523133313331322d303620202035384d56503038302d462d31383131340000002d343330344e3030313935302034353034413130333634000000000000000000000000002d
INFO[0030] read frame: 2001 -> 9201: ERROR 04
INFO[0030] read frame: 2001 -> 4001: READ 000306
INFO[0030] read frame: 4001 -> 2001: RESPONSE 000306010000000001e505aa00
DEBU[0030] blower RPM is: 0
INFO[0030] read frame: 2001 -> 4001: READ 000302
INFO[0030] read frame: 4001 -> 2001: RESPONSE 000302041100000414000004020000
INFO[0030] read frame: 2001 -> 4001: READ 000316
DEBU[0030] timeout waiting for response, retransmitting frame
DEBU[0030] transmitting frame: 200192010300000b003b03ecba
DEBU[0030] timeout waiting for response, retransmitting frame
DEBU[0030] transmitting frame: 200192010300000b003b03ecba
DEBU[0030] timeout waiting for response, retransmitting frame
DEBU[0030] transmitting frame: 200192010300000b003b03ecba
DEBU[0031] timeout waiting for response, retransmitting frame
DEBU[0031] transmitting frame: 200192010300000b003b03ecba
INFO[0031] action timed out
INFO[0031] read frame: 2001 -> 4001: READ 000316
INFO[0031] read frame: 4001 -> 2001: RESPONSE 0003160000000000000000005a01000352
DEBU[0031] air flow CFM is: 0
INFO[0031] read frame: 2001 -> 9201: ERROR 04
INFO[0031] read frame: 2001 -> 9201: ERROR 04
INFO[0031] read frame: 2001 -> 9201: ERROR 04
INFO[0031] read frame: 2001 -> 4001: READ 000402
INFO[0031] read frame: 4001 -> 2001: RESPONSE 0004025a7896b45a1d358ec4741d34978da41db4eaad511d324813a602d005aa

Direct control of FE4A via RS485 by writing to its registers

Is there experimental support anywhere in Infinitive for WRITING directly to the registers of something like a FE4A fan coil to do things like:

  • Directly control the fan coil's blower speed. Given that the protocol apparently has its roots in some fairly old products, my guess is that the raw protocol probably isn't very abstracted, and the "fan control" register's bits probably have a direct, one-to-one correspondence with the state of specific pins on the ECM's wiring harness. It's also possible it might depend upon one or more analog voltage levels on the harness, probably determined by their own registers.

  • Directly control the compressor's off/on, or off/low/high running state. My guess is that this can be done in two ways... by communicating directly with the condenser unit (if it supports Infinity/Evolution directly), or by asking the FE4A to do it as a proxy (if the condenser unit does NOT itself support Infinity/Evolution directly).

  • Directly control the heat strips. I suspect this might be a two-bit value... one of which is analogous to closing or opening R to W/W2 on a normal system, and one of which is analogous to closing or opening R to W1 on a system that supports intelligent heating with an appropriate module (like the one that has 3k and 6k elements whose control works more or less the same way that a 3-way incandescent light bulb does).

  • Controlling things like fan delay settings. My guess is that the FE4A probably uses the exact same ECM as the FV4C, and has the same 4 options and restrictions behind the scenes... probably set by either two bits wired to pins in the ECM header cable, or a register whose value specifies an analog voltage level for a pin on the cable.

Why: I'm about to buy a new central A/C. Up to now, I planned to get a FV4C, just because I already have so much knowledge about how its control scheme works and what it can do. However, I know that a FE4A is almost the same price, and can theoretically do more... but without the ability to directly control things like its blower speed, the FE4A's additional capabilities wouldn't do me much good. My entire goal is to implement my own dehumidification-optimizing thermostat controller building upon the work I did in the past for my old system (a Bryant 704b, which has more or less the same control scheme as a FV4).

Merely being able to set a cool-to-dehumidify value in a Cor using Infinitive wouldn't help, because Carrier's thermostats won't allow you to set target humidity levels below 45% (unless, of course, Infinitive bypasses Cor's UI checks, and allows you to set values outside the range the thermostat itself would allow you to set via its own UI?). I suppose I could change Cor's setpoint values on the fly to something like 66F and 90F to trick it into turning the system on and off, but that wouldn't necessarily solve the problem of needing to be able to change the fan speed... or to do things that Cor officially won't allow you to do, like cool-to-dehumidify with simultaneous electric reheat via the heat strips (which you'd trigger on a FV4C by closing R to Y and R to W to activate both the compressor and heat strips, while leaving R-G open to imply that the system should reduce the blower speed).

Assuming Infinitive's apparent lack of support for writing to registers isn't deliberate, and is just because nobody got around to doing it yet, I'd definitely be willing to help flesh out support for it if I could just find something resembling documentation for the FE4A's control registers (as noted above) to point me in the right direction. In any case, even knowing what to specifically search for on Google to find register documentation would probably be immensely helpful.

Runs great on Bryant Evolution (not really an issue)

Note: not really an issue, but I wasn't sure how to send something that was just an fyi.

fyi, I installed and got infinitive running on Bryant Evolution today. No issues at all, although in fairness, it's been running for maybe five minutes. I'm currently running on a Pi 3, but also bought a Pi Zero W since it was literally $5 at Microcenter, and figured I'd try it there too. I'll let you know.

Partially functioning UI - zeros in /api/zone/1/config

Using PI 2B on a wifi network.
WGET your ARM gift.
The basics seem to be working...see log below.
Its just the /api/zone/1/config GET is returning zeros.

I note in the log file the temperatures are correctly parsed. Airflow and Blower RPM seem to be there.
Also, I do note that the UI does seem to have the fan RPM correct.

time="2017-02-28T19:38:32-05:00" level=info msg="read frame: 4001 -> 2001: RESPONSE 00030a0175750300510075000010100114"
time="2017-02-28T19:38:32-05:00" level=info msg="read frame: 2001 -> 5001: READ 003e01"
time="2017-02-28T19:38:32-05:00" level=info msg="read frame: 5001 -> 2001: RESPONSE 003e0103d103c703ff03ff000001013c"
time="2017-02-28T19:38:32-05:00" level=info msg="heat pump coil temp is: 60.437500"
time="2017-02-28T19:38:32-05:00" level=info msg="heat pump outside temp is: 61.062500"

picture1

pi@raspberrypi:~/infinitive$ ./infinitive -httpport=8080 -serial=/dev/ttyUSB0 1> weblog.txt 2> log.txt
 
pi@raspberrypi:~/infinitive$ cat log.txt
time="2017-02-28T19:24:02-05:00" level=info msg="opening serial interface: /dev/ttyUSB0" 
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /api/zone/1/config        --> main.webserver.func1 (3 handlers)
[GIN-debug] GET    /api/zone/1/vacation      --> main.webserver.func2 (3 handlers)
[GIN-debug] PUT    /api/zone/1/vacation      --> main.webserver.func3 (3 handlers)
[GIN-debug] PUT    /api/zone/1/config        --> main.webserver.func4 (3 handlers)
time="2017-02-28T19:24:02-05:00" level=info msg="encoded frame: 9201 -> 2001: READ     003b03" 
[GIN-debug] GET    /api/ws                   --> main.webserver.func5 (3 handlers)
time="2017-02-28T19:24:02-05:00" level=info msg="read frame: 2001 -> 5001: READ     000304" 
time="2017-02-28T19:24:02-05:00" level=debug msg="transmitting frame: 200192010300000b003b03ecba" 
[GIN-debug] GET    /ui/*filepath             --> github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1 (3 handlers)
[GIN-debug] HEAD   /ui/*filepath             --> github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1 (3 handlers)
[GIN-debug] GET    /                         --> main.webserver.func6 (3 handlers)
[GIN-debug] Listening and serving HTTP on :8080
time="2017-02-28T19:24:02-05:00" level=info msg="read frame: 2001 -> 9201: RESPONSE 003b03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" 
time="2017-02-28T19:24:02-05:00" level=info msg="encoded frame: 9201 -> 2001: READ     003b02" 
time="2017-02-28T19:24:02-05:00" level=debug msg="transmitting frame: 200192010300000b003b022d7a" 
time="2017-02-28T19:24:02-05:00" level=info msg="read frame: 2001 -> 9201: RESPONSE 003b020000000000000000000000000000000000000000000000000000000000" 
time="2017-02-28T19:24:02-05:00" level=info msg="read frame: 2001 -> 5001: READ     000504" 
time="2017-02-28T19:24:02-05:00" level=info msg="read frame: 5001 -> 2001: RESPONSE 000504032003e802d003d4" 
time="2017-02-28T19:24:03-05:00" level=info msg="encoded frame: 9201 -> 2001: READ     003b03" 
time="2017-02-28T19:24:03-05:00" level=debug msg="transmitting frame: 200192010300000b003b03ecba" 
time="2017-02-28T19:24:03-05:00" level=info msg="read frame: 2001 -> 9201: RESPONSE 003b03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" 
time="2017-02-28T19:24:03-05:00" level=info msg="encoded frame: 9201 -> 2001: READ     003b02" 
time="2017-02-28T19:24:03-05:00" level=debug msg="transmitting frame: 200192010300000b003b022d7a" 
time="2017-02-28T19:24:03-05:00" level=info msg="read frame: 2001 -> 9201: RESPONSE 003b020000000000000000000000000000000000000000000000000000000000" 
time="2017-02-28T19:24:03-05:00" level=info msg="read frame: 2001 -> 4001: READ     000404" 
time="2017-02-28T19:24:03-05:00" level=info msg="read frame: 4001 -> 2001: RESPONSE 0004041078000f1b1f030202570866084509950000" 
time="2017-02-28T19:24:03-05:00" level=info msg="read frame: 2001 -> 4001: READ     00040d" 
time="2017-02-28T19:24:03-05:00" level=info msg="read frame: 4001 -> 2001: RESPONSE 00040d000000000000" 
time="2017-02-28T19:24:03-05:00" level=info msg="read frame: 2001 -> f1f1: WRITE    000202131802" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 2001 -> f1f1: WRITE    0002031c0211" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 2001 -> 4001: WRITE    00031d01" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 4001 -> 2001: RESPONSE 00" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 2001 -> 4001: WRITE    000305010000000302000000000078" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 4001 -> 2001: RESPONSE 00" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 2001 -> 4001: WRITE    00040300010100" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 4001 -> 2001: RESPONSE 00" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 2001 -> 4001: WRITE    00040900010000" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 4001 -> 2001: RESPONSE 00" 
time="2017-02-28T19:24:04-05:00" level=info msg="encoded frame: 9201 -> 2001: READ     003b03" 
time="2017-02-28T19:24:04-05:00" level=debug msg="transmitting frame: 200192010300000b003b03ecba" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 2001 -> 9201: RESPONSE 003b03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" 
time="2017-02-28T19:24:04-05:00" level=info msg="encoded frame: 9201 -> 2001: READ     003b02" 
time="2017-02-28T19:24:04-05:00" level=debug msg="transmitting frame: 200192010300000b003b022d7a" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 2001 -> 9201: RESPONSE 003b020000000000000000000000000000000000000000000000000000000000" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 2001 -> 4001: WRITE    00040b3f800000" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 4001 -> 2001: RESPONSE 00" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 2001 -> 4001: WRITE    00030701000000" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 4001 -> 2001: RESPONSE 00" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 2001 -> 4001: READ     000104" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 4001 -> 2001: RESPONSE 0001045641524941424c45205350454544204655524e4143452020000000000000000000000000000000000000000000000000434553523133313437362d323420202035394d4e37413132305632343132323200000000313432354e2d2d2d2d2d2d20323631344134383935330000000000000000000000000000" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 2001 -> 5001: READ     000104" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 5001 -> 2001: RESPONSE 000104455645524553542054574f204341504143495459204f4455000000000000000000000000000000000000000000000000434553523133313339302d31312020003234414e42313438413030333130333000000000323431354e34313436333920323831354531333533370000000000000000000000000000" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 2001 -> 4001: READ     000306" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 4001 -> 2001: RESPONSE 000306010254030202a8083e08" 
time="2017-02-28T19:24:04-05:00" level=debug msg="blower RPM is: 596" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 2001 -> 4001: READ     00030a" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 4001 -> 2001: RESPONSE 00030a0175750300510075000010100114" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 2001 -> 5001: READ     003e01" 
time="2017-02-28T19:24:04-05:00" level=info msg="read frame: 5001 -> 2001: RESPONSE 003e0103cf03c803ff03ff000001013c" 
time="2017-02-28T19:24:04-05:00" level=info msg="heat pump coil temp is: 60.500000" 
time="2017-02-28T19:24:04-05:00" level=info msg="heat pump outside temp is: 60.937500" 
time="2017-02-28T19:24:05-05:00" level=info msg="encoded frame: 9201 -> 2001: READ     003b03" 
time="2017-02-28T19:24:05-05:00" level=debug msg="transmitting frame: 200192010300000b003b03ecba" 
time="2017-02-28T19:24:05-05:00" level=info msg="read frame: 2001 -> 9201: RESPONSE 003b03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" 
time="2017-02-28T19:24:05-05:00" level=info msg="encoded frame: 9201 -> 2001: READ     003b02" 
time="2017-02-28T19:24:05-05:00" level=debug msg="transmitting frame: 200192010300000b003b022d7a" 
time="2017-02-28T19:24:05-05:00" level=info msg="read frame: 2001 -> 9201: RESPONSE 003b020000000000000000000000000000000000000000000000000000000000" 
time="2017-02-28T19:24:05-05:00" level=info msg="read frame: 2001 -> 5001: READ     000304" 
time="2017-02-28T19:24:05-05:00" level=info msg="read frame: 5001 -> 2001: RESPONSE 0003040118003c011700d501410afb014200000143000000440000" 
time="2017-02-28T19:24:05-05:00" level=info msg="read frame: 2001 -> 4001: READ     00030d" 
time="2017-02-28T19:24:05-05:00" level=info msg="read frame: 4001 -> 2001: RESPONSE 00030d00000000000000" 
time="2017-02-28T19:24:05-05:00" level=info msg="read frame: 2001 -> 5001: READ     00030d" 
time="2017-02-28T19:24:05-05:00" level=info msg="read frame: 5001 -> 2001: RESPONSE 00030d00000000000000" 
time="2017-02-28T19:24:05-05:00" level=info msg="read frame: 2001 -> 4001: READ     000316" 
time="2017-02-28T19:24:05-05:00" level=info msg="read frame: 4001 -> 2001: RESPONSE 000316010200000302003339780100036b" 
time="2017-02-28T19:24:05-05:00" level=debug msg="air flow CFM is: 770" 
time="2017-02-28T19:24:05-05:00" level=info msg="read frame: 2001 -> 4001: READ     000402" 
time="2017-02-28T19:24:05-05:00" level=info msg="read frame: 4001 -> 2001: RESPONSE 0004025a7896b4781d358984fd1d329b6d201db45dba4a1d00000000030205b103d02800" 
time="2017-02-28T19:24:05-05:00" level=info msg="read frame: 2001 -> 4001: READ     000409" 
time="2017-02-28T19:24:05-05:00" level=info msg="read frame: 4001 -> 2001: RESPONSE 00040900010000" 
time="2017-02-28T19:24:06-05:00" level=info msg="encoded frame: 9201 -> 2001: READ     003b03" 
time="2017-02-28T19:24:06-05:00" level=debug msg="transmitting frame: 200192010300000b003b03ecba" 
time="2017-02-28T19:24:06-05:00" level=info msg="read frame: 2001 -> 9201: RESPONSE 003b03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" 
time="2017-02-28T19:24:06-05:00" level=info msg="encoded frame: 9201 -> 2001: READ     003b02" 
time="2017-02-28T19:24:06-05:00" level=debug msg="transmitting frame: 200192010300000b003b022d7a" 
time="2017-02-28T19:24:06-05:00" level=info msg="read frame: 2001 -> 9201: RESPONSE 003b020000000000000000000000000000000000000000000000000000000000" 
time="2017-02-28T19:24:07-05:00" level=info msg="encoded frame: 9201 -> 2001: READ     003b03" 
time="2017-02-28T19:24:07-05:00" level=debug msg="transmitting frame: 200192010300000b003b03ecba" 
time="2017-02-28T19:24:07-05:00" level=info msg="read frame: 2001 -> 9201: RESPONSE 003b03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" 
time="2017-02-28T19:24:07-05:00" level=info msg="encoded frame: 9201 -> 2001: READ     003b02" 
time="2017-02-28T19:24:07-05:00" level=debug msg="transmitting frame: 200192010300000b003b022d7a" 
time="2017-02-28T19:24:07-05:00" level=info msg="read frame: 2001 -> 9201: RESPONSE 003b020000000000000000000000000000000000000000000000000000000000" 
time="2017-02-28T19:24:07-05:00" level=info msg="read frame: 2001 -> 4001: READ     000104" 
time="2017-02-28T19:24:07-05:00" level=info msg="read frame: 4001 -> 2001: RESPONSE 0001045641524941424c45205350454544204655524e4143452020000000000000000000000000000000000000000000000000434553523133313437362d323420202035394d4e37413132305632343132323200000000313432354e2d2d2d2d2d2d20323631344134383935330000000000000000000000000000" 
time="2017-02-28T19:24:07-05:00" level=info msg="read frame: 2001 -> 5001: READ     000104" 
time="2017-02-28T19:24:07-05:00" level=info msg="read frame: 5001 -> 2001: RESPONSE 000104455645524553542054574f204341504143495459204f4455000000000000000000000000000000000000000000000000434553523133313339302d31312020003234414e42313438413030333130333000000000323431354e34313436333920323831354531333533370000000000000000000000000000" 
time="2017-02-28T19:24:07-05:00" level=info msg="read frame: 2001 -> 4001: READ     000306" 
time="2017-02-28T19:24:07-05:00" level=info msg="read frame: 4001 -> 2001: RESPONSE 000306010253030202a8083e08" 
time="2017-02-28T19:24:07-05:00" level=debug msg="blower RPM is: 595" 
time="2017-02-28T19:24:07-05:00" level=info msg="read frame: 2001 -> 4001: READ     00030a" 
time="2017-02-28T19:24:07-05:00" level=info msg="read frame: 4001 -> 2001: RESPONSE 00030a0175750300510075000010100114" 
time="2017-02-28T19:24:07-05:00" level=info msg="read frame: 2001 -> 5001: READ     003e01" 
time="2017-02-28T19:24:07-05:00" level=info msg="read frame: 5001 -> 2001: RESPONSE 003e0103cf03c803ff03ff000001013c" 
time="2017-02-28T19:24:07-05:00" level=info msg="heat pump coil temp is: 60.500000" 
time="2017-02-28T19:24:07-05:00" level=info msg="heat pump outside temp is: 60.937500" 
time="2017-02-28T19:24:07-05:00" level=info msg="read frame: 2001 -> 5001: READ     000311" 
time="2017-02-28T19:24:07-05:00" level=info msg="read frame: 5001 -> 2001: RESPONSE 00031125000000260000002a0002fc290000cc3d0000002c003617" 
pi@raspberrypi:~/infinitive$ 

Airhandler/Heatpump API broken?

The Airhandler and Heatpump API does not work. I am receiving a 404 when I request it. Is this a known issue? I am looking through the code and I think it may have something to do with getAirHandler(?) function in the infinitive.go file?

MQTT

Would it be difficult to add paho.mqtt.golang client library to the project?

Heat stage messages are specific to electric heat system

My code to determine heat pump stage and whether electric heat was active was merged into main a couple of months ago. It wasn't as general as it might have been. The text in the UI and API was specific to a fan coil with auxiliary electric heat. For example in the UI it reports "Electric Heat Active". That's misleading for a system where the indoor unit is a furnace.

The addFurnace branch sets out to provide text appropriate depending on whether the system has a hybrid heat furnace or a fan coil with electric heat.

I'd appreciate any preferences on what the API response should be

This covers all the bases but for any given system includes an element that is unnecessary.
{"blowerRPM":1000, "airFlowCFM":1200, "elecHeat":true, "furnaceHeat":false}

This would be more specific
A hybrid heat system would return
{ "blowerRPM": 1000, "airFlowCFM":1200, "furnaceHeat":true }
A fan coil/electric heat system would return
{ "blowerRPM":0, "airFlowCFM":0, "elecHeat":false }

Also; as I don't have a hybrid heat furnace I can't test whether the same bits are being used to indicate furnace heat, so for now I've included "heatBits":"00000011" in the response.

The branch also includes an API call to return details about the kind of units installed on the system.

Will merge this into will1604/master when done.

can't find API

Loving Infinitive, but I can't seem to GET any of the API except /api/zone/1/config.
../heatpump and ../airhandler produce a 404?
Any thoughts? Any way I can help contribute (logs or similar)?
Thanks!

Reading HVAC status

I wonder if I should go to the trouble of building an Infinitive system if all I need is to read (and broadcast) the status of the furnace and/or AC, meaning "If (furnace heating) or (AC cooling) then output 1, otherwise output 0." All I intend to do is get IFTTT control my smart duct booster fan based on whether the AC or furnace is running or not.

In case you cannot suggest a simpler way, I am, of course, eager to build an Infinitive system, but I obviously need to know if Infinitive outputs what I need, i.e. the HVAC status.

Many thanks for the trouble.

No heatActive and coolActive data

I found the comment in infinitive.go about heatActive and coolActive not being in the mode field. I'd like to log these so am looking into where we can get this information from.

I'm thinking of logging the state of the unknown fields in TStatCurrentParams and TStatZoneParams to see if anything changes there and correlates with what's going on in the system. Does that sound worth the effort - or are these fields known not to contain anything useful?

Perhaps nothing from the tstat can tell whether heat or cool is on, or at what level. Perhaps we need to look in the responses from the heat pump. Does anyone have any clues?

No data except for FAN rpm and CFM

I am only seeing FAN motor rpm and CFM. So I know I am connected and working correctly. Everything else are zeros for temps etc.. I am guessing infinitive is not aware of this variable speed furnace, tstat, and variable speed condenser? Any help would be great.

Eric

Mostly timeouts in rs485 communications

I first bought an FTDI USB-RS485-WE-1800-BT cable (https://www.amazon.com/gp/product/B00DK85QY4) from Amazon and wired that directly into the screw terminal on the thermostat. My thermostat is an SYSTXCCUID01-B / fw - CESR131339-16.

I worked great initially, then I buttoned things up and it stopped reading values into Infinitive. While I was looking things over, I noticed the rubber molding over the chips was very warm. It seems that the cable was fried. Not sure if somehthing got accidentally shorted while I was moving all the wires into their final spots or what. Nothing obvious happened to it...

Anyway, I decided to try the bare usb to rs485 adapter board on Amazon from OctagonStar (https://www.amazon.com/gp/product/B01LCFRR3E) today. So I cut the usb end off the FTDI cable and stripped the wires and hit them with a little solder just so they were more rigid in the screw terminals. Got it all wired in and gave it a shot tonight. It's working a little better than the fried FTDI pre-made cable, but not by much...

I'm mostly seeing timeouts with a single read or write scattered in here and there... Any ideas what could be causing this?

INFO[0152] encoded frame: 9201 -> 2001: READ     003b03
DEBU[0152] transmitting frame: 200192010300000b003b03ecba
DEBU[0152] timeout waiting for response, retransmitting frame
DEBU[0152] transmitting frame: 200192010300000b003b03ecba
INFO[0152] read frame: 2001 -> 5001: WRITE    00031c2d000000000000000000000144000000000000004e00000000000000343434343434343400000000
DEBU[0152] timeout waiting for response, retransmitting frame
DEBU[0152] transmitting frame: 200192010300000b003b03ecba
DEBU[0152] timeout waiting for response, retransmitting frame
DEBU[0152] transmitting frame: 200192010300000b003b03ecba
DEBU[0152] timeout waiting for response, retransmitting frame
DEBU[0152] transmitting frame: 200192010300000b003b03ecba
DEBU[0153] timeout waiting for response, retransmitting frame
DEBU[0153] transmitting frame: 200192010300000b003b03ecba
INFO[0153] action timed out
INFO[0153] read frame: 2001 -> 5001: WRITE    00031c2d000000000000000000000144000000000000004e00000000000000343434343434343400000000

DEBU[0218] transmitting frame: 200192010300000b003b03ecba
DEBU[0218] timeout waiting for response, retransmitting frame
DEBU[0218] transmitting frame: 200192010300000b003b03ecba
DEBU[0218] timeout waiting for response, retransmitting frame
DEBU[0218] transmitting frame: 200192010300000b003b03ecba
INFO[0218] read frame: 2001 -> 5001: READ     003e01
DEBU[0218] timeout waiting for response, retransmitting frame
DEBU[0218] transmitting frame: 200192010300000b003b03ecba
DEBU[0219] timeout waiting for response, retransmitting frame
DEBU[0219] transmitting frame: 200192010300000b003b03ecba
DEBU[0219] timeout waiting for response, retransmitting frame
DEBU[0219] transmitting frame: 200192010300000b003b03ecba
INFO[0219] action timed out
INFO[0219] read frame: 2001 -> 4201: READ     00030a
INFO[0219] read frame: 2001 -> 4201: READ     00030a
INFO[0219] read frame: 2001 -> 4201: READ     00030a
INFO[0219] read frame: 2001 -> 4201: READ     00030a
INFO[0220] encoded frame: 9201 -> 2001: READ     003b03
DEBU[0220] transmitting frame: 200192010300000b003b03ecba
DEBU[0220] timeout waiting for response, retransmitting frame
DEBU[0220] transmitting frame: 200192010300000b003b03ecba
DEBU[0220] timeout waiting for response, retransmitting frame
DEBU[0220] transmitting frame: 200192010300000b003b03ecba
INFO[0220] read frame: 2001 -> 4201: READ     00030a
DEBU[0220] timeout waiting for response, retransmitting frame
DEBU[0220] transmitting frame: 200192010300000b003b03ecba
DEBU[0221] timeout waiting for response, retransmitting frame
DEBU[0221] transmitting frame: 200192010300000b003b03ecba
DEBU[0221] timeout waiting for response, retransmitting frame
DEBU[0221] transmitting frame: 200192010300000b003b03ecba
INFO[0221] action timed out
INFO[0221] read frame: 2001 -> f1f1: WRITE    000202162301
INFO[0221] read frame: 2001 -> f1f1: WRITE    00020313020c
INFO[0221] read frame: 2001 -> 5001: READ     003e01
INFO[0221] read frame: 2001 -> 5001: READ     003e01
INFO[0221] read frame: 2001 -> 5001: READ     003e01

The only thing I haven't done is replace the wiring with solid core that is the same gauge as the original thermostat wire. I wound up soldering the FTDI cable signal wires to the solid core original wires before inserting them back into the t-stat screw terminals, because they kept slipping out when I'd tighten the screw with 2 separate wires in there. With the FTDI cable, I had no choice on wire, so that's what I used. I was hoping since I had already fished this cable through and it was good enough for the pre-built FTDI cable, that it would be good enough with the bare adapter too. I am not an electronic expert, but I can see how that wiring could possibly be an issue being smaller gauge stranded vs the solid core t-stat wire.

Anyone care to share some expert insight?

Thanks in advance!

Is setting target humidity possible?

I've been running a custom component for the Home Assistant project that uses the infinitive API to create a "smart" HVAC system. I had a user ask if it were possible to set the target humidity. I started digging and I see references to setting target humidity in the code but it's not working for me. Was this a feature that never was completed or am I doing something wrong?

RS-485 seems OK but UI is all Zero values!

I have set up the RPi with a RS-485 to USB FTDI adaptor. I can see the messages like below.
Unfortunately, running le Web interface or API doesn’t work for me. I have the following result!
Did I miss something ? I just run:
./infinitive -httpport=8080 -serial=/dev/ttyUSB0

2018-06-08_131826

INFO[0000] read frame: 5001 -> 2001: RESPONSE 000104455645524553542054574f204341504143495459204f4455000000000000000000000000000000000000000000000000434553523133313339302d31312020003234414e42373336413030333130333000000000323531344e34323238323120323831344532363433330000000000000000000000000000
INFO[0000] read frame: 4001 -> 2001: RESPONSE 0003060100000000000005aa00
DEBU[0000] blower RPM is: 0
INFO[0000] read frame: 4001 -> 2001: RESPONSE 00030a017272030051004e000010080114
INFO[0000] read frame: 5001 -> 2001: RESPONSE 003e0103ac039303ff03ff000001013c
INFO[0000] heat pump coil temp is: 57.187500
INFO[0000] heat pump outside temp is: 58.750000

Code=exited

Im getting this error when starting the service. Followed your instructions step by step. Please help. Hate not having ecobee in my new house and this is the best thing I have found yet.

` infinitive.service - Infinitive Service
Loaded: loaded (/etc/systemd/system/infinitive.service; enabled; vendor preset: enabled)
Active: activating (auto-restart) (Result: exit-code) since Thu 2020-02-20 20:39:27 GMT; 66ms ago
Process: 8767 ExecStart=/root/go/bin/infinitive -httpport=8080 -serial=/dev/ttyUSB1 (code=exited, status=2)
Main PID: 8767 (code=exited, status=2)

Feb 20 20:39:27 raspberrypi systemd[1]: infinitive.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
Feb 20 20:39:27 raspberrypi systemd[1]: infinitive.service: Failed with result 'exit-code'.

What is a SAM?

It would be nice if README.md (the file shown on the GitHub project page) started with a paragraph explaining what this software does. Just saying it "impersonates a SAM" is useless if the reader has no idea what a SAM is (like me). See the README.md for Infinitude for a good example.

I'm looking for some way to control my Bryant condenser via the ABCD bus, without buying a bunch of expensive hardware, because the Y1/Y2 terminals were damaged by lightning. I don't have any other Bryant equipment. After reading the README.md I still have no idea what this software does or if it will do what I need (send stage one, stage two, and off commands to the condenser).

Thank you.

Hardware connection options

Anyone know what locations are possible for connecting the hardware? I see mention of connecting wires to the air handler. But in my case, the thermostat location would be far easier to access. I'm not familiar with the rs485 communication protocol at all. Is it possible to piggyback my pi to the terminals of the Carrier thermostat? Or would I have to remove the wires from the existing thermostat and then connect them to the pi? If connectign at the air handler, does that require removing the existing wires, or just add an additional set of wires going to the pi? Ideally, I leave the existing Carrier thermostat in place, just for ease of use.

Infinity Touch

Still interested in having Infinitive for the Infinity Touch t-stat. This would work nicely with node-red as a Dashboard frontend along with other HA.

Multinozne config

Hello, i want to be guinea pig. My setup is Blower, humidifier and 2 zones. I have Carierr Infinity connected to rpi3.

Airhandler page missing?

First I'd like to say thanks for all the effort put into this project. I bought a new house and afterward found I couldn't use any "smart" thermostat aside from ones from Bryant. Those are outside my budget and this software has been perfect for my needs.

My issue is that the /api/zone/1/airhandler page doesn't seem to exist. I'm running v0.2 on a RPi zero (no performance issues so far!). Anytime I try to hit it I get a 404 in response. The main UI is showing the blowerRPM info so I know infinitive is pulling the data. /api/zone/1/config returns a 200 and a son response as expected. Am I missing something simple?

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.