Giter Site home page Giter Site logo

ct-open-source / ct-smart-home Goto Github PK

View Code? Open in Web Editor NEW
166.0 31.0 40.0 158 KB

A ready-to-use Node-RED setup for home automation

Home Page: https://ct.de/smarthome

License: GNU General Public License v2.0

Dockerfile 34.98% Shell 65.02%
nodered smarthome mqtt zigbee2mqtt tado homekit fritzbox bluetooth-low-energy docker raspberrypi raspberrypi-home-automation home-automation node-red mosquitto

ct-smart-home's Introduction

c't-Smart-Home

A ready-to-use Node-RED setup for home automation maintained by german computer magazine c't.

It includes Node-RED, MQTT (provided by Eclipse Mosquitto), Zigbee-Support (provided by zigbee2mqtt).

We also added Node-RED-Nodes for HomeKit, FritzBox, Tado, Bluetooth-LE-Support, Zigbee2Mqtt-Support and a Dashboard.

- - - - - -

Requirements

To get this going you need a working Docker 18.02.0+ setup and docker-compose.

This setup will run on any AMD64 or ARM32v7 Linux machine. This includes virtually any PC or a Raspberry Pi 3 or newer. We also build containers for ARM64v8, ARM32v6 but they are untested. If you want to run the containers on macOS, try running start.sh as root.

If you want to control Zigbee devices you also will need a Zigbee controller stick. Have a look at Zigbee2MQTT's documentation for that.

Getting started

  • Install docker and docker-compose: german article on installation process

  • Clone this repository
    Note: It's also possible to download the latest release from the release tab, but it's not recommended, because then the update mechanism won't work.

  • cd into the folder containing this repos files

  • Run ./start.sh start to setup the data folder needed to run the containers and start them up.
    Note: The Zigbee2mqtt container will only start if a Zigbee-Controller is connected. Make sure to update the adapter to the newest firmware!
    Backup the ./data folder regularly, as it contains all your data and configuration files

  • When you've got "the hang of it" follow the steps listed in the Security section to get a properly secured setup.

Updating

You should make a backup of all files in the ./data folder. If you made changes to files outside of ./data it is imperative to backup those too.

An update via start.sh update will pull the latest release of this repository. This will work for most use cases.

If you made changes to files provided in the repository, you'll have to undo those changes and reapply them. If you're familiar with git use git stash and git stash apply. If you want a specially customized version of this repo, think about forking it.

If you manually downloaded the files from the release tab, you'll have to do the update manually. This takes three steps:

  • Backup your installation

  • Run docker-compose down --remove-orphans

  • Download the new release and overwrite the files in your installation. Or even better: switch to a cloned repository.

  • Run ./start.sh start to start c't-Smart-Home

Configuration

To change configuration of the provided services, either use the corresponding web interfaces or have a look in the ./data folder. There you'll find all the necessary configurations to modify your setup.

How to access the services

After starting the containers you'll reach Node-RED http://docker-host:1880 and the Zigbee administrative interface at http://docker-host:1881. Mosquitto is available on Port 1883 (and 9001 for websockets). You can see more details of the processes output in the container logs with the command docker-compose logs.

Security

Never make c't-Smart-Home available from outside of your network without following these following steps. In any case you should limit the access by enabling password protection!

None of the services are protected by authorization mechanisms by default. This is not optimal, but a compromise to make it easier for beginners. To secure Node-RED have a look at their documentation about "Securing Node-RED". It will show you how to enable a mandatory login.

Zigbee2Mqtts web frontend also provides an authentication mechanism. It's described in their documentation of the frontend.

Mosquitto won't demand a authentication either, but you can enable it in the config file. Just enable the last two lines and run the following command. Be sure to replace USERNAME with your preferred name.

docker run -it -v ${PWD}/data/mqtt/config/passwd:/passwd eclipse-mosquitto mosquitto_passwd /passwd USERNAME

Now restart mosquitto with docker-compose restart mqtt. Your mosquitto server should require authentication via the username/password combination you provided. Don't forget to modify the Zigbee2MQTT configuration and the Node-RED setup. To add more mosquitto users just run the command again.

Additionally you should run c't-Smart-Home behind a reverse proxy like Traefik to ensure all connections are encrypted. Traefik is able to secure not only HTTP, but also generic TCP and UDP connections.

start.sh options

🏡 c't-Smart-Home – setup script
—————————————————————————————
Usage:
start.sh update – to update this copy of the repo
start.sh fix – correct the permissions in the data folder 
start.sh start – run all containers
start.sh stop – stop all containers
start.sh data – set up the data folder needed for the containers, but run none of them. Useful for personalized setups.

Check https://github.com/ct-Open-Source/ct-Smart-Home/ for updates.

Manual start

  • run ./start.sh data to create the necessary folders
  • Use docker-compose up -d to start the containers
  • If you do not want to start Zigbee2mqtt, add the name of the Node-RED container to the docker-compose command: docker-compose up -d nodered. The MQTT container will always be started, because it's a dependency of Node-RED.

Troubleshooting

I've made an update to the system, but now I get errors about "orphaned containers". How do I fix this?

This happens when there are containers running that haven't been defined in the docker-compose.yml. The cause for this might be a failed deployment or that a container was added to or removed from the c't-Smart-Home setup. You can fix this by running docker-compose down --remove-orphans, followed by ./start.sh start.

After the latest update Mosquitto won't accept connections. What is happening?

From version 2.x onward Mosquitto explicitly requires a option to enable anonymous logins. While it is highly recommended to require authentication for Mosquitto, it's okay for a beginner setup and for testing to have no authentication. To reactivate anonymous logins open the file ./data/mqtt/conf/mosquitto.conf and add the line allow_anonymous true. Then run docker-compose restart mqtt.

I can't see any devices in the Zigbee2Mqtt nodes provided by node-red-contrib-zigbee2mqtt.

If you upgrade from an existing installation, you must add homeassistant: true to ./data/zigbee/configuration.yaml.

The Zigbee2Mqtt web-frontend doesn't work for me, but the service is running just fine. Did I miss something?

You probably did an update from an earlier version of c't-Smart-Home to a recent one. You must add a few lines to ./data/zigbee/configuration.yaml. Have a look at their documentation of the frontend. Make sure to set the option port to 1881.

Why doesn't c't-Smart-Home provide a complete setup with HTTPS support for the services. What's the issue?

There is no technical issue. Using a reverse proxy like Traefik works just fine. But this will add an additional level of complexity to the system, and might encourage inexperienced users to put the setup on the open internet for convenience. This is absolutely not recommended.

An experienced user is able to setup Traefik in a short amount of time and will be able to secure the services in a proper way.

I'm trying to use the setup on my NAS, but I can't run the containers

Sadly most NAS vendors use modified versions of Docker that miss some features. You'll possibly have to run the containers manually oder change some options in the docker-compose.yml. We sadly can't provide support for NAS setups due to the varying featureset of their Docker support.

Can I run c't-Smart-Home on a Mac?

You could try, but we don't support it on a Mac.

I'm missing some nodes after an update. What happended?

We probably removed some unnecessary or outdated nodes. Check which are missing and look in the palette for them. Most likely you can reinstall them from there.

Node-RED won't start after an update. The logs show permission errors. How do I fix this?

For security reasons the Node-RED service won't run as root anymore. It now runs with the GID and UID 1000. To fix this issue you must set the GID and UID of data/nodered and all of its content to 1000. You can use start.sh fix to correct those issues.

Container images and Versions

The Node-RED container image is a variation on the official one provided by the Node-RED project. We provide versions based on Node.js versions 10 (Maintenance LTS), 12 (Maintenance LTS) and 14 (Active LTS). See Node.js releases page for support cycles. The container image based on Active LTS will always be the default. You can freely modify your copy of the compose file to use a different container image or even create your own image.

The :latest image is rebuild upon new releases and updated weekly to include updates to Node-RED and the underlying libraries. The :devel images are being rebuilt every night.

Container-Tag Node-RED version Node.js version Notes Arch
Release versions
latest latest release version 12 latest release version all
latest-10 1.x 10 latest release version all
latest-12 1.x 12 latest release version all
latest-14 1.x 14 latest release version all
Development versions
devel latest devel version 14 build from current devel all
devel-10 1.x 10 build from current devel all
devel-12 1.x 12 build from current devel all
devel-14 1.x 14 build from current devel all
Deprecated relases
release-1.1.1-amd64 0.20.5 8 deprecated amd64
release-1.1.1-arm32v7 0.20.5 8 deprecated arm32v7

We also use the :latest versions of Eclipse Mosquitto and Zigbee2mqtt.

The Docker images are hosted on the Docker Hub and on GitHubs Container Registry ghcr.io. The default is to use GitHubs Container Registry, since the rate limits and retention policies of the Docker Hub are possible causes for future issues.

Further information

Articles in c't

This project is described in the German computer magazine c't: https://ct.de/smarthome

Zigbee2mqtt is described here: https://ct.de/ygdp

Documentation

Node-RED documentation

Zigbee2MQTT documentation
(Note: If you use and enjoy the Zigbee service, consider sponsoring Koen Kanters great work!)

Mosquitto documentation

ct-smart-home's People

Contributors

0anton avatar ctandi avatar gnafgnaf avatar jamct avatar jvlker avatar merlinschumacher avatar pinae 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

ct-smart-home's Issues

I down can Load other Bindings

Hello,
I get this error message when I want to install other interfaces.

Failed to load node catalogue.
Check the browser console for more information

I created the container under QNAP with the YAML.
The containers MQTT and ZIGBee were deleted manually.

After that the container is installed in network mode Bridge

issues with serial node or python

Dear experts,

I am facing an issue with serialnode and hope, that you can help me with that. My target is to install node-red-node-serialport (running LaCrosse/ JeeLink) and node-red-contrib-cul (for BusWare CUL stick) but both are failing during installation. I think the relevant entry in log is the following:

1392 verbose stack Error: @serialport/[email protected] install: prebuild-install --tag-prefix @serialport/bindings@ || node-gyp rebuild

Diggering a little bit deeper with executing "npm install serialnode" within the container it seems for me, that the process fails, as no python environment can be found:

gyp ERR! stack Error: Could not find any Python installation to use

Looking into the docker file of this project, I think, that python3 should also be content of this image and container. Also the $PATH variable in the container looks okay.

Can you help me finishing the serial node-installation within the container?

Frontend zigbee2mqtt at port 1881 not working

Hi,
i pulled the actual master (with docker-compose.yml version 3.6) as i´m keen to use the zigbee2mqtt frontend instead of the zigbee2mqttAsisstent.

so, port 1881 is defined in start.sh and in docker-compose.yml but it is not working.

Áctual i can´t find a reason for that (or any log entry hint). Only thing i found is, that the network_mode setting "host" ist back in docker-compose-yml.

Any suggestion for next analyse - step would be very appreciated :-)

best regards

Instructions on running this in kubernetes

Hi

Now that kubernetes is getting into the small end of iot, I'm setting up a kubernetes cluster for home automation and I've been using node red official images for it
Maybe you know maybe not, I'll just put it here for completeness: rancher labs made a stripped down version of k8s called k3s that runs pretty fine on RPIs, check it out
www.k3s.io

Now you guys added a lot of useful modules to node-red that so far I need to add manually to the default image and then re-package it and host it on a personal repo

Have you looked into kubernetes and are you interested in getting it to work?

It could be as easy as modifying the official helm charts to run your image

As the stack for iot gets bigger (node-red, mqtt, influxdb, grafana, home kit, openhab, etc) one RPI is not enough anymore and being able to scale would be beneficial

Mosquitto not starting

I installed the ct-smart-home project as described on a raspberry pi with buster lite.
Mosquitto does not seem to start.
The zigbee2mqtt log says:
error 2019-12-28 18:10:46: Cannot send message: topic: 'zigbee2mqtt/bridge/log', payload: '{"type":"pairing","message":"interview_successful","meta":{"friendly_name":"0x0017880106362a8a","model":"324131092621","vendor":"Philips","description":"Hue dimmer switch","supported":true}}
info 2019-12-28 18:10:46: Configuring '0x0017880106362a8a'
error 2019-12-28 18:10:49: Not connected to MQTT server!
info 2019-12-28 18:10:49: Succesfully configured '0x0017880106362a8a'
error 2019-12-28 18:10:59: Not connected to MQTT server!
error 2019-12-28 18:11:09: Not connected to MQTT server!

Any idea?

Best Regards
Kai

No connection to mqtt and node-red on raspi 2B

Hi all,
I'm new with docker, so I followed the instructions on git-hub step by step. Starting with a Zip-copy of the repository I build up a directory on my raspi. Building the container seems to work, because a "docker ps" shows the status of ctnodered and eclipse-mosquitto as "up".
So I assume, that the images are working - however I fail to open a connection via web browser. I checked a couple of URLs and port without any success (localhost, 172.17.0.0, :1883, :9001).
so at the end the question is: how do I access mqtt and Node-Red ?
I have no external devices via Zigbee etc. connected, at the end I want to read out some values of my heating control over the network via wget.
Some version info:
Docker Version 19.03.6
docker-compose version 1.25.4
Although the project is not brand new I hope for feedback.
Cheers Uli

New status a couple of hours later:
I repeated the procedure from scratch again - but now I started the start.sh script with sudo. After that I checked the container with portainer and now a complete url for node-red is displayed - and it works. So the original problem is resolved, no idea why.
It seems to be essential to create the container as superuser. However it is quite hard to find out the reason of "not working".
Now I will start my trials with node-red.

Rebuild from provided docker-image/Dockerfile fails because of wrong dependencies

I wanted to extend the image by inserting the apk package 'raspberrypi' in order to get utilities for reading eg. the temperature of the raspberrypi 4B (eg. vcgencmd).

Before doing so I tried to rebuild from the docker-image/Dockerfile but get plenty of warnings for deprecated npm packages npm WARN deprecated and builds for the USB module, see full build log below.

Is that not the intended way ?
How do I get the correct package/module dependencies solved ?

I can add the package manually by attaching a bash and enter:

>$ su
>$ apk add --no-cache raspberrypi
>$ exit

Then everything is available under /opt/vc/...

Many thanks in advance

$ docker build -t mynodered  ./docker-image/

Sending build context to Docker daemon   7.68kB
Step 1/9 : FROM nodered/node-red:latest-minimal
latest-minimal: Pulling from nodered/node-red
Digest: sha256:28e8c7d46da71cb10107d562547828228ecfabbe75c541cddb4e86d318403a2b
Status: Downloaded newer image for nodered/node-red:latest-minimal
 ---> 7e5c5b05d0b4
Step 2/9 : COPY entrypoint.sh /usr/src/node-red/entrypoint.sh
 ---> fe13e683f15b
Step 3/9 : WORKDIR /usr/src/node-red
 ---> Running in 7171ca8cf0b5
Removing intermediate container 7171ca8cf0b5
 ---> da125b80ead8
Step 4/9 : USER root
 ---> Running in de8b44e4f5aa
Removing intermediate container de8b44e4f5aa
 ---> bd0379cbe54c
Step 5/9 : RUN set -ex 	&& apk add --no-cache 	  avahi-compat-libdns_sd 	  dbus 	  libcap 	  python 	&& apk add --no-cache --virtual dev-packages 	  make 	  g++ 	  avahi-dev 	  eudev 	  eudev-dev 	  bluez-dev 	  build-base 	  linux-headers           raspberrypi 	  udev 	&& setcap cap_net_raw+eip $(eval readlink -f `which node`) 	&& chown messagebus:messagebus /var/run/dbus 	&& chown avahi:avahi /var/run/avahi-daemon 	&& sed -i "s/#enable-dbus=yes/enable-dbus=yes/g" /etc/avahi/avahi-daemon.conf 	&& dbus-uuidgen --ensure 	&& npm install node-red-contrib-fritz node-red-contrib-homekit-bridged node-red-contrib-tado-client node-red-dashboard node-red-node-base64 node-red-node-msgpack node-red-node-random node-red-node-suncalc @rdmtc/node-red-contrib-noble --unsafe-perm 	&& apk del dev-packages 	&& npm dedupe 	&& npm cache clean --force
 ---> Running in 97132ed9b56e
+ apk add --no-cache avahi-compat-libdns_sd dbus libcap python
fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/main/armv7/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/community/armv7/APKINDEX.tar.gz
(1/10) Installing dbus-libs (1.12.16-r2)
(2/10) Installing libintl (0.20.1-r2)
(3/10) Installing avahi-libs (0.7-r4)
(4/10) Installing avahi-compat-libdns_sd (0.7-r4)
(5/10) Installing dbus (1.12.16-r2)
Executing dbus-1.12.16-r2.pre-install
(6/10) Installing libbz2 (1.0.8-r1)
(7/10) Installing libffi (3.2.1-r6)
(8/10) Installing gdbm (1.13-r1)
(9/10) Installing sqlite-libs (3.30.1-r1)
(10/10) Installing python2 (2.7.16-r3)
Executing busybox-1.31.1-r9.trigger
OK: 69 MiB in 46 packages
+ apk add --no-cache --virtual dev-packages make g++ avahi-dev eudev eudev-dev bluez-dev build-base linux-headers raspberrypi udev
fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/main/armv7/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/community/armv7/APKINDEX.tar.gz
(1/64) Upgrading musl (1.1.24-r0 -> 1.1.24-r1)
(2/64) Installing make (4.2.1-r2)
(3/64) Installing binutils (2.33.1-r0)
(4/64) Installing gmp (6.1.2-r1)
(5/64) Installing isl (0.18-r0)
(6/64) Installing libgomp (9.2.0-r3)
(7/64) Installing libatomic (9.2.0-r3)
(8/64) Installing mpfr4 (4.0.2-r1)
(9/64) Installing mpc1 (1.1.0-r1)
(10/64) Installing gcc (9.2.0-r3)
(11/64) Installing musl-dev (1.1.24-r1)
(12/64) Installing libc-dev (0.7.2-r0)
(13/64) Installing g++ (9.2.0-r3)
(14/64) Installing gdbm-dev (1.13-r1)
(15/64) Installing avahi-compat-howl (0.7-r4)
(16/64) Installing libblkid (2.34-r1)
(17/64) Installing libmount (2.34-r1)
(18/64) Installing pcre (8.43-r0)
(19/64) Installing glib (2.62.5-r0)
(20/64) Installing avahi-glib (0.7-r4)
(21/64) Installing libdaemon (0.14-r2)
(22/64) Installing avahi (0.7-r4)
Executing avahi-0.7-r4.pre-install
(23/64) Installing xz-libs (5.2.4-r0)
(24/64) Installing python3 (3.8.2-r0)
(25/64) Installing gettext-asprintf (0.20.1-r2)
(26/64) Installing libunistring (0.9.10-r0)
(27/64) Installing gettext-libs (0.20.1-r2)
(28/64) Installing libxml2 (2.9.10-r2)
(29/64) Installing gettext (0.20.1-r2)
(30/64) Installing gettext-dev (0.20.1-r2)
(31/64) Installing bzip2-dev (1.0.8-r1)
(32/64) Installing libxml2-utils (2.9.10-r2)
(33/64) Installing libgpg-error (1.36-r2)
(34/64) Installing libgcrypt (1.8.5-r0)
(35/64) Installing libxslt (1.1.34-r0)
(36/64) Installing docbook-xml (4.5-r6)
Executing docbook-xml-4.5-r6.post-install
(37/64) Installing docbook-xsl (1.79.2-r2)
Executing docbook-xsl-1.79.2-r2.post-install
(38/64) Installing linux-headers (4.19.36-r0)
(39/64) Installing pkgconf (1.6.3-r0)
(40/64) Installing libffi-dev (3.2.1-r6)
(41/64) Installing libpcre16 (8.43-r0)
(42/64) Installing libpcre32 (8.43-r0)
(43/64) Installing libpcrecpp (8.43-r0)
(44/64) Installing pcre-dev (8.43-r0)
(45/64) Installing libuuid (2.34-r1)
(46/64) Installing libfdisk (2.34-r1)
(47/64) Installing libsmartcols (2.34-r1)
(48/64) Installing util-linux-dev (2.34-r1)
(49/64) Installing zlib-dev (1.2.11-r3)
(50/64) Installing glib-dev (2.62.5-r0)
(51/64) Installing avahi-dev (0.7-r4)
(52/64) Installing udev-init-scripts (33-r0)
Executing udev-init-scripts-33-r0.post-install
(53/64) Installing eudev-libs (3.2.9-r1)
(54/64) Installing kmod (26-r0)
(55/64) Installing eudev (3.2.9-r1)
(56/64) Installing eudev-dev (3.2.9-r1)
(57/64) Installing bluez-libs (5.52-r0)
(58/64) Installing bluez-dev (5.52-r0)
(59/64) Installing file (5.37-r1)
(60/64) Installing fortify-headers (1.1-r0)
(61/64) Installing build-base (0.5-r1)
(62/64) Installing raspberrypi-libs (0.20190416-r1)
(63/64) Installing raspberrypi (0.20190416-r1)
(64/64) Installing dev-packages (20200317.141848)
Executing busybox-1.31.1-r9.trigger
Executing dbus-1.12.16-r2.trigger
Executing glib-2.62.5-r0.trigger
No schema files found: doing nothing.
Executing eudev-3.2.9-r1.trigger
OK: 279 MiB in 109 packages
+ which node
+ eval readlink -f /usr/local/bin/node
+ readlink -f /usr/local/bin/node
+ setcap cap_net_raw+eip /usr/local/bin/node
+ chown messagebus:messagebus /var/run/dbus
+ chown avahi:avahi /var/run/avahi-daemon
+ sed -i 's/#enable-dbus=yes/enable-dbus=yes/g' /etc/avahi/avahi-daemon.conf
+ dbus-uuidgen --ensure
+ npm install node-red-contrib-fritz node-red-contrib-homekit-bridged node-red-contrib-tado-client node-red-dashboard node-red-node-base64 node-red-node-msgpack node-red-node-random node-red-node-suncalc @rdmtc/node-red-contrib-noble --unsafe-perm
npm WARN deprecated [email protected]: simple-oauth2 v2 is no longer supported. Please upgrade to v3 for further support
npm WARN deprecated [email protected]: This module has moved and is now available at @hapi/wreck. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.
npm WARN deprecated [email protected]: This module has moved and is now available at @hapi/boom. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.
npm WARN deprecated [email protected]: This module has moved and is now available at @hapi/hoek. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.
npm WARN deprecated [email protected]: This module has moved and is now available at @hapi/bourne. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.

> [email protected] install /usr/src/node-red/node_modules/usb
> prebuild-install --verbose || node-gyp rebuild

prebuild-install info begin Prebuild-install version 5.3.3
prebuild-install info looking for cached prebuild @ /root/.npm/_prebuilds/9e6864-usb-v1.6.2-node-v64-linuxmusl-arm.tar.gz
prebuild-install http request GET https://github.com/tessel/node-usb/releases/download/v1.6.2/usb-v1.6.2-node-v64-linuxmusl-arm.tar.gz
prebuild-install http 404 https://github.com/tessel/node-usb/releases/download/v1.6.2/usb-v1.6.2-node-v64-linuxmusl-arm.tar.gz
prebuild-install WARN install No prebuilt binaries found (target=10.19.0 runtime=node arch=arm libc=musl platform=linux)
make: Entering directory '/usr/src/node-red/node_modules/usb/build'
  CC(target) Release/obj.target/libusb/libusb/libusb/core.o
  CC(target) Release/obj.target/libusb/libusb/libusb/descriptor.o
  CC(target) Release/obj.target/libusb/libusb/libusb/hotplug.o
  CC(target) Release/obj.target/libusb/libusb/libusb/io.o
  CC(target) Release/obj.target/libusb/libusb/libusb/strerror.o
  CC(target) Release/obj.target/libusb/libusb/libusb/sync.o
  CC(target) Release/obj.target/libusb/libusb/libusb/os/poll_posix.o
  CC(target) Release/obj.target/libusb/libusb/libusb/os/threads_posix.o
  CC(target) Release/obj.target/libusb/libusb/libusb/os/linux_usbfs.o
  CC(target) Release/obj.target/libusb/libusb/libusb/os/linux_udev.o
  AR(target) Release/obj.target/usb.a
  COPY Release/usb.a
  CXX(target) Release/obj.target/usb_bindings/src/node_usb.o
In file included from ../src/helpers.h:3,
                 from ../src/node_usb.h:21,
                 from ../src/node_usb.cc:1:
../../nan/nan.h: In function 'void Nan::AsyncQueueWorker(Nan::AsyncWorker*)':
../../nan/nan.h:2232:62: warning: cast between incompatible function types from 'void (*)(uv_work_t*)' {aka 'void (*)(uv_work_s*)'} to 'uv_after_work_cb' {aka 'void (*)(uv_work_s*, int)'} [-Wcast-function-type]
 2232 |     , reinterpret_cast<uv_after_work_cb>(AsyncExecuteComplete)
      |                                                              ^
In file included from ../src/node_usb.h:14,
                 from ../src/node_usb.cc:1:
../src/node_usb.cc: At global scope:
/root/.cache/node-gyp/10.19.0/include/node/node.h:573:43: warning: cast between incompatible function types from 'void (*)(v8::Local<v8::Object>)' to 'node::addon_register_func' {aka 'void (*)(v8::Local<v8::Object>, v8::Local<v8::Value>, void*)'} [-Wcast-function-type]
  573 |       (node::addon_register_func) (regfunc),                          \
      |                                           ^
/root/.cache/node-gyp/10.19.0/include/node/node.h:607:3: note: in expansion of macro 'NODE_MODULE_X'
  607 |   NODE_MODULE_X(modname, regfunc, NULL, 0)  // NOLINT (readability/null_usage)
      |   ^~~~~~~~~~~~~
../src/node_usb.cc:95:1: note: in expansion of macro 'NODE_MODULE'
   95 | NODE_MODULE(usb_bindings, Initialize)
      | ^~~~~~~~~~~
../src/node_usb.cc: In function 'void handleHotplug(std::pair<libusb_device*, libusb_hotplug_event>)':
../src/node_usb.cc:151:58: warning: 'v8::Local<v8::Value> Nan::MakeCallback(v8::Local<v8::Object>, const char*, int, v8::Local<v8::Value>*)' is deprecated [-Wdeprecated-declarations]
  151 |  Nan::MakeCallback(Nan::New(hotplugThis), "emit", 2, argv);
      |                                                          ^
In file included from ../src/helpers.h:3,
                 from ../src/node_usb.h:21,
                 from ../src/node_usb.cc:1:
../../nan/nan.h:1001:46: note: declared here
 1001 |   NAN_DEPRECATED inline v8::Local<v8::Value> MakeCallback(
      |                                              ^~~~~~~~~~~~
../src/node_usb.cc:151:58: warning: 'v8::Local<v8::Value> Nan::MakeCallback(v8::Local<v8::Object>, const char*, int, v8::Local<v8::Value>*)' is deprecated [-Wdeprecated-declarations]
  151 |  Nan::MakeCallback(Nan::New(hotplugThis), "emit", 2, argv);
      |                                                          ^
In file included from ../src/helpers.h:3,
                 from ../src/node_usb.h:21,
                 from ../src/node_usb.cc:1:
../../nan/nan.h:1001:46: note: declared here
 1001 |   NAN_DEPRECATED inline v8::Local<v8::Value> MakeCallback(
      |                                              ^~~~~~~~~~~~
In file included from ../src/node_usb.h:12,
                 from ../src/node_usb.cc:1:
/root/.cache/node-gyp/10.19.0/include/node/v8.h: In instantiation of 'void v8::PersistentBase<T>::SetWeak(P*, typename v8::WeakCallbackInfo<P>::Callback, v8::WeakCallbackType) [with P = node::ObjectWrap; T = v8::Object; typename v8::WeakCallbackInfo<P>::Callback = void (*)(const v8::WeakCallbackInfo<node::ObjectWrap>&)]':
/root/.cache/node-gyp/10.19.0/include/node/node_object_wrap.h:84:78:   required from here
/root/.cache/node-gyp/10.19.0/include/node/v8.h:9502:16: warning: cast between incompatible function types from 'v8::WeakCallbackInfo<node::ObjectWrap>::Callback' {aka 'void (*)(const v8::WeakCallbackInfo<node::ObjectWrap>&)'} to 'Callback' {aka 'void (*)(const v8::WeakCallbackInfo<void>&)'} [-Wcast-function-type]
 9502 |                reinterpret_cast<Callback>(callback), type);
      |                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/root/.cache/node-gyp/10.19.0/include/node/v8.h: In instantiation of 'void v8::PersistentBase<T>::SetWeak(P*, typename v8::WeakCallbackInfo<P>::Callback, v8::WeakCallbackType) [with P = Nan::ObjectWrap; T = v8::Object; typename v8::WeakCallbackInfo<P>::Callback = void (*)(const v8::WeakCallbackInfo<Nan::ObjectWrap>&)]':
../../nan/nan_object_wrap.h:65:61:   required from here
/root/.cache/node-gyp/10.19.0/include/node/v8.h:9502:16: warning: cast between incompatible function types from 'v8::WeakCallbackInfo<Nan::ObjectWrap>::Callback' {aka 'void (*)(const v8::WeakCallbackInfo<Nan::ObjectWrap>&)'} to 'Callback' {aka 'void (*)(const v8::WeakCallbackInfo<void>&)'} [-Wcast-function-type]
  CXX(target) Release/obj.target/usb_bindings/src/device.o
In file included from ../src/helpers.h:3,
                 from ../src/node_usb.h:21,
                 from ../src/device.cc:1:
../../nan/nan.h: In function 'void Nan::AsyncQueueWorker(Nan::AsyncWorker*)':
../../nan/nan.h:2232:62: warning: cast between incompatible function types from 'void (*)(uv_work_t*)' {aka 'void (*)(uv_work_s*)'} to 'uv_after_work_cb' {aka 'void (*)(uv_work_s*, int)'} [-Wcast-function-type]
 2232 |     , reinterpret_cast<uv_after_work_cb>(AsyncExecuteComplete)
      |                                                              ^
../src/device.cc: In member function 'void Req::submit(Device*, v8::Local<v8::Function>, uv_work_cb, uv_work_cb)':
../src/device.cc:220:70: warning: cast between incompatible function types from 'uv_work_cb' {aka 'void (*)(uv_work_s*)'} to 'uv_after_work_cb' {aka 'void (*)(uv_work_s*, int)'} [-Wcast-function-type]
  220 |   uv_queue_work(uv_default_loop(), &req, backend, (uv_after_work_cb) after);
      |                                                                      ^~~~~
../src/device.cc: In static member function 'static void Req::default_after(uv_work_t*)':
../src/device.cc:237:64: warning: 'v8::Local<v8::Value> Nan::MakeCallback(v8::Local<v8::Object>, v8::Local<v8::Function>, int, v8::Local<v8::Value>*)' is deprecated [-Wdeprecated-declarations]
  237 |    Nan::MakeCallback(device, Nan::New(baton->callback), 1, argv);
      |                                                                ^
In file included from ../src/helpers.h:3,
                 from ../src/node_usb.h:21,
                 from ../src/device.cc:1:
../../nan/nan.h:959:46: note: declared here
  959 |   NAN_DEPRECATED inline v8::Local<v8::Value> MakeCallback(
      |                                              ^~~~~~~~~~~~
../src/device.cc:237:64: warning: 'v8::Local<v8::Value> Nan::MakeCallback(v8::Local<v8::Object>, v8::Local<v8::Function>, int, v8::Local<v8::Value>*)' is deprecated [-Wdeprecated-declarations]
  237 |    Nan::MakeCallback(device, Nan::New(baton->callback), 1, argv);
      |                                                                ^
In file included from ../src/helpers.h:3,
                 from ../src/node_usb.h:21,
                 from ../src/device.cc:1:
../../nan/nan.h:959:46: note: declared here
  959 |   NAN_DEPRECATED inline v8::Local<v8::Value> MakeCallback(
      |                                              ^~~~~~~~~~~~
In file included from ../src/node_usb.h:12,
                 from ../src/device.cc:1:
/root/.cache/node-gyp/10.19.0/include/node/v8.h: In instantiation of 'void v8::PersistentBase<T>::SetWeak(P*, typename v8::WeakCallbackInfo<P>::Callback, v8::WeakCallbackType) [with P = node::ObjectWrap; T = v8::Object; typename v8::WeakCallbackInfo<P>::Callback = void (*)(const v8::WeakCallbackInfo<node::ObjectWrap>&)]':
/root/.cache/node-gyp/10.19.0/include/node/node_object_wrap.h:84:78:   required from here
/root/.cache/node-gyp/10.19.0/include/node/v8.h:9502:16: warning: cast between incompatible function types from 'v8::WeakCallbackInfo<node::ObjectWrap>::Callback' {aka 'void (*)(const v8::WeakCallbackInfo<node::ObjectWrap>&)'} to 'Callback' {aka 'void (*)(const v8::WeakCallbackInfo<void>&)'} [-Wcast-function-type]
 9502 |                reinterpret_cast<Callback>(callback), type);
      |                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/root/.cache/node-gyp/10.19.0/include/node/v8.h: In instantiation of 'void v8::PersistentBase<T>::SetWeak(P*, typename v8::WeakCallbackInfo<P>::Callback, v8::WeakCallbackType) [with P = Nan::ObjectWrap; T = v8::Object; typename v8::WeakCallbackInfo<P>::Callback = void (*)(const v8::WeakCallbackInfo<Nan::ObjectWrap>&)]':
../../nan/nan_object_wrap.h:65:61:   required from here
/root/.cache/node-gyp/10.19.0/include/node/v8.h:9502:16: warning: cast between incompatible function types from 'v8::WeakCallbackInfo<Nan::ObjectWrap>::Callback' {aka 'void (*)(const v8::WeakCallbackInfo<Nan::ObjectWrap>&)'} to 'Callback' {aka 'void (*)(const v8::WeakCallbackInfo<void>&)'} [-Wcast-function-type]
  CXX(target) Release/obj.target/usb_bindings/src/transfer.o
In file included from ../src/helpers.h:3,
                 from ../src/node_usb.h:21,
                 from ../src/transfer.cc:1:
../../nan/nan.h: In function 'void Nan::AsyncQueueWorker(Nan::AsyncWorker*)':
../../nan/nan.h:2232:62: warning: cast between incompatible function types from 'void (*)(uv_work_t*)' {aka 'void (*)(uv_work_s*)'} to 'uv_after_work_cb' {aka 'void (*)(uv_work_s*, int)'} [-Wcast-function-type]
 2232 |     , reinterpret_cast<uv_after_work_cb>(AsyncExecuteComplete)
      |                                                              ^
../src/transfer.cc: In function 'void handleCompletion(Transfer*)':
../src/transfer.cc:126:72: warning: 'v8::Local<v8::Value> Nan::MakeCallback(v8::Local<v8::Object>, v8::Local<v8::Function>, int, v8::Local<v8::Value>*)' is deprecated [-Wdeprecated-declarations]
  126 |   Nan::MakeCallback(self->handle(), Nan::New(self->v8callback), 3, argv);
      |                                                                        ^
In file included from ../src/helpers.h:3,
                 from ../src/node_usb.h:21,
                 from ../src/transfer.cc:1:
../../nan/nan.h:959:46: note: declared here
  959 |   NAN_DEPRECATED inline v8::Local<v8::Value> MakeCallback(
      |                                              ^~~~~~~~~~~~
../src/transfer.cc:126:72: warning: 'v8::Local<v8::Value> Nan::MakeCallback(v8::Local<v8::Object>, v8::Local<v8::Function>, int, v8::Local<v8::Value>*)' is deprecated [-Wdeprecated-declarations]
  126 |   Nan::MakeCallback(self->handle(), Nan::New(self->v8callback), 3, argv);
      |                                                                        ^
In file included from ../src/helpers.h:3,
                 from ../src/node_usb.h:21,
                 from ../src/transfer.cc:1:
../../nan/nan.h:959:46: note: declared here
  959 |   NAN_DEPRECATED inline v8::Local<v8::Value> MakeCallback(
      |                                              ^~~~~~~~~~~~
In file included from ../src/node_usb.h:12,
                 from ../src/transfer.cc:1:
/root/.cache/node-gyp/10.19.0/include/node/v8.h: In instantiation of 'void v8::PersistentBase<T>::SetWeak(P*, typename v8::WeakCallbackInfo<P>::Callback, v8::WeakCallbackType) [with P = node::ObjectWrap; T = v8::Object; typename v8::WeakCallbackInfo<P>::Callback = void (*)(const v8::WeakCallbackInfo<node::ObjectWrap>&)]':
/root/.cache/node-gyp/10.19.0/include/node/node_object_wrap.h:84:78:   required from here
/root/.cache/node-gyp/10.19.0/include/node/v8.h:9502:16: warning: cast between incompatible function types from 'v8::WeakCallbackInfo<node::ObjectWrap>::Callback' {aka 'void (*)(const v8::WeakCallbackInfo<node::ObjectWrap>&)'} to 'Callback' {aka 'void (*)(const v8::WeakCallbackInfo<void>&)'} [-Wcast-function-type]
 9502 |                reinterpret_cast<Callback>(callback), type);
      |                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/root/.cache/node-gyp/10.19.0/include/node/v8.h: In instantiation of 'void v8::PersistentBase<T>::SetWeak(P*, typename v8::WeakCallbackInfo<P>::Callback, v8::WeakCallbackType) [with P = Nan::ObjectWrap; T = v8::Object; typename v8::WeakCallbackInfo<P>::Callback = void (*)(const v8::WeakCallbackInfo<Nan::ObjectWrap>&)]':
../../nan/nan_object_wrap.h:65:61:   required from here
/root/.cache/node-gyp/10.19.0/include/node/v8.h:9502:16: warning: cast between incompatible function types from 'v8::WeakCallbackInfo<Nan::ObjectWrap>::Callback' {aka 'void (*)(const v8::WeakCallbackInfo<Nan::ObjectWrap>&)'} to 'Callback' {aka 'void (*)(const v8::WeakCallbackInfo<void>&)'} [-Wcast-function-type]
  SOLINK_MODULE(target) Release/obj.target/usb_bindings.node
  COPY Release/usb_bindings.node
make: Leaving directory '/usr/src/node-red/node_modules/usb/build'

> @abandonware/[email protected] install /usr/src/node-red/node_modules/@abandonware/bluetooth-hci-socket
> node-pre-gyp install --fallback-to-build

node-pre-gyp WARN Using request for node-pre-gyp https download 
node-pre-gyp WARN Tried to download(404): https://github.com/abandonware/node-bluetooth-hci-socket/releases/download/0.5.3-5/binding-0.5.3-5-node-v64-linux-arm.tar.gz 
node-pre-gyp WARN Pre-built binaries not found for @abandonware/[email protected] and [email protected] (node-v64 ABI, musl) (falling back to source compile with node-gyp) 
make: Entering directory '/usr/src/node-red/node_modules/@abandonware/bluetooth-hci-socket/build'
  CXX(target) Release/obj.target/binding/src/BluetoothHciSocket.o
In file included from ../src/BluetoothHciSocket.cpp:8:
../node_modules/nan/nan.h: In function 'void Nan::AsyncQueueWorker(Nan::AsyncWorker*)':
../node_modules/nan/nan.h:2298:62: warning: cast between incompatible function types from 'void (*)(uv_work_t*)' {aka 'void (*)(uv_work_s*)'} to 'uv_after_work_cb' {aka 'void (*)(uv_work_s*, int)'} [-Wcast-function-type]
 2298 |     , reinterpret_cast<uv_after_work_cb>(AsyncExecuteComplete)
      |                                                              ^
In file included from /root/.cache/node-gyp/10.19.0/include/node/node_buffer.h:25,
                 from ../src/BluetoothHciSocket.cpp:7:
../src/BluetoothHciSocket.cpp: At global scope:
/root/.cache/node-gyp/10.19.0/include/node/node.h:573:43: warning: cast between incompatible function types from 'void (*)(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE)' {aka 'void (*)(v8::Local<v8::Object>)'} to 'node::addon_register_func' {aka 'void (*)(v8::Local<v8::Object>, v8::Local<v8::Value>, void*)'} [-Wcast-function-type]
  573 |       (node::addon_register_func) (regfunc),                          \
      |                                           ^
/root/.cache/node-gyp/10.19.0/include/node/node.h:607:3: note: in expansion of macro 'NODE_MODULE_X'
  607 |   NODE_MODULE_X(modname, regfunc, NULL, 0)  // NOLINT (readability/null_usage)
      |   ^~~~~~~~~~~~~
../src/BluetoothHciSocket.cpp:578:1: note: in expansion of macro 'NODE_MODULE'
  578 | NODE_MODULE(binding, BluetoothHciSocket::Init);
      | ^~~~~~~~~~~
In file included from /root/.cache/node-gyp/10.19.0/include/node/node.h:63,
                 from /root/.cache/node-gyp/10.19.0/include/node/node_buffer.h:25,
                 from ../src/BluetoothHciSocket.cpp:7:
/root/.cache/node-gyp/10.19.0/include/node/v8.h: In instantiation of 'void v8::PersistentBase<T>::SetWeak(P*, typename v8::WeakCallbackInfo<P>::Callback, v8::WeakCallbackType) [with P = node::ObjectWrap; T = v8::Object; typename v8::WeakCallbackInfo<P>::Callback = void (*)(const v8::WeakCallbackInfo<node::ObjectWrap>&)]':
/root/.cache/node-gyp/10.19.0/include/node/node_object_wrap.h:84:78:   required from here
/root/.cache/node-gyp/10.19.0/include/node/v8.h:9502:16: warning: cast between incompatible function types from 'v8::WeakCallbackInfo<node::ObjectWrap>::Callback' {aka 'void (*)(const v8::WeakCallbackInfo<node::ObjectWrap>&)'} to 'Callback' {aka 'void (*)(const v8::WeakCallbackInfo<void>&)'} [-Wcast-function-type]
 9502 |                reinterpret_cast<Callback>(callback), type);
      |                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/root/.cache/node-gyp/10.19.0/include/node/v8.h: In instantiation of 'void v8::PersistentBase<T>::SetWeak(P*, typename v8::WeakCallbackInfo<P>::Callback, v8::WeakCallbackType) [with P = Nan::ObjectWrap; T = v8::Object; typename v8::WeakCallbackInfo<P>::Callback = void (*)(const v8::WeakCallbackInfo<Nan::ObjectWrap>&)]':
../node_modules/nan/nan_object_wrap.h:65:61:   required from here
/root/.cache/node-gyp/10.19.0/include/node/v8.h:9502:16: warning: cast between incompatible function types from 'v8::WeakCallbackInfo<Nan::ObjectWrap>::Callback' {aka 'void (*)(const v8::WeakCallbackInfo<Nan::ObjectWrap>&)'} to 'Callback' {aka 'void (*)(const v8::WeakCallbackInfo<void>&)'} [-Wcast-function-type]
  SOLINK_MODULE(target) Release/obj.target/binding.node
  COPY Release/binding.node
  COPY /usr/src/node-red/node_modules/@abandonware/bluetooth-hci-socket/lib/binding/binding.node
  TOUCH Release/obj.target/action_after_build.stamp
make: Leaving directory '/usr/src/node-red/node_modules/@abandonware/bluetooth-hci-socket/build'

> @abandonware/[email protected] install /usr/src/node-red/node_modules/@abandonware/noble
> node-gyp rebuild

make: Entering directory '/usr/src/node-red/node_modules/@abandonware/noble/build'
  SOLINK_MODULE(target) Release/obj.target/noble.node
  COPY Release/noble.node
make: Leaving directory '/usr/src/node-red/node_modules/@abandonware/noble/build'
npm notice created a lockfile as package-lock.json. You should commit this file.
+ [email protected]
+ [email protected]
+ [email protected]
+ [email protected]
+ [email protected]
+ [email protected]
+ [email protected]
+ [email protected]
+ @rdmtc/[email protected]
added 156 packages from 221 contributors in 64.99s

15 packages are looking for funding
  run `npm fund` for details

+ apk del dev-packages
WARNING: Ignoring APKINDEX.70f61090.tar.gz: No such file or directory
WARNING: Ignoring APKINDEX.ca2fea5b.tar.gz: No such file or directory
(1/63) Purging dev-packages (20200317.141848)
(2/63) Purging avahi-dev (0.7-r4)
(3/63) Purging gdbm-dev (1.13-r1)
(4/63) Purging avahi-compat-howl (0.7-r4)
(5/63) Purging avahi-glib (0.7-r4)
(6/63) Purging avahi (0.7-r4)
(7/63) Purging eudev-dev (3.2.9-r1)
(8/63) Purging bluez-dev (5.52-r0)
(9/63) Purging bluez-libs (5.52-r0)
(10/63) Purging build-base (0.5-r1)
(11/63) Purging file (5.37-r1)
(12/63) Purging g++ (9.2.0-r3)
(13/63) Purging gcc (9.2.0-r3)
(14/63) Purging binutils (2.33.1-r0)
(15/63) Purging libatomic (9.2.0-r3)
(16/63) Purging make (4.2.1-r2)
(17/63) Purging libc-dev (0.7.2-r0)
(18/63) Purging musl-dev (1.1.24-r1)
(19/63) Purging fortify-headers (1.1-r0)
(20/63) Purging raspberrypi (0.20190416-r1)
(21/63) Purging isl (0.18-r0)
(22/63) Purging mpc1 (1.1.0-r1)
(23/63) Purging mpfr4 (4.0.2-r1)
(24/63) Purging gmp (6.1.2-r1)
(25/63) Purging glib-dev (2.62.5-r0)
(26/63) Purging python3 (3.8.2-r0)
(27/63) Purging bzip2-dev (1.0.8-r1)
(28/63) Purging docbook-xsl (1.79.2-r2)
Executing docbook-xsl-1.79.2-r2.post-deinstall
(29/63) Purging libxslt (1.1.34-r0)
(30/63) Purging docbook-xml (4.5-r6)
Executing docbook-xml-4.5-r6.post-deinstall
(31/63) Purging libxml2-utils (2.9.10-r2)
(32/63) Purging gettext-dev (0.20.1-r2)
(33/63) Purging gettext-asprintf (0.20.1-r2)
(34/63) Purging gettext (0.20.1-r2)
(35/63) Purging libgomp (9.2.0-r3)
(36/63) Purging util-linux-dev (2.34-r1)
(37/63) Purging libfdisk (2.34-r1)
(38/63) Purging libsmartcols (2.34-r1)
(39/63) Purging libuuid (2.34-r1)
(40/63) Purging eudev (3.2.9-r1)
(41/63) Purging udev-init-scripts (33-r0)
(42/63) Purging eudev-libs (3.2.9-r1)
(43/63) Purging glib (2.62.5-r0)
(44/63) Purging libmount (2.34-r1)
(45/63) Purging libblkid (2.34-r1)
(46/63) Purging pcre-dev (8.43-r0)
(47/63) Purging libpcre16 (8.43-r0)
(48/63) Purging libpcre32 (8.43-r0)
(49/63) Purging libpcrecpp (8.43-r0)
(50/63) Purging pcre (8.43-r0)
(51/63) Purging libdaemon (0.14-r2)
(52/63) Purging kmod (26-r0)
(53/63) Purging libxml2 (2.9.10-r2)
(54/63) Purging xz-libs (5.2.4-r0)
(55/63) Purging gettext-libs (0.20.1-r2)
(56/63) Purging libunistring (0.9.10-r0)
(57/63) Purging libgcrypt (1.8.5-r0)
(58/63) Purging libgpg-error (1.36-r2)
(59/63) Purging libffi-dev (3.2.1-r6)
(60/63) Purging linux-headers (4.19.36-r0)
(61/63) Purging zlib-dev (1.2.11-r3)
(62/63) Purging pkgconf (1.6.3-r0)
(63/63) Purging raspberrypi-libs (0.20190416-r1)
Executing busybox-1.31.1-r9.trigger
Executing dbus-1.12.16-r2.trigger
OK: 69 MiB in 46 packages
+ npm dedupe
audited 1904 packages in 4.535s

15 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

+ npm cache clean --force
npm WARN using --force I sure hope you know what you are doing.
Removing intermediate container 97132ed9b56e
 ---> fc3a5be4b8d3
Step 6/9 : RUN	sed -ie "s/'noble'/'@abandonware\/noble'/" node_modules/@rdmtc/node-red-contrib-noble/noble/node-red-contrib-noble.js
 ---> Running in 323380c4d67f
Removing intermediate container 323380c4d67f
 ---> 4a9086ea5a11
Step 7/9 : VOLUME /data
 ---> Running in d800093feaef
Removing intermediate container d800093feaef
 ---> b78257209e97
Step 8/9 : EXPOSE 1880
 ---> Running in 795c70612ff3
Removing intermediate container 795c70612ff3
 ---> 782eac335132
Step 9/9 : CMD ["/bin/sh", "/usr/src/node-red/entrypoint.sh" ]
 ---> Running in ded43ba252dc
Removing intermediate container ded43ba252dc
 ---> 5342062c9136
Successfully built 5342062c9136
Successfully tagged mynodered:latest

> ./start.sh start didn't find existing data

Hi,

I did an ./start.sh update on an existing installation.

Now with each ./start.sh start I get es new zigbee encryption key ...

------cut

pi@pi3:~/ct-Smart-Home $ ./start.sh start
data folder is missing. creating it
touch: 'data/mqtt/config/mosquitto.conf' kann nicht berührt werden: Keine Berechtigung
Zigbee2Mqtt configuration is missing. creating it.

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
This is your random Zigbee encryption key:

[0x22, 0x3d, 0x51, 0x25, 0x86, 0x3c, 0xc4, 0xf4, 0xe5, 0x47, 0xe1, 0x30, 0xfc, 0x14, 0xc2, 0x3c]

Store it safely or you will have to repair all of your devices.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Persistence with Mosquitto

It seems to be quite simple to add persistence to mosquitto. Simply add
persistence true
persistence_location /mosquitto/data
to data/mqtt/config/mosquitto.conf.

But - that doesn't work.
The reason is, that /mosquitto/data isn't mounted to data/mqtt/data, as one could expect.
You have to add

mqtt:
    volumes:
      - ./data/mqtt/data:/mosquitto/data

explicitly to the docker-compose.yml. Only then the persistence is really persistent.

Error executing vcgencmd with package node-red-contrib-vcgencmd

I'm running the project on my Pi4 and installed the node-red package node-red-contrib-vcgencmd in order to access the Pi's temperature measure. The installation was successful and the nodes are available:

Bildschirmfoto 2021-02-27 um 18 50 47

Additionally the container requires the apk package raspberrypi to be installed via:
apk add --no-cache raspberrypi

and the compose file amended with

    devices:
      - /dev/vchiq:/dev/vchiq

However, an error is raised in the debug messages :
Error executing /opt/vc/bin/vcgencmd : Error: Command failed: /opt/vc/bin/vcgencmd measure_temp

With the base images nodered/node-red (node 10) and nodered/node-red:latest-12 it works out of the box.
FROM nodered/node-red
or
FROM nodered/node-red:latest-12

Do you have any ideas why this is happening ?
Any special setup of the ghcr.io/ct-open-source/ctnodered:latest image which prevent vcgencmd to be executed correctly ?

No connection to Mosquitto Mqtt possible -> timeout

Dear all,

after updating, mqtt service cannot be connected any more, neither internally (node-red/Zigbee2Mqtt) nor externally (e.g. MQTTool). Log:
mqtt_1 | 0: New connection from 172.19.0.2 on port 1883.
mqtt_1 | 0: Client has exceeded timeout, disconnecting.

And yes: allow_anonymous true
Other hints from similar "issues" already tried out.

Can anyone help out?
Thanks in advance.

ZigBee devices not visible in node-red, but available in ZigBee dashboard

I recently started to switch from a home-grown node-red/Zigbee2MQTT/MQTT setup on my Raspberry Pi 3 to the c't-Smart-Home project.

In the process of setting everything up again I noticed that I could not set up access to ZigBee in node-red correctly.

So I started with a fresh installation of the c't-Smart-Home to produce a minimal working example to check if I did something wrong, but it seems that it is simply not working.

Here are the steps that reproduce the problem for me:

  • git clone a fresh copy of the c't-Smart-Home project
  • start up the with the default installation - make sure the ZigBee USB stick is attached so that the ZigBee2MQTT image is correctly started as well
  • in my case go to http://raspberrypi.fritz.box:1881 and use the interface to pair one device, for example an Osram plug:
    image
  • now in node-red build the following minimal test setup
    image
  • the configuration node seems to be setup ok and there is communication:
    image
  • but no matter what I do, the "Refresh Device List" option does not work and the device list is never populated:
    image

There seems to be some communication (as can be seen on the right side), but I cannot see anything obviously wrong.
I will attach the logs of the 3 running containers as well.

Has anyone experienced the same problem and knows what is going on here?

allow Conbee zigbee USB stick in start.sh

Hi,
when the start.sh script tries to find a USB dongle for zigbee, it checks the vendor ID of Texas Instruments (0451).
I have a Conbee II stick, which is build by Dresden Electronik and has a different vendor ID (1cf1).
Replacing 0451 by 1cf1 for the initial run of the script worked fine for me.
Could you add the Dresden Electronik ID to the check in start.sh?
Thanks!

user/group 1001 & 1883

Both user/group 1001 & 1883 do not exist on my system. But in the startup script ownership of the nodered & mqtt directories is set to those. This creates a permissions problem later on.

Did I miss something here? I haven't any mention of these IDs anywhere in the documentation.

possible compose file error: network_mode: "host"

Hi
many thanks for this interesting project, which encourage me to give it a try ....

Following the instructions i was not able to start the containers.

routecause:

Compose file line 14: network_mode: "host"

The error message point out that host mode is not compatible with port bindings.

Delete the line will fix the problem as the standart network mode will work.

hope this may help other to get started,

sunny regards

Problem latest docker mosquitto version

Hallo,
mit dem aktuellen eclipse-mosquitto docker image bekomme ich folgende Fehlermeldungen:
info 2021-03-06 10:01:09: Connecting to MQTT server at mqtt://mqtt
debug 2021-03-06 10:01:09: Using MQTT anonymous login
error 2021-03-06 10:01:15: Not connected to MQTT server!

Wenn ich im dokcer-compose.yml auf eine ältere Version gehe, funktioniert es.
mqtt:
image: "eclipse-mosquitto:1.6"

muss für die latest Version von mosquitto etwas abgeändert werden?

Gruß
Martin

Don't use this on a QNAP NAS

After install you can't remove app and containers from container station anymore. Only a de- and reinstall of container-station helped to get rid of this. Tried on cmd line with docker app uninstall - QNAP docker don't support the param "app".

After updating: no connection to node-red

After updating with "./start.sh update" and "./start.sh fix" node red is not available.

From docker-compose logs:

nodered_1 | #
nodered_1 | # Fatal error in , line 0
nodered_1 | # unreachable code
nodered_1 | #
nodered_1 | #
nodered_1 | #
nodered_1 | #FailureMessage Object: 0x7efae23c
nodered_1 | Illegal instruction
nodered_1 | Starting dbus daemon
nodered_1 | Starting Avahi daemon
nodered_1 | Starting Node-Red
nodered_1 |
nodered_1 |
nodered_1 | #
nodered_1 | # Fatal error in , line 0
nodered_1 | # unreachable code
nodered_1 | #
nodered_1 | #
nodered_1 | #
nodered_1 | #FailureMessage Object: 0x7ea7723c
nodered_1 | Illegal instruction

Can someone help?

Use mosquitto.conf (and pass.txt, acl.txt)

I try to use the mosquitto.conf and pass.txt & acl.txt inspired by the corresponding article in c‘t. But it does not work. I can not login with username/password.

mosquitto.conf already existed but was empty. So I just added the reference to /mosquitto/data/pass.txt.

In the docker Hub documentation it‘s described that the mosquitto.conf need to be mapped as a volume. But if I open a shell in the container, I can see the file at this path already.
https://hub.docker.com/_/eclipse-mosquitto

How did you do the configuration?

Error when restarting nodered container: The pid file "/run/dbus/dbus.pid" exists

Hi,

I'm running ct-smart-home on a Pi 4 and I keep experiencing an issue where restarting the nodered container will fail.

docker-compose ps would tell me that nodered is unhealthy and nodered would not be accessible via the configured ports. docker-compose logs nodered would reveal that the container is stuck at the following point:
dbus-daemon[10]: Failed to start message bus: The pid file "/run/dbus/dbus.pid" exists, if the message bus is not running, remove this file.

Looking at entrypoint.sh reveals that prior to starting dbus /var/run/dbus.pid is indeed removed, but not /run/dbus/dbus.pid. Not sure if some update moved dbus.pid to the new location ...

I probably could edit entrypint.sh and build a custom docker image but atm I don't have the time, so I'm going with this quick & dirty workaround, which I apply manually whenever needed:

# container needs to run for this
docker-compose up -d nodered
# remove unhandled dbus pid file
docker-compose exec nodered sh -c 'su-exec root rm -f /run/dbus/dbus.pid'
# restart
docker-compose restart nodered

I would expect that adding somethin like the following line to entrypoint.sh would fix this issue, but I haven't verified it.
[[ -e /run/dbus/dbus.pid ]] && su-exec root rm -f /run/dbus/dbus.pid

Just wanted to share my observations at this point.

Cheers!

Edit:
Note that I added container_name: nodered to my docker-compose.yml, so you will need to adapt my docker-compose commands to your container name.

Add HTTPS for NodeRed (+Mosquitto)

From my point of view it would be interesting to integrate HTTPS with LetsEncrypt to the NodeRed Container. Possibly additional for Mosquitto.
What would be the right approach here?

Traefik? Or is it possible to issue and integrate the certificates directly into NodeRed?

Based on the situation that this smarthome components should not be available from the Internet, the DNS-challenge option of LetsEncrypt would be interesting.

Would be interesting to have it included into docker-compose file here.

"exec_die" every 30 seconds

In the journal i noticed messages
run-docker-runtime\x2drunc-moby-<img-id>runc.YEccej.mount: Succeeded.
every 30 seconds.
Running "/usr/bin/curl --no-buffer --unix-socket /var/run/docker.sock http://foo/events" returns

{
  "status": "exec_die",
  "id": ***,
  "from": "ghcr.io/ct-open-source/ctnodered:latest",
  "Type": "container",
  "Action": "exec_die",
...

again every 30 seconds.
What's the reason of all this?

devel branch pulled by start.sh : question?

Hi,

today I started "./start.sh update" and a new docker image for ctnodered was pulled from the docker hub.

I see there are commits in the devel branch (4 days ago) - these commits make trouble on my system Raspberry Pi.

  • Is ist normal and ok, that ./start.sh update pulled the changes from devel?
  • The change at docker-compose
    ...
    services:
    nodered:
    image: ctmagazin/ctnodered
    .... to
    services:
    nodered:
    image: ctmagazin/ctnodered**:amd64-devel**

forces nodered_1 | standard_init_linux.go:207: exec user process caused "exec format error"

see docker-compose logs below
-------snipp

pi@pi3:~/ct-Smart-Home $ ./start.sh update
Shutting down all running containers and removing them.
Stopping ct-smart-home_nodered_1 ... done
Stopping ct-smart-home_mqtt_1 ... done
Stopping ct-smart-home_zigbee_1 ... done
Removing ct-smart-home_nodered_1 ... done
Removing ct-smart-home_mqtt_1 ... done
Removing ct-smart-home_zigbee_1 ... done
Removing network ct-smart-home_default
Pulling current version via git.
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 14 (delta 2), reused 11 (delta 2), pack-reused 0
Entpacke Objekte: 100% (14/14), Fertig.
Von https://github.com/ct-Open-Source/ct-Smart-Home
2ff0c3a..908e729 devel -> origin/devel
Aktualisiere 2ff0c3a..908e729
Fast-forward
README.md | 2 +-
docker-compose.yml | 8 ++---
docker/ctnodered/Dockerfile | 70 ++++++++++++++++++------------------
docker/ctnodered/Dockerfile.arm | 76 +++++++++++++++++++--------------------
docker/ctnodered/entrypoint.sh | 18 ++++++++++
docker/ctnodered/supervisord.conf | 38 --------------------
start.sh | 6 ++++
7 files changed, 101 insertions(+), 117 deletions(-)
create mode 100644 docker/ctnodered/entrypoint.sh
delete mode 100644 docker/ctnodered/supervisord.conf
Pulling current images.
Pulling mqtt ... done
Pulling nodered ... done
Pulling zigbee ... done
Only starting the containers:

Starting the containers
CPU architecture is: arm
Creating network "ct-smart-home_default" with the default driver
Creating ct-smart-home_zigbee_1 ... done
Creating ct-smart-home_mqtt_1 ... done
Creating ct-smart-home_nodered_1 ... done
pi@pi3:~/ct-Smart-Home $ docker-compose logs
Attaching to ct-smart-home_nodered_1, ct-smart-home_mqtt_1, ct-smart-home_zigbee_1
nodered_1 | standard_init_linux.go:207: exec user process caused "exec format error"
nodered_1 | standard_init_linux.go:207: exec user process caused "exec format error"
nodered_1 | standard_init_linux.go:207: exec user process caused "exec format error"
nodered_1 | standard_init_linux.go:207: exec user process caused "exec format error"
nodered_1 | standard_init_linux.go:207: exec user process caused "exec format error"
nodered_1 | standard_init_linux.go:207: exec user process caused "exec format error"
nodered_1 | standard_init_linux.go:207: exec user process caused "exec format error"
nodered_1 | standard_init_linux.go:207: exec user process caused "exec format error"
nodered_1 | standard_init_linux.go:207: exec user process caused "exec format error"

Usage impossible because docker-compose is not installed

I can not use the whole solution because I am unable to install docker-compose an my Pi3 with Raspbian.

If I execute sudo pip install docker-compose I always get this response:
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-Sjc79O/pynacl/

I already re-installed the Raspbian OS. But still the same problem.
Am I the only one with this issue?

Start Up Error (./start.sh start) with zigbeeadmin_1

Hi there,

I've have following setup:
-Raspi4
-CC2531 ZigBee USB-Stick (flashed with cc2531_default_20190608)

During inital startup I received an error the the zigbeeadmin_01:
"
Starting the containers
Starting ct-smart-home-master_zigbeeadmin_1 ...
ct-smart-home-master_zigbee_1 is up-to-date
ct-smart-home-master_mqtt_1 is up-to-date
ct-smart-home-master_nodered_1 is up-to-date
Starting ct-smart-home-master_zigbeeadmin_1 ... error

ERROR: for ct-smart-home-master_zigbeeadmin_1 Cannot start service zigbeeadmin: driver failed programming external connectivity on endpoint ct-smart-home-master_zigbeeadmin_1 (...): Bind for 0.0.0.0:8880 failed: port is already allocated

ERROR: for zigbeeadmin Cannot start service zigbeeadmin: driver failed programming external connectivity on endpoint ct-smart-home-master_zigbeeadmin_1 (...): Bind for 0.0.0.0:8880 failed: port is already allocated
ERROR: Encountered errors while bringing up the project."

Can you pls help me, what I am doing wrong here.

Thanks a lot,
Tayfun

NodeRed Container startet nicht

Hallo allerseits,

ich versuche das ct-smart-home "out of the box" zu nutzen. Laufen soll es auf einem Raspi 3B+, auf dem schon andere Container erfolgreich laufen (unifi, portainer). Grundsätzlich gehe ich also davon aus, dass docker auf diesem Gerät funktioniert. Raspbian ist aktuell (sudo apt update / sudo apt upgrade durchgeführt).

Nach dem Start sehe ich in Portainer, dass beide Container laufen:

  • ctmagazin/ctnodered
  • eclipse-mosquitto

Mosquitto funktioniert wunderbar, er hat mein bisher genutzten, nicht im Container laufenden Mosquitto nahtlos abgelöst. Bei Nodered komme ich aber nicht weiter. In einer Endlosschleife werden im Log Meldungen ausgegeben, deren Ursache ich mit den verschiedenen Suchmaschinen leider nicht auf die Spur gekommen bin. Auch zeigt Portainer keinen Port für diesen Container an, schon mal ein schlechtes Zeichen. Auch über <ip>:1880 finde ich keine Seite zum bedienen von NodeRed.

Was mache ich falsch?

Hier die Fehlermeldung-Endlosschleife:

2019-08-12 15:02:46,198 INFO success: node-red entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

> [email protected] start /usr/src/node-red
> node $NODE_OPTIONS node_modules/node-red/red.js -v $FLOWS "--userDir" "/data"

2019-08-12 15:02:48,011 INFO exited: node-red (exit status 1; not expected)
2019-08-12 15:02:49,020 INFO spawned: 'node-red' with pid 71

documentation: setup.sh => start.sh

Hi, minor issue for documentation

seems that you renamed the setup.sh to start.sh and didn't update the documentation and script help . Might confuse some c't reader - sure not the iX ones.

start.sh options

c't-Smart-Home – setup script

Usage:
setup.sh update – to update to this copy of the repo
setup.sh start – run all containers
setup.sh stop – stop all containers
setup.sh data – set up the data folder needed for the containers, but run none of them. Useful for personalized setups. Regards Jörk

Node-Red Password einrichten

Hallo ich habe den Artikel in der CT gelesen wie ich das Dashboard mit einem Passwort absichern kann.
Wie ist es möglich in den Container von Node Red ein Terminal zu öffnen und die Einrichtuing vorzunehmen.
Dies ist meine erste erfahrung mit Docker.
Vielen Dank

Adding ttyUSB* as serial port

I have exchanged my CC2531 stick with a Slaesh's CC2652RB stick (one of the two recommended adapter at zigbee2mqtt.io).
Unfortunately the serial port with this devices is on my RasPi /dev/ttyUSB0.
Meanwhile I found the correct mapping within docker-compose.yml: Added
- "/dev/ttyUSB0:/dev/ttyUSB0"
at zigbee -> devices and changed port in configuraton.yaml for zigbee to /dev/ttyUSB0 too.

BUT start.sh is not working as there ttyACM* is given at several places. As I am a noob in programming I am not sure how to overcome this.
I started the docker container manually:
docker-compose up -d nodered mqtt zigbee
But now I am not sure what will happen in case I upgrade in the future.

Inject nodes trigger at UTC time instead of local time

Hi,

inject nodes trigger at UTC time instead of local time.
System is Debian 9 Stretch in a KVM virtual machine. Debian timezone and date output are correct:

renne@Homematic:~$ cat /etc/timezone
Europe/Berlin
renne@Homematic:~$ date
Mo 1. Jul 20:55:49 CEST 2019

What' going wrong here?

Please more documentation / a sample configuration

I tryed to start the docker on a Raspberry Pi with Raspbian Stretch/Hypriotos and run every time into strange problems with starting all dockers. A tested Raspberry Pi sample configuration with less problems would be nice.

Won't start on Mac OS

Hey there, just tried starting your project on my mac. Unfortunately it doesn't work:

2020-01-23 07:37:31.113 system_profiler[64495:3455455] SPUSBDevice: IOCreatePlugInInterfaceForService failed 0xe00002be
No Texas Instruments USB device found.
No Zigbee adaptor found. Not starting Zigbee2MQTT.
Starting the containers
Starting ct-smart-home_mqtt_1 ... error

ERROR: for ct-smart-home_mqtt_1  Cannot start service mqtt: OCI runtime create failed: container_linux.go:346: starting container process caused "process_linux.go:449: container init caused \"rootfs_linux.go:58: mounting \\\"/var/lib/docker/volumes/e7000ef713b2b9be09b4698bac7cea0263e49fb782db787c419f13b1672adfa8/_data\\\" to rootfs \\\"/var/lib/docker/overlay2/446810877f5a4509d2d2ae229297a76fd8622f20edf0d72c48c212a25d8ce3ef/merged\\\" at \\\"/var/lib/docker/overlay2/446810877f5a4509d2d2ae229297a76fd8622f20edf0d72c48c212a25d8ce3ef/merged/mosquitto/log\\\" caused \\\"mkdir /var/lib/docker/overlay2/446810877f5a4509d2d2ae229297a76fd8622f20edf0d72c48c212a25d8ce3ef/merged/mosquitto/log: permission denied\\\"\"": unknown

ERROR: for mqtt  Cannot start service mqtt: OCI runtime create failed: container_linux.go:346: starting container process caused "process_linux.go:449: container init caused \"rootfs_linux.go:58: mounting \\\"/var/lib/docker/volumes/e7000ef713b2b9be09b4698bac7cea0263e49fb782db787c419f13b1672adfa8/_data\\\" to rootfs \\\"/var/lib/docker/overlay2/446810877f5a4509d2d2ae229297a76fd8622f20edf0d72c48c212a25d8ce3ef/merged\\\" at \\\"/var/lib/docker/overlay2/446810877f5a4509d2d2ae229297a76fd8622f20edf0d72c48c212a25d8ce3ef/merged/mosquitto/log\\\" caused \\\"mkdir /var/lib/docker/overlay2/446810877f5a4509d2d2ae229297a76fd8622f20edf0d72c48c212a25d8ce3ef/merged/mosquitto/log: permission denied\\\"\"": unknown
ERROR: Encountered errors while bringing up the project.

I already installed lsusb through with brew ...

why user 1001 instead of 1000?

Hi,
setup works like a charm, but there is one point I don't understand.
Original nodered/node-red container works with user 1000 and also here:
node-red: x :1000:1000:Linux User,,,:/usr/src/node-red:/bin/ash

So why chown with user and group 1001:1001?

I would very happy if anybody can explain... thanks.

Can’t install additional node red modules -> please add path to docker-compose.yml

I get following error message when installing new modules in node red (e.g. node-red-contrib-denon):

npm WARN locking Error: EACCES: permission denied, open '/usr/src/node-red/_locks/staging-accc372ed0ccb0d8.lock'
npm WARN locking /usr/src/node-red/_locks/staging-accc372ed0ccb0d8.lock failed { Error: EACCES: permission denied, open '/usr/src/node-red/_locks/staging-accc372ed0ccb0d8.lock'
npm WARN locking stack: 'Error: EACCES: permission denied, open '/usr/src/node-red/_locks/staging-accc372ed0ccb0d8.lock'',
npm WARN locking errno: -13,
npm WARN locking code: 'EACCES',
npm WARN locking syscall: 'open',
npm WARN locking path: '/usr/src/node-red/_locks/staging-accc372ed0ccb0d8.lock' }
npm ERR! path /usr/src/node-red/_locks/staging-accc372ed0ccb0d8.lock
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall open
npm ERR! Error: EACCES: permission denied, open '/usr/src/node-red/_locks/staging-accc372ed0ccb0d8.lock'
npm ERR! { Error: EACCES: permission denied, open '/usr/src/node-red/_locks/staging-accc372ed0ccb0d8.lock'
npm ERR! stack: 'Error: EACCES: permission

Could you please update the docker-compose.yml file to grand permission

Thanks a lot!

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.