cc128_log_mysql.pl 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #!/usr/bin/perl
  2. # Log CurrentCost power meter data to a mysql database.
  3. # Assumes data is coming in on MQTT topic sensors/cc128
  4. # and in format timestamp,temperature,ch1_data
  5. # e.g. 1276605752,12.7,86
  6. # To create database, table and user:
  7. #
  8. # CREATE DATABASE powermeter;
  9. # USE 'powermeter';
  10. # CREATE TABLE powermeter (
  11. # `id` INT NOT NULL auto_increment,
  12. # `timestamp` INT NOT NULL,
  13. # `temperature` FLOAT NOT NULL DEFAULT 0.0,
  14. # `ch1` INT NOT NULL DEFAULT 0,
  15. # PRIMARY KEY (`id`),
  16. # UNIQUE KEY `timestamp` (`timestamp`)
  17. # ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  18. #
  19. # CREATE USER 'powermeter'@'localhost' IDENTIFIED BY '<your password>';
  20. # GRANT ALL ON powermeter.* to 'powermeter'@'localhost';
  21. use strict;
  22. use DBI();
  23. use FileHandle;
  24. local $| = 1;
  25. my $dbname = "powermeter";
  26. my $dbhost = "localhost";
  27. my $dbusername = "powermeter";
  28. my $dbpassword = "<your password>";
  29. my $dbtable = "powermeter";
  30. my $subclient = "mosquitto_sub -t sensors/cc128";
  31. open(SUB, "$subclient|");
  32. SUB->autoflush(1);
  33. my $dbh = DBI->connect("DBI:mysql:database=$dbname;host=$dbhost",
  34. "$dbusername", "$dbpassword", {'RaiseError' => 1});
  35. my $query = "INSERT INTO powermeter (timestamp, temperature, ch1) VALUES (?,?,?)";
  36. my @vals;
  37. my ($timestamp, $temperature, $ch1);
  38. while (my $line = <SUB>) {
  39. @vals = split(/,/, $line);
  40. $timestamp = @vals[0];
  41. $temperature = @vals[1];
  42. $ch1 = @vals[2];
  43. $dbh->do($query, undef, $timestamp, $temperature, $ch1);
  44. }
  45. $dbh->disconnect();