Subversion Repositories heizung

Rev

Rev 8 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 8 Rev 11
Line 1... Line 1...
1
/*
1
/*
2
 * (C) Copyright 2011 by Andreas Theofilu <andreas@theosys.at>
2
 * (C) Copyright 2011 to 2015, 2024 by Andreas Theofilu <andreas@theosys.at>
3
 * All rights reserved!
3
 * All rights reserved!
4
 */
4
 */
-
 
5
//#define SENSOR_ELV
-
 
6
#define SENSOR_ETHERNET
-
 
7
 
5
#include <stdio.h>
8
#include <stdio.h>
6
#include <string.h>
9
#include <string.h>
7
#include <unistd.h>
10
#include <unistd.h>
8
#include <stdlib.h>
11
#include <stdlib.h>
9
#include <math.h>
12
#include <math.h>
Line 12... Line 15...
12
#include <errno.h>
15
#include <errno.h>
13
#include <pthread.h>
16
#include <pthread.h>
14
#include <sys/stat.h>
17
#include <sys/stat.h>
15
#include <sys/types.h>
18
#include <sys/types.h>
16
#include <sys/socket.h>
19
#include <sys/socket.h>
-
 
20
#include <netinet/in.h>
-
 
21
#include <arpa/inet.h>
-
 
22
#include <netdb.h>
17
#include <fcntl.h>
23
#include <fcntl.h>
18
#include <sys/ioctl.h>
24
#include <sys/ioctl.h>
19
#include "sensor.h"
25
#include "sensor.h"
20
#include "usb_comm.h"
26
#include "usb_comm.h"
21
#include "heizung.h"
27
#include "heizung.h"
Line 23... Line 29...
23
#define CommandOn       0x0003
29
#define CommandOn       0x0003
24
#define CommandOff      0x0000
30
#define CommandOff      0x0000
25
 
31
 
26
typedef struct
32
typedef struct
27
{
33
{
28
        int pressure;
34
    int pressure;
29
        int temperature;
35
    int temperature;
30
        time_t tstamp;
36
    time_t tstamp;
31
} mpoint;
37
} mpoint;
32
 
38
 
33
int HeatStatus;
39
int HeatStatus;
34
 
40
 
-
 
41
static pthread_mutex_t fastmutex_ser = PTHREAD_MUTEX_INITIALIZER;
-
 
42
static pthread_mutex_t fastmutex_temp = PTHREAD_MUTEX_INITIALIZER;
-
 
43
 
-
 
44
#ifdef SENSOR_ELV
35
float GetTemp ()
45
float GetTemp()
36
{
46
{
37
int fd;
47
    int fd;
38
long anz, offset;
48
    long anz, offset;
39
double delta_p;
49
    double delta_p;
40
struct stat st;
50
    struct stat st;
41
mpoint mp;
51
    mpoint mp;
42
time_t t;
52
    time_t t;
43
 
53
 
44
        if ((fd = open (configs.Werte, O_RDONLY)) == -1)
54
    if ((fd = open(configs.Werte, O_RDONLY)) == -1)
45
        {
55
    {
46
           syslog(LOG_DAEMON, "Error opening file %s: %s", configs.Werte, strerror(errno));
56
        syslog(LOG_DAEMON, "Error opening file %s: %s", configs.Werte, strerror(errno));
47
           return 9999.0;
57
        return 9999.0;
48
        }
58
    }
49
 
59
 
50
        if (fstat (fd, &st) == -1)
60
    if (fstat(fd, &st) == -1)
51
        {
61
    {
52
           syslog(LOG_DAEMON, "Error stating file %s: %s", configs.Werte, strerror(errno));
62
        syslog(LOG_DAEMON, "Error stating file %s: %s", configs.Werte, strerror(errno));
53
           close (fd);
63
        close(fd);
54
           return 9999.0;
64
        return 9999.0;
55
        }
65
    }
56
 
66
 
57
        if (st.st_size < sizeof (mpoint))
67
    if (st.st_size < sizeof(mpoint))
58
        {
68
    {
59
           syslog(LOG_DAEMON, "No entries in file %s", configs.Werte);
69
        syslog(LOG_DAEMON, "No entries in file %s", configs.Werte);
60
           close (fd);
70
        close(fd);
61
           return 9999.0;
71
        return 9999.0;
62
        }
72
    }
63
 
73
 
64
        anz = st.st_size / sizeof (mpoint);
74
    anz = st.st_size / sizeof(mpoint);
65
        offset = (anz - 1) * sizeof (mpoint);
75
    offset = (anz - 1) * sizeof(mpoint);
66
 
76
 
67
        lseek (fd, offset, 0);
77
    lseek(fd, offset, 0);
68
        read (fd, &mp, sizeof (mpoint));
78
    read(fd, &mp, sizeof(mpoint));
69
        close (fd);
79
    close(fd);
70
        t = time (NULL);
80
    t = time(NULL);
71
 
81
 
72
        /*
82
    /*
73
         * Da unsere Temperaturmessung Teil des Drucksensors ist und der
83
     * Da unsere Temperaturmessung Teil des Drucksensors ist und der
74
         * Daemon durchaus einmal abstürzen kann, wodurch dann keine
84
     * Daemon durchaus einmal abstürzen kann, wodurch dann keine
75
         * brauchbare Temperatur mehr existiert, müssen wir hier sicher
85
     * brauchbare Temperatur mehr existiert, müssen wir hier sicher
76
         * stellen, das sich die Heizung abschaltet und das Programm
86
     * stellen, das sich die Heizung abschaltet und das Programm
77
         * beendet. Das ist der Fall, wenn die letzte Messung mehr als
87
     * beendet. Das ist der Fall, wenn die letzte Messung mehr als
78
         * 10 Minuten zurück liegt.
88
     * 10 Minuten zurück liegt.
79
         */
89
     */
80
        if (t > (mp.tstamp + 600L))
90
    if (t > (mp.tstamp + 600L))
81
        {
91
    {
82
           SwitchOff ();
92
        SwitchOff();
83
           syslog(LOG_DAEMON, "Warning: No temperature was meassured in the last 10 minutes!");
93
        syslog(LOG_DAEMON, "Warning: No temperature was meassured in the last 10 minutes!");
84
           return 9999.0;
94
        return 9999.0;
85
        }
95
    }
86
 
96
 
87
	// Luftdruck
97
    // Luftdruck
88
	delta_p = pow((1.0 - (6.5 * 256.0) / 288000.0), 5.255);
98
    delta_p = pow((1.0 - (6.5 * 256.0) / 288000.0), 5.255);
89
	ActPressure = (float)(mp.pressure / 10.0) / delta_p;
99
    ActPressure = (float)(mp.pressure / 10.0) / delta_p;
90
	// Temperatur
100
    // Temperatur
91
	ActTemperature = ((float)mp.temperature - 10.0) / 10.0;
101
    ActTemperature = ((float)mp.temperature - 10.0) / 10.0;
92
	return ActTemperature;
102
    return ActTemperature;
93
}
103
}
94
 
-
 
-
 
104
#elif defined SENSOR_ETHERNET
95
void SwitchOn ()
105
float GetTemp(void)
96
{
106
{
97
int set_bits;
-
 
98
 
-
 
99
        if (serialDev.switch_fd < 0)
-
 
100
        {
-
 
101
           syslog(LOG_DAEMON, "Es war kein File handle geöffnet! (EIN)");
-
 
102
	   HeatStatus = 2;
107
    struct sockaddr_in sa;
103
           return;
108
    int socket_fd;
104
        }
-
 
105
 
-
 
106
        set_bits = CommandOn;
-
 
107
 
-
 
108
        if (ioctl(serialDev.switch_fd, TIOCMSET, &set_bits) == -1)
-
 
109
	{
-
 
110
           syslog(LOG_DAEMON, "Fehler beim Einschalten!");
-
 
111
	   HeatStatus = 2;
-
 
112
	   return;
-
 
113
	}
-
 
114
 
109
 
-
 
110
    sa.sin_family = AF_INET;
-
 
111
    sa.sin_port = htons(configs.TempPort);
-
 
112
    sa.sin_addr.s_addr = inet_addr(configs.IP);
-
 
113
    memset(sa.sin_zero, '\0', sizeof(sa.sin_zero));
-
 
114
    pthread_mutex_lock(&fastmutex_temp);
-
 
115
 
-
 
116
    socket_fd = socket(PF_INET, SOCK_STREAM, 0);
-
 
117
 
-
 
118
    if (socket_fd == -1)
-
 
119
    {
-
 
120
        pthread_mutex_unlock(&fastmutex_temp);
-
 
121
        syslog(LOG_DAEMON | LOG_ERR, "Could not create socket: %s", strerror(errno));
-
 
122
        return 0.0;
-
 
123
    }
-
 
124
 
-
 
125
    if (connect(socket_fd, (struct sockaddr*)&sa, sizeof(sa)) == -1)
-
 
126
    {
-
 
127
        pthread_mutex_unlock(&fastmutex_temp);
-
 
128
        syslog(LOG_DAEMON | LOG_ERR, "Error connecting!: %s", strerror(errno));
-
 
129
        return 0.0;
-
 
130
    }
-
 
131
 
-
 
132
    char message[512];
-
 
133
    memset(message, '\0', sizeof(message));
-
 
134
    int ret = recv(socket_fd, message, sizeof(message), 0);
-
 
135
    close(socket_fd);
-
 
136
    pthread_mutex_unlock(&fastmutex_temp);
-
 
137
 
-
 
138
    if (ret > 0)
-
 
139
    {
-
 
140
        ActTemperature = atof(message);
-
 
141
        ActPressure = 0.0;
115
        syslog(LOG_INFO, "Heizung EIN (%.1f)", ActTemperature);
142
        syslog(LOG_DAEMON | LOG_DEBUG, "Temperature: %0.1f", ActTemperature);
-
 
143
        return ActTemperature;
-
 
144
    }
-
 
145
    else
116
	HeatStatus = 1;
146
        return 0.0;
117
}
147
}
-
 
148
#else
-
 
149
#WARNING "sensor.c: No valid sensor defined!"
-
 
150
#endif
118
 
151
 
119
void SwitchOff ()
152
void SwitchOn()
120
{
153
{
121
int set_bits;
154
    int set_bits;
122
 
155
 
123
        if (serialDev.switch_fd < 0)
156
    if (serialDev.switch_fd < 0)
124
        {
157
    {
125
           syslog(LOG_DAEMON, "Es war kein File handle geöffnet! (AUS)");
158
        syslog(LOG_DAEMON | LOG_ERR, "Es war kein File handle geöffnet! (EIN)");
126
	   HeatStatus = 2;
159
        HeatStatus = 2;
127
           return;
160
        return;
128
        }
161
    }
129
 
162
 
130
        set_bits = CommandOff;
163
    set_bits = CommandOn;
-
 
164
    pthread_mutex_lock(&fastmutex_ser);
131
 
165
 
132
        if (ioctl(serialDev.switch_fd, TIOCMSET, &set_bits) == -1)
166
    if (ioctl(serialDev.switch_fd, TIOCMSET, &set_bits) == -1)
133
	{
167
    {
-
 
168
        pthread_mutex_unlock(&fastmutex_ser);
134
           syslog(LOG_DAEMON, "Fehler beim Ausschalten!");
169
        syslog(LOG_DAEMON | LOG_ERR, "Fehler beim Einschalten!");
135
	   HeatStatus = 2;
170
        HeatStatus = 2;
136
	   return;
171
        return;
-
 
172
    }
-
 
173
 
-
 
174
    pthread_mutex_unlock(&fastmutex_ser);
-
 
175
    syslog(LOG_DAEMON | LOG_INFO, "Heizung EIN (%.1f)", ActTemperature);
-
 
176
    HeatStatus = 1;
137
	}
177
}
-
 
178
 
-
 
179
void SwitchOff()
-
 
180
{
-
 
181
    int set_bits;
138
 
182
 
-
 
183
    if (serialDev.switch_fd < 0)
-
 
184
    {
-
 
185
        syslog(LOG_DAEMON | LOG_ERR, "Es war kein File handle geöffnet! (AUS)");
-
 
186
        HeatStatus = 2;
-
 
187
        return;
-
 
188
    }
-
 
189
 
-
 
190
    set_bits = CommandOff;
-
 
191
    pthread_mutex_lock(&fastmutex_ser);
-
 
192
 
-
 
193
    if (ioctl(serialDev.switch_fd, TIOCMSET, &set_bits) == -1)
-
 
194
    {
-
 
195
        pthread_mutex_unlock(&fastmutex_ser);
-
 
196
        syslog(LOG_DAEMON | LOG_ERR, "Fehler beim Ausschalten!");
-
 
197
        HeatStatus = 2;
-
 
198
        return;
-
 
199
    }
-
 
200
 
-
 
201
    pthread_mutex_unlock(&fastmutex_ser);
139
        syslog(LOG_INFO, "Heizung AUS (%.1f)", ActTemperature);
202
    syslog(LOG_DAEMON | LOG_INFO, "Heizung AUS (%.1f)", ActTemperature);
140
	HeatStatus = 0;
203
    HeatStatus = 0;
141
}
204
}
-
 
205