aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2024-01-04 13:33:02 +0100
committerGerd Hoffmann <kraxel@redhat.com>2024-01-04 13:33:02 +0100
commit0bebc728b65935569fe1416aa262ab2dbc9a4e14 (patch)
tree171538907f080487797b2e73ac85aa98bba00566
parent5a8ae4726e1f9217d5fe659e1908b26203651f17 (diff)
downloadhue-0bebc728b65935569fe1416aa262ab2dbc9a4e14.tar.gz
scd4x: rewrite in python
-rwxr-xr-xscd4x88
-rwxr-xr-xscd4x.pl51
2 files changed, 88 insertions, 51 deletions
diff --git a/scd4x b/scd4x
index aae5919..e0a496f 100755
--- a/scd4x
+++ b/scd4x
@@ -1,51 +1,37 @@
-#!/usr/bin/perl
-use warnings;
-use strict;
-use English;
-use POSIX;
-use JSON;
-use Net::MQTT::Simple;
-
-my $file = shift;
-my $host = shift;
-
-my $json = JSON->new->allow_nonref;
-my $mqtt;
-
-my $values;
-my $pvalues;
-my $serial;
-
-sub read_json_file {
- my $filename = shift;
- my $content;
-
- open FILE, '<', $filename or die "read $filename: $!";
- { local $/; undef $/; $content = <FILE> }
- close FILE;
-
- return $json->decode($content);
-}
-
-if (defined($host)) {
- $mqtt = Net::MQTT::Simple->new($host) or die "mqtt init (server $host)"
-}
-
-for (;;) {
- $values = read_json_file($file);
- $serial = $values->{'serial'};
- for my $key ('co2', 'temperature', 'humidity') {
- next if defined($pvalues->{$key}) and $pvalues->{$key} eq $values->{$key};
- my $topic = "sensors/" . $key . "/scd4x/" . $serial;
- if (defined($mqtt)) {
- $mqtt->retain( $topic => $values->{$key} );
- } else {
- my $ts = POSIX::ctime(time());
- chomp($ts);
- printf("[%s] %-40s: %s\n",
- $ts, $topic, $values->{$key});
- }
- }
- $pvalues = $values;
- sleep 60;
-}
+#!/usr/bin/python3
+import sys
+import json
+
+import paho.mqtt.client as mqtt
+
+def main():
+ if len(sys.argv) < 3:
+ print(len(sys.argv))
+ print(f'usage: {sys.argv[0]} json-file mqtt-host')
+ return 1
+
+ filename = sys.argv[1]
+ mqtthost = sys.argv[2]
+
+ client = mqtt.Client()
+ client.connect(mqtthost, 1883)
+
+ pvalues = {}
+ while True:
+ with open(filename, 'r', encoding = 'utf-8') as f:
+ values = json.loads(f.read())
+
+ for key in ('co2', 'temperature', 'humidity'):
+ curr = values.get(key)
+ prev = pvalues.get(key)
+ if prev and prev == curr:
+ continue
+
+ topic = f'sensors/{key}/scd4x/{values.get("serial")}'
+ #print(f'{topic} = {curr}')
+ client.publish(topic, curr)
+
+ pvalues = values
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/scd4x.pl b/scd4x.pl
new file mode 100755
index 0000000..aae5919
--- /dev/null
+++ b/scd4x.pl
@@ -0,0 +1,51 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+use English;
+use POSIX;
+use JSON;
+use Net::MQTT::Simple;
+
+my $file = shift;
+my $host = shift;
+
+my $json = JSON->new->allow_nonref;
+my $mqtt;
+
+my $values;
+my $pvalues;
+my $serial;
+
+sub read_json_file {
+ my $filename = shift;
+ my $content;
+
+ open FILE, '<', $filename or die "read $filename: $!";
+ { local $/; undef $/; $content = <FILE> }
+ close FILE;
+
+ return $json->decode($content);
+}
+
+if (defined($host)) {
+ $mqtt = Net::MQTT::Simple->new($host) or die "mqtt init (server $host)"
+}
+
+for (;;) {
+ $values = read_json_file($file);
+ $serial = $values->{'serial'};
+ for my $key ('co2', 'temperature', 'humidity') {
+ next if defined($pvalues->{$key}) and $pvalues->{$key} eq $values->{$key};
+ my $topic = "sensors/" . $key . "/scd4x/" . $serial;
+ if (defined($mqtt)) {
+ $mqtt->retain( $topic => $values->{$key} );
+ } else {
+ my $ts = POSIX::ctime(time());
+ chomp($ts);
+ printf("[%s] %-40s: %s\n",
+ $ts, $topic, $values->{$key});
+ }
+ }
+ $pvalues = $values;
+ sleep 60;
+}