Python programering och temperaturer.

Permalänk
Medlem

Python programering och temperaturer.

Hej
Mina kunskaper i programmering är väl lite begränsade men en del kan jag lista ut själv i alla fall.
Hittills har jag bara behövt brytt mig i 1 värde över eller under. Nu blir det 3st det är ju 2 för mycket för mig.

I korthet:
Jag vill att relä 1 drar i 10 sekunder när temperaturen gått över 20 grader och stoppa där för att vänta på nästkommande instruktioner.
Går temperaturen upp till 26 ska relä 1 dra i 20 sekunder till, sjunker däremot temperaturen under 17 ska relä 2 dra i 30sekunder i stället.
Sen ska allt vara beredd på 20, 26 eller 17 igen.

Har försökt tittat på https://www.w3schools.com/python/default.asp fått några idéer men vet inte riktigt hur jag ska göra ändå.

Det jag nu har lyckats åstadkomma gör ju att relä 1 drar 10sekunder för att sen konstatera att det är över 20 igen och gör om samma sak hela tiden.

import Adafruit_DHT import RPi.GPIO as GPIO import time DHT_SENSOR = Adafruit_DHT.DHT22 DHT_PIN = 4 Relay_Ch1 = 26 Relay_Ch2 = 20 Relay_Ch3 = 21 GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(Relay_Ch1,GPIO.OUT) GPIO.setup(Relay_Ch2,GPIO.OUT) GPIO.setup(Relay_Ch3,GPIO.OUT) try: while True: humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN) if humidity is not None and temperature is not None: print("Temp={0:0.1f}C Fuktighet={1:0.1f}%".format(temperature, humidity)) if temperature > 20: print("Över 20c,") GPIO.output(Relay_Ch1,GPIO.LOW) time.sleep(10.0) GPIO.output(Relay_Ch1,GPIO.HIGH) time.sleep(1.0) if temperature > 26: print("över 26") GPIO.output(Relay_Ch1,GPIO.LOW) time.sleep(20.0) GPIO.output(Relay_Ch1,GPIO.HIGH) time.sleep(1.0) else: print("inte över 26 än") else: print(" Ingen kontakt med Sensorn") except: print("except") GPIO.cleanup()

fixa code
Permalänk
Medlem
Skrivet av Kaputnik:

Hej
Mina kunskaper i programmering är väl lite begränsade men en del kan jag lista ut själv i alla fall.
Hittills har jag bara behövt brytt mig i 1 värde över eller under. Nu blir det 3st det är ju 2 för mycket för mig.

I korthet:
Jag vill att relä 1 drar i 10 sekunder när temperaturen gått över 20 grader och stoppa där för att vänta på nästkommande instruktioner.
Går temperaturen upp till 26 ska relä 1 dra i 20 sekunder till, sjunker däremot temperaturen under 17 ska relä 2 dra i 30sekunder i stället.
Sen ska allt vara beredd på 20, 26 eller 17 igen.

Har försökt tittat på https://www.w3schools.com/python/default.asp fått några idéer men vet inte riktigt hur jag ska göra ändå.

Det jag nu har lyckats åstadkomma gör ju att relä 1 drar 10sekunder för att sen konstatera att det är över 20 igen och gör om samma sak hela tiden.

Antar att "stoppa där för att vänta på nästkommande instruktioner" innebär att du behöver en loop till så att du kan fortsätta att kolla om det blivit 26 eller 17 grader hur länge det än behöver väntas.

Rekommenderar code-tagg på forumet för att koden ska behålla formatering

Permalänk
Medlem

Fixat code-tagg..

Några tips på hur man gör denna loop?

Permalänk
Medlem
Skrivet av Kaputnik:

Fixat code-tagg..

Några tips på hur man gör denna loop?

Jag vet inte exakt vad du vill göra. Jag vet inte vad reläerna gör och jag vet inte vad "dra" är för term. Jag vet inte varför du har tre reläer när bara två ska användas. Jag kan inte mycket om python men jag kan peka i någon riktning.

En sak här är ju att detta är enkeltrådat. Det betyder att alla ställen där du har sleep, så stannar programmet. Reläerna kan alltså applicera något individuellt utan måste vänta på att tid är ledig i programmet. Det kanske är önskvärt men jag ville bara säga det.

If-satserna måste läggas i rätt ordning.

26 måste vara först sen 20. Anledning till detta är att om temperaturen skulle vara säg 31 grader så hade ju alla if-satser returnerat true. 31 är större än 20 och 26 men det är bara koden för 26 du vill köra.

Här är mitt försök:
if-satserna har modifierats för att ta höjd för "större än eller lika med" samt "lägre än eller lika med"
Kör med "else-if"-satser så att de andra if-satserna inte råkar köra i samma iteration
Lämpligtvis bör en metod skapas för koden som gör det ännu mer semantiskt samt lättare att läsa.
Resten är nog självförklarande.

import Adafruit_DHT import RPi.GPIO as GPIO import time DHT_SENSOR = Adafruit_DHT.DHT22 DHT_PIN = 4 Relay_Ch1 = 26 Relay_Ch2 = 20 Relay_Ch3 = 21 GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(Relay_Ch1,GPIO.OUT) GPIO.setup(Relay_Ch2,GPIO.OUT) GPIO.setup(Relay_Ch3,GPIO.OUT) try: while True: humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN) if humidity is not None and temperature is not None: print("Temp={0:0.1f}C Fuktighet={1:0.1f}%".format(temperature, humidity)) if temperature <= 17: print("under eller lika med 17C") GPIO.output(Relay_Ch2,GPIO.LOW) time.sleep(30.0) GPIO.output(Relay_Ch2,GPIO.HIGH) elif temperature >= 26: print("över eller lika med 26C") GPIO.output(Relay_Ch1,GPIO.LOW) time.sleep(20.0) GPIO.output(Relay_Ch1,GPIO.HIGH) elif temperature >= 20: print("Över eller lika med 20C") GPIO.output(Relay_Ch1,GPIO.LOW) time.sleep(10.0) GPIO.output(Relay_Ch1,GPIO.HIGH) else: print("Annat värde") else: print(" Ingen kontakt med Sensorn") time.sleep(1.0) except: print("except") GPIO.cleanup()

Permalänk
Medlem

Tack som fan Leedow peka i någon riktning är precis va jag vill ha!

Skrivet av Leedow:

Jag vet inte exakt vad du vill göra. Jag vet inte vad reläerna gör och jag vet inte vad "dra" är för term. Jag vet inte varför du har tre reläer när bara två ska användas. Jag kan inte mycket om python men jag kan peka i någon riktning.

Ja är elektronik skadad trodde alla visste va "dra" var.
Det är citat: "När reläspolen blir genomfluten av ström blir den magnetisk och drar ihop" så elektronik slangord.

Den simpla förklaringen finns tre reläer på kortet jag använder och exempel koden hade ju alla tre (klipp och klistra)
Nr tre fick vara kvar ifall någon extra funktion kan programmeras in till relä 3.

Skrivet av Leedow:

En sak här är ju att detta är enkeltrådat. Det betyder att alla ställen där du har sleep, så stannar programmet. Reläerna kan alltså applicera något individuellt utan måste vänta på att tid är ledig i programmet. Det kanske är önskvärt men jag ville bara säga det.

If-satserna måste läggas i rätt ordning.

Japp enkeltrådat är precis vad som önskas.
Hade aldrig tänkt på ordningen så, då det ska vara utomhus och temperaturen går 0 - 31 så att säga.
Hade dock 31 kommit direkt så skulle både 20 och 26 fått returnerat true men naturen gör nog att det fixar sig själv hoppas jag.

Blir och testa koden nu hoppas det fungerar som jag vill.

Permalänk
Medlem

Fenomenet blir dessvärre lika med Leedow kod.
"över eller lika med" var ett välkommet tillskott kan bli mycket användbart.

Nu till problemet:
Kör man koden loopar 20C i alla oändlighet igen och relä 1 aktiveras 10 sekunder, slår av och aktiveras 10 sekunder i alla oändlighet.

Får försöka förklara bättre vad jag är ute efter:

Solen värmer till 20C relä 1 aktiveras 10 sekunder, här ska koden sluta loopa 20 grader.
Nu ska koden istället invänta "under eller lika med 17C" eller "över eller lika med 26C".
Inträffar "under eller lika med 17C" ska koden vänta på 20C eller 26C
Inträffar "Över eller lika med 26C" ska koden vänta på 17C eller 20C

Oavsett hur länge koden får vänta ska den vänta på någon av dom andra inträffar innan den gör något.

Permalänk
Medlem
Skrivet av Kaputnik:

Fenomenet blir dessvärre lika med Leedow kod.
"över eller lika med" var ett välkommet tillskott kan bli mycket användbart.

Nu till problemet:
Kör man koden loopar 20C i alla oändlighet igen och relä 1 aktiveras 10 sekunder, slår av och aktiveras 10 sekunder i alla oändlighet.

Får försöka förklara bättre vad jag är ute efter:

Solen värmer till 20C relä 1 aktiveras 10 sekunder, här ska koden sluta loopa 20 grader.
Nu ska koden istället invänta "under eller lika med 17C" eller "över eller lika med 26C".
Inträffar "under eller lika med 17C" ska koden vänta på 20C eller 26C
Inträffar "Över eller lika med 26C" ska koden vänta på 17C eller 20C

Oavsett hur länge koden får vänta ska den vänta på någon av dom andra inträffar innan den gör något.

Då får du lägga in någon form av "oneshot" som sätts samtidigt som relät drar men som återställs först i de andra stegen.

Permalänk
Medlem

Du kan ha en integer eller byte som du använder för att definera olika steg i dina if-satser.

Skrivet av Leedow:

stage=0 if humidity is not None and temperature is not None: print("Temp={0:0.1f}C Fuktighet={1:0.1f}%".format(temperature, humidity)) if temperature <= 17 and stage > 0: print("under eller lika med 17C") GPIO.output(Relay_Ch2,GPIO.LOW) time.sleep(30.0) GPIO.output(Relay_Ch2,GPIO.HIGH) stage = 0 elif temperature >= 26 and stage = 1: print("över eller lika med 26C") GPIO.output(Relay_Ch1,GPIO.LOW) time.sleep(20.0) GPIO.output(Relay_Ch1,GPIO.HIGH) stage = 2 elif temperature >= 20 and stage != 1: print("Över eller lika med 20C") GPIO.output(Relay_Ch1,GPIO.LOW) time.sleep(10.0) GPIO.output(Relay_Ch1,GPIO.HIGH) stage = 1 else: print("Annat värde")

Permalänk
Medlem
Skrivet av Leedow:

Jag vet inte exakt vad du vill göra. Jag vet inte vad reläerna gör och jag vet inte vad "dra" är för term. Jag vet inte varför du har tre reläer när bara två ska användas. Jag kan inte mycket om python men jag kan peka i någon riktning.

En sak här är ju att detta är enkeltrådat. Det betyder att alla ställen där du har sleep, så stannar programmet. Reläerna kan alltså applicera något individuellt utan måste vänta på att tid är ledig i programmet. Det kanske är önskvärt men jag ville bara säga det.

If-satserna måste läggas i rätt ordning.

26 måste vara först sen 20. Anledning till detta är att om temperaturen skulle vara säg 31 grader så hade ju alla if-satser returnerat true. 31 är större än 20 och 26 men det är bara koden för 26 du vill köra.

Här är mitt försök:
if-satserna har modifierats för att ta höjd för "större än eller lika med" samt "lägre än eller lika med"
Kör med "else-if"-satser så att de andra if-satserna inte råkar köra i samma iteration
Lämpligtvis bör en metod skapas för koden som gör det ännu mer semantiskt samt lättare att läsa.
Resten är nog självförklarande.

import Adafruit_DHT import RPi.GPIO as GPIO import time DHT_SENSOR = Adafruit_DHT.DHT22 DHT_PIN = 4 Relay_Ch1 = 26 Relay_Ch2 = 20 Relay_Ch3 = 21 GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(Relay_Ch1,GPIO.OUT) GPIO.setup(Relay_Ch2,GPIO.OUT) GPIO.setup(Relay_Ch3,GPIO.OUT) try: while True: humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN) state = 0 if humidity is not None and temperature is not None: print("Temp={0:0.1f}C Fuktighet={1:0.1f}%".format(temperature, humidity)) if temperature <= 17 and state != 0: print("under eller lika med 17C") GPIO.output(Relay_Ch2,GPIO.LOW) time.sleep(30.0) GPIO.output(Relay_Ch2,GPIO.HIGH) state = 0 elif temperature >= 26 and state != 2: print("över eller lika med 26C") GPIO.output(Relay_Ch1,GPIO.LOW) time.sleep(20.0) GPIO.output(Relay_Ch1,GPIO.HIGH) state = 2 elif temperature >= 20 and state != 1: print("Över eller lika med 20C") GPIO.output(Relay_Ch1,GPIO.LOW) time.sleep(10.0) GPIO.output(Relay_Ch1,GPIO.HIGH) state = 1 else: print("Annat värde") else: print(" Ingen kontakt med Sensorn") time.sleep(1.0) except: print("except") GPIO.cleanup()

Borde vara vad du är ute efter?

Permalänk
Medlem

Jo det kanske är vad jag är ute efter med något är i alla fall fel..
följande kod generar:

import Adafruit_DHT import RPi.GPIO as GPIO import time DHT_SENSOR = Adafruit_DHT.DHT22 DHT_PIN = 4 Relay_Ch1 = 26 Relay_Ch2 = 20 Relay_Ch3 = 21 GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(Relay_Ch1,GPIO.OUT) GPIO.setup(Relay_Ch2,GPIO.OUT) GPIO.setup(Relay_Ch3,GPIO.OUT) try: while True: humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN) GPIO.output(Relay_Ch1,GPIO.HIGH) GPIO.output(Relay_Ch2,GPIO.HIGH) GPIO.output(Relay_Ch3,GPIO.HIGH) state = 0 if humidity is not None and temperature is not None: print("Temp={0:0.1f}C Fuktighet={1:0.1f}%".format(temperature, humidity)) if temperature <= 17 and state != 0: print("under eller lika med 17C") GPIO.output(Relay_Ch2,GPIO.LOW) time.sleep(30.0) GPIO.output(Relay_Ch2,GPIO.HIGH) state = 0 elif temperature >= 26 and state != 2: print("över eller lika med 26C") GPIO.output(Relay_Ch1,GPIO.LOW) time.sleep(20.0) GPIO.output(Relay_Ch1,GPIO.HIGH) state = 2 elif temperature >= 20 and state != 1: print("Över eller lika med 20C") GPIO.output(Relay_Ch1,GPIO.LOW) time.sleep(10.0) GPIO.output(Relay_Ch1,GPIO.HIGH) state = 1 else: print("Annat värde") else: print(" Ingen kontakt med Sensorn") time.sleep(1.0)

Temp=13.7C Fuktighet=64.6%
Annat värde
Temp=13.7C Fuktighet=65.2%
Annat värde
Temp=16.6C Fuktighet=66.1%
Annat värde
Temp=19.9C Fuktighet=63.5%
Annat värde
Temp=20.0C Fuktighet=63.5%
Över eller lika med 20C
Temp=20.0C Fuktighet=63.5%
Över eller lika med 20C
Temp=26.1C Fuktighet=44.3%
över eller lika med 26C
Temp=26.4C Fuktighet=43.6%
över eller lika med 26C
Temp=20.8C Fuktighet=42.2%
Över eller lika med 20C
Temp=18.3C Fuktighet=47.6%
Annat värde
Temp=18.0C Fuktighet=48.2%

^Cexcept

"under eller lika med 17C" Fungerar inte alls den skippar helt:

GPIO.output(Relay_Ch2,GPIO.LOW) time.sleep(30.0) GPIO.output(Relay_Ch2,GPIO.HIGH)

"Över eller lika med 20C" gör att relä nr 1 kör sin:

GPIO.output(Relay_Ch1,GPIO.LOW) time.sleep(10.0) GPIO.output(Relay_Ch1,GPIO.HIGH)

i alla oändlighet vilket inte är vad jag vill.

"över eller lika med 26C" fungerar som "Över eller lika med 20C"

Alltså verkar inte state = 0 till 2 göra nått alls.

Permalänk
Medlem
Skrivet av Kaputnik:

Jo det kanske är vad jag är ute efter med något är i alla fall fel..
följande kod generar:

import Adafruit_DHT import RPi.GPIO as GPIO import time DHT_SENSOR = Adafruit_DHT.DHT22 DHT_PIN = 4 Relay_Ch1 = 26 Relay_Ch2 = 20 Relay_Ch3 = 21 GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(Relay_Ch1,GPIO.OUT) GPIO.setup(Relay_Ch2,GPIO.OUT) GPIO.setup(Relay_Ch3,GPIO.OUT) try: while True: humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN) GPIO.output(Relay_Ch1,GPIO.HIGH) GPIO.output(Relay_Ch2,GPIO.HIGH) GPIO.output(Relay_Ch3,GPIO.HIGH) state = 0 if humidity is not None and temperature is not None: print("Temp={0:0.1f}C Fuktighet={1:0.1f}%".format(temperature, humidity)) if temperature <= 17 and state != 0: print("under eller lika med 17C") GPIO.output(Relay_Ch2,GPIO.LOW) time.sleep(30.0) GPIO.output(Relay_Ch2,GPIO.HIGH) state = 0 elif temperature >= 26 and state != 2: print("över eller lika med 26C") GPIO.output(Relay_Ch1,GPIO.LOW) time.sleep(20.0) GPIO.output(Relay_Ch1,GPIO.HIGH) state = 2 elif temperature >= 20 and state != 1: print("Över eller lika med 20C") GPIO.output(Relay_Ch1,GPIO.LOW) time.sleep(10.0) GPIO.output(Relay_Ch1,GPIO.HIGH) state = 1 else: print("Annat värde") else: print(" Ingen kontakt med Sensorn") time.sleep(1.0)

Temp=13.7C Fuktighet=64.6%
Annat värde
Temp=13.7C Fuktighet=65.2%
Annat värde
Temp=16.6C Fuktighet=66.1%
Annat värde
Temp=19.9C Fuktighet=63.5%
Annat värde
Temp=20.0C Fuktighet=63.5%
Över eller lika med 20C
Temp=20.0C Fuktighet=63.5%
Över eller lika med 20C
Temp=26.1C Fuktighet=44.3%
över eller lika med 26C
Temp=26.4C Fuktighet=43.6%
över eller lika med 26C
Temp=20.8C Fuktighet=42.2%
Över eller lika med 20C
Temp=18.3C Fuktighet=47.6%
Annat värde
Temp=18.0C Fuktighet=48.2%

^Cexcept

"under eller lika med 17C" Fungerar inte alls den skippar helt:

GPIO.output(Relay_Ch2,GPIO.LOW) time.sleep(30.0) GPIO.output(Relay_Ch2,GPIO.HIGH)

"Över eller lika med 20C" gör att relä nr 1 kör sin:

GPIO.output(Relay_Ch1,GPIO.LOW) time.sleep(10.0) GPIO.output(Relay_Ch1,GPIO.HIGH)

i alla oändlighet vilket inte är vad jag vill.

"över eller lika med 26C" fungerar som "Över eller lika med 20C"

Alltså verkar inte state = 0 till 2 göra nått alls.

Du får sätta startstate till något som inte används då. Typ 3.

Permalänk
Medlem

Jag kan inte python så här kommer lite psudokod/pascal-ish hur jag skulle skriva:

if temperature <= 17 and not init0 then print("under eller lika med 17C") GPIO.output(Relay_Ch2,GPIO.LOW) time.sleep(30.0) GPIO.output(Relay_Ch2,GPIO.HIGH) init0 := true init1 := false init2 := false end if (temperature >= 20 and temperature < 26) and and not init1 then print("Över eller lika med 20C") GPIO.output(Relay_Ch1,GPIO.LOW) time.sleep(10.0) GPIO.output(Relay_Ch1,GPIO.HIGH) init0 := false init1 := true init2 := false end if temperature >= 26 and not init2: print("över eller lika med 26C") GPIO.output(Relay_Ch1,GPIO.LOW) time.sleep(20.0) GPIO.output(Relay_Ch1,GPIO.HIGH) init0 := false init1 := false init2 := true end

Permalänk
Medlem
Skrivet av Cerb:

Du får sätta startstate till något som inte används då. Typ 3.

Nu fungerar "under eller lika med 17C".
Men huvudproblemet är i alla fall lika. Den gör exakt samma som min första kod så inget har förändrats.

Permalänk
Medlem

Kom på en sak nu borde inte:
elif temperature >= 20 and state != 1:
print("Över eller lika med 20C")

vara att den letar efter värde mellan 20 och 25 i stället för bara över 20?
Dock vet jag inte hur jag får till "mellan"

Permalänk
Medlem
Skrivet av Kaputnik:

Dock vet jag inte hur jag får till "mellan"

Läste du inte mitt inlägg alls?

if (temperature >= 20 and temperature < 26)

Permalänk
Medlem
Skrivet av ojz0r:

Läste du inte mitt inlägg alls?

if (temperature >= 20 and temperature < 26)

För låt så mycket det missade jag helt.
Försökte få
if temperature <= 17 and not init0 then.... att fungera kom aldrig ner till
if (temperature >= 20 and temperature < 26)

Permalänk
Medlem

try: while True: ... state = 0

Hela poängen med en att hålla en state-variabel är ju att komma ihåg vad som hände förra varvet, så du kan inte skriva över den med 0 varje gång du loopar. state=0 måste skapas utanför loopen (ovanför "while True").

Skulle nog ha skrivit det som nått i den här stilen:

def activateRelay(relay, duration): #print("Set relay %d for %ds"%(relay,duration)) GPIO.output(relay, GPIO.LOW) time.sleep(duration) GPIO.output(relay, GPIO.HIGH) GPIO.output(Relay_Ch1,GPIO.HIGH) GPIO.output(Relay_Ch2,GPIO.HIGH) GPIO.output(Relay_Ch3,GPIO.HIGH) lastTemperatureRule = None while True: time.sleep(1) humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN) if humidity is None or temperature is None: print(" Ingen kontakt med Sensorn") continue print("Temp={0:0.1f}C Fuktighet={1:0.1f}%".format(temperature, humidity)) if temperature >= 26: if lastTemperatureRule and lastTemperatureRule != 26: activateRelay(Relay_Ch1, 20) lastTemperatureRule = 26 elif temperature >= 20: if lastTemperatureRule != 20: activateRelay(Relay_Ch1, 10) lastTemperatureRule = 20 elif temperature <= 17: if lastTemperatureRule and lastTemperatureRule != 17: activateRelay(Relay_Ch2, 30) lastTemperatureRule = 17

Som du beskrivit din logik så måste det första som händer vara att temp>=20, därav så gör koden ingenting förrens temp>=20 inträffat en gång. Om det är okej att ex. temp<=17 inträffar först så kan du bara ta bort "lastTemperatureRule and" biten från if-satserna för 17 resp. 26.

Permalänk
Medlem
Skrivet av Zevon:

Hela poängen med en att hålla en state-variabel är ju att komma ihåg vad som hände förra varvet, så du kan inte skriva över den med 0 varje gång du loopar. state=0 måste skapas utanför loopen (ovanför "while True").

AaaHaaa jag är nybörjare de märks inte va.. Verkar som den koden fungera nu också. Därför jag hatar kod en lite miss förstör allt. Skulle vilja lära mig mer men annat i livet sätter stopp.

Skrivet av Zevon:

Skulle nog ha skrivit det som nått i den här stilen:

def activateRelay(relay, duration): #print("Set relay %d for %ds"%(relay,duration)) GPIO.output(relay, GPIO.LOW) time.sleep(duration) GPIO.output(relay, GPIO.HIGH) GPIO.output(Relay_Ch1,GPIO.HIGH) GPIO.output(Relay_Ch2,GPIO.HIGH) GPIO.output(Relay_Ch3,GPIO.HIGH) lastTemperatureRule = None while True: time.sleep(1) humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN) if humidity is None or temperature is None: print(" Ingen kontakt med Sensorn") continue print("Temp={0:0.1f}C Fuktighet={1:0.1f}%".format(temperature, humidity)) if temperature >= 26: if lastTemperatureRule and lastTemperatureRule != 26: activateRelay(Relay_Ch1, 20) lastTemperatureRule = 26 elif temperature >= 20: if lastTemperatureRule != 20: activateRelay(Relay_Ch1, 10) lastTemperatureRule = 20 elif temperature <= 17: if lastTemperatureRule and lastTemperatureRule != 17: activateRelay(Relay_Ch2, 30) lastTemperatureRule = 17

Tack tack den där koden var lite över min förmåga att gör, den känns optimerad mot mitt lilla försök.
Gillar print("Set relay %d for %ds"%(relay,duration))

Det hade väl inte gjort nått om temp<=17 inträffar först, hade tagit höjd för det på mekanisk väg. Men din kod spar på reläna och det är ju snällt.
Nu ska jag försöka sova och fundera på en tankevurpa som jag tror kan inträffa, förhoppningsvis fixa den själv imorgon.