mash/sensors.c

Sat, 14 Jul 2018 21:15:20 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Sat, 14 Jul 2018 21:15:20 +0200
changeset 534
92b546d4a839
parent 147
0e7c51a66b5e
permissions
-rw-r--r--

Versie 0.6.4. Aan de global setup de MQTT instellingen toegevoegd. Die zijn er ook als MQTT niet op het systeem aanwezig is. Indien het de global setup wijzigd, wordt de MQTT verbinding opnieuw gemaakt.

/*****************************************************************************
 * Copyright (C) 2014
 *   
 * Michiel Broek <mbroek at mbse dot eu>
 *
 * This file is part of the mbsePi-apps
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2, or (at your option) any
 * later version.
 *
 * mbsePi-apps is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with EC-65K; see the file COPYING.  If not, write to the Free
 * Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 *****************************************************************************/

#include "mash.h"
#include "xutil.h"


#ifdef HAVE_WIRINGPI_H

/* wiringPi */
#include <wiringPi.h>
#include <pcf8574.h>
#include <lcd.h>

extern int		debug;
extern sys_config	Config;
extern int		my_shutdown;



PI_THREAD (my_sensors_loop)
{
    w1_therm		*tmp1, *old1;
    char		*device, line[60], *p = NULL;
    FILE		*fp;
    int			temp, rc, deviation;

    syslog(LOG_NOTICE, "Thread my_sensors_loop started");
    if (debug)
	fprintf(stdout, "Thread my_sensors_loop started\n");

    /*
     * Loop forever until the external shutdown variable is set.
     */
    for (;;) {
    	/*
    	 * Here send our 1-wire sensors values
    	 */
    	for (tmp1 = Config.w1therms; tmp1; tmp1 = old1) {
	    old1 = tmp1->next;

	    if (my_shutdown) {
		syslog(LOG_NOTICE, "Thread my_sensors_loop stopped");
		if (debug)
		    fprintf(stdout, "Thread my_sensors_loop stopped\n");
	    	return 0;
	    }

	    /*
	     * Build path to the on-wire sensor
	     */
	    device = xstrcpy((char *)"/sys/bus/w1/devices/");
	    device = xstrcat(device, tmp1->master);
	    device = xstrcat(device, (char *)"/");
	    device = xstrcat(device, tmp1->name);
	    device = xstrcat(device, (char *)"/w1_slave");

	    /*
	     * Read sensor data
	     */
	    if ((fp = fopen(device, "r"))) {
		/*
		 * The output looks like:
		 * 72 01 4b 46 7f ff 0e 10 57 : crc=57 YES
		 * 72 01 4b 46 7f ff 0e 10 57 t=23125
		 */
		fgets(line, 50, fp);
		line[strlen(line)-1] = '\0';
		if ((line[36] == 'Y') && (line[37] == 'E')) {
		    /*
		     * CRC is Ok, continue
		     */
		    fgets(line, 50, fp);
		    line[strlen(line)-1] = '\0';
		    strtok(line, (char *)"=");
		    p = strtok(NULL, (char *)"=");
		    rc = sscanf(p, "%d", &temp);
		    if ((rc == 1) && (tmp1->lastval != temp)) {
			/*
			 * It is possible to have read errors or extreme values.
			 * This can happen with bad connections so we compare the
			 * value with the previous one. If the difference is too
			 * much, we don't send that value. That also means that if
			 * the next value is ok again, it will be marked invalid too.
			 * Maximum error is 20 degrees for now.
			 */
			deviation = 20000;
			if ( (tmp1->lastval == 0) ||
			     (tmp1->lastval && (temp > (tmp1->lastval - deviation)) && (temp < (tmp1->lastval + deviation))) ) {
			    /*
			     * Temperature is changed and valid, set flag.
			     */
			    tmp1->update = TRUE;
			} else {
			    syslog(LOG_NOTICE, "deviation error deviation=%d, old=%d new=%d", deviation, tmp1->lastval, temp);
			    if (debug) {
				fprintf(stdout, "deviation error deviation=%d, old=%d new=%d\n", deviation, tmp1->lastval, temp);
			    }
			}
			tmp1->lastval = temp;
		    }
		} else {
		    syslog(LOG_NOTICE, "sensor %s/%s CRC error", tmp1->master, tmp1->name);
		}
		fclose(fp);
		tmp1->present = 1;
	    } else {
		tmp1->present = 0;
		if (debug)
		    printf("sensor %s is missing\n", tmp1->name);
	    }

	    free(device);
	    device = NULL;
    	}
    }
}



#endif

mercurial