1-wire og MoistEx

I Norge fins det på markedet et vannstoppsystem kalt MoistEx. Dette består av en magnetventil, en trykksensor, en kontrollboks, sensorer og om ønskelig fjernbryter for ventilen. Dersom en av sensorene som plasseres på passende steder i et hus, oppdager vann, sendes et signal til kontrollboksen, som stenger ventilen. Ventilen vil normalt monteres ved husets hovedkran, slik at vannet stenges automatisk for hele huset ved en vannlekkasje. I tillegg kan kontrollboksen settes opp til automatisk å stenge vannet for en periode om natta og i denne perioden undersøke om det blir et trykkfall, som kan skyldes en skjult lekkasje. Feiler testen to ganger, vil ikke ventilen åpnes igjen.

Dette systemet er interessant ikke bare fordi det er ei billig forsikring mot vannskader som følge av lekkasjer, men fordi kontrollboksen også har flere inn- og utganger som gjør det mulig å utvide funksjonaliteten. Her kommer 1-wire til anvendelse.

Kontrollboksen gir mulighet for å kople til to ledninger som vil forbindes dersom ventilen er lukka. Dette gjør det mulig å varsle om en lekkasje. Jeg har brukt dette til å sørge for at varsel blir sendt på sms dersom ventilen lukkes.

Til kontrollboksen kan det også koples til to ledninger som vil stenge ventilen dersom ledningene forbindes. Dermed blir det mulig å stenge av vannet på andre måter.

Til slutt har kontrollboksen en utgang som gjør det mulig å avlese vanntrykket. En kan avlese ei spenning i volt og gange dette med 500 og trekke fra 250 for å få vanntrykk i kPa (eller med 5 og trekke fra 2,5 for å få trykk i bar). Dette er relativt trykk, så tomt rør gir 0 kPa. Dette kan brukes til kalibrering, og jeg fant at jeg måtte i stedet trekke fra 240 kPa (2,4 bar) for korrekt trykk.

Trykkavlesinger kan brukes til å lage en mer avansert trykktest enn den innebygde testen. Med egen test kan en f.eks. legge inn passende marginer dersom en kjenner til at det fins enkelte mindre farlige "lekkasjer" (som ei dryppende kran) eller andre gode årsaker til trykkvariasjoner (f.eks. p.g.a. en varmtvannsbereder). Jeg syns det også kan være interessant å logge vanntrykket, som sier litt om kvaliteten på vanntilførselen i nabolaget. Og en graf som viser fallende vanntrykk når ventilen er stengt, vil kunne si en del om en lekkasje og gjøre den lettere å finne. For eksempel vil nivået som trykket bunner ut i, si hvor høgt i rørsystemet lekkasjen sannsynligvis er. 1 meter vann gir ca. 10 kPa trykk.

Koplingsskjema

Jeg gjorde som følger: Til en TAI8555 (en 1-wire-bryter) kopla jeg både utgangen som viser om ventilen er åpen eller lukka, og inngangen som lukker ventilen. Utgangen for vanntrykket kopla jeg til en LP-THS (som inneholder en DS2438 spenningsovervåker). Disse to kretsene hang så på en 1-wire-buss kopla til en Linksys WRT54GS trådløs ruter som jeg hadde satt inn en 1-wire-adapter i. På ruteren har jeg installert owfs, som er et styringsprogram for 1-wire, og den er satt opp som en trådløs klient i stedet for ruter. Ettersom jeg ikke har noen nettverkskabel til rommet der hovedkrana og MoistEx-en er, var dette en praktisk måte å gjøre det på. Men det er naturligvis mulig å bruke en pc i stedet eller en Linksys NSLU2 og annet tilbehør for å komme på nett trådløst.

MoistEx har innebygd batteri som sikrer videre drift ved strømbrudd, og ruteren som bare trekker noen få Watt, står på en liten UPS og vil dermed også overleve mange timer om strømmen faller bort.

Alle koplinger mot kontrollboksen gjøres med skruklemmer, så ingen inngrep i boksen eller loddinger er nødvendige.

I tillegg har jeg satt opp en temperatursensor på vannrøret og lagt isolasjon rundt, som vil vise vanntemperaturen. Denne sensoren viser vannforbruk. Om det ikke er noe vannforbruk, vil vanntemperaturen nærme seg den omkringliggende temperaturen. For kompletthets skyld har jeg også en fuktighetsmåler.

Med owfs kommer dukker sensorene opp som filer i filsystemet under Linux på Linksys-boksen. Status på ventilen kan jeg få vite ved å lese fila /tmp/1wire/12.E83132000000/power og ventilen kan lukkes eller åpnes igjen ved å skrive til /tmp/1wire/12.E83132000000/PIO.ALL, eller jeg kan lese av vanntrykket fra fila /tmp/1wire/1F.A4BE02000000/main/26.93A642000000/VAD (jeg har montert 1-wire-filsystemet under /tmp/1wire og de lange tallkodene er adresser på 1-wire-bussen, som er unike for mitt oppsett).

Jeg skreiv så litt enkelt programvare som overvåker og logger vanntrykk, temperatur, og status på ventilen. Dersom ventilen stenges uventa, sender Linksys-boksen en mail til en tjeneste som sender videre til mobiltelefon.

Jeg har også mulighet til å logge meg på Linksys-boksen når jeg ikke er hjemme og stenge vannet. Dette kan muligens være kjekt om en glømte å skru av vannet før avreise. Eller ikke minst om sensorene ikke har oppdaga en lekkasje og naboen ringer og forteller at vannet renner ut under inngangsdøra...

I grafen under vises vanntrykket for et enkeltdøgn. Dette er trykket inn til huset, før husets reduksjonsventil. Vi kan tydelig se en døgnvariasjon. Naturlig nok er trykket høgst og mest stabilt om natta og lavest om morgenen; det er lett å se at nabolaget begynner å våkne til live ved 6-tida (0400 UTC), og spesielt mellom 7 og 8 er vannforbruket stort. Vanntrykket er plotta som minuttsmiddel.

Vanntrykk

Eget vannforbruk påvirker vanntrykket bare i liten grad, så dette er det lettere å lese ut fra vanntemperaturen, som vist for samme periode i grafen under. I perioder uten vannforbruk vil temperaturen stige opp mot omgivelsestemperaturen, i dette tilfellet ca. 17 °C.

Vanntemperatur


Oppdatering

Etter installasjonen over har jeg skaffa meg et Visonic PowerMax+ alarmsystem og seriekopla røykvarslere fra Deltronic. Jeg ønska at alarmsentralen skulle varsle meg med sms ved vannlekkasje i stedet for å gå omvegen om en internettjeneste, samt at brannalarm skulle føre til at ventilen ikke vil stenges og at den vil åpnes dersom den var stengt; dette for å gjøre brannslokking med vannslange mulig. Brannalarmen kan også startes manuelt, dersom brann oppdages og forsøkes slokt før røyksensorene reagerer.

Dessuten kan jeg med et alarmsystem sørge for at vannet automatisk holdes avstengt når ingen er hjemme, men dette krever bare et samspill mellom sentralen og WRT54GS, som ikke påvirker oppsettet for øvrig. Kort sagt, jeg ønska meg full integrering av brannvarslere, vannstoppventil og alarmsentral.

Koplingsskjemaet under viser det nye oppsettet. Jeg bruker PowerMax-modulen MCT-100 som kopling mot alarmsentralen. Sentralen står et annet sted i huset, og MCT-100 sørger for trådløs overføring til denne. MCT-100 har to innganger. Den ene er kopla opp mot en bryter styrt av WRT54GS via 1-wire-bussen. Jeg bruker her 4R3-R1 fra Hobby Boards, som er et kort med fire brytere. Den andre inngangen er kopla mot en Deltronic WR-1201 (C-NC). Dette er en trådløs modul til Deltronic seriekopla røykvarslere. Dersom en varsler i huset melder om røyk, trigges en bryter i WR-1201 og MCT-100 vil melde videre til alarmsentralen. Dessuten har jeg kopla WR-1201 (C-NO) også mot en inngangen på en ny TAI8555, slik at WRT54GS også orienteres om en brannalarm.

WR-1201 kan også brukes til å trigge en brannalarm. Dette er kanskje ikke så nyttig, men en mulig bruk er dersom WRT54GS får vite om innbrudd fra alarmsentralen, kan den trigge brannalarm som fører til piping i alle etasjer som ei ekstra sirene. Til dette bruker jeg to brytere på kortet fra Hobby Boards, satt i serie. Begge bryterne må lukkes for å aktivere alarmen og den ekstra bryteren er ment som en sikkerhet mot feilaktivering. Skulle jeg slippe opp for brytere, kan den ekstra bryteren naturligvis frigjøres.

Å tvinge ventilen til åpen stilling er litt mer komplisert. Ventilen styres av ei felles plusstilkopling (klemme 7 på MoistEx kontrollboks) og ei minustilkopling for åpning (klemme 8) og ei minustilkopling for stenging (klemme 9). Koples ledningen for åpning kortvarig til jord (klemme 11), vil ventilen åpne; koples ledningen for stenging kortvarig til jord, vil ventilen stenge. Så ved brannalarm må derfor ledningen for stenging brytes. Deretter, i tilfelle ventilen alt var stengt, må ledningen for åpning koples om til jord (klemme 11). Den kan så koples tilbake (til klemme 8), mens stengeledningen må holdes brutt så lenge det er nødvendig.

For å gjøre dette, bruker jeg to TAI8555. Den samme som overvåker C-NO fra WR-1201 (forbindes ved brannalarm), sørger for å styre hvorvidt åpneledningen går til klemme 8 (normal tilstand) eller til klemme 11 (tvangsåpning). Stengeledningen går gjennom en annen TAI8555 som måtte legges til.

Sistnevnte kunne ha gått gjennom den siste bryteren på kortet fra Hobby Boards, slik at jeg kunne ha spart en TAI8555. Men bryterne på kortet fra Hobby Boards åpnes ved spenningsbortfall, mens bryteren på TAI8555 beholder sin tilstand. Jeg bruker riktignok en UPS til å drive alt dette, og den skulle kunne holde liv i alt i timesvis dersom strømmen faller ut, men for sikkerhets skyld bruker jeg en TAI8555. Jeg bruker bryterne på kortet fra Hobby Boards til det ikke-kritiske; faller strømmen fullstendig ut, er alt som skjer at WRT54GS ikke vil kunne starte en brannalarm og alarmsentralen vil motta melding om vannlekkasje (litt misvisende, men det kan uansett være greit å få melding om at noe er feil).

MoistEx

Fra toppen: En boks med TAI8555 og LP-THS (fra det opprinnelige oppsettet), to ytterligere TAI8555, fuktighetsmåler, Linksys WRT54GS, MCT-100, 4R3-R1, MoistEx kontrollboks, voltmeter for manuell avlesing av vanntrykk og WR-1201. Vannrør og ventilen er bak veggen.

Koplingsskjema

Strengt tatt kunne jeg har frigitt TAI8555-en brukt i det første oppsettet ved å bruke en bryter fra Hobby Boards til å stenge vannet (er strømmen borte, vil uansett ikke WRT54GS stenge vannet), og jeg kunne ha brukt en ledig inngang på TAI8555 (den som bryter stengeledningen til ventilen), men dette var ikke aktuelt ettersom jeg hadde montert det opprinnelige oppsettet i en egen, separat boks som det ville være arbeid å gjøre om på.

Den som ønsker det hele oppsettet og som gjør det fra grunnen av, vil sannsynligvis ville gjøre det med færrest mulig komponenter, så for kompletthets skyld inkluderer jeg et koplingsskjema for det også:

Koplingsskjema

Til slutt en siste utvidelse av systemet: Fra før hadde jeg en temperaturføler på kaldtvannsrøret, og jeg har økt dette med ytterligere sensorer for varmtvannsrøret (nærmest berederen) og for lufttemperaturen ved de to målepunkta på røra. På den måten får jeg ikke bare vanntemperaturene, men også differansen mot den omkringliggende lufta. Når differansen plottes på en logaritmisk skala, gir det et bilde av forbruket av kaldt- og varmtvann. Et eksempel er vist under.

Vanntrykk


Oppdatering II

Etter et års drift kunne følgende plott over vanntrykket (ukesmiddel i kPa) lages:

Vanntrykk

Det er få variasjoner, men vi kan se et tydelig fall tidlig i juni under en hetebølge. Dessuten er det et lite hopp opp til et nytt nivå rundt 1. oktober av uviss grunn. Vanntemperaturen (ukesmiddel i °C) varierer naturligvis mer:

Vanntrykk

Grafen er basert på laveste vanntemperatur i løpet av ei uke, som sikrer at det er temperaturen på rennende vann som måles og ikke på stillestående vann som påvirkes av den varmere omkringliggende lufta. Om vinteren ligger temperaturen på ca. 5 °C, som tilsvarer omtrent luftas årsmiddeltemperatur, men om sommeren stiger den til 13-14 °C, som er typiske månedsmiddel for lufttemperaturen i disse månedene. Fra tidlig september endra jeg logginga til å midle mer, som forklarer at grafen fram til da inneholder mer støy.


Oppdatering III

Det har nå gått noen år, og en del av komponentene jeg har brukt, er vanskelig å oppdrive. Skulle jeg gjøre alt om igjen nå (april 2010), ville jeg ha tatt utgangspunkt i:

Vær oppmerksom på at jeg ikke har forsøkt et slikt oppsett.


Tillegg

1. Programmeringsveiledning

Min 1-wire-buss ser slik ut:

FilFunksjonKommentar
05.154226000000/PIO ubrukt (4R3-R1 relé 4)
05.901D26000000/PIO bryter 2 til brannvarsler (4R3-R1 relé 2)1=på, 0=av (alarm når bryter 1 og 2 er på)
05.A8F620000000/PIO bryter 1 til brannvarsler (4R3-R1 relé 1)1=på, 0=av (alarm når bryter 1 og 2 er på)
05.CB4226000000/PIO varsler alarmsentral (4R3-R1 relé 3)1=ingen alarm, 0=alarm
12.8F9B53000000/PIO.ALL bryter for ventilens stengeledning0,1 -> 1,0 bryter, 1,0 -> 0,1 = forbinder
12.8F9B53000000/power ubrukt
12.DF9353000000/PIO.ALL bryter for ventilens åpningsledning0,1 -> 1,0 -> 0,1 tvangsåpner (bryt stengeledning først)
12.DF9353000000/power status brannvarsler1=ingen alarm, 0=alarm
12.E83132000000/PIO.ALL ventillukker1,0 -> 0,1 stenger, 0,1 -> 1,0 tilbakefører
12.E83132000000/power status magnetventil1=åpen, 0=stengt (som signallert fra MoistEx)
26.E6D6A3000000/humidity luftfuktighet kjellerbu
26.E6D6A3000000/temperature temperatur kjellerbu (reserve)
28.12DD99000000/temperature ubrukt
28.5A0F9A000000/temperature ubrukt
28.6518A3000000/temperature lufttemperatur omkring varmtvann
28.77DEA2000000/temperature temperatur kaldtvann
28.7BD0A2000000/temperature temperatur varmtvann
28.8FF9A2000000/temperature lufttemperatur omkring kaldtvann
1F.CDB902000000/main/26.86A842000000/temperatureintern temperatur WRT54GS
1F.ACC802000000/main/26.94AC42000000/temperature temperatur kjellerbu
1F.ACC802000000/main/26.94AC42000000/VAD vanntrykkVAD * 5 - 2,4 gir trykk i bar

2. C-program for logging

Her følger C-programmet som jeg bruker til å logge vanntrykk, temperaturer osv. Det leser ei konfigurasjonsfil /etc/moistex (angitt som første argument) og lager én loggverdi for hver linje. Hver linje består av filnavn for sensor, kalibreringsfaktor og kalibreringsforskyving. Programmet lager ei loggfil tilsvarende slik Oww gjør det. Det har minimalt med feilsjekking.


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/param.h>

double readf(const char *filename)
{

  FILE *f;
  double d;

  f = fopen(filename, "r");

  if (!f)
    return sqrt(-1);

  fscanf(f, "%lf", &d);
  fclose(f);

  return d;
}

unsigned int readmany(double *output, char*const* input)
{

  unsigned int count = 0;

  while (input[count]) {

    output[count] = readf(input[count]);
    count++;

    sleep(1);
  }
  return count;
}


int main(int argc, const char** argv)
{

  FILE *inf;
  FILE *outf;
  char *s;

  int count = 0, count2, i;
  char** filenames;

  double* factors;
  double* offsets;
  double* values;

  double* sums;
  unsigned int* counts;
  time_t lasttime, now;

  char timestamp[15];
  unsigned int interval = 300, pid;

  if (argc != 4 && argc != 5) {

    printf("Usage: %s <sensorfile> <logfile> <loginterval in seconds> [<userid>]\n", argv[0]);
    return -1;
  }
  inf = fopen(argv[1], "r");

  if (!inf) {
    printf("%s: Could not open infile %s\n", argv[0], argv[1]);
    return -1;
  }

  umask(0);
  setpgrp();

  if (fork())
    return 0;

  outf = fopen(argv[2], "a");

  if (!outf) {
    printf("%s: Could not open outfile %s\n", argv[0], argv[2]);
    return -1;
  }
  fclose(outf);

  interval = atoi(argv[3]);

  if (argc == 5)
    setuid(atoi(argv[4]));

  s = malloc(65536);
  while (s && fscanf(inf, "%s", s) > 0) {

    char *endptr;
    double d;
    d = strtod(s, &endptr);

    count += endptr == s;
  }
  fclose(inf);

  free(s);
  filenames = (char **)malloc((count+1) * sizeof(const char*));
  values = (double*)malloc(count * sizeof(double));
  factors = (double*)malloc(count * sizeof(double));
  offsets = (double*)malloc(count * sizeof(double));
  counts = (unsigned int*)malloc(count * sizeof(unsigned int));
  sums = (double*)malloc(count * sizeof(double));

  inf = fopen(argv[1], "r");
  if (!inf)
    return -1;

  count = 0;
  s = malloc(65536);

  while (fscanf(inf, "%s", s) > 0) {

    char *endptr;
    double d;

    filenames[count] = (char*)malloc(strlen(s));

    d = strtod(s, &endptr);
    if (endptr == s) {

      strcpy(filenames[count], s);
      factors[count] = 1;

      offsets[count] = 0;
      count++;
      count2 = 0;
    } else {

      if (count2 == 0)
        factors[count-1] = d;

      if (count2 == 1)
        offsets[count-1] = d;

      count2++;
    }
  }
  filenames[count] = 0;
  fclose(inf);

  free(s);

  chdir("/");

  for (i = 0; i < count; i++) {
    sums[i] = 0;
    counts[i] = 0;
  }

  lasttime = time(NULL);
  while(1) {

    now = time(NULL);
    readmany(values, filenames);

    for (i = 0; i < count; i++)

      if (finite(values[i])) {
        sums[i] += values[i] * factors[i] + offsets[i];
        counts[i]++;
      }

    if (now - lasttime >= interval) {

      time_t middle = now - interval / 2;
      struct tm* scratch_time = gmtime(&middle);

      lasttime = now;
      strftime(timestamp, sizeof(timestamp), "%Y%m%d%H%M%S", scratch_time);

      outf = fopen(argv[2], "a");

      if (outf)
        fprintf(outf, "%s", timestamp);

      for (i = 0; i < count; i++) {

        double avg = sums[i] / counts[i];

        if (outf)
          if (finite(avg) && counts[i] > 0)
            fprintf(outf, " %7.3f", sums[i] / counts[i]);
          else
            fprintf(outf, "     nan");
        sums[i] = 0;
        counts[i] = 0;
      }
      if (outf) {
        fprintf(outf, "\n");
        fclose(outf);
      }
    }
  }

  return 0;
}
/etc/moistex er hos meg:

/tmp/1wire/28.6518A3000000/temperature 1.0 0.1
/tmp/1wire/1F.ACC802000000/main/26.94AC42000000/temperature 1.0 0
/tmp/1wire/1F.ACC802000000/main/26.94AC42000000/VAD 5 -2.4
/tmp/1wire/28.8FF9A2000000/temperature 1.0 0.0
/tmp/1wire/26.E6D6A3000000/humidity
/tmp/1wire/12.E83132000000/power
/tmp/1wire/12.DF9353000000/power
/tmp/1wire/28.7BD0A2000000/temperature 1.0 -0.2
/tmp/1wire/28.77DEA2000000/temperature 1.0 0.02

3. Skript for manipulering av magnetventilen og annet

Her følger et eksempel på hvordan magnetventilen kan manipuleres med et enkelt skript (/usr/bin/valve). Det vil stenge og åpne ventilen (gitt at den ikke er stengt av andre grunner), eller bare gi tilbakemelding på ventilens status. Alle filreferanser må naturligvis tilpasses.
#!/bin/sh

if [ ! -r /tmp/1wire/uncached/12.E83132000000/power ]; then
  echo Valve is offline
else
  status=$(cat /tmp/1wire/uncached/12.E83132000000/power)

  if [ "$1" = "on" ]; then
    if [ "$status" -eq "1" ]; then
      echo Valve is already open
    else
      echo 0,1 > /tmp/1wire/uncached/12.E83132000000/PIO.ALL
      sleep 1
      echo 1,0 > /tmp/1wire/uncached/12.E83132000000/PIO.ALL
      sleep 1
      status=$(cat /tmp/1wire/uncached/12.E83132000000/power)
      rm -f /tmp/manuelt
    fi
  elif [ "$1" = "off" ]; then
    if [ "$status" -eq "0" ]; then
      echo Valve is already closed
    else
      echo 1,0 > /tmp/1wire/uncached/12.E83132000000/PIO.ALL
      sleep 1
      echo 0,1 > /tmp/1wire/uncached/12.E83132000000/PIO.ALL
      sleep 1
      status=$(cat /tmp/1wire/uncached/12.E83132000000/power)
      touch /tmp/manuelt
    fi
  fi


  if [ "$status" -eq "1" ]; then
    echo Valve is open
  elif [ "$status" -eq "0" ]; then
    echo Valve is closed
  else
    echo Error
  fi
fi

Så et skript (/usr/bin/wateralarm) som kan brukes til å sende vannalarm til alarmsentralen.
#!/bin/sh

if [ "$1" = "on" ]; then
    if [ $(cat /tmp/1wire/05.CB4226000000/PIO != "0" ]; then
        echo 0 > /tmp/1wire/05.CB4226000000/PIO
    else
        echo $0: Already on
    fi
elif [ "$1" = "off" ]; then
    if [ $(cat /tmp/1wire/05.CB4226000000/PIO) != "1" ]; then
        echo 1 > /tmp/1wire/05.CB4226000000/PIO
    else
        echo $0: Already off
    fi
else
    echo "$0 [on|off]"
fi

Og et skript (/usr/bin/firealarm) som kan brukes til å starte brannalarmen:
#!/bin/sh

if [ ! -r /tmp/1wire/uncached/05.901D26000000/PIO ] ||
   [ ! -r /tmp/1wire/uncached/05.A8F620000000/PIO ]; then
  echo Fire alarm is offline
else
  status=$(cat /tmp/1wire/uncached/05.901D26000000/PIO /tmp/1wire/uncached/05.A8F620000000/PIO)

  if [ "$1" = "on" ]; then
    if [ "$status" -eq "11" ]; then
      echo Fire alarm already on
    else
      echo 1 > /tmp/1wire/uncached/05.901D26000000/PIO
      echo 1 > /tmp/1wire/uncached/05.A8F620000000/PIO
    fi
  elif [ "$1" = "off" ]; then
    if [ "$status" -ne "11" ]; then
      echo Fire alarm already off
    else
      echo 0 > /tmp/1wire/uncached/05.901D26000000/PIO
      echo 0 > /tmp/1wire/uncached/05.A8F620000000/PIO
    fi
  fi

  status=$(cat /tmp/1wire/uncached/05.901D26000000/PIO /tmp/1wire/uncached/05.A8F620000000/PIO)

  if [ "$status" -eq "11" ]; then
    echo Fire alarm is on
  else
    echo Fire alarm is off
  fi
fi

Skriptet under (/usr/bin/firecheck) sjekker kontinuertlig om brannalarmen går å tvangsåpner i så fall ventilen. Skriptet må kjøres i bakgrunnen.
#!/bin/sh

while true; do

  if [ $(cat /tmp/1wire/12.DF9353000000/power) -eq "0" ] && [ ! -f tmp/utkopla ]; then

      echo 0,1 > /tmp/1wire/12.8F9B53000000/PIO.ALL
      echo 1,0 > /tmp/1wire/12.8F9B53000000/PIO.ALL

      echo 0,1 > /tmp/1wire/12.DF9353000000/PIO.ALL
      echo 1,0 > /tmp/1wire/12.DF9353000000/PIO.ALL
      echo 0,1 > /tmp/1wire/12.DF9353000000/PIO.ALL

      (echo; echo "|til:00000000,11111111|bruker:xxxxxxxx|passord:yyyyyyyy|melding:Nødåpner vannkran")|
                    sendmail -fsteinar@latinitas.org -smail.broadpark.no melding@kortmelding.com
      touch /tmp/utkopla

  elif [ -f /tmp/utkopla ]; then

      echo 1,0 > /tmp/1wire/12.8F9B53000000/PIO.ALL
      echo 0,1 > /tmp/1wire/12.8F9B53000000/PIO.ALL
      rm /tmp/utkopla

  fi

  sleep 5

done

Følgende skript (/usr/bin/firewd) kjøres som en cronjobb en gang i timen og sørger for at forrige skript alltid kjører
#!/bin/sh

if [ "$(pidof firecheck)" -eq "" ]; then
    cd /tmp
    nohup firecheck &
    rm -f nohup.out
fi

Til slutt et skript som undersøker status på magnetventilen, og som sender alarm andre gangen skriptet kjøres, dersom ventilen ikke har blitt stengt med valve-skriptet. Om skriptet kjøres periodisk, f.eks. hvert minutt, vil alarmen gå dersom ventilen har vært stengt i minst ett minutt. Den tidligere brukte metoden for å sende sms gjennom en internettjeneste er kommentert ut.
#!/bin/sh

valve=$(valve)

if [ "$valve" = "Valve is closed" ] && [ ! -f /tmp/stengt ]; then
  if [ -f /tmp/stengt2 ] && [ ! -f /tmp/manuelt ]; then
    # (echo; echo "|til:xxxxxxxx|bruker:yyyyyyyy|passord:zzzzzzzz|melding:Vannkran stengt")|
    # sendmail -fsteinar@latinitas.org -smail.broadpark.no melding@kortmelding.com
    wateralarm on
    touch /tmp/stengt
  fi
  touch /tmp/stengt2
fi

if [ "$valve" = "Valve is open" ]; then
  rm -f /tmp/stengt /tmp/stengt2
  wateralarm off
fi


Send e-post til steinar@latinitas.org (Steinar Midtskogen) om du har spørsmål om denne sida.