summaryrefslogtreecommitdiffstats
path: root/krebs/2configs/shack/powerraw.nix
diff options
context:
space:
mode:
Diffstat (limited to 'krebs/2configs/shack/powerraw.nix')
-rw-r--r--krebs/2configs/shack/powerraw.nix79
1 files changed, 79 insertions, 0 deletions
diff --git a/krebs/2configs/shack/powerraw.nix b/krebs/2configs/shack/powerraw.nix
new file mode 100644
index 00000000..cc3692e8
--- /dev/null
+++ b/krebs/2configs/shack/powerraw.nix
@@ -0,0 +1,79 @@
+{ config, lib, pkgs, ... }:
+# Replacement for powerraw.shack pollin box
+# Requires usb-serial device on host
+# Requires mqtt available at mqtt.shack
+# Requires hostname powerraw.shack
+let
+ influx-url = "http://influx.shack:8086";
+ pkg = pkgs.python3.pkgs.callPackage (
+ pkgs.fetchgit {
+ url = "https://git.shackspace.de/rz/powermeter.git";
+ rev = "438b08f";
+ sha256 = "0c5czmrwlw985b7ia6077mfrvbf2fq51iajb481pgqbywgxqis5m";
+ }) {};
+in {
+ # receive response from light.shack / standby.shack
+ networking.firewall.allowedUDPPorts = [ 11111 ];
+ users.users.powermeter.extraGroups = [ "dialout" ];
+
+ # we make sure that usb-ttl has the correct permissions
+ # creates /dev/powerraw
+ services.udev.extraRules = ''
+ SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="powerraw", MODE="0660", GROUP="dialout"
+ '';
+ systemd.services.powermeter-serial2mqtt = {
+ description = "powerraw Serial -> mqtt";
+ wantedBy = [ "multi-user.target" ];
+ serviceConfig = {
+ User = "powermeter";
+ ExecStart = "${pkg}/bin/powermeter-serial2mqtt /dev/powerraw";
+ PrivateTmp = true;
+ Restart = "always";
+ RestartSec = "15";
+ };
+ };
+
+ systemd.services.powermeter-mqtt2socket = {
+ description = "powerraw mqtt -> raw socket 11111";
+ wantedBy = [ "multi-user.target" ];
+ serviceConfig = {
+ User = "powermeter";
+ ExecStart = "${pkg}/bin/powermeter-mqtt2socket";
+ PrivateTmp = true;
+ Restart = "always";
+ RestartSec = "15";
+ };
+ };
+
+ services.telegraf = {
+ enable = true;
+ extraConfig = {
+ agent.debug = false;
+ outputs = {
+ influxdb = [{
+ urls = [ influx-url ];
+ database = "telegraf";
+ }];
+ };
+ };
+ };
+
+ services.telegraf.extraConfig.inputs.mqtt_consumer = let
+ genTopic = name: topic: tags: {
+ servers = [ "tcp://mqtt.shack:1883" ];
+ qos = 0;
+ connection_timeout = "30s";
+ topics = [ topic ];
+ inherit tags;
+ persistent_session = false;
+ name_override = name;
+ data_format = "value";
+ data_type = "float";
+ };
+ sensor = "total";
+ types = [ "Voltage" "Current" "Power" ];
+ phases = [ "1" "2" "3" ];
+ in
+ [ (genTopic "Power consumed" "/power/${sensor}/consumed" { inherit sensor; }) ] ++
+ (lib.flatten (map (type: (map (phase: (genTopic "Power" "/power/${sensor}/L${toString phase}/${type}" { inherit sensor phase type; }) ) phases)) types));
+}