Repository files navigation

Introduction

Super simple node script that will periodially:

  • Fetch data from sensors near the PI
  • Publish that data over a WiFi connection

Possible use cases:

  • Monitoring temperature in the house over time.
  • CloudWatch Alarm when a fish tank temperature is out of range
  • Open/Close a window based on temperature / humidity of bathroom

Supported Sensors:

Supported Metrics platforms:

Basic installation

A Raspberry PI is a full blown computer. You can easily checkout and edit all the files directly on the box.

This package is written using node 10. It's very simple and probably any later version will work. If you don't know what you're doing with node installations (I don't really) you can just run:

sudo apt-get install nodejs npm

If you're using a remote laptop to configure the PI, Visual Studio Code and the Remote SSH extension are recommended.

If you are using this script, find your hostnae (for example pi3), then copy the config.example.json file to config.hostname.json, for example config.pi3.json. This will get picked up by the host on startup and the convention makes configuring multiple small boxes a little simpler.

If you want to install this to run on boot, it helps to register it with systemctl. Use the script in install/install.sh to do this. If you want to install or update this remotely on a number of devices (on a host that already hase node installed) then consider using the install/install-remote.sh script.

1 Wire Thermometer Setup (optional)

First up, get your 1 wire thermometer talking to your Raspberry PI. Your shopping list will probably include something like:

There are lots of instructions available but here and here are good places to start.

Each sensor has a unqiue ID and when they're setup you'll see a list of them in /sys/bus/w1/devices

pi@pi3:~ $ ls /sys/bus/w1/devices
28-011447e2d1aa 28-0517600602ff w1_bus_master1

You can then copy data from the remote device using cat, which will report back the temperature as an integer in 1000ths of degrees:

pi@pi3:~ $ cat /sys/bus/w1/devices/28-011447e2d1aa/w1_slave
ff 00 4b 46 7f ff 0c 10 15 : crc=15 YES
ff 00 4b 46 7f ff 0c 10 15 t=15937

The Raspberry PI in my kitchen has two 1 Wire sensors connected, one measuring ambient temperature, and one in the fish tank. The host is called 'pi3' and the config.json is as follows

{
"sensorMap": {
"Kitchen": {
"id": "28-011447e2d1aa"
},
"FishTank": {
"id": "28-0517600602ff"
}
}
}

Temperature and Humidity Sensor Config (optional)

For ~20 GBP, you can buy a very workable low energy JINOU bluetooth sensor. They will work for over 6 months on a single CR2302 battery

There are lots of guides on enabling bluetooth on the PI. Do that! The pi0w is a good choice of device rfel

Check your Bluetooth configuration with sudo hciconfig

Scan for Bluetooth devices by running sudo hcitool lescan. The sensor in the bathroom appeared as

ED:01:5E:CF:2E:77 Jinou_Sensor_HumiTemp

You can directly pull the relevant attribute directly from the device with:

pi@pi0w:~ $ gatttool -b ED:01:5E:CF:2E:77 -u 0000aa21-0000-1000-8000-00805f9b34fb --char-read
handle: 0x0023 value: 00 16 08 00 30 09

The data structure is defined as follows:

 Service 0XAA20. Temp & humid data. There are 6 bytes.
1. Temperature positive/negative: 0 means positive (+) and 1 means negative (-)
2. Integer part of temperature. Show in Hexadecimal.
3. Decimal part of temperature. Show in Hexadecimal.
4. Reserved byte. Ignore it.
5. Integer part of humidity. Show in Hexadecimal.
6. Decimal part of humidity. Show in Hexadecimal.
For example: 00 14 05 22 32 08 means +20.5C 50.8%
01 08 09 00 14 05 means -8.9C 20.5%

This is all our node script does. To configure the pi0w host for this bluetooth sensor, I have a config.p0w.json file as follows:

{
"bluetooth": {
"Bathroom" : {
"id": "ED:01:5E:CF:2E:77"
}
}
}

Publishing to AWS CloudWatch

If you don't want to do this, you'll have to comment out the call in the publishMetric function.

If you do want to do this, you'll need some credentials in ~/.aws . These should have the minimum possible credentials to publish to CloudWatch.

The AWS CLI tool is not required, but may be useful to verify your user something like this:

pi@pi3:~ $ aws sts get-caller-identity
{
"UserId": "AIDA2134RUBBISH1234MADEUPSTUFF",
"Account": "123456789012",
"Arn": "arn:aws:iam::123456789012:user/pi"
}

I would recommend you setup a specific PI user and providew just these credentials and also consider how you will manage key rotation:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "cloudwatch:PutMetricData",
"Resource": "*"
}
]
}

The script will publish metrics in eu-west-1 region. You can update that by changing this line: AWS.config.update({region: 'eu-west-1'});

Publishing to Cloud Watch lets you easily setup monitors and dashboards. Example alarms might be:

  • Fish tank temperature is less than 20C for 1 hour
  • No data received from fish tank sensor
  • Bathroom humidity over 80% for 6 consecutive 10 minute samples

Publishing to MQTT (and hence Home Assistant)

If you don't want to do this, you'll have to comment out the call in the publishMetric function.

If you do want to do this, you'll need to have a working MQTT server. I would recommend installing mosquito_mqtt on some central server. This script assumes it can connect to mosquitto on a host called 'house' at mqtt://house with no authentication. Ideally we would be using client certificates.

If necessary, install MQTT on a host so the following line can connect to MQTT

varmqttClient=mqtt.connect('mqtt://house')

Install client tools with :

sudo apt-get install mosquitto-clients

To see what's going on, subscribe to messages with this command:

mosquitto_sub -h house -v -t \#
...
/sensordump/Kitchen/Temperature 16.125
/sensordump/Bathroom/Temperature 23
/sensordump/FishTank/Temperature 22.562
/sensordump/Bathroom/Humidity 47.2

You can also publish test messages with this command:

mosquitto_pub -h house -t some/topic -m "This is a test"

Along side the vlaues, the script also publishes configuration data for Home Assistant MQTT Discovery, so new devices connected to the same MQTT bus should be automatically discovered. For example:

homeassistant/sensor/Kitchen_Temperature/config {"device_class":"temperature","name":"Kitchen Temperature","state_topic":"/sensordump/Kitchen/Temperature","unit_of_measurement":"°C","device":{"identifiers":["28-011447e2d1aa"],"manufacturer":"NA","model":"NA","name":"Kitchen"}}

Random other notes:

Turning the service on and off for a given host

ssh pi@pi3 systemctl status homer-node ssh pi@pi3 systemctl status homer-node ssh pi@pi3 systemctl restart homer-node

About

Hacky nodejs script used as part of our home automation based on Home Assistant

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Introduction

Super simple node script that will periodially:

  • Fetch data from sensors near the PI
  • Publish that data over a WiFi connection

Possible use cases:

  • Monitoring temperature in the house over time.
  • CloudWatch Alarm when a fish tank temperature is out of range
  • Open/Close a window based on temperature / humidity of bathroom

Supported Sensors:

Supported Metrics platforms:

Basic installation

A Raspberry PI is a full blown computer. You can easily checkout and edit all the files directly on the box.

This package is written using node 10. It's very simple and probably any later version will work. If you don't know what you're doing with node installations (I don't really) you can just run:

sudo apt-get install nodejs npm

If you're using a remote laptop to configure the PI, Visual Studio Code and the Remote SSH extension are recommended.

If you are using this script, find your hostnae (for example pi3), then copy the config.example.json file to config.hostname.json, for example config.pi3.json. This will get picked up by the host on startup and the convention makes configuring multiple small boxes a little simpler.

If you want to install this to run on boot, it helps to register it with systemctl. Use the script in install/install.sh to do this. If you want to install or update this remotely on a number of devices (on a host that already hase node installed) then consider using the install/install-remote.sh script.

1 Wire Thermometer Setup (optional)

First up, get your 1 wire thermometer talking to your Raspberry PI. Your shopping list will probably include something like:

There are lots of instructions available but here and here are good places to start.

Each sensor has a unqiue ID and when they're setup you'll see a list of them in /sys/bus/w1/devices

pi@pi3:~ $ ls /sys/bus/w1/devices
28-011447e2d1aa 28-0517600602ff w1_bus_master1

You can then copy data from the remote device using cat, which will report back the temperature as an integer in 1000ths of degrees:

pi@pi3:~ $ cat /sys/bus/w1/devices/28-011447e2d1aa/w1_slave
ff 00 4b 46 7f ff 0c 10 15 : crc=15 YES
ff 00 4b 46 7f ff 0c 10 15 t=15937

The Raspberry PI in my kitchen has two 1 Wire sensors connected, one measuring ambient temperature, and one in the fish tank. The host is called 'pi3' and the config.json is as follows

{
"sensorMap": {
"Kitchen": {
"id": "28-011447e2d1aa"
},
"FishTank": {
"id": "28-0517600602ff"
}
}
}

Temperature and Humidity Sensor Config (optional)

For ~20 GBP, you can buy a very workable low energy JINOU bluetooth sensor. They will work for over 6 months on a single CR2302 battery

There are lots of guides on enabling bluetooth on the PI. Do that! The pi0w is a good choice of device rfel

Check your Bluetooth configuration with sudo hciconfig

Scan for Bluetooth devices by running sudo hcitool lescan. The sensor in the bathroom appeared as

ED:01:5E:CF:2E:77 Jinou_Sensor_HumiTemp

You can directly pull the relevant attribute directly from the device with:

pi@pi0w:~ $ gatttool -b ED:01:5E:CF:2E:77 -u 0000aa21-0000-1000-8000-00805f9b34fb --char-read
handle: 0x0023 value: 00 16 08 00 30 09

The data structure is defined as follows:

 Service 0XAA20. Temp & humid data. There are 6 bytes.
1. Temperature positive/negative: 0 means positive (+) and 1 means negative (-)
2. Integer part of temperature. Show in Hexadecimal.
3. Decimal part of temperature. Show in Hexadecimal.
4. Reserved byte. Ignore it.
5. Integer part of humidity. Show in Hexadecimal.
6. Decimal part of humidity. Show in Hexadecimal.
For example: 00 14 05 22 32 08 means +20.5C 50.8%
01 08 09 00 14 05 means -8.9C 20.5%

This is all our node script does. To configure the pi0w host for this bluetooth sensor, I have a config.p0w.json file as follows:

{
"bluetooth": {
"Bathroom" : {
"id": "ED:01:5E:CF:2E:77"
}
}
}

Publishing to AWS CloudWatch

If you don't want to do this, you'll have to comment out the call in the publishMetric function.

If you do want to do this, you'll need some credentials in ~/.aws . These should have the minimum possible credentials to publish to CloudWatch.

The AWS CLI tool is not required, but may be useful to verify your user something like this:

pi@pi3:~ $ aws sts get-caller-identity
{
"UserId": "AIDA2134RUBBISH1234MADEUPSTUFF",
"Account": "123456789012",
"Arn": "arn:aws:iam::123456789012:user/pi"
}

I would recommend you setup a specific PI user and providew just these credentials and also consider how you will manage key rotation:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "cloudwatch:PutMetricData",
"Resource": "*"
}
]
}

The script will publish metrics in eu-west-1 region. You can update that by changing this line: AWS.config.update({region: 'eu-west-1'});

Publishing to Cloud Watch lets you easily setup monitors and dashboards. Example alarms might be:

  • Fish tank temperature is less than 20C for 1 hour
  • No data received from fish tank sensor
  • Bathroom humidity over 80% for 6 consecutive 10 minute samples

Publishing to MQTT (and hence Home Assistant)

If you don't want to do this, you'll have to comment out the call in the publishMetric function.

If you do want to do this, you'll need to have a working MQTT server. I would recommend installing mosquito_mqtt on some central server. This script assumes it can connect to mosquitto on a host called 'house' at mqtt://house with no authentication. Ideally we would be using client certificates.

If necessary, install MQTT on a host so the following line can connect to MQTT

varmqttClient=mqtt.connect('mqtt://house')

Install client tools with :

sudo apt-get install mosquitto-clients

To see what's going on, subscribe to messages with this command:

mosquitto_sub -h house -v -t \#
...
/sensordump/Kitchen/Temperature 16.125
/sensordump/Bathroom/Temperature 23
/sensordump/FishTank/Temperature 22.562
/sensordump/Bathroom/Humidity 47.2

You can also publish test messages with this command:

mosquitto_pub -h house -t some/topic -m "This is a test"

Along side the vlaues, the script also publishes configuration data for Home Assistant MQTT Discovery, so new devices connected to the same MQTT bus should be automatically discovered. For example:

homeassistant/sensor/Kitchen_Temperature/config {"device_class":"temperature","name":"Kitchen Temperature","state_topic":"/sensordump/Kitchen/Temperature","unit_of_measurement":"°C","device":{"identifiers":["28-011447e2d1aa"],"manufacturer":"NA","model":"NA","name":"Kitchen"}}

Random other notes:

Turning the service on and off for a given host

ssh pi@pi3 systemctl status homer-node ssh pi@pi3 systemctl status homer-node ssh pi@pi3 systemctl restart homer-node

About

Hacky nodejs script used as part of our home automation based on Home Assistant

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Introduction

Super simple node script that will periodially:

  • Fetch data from sensors near the PI
  • Publish that data over a WiFi connection

Possible use cases:

  • Monitoring temperature in the house over time.
  • CloudWatch Alarm when a fish tank temperature is out of range
  • Open/Close a window based on temperature / humidity of bathroom

Supported Sensors:

Supported Metrics platforms:

Basic installation

A Raspberry PI is a full blown computer. You can easily checkout and edit all the files directly on the box.

This package is written using node 10. It's very simple and probably any later version will work. If you don't know what you're doing with node installations (I don't really) you can just run:

sudo apt-get install nodejs npm

If you're using a remote laptop to configure the PI, Visual Studio Code and the Remote SSH extension are recommended.

If you are using this script, find your hostnae (for example pi3), then copy the config.example.json file to config.hostname.json, for example config.pi3.json. This will get picked up by the host on startup and the convention makes configuring multiple small boxes a little simpler.

If you want to install this to run on boot, it helps to register it with systemctl. Use the script in install/install.sh to do this. If you want to install or update this remotely on a number of devices (on a host that already hase node installed) then consider using the install/install-remote.sh script.

1 Wire Thermometer Setup (optional)

First up, get your 1 wire thermometer talking to your Raspberry PI. Your shopping list will probably include something like:

There are lots of instructions available but here and here are good places to start.

Each sensor has a unqiue ID and when they're setup you'll see a list of them in /sys/bus/w1/devices

pi@pi3:~ $ ls /sys/bus/w1/devices
28-011447e2d1aa 28-0517600602ff w1_bus_master1

You can then copy data from the remote device using cat, which will report back the temperature as an integer in 1000ths of degrees:

pi@pi3:~ $ cat /sys/bus/w1/devices/28-011447e2d1aa/w1_slave
ff 00 4b 46 7f ff 0c 10 15 : crc=15 YES
ff 00 4b 46 7f ff 0c 10 15 t=15937

The Raspberry PI in my kitchen has two 1 Wire sensors connected, one measuring ambient temperature, and one in the fish tank. The host is called 'pi3' and the config.json is as follows

{
"sensorMap": {
"Kitchen": {
"id": "28-011447e2d1aa"
},
"FishTank": {
"id": "28-0517600602ff"
}
}
}

Temperature and Humidity Sensor Config (optional)

For ~20 GBP, you can buy a very workable low energy JINOU bluetooth sensor. They will work for over 6 months on a single CR2302 battery

There are lots of guides on enabling bluetooth on the PI. Do that! The pi0w is a good choice of device rfel

Check your Bluetooth configuration with sudo hciconfig

Scan for Bluetooth devices by running sudo hcitool lescan. The sensor in the bathroom appeared as

ED:01:5E:CF:2E:77 Jinou_Sensor_HumiTemp

You can directly pull the relevant attribute directly from the device with:

pi@pi0w:~ $ gatttool -b ED:01:5E:CF:2E:77 -u 0000aa21-0000-1000-8000-00805f9b34fb --char-read
handle: 0x0023 value: 00 16 08 00 30 09

The data structure is defined as follows:

 Service 0XAA20. Temp & humid data. There are 6 bytes.
1. Temperature positive/negative: 0 means positive (+) and 1 means negative (-)
2. Integer part of temperature. Show in Hexadecimal.
3. Decimal part of temperature. Show in Hexadecimal.
4. Reserved byte. Ignore it.
5. Integer part of humidity. Show in Hexadecimal.
6. Decimal part of humidity. Show in Hexadecimal.
For example: 00 14 05 22 32 08 means +20.5C 50.8%
01 08 09 00 14 05 means -8.9C 20.5%

This is all our node script does. To configure the pi0w host for this bluetooth sensor, I have a config.p0w.json file as follows:

{
"bluetooth": {
"Bathroom" : {
"id": "ED:01:5E:CF:2E:77"
}
}
}

Publishing to AWS CloudWatch

If you don't want to do this, you'll have to comment out the call in the publishMetric function.

If you do want to do this, you'll need some credentials in ~/.aws . These should have the minimum possible credentials to publish to CloudWatch.

The AWS CLI tool is not required, but may be useful to verify your user something like this:

pi@pi3:~ $ aws sts get-caller-identity
{
"UserId": "AIDA2134RUBBISH1234MADEUPSTUFF",
"Account": "123456789012",
"Arn": "arn:aws:iam::123456789012:user/pi"
}

I would recommend you setup a specific PI user and providew just these credentials and also consider how you will manage key rotation:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "cloudwatch:PutMetricData",
"Resource": "*"
}
]
}

The script will publish metrics in eu-west-1 region. You can update that by changing this line: AWS.config.update({region: 'eu-west-1'});

Publishing to Cloud Watch lets you easily setup monitors and dashboards. Example alarms might be:

  • Fish tank temperature is less than 20C for 1 hour
  • No data received from fish tank sensor
  • Bathroom humidity over 80% for 6 consecutive 10 minute samples

Publishing to MQTT (and hence Home Assistant)

If you don't want to do this, you'll have to comment out the call in the publishMetric function.

If you do want to do this, you'll need to have a working MQTT server. I would recommend installing mosquito_mqtt on some central server. This script assumes it can connect to mosquitto on a host called 'house' at mqtt://house with no authentication. Ideally we would be using client certificates.

If necessary, install MQTT on a host so the following line can connect to MQTT

varmqttClient=mqtt.connect('mqtt://house')

Install client tools with :

sudo apt-get install mosquitto-clients

To see what's going on, subscribe to messages with this command:

mosquitto_sub -h house -v -t \#
...
/sensordump/Kitchen/Temperature 16.125
/sensordump/Bathroom/Temperature 23
/sensordump/FishTank/Temperature 22.562
/sensordump/Bathroom/Humidity 47.2

You can also publish test messages with this command:

mosquitto_pub -h house -t some/topic -m "This is a test"

Along side the vlaues, the script also publishes configuration data for Home Assistant MQTT Discovery, so new devices connected to the same MQTT bus should be automatically discovered. For example:

homeassistant/sensor/Kitchen_Temperature/config {"device_class":"temperature","name":"Kitchen Temperature","state_topic":"/sensordump/Kitchen/Temperature","unit_of_measurement":"°C","device":{"identifiers":["28-011447e2d1aa"],"manufacturer":"NA","model":"NA","name":"Kitchen"}}

Random other notes:

Turning the service on and off for a given host

ssh pi@pi3 systemctl status homer-node ssh pi@pi3 systemctl status homer-node ssh pi@pi3 systemctl restart homer-node

About

Hacky nodejs script used as part of our home automation based on Home Assistant

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Introduction

Super simple node script that will periodially:

  • Fetch data from sensors near the PI
  • Publish that data over a WiFi connection

Possible use cases:

  • Monitoring temperature in the house over time.
  • CloudWatch Alarm when a fish tank temperature is out of range
  • Open/Close a window based on temperature / humidity of bathroom

Supported Sensors:

Supported Metrics platforms:

Basic installation

A Raspberry PI is a full blown computer. You can easily checkout and edit all the files directly on the box.

This package is written using node 10. It's very simple and probably any later version will work. If you don't know what you're doing with node installations (I don't really) you can just run:

sudo apt-get install nodejs npm

If you're using a remote laptop to configure the PI, Visual Studio Code and the Remote SSH extension are recommended.

If you are using this script, find your hostnae (for example pi3), then copy the config.example.json file to config.hostname.json, for example config.pi3.json. This will get picked up by the host on startup and the convention makes configuring multiple small boxes a little simpler.

If you want to install this to run on boot, it helps to register it with systemctl. Use the script in install/install.sh to do this. If you want to install or update this remotely on a number of devices (on a host that already hase node installed) then consider using the install/install-remote.sh script.

1 Wire Thermometer Setup (optional)

First up, get your 1 wire thermometer talking to your Raspberry PI. Your shopping list will probably include something like:

There are lots of instructions available but here and here are good places to start.

Each sensor has a unqiue ID and when they're setup you'll see a list of them in /sys/bus/w1/devices

pi@pi3:~ $ ls /sys/bus/w1/devices
28-011447e2d1aa 28-0517600602ff w1_bus_master1

You can then copy data from the remote device using cat, which will report back the temperature as an integer in 1000ths of degrees:

pi@pi3:~ $ cat /sys/bus/w1/devices/28-011447e2d1aa/w1_slave
ff 00 4b 46 7f ff 0c 10 15 : crc=15 YES
ff 00 4b 46 7f ff 0c 10 15 t=15937

The Raspberry PI in my kitchen has two 1 Wire sensors connected, one measuring ambient temperature, and one in the fish tank. The host is called 'pi3' and the config.json is as follows

{
"sensorMap": {
"Kitchen": {
"id": "28-011447e2d1aa"
},
"FishTank": {
"id": "28-0517600602ff"
}
}
}

Temperature and Humidity Sensor Config (optional)

For ~20 GBP, you can buy a very workable low energy JINOU bluetooth sensor. They will work for over 6 months on a single CR2302 battery

There are lots of guides on enabling bluetooth on the PI. Do that! The pi0w is a good choice of device rfel

Check your Bluetooth configuration with sudo hciconfig

Scan for Bluetooth devices by running sudo hcitool lescan. The sensor in the bathroom appeared as

ED:01:5E:CF:2E:77 Jinou_Sensor_HumiTemp

You can directly pull the relevant attribute directly from the device with:

pi@pi0w:~ $ gatttool -b ED:01:5E:CF:2E:77 -u 0000aa21-0000-1000-8000-00805f9b34fb --char-read
handle: 0x0023 value: 00 16 08 00 30 09

The data structure is defined as follows:

 Service 0XAA20. Temp & humid data. There are 6 bytes.
1. Temperature positive/negative: 0 means positive (+) and 1 means negative (-)
2. Integer part of temperature. Show in Hexadecimal.
3. Decimal part of temperature. Show in Hexadecimal.
4. Reserved byte. Ignore it.
5. Integer part of humidity. Show in Hexadecimal.
6. Decimal part of humidity. Show in Hexadecimal.
For example: 00 14 05 22 32 08 means +20.5C 50.8%
01 08 09 00 14 05 means -8.9C 20.5%

This is all our node script does. To configure the pi0w host for this bluetooth sensor, I have a config.p0w.json file as follows:

{
"bluetooth": {
"Bathroom" : {
"id": "ED:01:5E:CF:2E:77"
}
}
}

Publishing to AWS CloudWatch

If you don't want to do this, you'll have to comment out the call in the publishMetric function.

If you do want to do this, you'll need some credentials in ~/.aws . These should have the minimum possible credentials to publish to CloudWatch.

The AWS CLI tool is not required, but may be useful to verify your user something like this:

pi@pi3:~ $ aws sts get-caller-identity
{
"UserId": "AIDA2134RUBBISH1234MADEUPSTUFF",
"Account": "123456789012",
"Arn": "arn:aws:iam::123456789012:user/pi"
}

I would recommend you setup a specific PI user and providew just these credentials and also consider how you will manage key rotation:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "cloudwatch:PutMetricData",
"Resource": "*"
}
]
}

The script will publish metrics in eu-west-1 region. You can update that by changing this line: AWS.config.update({region: 'eu-west-1'});

Publishing to Cloud Watch lets you easily setup monitors and dashboards. Example alarms might be:

  • Fish tank temperature is less than 20C for 1 hour
  • No data received from fish tank sensor
  • Bathroom humidity over 80% for 6 consecutive 10 minute samples

Publishing to MQTT (and hence Home Assistant)

If you don't want to do this, you'll have to comment out the call in the publishMetric function.

If you do want to do this, you'll need to have a working MQTT server. I would recommend installing mosquito_mqtt on some central server. This script assumes it can connect to mosquitto on a host called 'house' at mqtt://house with no authentication. Ideally we would be using client certificates.

If necessary, install MQTT on a host so the following line can connect to MQTT

varmqttClient=mqtt.connect('mqtt://house')

Install client tools with :

sudo apt-get install mosquitto-clients

To see what's going on, subscribe to messages with this command:

mosquitto_sub -h house -v -t \#
...
/sensordump/Kitchen/Temperature 16.125
/sensordump/Bathroom/Temperature 23
/sensordump/FishTank/Temperature 22.562
/sensordump/Bathroom/Humidity 47.2

You can also publish test messages with this command:

mosquitto_pub -h house -t some/topic -m "This is a test"

Along side the vlaues, the script also publishes configuration data for Home Assistant MQTT Discovery, so new devices connected to the same MQTT bus should be automatically discovered. For example:

homeassistant/sensor/Kitchen_Temperature/config {"device_class":"temperature","name":"Kitchen Temperature","state_topic":"/sensordump/Kitchen/Temperature","unit_of_measurement":"°C","device":{"identifiers":["28-011447e2d1aa"],"manufacturer":"NA","model":"NA","name":"Kitchen"}}

Random other notes:

Turning the service on and off for a given host

ssh pi@pi3 systemctl status homer-node ssh pi@pi3 systemctl status homer-node ssh pi@pi3 systemctl restart homer-node

About

Hacky nodejs script used as part of our home automation based on Home Assistant

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Introduction

Super simple node script that will periodially:

  • Fetch data from sensors near the PI
  • Publish that data over a WiFi connection

Possible use cases:

  • Monitoring temperature in the house over time.
  • CloudWatch Alarm when a fish tank temperature is out of range
  • Open/Close a window based on temperature / humidity of bathroom

Supported Sensors:

Supported Metrics platforms:

Basic installation

A Raspberry PI is a full blown computer. You can easily checkout and edit all the files directly on the box.

This package is written using node 10. It's very simple and probably any later version will work. If you don't know what you're doing with node installations (I don't really) you can just run:

sudo apt-get install nodejs npm

If you're using a remote laptop to configure the PI, Visual Studio Code and the Remote SSH extension are recommended.

If you are using this script, find your hostnae (for example pi3), then copy the config.example.json file to config.hostname.json, for example config.pi3.json. This will get picked up by the host on startup and the convention makes configuring multiple small boxes a little simpler.

If you want to install this to run on boot, it helps to register it with systemctl. Use the script in install/install.sh to do this. If you want to install or update this remotely on a number of devices (on a host that already hase node installed) then consider using the install/install-remote.sh script.

1 Wire Thermometer Setup (optional)

First up, get your 1 wire thermometer talking to your Raspberry PI. Your shopping list will probably include something like:

There are lots of instructions available but here and here are good places to start.

Each sensor has a unqiue ID and when they're setup you'll see a list of them in /sys/bus/w1/devices

pi@pi3:~ $ ls /sys/bus/w1/devices
28-011447e2d1aa 28-0517600602ff w1_bus_master1

You can then copy data from the remote device using cat, which will report back the temperature as an integer in 1000ths of degrees:

pi@pi3:~ $ cat /sys/bus/w1/devices/28-011447e2d1aa/w1_slave
ff 00 4b 46 7f ff 0c 10 15 : crc=15 YES
ff 00 4b 46 7f ff 0c 10 15 t=15937

The Raspberry PI in my kitchen has two 1 Wire sensors connected, one measuring ambient temperature, and one in the fish tank. The host is called 'pi3' and the config.json is as follows

{
"sensorMap": {
"Kitchen": {
"id": "28-011447e2d1aa"
},
"FishTank": {
"id": "28-0517600602ff"
}
}
}

Temperature and Humidity Sensor Config (optional)

For ~20 GBP, you can buy a very workable low energy JINOU bluetooth sensor. They will work for over 6 months on a single CR2302 battery

There are lots of guides on enabling bluetooth on the PI. Do that! The pi0w is a good choice of device rfel

Check your Bluetooth configuration with sudo hciconfig

Scan for Bluetooth devices by running sudo hcitool lescan. The sensor in the bathroom appeared as

ED:01:5E:CF:2E:77 Jinou_Sensor_HumiTemp

You can directly pull the relevant attribute directly from the device with:

pi@pi0w:~ $ gatttool -b ED:01:5E:CF:2E:77 -u 0000aa21-0000-1000-8000-00805f9b34fb --char-read
handle: 0x0023 value: 00 16 08 00 30 09

The data structure is defined as follows:

 Service 0XAA20. Temp & humid data. There are 6 bytes.
1. Temperature positive/negative: 0 means positive (+) and 1 means negative (-)
2. Integer part of temperature. Show in Hexadecimal.
3. Decimal part of temperature. Show in Hexadecimal.
4. Reserved byte. Ignore it.
5. Integer part of humidity. Show in Hexadecimal.
6. Decimal part of humidity. Show in Hexadecimal.
For example: 00 14 05 22 32 08 means +20.5C 50.8%
01 08 09 00 14 05 means -8.9C 20.5%

This is all our node script does. To configure the pi0w host for this bluetooth sensor, I have a config.p0w.json file as follows:

{
"bluetooth": {
"Bathroom" : {
"id": "ED:01:5E:CF:2E:77"
}
}
}

Publishing to AWS CloudWatch

If you don't want to do this, you'll have to comment out the call in the publishMetric function.

If you do want to do this, you'll need some credentials in ~/.aws . These should have the minimum possible credentials to publish to CloudWatch.

The AWS CLI tool is not required, but may be useful to verify your user something like this:

pi@pi3:~ $ aws sts get-caller-identity
{
"UserId": "AIDA2134RUBBISH1234MADEUPSTUFF",
"Account": "123456789012",
"Arn": "arn:aws:iam::123456789012:user/pi"
}

I would recommend you setup a specific PI user and providew just these credentials and also consider how you will manage key rotation:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "cloudwatch:PutMetricData",
"Resource": "*"
}
]
}

The script will publish metrics in eu-west-1 region. You can update that by changing this line: AWS.config.update({region: 'eu-west-1'});

Publishing to Cloud Watch lets you easily setup monitors and dashboards. Example alarms might be:

  • Fish tank temperature is less than 20C for 1 hour
  • No data received from fish tank sensor
  • Bathroom humidity over 80% for 6 consecutive 10 minute samples

Publishing to MQTT (and hence Home Assistant)

If you don't want to do this, you'll have to comment out the call in the publishMetric function.

If you do want to do this, you'll need to have a working MQTT server. I would recommend installing mosquito_mqtt on some central server. This script assumes it can connect to mosquitto on a host called 'house' at mqtt://house with no authentication. Ideally we would be using client certificates.

If necessary, install MQTT on a host so the following line can connect to MQTT

varmqttClient=mqtt.connect('mqtt://house')

Install client tools with :

sudo apt-get install mosquitto-clients

To see what's going on, subscribe to messages with this command:

mosquitto_sub -h house -v -t \#
...
/sensordump/Kitchen/Temperature 16.125
/sensordump/Bathroom/Temperature 23
/sensordump/FishTank/Temperature 22.562
/sensordump/Bathroom/Humidity 47.2

You can also publish test messages with this command:

mosquitto_pub -h house -t some/topic -m "This is a test"

Along side the vlaues, the script also publishes configuration data for Home Assistant MQTT Discovery, so new devices connected to the same MQTT bus should be automatically discovered. For example:

homeassistant/sensor/Kitchen_Temperature/config {"device_class":"temperature","name":"Kitchen Temperature","state_topic":"/sensordump/Kitchen/Temperature","unit_of_measurement":"°C","device":{"identifiers":["28-011447e2d1aa"],"manufacturer":"NA","model":"NA","name":"Kitchen"}}

Random other notes:

Turning the service on and off for a given host

ssh pi@pi3 systemctl status homer-node ssh pi@pi3 systemctl status homer-node ssh pi@pi3 systemctl restart homer-node

About

Hacky nodejs script used as part of our home automation based on Home Assistant

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Introduction

Super simple node script that will periodially:

  • Fetch data from sensors near the PI
  • Publish that data over a WiFi connection

Possible use cases:

  • Monitoring temperature in the house over time.
  • CloudWatch Alarm when a fish tank temperature is out of range
  • Open/Close a window based on temperature / humidity of bathroom

Supported Sensors:

Supported Metrics platforms:

Basic installation

A Raspberry PI is a full blown computer. You can easily checkout and edit all the files directly on the box.

This package is written using node 10. It's very simple and probably any later version will work. If you don't know what you're doing with node installations (I don't really) you can just run:

sudo apt-get install nodejs npm

If you're using a remote laptop to configure the PI, Visual Studio Code and the Remote SSH extension are recommended.

If you are using this script, find your hostnae (for example pi3), then copy the config.example.json file to config.hostname.json, for example config.pi3.json. This will get picked up by the host on startup and the convention makes configuring multiple small boxes a little simpler.

If you want to install this to run on boot, it helps to register it with systemctl. Use the script in install/install.sh to do this. If you want to install or update this remotely on a number of devices (on a host that already hase node installed) then consider using the install/install-remote.sh script.

1 Wire Thermometer Setup (optional)

First up, get your 1 wire thermometer talking to your Raspberry PI. Your shopping list will probably include something like:

There are lots of instructions available but here and here are good places to start.

Each sensor has a unqiue ID and when they're setup you'll see a list of them in /sys/bus/w1/devices

pi@pi3:~ $ ls /sys/bus/w1/devices
28-011447e2d1aa 28-0517600602ff w1_bus_master1

You can then copy data from the remote device using cat, which will report back the temperature as an integer in 1000ths of degrees:

pi@pi3:~ $ cat /sys/bus/w1/devices/28-011447e2d1aa/w1_slave
ff 00 4b 46 7f ff 0c 10 15 : crc=15 YES
ff 00 4b 46 7f ff 0c 10 15 t=15937

The Raspberry PI in my kitchen has two 1 Wire sensors connected, one measuring ambient temperature, and one in the fish tank. The host is called 'pi3' and the config.json is as follows

{
"sensorMap": {
"Kitchen": {
"id": "28-011447e2d1aa"
},
"FishTank": {
"id": "28-0517600602ff"
}
}
}

Temperature and Humidity Sensor Config (optional)

For ~20 GBP, you can buy a very workable low energy JINOU bluetooth sensor. They will work for over 6 months on a single CR2302 battery

There are lots of guides on enabling bluetooth on the PI. Do that! The pi0w is a good choice of device rfel

Check your Bluetooth configuration with sudo hciconfig

Scan for Bluetooth devices by running sudo hcitool lescan. The sensor in the bathroom appeared as

ED:01:5E:CF:2E:77 Jinou_Sensor_HumiTemp

You can directly pull the relevant attribute directly from the device with:

pi@pi0w:~ $ gatttool -b ED:01:5E:CF:2E:77 -u 0000aa21-0000-1000-8000-00805f9b34fb --char-read
handle: 0x0023 value: 00 16 08 00 30 09

The data structure is defined as follows:

 Service 0XAA20. Temp & humid data. There are 6 bytes.
1. Temperature positive/negative: 0 means positive (+) and 1 means negative (-)
2. Integer part of temperature. Show in Hexadecimal.
3. Decimal part of temperature. Show in Hexadecimal.
4. Reserved byte. Ignore it.
5. Integer part of humidity. Show in Hexadecimal.
6. Decimal part of humidity. Show in Hexadecimal.
For example: 00 14 05 22 32 08 means +20.5C 50.8%
01 08 09 00 14 05 means -8.9C 20.5%

This is all our node script does. To configure the pi0w host for this bluetooth sensor, I have a config.p0w.json file as follows:

{
"bluetooth": {
"Bathroom" : {
"id": "ED:01:5E:CF:2E:77"
}
}
}

Publishing to AWS CloudWatch

If you don't want to do this, you'll have to comment out the call in the publishMetric function.

If you do want to do this, you'll need some credentials in ~/.aws . These should have the minimum possible credentials to publish to CloudWatch.

The AWS CLI tool is not required, but may be useful to verify your user something like this:

pi@pi3:~ $ aws sts get-caller-identity
{
"UserId": "AIDA2134RUBBISH1234MADEUPSTUFF",
"Account": "123456789012",
"Arn": "arn:aws:iam::123456789012:user/pi"
}

I would recommend you setup a specific PI user and providew just these credentials and also consider how you will manage key rotation:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "cloudwatch:PutMetricData",
"Resource": "*"
}
]
}

The script will publish metrics in eu-west-1 region. You can update that by changing this line: AWS.config.update({region: 'eu-west-1'});

Publishing to Cloud Watch lets you easily setup monitors and dashboards. Example alarms might be:

  • Fish tank temperature is less than 20C for 1 hour
  • No data received from fish tank sensor
  • Bathroom humidity over 80% for 6 consecutive 10 minute samples

Publishing to MQTT (and hence Home Assistant)

If you don't want to do this, you'll have to comment out the call in the publishMetric function.

If you do want to do this, you'll need to have a working MQTT server. I would recommend installing mosquito_mqtt on some central server. This script assumes it can connect to mosquitto on a host called 'house' at mqtt://house with no authentication. Ideally we would be using client certificates.

If necessary, install MQTT on a host so the following line can connect to MQTT

varmqttClient=mqtt.connect('mqtt://house')

Install client tools with :

sudo apt-get install mosquitto-clients

To see what's going on, subscribe to messages with this command:

mosquitto_sub -h house -v -t \#
...
/sensordump/Kitchen/Temperature 16.125
/sensordump/Bathroom/Temperature 23
/sensordump/FishTank/Temperature 22.562
/sensordump/Bathroom/Humidity 47.2

You can also publish test messages with this command:

mosquitto_pub -h house -t some/topic -m "This is a test"

Along side the vlaues, the script also publishes configuration data for Home Assistant MQTT Discovery, so new devices connected to the same MQTT bus should be automatically discovered. For example:

homeassistant/sensor/Kitchen_Temperature/config {"device_class":"temperature","name":"Kitchen Temperature","state_topic":"/sensordump/Kitchen/Temperature","unit_of_measurement":"°C","device":{"identifiers":["28-011447e2d1aa"],"manufacturer":"NA","model":"NA","name":"Kitchen"}}

Random other notes:

Turning the service on and off for a given host

ssh pi@pi3 systemctl status homer-node ssh pi@pi3 systemctl status homer-node ssh pi@pi3 systemctl restart homer-node

About

Hacky nodejs script used as part of our home automation based on Home Assistant

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Introduction

Super simple node script that will periodially:

  • Fetch data from sensors near the PI
  • Publish that data over a WiFi connection

Possible use cases:

  • Monitoring temperature in the house over time.
  • CloudWatch Alarm when a fish tank temperature is out of range
  • Open/Close a window based on temperature / humidity of bathroom

Supported Sensors:

Supported Metrics platforms:

Basic installation

A Raspberry PI is a full blown computer. You can easily checkout and edit all the files directly on the box.

This package is written using node 10. It's very simple and probably any later version will work. If you don't know what you're doing with node installations (I don't really) you can just run:

sudo apt-get install nodejs npm

If you're using a remote laptop to configure the PI, Visual Studio Code and the Remote SSH extension are recommended.

If you are using this script, find your hostnae (for example pi3), then copy the config.example.json file to config.hostname.json, for example config.pi3.json. This will get picked up by the host on startup and the convention makes configuring multiple small boxes a little simpler.

If you want to install this to run on boot, it helps to register it with systemctl. Use the script in install/install.sh to do this. If you want to install or update this remotely on a number of devices (on a host that already hase node installed) then consider using the install/install-remote.sh script.

1 Wire Thermometer Setup (optional)

First up, get your 1 wire thermometer talking to your Raspberry PI. Your shopping list will probably include something like:

There are lots of instructions available but here and here are good places to start.

Each sensor has a unqiue ID and when they're setup you'll see a list of them in /sys/bus/w1/devices

pi@pi3:~ $ ls /sys/bus/w1/devices
28-011447e2d1aa 28-0517600602ff w1_bus_master1

You can then copy data from the remote device using cat, which will report back the temperature as an integer in 1000ths of degrees:

pi@pi3:~ $ cat /sys/bus/w1/devices/28-011447e2d1aa/w1_slave
ff 00 4b 46 7f ff 0c 10 15 : crc=15 YES
ff 00 4b 46 7f ff 0c 10 15 t=15937

The Raspberry PI in my kitchen has two 1 Wire sensors connected, one measuring ambient temperature, and one in the fish tank. The host is called 'pi3' and the config.json is as follows

{
"sensorMap": {
"Kitchen": {
"id": "28-011447e2d1aa"
},
"FishTank": {
"id": "28-0517600602ff"
}
}
}

Temperature and Humidity Sensor Config (optional)

For ~20 GBP, you can buy a very workable low energy JINOU bluetooth sensor. They will work for over 6 months on a single CR2302 battery

There are lots of guides on enabling bluetooth on the PI. Do that! The pi0w is a good choice of device rfel

Check your Bluetooth configuration with sudo hciconfig

Scan for Bluetooth devices by running sudo hcitool lescan. The sensor in the bathroom appeared as

ED:01:5E:CF:2E:77 Jinou_Sensor_HumiTemp

You can directly pull the relevant attribute directly from the device with:

pi@pi0w:~ $ gatttool -b ED:01:5E:CF:2E:77 -u 0000aa21-0000-1000-8000-00805f9b34fb --char-read
handle: 0x0023 value: 00 16 08 00 30 09

The data structure is defined as follows:

 Service 0XAA20. Temp & humid data. There are 6 bytes.
1. Temperature positive/negative: 0 means positive (+) and 1 means negative (-)
2. Integer part of temperature. Show in Hexadecimal.
3. Decimal part of temperature. Show in Hexadecimal.
4. Reserved byte. Ignore it.
5. Integer part of humidity. Show in Hexadecimal.
6. Decimal part of humidity. Show in Hexadecimal.
For example: 00 14 05 22 32 08 means +20.5C 50.8%
01 08 09 00 14 05 means -8.9C 20.5%

This is all our node script does. To configure the pi0w host for this bluetooth sensor, I have a config.p0w.json file as follows:

{
"bluetooth": {
"Bathroom" : {
"id": "ED:01:5E:CF:2E:77"
}
}
}

Publishing to AWS CloudWatch

If you don't want to do this, you'll have to comment out the call in the publishMetric function.

If you do want to do this, you'll need some credentials in ~/.aws . These should have the minimum possible credentials to publish to CloudWatch.

The AWS CLI tool is not required, but may be useful to verify your user something like this:

pi@pi3:~ $ aws sts get-caller-identity
{
"UserId": "AIDA2134RUBBISH1234MADEUPSTUFF",
"Account": "123456789012",
"Arn": "arn:aws:iam::123456789012:user/pi"
}

I would recommend you setup a specific PI user and providew just these credentials and also consider how you will manage key rotation:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "cloudwatch:PutMetricData",
"Resource": "*"
}
]
}

The script will publish metrics in eu-west-1 region. You can update that by changing this line: AWS.config.update({region: 'eu-west-1'});

Publishing to Cloud Watch lets you easily setup monitors and dashboards. Example alarms might be:

  • Fish tank temperature is less than 20C for 1 hour
  • No data received from fish tank sensor
  • Bathroom humidity over 80% for 6 consecutive 10 minute samples

Publishing to MQTT (and hence Home Assistant)

If you don't want to do this, you'll have to comment out the call in the publishMetric function.

If you do want to do this, you'll need to have a working MQTT server. I would recommend installing mosquito_mqtt on some central server. This script assumes it can connect to mosquitto on a host called 'house' at mqtt://house with no authentication. Ideally we would be using client certificates.

If necessary, install MQTT on a host so the following line can connect to MQTT

varmqttClient=mqtt.connect('mqtt://house')

Install client tools with :

sudo apt-get install mosquitto-clients

To see what's going on, subscribe to messages with this command:

mosquitto_sub -h house -v -t \#
...
/sensordump/Kitchen/Temperature 16.125
/sensordump/Bathroom/Temperature 23
/sensordump/FishTank/Temperature 22.562
/sensordump/Bathroom/Humidity 47.2

You can also publish test messages with this command:

mosquitto_pub -h house -t some/topic -m "This is a test"

Along side the vlaues, the script also publishes configuration data for Home Assistant MQTT Discovery, so new devices connected to the same MQTT bus should be automatically discovered. For example:

homeassistant/sensor/Kitchen_Temperature/config {"device_class":"temperature","name":"Kitchen Temperature","state_topic":"/sensordump/Kitchen/Temperature","unit_of_measurement":"°C","device":{"identifiers":["28-011447e2d1aa"],"manufacturer":"NA","model":"NA","name":"Kitchen"}}

Random other notes:

Turning the service on and off for a given host

ssh pi@pi3 systemctl status homer-node ssh pi@pi3 systemctl status homer-node ssh pi@pi3 systemctl restart homer-node

About

Hacky nodejs script used as part of our home automation based on Home Assistant

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Introduction

Super simple node script that will periodially:

  • Fetch data from sensors near the PI
  • Publish that data over a WiFi connection

Possible use cases:

  • Monitoring temperature in the house over time.
  • CloudWatch Alarm when a fish tank temperature is out of range
  • Open/Close a window based on temperature / humidity of bathroom

Supported Sensors:

Supported Metrics platforms:

Basic installation

A Raspberry PI is a full blown computer. You can easily checkout and edit all the files directly on the box.

This package is written using node 10. It's very simple and probably any later version will work. If you don't know what you're doing with node installations (I don't really) you can just run:

sudo apt-get install nodejs npm

If you're using a remote laptop to configure the PI, Visual Studio Code and the Remote SSH extension are recommended.

If you are using this script, find your hostnae (for example pi3), then copy the config.example.json file to config.hostname.json, for example config.pi3.json. This will get picked up by the host on startup and the convention makes configuring multiple small boxes a little simpler.

If you want to install this to run on boot, it helps to register it with systemctl. Use the script in install/install.sh to do this. If you want to install or update this remotely on a number of devices (on a host that already hase node installed) then consider using the install/install-remote.sh script.

1 Wire Thermometer Setup (optional)

First up, get your 1 wire thermometer talking to your Raspberry PI. Your shopping list will probably include something like:

There are lots of instructions available but here and here are good places to start.

Each sensor has a unqiue ID and when they're setup you'll see a list of them in /sys/bus/w1/devices

pi@pi3:~ $ ls /sys/bus/w1/devices
28-011447e2d1aa 28-0517600602ff w1_bus_master1

You can then copy data from the remote device using cat, which will report back the temperature as an integer in 1000ths of degrees:

pi@pi3:~ $ cat /sys/bus/w1/devices/28-011447e2d1aa/w1_slave
ff 00 4b 46 7f ff 0c 10 15 : crc=15 YES
ff 00 4b 46 7f ff 0c 10 15 t=15937

The Raspberry PI in my kitchen has two 1 Wire sensors connected, one measuring ambient temperature, and one in the fish tank. The host is called 'pi3' and the config.json is as follows

{
"sensorMap": {
"Kitchen": {
"id": "28-011447e2d1aa"
},
"FishTank": {
"id": "28-0517600602ff"
}
}
}

Temperature and Humidity Sensor Config (optional)

For ~20 GBP, you can buy a very workable low energy JINOU bluetooth sensor. They will work for over 6 months on a single CR2302 battery

There are lots of guides on enabling bluetooth on the PI. Do that! The pi0w is a good choice of device rfel

Check your Bluetooth configuration with sudo hciconfig

Scan for Bluetooth devices by running sudo hcitool lescan. The sensor in the bathroom appeared as

ED:01:5E:CF:2E:77 Jinou_Sensor_HumiTemp

You can directly pull the relevant attribute directly from the device with:

pi@pi0w:~ $ gatttool -b ED:01:5E:CF:2E:77 -u 0000aa21-0000-1000-8000-00805f9b34fb --char-read
handle: 0x0023 value: 00 16 08 00 30 09

The data structure is defined as follows:

 Service 0XAA20. Temp & humid data. There are 6 bytes.
1. Temperature positive/negative: 0 means positive (+) and 1 means negative (-)
2. Integer part of temperature. Show in Hexadecimal.
3. Decimal part of temperature. Show in Hexadecimal.
4. Reserved byte. Ignore it.
5. Integer part of humidity. Show in Hexadecimal.
6. Decimal part of humidity. Show in Hexadecimal.
For example: 00 14 05 22 32 08 means +20.5C 50.8%
01 08 09 00 14 05 means -8.9C 20.5%

This is all our node script does. To configure the pi0w host for this bluetooth sensor, I have a config.p0w.json file as follows:

{
"bluetooth": {
"Bathroom" : {
"id": "ED:01:5E:CF:2E:77"
}
}
}

Publishing to AWS CloudWatch

If you don't want to do this, you'll have to comment out the call in the publishMetric function.

If you do want to do this, you'll need some credentials in ~/.aws . These should have the minimum possible credentials to publish to CloudWatch.

The AWS CLI tool is not required, but may be useful to verify your user something like this:

pi@pi3:~ $ aws sts get-caller-identity
{
"UserId": "AIDA2134RUBBISH1234MADEUPSTUFF",
"Account": "123456789012",
"Arn": "arn:aws:iam::123456789012:user/pi"
}

I would recommend you setup a specific PI user and providew just these credentials and also consider how you will manage key rotation:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "cloudwatch:PutMetricData",
"Resource": "*"
}
]
}

The script will publish metrics in eu-west-1 region. You can update that by changing this line: AWS.config.update({region: 'eu-west-1'});

Publishing to Cloud Watch lets you easily setup monitors and dashboards. Example alarms might be:

  • Fish tank temperature is less than 20C for 1 hour
  • No data received from fish tank sensor
  • Bathroom humidity over 80% for 6 consecutive 10 minute samples

Publishing to MQTT (and hence Home Assistant)

If you don't want to do this, you'll have to comment out the call in the publishMetric function.

If you do want to do this, you'll need to have a working MQTT server. I would recommend installing mosquito_mqtt on some central server. This script assumes it can connect to mosquitto on a host called 'house' at mqtt://house with no authentication. Ideally we would be using client certificates.

If necessary, install MQTT on a host so the following line can connect to MQTT

varmqttClient=mqtt.connect('mqtt://house')

Install client tools with :

sudo apt-get install mosquitto-clients

To see what's going on, subscribe to messages with this command:

mosquitto_sub -h house -v -t \#
...
/sensordump/Kitchen/Temperature 16.125
/sensordump/Bathroom/Temperature 23
/sensordump/FishTank/Temperature 22.562
/sensordump/Bathroom/Humidity 47.2

You can also publish test messages with this command:

mosquitto_pub -h house -t some/topic -m "This is a test"

Along side the vlaues, the script also publishes configuration data for Home Assistant MQTT Discovery, so new devices connected to the same MQTT bus should be automatically discovered. For example:

homeassistant/sensor/Kitchen_Temperature/config {"device_class":"temperature","name":"Kitchen Temperature","state_topic":"/sensordump/Kitchen/Temperature","unit_of_measurement":"°C","device":{"identifiers":["28-011447e2d1aa"],"manufacturer":"NA","model":"NA","name":"Kitchen"}}

Random other notes:

Turning the service on and off for a given host

ssh pi@pi3 systemctl status homer-node ssh pi@pi3 systemctl status homer-node ssh pi@pi3 systemctl restart homer-node

About

Hacky nodejs script used as part of our home automation based on Home Assistant

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages