diff options
-rwxr-xr-x | scd4x | 88 | ||||
-rwxr-xr-x | scd4x.pl | 51 |
2 files changed, 88 insertions, 51 deletions
@@ -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; +} |